如何在XGBClassifier中分配特征权重?代码报错求助
问题分析与修正方案
你的代码存在核心参数使用错误及兼容性问题,以下是具体说明和解决方法:
核心错误点
- 不存在的
feature_weights参数:XGBClassifier(scikit-learn封装接口)的构造函数和GridSearchCV的fit方法均不支持feature_weights参数,这是触发报错的直接原因——该参数仅在XGBoost原生xgboost.trainAPI中可用。 - 已弃用参数:
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
相关产品推荐
相关产品推荐

