从数据洞察到模型调优用Seaborn和Sklearn完整走一遍房价预测项目房价预测一直是数据科学领域的经典案例。不同于简单的代码实现一个完整的预测项目需要经历数据理解、可视化分析、特征筛选、模型构建与比较、超参数调优和模型评估的全流程。本文将带你用Python的Seaborn和Sklearn库完整走一遍这个流程重点讲解每一步的意图和实现方法。1. 项目准备与数据理解在开始任何数据分析项目前理解数据的基本结构和特征含义至关重要。波士顿房价数据集包含506个样本每个样本有13个特征和1个目标变量房价中位数。关键特征解析RM平均每居民房数通常与房价正相关LSTAT人口中地位较低人群的百分数通常与房价负相关PTRATIO城镇师生比例反映教育资源情况CRIM城镇人均犯罪率影响区域安全性import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 加载数据 boston pd.read_csv(housing.csv) boston.columns [CRIM, ZN, INDUS, CHAS, NOX, RM, AGE, DIS, RAD, TAX, PTRATIO, B, LSTAT, MEDV] # 查看数据概览 print(boston.info()) print(boston.describe())提示数据探索阶段要特别关注缺失值和异常值它们会直接影响后续建模效果。2. 数据可视化与特征分析可视化是理解数据分布和特征间关系的有力工具。我们将使用Seaborn库创建多种图表来深入分析数据。2.1 特征与目标变量的关系# 绘制关键特征与房价的散点图 plt.figure(figsize(15,5)) plt.subplot(1,3,1) sns.regplot(xRM, yMEDV, databoston, scatter_kws{alpha:0.3}) plt.subplot(1,3,2) sns.regplot(xLSTAT, yMEDV, databoston, scatter_kws{alpha:0.3}) plt.subplot(1,3,3) sns.regplot(xPTRATIO, yMEDV, databoston, scatter_kws{alpha:0.3}) plt.tight_layout() plt.show()2.2 特征间相关性分析热力图能直观展示特征间的相关性帮助我们识别高度相关的特征避免多重共线性问题。# 计算并绘制相关性热力图 corr_matrix boston.corr() plt.figure(figsize(12,8)) sns.heatmap(corr_matrix, annotTrue, fmt.2f, cmapcoolwarm) plt.title(特征相关性热力图) plt.show()关键观察RM与MEDV呈现强正相关0.7LSTAT与MEDV呈现强负相关-0.74RAD和TAX高度相关0.91可能需要特征选择3. 特征工程与数据预处理良好的特征工程往往比模型选择更能提升预测性能。这一阶段包括特征选择、转换和标准化。3.1 特征选择基于相关性分析我们选择与房价相关性绝对值大于0.5的特征selected_features corr_matrix[MEDV][abs(corr_matrix[MEDV]) 0.5].index selected_features selected_features.drop(MEDV) # 移除目标变量 print(选择的特征:, list(selected_features))3.2 数据标准化不同特征的量纲差异会影响模型性能特别是正则化模型如岭回归和Lasso。from sklearn.preprocessing import StandardScaler # 划分特征和目标变量 X boston[selected_features] y boston[MEDV] # 标准化特征 scaler StandardScaler() X_scaled scaler.fit_transform(X)4. 模型构建与比较我们将比较三种线性模型普通最小二乘回归、岭回归和Lasso回归评估它们在房价预测上的表现。4.1 数据分割from sklearn.model_selection import train_test_split # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X_scaled, y, test_size0.2, random_state42)4.2 模型训练与评估from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.metrics import mean_squared_error, r2_score models { Linear Regression: LinearRegression(), Ridge Regression: Ridge(alpha1.0), Lasso Regression: Lasso(alpha1.0) } results [] for name, model in models.items(): model.fit(X_train, y_train) y_pred model.predict(X_test) mse mean_squared_error(y_test, y_pred) rmse np.sqrt(mse) r2 r2_score(y_test, y_pred) results.append([name, mse, rmse, r2]) # 展示结果 results_df pd.DataFrame(results, columns[Model, MSE, RMSE, R2]) print(results_df)模型比较表模型MSERMSER2线性回归23.184.810.72岭回归24.884.990.70Lasso回归28.945.380.655. 模型调优与验证正则化参数α的选择对岭回归和Lasso的性能有重要影响。我们将使用交叉验证来寻找最优参数。5.1 岭回归参数调优from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid {alpha: [0.001, 0.01, 0.1, 1, 10, 100]} # 网格搜索 ridge Ridge() grid_search GridSearchCV(ridge, param_grid, cv5, scoringneg_mean_squared_error) grid_search.fit(X_train, y_train) # 最佳参数 print(最佳alpha:, grid_search.best_params_) print(最佳分数:, -grid_search.best_score_)5.2 调优后的模型评估# 使用最佳参数重新训练 best_ridge grid_search.best_estimator_ y_pred best_ridge.predict(X_test) # 评估指标 ridge_mse mean_squared_error(y_test, y_pred) ridge_rmse np.sqrt(ridge_mse) ridge_r2 r2_score(y_test, y_pred) print(f调优后岭回归性能: RMSE{ridge_rmse:.2f}, R2{ridge_r2:.2f})5.3 特征重要性分析Lasso回归因其特性可以进行特征选择让我们看看哪些特征被模型认为最重要。# 训练Lasso模型 lasso Lasso(alpha0.01) lasso.fit(X_train, y_train) # 特征重要性 feature_importance pd.DataFrame({ Feature: selected_features, Coefficient: lasso.coef_ }).sort_values(Coefficient, keyabs, ascendingFalse) print(feature_importance)特征重要性排序LSTAT人口中地位较低人群比例RM平均每居民房数PTRATIO城镇师生比例DIS与就业中心的距离6. 模型诊断与改进建议在完成初步建模后我们需要诊断模型是否存在问题并探索可能的改进方向。6.1 残差分析# 计算残差 residuals y_test - y_pred # 绘制残差图 plt.figure(figsize(10,5)) plt.scatter(y_pred, residuals) plt.axhline(y0, colorr, linestyle--) plt.xlabel(预测值) plt.ylabel(残差) plt.title(残差图) plt.show()注意理想的残差图应该随机分布在0附近没有明显的模式。如果出现漏斗形或其他模式可能需要对数据进行转换或考虑非线性模型。6.2 可能的改进方向非线性特征尝试添加特征的平方项或交互项其他模型测试决策树、随机森林等非线性模型异常值处理识别并处理可能影响模型的极端值更多特征收集或构造更多相关特征# 示例添加多项式特征 from sklearn.preprocessing import PolynomialFeatures poly PolynomialFeatures(degree2, include_biasFalse) X_poly poly.fit_transform(X_scaled) # 重新训练模型 X_train_poly, X_test_poly, y_train, y_test train_test_split( X_poly, y, test_size0.2, random_state42) ridge_poly Ridge(alpha1.0) ridge_poly.fit(X_train_poly, y_train) y_pred_poly ridge_poly.predict(X_test_poly) print(多项式特征R2:, r2_score(y_test, y_pred_poly))在实际项目中我发现特征程的质量往往比模型选择更能影响最终效果。特别是在处理房价这种受多种因素影响的复杂问题时深入理解业务背景和特征含义至关重要。
从数据洞察到模型调优:用Seaborn和Sklearn完整走一遍房价预测项目
发布时间:2026/5/30 22:56:10
从数据洞察到模型调优用Seaborn和Sklearn完整走一遍房价预测项目房价预测一直是数据科学领域的经典案例。不同于简单的代码实现一个完整的预测项目需要经历数据理解、可视化分析、特征筛选、模型构建与比较、超参数调优和模型评估的全流程。本文将带你用Python的Seaborn和Sklearn库完整走一遍这个流程重点讲解每一步的意图和实现方法。1. 项目准备与数据理解在开始任何数据分析项目前理解数据的基本结构和特征含义至关重要。波士顿房价数据集包含506个样本每个样本有13个特征和1个目标变量房价中位数。关键特征解析RM平均每居民房数通常与房价正相关LSTAT人口中地位较低人群的百分数通常与房价负相关PTRATIO城镇师生比例反映教育资源情况CRIM城镇人均犯罪率影响区域安全性import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 加载数据 boston pd.read_csv(housing.csv) boston.columns [CRIM, ZN, INDUS, CHAS, NOX, RM, AGE, DIS, RAD, TAX, PTRATIO, B, LSTAT, MEDV] # 查看数据概览 print(boston.info()) print(boston.describe())提示数据探索阶段要特别关注缺失值和异常值它们会直接影响后续建模效果。2. 数据可视化与特征分析可视化是理解数据分布和特征间关系的有力工具。我们将使用Seaborn库创建多种图表来深入分析数据。2.1 特征与目标变量的关系# 绘制关键特征与房价的散点图 plt.figure(figsize(15,5)) plt.subplot(1,3,1) sns.regplot(xRM, yMEDV, databoston, scatter_kws{alpha:0.3}) plt.subplot(1,3,2) sns.regplot(xLSTAT, yMEDV, databoston, scatter_kws{alpha:0.3}) plt.subplot(1,3,3) sns.regplot(xPTRATIO, yMEDV, databoston, scatter_kws{alpha:0.3}) plt.tight_layout() plt.show()2.2 特征间相关性分析热力图能直观展示特征间的相关性帮助我们识别高度相关的特征避免多重共线性问题。# 计算并绘制相关性热力图 corr_matrix boston.corr() plt.figure(figsize(12,8)) sns.heatmap(corr_matrix, annotTrue, fmt.2f, cmapcoolwarm) plt.title(特征相关性热力图) plt.show()关键观察RM与MEDV呈现强正相关0.7LSTAT与MEDV呈现强负相关-0.74RAD和TAX高度相关0.91可能需要特征选择3. 特征工程与数据预处理良好的特征工程往往比模型选择更能提升预测性能。这一阶段包括特征选择、转换和标准化。3.1 特征选择基于相关性分析我们选择与房价相关性绝对值大于0.5的特征selected_features corr_matrix[MEDV][abs(corr_matrix[MEDV]) 0.5].index selected_features selected_features.drop(MEDV) # 移除目标变量 print(选择的特征:, list(selected_features))3.2 数据标准化不同特征的量纲差异会影响模型性能特别是正则化模型如岭回归和Lasso。from sklearn.preprocessing import StandardScaler # 划分特征和目标变量 X boston[selected_features] y boston[MEDV] # 标准化特征 scaler StandardScaler() X_scaled scaler.fit_transform(X)4. 模型构建与比较我们将比较三种线性模型普通最小二乘回归、岭回归和Lasso回归评估它们在房价预测上的表现。4.1 数据分割from sklearn.model_selection import train_test_split # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X_scaled, y, test_size0.2, random_state42)4.2 模型训练与评估from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.metrics import mean_squared_error, r2_score models { Linear Regression: LinearRegression(), Ridge Regression: Ridge(alpha1.0), Lasso Regression: Lasso(alpha1.0) } results [] for name, model in models.items(): model.fit(X_train, y_train) y_pred model.predict(X_test) mse mean_squared_error(y_test, y_pred) rmse np.sqrt(mse) r2 r2_score(y_test, y_pred) results.append([name, mse, rmse, r2]) # 展示结果 results_df pd.DataFrame(results, columns[Model, MSE, RMSE, R2]) print(results_df)模型比较表模型MSERMSER2线性回归23.184.810.72岭回归24.884.990.70Lasso回归28.945.380.655. 模型调优与验证正则化参数α的选择对岭回归和Lasso的性能有重要影响。我们将使用交叉验证来寻找最优参数。5.1 岭回归参数调优from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid {alpha: [0.001, 0.01, 0.1, 1, 10, 100]} # 网格搜索 ridge Ridge() grid_search GridSearchCV(ridge, param_grid, cv5, scoringneg_mean_squared_error) grid_search.fit(X_train, y_train) # 最佳参数 print(最佳alpha:, grid_search.best_params_) print(最佳分数:, -grid_search.best_score_)5.2 调优后的模型评估# 使用最佳参数重新训练 best_ridge grid_search.best_estimator_ y_pred best_ridge.predict(X_test) # 评估指标 ridge_mse mean_squared_error(y_test, y_pred) ridge_rmse np.sqrt(ridge_mse) ridge_r2 r2_score(y_test, y_pred) print(f调优后岭回归性能: RMSE{ridge_rmse:.2f}, R2{ridge_r2:.2f})5.3 特征重要性分析Lasso回归因其特性可以进行特征选择让我们看看哪些特征被模型认为最重要。# 训练Lasso模型 lasso Lasso(alpha0.01) lasso.fit(X_train, y_train) # 特征重要性 feature_importance pd.DataFrame({ Feature: selected_features, Coefficient: lasso.coef_ }).sort_values(Coefficient, keyabs, ascendingFalse) print(feature_importance)特征重要性排序LSTAT人口中地位较低人群比例RM平均每居民房数PTRATIO城镇师生比例DIS与就业中心的距离6. 模型诊断与改进建议在完成初步建模后我们需要诊断模型是否存在问题并探索可能的改进方向。6.1 残差分析# 计算残差 residuals y_test - y_pred # 绘制残差图 plt.figure(figsize(10,5)) plt.scatter(y_pred, residuals) plt.axhline(y0, colorr, linestyle--) plt.xlabel(预测值) plt.ylabel(残差) plt.title(残差图) plt.show()注意理想的残差图应该随机分布在0附近没有明显的模式。如果出现漏斗形或其他模式可能需要对数据进行转换或考虑非线性模型。6.2 可能的改进方向非线性特征尝试添加特征的平方项或交互项其他模型测试决策树、随机森林等非线性模型异常值处理识别并处理可能影响模型的极端值更多特征收集或构造更多相关特征# 示例添加多项式特征 from sklearn.preprocessing import PolynomialFeatures poly PolynomialFeatures(degree2, include_biasFalse) X_poly poly.fit_transform(X_scaled) # 重新训练模型 X_train_poly, X_test_poly, y_train, y_test train_test_split( X_poly, y, test_size0.2, random_state42) ridge_poly Ridge(alpha1.0) ridge_poly.fit(X_train_poly, y_train) y_pred_poly ridge_poly.predict(X_test_poly) print(多项式特征R2:, r2_score(y_test, y_pred_poly))在实际项目中我发现特征程的质量往往比模型选择更能影响最终效果。特别是在处理房价这种受多种因素影响的复杂问题时深入理解业务背景和特征含义至关重要。