如何在Python中迭代创建逐步减特征的XGBClassifier模型并评估
解决方案
以下是满足需求的完整实现代码,附带关键步骤说明:
1. 导入必要库
import pandas as pd import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.metrics import roc_auc_score
2. 数据准备(假设你的DataFrame名为df)
# 分离特征与目标变量 X = df[['X1', 'X2', 'X3', 'X4', 'X5']] y = df['Y'] # 拆分训练集与测试集(设置random_state保证结果可复现) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
3. 模型迭代训练与结果收集
# 初始化存储模型的列表和结果数据的列表 list_of_models = [] results = [] # 获取所有特征名称 all_features = X.columns.tolist() # 循环迭代:从全量特征到仅保留最后1个特征 for i in range(len(all_features)): # 当前使用的特征子集:每次移除前i个特征(可根据需求调整移除逻辑) current_features = all_features[i:] feature_count = len(current_features) # 提取当前特征的训练/测试数据 X_train_sub = X_train[current_features] X_test_sub = X_test[current_features] # 初始化并训练XGBoost分类器 model = xgb.XGBClassifier(objective='binary:logistic', random_state=42) model.fit(X_train_sub, y_train) # 预测概率(ROC AUC需要概率值,而非类别标签) y_train_pred_proba = model.predict_proba(X_train_sub)[:, 1] y_test_pred_proba = model.predict_proba(X_test_sub)[:, 1] # 计算AUC分数 train_auc = roc_auc_score(y_train, y_train_pred_proba) test_auc = roc_auc_score(y_test, y_test_pred_proba) # 存储模型与结果 list_of_models.append(model) results.append({ '模型序号': i+1, '特征数': feature_count, '训练集AUC': round(train_auc, 4), '测试集AUC': round(test_auc, 4) }) # 将结果转换为DataFrame results_df = pd.DataFrame(results)
4. 关键说明
- 特征移除逻辑:示例中每次移除前
i个特征,若需要随机移除或按重要性移除,可修改current_features的生成逻辑(比如按XGBoost的特征重要性排序后移除)。 - 概率预测:ROC AUC评估依赖预测的正类概率,因此必须使用
predict_proba而非predict。 - 可复现性:设置
random_state确保每次运行的拆分结果和模型训练结果一致。 - 结果格式:
results_df会按模型迭代顺序展示性能,list_of_models按顺序存储每个训练好的模型。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

