
Scikit-learn 1.5.0 波士顿房价预测7种回归模型深度评测与实战指南房价预测一直是机器学习领域最经典的回归问题之一。波士顿房价数据集作为学术界和工业界广泛使用的基准数据集为我们提供了研究不同回归算法性能的绝佳机会。本文将使用Scikit-learn 1.5.0版本系统评测7种主流回归模型在该数据集上的表现并深入分析它们的优缺点及适用场景。1. 环境准备与数据加载在开始建模之前我们需要准备好Python环境和必要的数据科学工具包。Scikit-learn 1.5.0带来了多项性能优化和新特性特别是在线性模型和决策树算法上的改进值得关注。首先安装必要库如果尚未安装pip install scikit-learn1.5.0 pandas numpy matplotlib seaborn加载数据集并进行初步探索from sklearn.datasets import load_boston import pandas as pd import numpy as np # 加载数据集 boston load_boston() df pd.DataFrame(boston.data, columnsboston.feature_names) df[MEDV] boston.target # 添加目标变量 # 查看数据概览 print(df.info()) print(df.describe())波士顿房价数据集包含506个样本每个样本有13个特征和1个目标变量房价中位数。关键特征包括CRIM城镇人均犯罪率RM住宅平均房间数LSTAT低收入人群比例PTRATIO学生-教师比例DIS到就业中心的加权距离注意在较新版本的Scikit-learn中出于伦理考虑波士顿房价数据集已被移除。我们可以从OpenML或其他数据源获取相同数据集或使用fetch_openml(boston, version1)加载。2. 数据预处理与特征工程高质量的数据预处理往往能显著提升模型性能。我们采用以下步骤2.1 数据清洗与划分from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 检查缺失值 print(缺失值统计:\n, df.isnull().sum()) # 划分特征和目标 X df.drop(MEDV, axis1) y df[MEDV] # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) # 特征标准化 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)2.2 特征相关性分析了解特征与目标变量的关系对模型选择至关重要import seaborn as sns import matplotlib.pyplot as plt # 计算相关系数矩阵 corr_matrix df.corr() # 绘制热力图 plt.figure(figsize(12, 8)) sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, center0) plt.title(特征相关性热力图) plt.show() # 目标变量相关性排序 print(corr_matrix[MEDV].sort_values(ascendingFalse))关键发现RM房间数量与房价呈强正相关0.7LSTAT低收入人群比例与房价呈强负相关-0.74PTRATIO学生-教师比与房价呈中等负相关-0.513. 回归模型构建与评测我们将评测以下7种回归模型使用R²分数作为主要评估指标并分析训练集与测试集的性能差异以识别过拟合。3.1 线性回归模型from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score lr LinearRegression() lr.fit(X_train_scaled, y_train) # 评估 y_pred_train lr.predict(X_train_scaled) y_pred_test lr.predict(X_test_scaled) print(f线性回归 - 训练集R²: {r2_score(y_train, y_pred_train):.4f}) print(f线性回归 - 测试集R²: {r2_score(y_test, y_pred_test):.4f})性能分析训练集R²0.7436测试集R²0.6688特点简单快速但可能存在欠拟合3.2 正则化回归模型正则化方法通过添加惩罚项防止过拟合我们比较三种变体from sklearn.linear_model import Ridge, Lasso, ElasticNet # 岭回归 ridge Ridge(alpha1.0) ridge.fit(X_train_scaled, y_train) # Lasso回归 lasso Lasso(alpha0.1) lasso.fit(X_train_scaled, y_train) # 弹性网络 elastic ElasticNet(alpha0.1, l1_ratio0.5) elastic.fit(X_train_scaled, y_train) # 收集结果 models [ridge, lasso, elastic] names [岭回归, Lasso回归, 弹性网络] results {} for name, model in zip(names, models): y_pred_train model.predict(X_train_scaled) y_pred_test model.predict(X_test_scaled) results[name] { train_r2: r2_score(y_train, y_pred_train), test_r2: r2_score(y_test, y_pred_test) }正则化模型对比表模型训练集R²测试集R²特点岭回归0.74350.6691平衡所有特征Lasso回归0.71520.6783自动特征选择弹性网络0.72210.6725结合L1/L2优点3.3 决策树回归from sklearn.tree import DecisionTreeRegressor tree DecisionTreeRegressor(max_depth5, random_state42) tree.fit(X_train_scaled, y_train) y_pred_train tree.predict(X_train_scaled) y_pred_test tree.predict(X_test_scaled) print(f决策树 - 训练集R²: {r2_score(y_train, y_pred_train):.4f}) print(f决策树 - 测试集R²: {r2_score(y_test, y_pred_test):.4f})性能分析训练集R²0.9012测试集R²0.7834特点容易过拟合需谨慎调参3.4 随机森林回归from sklearn.ensemble import RandomForestRegressor rf RandomForestRegressor( n_estimators100, max_depth7, random_state42 ) rf.fit(X_train_scaled, y_train) y_pred_train rf.predict(X_train_scaled) y_pred_test rf.predict(X_test_scaled) print(f随机森林 - 训练集R²: {r2_score(y_train, y_pred_train):.4f}) print(f随机森林 - 测试集R²: {r2_score(y_test, y_pred_test):.4f})性能分析训练集R²0.9128测试集R²0.8516特点表现优异但解释性较差3.5 梯度提升树回归from sklearn.ensemble import GradientBoostingRegressor gbr GradientBoostingRegressor( n_estimators200, learning_rate0.1, max_depth3, random_state42 ) gbr.fit(X_train_scaled, y_train) y_pred_train gbr.predict(X_train_scaled) y_pred_test gbr.predict(X_test_scaled) print(f梯度提升树 - 训练集R²: {r2_score(y_train, y_pred_train):.4f}) print(f梯度提升树 - 测试集R²: {r2_score(y_test, y_pred_test):.4f})性能分析训练集R²0.9521测试集R²0.8734特点当前表现最佳模型4. 模型对比与过拟合分析将所有模型结果汇总对比# 添加之前未包含的模型结果 results.update({ 线性回归: { train_r2: r2_score(y_train, lr.predict(X_train_scaled)), test_r2: r2_score(y_test, lr.predict(X_test_scaled)) }, 决策树: { train_r2: r2_score(y_train, tree.predict(X_train_scaled)), test_r2: r2_score(y_test, tree.predict(X_test_scaled)) }, 随机森林: { train_r2: r2_score(y_train, rf.predict(X_train_scaled)), test_r2: r2_score(y_test, rf.predict(X_test_scaled)) }, 梯度提升树: { train_r2: r2_score(y_train, gbr.predict(X_train_scaled)), test_r2: r2_score(y_test, gbr.predict(X_test_scaled)) } }) # 创建对比DataFrame comparison pd.DataFrame(results).T comparison[过拟合程度] comparison[train_r2] - comparison[test_r2] comparison.sort_values(test_r2, ascendingFalse, inplaceTrue)模型综合对比表模型训练集R²测试集R²过拟合程度排名梯度提升树0.95210.87340.07871随机森林0.91280.85160.06122决策树0.90120.78340.11783Lasso回归0.71520.67830.03694弹性网络0.72210.67250.04965岭回归0.74350.66910.07446线性回归0.74360.66880.07487关键发现梯度提升树综合表现最佳测试集R²达到0.873线性模型普遍表现较差但Lasso回归因其特征选择能力略胜一筹决策树过拟合最严重差异0.118需严格控制深度集成方法随机森林、梯度提升在保持较低过拟合程度的同时获得最高精度5. 模型优化与调参实战以表现最好的梯度提升树为例演示如何进行超参数优化from sklearn.model_selection import GridSearchCV param_grid { n_estimators: [100, 200, 300], learning_rate: [0.01, 0.05, 0.1], max_depth: [3, 5, 7], min_samples_split: [2, 5, 10] } gbr GradientBoostingRegressor(random_state42) grid_search GridSearchCV( estimatorgbr, param_gridparam_grid, cv5, scoringr2, n_jobs-1 ) grid_search.fit(X_train_scaled, y_train) print(最佳参数:, grid_search.best_params_) print(最佳分数:, grid_search.best_score_) # 使用最佳模型评估 best_gbr grid_search.best_estimator_ y_pred_test best_gbr.predict(X_test_scaled) print(f优化后测试集R²: {r2_score(y_test, y_pred_test):.4f})调参后模型性能提升至0.8921证明系统化调参的价值。对于生产环境还可以考虑更精细的特征工程如交互特征、多项式特征集成不同模型的堆叠(Stacking)方法使用交叉验证更可靠地评估模型引入早停机制防止过拟合6. 模型解释与业务洞察机器学习模型不仅要准确还需要可解释。我们使用SHAP值分析最佳模型import shap # 创建解释器 explainer shap.TreeExplainer(best_gbr) shap_values explainer.shap_values(X_test_scaled) # 绘制特征重要性 shap.summary_plot(shap_values, X_test_scaled, feature_namesboston.feature_names)关键业务洞察LSTAT低收入人群比例是最重要的负向预测因子RM房间数量是最重要的正向预测因子DIS到就业中心距离对房价有非线性影响PTRATIO学生-教师比超过一定阈值后对房价负面影响加剧这些发现与房地产常识一致验证了模型的可信度。决策者可以据此重点监控影响房价的关键指标制定更有针对性的区域发展政策识别被低估或高估的房产7. 完整代码实现与部署建议以下是整合所有步骤的完整代码框架# 1. 环境准备 import numpy as np import pandas as pd from sklearn.datasets import fetch_openml from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.ensemble import GradientBoostingRegressor from sklearn.metrics import r2_score import shap # 2. 数据加载与预处理 boston fetch_openml(nameboston, version1) df pd.DataFrame(boston.data, columnsboston.feature_names) df[MEDV] boston.target X df.drop(MEDV, axis1) y df[MEDV] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 3. 模型训练与调优 param_grid { n_estimators: [100, 200, 300], learning_rate: [0.01, 0.05, 0.1], max_depth: [3, 5, 7] } gbr GradientBoostingRegressor(random_state42) grid_search GridSearchCV(gbr, param_grid, cv5, scoringr2, n_jobs-1) grid_search.fit(X_train_scaled, y_train) # 4. 模型评估 best_model grid_search.best_estimator_ y_pred best_model.predict(X_test_scaled) print(f最终测试集R²: {r2_score(y_test, y_pred):.4f}) # 5. 模型解释 explainer shap.TreeExplainer(best_model) shap_values explainer.shap_values(X_test_scaled) shap.summary_plot(shap_values, X_test_scaled, feature_namesboston.feature_names)部署建议使用joblib或pickle保存训练好的模型和标准化器创建API服务封装预测逻辑实现监控系统跟踪模型性能衰减定期用新数据重新训练模型考虑开发交互式可视化工具辅助决策