You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:27:35