我的数据集有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%
答案 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折)。