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

AlexB
источник
1
format_train_y=[]
for n in train_y:
    format_train_y.append(n[0])
Бибби Ван
источник
2
Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста , измените свой ответ , чтобы добавить объяснения и дать указание о том , что применять ограничения и допущения.
Дхарман,
0

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

Y - formated_train_y

y - train_y

Джеакитан Гитан
источник