scikit学习不同得分者的学习曲线,并将一组排除在外,得到相同的cv值

2024-09-30 14:31:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在训练好的SVM分类器上绘制学习曲线,使用不同的方法 得分,并使用离开一组作为交叉验证的方法。我 我想我已经弄明白了,但是两个不同的得分手-“f1\微”和 “准确性”-将产生相同的值。我很困惑,是这样吗 是这样吗?你知道吗

这是我的代码(不幸的是,我无法共享数据,因为它没有打开):

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.48066419 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

怎么可能,我做错了什么,还是遗漏了什么?你知道吗

谢谢


Tags: testdatanptrainingtraingroupsprintaxis
1条回答
网友
1楼 · 发布于 2024-09-30 14:31:17

F1 = accuracy当且仅当TP = TN,也就是说,真正的数量等于真负的数量,如果类是完全平衡的,就会发生这种情况。所以不是这样,就是你的代码有错误。在哪里初始化记分器,如下:scorer = make_scorer(accuracy_score, average = 'micro')?你知道吗

相关问题 更多 >