Se pasó una columna-vector y cuando se esperaba una matriz 1d

118

Necesito encajar RandomForestRegressordesde sklearn.ensemble.

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

Este código siempre funcionó hasta que hice algún preprocesamiento de datos ( train_y). El mensaje de error dice:

DataConversionWarning: Se pasó una columna-vector y cuando se esperaba una matriz 1d. Cambie la forma de y a (n_samples,), por ejemplo, usando ravel ().

modelo = bosque.fit (tren_fold, tren_y)

Anteriormente train_yera una serie, ahora es una matriz numpy (es un vector de columna). Si aplico train_y.ravel(), se convierte en un vector de fila y no aparece ningún mensaje de error, ya que el paso de predicción lleva mucho tiempo (en realidad, nunca termina ...).

En los documentos de RandomForestRegressorencontré que train_ydebería definirse como ¿ y : array-like, shape = [n_samples] or [n_samples, n_outputs] Alguna idea de cómo resolver este problema?

Klausos Klausos
fuente
lo que es train_fold.shapey train_y.shape?
Alexander
@Alexander: train_fold: tuple (749904,24) ... train: y.ravel (): tuple (749904,)
Klausos Klausos
Se ve bien. ¿Ha intentado entrenar 100 filas de datos para asegurarse de que funcione correctamente (ya que dijo que nunca terminó)? Además, ¿ha examinado el contenido de sus train_ydatos para asegurarse de que el preprocesamiento no los corrompió?
Alexander
Imprime RF_tuned_parameterspara nosotros por favor.
Imanol Luengo
@imaluengo: {'n_estimators': 40, 'max_features': 0.8, 'n_jobs': 2, 'verbose': True, 'min_samples_split': 6, 'random_state': 123}
Klausos Klausos

Respuestas:

191

Cambie esta línea:

model = forest.fit(train_fold, train_y)

a:

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

Editar:

.valuesdará los valores en una matriz. (forma: (n, 1)

.ravel convertirá esa forma de matriz en (n,)

Linda MacPhee-Cobb
fuente
33
Alguien podría explicar qué cambia realmente.
Rahul Bali
2
AttributeError: el objeto 'numpy.ndarray' no tiene 'valores' de atributo
john ktejik
12
Si tiene un numpy.ndarray, use train_y.ravel () en su lugar.
Charity Leschinski
13
@RahulParashar lo que ravel()hace es: cuando tienes y.shape == (10, 1), usando y.ravel().shape == (10, ). En palabras ... aplana una matriz.
PascalVKooten
¿Es esto incluso una advertencia útil?
alex
18

También encontré esta situación cuando estaba tratando de entrenar a un clasificador KNN . pero parece que la advertencia desapareció después de que cambié:
knn.fit(X_train,y_train)
a
knn.fit(X_train, np.ravel(y_train,order='C'))

Adelante de esta línea utilicé import numpy as np.

Simon Leung
fuente
Cuando usé el .ravel()enfoque, mi vector de columna se convirtió en un vector de fila en lugar de una matriz, pero esta solución funcionó para mí.
kabdulla
12

Yo tuve el mismo problema. El problema era que las etiquetas estaban en formato de columna mientras se esperaba en una fila. utilizarnp.ravel()

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

Espero que esto lo resuelva.

mohammad hassan bigdeli shamlo
fuente
1
¿Te refieres np.ravel()?
Pramesh Bajracharya
10

use el siguiente código:

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

si todavía recibe una palmada por error tan idéntica a la siguiente?

Unknown label type: %r" % y

usa este código:

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

Otra forma de hacer esto es usar ravel

model = forest.fit(train_fold, train_y.values.reshape(-1,))
sushmit
fuente
Solo me gustaría agregar que esto funcionará para Pandas Series, pero no Pandas DataFrames.
Sal Alturaigi
2

Con neuraxle , puede resolver esto fácilmente:

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 es un marco similar a sklearn para el ajuste de hiperparámetros y AutoML en proyectos de aprendizaje profundo.

AlexB
fuente
1
format_train_y=[]
for n in train_y:
    format_train_y.append(n[0])
Bibby Wang
fuente
2
Si bien este código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resultaría en más votos a favor. Recuerde que está respondiendo la pregunta a los lectores en el futuro, no solo a la persona que pregunta ahora. Por favor, editar su respuesta para agregar explicaciones y dar una indicación de lo que se aplican limitaciones y supuestos.
Dharman
0

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

Y - formated_train_y

y - train_y

Jeyakeethan Geethan
fuente