Que estoy recibiendo este error cuando se trata de predecir el uso de un modelo que he construido en scikit aprender. Sé que hay un montón de preguntas acerca de esto, pero la mía parece diferente de ellos, porque yo soy salvajemente entre mi entrada y características del modelo. Aquí está mi código para la formación de mi modelo (FYI el .archivo csv tiene 45 columnas, siendo uno el valor conocido):

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import ensemble
from sklearn.metrics import mean_absolute_error
from sklearn.externals import joblib


df = pd.read_csv("Cinderella.csv")


features_df = pd.get_dummies(df, columns=['Overall_Sentiment', 'Word_1','Word_2','Word_3','Word_4','Word_5','Word_6','Word_7','Word_8','Word_9','Word_10','Word_11','Word_1','Word_12','Word_13','Word_14','Word_15','Word_16','Word_17','Word_18','Word_19','Word_20','Word_21','Word_22','Word_23','Word_24','Word_25','Word_26','Word_27','Word_28','Word_29','Word_30','Word_31','Word_32','Word_33','Word_34','Word_35','Word_36','Word_37','Word_38','Word_39','Word_40','Word_41', 'Word_42', 'Word_43'], dummy_na=True)

del features_df['Slope']

X = features_df.as_matrix()
y = df['Slope'].as_matrix()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

model = ensemble.GradientBoostingRegressor(
    n_estimators=500,
    learning_rate=0.01,
    max_depth=5,
    min_samples_leaf=3,
    max_features=0.1,
    loss='lad'
)

model.fit(X_train, y_train)

joblib.dump(model, 'slope_from_sentiment_model.pkl')

mse = mean_absolute_error(y_train, model.predict(X_train))

print("Training Set Mean Absolute Error: %.4f" % mse)

mse = mean_absolute_error(y_test, model.predict(X_test))
print("Test Set Mean Absolute Error: %.4f" % mse)

Aquí está mi código para la predicción usando una diferente .archivo csv (este tiene 44 columnas porque no tiene ningún valor):

from sklearn.externals import joblib
import pandas


model = joblib.load('slope_from_sentiment_model.pkl')

df = pandas.read_csv("Slaughterhouse_copy.csv")


features_df = pandas.get_dummies(df, columns=['Overall_Sentiment','Word_1', 'Word_2', 'Word_3', 'Word_4', 'Word_5', 'Word_6', 'Word_7', 'Word_8', 'Word_9', 'Word_10', 'Word_11', 'Word_12', 'Word_13', 'Word_14', 'Word_15', 'Word_16', 'Word_17','Word_18','Word_19','Word_20','Word_21','Word_22','Word_23','Word_24','Word_25','Word_26','Word_27','Word_28','Word_29','Word_30','Word_31','Word_32','Word_33','Word_34','Word_35','Word_36','Word_37','Word_38','Word_39','Word_40','Word_41','Word_42','Word_43'], dummy_na=True)

predicted_slopes = model.predict(features_df)

Cuando ejecuto la predicción de archivo de recibir:

ValueError: Number of features of the model must match the input. Model n_features is 146 and input n_features is 226.

Si alguien me pudiera ayudar sería muy apreciada! Gracias de antemano!

Cualquier preprocesamiento como categórica numérico, o de una bañera de codificación, etc, deben ser aplicados en los datos antes de que se divide en tren y prueba. Preprocesamiento como el escalamiento y la normalización debe ser hecho después de la ruptura en la formación y el uso de la misma a las escalas de la prueba.

OriginalEl autor jack_f | 2017-05-17

3 Comentarios

  1. 11

    La razón que usted está recibiendo el error es debido a los diferentes valores distintos en su cuenta de dónde está la generación de los valores ficticios con get_dummies.

    Supongamos que el Word_1 columna en el conjunto de entrenamiento tiene las siguientes palabras distintas: the, dog, jumps, roof, off. Eso es 5 palabras distintas para los pandas generará 5 características para Word_1. Ahora, si su puntuación conjunto de datos tiene un número diferente de palabras distintas en el Word_1 columna, entonces usted va a obtener un número diferente de características.

    Cómo solucionarlo:

    Usted desea concatenar su formación y calificación de los conjuntos de datos utilizando concat, aplicar get_dummies, y a continuación, divida conjuntos de datos. Que va a asegurarse de que han capturado todos los valores distintos en sus columnas. Dado que estás usando dos diferentes csv, usted probablemente desea generar una columna que especifica su formación vs puntuación del conjunto de datos.

    Solución de ejemplo:

    train_df = pd.read_csv("Cinderella.csv")
    train_df['label'] = 'train'
    
    score_df = pandas.read_csv("Slaughterhouse_copy.csv")
    score_df['label'] = 'score'
    
    # Concat
    concat_df = pd.concat([train_df , score_df])
    
    # Create your dummies
    features_df = pd.get_dummies(concat_df, columns=['Overall_Sentiment', 'Word_1','Word_2','Word_3','Word_4','Word_5','Word_6','Word_7','Word_8','Word_9','Word_10','Word_11','Word_1','Word_12','Word_13','Word_14','Word_15','Word_16','Word_17','Word_18','Word_19','Word_20','Word_21','Word_22','Word_23','Word_24','Word_25','Word_26','Word_27','Word_28','Word_29','Word_30','Word_31','Word_32','Word_33','Word_34','Word_35','Word_36','Word_37','Word_38','Word_39','Word_40','Word_41', 'Word_42', 'Word_43'], dummy_na=True)
    
    # Split your data
    train_df = features_df[features_df['label'] == 'train']
    score_df = features_df[features_df['label'] == 'score']
    
    # Drop your labels
    train_df = train_df.drop('label', axis=1)
    score_df = score_df.drop('label', axis=1)
    
    # Now delete your 'slope' feature, create your features matrix, and create your model as you have already shown in your example
    ...
    Muchas gracias, este funcionaba a la perfección!
    ¿Hay alguna otra manera de hacerlo? Mi prueba de datos en tiempo real y no puedo concatenar con los datos de entrenamiento. Quiero entrenar a mi clasificador, guardar y cargar a aplicar sobre los datos de prueba.
    No hay una manera fácil de manejar datos desconocidos para la puntuación. En la costumbre de los casos, depende de cómo usted desea para manejar los datos de calificación pero las opciones son o bien dejando caer los datos o imputar el valor no se ha visto en los datos de entrenamiento. Echa un vistazo a función de hash demasiado.

    OriginalEl autor Scratch’N’Purr

  2. 3

    He probado el método aquí se sugiere y terminó con bañera de codificación de la etiqueta de la columna,y en el dataframe se muestra como ‘label_test‘ y ‘label_train‘ tan sólo un heads up probar este post get_dummies:

    train_df = feature_df[feature_df['label_train'] == 1]
    test_df = feature_df[feature_df['label_test'] == 0]
    train_df = train_df.drop(['label_train', 'label_test'], axis=1)
    test_df = test_df.drop(['label_train', 'label_test'], axis=1)
    En la segunda línea, ¿te refieres a test_df = feature_df[feature_df[‘label_test’] == 1] ?

    OriginalEl autor Akson

  3. 1

    Por debajo de corrección de la respuesta original de Scratch N»Purr podría ayudar a resolver uno de los problemas que puede enfrentar el uso de de la cadena de valor para la nueva columna insertada ‘etiqueta’ –

    train_df = pd.read_csv(«la Cenicienta.csv»)
    train_df[‘etiqueta’] = 1

        score_df = pandas.read_csv("Slaughterhouse_copy.csv")
        score_df['label'] = 2
    
        # Concat
        concat_df = pd.concat([train_df , score_df])
    
        # Create your dummies
        features_df = pd.get_dummies(concat_df)
    
        # Split your data
        train_df = features_df[features_df['label'] == '1]
        score_df = features_df[features_df['label'] == '2]
        ...

    OriginalEl autor code-on-treehouse

Dejar respuesta

Please enter your comment!
Please enter your name here