使用 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】:使用SVC
的predict_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)