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?

Klausos Klausos
quelle
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,)

Linda MacPhee-Cobb
quelle
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.

Simon Leung
quelle
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.

mohammad hassan bigdeli shamlo
quelle
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)
Koralle
quelle
3

Eine andere Möglichkeit ist die Verwendung ravel

model = forest.fit(train_fold, train_y.values.reshape(-1,))
Sushmit
quelle
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!

AlexB
quelle
1
format_train_y=[]
for n in train_y:
    format_train_y.append(n[0])
Bibby Wang
quelle
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
0

Y = y.Werte [:, 0]

Y - formated_train_y

y - train_y

Jeyakeethan Geethan
quelle