【问题标题】:Scikit-learn Ridge classifier: extracting class probabilitiesScikit-learn Ridge 分类器:提取类概率
【发布时间】:2014-04-27 14:23:36
【问题描述】:

我目前正在使用 sklearn 的 Ridge 分类器,并希望将此分类器与 sklearn 和其他库中的分类器集成。为了做到这一点,理想的做法是提取给定输入属于类列表中每个类的概率。目前,我正在使用 model.decision_function(x) 的输出压缩类,但这会返回与超平面的距离,而不是直接的概率。 这些距离值从大约 -1 到大约 1 不等。

distances = dict(zip(clf.classes_, clf.decision_function(x)[0]))  

如何将这些距离转换为一组更具体的概率(一系列总和为 1 的正值)?我正在寻找类似 @​​987654322@ 的东西,它是为 sklearn 中的 SVC 实现的。

【问题讨论】:

  • RidgeClassifier 上没有 predict_proba,因为它不容易被解释为概率模型,AFAIK。逻辑变换或仅在 [-1, 1] 处设置阈值并将其映射到 [0, 1] 是可能的,但两者都是 hack。
  • 是的,我能做的最好的就是采用决策函数的 softmax,但至少 a) 保持相对顺序 b) 使集成更简单。

标签: python machine-learning classification scikit-learn


【解决方案1】:

稍微看一下predict的源码可知decision_function其实是实际类概率的logit-transform,即如果decision funcitonf,那么@987654325的类概率@ 是 exp(f) / (1 + exp(f))。这意味着在 sklearn 源中进行以下检查:

    scores = self.decision_function(X)
    if len(scores.shape) == 1:
        indices = (scores > 0).astype(np.int)
    else:
        indices = scores.argmax(axis=1)
    return self.classes_[indices]

如果您观察到此检查,它会告诉您如果决策函数大于零,则预测第 1 类,否则预测第 0 类 - 一种经典的 logit 方法。

因此,您必须将决策函数转换为:

d = clf.decision_function(x)[0]
probs = numpy.exp(d) / (1 + numpy.exp(d))

然后采取适当的zip等。

【讨论】:

  • 1) 看起来类似于 softmax 2) 尽管np.exp(d) / (1 + np.exp(d)) 的输出范围在 0 - 1 范围内,但它们并未标准化,并且似乎与到飞机。换句话说,采用决策函数分数的 argmax 不会返回与采用 np.exp(d) / (1 + np.exp(d)) 的 argmax 相同的结果。任何想法为什么?
  • 没关系,我想我已经回答了我自己的问题。我相信问题的正确解决方案是从字面上应用 softmax:np.exp(d) / np.sum(np.exp(d))。不过,你为我指明了正确的方向。
【解决方案2】:

进一步探索导致使用softmax函数。

d = clf.decision_function(x)[0]
probs = np.exp(d) / np.sum(np.exp(d))

这保证了总和为 1 的 0-1 有界分布。

【讨论】:

    【解决方案3】:

    此处提供的解决方案对我不起作用。我认为softmax 函数是正确的解决方案,所以我用类似于LogisticRegressionCVpredict_proba 方法扩展了 RidgeClassifierCV 类

    from sklearn.utils.extmath import softmax
    class RidgeClassifierCVwithProba(RidgeClassifierCV):
        def predict_proba(self, X):
            d = self.decision_function(X)
            d_2d = np.c_[-d, d]
            return softmax(d_2d)
    

    【讨论】:

      猜你喜欢
      • 2016-01-18
      • 2014-02-25
      • 2015-10-07
      • 2015-10-25
      • 2019-09-20
      • 2015-05-09
      • 2019-09-01
      • 2018-01-24
      • 2013-12-10
      相关资源
      最近更新 更多