1

ich die beste Split für meine StratifiedKFold finden wollen und mein Modell bauen auf den besten Split .Der Code ist wie folgt:Scikit-Learn (Python) Verschiedene metrische Ergebnisse (f1 score) für StratifiedKFold

def best_classifier(clf,k,x,y): 

    skf = StratifiedKFold(n_splits=k,shuffle=True) 

    bestclf = None 
    bestf1 = 0 
    bestsplit = [] 
    cnt = 1 
    totalf1 = 0 

    for train_index,test_index in skf.split(x,y): 
     x_train,x_test = x[train_index],x[test_index] 
     y_train,y_test = y[train_index],y[test_index] 
     clf.fit(x_train,y_train) 
     predicted_y = clf.predict(x_test) 
     f1 = f1_score(y_test,predicted_y) 
     totalf1 = totalf1+f1 
     print(y_test.shape) 

     print(cnt," iteration f1 score",f1) 
     if cnt==10: 
      avg = totalf1/10 
      print(avg) 
     if f1>bestf1: 
      bestf1 = f1 
      bestclf = clf 
      bestsplit = [train_index,test_index] 

     cnt = cnt+1 
    return [bestclf,bestf1,bestsplit] 

diese Funktion gibt mir eine Reihe von meiner Sichter (für die beste Split ausgestattet), am besten f1score und die Indizes der besten Split

ich nenne es wie folgt:

best_of_best = best_classifier(sgd,10,x_selected,y) 

Jetzt, da ich ca Die beste Split und mein Classifier teste ich noch einmal für die gleiche Split, nur um zu überprüfen, ob ich das gleiche Ergebnis bekomme wie ich innerhalb der Funktion. Aber anscheinend ist es nicht so. Code:

bestclf= best_of_best[0] 
test_index = best_of_best[2][1] 
x_cv = x_selected[test_index] 
y_cv = y[test_index] 
pred_cv = bestclf.predict(x_cv) 
f1_score(y_cv,pred_cv) 

Ergebnisse, wenn die Methode best_classifier ist aufgerufen:

(679,) 
1 iteration f1 score 0.643298969072 
(679,) 
2 iteration f1 score 0.761750405186 
(678,) 
3 iteration f1 score 0.732773109244 
(678,) 
4 iteration f1 score 0.632911392405 
(678,) 
5 iteration f1 score 0.74179743224 
(678,) 
6 iteration f1 score 0.749140893471 
(677,) 
7 iteration f1 score 0.750830564784 
(677,) 
8 iteration f1 score 0.756756756757 
(677,) 
9 iteration f1 score 0.682170542636 
(677,) 
10 iteration f1 score 0.63813229572 
0.708956236151 

Ergebnis, wenn ich außerhalb der besten Split von statifiedkfold

0.86181818181818182 

Wie wir, dass dieses f1 sehen kann vorhersagen, Punktzahl wird nicht in den 10 Falten beobachtet. Warum ist es so? Bin ich etwas falsch? Ist meine Logik der Methode falsch?

+1

Ohne zu viel über sklearn StratifiedKFold zu wissen, denke ich, dass das 'shuffle = True' die Daten vor jedem' skf.split' mischt. Wie sieht es aus, wenn Sie es auf False setzen? Sie können auch »shuffle = True« wählen und »random_state = 1« setzen, um bei jeder Iteration den gleichen Shuffle zu erhalten. –

+0

Nein, habe es versucht, aber hat nicht funktioniert. Obwohl ich shuffle = True gesetzt habe, erhalte ich meine Split-Indizes für jeden Shuffle. – Kaushal

Antwort

0

Ich habe es gelöst. Das Problem war, weil ich nicht mein CIF-Objekt zu BestCLF deepcopy. Jedes Mal, wenn die K -te-Falte zum Ausführen meiner besten Referenz verwendet wurde, änderte sich diese in die aktuelle clf, da ich nicht tief kopierte.

bestclf = copy.deepcopy(clf) 
Verwandte Themen