了解 Python 的roc_curve,svm 示例



我试图从概念上理解Python代码是如何工作的,所以我可以写一篇关于它的论文。我对随机森林算法有一个类似的问题;但也许如果我明白了这一点,我也会明白的。以下是我认为与我的问题相关的部分:

from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import roc_curve, auc
from numpy import interp
statifiedFolds = StratifiedKFold(n_splits=5, shuffle=True)
tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)
i = 1
for train,test in statifiedFolds.split(x,y):
svc = SVC(kernel = 'rbf', C = 10000, gamma = 0.1)
x_train, x_test = x[train], x[test]
y_train, y_test = y[train], y[test]
svc.fit(x_train, y_train)
y_pred = svc.decision_function(x_test)
fpr, tpr, thresholds = roc_curve(y_test,y_pred)
tprs.append(interp(mean_fpr, fpr, tpr))
tprs[-1][0] = 0.0
roc_auc = auc(fpr, tpr)
aucs.append(roc_auc)
i += 1
mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)

据我所知,ROC曲线描绘了假阳性率与真阳性率的关系。但每次在测试集上运行SVM时,您都会得到每个测试点的单个二进制预测。然后通过统计真阳性和假阳性来计算真阳性率和假阳性率。所以tpr应该只是一个数字,fpr也应该是。因此(tpr,fpr(应该只是一个点。

这让我想到,要获得roc曲线,应该在许多不同的参数下运行分类算法。如果你幸运的话,算法会有一个参数,这样更大的值往往会以牺牲特异性为代价来提高灵敏度,或者反过来。但SVM的两个参数(C和gamma(都不能做到这一点。所以我认为你必须尝试很多C和gamma的值,直到roc曲线的左、中、右区域都得到很好的表示。

但这个代码看起来一点也不像。只有一对参数值(C=10000,gamma=0.1(被调用。支持向量机只运行一次,然后调用插值函数,在5倍交叉验证的每个倍数内。

我的问题是:如何可能只使用1个点来插值roc曲线?

这种推理的错误在于svc.decision_function(x_test)而不是返回二进制数据。

它实际上返回了一个(有符号(值,与样本X到分离超平面的距离成比例。因此,您可以通过在默认值0附近调整阈值来绘制适当的roc曲线。

注意:有关详细信息,请参阅参考文档,svc.decision_function将根据svcdecision_function_shape参数返回略有不同的格式。

最新更新