LeaveOneOut的输出结果可疑

时间:2019-02-12 00:23:48

标签: machine-learning scikit-learn cross-validation

我的数据集有93个观测值和24个特征。我正在使用SVM模型将其分类为0类或1类。

我对我使用的留一法交叉验证方法有一些疑问,特别是关于准确性,准确性,召回率和AUC的问题

我已经在下面的代码中测试了这些方法,但是肯定有错误,您可以从0.91的精度标准偏差中看出。

我想念什么?

让我知道是否需要更多信息。谢谢!

#creates feature set and class#

x = np.array(df.drop(['target'], 1))
y = np.array(df['target'])
xs = scale(x)



#Here is the LOOCV code to achieve accuracy#

svm_model = SVC(C=0.1,kernel ='linear', probability = True)   
loo = LeaveOneOut(93)

acc = cross_val_score(estimator=svm_model,
                                      X=xs,
                                      y=y,
                                      cv=loo)
print(acc)
print("Accuracy: %0.2f (+/- %0.2f)" % (acc.mean(), acc.std() * 2))
#prints 0.71 +- 0.91 
    [0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
    1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0]



#Here is what I tried to get precision and recall#

predicted = cross_val_predict(svm_model, xs, y, cv = loo)
print (recall_score(y, predicted))
#prints 23%

print (precision_score(y, predicted))
#prints 46%


print (roc_auc_score(y, predicted))
#prints 56%

1 个答案:

答案 0 :(得分:1)

根据LeaveOneOut的SkLearn文档,看来split()方法实际上负责为所有CV分割生成训练/测试索引:

loo = LeaveOneOut()
loo.split(xs, y)

我相信以上两行应替换您编写的行loo = LeaveOneOut(93)。如果查看LeaveOneOut使用的__init__()方法的source code,您会发现对传递给它的任何参数都无能为力。我相信,这就是为什么在将loo对象传递给整数93时没有看到错误消息的原因。

实际上,如果滚动到__init__()方法的源代码正下方,则会看到split方法实际上接受参数(训练数据和标签),然后产生每个CV折的火车/测试索引(在您的情况下为93折)。