【问题标题】:Returning a probability vector for predications返回预测的概率向量
【发布时间】:2014-05-02 12:01:09
【问题描述】:

我正在使用 scikit-learn 进行分类。有没有办法得到一个概率 vector 来说明分类器对其预测的信心程度?我想要整个测试集的向量,而不仅仅是单个元素。基本上我需要它来计算 ROC 曲线和 AUC。

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    在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
    

    【讨论】:

    • 实际上只有SVCprobability标志。大多数其他分类器要么有predict_proba,要么没有; SGDClassifier在其loss参数上有条件。 span>
    【解决方案2】:

    如果您的唯一目标是获得 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 值。

    【讨论】:

      【解决方案3】:

      许多分类器具有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])
      

      【讨论】:

      • 如果我想返回总体概率,我应该尝试找到这些值之间的平均值吗?
      • @user3378649 我不认为“总体概率”是条件模型中定义明确的概念。这取决于你想要做什么。 span>
      猜你喜欢
      • 2020-09-10
      • 2016-05-23
      • 2019-03-04
      • 2019-09-16
      • 2016-09-02
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多