使用 scikit-learn SVM 将预测标记为概率分数预测/AUC

Posted

技术标签:

【中文标题】使用 scikit-learn SVM 将预测标记为概率分数预测/AUC【英文标题】:Label prediction to probability score prediction/AUC using scikit-learn SVM 【发布时间】:2017-12-07 20:02:50 【问题描述】:

在 DS 比赛中,我使用 SVM 进行二进制分类。这里 tdata,vdata 都有 256 个特征。 tlabels,vlabels 的维度都是 n_samples x 1,它们的唯一值是 0/1。

现在,根据比赛规则,我们需要提交概率分数(介于 0 到 1 之间)来代替标签,然后使用 AUC 来决定排名。

我对 SVM 和 Sklearn 还是很陌生。任何关于如何转换此代码以生成概率分数和 AUC 的指针都会有很大帮助。

代码:

classifier=svm.SVC(gamma=g,C=c,kernel='rbf',class_weight='balanced') 
classifier.fit(tdata, tlabels)
expected = vlabels
predicted = classifier.predict(vdata)

print("Classification report for classifier %s:\n%s\n"
      % (classifier, metrics.classification_report(expected, predicted)))
cm = metrics.confusion_matrix(expected, predicted)
accuracy = (cm[0,0]+cm[1,1])*100.0/sum(sum(cm))
print("accuracy = "+str(accuracy))

输出:

Classification report for classifier SVC(C=1.0, cache_size=200, class_weight='balanced', coef0=0.0,
  decision_function_shape=None, degree=3, gamma=0.00020000000000000001,
  kernel='rbf', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False):
             precision    recall  f1-score   support

        0.0       0.93      0.88      0.90      1881
        1.0       0.92      0.95      0.94      2686

avg / total       0.92      0.92      0.92      4567


accuracy = 92.3144296037

【问题讨论】:

你看过sklearn.metrics.auc 是的,但是如何修改分类器以输出 0 到 1 之间的概率分数? 对于我发布答案的概率,对于 AUC sklearn.metrics.auc 应该可以正常工作 【参考方案1】:

使用SVCpredict_proba 函数而不是类来获取概率。 要在SVC 上使用predict_proba 函数,参数probability=True 应该在初始化时给出。

classifier=svm.SVC(gamma=g,C=c,kernel='rbf',class_weight='balanced', probability=True) # parameter probability=True should be given
classifier.fit(tdata, tlabels)
expected = vlabels
predicted = classifier.predict(vdata)
pred_proba = classifier.predict_proba(vdata) # predict_proba function call

fpr, tpr, thresholds = metrics.roc_curve(labels, proba_one)
metrics.auc(fpr, tpr)

参考:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.htmlhttp://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

【讨论】:

有谁知道如何将预测概率转换为类别标签?我的分类不是二进制的。我已经取了两个模型的平均值,我需要将它们转换回标签。 predict_proba 给出每个记录的每个类标签的概率。假设您有 4 个类别标签,这意味着对于每条记录,您将有 4 个概率(加起来为 1.0)。您选择概率最高的类标签。 predict_proba 返回一个一维数组,每条记录一个概率值。请参阅此question 以获得更好的理解。【参考方案2】:

第 1 步

定义:probability=True in SVC(此参数可用于 SVC)参见link。

classifier=svm.SVC(gamma=g,C=c,kernel='rbf',class_weight='balanced', probability=True)

第 2 步

那么你需要使用predict_proba方法。

例子:

classifier.fit(X,y)
classifier.predict_proba(X)

结果是您希望在 [0,1] 范围内的概率。

希望这会有所帮助。

SVC link

predict_proba

【讨论】:

以上是关于使用 scikit-learn SVM 将预测标记为概率分数预测/AUC的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 训练数据时,SVM 多类分类停止

如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python

用于文本分类的一类 SVM 模型(scikit-learn)

无法运行适合 svm 的方法(通过 scikit-learn)

将经过训练的 SVM 从 scikit-learn 导入到 OpenCV

predict() 在 scikit learn 中返回与 SVM 的图像相似度