Un vettore colonna y è stato passato quando era previsto un array 1d


118

Ho bisogno di adattarsi RandomForestRegressorda sklearn.ensemble.

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

Questo codice ha sempre funzionato fino a quando non ho eseguito una preelaborazione dei dati ( train_y). Il messaggio di errore dice:

DataConversionWarning: un vettore di colonna y è stato passato quando era previsto un array 1d. Si prega di cambiare la forma di y in (n_samples,), ad esempio usando ravel ().

model = forest.fit (train_fold, train_y)

In precedenza train_yera una serie, ora è un array numpy (è un vettore colonna). Se applico train_y.ravel(), diventa un vettore riga e non appare alcun messaggio di errore, attraverso il passaggio di previsione ci vuole molto tempo (in realtà non finisce mai ...).

Nei documenti di RandomForestRegressorho scoperto che train_ydovrebbe essere definito come y : array-like, shape = [n_samples] or [n_samples, n_outputs] Qualche idea su come risolvere questo problema?


cosa è train_fold.shapee train_y.shape?
Alexander

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

Sembra a posto. Hai provato ad addestrare 100 righe di dati per assicurarti che funzioni correttamente (poiché hai detto che non è mai finito)? Inoltre, hai esaminato il contenuto dei tuoi train_ydati per assicurarti che la pre-elaborazione non li abbia corrotti?
Alexander

Stampa RF_tuned_parametersper noi per favore.
Imanol Luengo

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

Risposte:


191

Cambia questa riga:

model = forest.fit(train_fold, train_y)

per:

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

Modificare:

.valuesdarà i valori in un array. (forma: (n, 1)

.ravel convertirà quella forma dell'array in (n,)


33
Qualcuno potrebbe spiegare cosa cambia effettivamente.
Rahul Bali

2
AttributeError: l'oggetto "numpy.ndarray" non ha "valori" di attributo
john ktejik

12
Se hai un numpy.ndarray, usa invece train_y.ravel ().
Charity Leschinski

13
@RahulParashar quello che ravel()fa è: quando hai y.shape == (10, 1), usando y.ravel().shape == (10, ). In parole ... appiattisce un array.
PascalVKooten

È anche un utile avvertimento?
alex

18

Ho riscontrato questa situazione anche quando stavo cercando di addestrare un classificatore KNN . ma sembra che l'avviso sia sparito dopo che ho cambiato:
knn.fit(X_train,y_train)
in
knn.fit(X_train, np.ravel(y_train,order='C'))

Prima di questa linea ho usato import numpy as np.


Quando utilizzavo l' .ravel()approccio, il mio vettore colonna era un convertitore in un vettore riga anziché in un array, ma questa correzione ha funzionato per me.
kabdulla

12

Ho avuto lo stesso problema. Il problema era che le etichette erano in un formato di colonna mentre lo prevedeva in una riga. usonp.ravel()

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

Spero che questo lo risolva.


1
Intendi np.ravel()?
Pramesh Bajracharya,

10

usa il codice seguente:

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

se stai ancora ricevendo uno schiaffo per errore identico come di seguito?

Unknown label type: %r" % y

usa questo codice:

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

3

Un altro modo per farlo è usare ravel

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

Vorrei solo aggiungere che questo funzionerà per la serie Pandas, ma non per Pandas DataFrames.
Sal Alturaigi

2

Con neuraxle , puoi facilmente risolvere questo:

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 è un framework simile a sklearn per l'ottimizzazione degli iperparametri e AutoML nei progetti di deep learning!


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

2
Sebbene questo codice possa risolvere la domanda, inclusa una spiegazione di come e perché questo risolve il problema aiuterebbe davvero a migliorare la qualità del tuo post e probabilmente si tradurrebbe in più voti positivi. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo alla persona che chiede ora. Si prega di modificare la risposta per aggiungere spiegazioni e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Dharman

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.