2016-12-04 67 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