2016-12-04 39 views
0

我想繪製訓練SVM分類器,使用不同的 分數,並使用Leave One Group Out作爲交叉驗證的方法學習曲線。 I 認爲我已經想通了,但兩個不同的記分員 - 'f1_micro'和 '準確性' - 會產生相同的值。我很困惑,難道那是假設 ?Scikit學習學習曲線與不同的記分員,並留下一組出的cv產生相同的值

這裏是我的代碼(可惜我不能共享數據,因爲它是不開放):

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) 

現在,從:

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

我得到:

[0.20257407 0.35551122 0.40791047 0.49887676 0.5021742
0.50030438 0.49426622 0.48 066419 0.4868987]

0.502174200206

100.0

如果我創建一個新的分類,但具有相同的參數,和以前一樣,正好運行 一切除了得分,例如:

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

我得到完全一樣的答案:

[0.20257407 0.35551122 0.40791047 0.49887676 0.5021742
0.50030438 0.49426622 0.48066419 0.4868987]

0.502174200206

100.0

怎麼可能,我是不是做錯了什麼,或者失去了一些東西?

感謝

+1

你可以用示例數據展示一個獨立的示例來演示問題嗎?我的猜測是,你的一個運行是意外地重新使用早期運行的已定義變量,儘管我沒有看到你發佈的代碼中的哪個部分。 – BrenBarn

+0

我會嘗試,但是我需要一些時間來弄清楚如何構建一個有意義的自包含示例,因爲這些功能是電纜記錄井,目標是地質相。 – MyCarta

+0

@BrenBarn與此同時,考慮到你的建議,我會再次將我的完整代碼梳理爲重用變量。 – MyCarta

回答

1

F1 = accuracy當且僅當TP = TN,就是真陽性的數量等於真陰性,如果你的類是完美的平衡,可發生的數量。所以不是這樣,或者你的代碼有錯誤。你在哪裏初始化你的得分手,如下:scorer = make_scorer(accuracy_score, average = 'micro')

+0

我的準確性得分被初始化爲:Ascorer = make_scorer(accuracy_score),但是我得到了同樣的問題,我只是通過'準確性'而沒有初始化它。我將不得不檢查代碼錯誤。課程並不完美平衡。謝謝 – MyCarta