¿Combinar resultados de model.predict () con pandas originales DataFrame?

Estoy tratando de combinar los resultados de un método de predict con los datos originales en un objeto pandas.DataFrame .

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

Para fusionar estas predicciones con la df original, bash esto:

 df['y_hats'] = y_hats 

Pero eso plantea:

ValueError: la longitud de los valores no coincide con la longitud del índice

Sé que podría dividir el df en train_df y test_df y este problema se resolvería, pero en realidad necesito seguir el camino anterior para crear las matrices X e y (mi problema real es un problema de clasificación de texto en el que normalizo todo matriz de características antes de dividir en tren y prueba). ¿Cómo puedo alinear estos valores predichos con las filas apropiadas en mi df , ya que la matriz y_hats tiene un índice de cero y aparentemente toda la información sobre qué filas se incluyeron en el X_test y y_test se pierde? ¿O me relegarán primero a dividir los marcos de datos en pruebas de tren y luego a construir matrices de características? Me gustaría simplemente llenar las filas incluidas en el train con los valores de np.nan en el dataframe.

su longitud de y_hats solo será la longitud de los datos de prueba (20%) porque usted predijo en X_test. Una vez que su modelo esté validado y esté satisfecho con las predicciones de la prueba (al examinar la precisión de su modelo en las predicciones X_test comparadas con los valores reales de X_test), debe volver a ejecutar la predicción en el conjunto de datos completo (X). Agrega estas dos líneas al fondo:

 y_hats2 = model.predict(X) df['y_hats'] = y_hats2 

EDITAR según su comentario, aquí hay un resultado actualizado que devuelve el conjunto de datos con la predicción adjunta donde se encontraban en el conjunto de datos de prueba

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

también puedes usar

 y_hats = model.predict(X) df['y_hats'] = y_hats.reset_index()['name of the target column']