-3

Ich versuche, Kreuzvalidierung zu tun, und ich renne in einen Fehler, der sagt: 'Gefundene Eingangsvariablen mit inkonsistenten Zahlen von Proben: [18, 1]'Kreuzvalidierung für Sklearn 0.20+?

Ich benutze verschiedene Spalten in einem Pandas-Datenrahmen (df) als Features, mit der letzten Spalte als Label. Diese stammt aus dem Machine Learning Repository für UC Irvine. Beim Importieren des Kreuzvalidierungspakets, das ich in der Vergangenheit verwendet habe, erhalte ich einen Fehler, der möglicherweise abgewertet wurde. Ich werde einen Entscheidungsbaum, SVM und K-NN laufen lassen.

Mein Code ist als solche:

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) 

Jede Hilfe wäre toll!

+1

Was ist unklar über den Fehler? Druckart und Form von x. Es sieht aus wie eine Liste von PD-Serien, die möglicherweise nicht das sind, was Sie wollen. – sascha

Antwort

1

cross_validation Modul ist veraltet. Das neue Modul model_selection ist an seine Stelle getreten. Also alles was du getan hast mit cross_validation. ist jetzt in model_selection verfügbar. Dann wird Ihr obige Code wird:

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 

nun so weit wie erklärt die X- und Y betrifft, warum Sie sie in einer Liste wickeln. Verwenden Sie sie einfach so:

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'] 

Und dann können Sie einfach Ihren Code verwenden, ohne etwas zu ändern.

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

Und für Ihre letzte Frage zu Falten in Kreuzvalidierung gibt es in sklearn mehr Klassen, die dies tut (nach Aufgabe abhängig). Weitere Informationen finden sie unter:

Welche Iteratoren enthält falten. Und denken Sie daran, all dies ist in model_selection Paket vorhanden.

1

Die Artikel in Ihrer feature Liste sind Pandas Series. Sie müssen nicht jedes Feature in einer Liste auflisten, wie Sie es getan haben. Sie müssen sie alle als einen einzigen "Tisch" übergeben.

Zum Beispiel sieht das wie der Bank-Datensatz so:

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) 

funktionieren soll. Die einzige Sache, die hier zu bemerken ist, dass x ein DataFrame mit 16 Spalten ist, aber die zugrunde liegenden Daten sind ein numpy ndarray - keine Liste der Serie, sondern eine einzelne "Matrix".

+0

Das scheint zu laufen, danke. Meine nächste Frage wäre, dass ich irgendwo im Kreuzvalidierungspaket, das ich importierte, die Anzahl der Falten für die Kreuzvalidierung angeben könnte? Ich glaube nicht, dass "train_test_split" diesen Parameter übernimmt. – rmahesh

Verwandte Themen