Столбец-вектор у был пропущен, когда ожидался массив 1d

Мне нужно соответствовать RandomForestRegressor от sklearn.ensemble,

forest = ensemble.RandomForestRegressor(**RF_tuned_parameters)
model = forest.fit(train_fold, train_y)
yhat = model.predict(test_fold)

Этот код всегда работал, пока я не сделал некоторую предварительную обработку данных (train_y). Сообщение об ошибке говорит:

DataConversionWarning: вектор-столбец y был передан, когда ожидался массив 1d. Пожалуйста, измените форму y на (n_samples,), например, используя ravel().

модель = forest.fit(train_fold, train_y)

предварительно train_y был Серией, теперь это массив NumPy (это столбец-вектор). Если я подам заявку train_y.ravel(), затем он становится вектором строки, и сообщение об ошибке не появляется, поскольку этап прогнозирования занимает очень много времени (на самом деле он никогда не заканчивается...).

В документах RandomForestRegressor я нашел это train_y должен быть определен как y : array-like, shape = [n_samples] or [n_samples, n_outputs]Есть идеи, как решить эту проблему?

9 ответов

Измените эту строку:

model = forest.fit(train_fold, train_y)

чтобы:

model = forest.fit(train_fold, train_y.values.ravel())

Я также столкнулся с этой ситуацией, когда я пытался обучить классификатор KNN. но похоже, что предупреждение исчезло после того, как я изменился:
knn.fit(X_train,y_train)
в
knn.fit(X_train, np.ravel(y_train,order='C'))

Впереди этой линии я использовал import numpy as np,

У меня такая же проблема. Проблема заключалась в том, что метки были в формате столбца, хотя он ожидал этого подряд. использование np.ravel()

knn.score(training_set, np.ravel(training_labels))

Надеюсь, это решит это.

Используйте код ниже:

model = forest.fit(train_fold, train_y.ravel())

если вы по-прежнему получаете пощечину по ошибке, как показано ниже?

Unknown label type: %r" % y

используйте этот код:

y = train_y.ravel()
train_y = np.array(y).astype(int)
model = forest.fit(train_fold, train_y)

Y = y.values ​​[:,0]

Y - formated_train_y

y - train_y

Еще один способ сделать это - использовать ravel

model = forest.fit(train_fold, train_y.values.reshape(-1,))

С neuraxle вы можете легко решить эту проблему:

p = Pipeline([
   # expected outputs shape: (n, 1)
   OutputTransformerWrapper(NumpyRavel()), 
   # expected outputs shape: (n, )
   RandomForestRegressor(**RF_tuned_parameters)
])

p, outputs = p.fit_transform(data_inputs, expected_outputs)

Neuraxle - это подобная sklearn платформа для настройки гиперпараметров и AutoML в проектах глубокого обучения!

format_train_y=[]
for n in train_y:
    format_train_y.append(n[0])

TL;DR
использовать

      y = np.squeeze(y)

вместо

      y = y.ravel()

Как у Питона ravel()может быть допустимым способом достижения желаемых результатов в этом конкретном случае, я бы, однако, рекомендовал использовать .
Проблема здесь в том, что если форма вашего y(массив numpy) например, тогда y.ravel()объединит две переменные на второй оси вдоль первой оси, что приведет к форме, подобной (200,). Это может быть не то, что вам нужно, когда вы имеете дело с независимыми переменными, которые должны рассматриваться сами по себе.
С другой стороны, numpy.squeeze()просто обрежет любые избыточные размеры (т.е. те, которые имеют размер 1). Итак, если форма вашего массива numpy (100, 1), это приведет к массиву формы (100,), тогда как результат для массива numpy формы (100, 2)не изменится, так как ни одно из измерений не имеет размера 1.

Другие вопросы по тегам