Столбец-вектор у был пропущен, когда ожидался массив 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)
Еще один способ сделать это - использовать 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.