Коли колону-вектор y пропускали, коли очікувався масив 1d


118

Мені потрібно , щоб відповідати 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_yбула серія, тепер це масивний масив (це стовпець-вектор). Якщо я застосую 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) ... поїзд: y.ravel (): кортеж (749904,)
Klausos Klausos

Виглядає чудово. Ви намагалися навчити 100 рядків даних, щоб переконатися, що вони працюють належним чином (оскільки ви сказали, що це ніколи не закінчувалося)? Також ви перевірили вміст своїх train_yданих, щоб переконатися, що попередня обробка не пошкодила їх?
Олександр

Роздрукуйте RF_tuned_parametersдля нас, будь ласка.
Іманол Луєнго

@imaluengo: {'n_estimators': 40, 'max_features': 0.8, 'n_jobs': 2, 'verbose': Правда, 'min_samples_split': 6, 'random_state': 123}
Klausos Klausos

Відповіді:


191

Змініть цей рядок:

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' об’єкт не має атрибута 'значень'
John ktejik

12
Якщо у вас є numpy.ndarray, використовуйте натомість train_y.ravel ().
Благодійність Лещинських

13
@RahulParashar що ravel()робить: коли маєш y.shape == (10, 1), використовуючи y.ravel().shape == (10, ). На словах ... це розгладжує масив.
PascalVKooten

Це навіть корисне попередження?
alex

18

Я також стикався з цією ситуацією, коли намагався підготувати класифікатор KNN . але здається, що попередження пішло після того, як я змінився:
knn.fit(X_train,y_train)
на
knn.fit(X_train, np.ravel(y_train,order='C'))

Попереду цей рядок я використовував import numpy as np.


При використанні .ravel()підходу вектор мого стовпчика був перетворювачем на векторний рядок, а не на масив, але це виправлення працювало для мене.
кабдула


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 - це структура, що нагадує склеарн для налаштування гіперпараметрів та 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.