scikit中的样本权重 - 学习在交叉验证中被破坏

Roe*_*erg 9 python machine-learning scikit-learn

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

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

grid_search = GridSearchCV(RandomForestClassifier(), params, n_jobs=-1, 
                           fit_params={"sample_weight"=weights})
Run Code Online (Sandbox Code Playgroud)

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

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

mil*_*rod 7

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

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


xen*_*yon 5

编辑:我从下面看到的分数似乎不太正确.这可能是因为,如上所述,即使在装配时使用重量,它们也可能不会被用于评分.

现在似乎已经解决了这个问题.我正在运行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)
Run Code Online (Sandbox Code Playgroud)

希望有所帮助(你和其他人看到这篇文章).


lej*_*lot 2

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