我想对SVC
分类器的概率输出运行网格搜索交叉验证。特别是我想最小化负对数可能性。从文档中可以看出,GridSearchCV
调用了估算器的predict()
方法,并且predict()
SVC
方法返回类预测而不是概率(predict_proba()
返回类概率)。
1)我是否需要子类化SVC
并为其提供一个predict()
方法,该方法返回概率而不是类来完成我的对数似然交叉验证?我想我需要编写自己的score_func
或loss_func
?
2)对这个负对数的交叉验证可能性是否愚蠢?我正在做b / c数据集是:a)不平衡5:1和b)根本不可分离,即使“最差”观察具有>有50%的几率进入“好”级别。 (可能还会在统计数据q& a上发布第二个问题)
答案 0 :(得分:2)
是的,你会在两个帐户上。
class ProbSVC(SVC):
def predict(self, X):
return super(ProbSVC, self).predict_proba(X)
我不确定这是否有效,因为大多数类仍可能主导对数似然得分,最终估计可能仍然会为少数类的样本产生≥5。不过,我不确定,所以请将其发布到统计数据。
答案 1 :(得分:2)
使用sklearn开发版中的新记分器界面,您不需要子类化。您只需按照in the docs所述定义评分对象
基本上你需要这样做
log_loss_score = Scorer(neg_log_loss, needs_threshold=True)
不过,这可能会回归到“decision_function”。
您还可以定义一个新的记分器类,在估算器上调用predict_proba
以确保它获得规范化的概率。
此外,欢迎提取对数丢失请求:)