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?


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


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.


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.


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)

3

Otra forma de hacer esto es usar ravel

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

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.


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.