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?

Klausos Klausos
la source
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,)

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

Simon Leung
la source
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.

shamlo de mohammad hassan bigdeli
la source
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)
corail
la source
3

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

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

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

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

Y - formated_train_y

y - train_y

Jeyakeethan Geethan
la source