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.
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)
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')
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)