¿Validación cruzada para Sklearn 0.20+?

Estoy tratando de hacer una validación cruzada y me encuentro con un error que dice: ‘Encontré variables de entrada con números inconsistentes de muestras: [18, 1]’

Estoy usando diferentes columnas en un dataframe de pandas (df) como características, con la última columna como etiqueta. Esto se deriva del repository de aprendizaje automático para UC Irvine. Al importar el paquete de validación cruzada que he usado en el pasado, recibo un error que puede haberse depreciado. Voy a ejecutar un árbol de decisión, SVM y K-NN.

Mi código es como tal:

feature = [df['age'], df['job'], df['marital'], df['education'], df['default'], df['housing'], df['loan'], df['contact'], df['month'], df['day_of_week'], df['campaign'], df['pdays'], df['previous'], df['emp.var.rate'], df['cons.price.idx'], df['cons.conf.idx'], df['euribor3m'], df['nr.employed']] label = [df['y']] from sklearn.cross_validation import train_test_split from sklearn.model_selection import cross_val_score # Model Training x = feature[:] y = label x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5) 

Cualquier ayuda sería genial!

cross_validation módulo cross_validation está en desuso. El nuevo módulo model_selection ha tomado su lugar. Así que todo lo que hiciste con cross_validation . ya está disponible en model_selection . Entonces su código anterior se convierte en:

 feature = [df['age'], df['job'], df['marital'], df['education'], df['default'], df['housing'], df['loan'], df['contact'], df['month'], df['day_of_week'], df['campaign'], df['pdays'], df['previous'], df['emp.var.rate'], df['cons.price.idx'], df['cons.conf.idx'], df['euribor3m'], df['nr.employed']] label = [df['y']] from sklearn.model_selection import train_test_split from sklearn.model_selection import cross_val_score 

En lo que respecta a la statement de X e Y, ¿por qué los envuelve en una lista? Sólo úsalos así:

 feature = df[['age', 'job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'day_of_week', 'campaign', 'pdays', 'previous', 'emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'euribor3m', 'nr.employed']] label = df['y'] 

Y luego puedes simplemente usar tu código, sin cambiar nada.

 # Model Training x = feature[:] y = label x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5) 

Y para su última pregunta sobre los pliegues en la validación cruzada, hay varias clases en sklearn que hacen esto (dependiendo de la tarea). Por favor, eche un vistazo a:

Que contiene iteradores de plegado. Y recuerde, todo esto está presente en el paquete model_selection .

Los elementos en su lista de feature son pandas Series. No necesita enumerar cada característica en una lista como lo ha hecho; solo necesitas pasarlos todos como una sola “tabla”.

Por ejemplo, esto se parece al conjunto de datos del banco, por lo que:

 df = pd.read_csv('bank.csv', sep=';') #df.shape #(4521, 17) #df.columns #Index(['age', 'job', 'marital', 'education', 'default', 'balance', 'housing', # 'loan', 'contact', 'day', 'month', 'duration', 'campaign', 'pdays', # 'previous', 'poutcome', 'y'], # dtype='object') x = df.iloc[:, :-1] y = df.iloc[:, -1] x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5) 

Deberia trabajar. Lo único que hay que notar aquí es que x es un DataFrame con 16 columnas, pero sus datos subyacentes son una ndarray numpy, no una lista de Series sino una “matriz” única.