【问题标题】:sample weights in scikit-learn broken in cross validationscikit-learn 中的样本权重在交叉验证中被破坏
【发布时间】:2014-03-20 06:18:24
【问题描述】:

在训练随机森林分类器时,我一直在尝试在 scikit-learn 中使用加权样本。当我将样本权重直接传递给分类器时效果很好,例如RandomForestClassifier().fit(X,y,sample_weight=weights),但是当我尝试通过网格搜索为分类器找到更好的超参数时,我碰壁了:

使用grid参数时要传递权重,用法是:

grid_search = GridSearchCV(RandomForestClassifier(), params, n_jobs=-1, 
                           fit_params={"sample_weight"=weights})

问题在于交叉验证器不知道样本权重,因此不会将它们与实际数据一起重新采样,因此调用 grid_search.fit(X,y) 失败:交叉验证器创建 X 和 y 的子集, sub_X 和 sub_y 并最终使用 classifier.fit(sub_X, sub_y, sample_weight=weights) 调用分类器,但现在尚未对权重进行重新采样,因此会引发异常。

目前,我已通过在训练分类器之前对高权重样本进行过度采样来解决此问题,但这是一种临时解决方法。有关如何进行的任何建议?

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    我建议编写自己的交叉验证参数选择,因为它在 python 中只有 10-15 行代码(尤其是使用 scikit-learn 中的 kfold 对象),而过采样可能是一个很大的瓶颈。

    【讨论】:

    • 问题在于 GridSearchCV 在其代码中嵌入了交叉验证。我修改它没有问题,但这样做似乎很脏。作为一个元问题,这两种方法(重采样和加权)实际上是否等效?嗯,看了一点,似乎它们不是,但两者都运作良好:statistics.berkeley.edu/sites/default/files/tech-reports/…
    • 我开始修改超参数搜索(grid_search.py​​ 中的fit_grid_point)以考虑类权重,然后我意识到 scikit-learn 中还有一个明显的遗漏:交叉验证中的得分不会' t 考虑类权重(我更关心在评估错误时对少数类进行错误分类)。这一切都促使我重新采样,并且只有在遇到性能问题时才能正确修复。
    【解决方案2】:

    编辑:我从下面看到的分数似乎不太正确。这可能是因为,如上所述,即使权重用于拟合,它们也可能不会用于评分。

    现在看来这个问题已经解决了。我正在运行 sklearn 0.15.2 版。我的代码如下所示:

    model = SGDRegressor()
    parameters = {'alpha':[0.01, 0.001, 0.0001]}
    cv = GridSearchCV(model, parameters, fit_params={'sample_weight': weights})
    cv.fit(X, y)
    

    希望对您有所帮助(您和看到此帖子的其他人)。

    【讨论】:

      【解决方案3】:

      我的名声太小,所以我无法对@xenocyon 发表评论。我正在使用 sklearn 0.18.1,并且我也在代码中使用管道。对我有用的解决方案是:

      fit_params={'classifier__sample_weight': w} 其中w 是权重向量,classifier 是管道中的步骤名称。

      【讨论】:

      • 这是为我做的!多么棒的收获。
      猜你喜欢
      • 2016-04-25
      • 2017-09-02
      • 2016-05-09
      • 2012-01-07
      • 2015-06-22
      • 1970-01-01
      • 2021-10-25
      • 2015-12-11
      • 2018-04-02
      相关资源
      最近更新 更多