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

如何在XGBClassifier中分配特征权重?代码报错求助

问题分析与修正方案

你的代码存在核心参数使用错误及兼容性问题,以下是具体说明和解决方法:

核心错误点

  1. 不存在的feature_weights参数:XGBClassifier(scikit-learn封装接口)的构造函数和GridSearchCV的fit方法均不支持feature_weights参数,这是触发报错的直接原因——该参数仅在XGBoost原生xgboost.train API中可用。
  2. 已弃用参数:silent参数已被XGBoost弃用,需替换为verbosity(取值0-3,0为静默模式)。

修正方案

方案1:使用原生XGBoost API实现特征加权

若要直接使用官方的特征加权功能,需切换到原生API并手动实现网格搜索逻辑:

import xgboost as xgb
import numpy as np
from sklearn.model_selection import ParameterGrid
from sklearn.metrics import roc_auc_score

# 转换为原生API要求的DMatrix格式
dtrain = xgb.DMatrix(train_X, label=train_y)

# 定义参数网格
param_grid = {
    'learning_rate': [0.1, 0.3],  # 建议将1调整为0.3,避免过拟合
    'n_estimators': [100],
    'max_depth': [3,4,5],
    'subsample': 0.8,
    'colsample_bytree': 0.4,
    'gamma': 10,
    'objective': 'binary:logistic',
    'eval_metric': 'auc',
    'verbosity': 0
}

# 构建特征权重数组
other_col_wt = [1]*1164
high_net_worth_wt = [5]
feature_weights = np.array(other_col_wt + high_net_worth_wt)

# 遍历参数网格执行交叉验证
best_score = 0
best_params = None

for params in ParameterGrid(param_grid):
    model = xgb.train(params, dtrain, num_boost_round=params['n_estimators'], feature_weights=feature_weights)
    preds = model.predict(dtrain)
    auc_score = roc_auc_score(train_y, preds)
    if auc_score > best_score:
        best_score = auc_score
        best_params = params

print(f"最佳参数: {best_params}")
print(f"最佳AUC: {best_score}")

方案2:在scikit-learn接口中间接实现特征加权

若想继续使用XGBClassifier和GridSearchCV,可通过缩放特征值的方式间接提升目标特征的权重:

import numpy as np
from xgboost import XGBClassifier
from sklearn.model_selection import GridSearchCV

# 复制训练数据,避免修改原数据集
train_X_weighted = train_X.copy()
# 缩放High Net Worth特征的数值(索引为1164)
train_X_weighted.iloc[:, 1164] *= 5

# 初始化模型,移除无效参数并替换弃用参数
xgboost = XGBClassifier(subsample=0.8,
                        verbosity=0,
                        colsample_bytree=0.4,
                        gamma=10,
                        objective='binary:logistic',
                        eval_metric=["auc"]
                      )

# 定义网格搜索参数
param_grid = {
    'learning_rate': [0.1, 0.3],
    'n_estimators': [100],
    'max_depth': [3,4,5]
}

# 执行网格搜索
clf = GridSearchCV(xgboost, param_grid, cv=5, return_train_score=False)
clf.fit(train_X_weighted, train_y)

# 输出结果
print(clf.best_params_)
print(clf.cv_results_)

额外提示

  • 学习率设置为1过大,XGBoost的学习率通常建议在0.01-0.3区间,过高会大幅提升过拟合风险。

内容的提问来源于stack exchange,提问作者Piyush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:05:31