我目前正在使用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()
之类的内容。
答案 0 :(得分:8)
稍微查看predict
的源代码,可以看出decision_function
实际上是实际类概率的logit变换,即decision funciton
是f
,那么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)