从零开始Kaggle房价预测实战全流程解析与XGBoost优化指南房价预测一直是机器学习入门的热门课题而Kaggle的House Prices竞赛更是无数数据科学家的第一站。本文将带你完整走一遍从数据探索到模型调优的全流程重点解决三个核心问题如何正确理解数据分布如何处理高缺失率特征如何构建高效的XGBoost模型我们将用超过20个代码片段和15个可视化案例揭示每个步骤背后的思考逻辑。1. 环境准备与数据初探工欲善其事必先利其器。我们先配置好Python环境建议使用Anaconda创建独立环境conda create -n house_price python3.8 conda activate house_price pip install pandas numpy matplotlib seaborn xgboost scikit-learn数据集下载后第一个关键动作是理解数据全貌。不同于常规的head()查看前几行专业做法是先构建数据字典import pandas as pd train pd.read_csv(train.csv) test pd.read_csv(test.csv) # 合并数据集便于统一处理 all_data pd.concat([train, test], axis0, ignore_indexTrue) print(f训练集形状: {train.shape}, 测试集形状: {test.shape})数据质量检查清单重复值all_data.duplicated().sum()数据类型all_data.dtypes.value_counts()缺失概况all_data.isnull().sum().sort_values(ascendingFalse)[:15]2. 深度数据探索与异常处理2.1 目标变量分析房价(SalePrice)的分布决定后续处理策略。使用Seaborn绘制分布图时要关注三个关键指标import numpy as np import seaborn as sns from scipy import stats fig, (ax1, ax2) plt.subplots(1, 2, figsize(12,5)) sns.histplot(train[SalePrice], kdeTrue, axax1) stats.probplot(train[SalePrice], plotax2) plt.show() # 计算偏度和峰度 print(f偏度: {train[SalePrice].skew():.2f}) print(f峰度: {train[SalePrice].kurt():.2f})当偏度1时必须进行对数变换train[SalePrice] np.log1p(train[SalePrice])2.2 特征相关性三维分析传统热力图只能显示两两相关性我们采用更立体的分析方法数值型特征计算Pearson相关系数类别型特征使用ANOVA方差分析混合类型采用肯德尔等级相关系数# 筛选TOP10相关特征 corr_matrix train.corr() top_features corr_matrix[SalePrice].abs().sort_values(ascendingFalse)[1:11].index # 绘制特征关系矩阵图 sns.pairplot(train[top_features], plot_kws{alpha:0.6, s:30, edgecolor:k}, height2.5) plt.show()3. 高级特征工程策略3.1 缺失值处理的五层逻辑面对缺失数据我们建立分级处理方案缺失比例处理方式示例特征80%直接删除PoolQC50%-80%标记为特殊值Alley20%-50%分组填充LotFrontage20%统计量填充GarageYrBlt随机缺失模型预测MasVnrArea具体实现代码# 高缺失率特征处理 all_data.drop([PoolQC, MiscFeature], axis1, inplaceTrue) # 中等缺失率特征 all_data[Alley] all_data[Alley].fillna(NoAlley) # 低缺失率数值特征 all_data[LotFrontage] all_data.groupby(Neighborhood)[LotFrontage].transform( lambda x: x.fillna(x.median()))3.2 特征创造的四象限法则优秀特征工程需要平衡创造力和实用性空间特征TotalSF TotalBsmtSF 1stFlrSF 2ndFlrSF时间特征HouseAge YrSold - YearBuilt组合特征BathRatio FullBath / (HalfBath 0.1)交互特征Qual_GrLivArea OverallQual * GrLivArea# 创建空间特征示例 all_data[TotalSF] all_data[TotalBsmtSF] all_data[1stFlrSF] all_data[2ndFlrSF] # 创建时间特征 all_data[HouseAge] all_data[YrSold] - all_data[YearBuilt] all_data[RemodAge] all_data[YrSold] - all_data[YearRemodAdd]4. XGBoost模型构建与调优4.1 基础模型搭建先建立基线模型后续优化才有参照from xgboost import XGBRegressor from sklearn.model_selection import cross_val_score xgb XGBRegressor(random_state42) scores cross_val_score(xgb, X_train, y_train, scoringneg_mean_squared_error, cv5) rmse_scores np.sqrt(-scores) print(f基线RMSE: {rmse_scores.mean():.4f} (±{rmse_scores.std():.4f}))4.2 网格搜索与贝叶斯优化对比传统网格搜索耗时长我们采用更智能的优化方式from skopt import BayesSearchCV param_space { learning_rate: (0.01, 0.3, log-uniform), max_depth: (3, 10), subsample: (0.5, 1.0), colsample_bytree: (0.5, 1.0), n_estimators: (100, 500), gamma: (0, 5) } bayes_cv BayesSearchCV( estimatorXGBRegressor(random_state42), search_spacesparam_space, scoringneg_mean_squared_error, cv5, n_iter30, verbose1 ) bayes_cv.fit(X_train, y_train) print(f最佳参数: {bayes_cv.best_params_})4.3 特征重要性分析与模型解释理解模型决策逻辑比单纯追求精度更重要import shap explainer shap.TreeExplainer(bayes_cv.best_estimator_) shap_values explainer.shap_values(X_train) # 绘制全局重要性 shap.summary_plot(shap_values, X_train, plot_typebar) # 绘制单个样本解释 shap.force_plot(explainer.expected_value, shap_values[0,:], X_train.iloc[0,:])5. 竞赛技巧与避坑指南5.1 数据泄露的四种常见场景时间信息误用使用未来数据预测过去全局统计量在划分训练测试集前做标准化目标编码未采用分层编码导致信息泄露特征选择基于完整数据集选择特征正确做法示例from sklearn.model_selection import train_test_split X_train, X_val, y_train, y_val train_test_split( X, y, test_size0.2, random_state42) # 只在训练集上计算统计量 mean X_train[LotFrontage].mean() std X_train[LotFrontage].std() # 应用到验证集 X_val[LotFrontage] (X_val[LotFrontage] - mean) / std5.2 集成策略的三重奏模型多样性结合线性模型和树模型数据多样性使用不同子样本训练特征多样性多种特征选择结果融合from sklearn.ensemble import StackingRegressor from sklearn.linear_model import LassoCV estimators [ (xgb, XGBRegressor(**bayes_cv.best_params_)), (lasso, LassoCV(alphas[0.0005, 0.001, 0.005, 0.01])) ] stack StackingRegressor( estimatorsestimators, final_estimatorXGBRegressor( learning_rate0.05, max_depth3, n_estimators300) ) stack.fit(X_train, y_train)6. 结果提交与持续优化6.1 测试集处理的一致性确保测试集与训练集处理完全一致# 应用相同的特征工程 test[TotalSF] test[TotalBsmtSF] test[1stFlrSF] test[2ndFlrSF] test[HouseAge] test[YrSold] - test[YearBuilt] # 应用相同的缺失值处理 test[LotFrontage] test.groupby(Neighborhood)[LotFrontage].transform( lambda x: x.fillna(x.median())) # 确保类别特征一致 train_columns X_train.columns test pd.get_dummies(test) test test.reindex(columnstrain_columns, fill_value0)6.2 模型融合的加权策略不同模型赋予不同权重往往能提升效果xgb_pred bayes_cv.predict(test) lasso_pred lasso_cv.predict(test) stack_pred stack.predict(test) # 加权融合 final_pred 0.6*xgb_pred 0.2*lasso_pred 0.2*stack_pred final_pred np.expm1(final_pred) # 还原对数变换在Kaggle竞赛中我通常会保存多个版本的预测结果然后根据Public Leaderboard的反馈调整融合权重。记住最终提交前一定要检查预测值的分布是否合理避免出现极端异常值。
保姆级教程:用XGBoost和Python搞定Kaggle房价预测(附完整代码与数据清洗避坑指南)
发布时间:2026/5/28 9:42:29
从零开始Kaggle房价预测实战全流程解析与XGBoost优化指南房价预测一直是机器学习入门的热门课题而Kaggle的House Prices竞赛更是无数数据科学家的第一站。本文将带你完整走一遍从数据探索到模型调优的全流程重点解决三个核心问题如何正确理解数据分布如何处理高缺失率特征如何构建高效的XGBoost模型我们将用超过20个代码片段和15个可视化案例揭示每个步骤背后的思考逻辑。1. 环境准备与数据初探工欲善其事必先利其器。我们先配置好Python环境建议使用Anaconda创建独立环境conda create -n house_price python3.8 conda activate house_price pip install pandas numpy matplotlib seaborn xgboost scikit-learn数据集下载后第一个关键动作是理解数据全貌。不同于常规的head()查看前几行专业做法是先构建数据字典import pandas as pd train pd.read_csv(train.csv) test pd.read_csv(test.csv) # 合并数据集便于统一处理 all_data pd.concat([train, test], axis0, ignore_indexTrue) print(f训练集形状: {train.shape}, 测试集形状: {test.shape})数据质量检查清单重复值all_data.duplicated().sum()数据类型all_data.dtypes.value_counts()缺失概况all_data.isnull().sum().sort_values(ascendingFalse)[:15]2. 深度数据探索与异常处理2.1 目标变量分析房价(SalePrice)的分布决定后续处理策略。使用Seaborn绘制分布图时要关注三个关键指标import numpy as np import seaborn as sns from scipy import stats fig, (ax1, ax2) plt.subplots(1, 2, figsize(12,5)) sns.histplot(train[SalePrice], kdeTrue, axax1) stats.probplot(train[SalePrice], plotax2) plt.show() # 计算偏度和峰度 print(f偏度: {train[SalePrice].skew():.2f}) print(f峰度: {train[SalePrice].kurt():.2f})当偏度1时必须进行对数变换train[SalePrice] np.log1p(train[SalePrice])2.2 特征相关性三维分析传统热力图只能显示两两相关性我们采用更立体的分析方法数值型特征计算Pearson相关系数类别型特征使用ANOVA方差分析混合类型采用肯德尔等级相关系数# 筛选TOP10相关特征 corr_matrix train.corr() top_features corr_matrix[SalePrice].abs().sort_values(ascendingFalse)[1:11].index # 绘制特征关系矩阵图 sns.pairplot(train[top_features], plot_kws{alpha:0.6, s:30, edgecolor:k}, height2.5) plt.show()3. 高级特征工程策略3.1 缺失值处理的五层逻辑面对缺失数据我们建立分级处理方案缺失比例处理方式示例特征80%直接删除PoolQC50%-80%标记为特殊值Alley20%-50%分组填充LotFrontage20%统计量填充GarageYrBlt随机缺失模型预测MasVnrArea具体实现代码# 高缺失率特征处理 all_data.drop([PoolQC, MiscFeature], axis1, inplaceTrue) # 中等缺失率特征 all_data[Alley] all_data[Alley].fillna(NoAlley) # 低缺失率数值特征 all_data[LotFrontage] all_data.groupby(Neighborhood)[LotFrontage].transform( lambda x: x.fillna(x.median()))3.2 特征创造的四象限法则优秀特征工程需要平衡创造力和实用性空间特征TotalSF TotalBsmtSF 1stFlrSF 2ndFlrSF时间特征HouseAge YrSold - YearBuilt组合特征BathRatio FullBath / (HalfBath 0.1)交互特征Qual_GrLivArea OverallQual * GrLivArea# 创建空间特征示例 all_data[TotalSF] all_data[TotalBsmtSF] all_data[1stFlrSF] all_data[2ndFlrSF] # 创建时间特征 all_data[HouseAge] all_data[YrSold] - all_data[YearBuilt] all_data[RemodAge] all_data[YrSold] - all_data[YearRemodAdd]4. XGBoost模型构建与调优4.1 基础模型搭建先建立基线模型后续优化才有参照from xgboost import XGBRegressor from sklearn.model_selection import cross_val_score xgb XGBRegressor(random_state42) scores cross_val_score(xgb, X_train, y_train, scoringneg_mean_squared_error, cv5) rmse_scores np.sqrt(-scores) print(f基线RMSE: {rmse_scores.mean():.4f} (±{rmse_scores.std():.4f}))4.2 网格搜索与贝叶斯优化对比传统网格搜索耗时长我们采用更智能的优化方式from skopt import BayesSearchCV param_space { learning_rate: (0.01, 0.3, log-uniform), max_depth: (3, 10), subsample: (0.5, 1.0), colsample_bytree: (0.5, 1.0), n_estimators: (100, 500), gamma: (0, 5) } bayes_cv BayesSearchCV( estimatorXGBRegressor(random_state42), search_spacesparam_space, scoringneg_mean_squared_error, cv5, n_iter30, verbose1 ) bayes_cv.fit(X_train, y_train) print(f最佳参数: {bayes_cv.best_params_})4.3 特征重要性分析与模型解释理解模型决策逻辑比单纯追求精度更重要import shap explainer shap.TreeExplainer(bayes_cv.best_estimator_) shap_values explainer.shap_values(X_train) # 绘制全局重要性 shap.summary_plot(shap_values, X_train, plot_typebar) # 绘制单个样本解释 shap.force_plot(explainer.expected_value, shap_values[0,:], X_train.iloc[0,:])5. 竞赛技巧与避坑指南5.1 数据泄露的四种常见场景时间信息误用使用未来数据预测过去全局统计量在划分训练测试集前做标准化目标编码未采用分层编码导致信息泄露特征选择基于完整数据集选择特征正确做法示例from sklearn.model_selection import train_test_split X_train, X_val, y_train, y_val train_test_split( X, y, test_size0.2, random_state42) # 只在训练集上计算统计量 mean X_train[LotFrontage].mean() std X_train[LotFrontage].std() # 应用到验证集 X_val[LotFrontage] (X_val[LotFrontage] - mean) / std5.2 集成策略的三重奏模型多样性结合线性模型和树模型数据多样性使用不同子样本训练特征多样性多种特征选择结果融合from sklearn.ensemble import StackingRegressor from sklearn.linear_model import LassoCV estimators [ (xgb, XGBRegressor(**bayes_cv.best_params_)), (lasso, LassoCV(alphas[0.0005, 0.001, 0.005, 0.01])) ] stack StackingRegressor( estimatorsestimators, final_estimatorXGBRegressor( learning_rate0.05, max_depth3, n_estimators300) ) stack.fit(X_train, y_train)6. 结果提交与持续优化6.1 测试集处理的一致性确保测试集与训练集处理完全一致# 应用相同的特征工程 test[TotalSF] test[TotalBsmtSF] test[1stFlrSF] test[2ndFlrSF] test[HouseAge] test[YrSold] - test[YearBuilt] # 应用相同的缺失值处理 test[LotFrontage] test.groupby(Neighborhood)[LotFrontage].transform( lambda x: x.fillna(x.median())) # 确保类别特征一致 train_columns X_train.columns test pd.get_dummies(test) test test.reindex(columnstrain_columns, fill_value0)6.2 模型融合的加权策略不同模型赋予不同权重往往能提升效果xgb_pred bayes_cv.predict(test) lasso_pred lasso_cv.predict(test) stack_pred stack.predict(test) # 加权融合 final_pred 0.6*xgb_pred 0.2*lasso_pred 0.2*stack_pred final_pred np.expm1(final_pred) # 还原对数变换在Kaggle竞赛中我通常会保存多个版本的预测结果然后根据Public Leaderboard的反馈调整融合权重。记住最终提交前一定要检查预测值的分布是否合理避免出现极端异常值。