Scikit-learn Ridge分类器:提取类概率

时间:2014-03-20 15:43:10

标签: python machine-learning classification scikit-learn

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

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

如何将这些距离转换为更具体的概率(一系列总和为1的正值)?我正在寻找像sklearn中为SVC实现的clf.predict_proba()之类的内容。

3 个答案:

答案 0 :(得分:8)

稍微查看predict的源代码,可以看出decision_function实际上是实际类概率的logit变换,即decision funcitonf ,那么class 1的班级概率为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 :(得分:8)

进一步探索导致使用softmax功能。

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

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

答案 2 :(得分:0)

此处提供的解决方案对我不起作用。我认为 softmax 函数是正确的解决方案,因此我使用类似于 LogisticRegressionCV

predict_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)