Un vecteur de colonne y a été transmis lorsqu'un tableau 1d était attendu


118

Je dois répondre à RandomForestRegressorpartir sklearn.ensemble.

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

Ce code a toujours fonctionné jusqu'à ce que je fasse un prétraitement des données ( train_y). Le message d'erreur dit:

DataConversionWarning: Un vecteur de colonne y a été transmis lorsqu'un tableau 1d était attendu. Veuillez changer la forme de y en (n_samples,), par exemple en utilisant ravel ().

model = forest.fit (train_fold, train_y)

Auparavant, train_yc'était une série, maintenant c'est un tableau numpy (c'est un vecteur de colonne). Si je postule train_y.ravel(), alors cela devient un vecteur de ligne et aucun message d'erreur n'apparaît, car l'étape de prédiction prend très longtemps (en fait, elle ne se termine jamais ...).

Dans la documentation de RandomForestRegressorj'ai trouvé que cela train_ydevrait être défini comme y : array-like, shape = [n_samples] or [n_samples, n_outputs] une idée comment résoudre ce problème?


qu'est-ce que train_fold.shapeet train_y.shape?
Alexander

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

Semble bien. Avez-vous essayé d'entraîner 100 lignes de données pour vous assurer que cela fonctionne correctement (puisque vous avez dit que cela n'avait jamais été terminé)? De plus, avez-vous examiné le contenu de vos train_ydonnées pour vous assurer que le prétraitement ne les a pas corrompues?
Alexander

Imprimez RF_tuned_parameterspour nous s'il vous plaît.
Imanol Luengo

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

Réponses:


191

Changez cette ligne:

model = forest.fit(train_fold, train_y)

à:

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

Éditer:

.valuesdonnera les valeurs dans un tableau. (forme: (n, 1)

.ravel convertira cette forme de tableau en (n,)


33
Quelqu'un pourrait expliquer ce que cela change réellement.
Rahul Bali

2
AttributeError: l'objet 'numpy.ndarray' n'a pas d'attribut 'values'
john ktejik

12
Si vous avez un numpy.ndarray, utilisez plutôt train_y.ravel ().
Charity Leschinski

13
@RahulParashar ce qui ravel()fait est: quand vous avez y.shape == (10, 1), en utilisant y.ravel().shape == (10, ). En mots ... cela aplatit un tableau.
PascalVKooten

Est-ce même un avertissement utile?
alex le

18

J'ai également rencontré cette situation lorsque j'essayais de former un classificateur KNN . mais il semble que l'avertissement a disparu après avoir changé:
knn.fit(X_train,y_train)
à
knn.fit(X_train, np.ravel(y_train,order='C'))

En avance sur cette ligne, j'ai utilisé import numpy as np.


Lors de l'utilisation de l' .ravel()approche, mon vecteur de colonne était un convertisseur en vecteur de ligne plutôt qu'en tableau, mais ce correctif a fonctionné pour moi.
kabdulla

12

J'ai eu le même problème. Le problème était que les étiquettes étaient dans un format de colonne alors qu'il l'attendait dans une ligne. utilisationnp.ravel()

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

J'espère que cela le résout.


1
Tu veux dire np.ravel()?
Pramesh Bajracharya

10

utilisez le code ci-dessous:

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

si vous obtenez toujours slap par erreur aussi identique que ci-dessous?

Unknown label type: %r" % y

utilisez ce code:

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

3

Une autre façon de faire est d'utiliser ravel

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

Je voudrais juste ajouter que cela fonctionnera pour Pandas Series, mais pas pour Pandas DataFrames.
Sal Alturaigi

2

Avec neuraxle , vous pouvez facilement résoudre ce problème:

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 est un framework de type sklearn pour le réglage des hyperparamètres et AutoML dans les projets d'apprentissage profond!


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

2
Bien que ce code puisse résoudre la question, inclure une explication sur comment et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de votre publication et entraînerait probablement plus de votes à la hausse. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement à la personne qui la pose maintenant. Veuillez modifier votre réponse pour ajouter des explications et donner une indication des limites et des hypothèses applicables.
Dharman le

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.