【发布时间】:2014-05-02 12:01:09
【问题描述】:
我正在使用 scikit-learn 进行分类。有没有办法得到一个概率 vector 来说明分类器对其预测的信心程度?我想要整个测试集的向量,而不仅仅是单个元素。基本上我需要它来计算 ROC 曲线和 AUC。
【问题讨论】:
标签: python scikit-learn
我正在使用 scikit-learn 进行分类。有没有办法得到一个概率 vector 来说明分类器对其预测的信心程度?我想要整个测试集的向量,而不仅仅是单个元素。基本上我需要它来计算 ROC 曲线和 AUC。
【问题讨论】:
标签: python scikit-learn
在scikit-seature中,对于任何分类方法,您可以在probability选项上打开并使用predict_proba方法来获取每个类元素的概率。例如,使用著名的鸢尾花数据集,
from sklearn import svm
from sklearn import datasets
# train set
iris = datasets.load_iris()
X = iris.data[0::2, :2]
Y = iris.target[0::2]
clf = svm.SVC(probability=True)
clf.fit(X, Y)
# test set
Z = iris.data[1::2, :2]
Y_predict = clf.predict(Z)
Y_actual = iris.target[1::2]
Y_probas = clf.predict_proba(Z) # probabilities of each classification
【讨论】:
SVC有probability标志。大多数其他分类器要么有predict_proba,要么没有; SGDClassifier在其loss参数上有条件。 span>
如果您的唯一目标是获得 ROC 曲线和 AUC,请查看 sklearn.metrics.roc_auc_score here。
来自文档:
>>> import numpy as np
>>> from sklearn.metrics import roc_auc_score
>>> y_true = np.array([0, 0, 1, 1])
>>> y_scores = np.array([0.1, 0.4, 0.35, 0.8])
>>> roc_auc_score(y_true, y_scores)
0.75
请注意,roc_auc_score 仅适用于二元分类任务——如果您正在处理多类分类,您可能必须为每个类计算单独的 roc_auc_score 值。
【讨论】:
许多分类器具有decision_function 方法或predict_proba 方法(或两者),可用于获得软分数而不是硬决策。示例:
>>> import numpy as np
>>> X = np.random.randn(10, 4)
>>> y = np.random.randint(0, 2, 10)
>>> from sklearn.svm import LinearSVC
>>> svm = LinearSVC().fit(X, y)
>>> svm.decision_function(X)
array([-0.92744332, 0.78697484, -0.71569751, -0.19938963, -0.15521737,
0.45962204, 0.1326111 , 0.44614422, 0.95731802, 0.8980536 ])
在这种情况下,值是线性SVM的超平面的符号距离。 predict_proba 稍有不同,它返回一个概率矩阵,但可以通过索引得到一个正概率向量:
>>> from sklearn.linear_model import LogisticRegression
>>> lr = LogisticRegression().fit(X, y)
>>> lr.predict_proba(X)
array([[ 0.73987796, 0.26012204],
[ 0.26009545, 0.73990455],
[ 0.63918314, 0.36081686],
[ 0.62055698, 0.37944302],
[ 0.54361598, 0.45638402],
[ 0.38383357, 0.61616643],
[ 0.50740302, 0.49259698],
[ 0.39236783, 0.60763217],
[ 0.32553896, 0.67446104],
[ 0.20791651, 0.79208349]])
>>> lr.predict_proba(X)[:, 1]
array([ 0.26012204, 0.73990455, 0.36081686, 0.37944302, 0.45638402,
0.61616643, 0.49259698, 0.60763217, 0.67446104, 0.79208349])
【讨论】: