【问题标题】:grid search cross-validation on SVC probability output in sci-kit learnsci-kit learn中SVC概率输出的网格搜索交叉验证
【发布时间】:2013-05-21 11:31:20
【问题描述】:

我想对SVC 分类器的概率输出运行网格搜索交叉验证。特别是我想最小化负对数可能性。从文档来看,GridSearchCV 似乎调用了它所传递的估计器的predict() 方法,而SVCpredict() 方法返回类预测而不是概率(predict_proba() 返回类概率)。

1) 我是否需要继承 SVC 并给它一个 predict() 方法来返回概率而不是类来完成我的对数似然交叉验证?我想我需要自己写score_funcloss_func

2) 对这种负对数似然性进行交叉验证是愚蠢的吗?我正在这样做 b/c 数据集是:a)不平衡 5:1 和 b)根本不可分离,即即使是“最差”的观察结果也有 > 50% 的机会进入“好”类。 (可能还会在统计问答中发布第二个问题)

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:
    1. 是的,你会,在这两个帐户上。

      class ProbSVC(SVC):
          def predict(self, X):
              return super(ProbSVC, self).predict_proba(X)
      
    2. 我不确定这是否可行,因为多数类别可能仍会主导对数似然分数,并且最终估计器可能仍会为少数类别的样本产生 >.5 的阳性结果。不过我不确定,所以请将其发布到统计信息中。

    【讨论】:

    • 1) 谢谢,2) 如果最终估计器仍然为少数类的样本产生 > 0.5,那很好。事实上,我很确定它会,我只是希望这些概率尽可能“好”。
    • 似乎需要super(ProbSVC, self)(即相反顺序的参数),但我对Python很陌生,所以如果有人确认这一点,我会更喜欢
    • 覆盖SVC构造函数的正确方法是什么,设置probability=True并将所有其他参数传递给SVC构造函数。会不会是这样的:def __init__(self, **kwargs): super(ProbSVC, self).__init__(probability=True, **kwargs)
    【解决方案2】:

    使用 sklearn 开发版中的新记分器接口,您不需要子类化。您只需要定义一个评分对象,如in the docs 所述 基本上你需要做 log_loss_score = Scorer(neg_log_loss, needs_threshold=True) 不过,这可能会退回到“decision_function”。

    您还可以定义一个新的记分器类,在估算器上调用 predict_proba 以确保它获得标准化概率。

    此外,欢迎提交日志丢失请求:)

    【讨论】:

    猜你喜欢
    • 2017-12-29
    • 2013-01-29
    • 2014-07-16
    • 2020-03-08
    • 2021-12-11
    • 2015-09-18
    • 1970-01-01
    • 2021-08-29
    • 2014-08-27
    相关资源
    最近更新 更多