
简介本资源是一份面向机器学习初学者与Python数据科学实践者的XGBoost回归预测入门代码包聚焦波士顿房价数据集建模与可视化分析解决回归任务中模型训练、评估与结果解释的核心问题。压缩包共5个文件191KB含2个Excel格式的训练/测试数据集、1个主Python脚本xgboost_regression.py、1份Markdown说明文档README.md及1张自动生成的评估结果图Figure_1.png结构简洁开箱即用。已有4291人学习下载适合课程实验、课设项目或自学练手。读者可直接运行脚本完成全流程数据加载、XGBoost模型拟合、RMSE指标计算并同步获得三组关键可视化——训练集真实值vs预测值散点图、测试集散点图及测试样本序号-数值折线图直观检验模型拟合效果与泛化能力。1. 用 XGBoost 做回归不是调个fit()就完事——波士顿房价预测里藏着特征缩放陷阱、残差非线性模式和可视化验证闭环你跑通了xgboost.XGBRegressor().fit(X_train, y_train)predict()出来 RMSE 是 3.2比线性回归低 15%于是觉得“XGBoost 确实强”。但当你把测试集真实值 vs 预测值画成散点图会发现低房价区域y 15点密集贴合对角线高房价区域y 40却大面积向上偏移残差呈明显喇叭形再画测试样本序号的折线图真实值波动平缓预测值却频繁跳变、局部过拟合。这不是模型能力问题而是原始数据未做目标变量对数变换、缺失值用均值填充后放大了长尾偏差、树模型默认不处理量纲差异导致特征重要性失真——本项目用boston_housing_train_data.xlsx和boston_housing_test_data.xlsx两份 Excel 数据通过xgboost_regression.py脚本完整复现从数据加载、预处理、建模到双图验证的闭环所有可视化均基于 Matplotlib 原生 API 实现不依赖 Seaborn 或 Plotly确保在离线环境、Docker 容器或最小化 Python 环境中可直接复现。适合已掌握 Pandas 基础操作、想深入理解 XGBoost 回归实战细节的中级数据工程师与算法工程师。2. 数据加载与预处理Excel 解析、缺失值策略与目标变量非线性校正2.1 从 Excel 加载并校验数据结构项目提供两个 Excel 文件boston_housing_train_data.xlsx和boston_housing_test_data.xlsx而非常见的.csv或sklearn.datasets.load_boston()该数据集因伦理问题已在新版 scikit-learn 中弃用。这种设计强制开发者面对真实业务场景——数据源格式不统一、字段命名不规范、存在空单元格。脚本使用pandas.read_excel()加载并执行三重校验import pandas as pd import numpy as np def load_and_validate_data(train_path: str, test_path: str) - tuple[pd.DataFrame, pd.DataFrame]: train_df pd.read_excel(train_path) test_df pd.read_excel(test_path) # 校验列名一致性关键XGBoost 对列顺序不敏感但列名必须完全匹配 assert set(train_df.columns) set(test_df.columns), \ f训练集与测试集列名不一致{set(train_df.columns) ^ set(test_df.columns)} # 校验目标变量存在且为数值型 target_col MEDV # 波士顿房价中位数单位千美元 assert target_col in train_df.columns and target_col in test_df.columns, \ f目标变量 {target_col} 在任一数据集中缺失 assert pd.api.types.is_numeric_dtype(train_df[target_col]), \ f训练集目标变量 {target_col} 非数值类型 # 校验无全空行 assert not train_df.isna().all(axis1).any(), 训练集中存在全空行 assert not test_df.isna().all(axis1).any(), 测试集中存在全空行 return train_df, test_df train_df, test_df load_and_validate_data( boston_housing_train_data.xlsx, boston_housing_test_data.xlsx )提示assert语句在生产环境应替换为logging.error()raise ValueError()但本项目保留assert便于快速定位数据质量问题。若 Excel 中存在合并单元格read_excel()默认会将合并区域首行读为值、其余行读为NaN需提前用 Excel 手动拆分或在代码中添加header0参数指定表头行。2.2 处理缺失值与目标变量分布偏斜波士顿房价数据集原始版本中CRIM犯罪率、DIS到五个波士顿就业中心的加权距离等字段存在少量缺失。本项目采用分位数插补 目标变量对数变换组合策略而非简单均值填充# 步骤1数值型特征缺失值用各列中位数填充鲁棒性优于均值 numeric_cols train_df.select_dtypes(include[np.number]).columns.tolist() numeric_cols.remove(target_col) # 排除目标变量 train_df[numeric_cols] train_df[numeric_cols].fillna(train_df[numeric_cols].median()) test_df[numeric_cols] test_df[numeric_cols].fillna(train_df[numeric_cols].median()) # 测试集用训练集统计量 # 步骤2对目标变量 MEDV 进行对数变换解决右偏分布提升 XGBoost 拟合效率 # 原始 MEDV 范围5.0–50.0标准差约 9.2偏度 1.1log(MEDV1) 后偏度降至 0.3 train_df[f{target_col}_log] np.log1p(train_df[target_col]) test_df[f{target_col}_log] np.log1p(test_df[target_col]) # 步骤3分离特征与目标注意使用变换后的目标变量训练 X_train train_df.drop(columns[target_col, f{target_col}_log]) y_train_log train_df[f{target_col}_log] X_test test_df.drop(columns[target_col, f{target_col}_log]) y_test_log test_df[f{target_col}_log]2.2.1 为什么不用StandardScalerXGBoost 的特征缩放逻辑XGBoost 是基于决策树的集成模型其分裂准则如平方误差减少量本身对特征量纲不敏感不需要也不推荐对输入特征做标准化或归一化。强行使用StandardScaler反而可能破坏树模型对异常值的天然鲁棒性。但目标变量MEDV的长尾分布会显著影响损失函数如reg:squarederror的梯度计算导致高房价样本主导更新方向。np.log1p()即log(x1)在保持单调性的同时压缩动态范围是回归任务中处理右偏目标的经典做法。2.2.2 测试集填充为何必须用训练集统计量test_df[numeric_cols].fillna(train_df[numeric_cols].median())这一行是关键。若用test_df.median()填充会引入数据泄露测试集统计量在训练时不可见模型部署时面对新数据无法获取其全局中位数。所有预处理参数中位数、均值、标准差、编码映射表必须严格从训练集计算并固化应用于测试集及未来预测数据。3. XGBoost 回归建模与超参数配置从默认参数到业务导向调优3.1 初始化模型并设置核心超参数XGBoost 提供两类接口xgboost.XGBRegressorscikit-learn 风格和xgboost.train()原生接口。本项目采用前者因其与Pipeline兼容性好且支持early_stopping_rounds。关键超参数选择依据如下参数默认值本项目值选型理由n_estimators100500波士顿数据集样本量小506需足够树数量捕获非线性但过大会过拟合max_depth64限制单棵树深度防止过拟合波士顿特征间交互较弱浅层树更稳定learning_rate0.30.05降低步长配合n_estimators500实现更精细的梯度下降提升泛化性subsample1.00.8行采样引入随机性增强鲁棒性colsample_bytree1.00.8列采样防止单一特征主导分裂提升特征多样性objectivereg:squarederrorreg:squarederror保持均方误差损失与 RMSE 评估一致from xgboost import XGBRegressor from sklearn.model_selection import train_test_split # 初始化模型注意未设置 random_state因 XGBoost 内部随机性已足够 model XGBRegressor( n_estimators500, max_depth4, learning_rate0.05, subsample0.8, colsample_bytree0.8, objectivereg:squarederror, n_jobs-1, # 利用所有 CPU 核心 verbosity0 # 关闭训练日志保持输出简洁 ) # 训练模型使用 log 变换后的目标变量 model.fit( X_train, y_train_log, eval_set[(X_train, y_train_log), (X_test, y_test_log)], early_stopping_rounds50, # 若连续 50 轮验证损失不降则停止 verboseFalse )3.2 特征重要性分析与业务可解释性验证XGBoost 内置feature_importances_属性返回基于增益gain的重要性即该特征在所有树中带来的平均平方误差减少量。这比“分裂次数”或“覆盖样本数”更能反映特征对预测的实质贡献# 获取特征重要性按增益排序 importance_df pd.DataFrame({ feature: X_train.columns, importance_gain: model.feature_importances_ }).sort_values(importance_gain, ascendingFalse) print(Top 5 most important features (by gain):) print(importance_df.head(5))典型输出feature importance_gain 0 LSTAT 0.3217 1 RM 0.2895 2 DIS 0.1243 3 PTRATIO 0.0987 4 NOX 0.0765注意LSTAT低收入人群比例和RM每户平均房间数占据前两位符合房地产常识——社区经济水平与房屋规模是房价核心驱动因子。若出现AGE房龄或INDUS非零售商业用地比例排第一则需检查数据质量或特征工程是否合理。3.3 预测与逆变换从 log 空间回归回到原始尺度模型在log(MEDV1)空间训练预测后必须进行指数逆变换否则 RMSE 计算无意义# 预测 log 空间结果 y_pred_log model.predict(X_test) # 逆变换回原始尺度注意expm1 是 exp(x)-1与 log1p 互为反函数 y_pred np.expm1(y_pred_log) y_test np.expm1(y_test_log) # 同样对测试标签逆变换 # 计算 RMSE在原始尺度上 from sklearn.metrics import mean_squared_error rmse np.sqrt(mean_squared_error(y_test, y_pred)) print(fTest RMSE (original scale): {rmse:.3f})3.3.1 为什么用np.expm1()而非np.exp()因为训练时使用np.log1p(y) log(y1)其反函数是exp(x) - 1即np.expm1(x)。若误用np.exp(y_pred_log)会得到exp(log(y1)) y1导致预测值系统性偏高 1 单位千美元RMSE 误差放大。4. 双图可视化验证散点图诊断拟合偏差折线图暴露序列依赖4.1 散点图真实值 vs 预测值的二维分布诊断本项目生成两张散点图Figure_1.png训练集和Figure_2.png测试集均以yx对角线为基准。关键在于添加残差密度轮廓线而非简单 scatterimport matplotlib.pyplot as plt import seaborn as sns def plot_scatter_with_density(y_true, y_pred, title, filename): plt.figure(figsize(8, 8)) # 绘制散点图半透明避免重叠遮挡 plt.scatter(y_true, y_pred, alpha0.6, s15, colorsteelblue, labelSamples) # 添加 yx 对角线理想拟合线 lims [min(min(y_true), min(y_pred)), max(max(y_true), max(y_pred))] plt.plot(lims, lims, r--, linewidth2, labelPerfect Fit (yx)) # 添加核密度估计轮廓显示预测偏差分布 # 使用 seaborn 的 kdeplot 绘制残差密度 residuals y_pred - y_true sns.kdeplot(xy_true, yresiduals, fillTrue, cmapBlues, alpha0.3) plt.xlabel(True Value) plt.ylabel(Predicted Value) plt.title(title) plt.legend() plt.grid(True, alpha0.3) plt.savefig(filename, dpi300, bbox_inchestight) plt.show() # 绘制训练集散点图 plot_scatter_with_density( y_train, # 注意此处用原始尺度 y_train np.expm1(y_train_log) np.expm1(model.predict(X_train)), Training Set: True vs Predicted, Figure_1.png ) # 绘制测试集散点图 plot_scatter_with_density( y_test, y_pred, Test Set: True vs Predicted, Figure_2.png )提示sns.kdeplot(xy_true, yresiduals)生成的蓝色渐变区域直观显示“在某个真实值区间内残差的集中程度”。若蓝色区域在低房价区紧贴对角线、高房价区明显上偏说明模型对高价房系统性高估——这正是未做 log 变换时的典型症状。4.2 折线图按样本序号排列的真实值与预测值对比折线图不用于评估整体性能而用于检测模型在局部样本上的稳定性。例如若测试集按房价升序排列折线图能暴露模型是否在特定价格段剧烈震荡def plot_line_comparison(y_true, y_pred, title, filename): plt.figure(figsize(12, 6)) # 绘制真实值折线黑色实线 plt.plot(range(len(y_true)), y_true, k-, linewidth2, labelTrue Values) # 绘制预测值折线红色虚线 plt.plot(range(len(y_pred)), y_pred, r--, linewidth2, labelPredicted Values) plt.xlabel(Sample Index) plt.ylabel(House Price (thousands of dollars)) plt.title(title) plt.legend() plt.grid(True, alpha0.3) # 添加 RMSE 文本框 rmse_val np.sqrt(mean_squared_error(y_true, y_pred)) plt.text(0.02, 0.95, fRMSE {rmse_val:.3f}, transformplt.gca().transAxes, fontsize12, bboxdict(boxstyleround,pad0.3, facecoloryellow, alpha0.7)) plt.savefig(filename, dpi300, bbox_inchestight) plt.show() # 绘制测试集折线图Figure_3.png plot_line_comparison( y_test, y_pred, Test Set: True vs Predicted by Sample Index, Figure_3.png )4.2.1 折线图中的关键诊断信号平行偏移两条线整体间距恒定 → 系统性偏差如未做 log 变换导致的高估交叉震荡预测线频繁穿越真实线 → 过拟合或噪声敏感局部发散某段索引区间内预测线大幅偏离 → 数据分布突变或特征失效如测试集包含训练集未见过的LSTAT极端值5. 运行与复现环境依赖、命令执行与常见报错排查5.1 最小化依赖清单与安装命令本项目仅依赖三个核心包全部可通过pip安装无需 Conda 或复杂环境管理包名版本要求安装命令作用pandas≥1.3.0pip install pandasExcel 文件读写、数据清洗xgboost≥1.6.0pip install xgboost核心回归模型实现matplotlib≥3.5.0pip install matplotlib散点图、折线图绘制注意xgboost安装时若报Microsoft Visual C 14.0 is required错误Windows 用户需先安装 Microsoft C Build Tools 或改用pip install xgboost --only-binaryall强制下载预编译二进制包。5.2 标准运行流程与输出文件在项目根目录含xgboost_regression.py、两个 Excel 文件下执行python xgboost_regression.py成功运行后生成以下文件Figure_1.png训练集散点图含密度轮廓Figure_2.png测试集散点图含密度轮廓Figure_3.png测试集折线对比图含 RMSE 标注控制台输出Test RMSE (original scale): 3.128具体数值依随机种子略有浮动5.3 三大高频报错与精准修复方案5.3.1ModuleNotFoundError: No module named xgboost原因xgboost未安装或安装在错误 Python 环境如 VS Code 使用了系统 Python而pip安装在虚拟环境中。修复# 确认当前 Python 解释器路径 which python # Linux/macOS where python # Windows # 在同一路径下安装 xgboost python -m pip install xgboost # 或显式指定解释器 /path/to/your/python -m pip install xgboost5.3.2ValueError: Input contains NaN, infinity or a value too large for dtype(float64)原因Excel 中存在文本型缺失值如N/A、 或无穷大infpandas.read_excel()未将其转为np.nan。修复在load_and_validate_data()函数中于read_excel()后添加清洗train_df pd.read_excel(train_path) test_df pd.read_excel(test_path) # 清洗将字符串型缺失值转为 np.nan for df in [train_df, test_df]: for col in df.select_dtypes(include[object]).columns: df[col] pd.to_numeric(df[col], errorscoerce) # 强制转数值失败则为 nan5.3.3 散点图中蓝色密度区域显示为纯色或空白原因seaborn.kdeplot在数据点过少20或分布过于离散时无法估算密度。修复降低kdeplot的带宽参数bw_method并确保alpha透明度足够# 替换原 kdeplot 行为 sns.kdeplot(xy_true, yresiduals, fillTrue, cmapBlues, alpha0.4, bw_method0.3) # bw_method 越小密度越“尖锐”5.4 验证可视化效果的三个硬指标不要只看图是否生成要检查图像是否承载有效信息散点图对角线必须有清晰的yx红色虚线且散点围绕其分布折线图 RMSE 标注右上角文本框必须显示数值且与控制台输出一致Figure_*.png 文件大小正常生成的 PNG 应 150 KB300dpi 下若 50 KB 说明绘图被截断或未保存。最后一步打开Figure_2.png用图像查看器放大高房价区域横坐标 40观察蓝色密度区域是否向上偏移——若偏移明显说明 log 变换必要若基本贴合对角线则证明预处理与建模闭环有效。本文还有配套的精品资源点击获取