我一直试图在scikit-learn中使用加权样本,同时训练随机森林分类器。当我直接将样本权重传递给分类器时,效果很好。 RandomForestClassifier().fit(X,y,sample_weight=weights)
,但是当我尝试了网格搜索,以找到更好的超参数进行分类,我碰了壁:scikit-learn中的样本权重在交叉验证中破裂
要使用电网参数时传递的权重,用法:
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)
调用,但现在重量未被重新采样,因此引发异常。
现在我已经在训练分类器之前通过对高重量样本进行过采样来解决这个问题,但这只是一个临时解决方法。有关如何进行的任何建议?
问题是GridSearchCV在其代码中嵌入了交叉验证。我没有修改的问题,但这样做似乎很脏。作为一个元问题,两种方法(重采样和加权)实际上是否等价?嗯,看起来有点看起来,它似乎不是,但也都工作:http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf –
我开始修改超参数搜索(grid_search.py中的'fit_grid_point')将类权重考虑在内,然后我意识到scikit-learn中还存在另一个明显的缺失:交叉验证中的得分不会考虑类权重(我更关心评估错误时将少数群体分类错误)。这一切都促使我重新取样,只有在我遇到性能问题时才正确解决这个问题。 –