Ein Spaltenvektor y wurde übergeben, wenn ein 1d-Array erwartet wurde


117

Ich muss passen RandomForestRegressorvon sklearn.ensemble.

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

Dieser Code hat immer funktioniert, bis ich Daten vorverarbeitet habe ( train_y). Die Fehlermeldung lautet:

DataConversionWarning: Ein Spaltenvektor y wurde übergeben, als ein 1d-Array erwartet wurde. Bitte ändern Sie die Form von y in (n_samples,), zum Beispiel mit ravel ().

model = forest.fit (train_fold, train_y)

Früher train_ywar es eine Serie, jetzt ist es ein Numpy-Array (es ist ein Spaltenvektor). Wenn ich mich bewerbe train_y.ravel(), wird es zu einem Zeilenvektor und es wird keine Fehlermeldung angezeigt. Der Vorhersageschritt dauert sehr lange (tatsächlich wird er nie beendet ...).

In den Dokumenten von RandomForestRegressorfand ich, dass train_ydies definiert werden sollte als y : array-like, shape = [n_samples] or [n_samples, n_outputs] Irgendeine Idee, wie man dieses Problem löst?


was ist train_fold.shapeund train_y.shape?
Alexander

@ Alexander: train_fold: tuple (749904,24) ... train: y.ravel (): tuple (749904,)
Klausos Klausos

Sieht gut aus. Haben Sie versucht, 100 Zeilen der Daten zu trainieren, um sicherzustellen, dass sie ordnungsgemäß funktionieren (da Sie sagten, dass sie nie fertig sind)? Haben Sie auch den Inhalt Ihrer train_yDaten überprüft, um sicherzustellen, dass die Vorverarbeitung sie nicht beschädigt hat?
Alexander

Drucken RF_tuned_parametersSie bitte für uns.
Imanol Luengo

@imaluengo: {'n_estimators': 40, 'max_features': 0,8, 'n_jobs': 2, 'verbose': True, 'min_samples_split': 6, 'random_state': 123}
Klausos Klausos

Antworten:


187

Ändern Sie diese Zeile:

model = forest.fit(train_fold, train_y)

zu:

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

Bearbeiten:

.valuesgibt die Werte in einem Array an. (Form: (n, 1)

.ravel konvertiert diese Array-Form in (n,)


33
Jemand könnte erklären, was sich tatsächlich ändert.
Rahul Bali

2
AttributeError: Das Objekt 'numpy.ndarray' hat kein Attribut 'values'
John Ktejik

12
Wenn Sie ein numpy.ndarray haben, verwenden Sie stattdessen train_y.ravel ().
Charity Leschinski

13
@ RahulParashar was ravel()tut ist: wenn Sie haben y.shape == (10, 1), mit y.ravel().shape == (10, ). In Worten ... es glättet ein Array.
PascalVKooten

Ist das überhaupt eine nützliche Warnung?
alex

18

Ich bin auch auf diese Situation gestoßen, als ich versucht habe, einen KNN- Klassifikator zu trainieren . aber es scheint, dass die Warnung weg war, nachdem ich mich geändert hatte:
knn.fit(X_train,y_train)
zu
knn.fit(X_train, np.ravel(y_train,order='C'))

Vor dieser Zeile habe ich verwendet import numpy as np.


Bei Verwendung des .ravel()Ansatzes wurde mein Spaltenvektor eher in einen Zeilenvektor als in ein Array konvertiert, aber dieser Fix funktionierte für mich.
Kabdulla

12

Ich hatte das gleiche Problem. Das Problem war, dass die Beschriftungen in einem Spaltenformat vorliegen, während es in einer Zeile erwartet wird. verwendennp.ravel()

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

Hoffe das löst es.


1
Du meinst np.ravel()?
Pramesh Bajracharya

10

Verwenden Sie den folgenden Code:

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

Wenn Sie immer noch versehentlich einen Schlag bekommen, der genauso identisch ist wie unten?

Unknown label type: %r" % y

Verwenden Sie diesen Code:

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

3

Eine andere Möglichkeit ist die Verwendung ravel

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

Ich möchte nur hinzufügen, dass dies für die Pandas-Serie funktioniert, nicht jedoch für Pandas DataFrames.
Sal Alturaigi

2

Mit Neuraxle können Sie dies leicht lösen:

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 ist ein sklearn-ähnliches Framework für Hyperparameter-Tuning und AutoML in Deep-Learning-Projekten!


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

2
Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
Dharman

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.