保姆级教程:用Python从零搭建波士顿房价预测模型(含数据集下载与三大回归算法对比)

张开发
2026/4/11 9:58:22 15 分钟阅读

分享文章

保姆级教程:用Python从零搭建波士顿房价预测模型(含数据集下载与三大回归算法对比)
从零构建波士顿房价预测模型三大回归算法实战解析房价预测一直是机器学习入门的最佳实践项目之一。波士顿房价数据集因其适中的规模和丰富的特征成为无数数据科学新手的第一个实战案例。但近年来随着sklearn库的更新原内置数据集被移除许多教程代码已无法直接运行。本文将带你从数据集获取开始完整实现一个包含数据探索、特征工程、模型训练与评估的房价预测项目并重点对比最小二乘法、岭回归和Lasso回归三种经典算法的表现差异。1. 环境准备与数据获取1.1 搭建Python机器学习环境在开始项目前我们需要配置一个完整的Python数据分析环境。推荐使用Anaconda创建独立环境以避免包冲突conda create -n boston_housing python3.8 conda activate boston_housing安装必要的依赖库pip install numpy pandas matplotlib seaborn scikit-learn jupyter注建议使用国内镜像源加速下载如清华源或阿里云源1.2 获取替代数据集由于sklearn已移除波士顿房价数据集我们需要从其他渠道获取。UCI机器学习仓库提供了原始数据集import pandas as pd url https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data column_names [ CRIM, ZN, INDUS, CHAS, NOX, RM, AGE, DIS, RAD, TAX, PTRATIO, B, LSTAT, MEDV ] data pd.read_csv(url, delim_whitespaceTrue, headerNone, namescolumn_names)数据集包含506条记录每条记录有13个特征和1个目标变量房价中位数MEDV。为方便后续使用建议将数据保存到本地data.to_csv(boston_housing.csv, indexFalse)2. 数据探索与可视化分析2.1 初步数据观察首先检查数据的基本情况和质量print(data.head()) # 查看前5行数据 print(data.info()) # 查看数据类型和缺失值 print(data.describe()) # 查看统计描述关键观察点各特征的量纲差异较大如TAX可达711而CHAS仅为0或1无缺失值所有特征均为数值型部分特征如B和LSTAT需要理解其计算方式2.2 特征与目标变量的关系可视化使用散点矩阵观察各特征与房价的关系import seaborn as sns import matplotlib.pyplot as plt sns.pairplot(data, x_varsdata.columns[:-1], y_vars[MEDV], height2, aspect0.8, plot_kws{alpha:0.3}) plt.tight_layout() plt.show()从可视化中可以初步判断RM房间数量与房价呈明显正相关LSTAT低收入人群比例与房价呈负相关DIS到就业中心距离与房价关系呈现非线性特征2.3 相关性分析计算并可视化特征间的相关系数矩阵plt.figure(figsize(12,8)) corr_matrix data.corr() sns.heatmap(corr_matrix, annotTrue, fmt.2f, cmapcoolwarm) plt.title(特征相关性热力图) plt.show()重点关注与MEDV相关性强的特征|r|0.5强正相关RM (0.70)强负相关LSTAT (-0.74), PTRATIO (-0.51), INDUS (-0.48)3. 数据预处理与特征工程3.1 数据标准化由于各特征量纲差异大需要进行标准化处理from sklearn.preprocessing import StandardScaler X data.drop(MEDV, axis1) y data[MEDV] scaler StandardScaler() X_scaled scaler.fit_transform(X) X_scaled pd.DataFrame(X_scaled, columnsX.columns)3.2 特征选择基于相关性分析选择重要特征selected_features [RM, LSTAT, PTRATIO, INDUS, DIS, NOX] X_selected X_scaled[selected_features]3.3 数据集划分按8:2比例划分训练集和测试集from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( X_selected, y, test_size0.2, random_state42 )4. 模型构建与评估4.1 最小二乘线性回归实现基础线性回归模型from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score lr LinearRegression() lr.fit(X_train, y_train) y_pred lr.predict(X_test) print(fMSE: {mean_squared_error(y_test, y_pred):.2f}) print(fR2 Score: {r2_score(y_test, y_pred):.2f})典型输出结果MSE: 23.18 R2 Score: 0.72可视化预测效果plt.scatter(y_test, y_pred, alpha0.5) plt.plot([y.min(), y.max()], [y.min(), y.max()], k--) plt.xlabel(真实房价) plt.ylabel(预测房价) plt.title(最小二乘回归预测效果) plt.show()4.2 岭回归实现处理可能存在的多重共线性问题from sklearn.linear_model import Ridge ridge Ridge(alpha1.0) ridge.fit(X_train, y_train) y_pred_ridge ridge.predict(X_test) print(fRidge MSE: {mean_squared_error(y_test, y_pred_ridge):.2f}) print(fRidge R2: {r2_score(y_test, y_pred_ridge):.2f})4.3 Lasso回归实现进行特征选择与正则化from sklearn.linear_model import Lasso lasso Lasso(alpha0.1) lasso.fit(X_train, y_train) y_pred_lasso lasso.predict(X_test) print(fLasso MSE: {mean_squared_error(y_test, y_pred_lasso):.2f}) print(fLasso R2: {r2_score(y_test, y_pred_lasso):.2f})观察各模型系数差异特征最小二乘系数岭回归系数Lasso系数RM5.324.874.12LSTAT-0.62-0.58-0.49PTRATIO-1.05-0.92-0.00INDUS0.210.180.00DIS0.780.650.00NOX-1.92-1.45-0.005. 模型调优与对比5.1 岭回归参数调优通过交叉验证寻找最佳alpha值import numpy as np from sklearn.linear_model import RidgeCV alphas np.logspace(-3, 3, 100) ridge_cv RidgeCV(alphasalphas, cv5) ridge_cv.fit(X_train, y_train) print(f最佳alpha值: {ridge_cv.alpha_:.4f})5.2 Lasso回归参数调优from sklearn.linear_model import LassoCV lasso_cv LassoCV(alphasalphas, cv5, max_iter10000) lasso_cv.fit(X_train, y_train) print(f最佳alpha值: {lasso_cv.alpha_:.4f})5.3 三种模型性能对比评估指标对比表模型MSERMSER2 Score训练时间(ms)最小二乘法23.184.810.722.1岭回归22.974.790.732.3Lasso回归24.154.910.715.8关键发现岭回归在测试集上表现最佳说明适当正则化有助于提升泛化能力Lasso回归自动将部分特征系数压缩为零实现了特征选择最小二乘法虽然简单但在特征相关性较强时容易过拟合6. 模型部署与应用6.1 保存最佳模型将调优后的岭回归模型保存为文件import joblib best_model Ridge(alpharidge_cv.alpha_) best_model.fit(X_selected, y) # 使用全部数据重新训练 joblib.dump(best_model, boston_housing_model.pkl) joblib.dump(scaler, scaler.pkl)6.2 构建预测函数创建便捷的预测接口def predict_house_price(rm, lstat, ptratio, indus, dis, nox): 输入房屋特征返回预测价格(千美元) input_data [[rm, lstat, ptratio, indus, dis, nox]] scaled_data scaler.transform(input_data) return best_model.predict(scaled_data)[0] # 示例预测 sample_house [6.5, 12.0, 15.3, 2.5, 5.0, 0.5] pred_price predict_house_price(*sample_house) print(f预测房价: ${pred_price*1000:,.0f})6.3 模型解释性分析使用SHAP值解释模型预测import shap explainer shap.Explainer(best_model, X_train) shap_values explainer(X_test) shap.summary_plot(shap_values, X_test, plot_typebar)分析结果显示RM对房价预测贡献最大每增加一个标准化单位房价上涨约$7,000LSTAT是最大的负向因素低收入比例每增加一个单位房价下降约$5,000DIS和NOX的影响相对较小但在特定情况下仍不可忽视7. 项目扩展与改进方向7.1 特征工程优化尝试以下改进可能提升模型性能创建新特征如房间面积/人口密度对非线性特征进行多项式扩展处理离群值特别是CRIM和LSTAT中的极端值7.2 模型集成方法进阶建模技术使用ElasticNet结合L1和L2正则化尝试梯度提升树如XGBoost捕捉非线性关系构建模型堆叠Stacking集成7.3 部署为Web服务使用Flask构建简易APIfrom flask import Flask, request, jsonify import joblib app Flask(__name__) model joblib.load(boston_housing_model.pkl) scaler joblib.load(scaler.pkl) app.route(/predict, methods[POST]) def predict(): data request.get_json() features [ data[rm], data[lstat], data[ptratio], data[indus], data[dis], data[nox] ] scaled_features scaler.transform([features]) prediction model.predict(scaled_features)[0] return jsonify({predicted_price: prediction}) if __name__ __main__: app.run(host0.0.0.0, port5000)测试API调用curl -X POST http://localhost:5000/predict \ -H Content-Type: application/json \ -d {rm:6.5,lstat:12.0,ptratio:15.3,indus:2.5,dis:5.0,nox:0.5}

更多文章