web-dev-qa-db-fra.com

Fusion des résultats de model.predict () avec l'original pandas DataFrame?

J'essaie de fusionner les résultats d'une méthode predict avec les données d'origine dans un pandas.DataFrame objet.

from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
from sklearn.tree import DecisionTreeClassifier
import pandas as pd
import numpy as np

data = load_iris()

# bear with me for the next few steps... I'm trying to walk you through
# how my data object landscape looks... i.e. how I get from raw data 
# to matrices with the actual data I have, not the iris dataset
# put feature matrix into columnar format in dataframe
df = pd.DataFrame(data = data.data)

# add outcome variable
df['class'] = data.target

X = np.matrix(df.loc[:, [0, 1, 2, 3]])
y = np.array(df['class'])

# finally, split into train-test
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.8)

model = DecisionTreeClassifier()

model.fit(X_train, y_train)

# I've got my predictions now
y_hats = model.predict(X_test)

Pour fusionner ces prédictions avec le df d'origine, j'essaie ceci:

df['y_hats'] = y_hats

Mais cela soulève:

ValueError: la longueur des valeurs ne correspond pas à la longueur de l'index

Je sais que je pourrais diviser le df en train_df et test_df et ce problème serait résolu, mais en réalité je dois suivre le chemin ci-dessus pour créer les matrices X et y (mon problème réel est un problème de classification de texte dans lequel je normalise le entier matrice de caractéristiques avant de se diviser en train et tester). Comment puis-je aligner ces valeurs prédites avec les lignes appropriées dans mon df, puisque le y_hats le tableau est indexé à zéro et apparemment toutes les informations sur qui lignes ont été incluses dans le X_test et y_test est perdu? Ou vais-je être relégué à diviser les trames de données en train-test d'abord, puis à construire des matrices d'entités? Je voudrais simplement remplir les lignes incluses dans train avec np.nan valeurs dans la trame de données.

11
blacksite

votre longueur y_hats ne sera que la longueur des données de test (20%) car vous avez prédit sur X_test. Une fois que votre modèle est validé et que vous êtes satisfait des prévisions de test (en examinant la précision de votre modèle sur les prédictions X_test par rapport aux valeurs vraies X_test), vous devez réexécuter la prédiction sur l'ensemble de données complet (X). Ajoutez ces deux lignes en bas:

y_hats2 = model.predict(X)

df['y_hats'] = y_hats2

MODIFIER par votre commentaire, voici un résultat mis à jour qui retourne le jeu de données avec la prédiction ajoutée là où ils étaient dans le jeu de données de test

from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
from sklearn.tree import DecisionTreeClassifier
import pandas as pd
import numpy as np

data = load_iris()

# bear with me for the next few steps... I'm trying to walk you through
# how my data object landscape looks... i.e. how I get from raw data 
# to matrices with the actual data I have, not the iris dataset
# put feature matrix into columnar format in dataframe
df = pd.DataFrame(data = data.data)

# add outcome variable
df_class = pd.DataFrame(data = data.target)

# finally, split into train-test
X_train, X_test, y_train, y_test = train_test_split(df,df_class, train_size = 0.8)

model = DecisionTreeClassifier()

model.fit(X_train, y_train)

# I've got my predictions now
y_hats = model.predict(X_test)

y_test['preds'] = y_hats

df_out = pd.merge(df,y_test[['preds']],how = 'left',left_index = True, right_index = True)
16
flyingmeatball

Vous pouvez probablement créer un nouveau cadre de données et y ajouter les données de test ainsi que les valeurs prévues:

data['y_hats'] = y_hats
data.to_csv('data1.csv')
0
Nidhi Garg

J'ai le même problème (presque)

Je l'ai réparé de cette façon

...
.
.
.
X_train, X_test, y_train, y_test = train_test_split(df,df_class, train_size = 0.8)

model = DecisionTreeClassifier()

model.fit(X_train, y_train)

y_hats = model.predict(X_test)

y_hats  = pd.DataFrame(y_hats)

df_out = X_test.reset_index()
df_out["Actual"] = y_test.reset_index()["Columns_Name"]
df_out["Prediction"] = y_hats.reset_index()[0]


y_test['preds'] = y_hats

df_out = pd.merge(df,y_test[['preds']],how = 'left',left_index = True, right_index = True)
0
asmgx