解决Sklearn Pipeline中XGBoost模型sample_weight参数未生效问题
Sklearn Pipeline中XGBoost系列模型(如XGBDistribution)正确传递sample_weight的解决方案
问题重现
在使用Sklearn Pipeline封装StandardScaler和XGBDistribution时,通过model__sample_weight传递样本权重,出现XGBoost learner提示参数未被使用的警告:
示例代码:
from xgboost_distribution import XGBDistribution from scipy.stats import nbinom from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline # 假设已完成数据集划分:X_train, X_test, y_train, y_test 及 sample_wgt model = XGBDistribution( distribution="negative-binomial" ) pipe = Pipeline( [ ('scaler', StandardScaler()), ('model', model) ] ) pipe.fit(X_train, y_train, model__sample_weight=sample_wgt)
执行后警告:
WARNING: /workspace/src/learner.cc:742: Parameters: { "sample_weight" } are not used.
解决方案
问题根源在于XGBDistribution的fit方法未正确接收Pipeline传递的sample_weight参数,导致底层XGBoost learner无法获取该参数。可以通过自定义包装类,明确处理样本权重的传递:
步骤1:创建XGBDistribution包装器
from sklearn.base import BaseEstimator, RegressorMixin from xgboost_distribution import XGBDistribution class XGBDistributionWrapper(BaseEstimator, RegressorMixin): def __init__(self, **kwargs): # 传递XGBDistribution的初始化参数 self.model = XGBDistribution(**kwargs) def fit(self, X, y, sample_weight=None): # 明确接收sample_weight并传递给模型的fit方法 if sample_weight is not None: self.model.fit(X, y, sample_weight=sample_weight) else: self.model.fit(X, y) return self def predict(self, X): # 复用原模型的predict方法 return self.model.predict(X) def predict_distribution(self, X): # 复用原模型的分布预测方法 return self.model.predict_distribution(X)
步骤2:在Pipeline中使用包装器
from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline # 使用包装器替代原XGBDistribution model = XGBDistributionWrapper(distribution="negative-binomial") pipe = Pipeline( [ ('scaler', StandardScaler()), ('model', model) ] ) # 按原方式传递样本权重 pipe.fit(X_train, y_train, model__sample_weight=sample_wgt)
包装器会明确接收sample_weight参数并传递给底层的XGBDistribution模型,确保样本权重被正确使用,不会再出现参数未使用的警告。
内容的提问来源于stack exchange,提问作者a.powell
相关产品推荐
相关产品推荐

