Scikit-lernen Lernkurven mit verschiedenen Scorern und verlassen eine Gruppe aus CV die gleichen Werte - Python, Machine-Learning, Scikit-lernen, Svm

Ich möchte Lernkurven auf einer trainierten SVM darstellenKlassifikator, mit verschiedenen Scores und Verwendung von Leave One Group Out als Methode der Crossvalidierung. ich dachte ich hatte es herausgefunden, aber zwei verschiedene Torschützen - "f1_micro" und "Genauigkeit" - liefert identische Werte. Ich bin verwirrt, ist das angenommen der Fall sein?

Hier ist mein Code (leider kann ich die Daten nicht teilen, da sie nicht geöffnet ist):

from sklearn import svm
SVC_classifier_LOWO_VC0 = svm.SVC(cache_size=800, class_weight=None,
coef0=0.0, decision_function_shape=None, degree=3, gamma=0.01,
kernel="rbf", max_iter=-1, probability=False, random_state=1,
shrinking=True, tol=0.001, verbose=False)
training_data = pd.read_csv("training_data.csv")
X = training_data.drop(["Groups", "Targets"], axis=1).values
scaler = preprocessing.StandardScaler().fit(X)
X = scaler.transform(X)
y = training_data["Targets"].values
groups = training_data["Groups"].values
Fscorer = make_scorer(f1_score, average = "micro")
logo = LeaveOneGroupOut()
parm_range0 = np.logspace(-2, 6, 9)
train_scores0, test_scores0 = validation_curve(SVC_classifier_LOWO_VC0, X,
y, "C", parm_range0, cv =logo.split(X, y, groups=groups), scoring = Fscorer)

Jetzt, von:

train_scores_mean0 = np.mean(train_scores0, axis=1)
train_scores_std0 = np.std(train_scores0, axis=1)
test_scores_mean0 = np.mean(test_scores0, axis=1)
test_scores_std0 = np.std(test_scores0, axis=1)
print test_scores_mean0
print np.amax(test_scores_mean0)
print  np.logspace(-2, 6, 9)[test_scores_mean0.argmax(axis=0)]

Ich bekomme:

[0.20257407 0.35551122 0.40791047 0.49887676 0.5021742
0,50030438 0.49426622 0.48066419 0.4868987]

0.502174200206

100.0

Wenn ich einen neuen Klassifizierer mit denselben Parametern erzeuge und renne alles genau wie vorher, außer für die Wertung, z.B .:

parm_range1 = np.logspace(-2, 6, 9)
train_scores1, test_scores1 = validation_curve(SVC_classifier_LOWO_VC1, X,
y, "C", parm_range1, cv =logo.split(X, y, groups=groups), scoring =
"accuracy")
train_scores_mean1 = np.mean(train_scores1, axis=1)
train_scores_std1= np.std(train_scores1, axis=1)
test_scores_mean1 = np.mean(test_scores1, axis=1)
test_scores_std1 = np.std(test_scores1, axis=1)
print test_scores_mean1
print np.amax(test_scores_mean1)
print  np.logspace(-2, 6, 9)[test_scores_mean1.argmax(axis=0)]

Ich bekomme genau die gleiche Antwort:

[0.20257407 0.35551122 0.40791047 0.49887676 0.5021742
0,50030438 0.49426622 0.48066419 0.4868987]

0.502174200206

100.0

Wie ist das möglich, mache ich etwas falsch oder verpasse ich etwas?

Vielen Dank

Antworten:

1 für die Antwort № 1

F1 = accuracy dann und nur dann, wenn TP = TNDas heißt, die Anzahl der wahren positiven Werte ist gleichdie Anzahl der echten Negative, die auftreten können, wenn Ihre Klassen perfekt ausbalanciert sind. Entweder das, oder du hast einen Fehler in deinem Code. Wo initialisierst du deinen Scorer wie folgt: scorer = make_scorer(accuracy_score, average = "micro") ?


Verwandte Fragen