机器学习实践项目(二)- 房价预测 - 训练模型
从模型到预测:Kaggle房价预测实战指南
📘 系列第三篇:正式进入建模阶段。我们将训练岭回归与随机森林两种模型,并通过模型融合(Ensemble)提高预测性能。
📖 目录
- 回顾数据准备
- 岭回归(Ridge)模型
- 随机森林(RandomForest)模型
- 模型融合(Ensemble)
- 生成提交文件
- 小结
一、回顾数据准备
在前两篇中,我们已经完成了以下步骤:
- 对目标值取对数:
y_train = np.log1p(train_df.pop("SalePrice")) - 将训练集与测试集合并;
- One-Hot 编码;
- 缺失值填补与标准化;
- 生成
X_train,X_test。
现在我们要把这些干净的特征输入模型,开始训练预测。
二、岭回归(Ridge Regression)
岭回归是一种带有 L2 正则化 的线性模型,能有效缓解特征之间的多重共线性问题。
我们先使用交叉验证(Cross Validation)寻找最佳正则化系数 α:
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
import numpy as np
import matplotlib.pyplot as pltalphas = np.logspace(-3, 2, 50)
test_scores = []for alpha in alphas:ridge = Ridge(alpha=alpha)score = np.sqrt(-cross_val_score(ridge, X_train, y_train,cv=10, scoring='neg_mean_squared_error'))test_scores.append(np.mean(score))plt.plot(alphas, test_scores)
plt.title('Alpha vs CV Error')
plt.xlabel('Alpha')
plt.ylabel('RMSE')
plt.show()
✅ 一般来说,
alpha越小,模型越容易过拟合;alpha越大,模型越平滑。
通过曲线找到最低 RMSE 对应的 α 值(如 16),即可作为最优参数。
三、随机森林(Random Forest)
随机森林是一种基于多棵决策树的集成模型,能自动捕捉非线性关系。
from sklearn.ensemble import RandomForestRegressormax_features = [.1, .3, .5, .7, .9, .99]
test_scores = []for mf in max_features:rf = RandomForestRegressor(n_estimators=200, max_features=mf)score = np.sqrt(-cross_val_score(rf, X_train, y_train,cv=10, scoring='neg_mean_squared_error'))test_scores.append(np.mean(score))plt.plot(max_features, test_scores)
plt.title('Max Features vs CV Error')
plt.xlabel('max_features')
plt.ylabel('RMSE')
plt.show()
一般来说,
max_features越小,单棵树差异越大,泛化性更好。
我们选择 RMSE 最低对应的参数(例如 0.3)。
四、模型融合(Ensemble)
融合(Blending)能综合不同模型的优势,让预测更稳健。
在这里我们将岭回归(线性趋势)和随机森林(非线性特征)进行平均融合。
ridge = Ridge(alpha=16)
rf = RandomForestRegressor(n_estimators=500, max_features=.3)ridge.fit(X_train, y_train)
rf.fit(X_train, y_train)# 反取对数,恢复到真实价格空间
y_ridge = np.expm1(ridge.predict(X_test))
y_rf = np.expm1(rf.predict(X_test))# 简单平均融合
y_final = (y_ridge + y_rf) / 2
✅ 这种“简单平均”在 Kaggle 比赛中非常常见,
因为它能平衡模型偏差与方差,提升总体稳定性。
五、生成提交文件
将预测结果保存成 Kaggle 要求的格式并输出:
submission_df = pd.DataFrame({'Id': test_df.Id,'SalePrice': y_final
})
submission_df.to_csv('./output/house_submission.csv', index=False)
生成的
house_submission.csv就可以直接上传到 Kaggle 平台进行评测啦!
六、小结
| 模型 | 特点 | 适用场景 |
|---|---|---|
| 岭回归 | 稳定、可解释 | 线性趋势主导特征 |
| 随机森林 | 捕捉非线性、鲁棒性强 | 特征复杂场景 |
| 融合模型 | 兼顾两者优势 | 实战首选方案 |
🏁 系列总结
| 篇章 | 内容 | 关键步骤 |
|---|---|---|
| 第一篇 | 数据理解与字段分析 | 明确字段类型与目标分布 |
| 第二篇 | 数据清洗与特征工程 | One-Hot、标准化、缺失处理 |
| 第三篇 | 模型训练与融合预测 | 岭回归 + 随机森林 + 提交 |
🚀 至此,我们完成了 Kaggle 房价预测项目的完整流程:
从数据理解 → 清洗 → 建模 → 融合 → 提交。
如果你希望进一步提升分数,可以尝试 LightGBM、XGBoost 或 Stacking 模型。
