检查交叉验证 svm 的敏感性和特异性时出错

Posted

技术标签:

【中文标题】检查交叉验证 svm 的敏感性和特异性时出错【英文标题】:Error when checking sensitivty and specificity of a cross validated svm 【发布时间】:2016-07-18 08:40:25 【问题描述】:

我一直在对一些数据 (RBF SVM) 执行 KFold 交叉验证。我有这个代码是为了检查真阳性率和假阳性率。有时此代码会引发错误。我注意到每当交叉验证中的随机改组创建一组所有一个类时都会出现错误,因为那是它停止运行的地方。例如:

sensitivity = 1.0
specificity = 0.0
[0 0 0 0 0 0 0 0] predicted
[0 0 0 0 0 0 0 0] actual

起初我认为这个错误是由于它会被零除,所以我尝试用 if 语句修复它。但它仍然给我这个错误:

IndexError                                Traceback (most recent call last)
<ipython-input-56-0339ebc92e19> in <module>()
     10 
     11     tn = float(cm[0][0])/np.sum(cm[0])
---> 12     if np.sum(cm[1]) == 0:
     13         tp = 0
     14     else:

IndexError: index 1 is out of bounds for axis 0 with size 1

我完全不知道问题是什么或如何解决它。有问题的代码如下:

for i, (train, test) in enumerate(kf_total):
    y_pred = clf.fit(val[train], y[train]).predict(val[test])
    print y_pred,"predicted"
    print y[test], "actual"
    cm = confusion_matrix(y[test], y_pred)

    tn = float(cm[0][0])/np.sum(cm[0])
    if np.sum(cm[1]) == 0:
        tp = 0
    else:
        tp = float(cm[1][1])/np.sum(cm[1])

    print "sensitivity =", tp
    print "specificity =", tn

【问题讨论】:

【参考方案1】:

在您的情况下,预测 * 实际的维度将是 1x1,因为只有一个类可用 - 零。寻址这样的矩阵元素 1 会产生越界错误。

【讨论】:

我该如何解决这个问题?当它预测全零并且实际包含一时,它不会给出错误 实现了解决问题的方法!我已经开始使用分层 kfold,这样我就没有折叠,只有一个类 if np.sum(y[test]) == 0: 例如。 Good explanation on confusion matrix in sklearn

以上是关于检查交叉验证 svm 的敏感性和特异性时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用交叉验证和 F1 分数选择 SVM 参数

加快 SVM 评分中的交叉验证

SVM 回归的交叉验证

在调整参数时识别交叉验证的 SVM 中的过拟合

如何进行交叉验证 SVM 分类器

字符串python列表上的Kfold交叉验证和SVM