项目背景:通过 XGBoost 模型进行驱动因素分析,结合 Optuna 进行超参数优化,并利用 SHAP 值解释模型决策,最终输出特征重要性及交互作用分析结果。
1. 环境准备与库导入
首先导入所需的 Python 库,涵盖数据处理、模型训练、可视化和优化工具:
import pandas as pd
import shap
import xgboost as xgb
from sklearn.model_selection import train_test_split, cross_val_score
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import mean_squared_error
import optuna
2. 数据预处理
2.1 数据读取与清洗
- 读取 Excel 数据:指定文件路径并加载数据。
- 处理缺失值:删除包含
NaN
或无穷大值的行,确保数据完整性。data = pd.read_excel(r"输入你的代码") data = data.dropna() # 删除含缺失值的行
2.2 特征与目标变量分离
- 目标变量:假设第一列为目标变量(如 “驱动结果”)。
- 特征变量:其余列为影响目标的驱动因素。
X = data.iloc[:, 1:] # 特征矩阵(从第二列开始) y = data.iloc[:, 0] # 目标变量(第一列)
2.3 划分训练集与测试集
按 8:2 比例划分数据集,用于模型训练与评估:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
3. 超参数优化(Optuna)
定义目标函数以优化 XGBoost 超参数,支持两种模式:自动搜索最优参数或使用自定义参数。
3.1 自动超参数优化(可选)
通过 Optuna 搜索最优参数组合,提升模型性能:
def objective(trial): params = { 'objective': 'reg:squarederror', 'n_estimators': trial.suggest_int('n_estimators', 50, 300), 'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3), # 其他超参数... } model = xgb.XGBRegressor(**params) score = cross_val_score(model, X_train, y_train, cv=3, scoring='neg_mean_squared_error').mean() return score # 最大化负MSE(即最小化MSE) # 运行Optuna优化(用户选择是否启用) if use_best_params.lower() == 'yes': study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=500) best_params = study.best_params model = xgb.XGBRegressor(**best_params)
3.2 使用自定义参数(可选)
若已知最优参数(如历史调优结果),可直接使用:
else: custom_params = { 'n_estimators': 300, 'learning_rate': 0.0312, # 其他自定义参数... } model = xgb.XGBRegressor(**custom_params)