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


119

Мне нужно соответствовать 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 ().

model = 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] Любая идея, как решить эту проблему?


что такое train_fold.shapeи train_y.shape?
Александр

@Alexander: train_fold: tuple (749904,24) ... train: y.ravel (): tuple (749904,)
Клаусос Клаусос

Выглядит хорошо. Вы пробовали обучить 100 строк данных, чтобы убедиться, что они работают должным образом (раз уж вы сказали, что это никогда не заканчивается)? Кроме того, проверяли ли вы содержимое ваших train_yданных, чтобы убедиться, что предварительная обработка не повредила его?
Александр

Распечатайте RF_tuned_parametersдля нас, пожалуйста.
Иманол Луенго

@imaluengo: {'n_estimators': 40, 'max_features': 0,8, 'n_jobs': 2, 'verbose': True, 'min_samples_split': 6, 'random_state': 123}
Клаусос Клаусос

Ответы:


196

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

model = forest.fit(train_fold, train_y)

кому:

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

Редактировать:

.valuesдаст значения в массиве. (форма: (n, 1)

.ravel преобразует эту форму массива в (n,)


33
Кто-то может объяснить, что на самом деле меняется.
Рахул Бали

2
AttributeError: объект 'numpy.ndarray' не имеет атрибутов 'values'
Джон Ктеджик

12
Если у вас есть numpy.ndarray, используйте вместо него train_y.ravel ().
Charity

13
@RahulParashar что ravel()делает: когда у вас есть y.shape == (10, 1), используя y.ravel().shape == (10, ). На словах ... он сглаживает массив.
PascalVKooten

Это вообще полезное предупреждение?
Алекс

18

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

Перед этой строкой я использовал import numpy as np.


При использовании этого .ravel()подхода мой вектор-столбец конвертировался в вектор-строку, а не в массив, но это исправление сработало для меня.
Кабдулла

12

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

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

Надеюсь, это решит проблему.


1
Вы имеете в виду np.ravel()?
Pramesh Bajracharya

10

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

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)

3

Другой способ сделать это - использовать ravel

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

Я просто хотел бы добавить, что это будет работать для Pandas Series, но не для Pandas DataFrames.
Sal Alturaigi

2

С 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 в проектах глубокого обучения!


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

2
Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста , измените свой ответ , чтобы добавить объяснения и дать указание о том , что применять ограничения и допущения.
Дхарман,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.