2016-06-22 7 views
2

Ich arbeite mit einer Matrix X und einem Etikett für jede Zeile in dieser Matrix y. Ich beantrage SVM maschinelles Lernen mitWie kann ich die Testgröße bei der Kreuzvalidierung mit train_test_split konstant halten?

df = pd.read_csv('./data/Step7_final.csv', index_col=False, encoding="ISO-8859-1") 
y = df.iloc[:, 1].values 

Dann: definiert

df = pd.read_csv("./data/svm_matrix_0.csv", sep=',',header=None, encoding="ISO-8859-1") 
df2 = df.convert_objects(convert_numeric=True) 
X = df_2.values 

y als:

clf = svm.SVC(kernel='linear', C=1) #specify classifier 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2) #splitting randomly the training and test data 
clf.fit(X_train,y_train) #training of machine 

Nun würde Ich mag die X_train Größe variieren X ist definiert als und Berechnen des Zug- und Testfehlers für jeden Wert von X_train mit:

test_error = clf.score(X_test, y_test) 
train_error = clf.score(X_train, y_train) 

Die X_train sollte in der Größe erhöhen (beispielsweise 15 verschiedene Werte), und dann sollten die Werte in einem Wörterbuch in Form gespeichert werden: {X_train size: (test_error, train_error)}.

Ich habe versucht:

array = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9] 
dicto = {} 
for i in array: 
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = i) 
    clf.fit(X_train,y_train) 
    test = clf.score(X_test, y_test) 
    train = clf.score(X_train, y_train) 
    dicto[i] = test, train 

print(dicto) 

Aber es funktioniert nicht, da ich auch die X_test unterschiedlichen bin. Kann jemand meinen Code so anpassen, dass er nur die Größe von X_train variiert (so dass die Fehler bei einer zunehmenden Gesamtgröße des Datensatzes berechnet werden)?

+0

Ich verstehe Ihre Frage nicht, tun Sie Ihre Testdatengröße konstant halten wollen? – hashcode55

+0

Ja, meine Testdatengröße sollte konstant sein, aber die Größe meiner Trainingsdaten sollte von einem niedrigen bis zu einem hohen Wert variieren. Ich möchte eine Lernkurve erstellen;) – Papie

Antwort

1

Was können Sie tun, ist zunächst die Testdaten getrennt ...

X_train_prev, X_test_prev, y_train_prev, y_test_prev = train_test_split(X, y, test_size = 0.2) 

Nun ist die for-Schleife laufen den Zug Größe ändern, aber auf dem ** früheren Testdaten *

wie diese Prüfung -

array = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9] 
dicto = {} 
for i in array: 
    X_train, _, y_train, _ = train_test_split(X, y, test_size = i) 
    clf.fit(X_train,y_train) 
    #use the previous test data... 
    test = clf.score(X_test_prev, y_test_prev) 
    train = clf.score(X_train, y_train) 
    dicto[i] = test, train 

print(dicto) 

Aber beachten Sie, dass, was ich getan habe, könnte das Modell Metrik-Score in unsichtbaren Daten reduzieren, da die Daten zufällig ist, können wir die Testdaten zu verseuchen. Was Sie also tun können, um es zu vermeiden, ist in den Zugdaten aufgeteilt, so dass Ihre Testdaten getrennt bleiben !!

wie folgt (die Linie in der for-Schleife) -

X_train, _, y_train, _ = train_test_split(X_train_prev, y_train_prev, test_size = i) 
+0

Sie sind ein Genie hashcode55! Das hat mir geholfen, du hast mir sehr geholfen! Vielen Dank! – Papie