在加权数据集上运行Boruta遇sample_weight参数错误的解决办法
BorutaPy添加sample_weight报错的解决方法及BorutaShap替代方案
一、解决BorutaPy的sample_weight参数问题
BorutaPy的fit方法本身不支持直接传入sample_weight参数,报错是因为该参数未被定义在方法签名中。要实现样本权重的传递,需给基础分类器做一层包装,让它在训练时自动应用权重:
- 自定义带样本权重的随机森林分类器:
from sklearn.ensemble import RandomForestClassifier class WeightedRandomForestClassifier(RandomForestClassifier): def __init__(self, sample_weight=None, **kwargs): super().__init__(**kwargs) self.sample_weight = sample_weight def fit(self, X, y, **kwargs): # 调用父类fit时自动传入保存的样本权重 return super().fit(X, y, sample_weight=self.sample_weight)
- 使用包装后的分类器初始化BorutaPy并拟合:
# 初始化带权重的分类器,传入样本权重 forest = WeightedRandomForestClassifier( sample_weight=X['my_weighting'], n_jobs=-1, class_weight='balanced', max_depth=5 ) feat_selector = BorutaPy(forest, n_estimators='auto', verbose=0, random_state=1) # 此时fit无需再传sample_weight feat_selector.fit(np.array(X), np.array(y)) # 查看特征选择结果 feat_selector.support_ feat_selector.rankings_
二、BorutaShap的可行性
完全可行。BorutaShap作为Boruta算法的扩展实现,其fit方法原生支持sample_weight参数,无需额外修改分类器,直接传入即可:
from BorutaShap import BorutaShap from sklearn.ensemble import RandomForestClassifier # 初始化原随机森林分类器 forest = RandomForestClassifier(n_jobs=-1, class_weight='balanced', max_depth=5) # 初始化BorutaShap特征选择器 feat_selector = BorutaShap(model=forest, verbose=0, random_state=1) # 直接传入sample_weight拟合 feat_selector.fit(X=X, y=y, sample_weight=X['my_weighting']) # 查看结果 feat_selector.support_ feat_selector.rankings_
内容的提问来源于stack exchange,提问作者MC Jong
相关产品推荐
相关产品推荐

