终于,前面步骤都完成了,需要进行最后的步骤了。
这段代码是整个项目的最后阶段 ——
把在交叉验证里选出的最优模型(或者微调后的模型)
用全部训练数据重新训练一次,
然后在测试集上预测房价,并导出 Kaggle 提交文件。
🧱 一、逻辑概览
| 步骤 | 内容 | 目的 |
|---|---|---|
| ① | 构建最终管道 final_pipe | 整合数据预处理与模型 |
| ② | 用全部训练数据 .fit(X, y) | 用所有样本学到最稳定模型 |
| ③ | 在测试集上 .predict(X_test) | 得到房价预测 |
| ④ | 生成提交文件 submission.csv | Kaggle 上传评测 |
🧩 二、构建最终管道
if best_estimator is None:
best_model = candidates[best_name]
final_pipe = Pipeline(steps=[
("prep", preprocess),
("reg", TransformedTargetRegressor(regressor=best_model, func=np.log1p, inverse_func=np.expm1))
])
else:
final_pipe = best_estimator
解释:
1️⃣ best_estimator is None
- 表示你没有进行第 4.1 小网格微调。
- 那么就用在第 5 步选出的最优基础模型(
best_model)重新组装一个完整管道。
✅ 这个管道包含两个部分:
"prep":数据预处理(缺失值填充、标准化、One-Hot)"reg":目标变换回归器(TransformedTargetRegressor)
TransformedTargetRegressor(
regressor=best_model,
func=np.log1p, # 训练时:对 SalePrice 取 log1p
inverse_func=np.expm1 # 预测时:自动还原回真实价格
)
TTR 的作用:
它相当于自动在模型前后加上一个“目标变换器”:
- 拟合前对 y 取对数;
- 预测后对结果做指数还原。
所以整个管道能自动处理 log(y) 训练、exp(y) 预测,避免手动转换出错。
2️⃣ else:
final_pipe = best_estimator
- 如果你之前做过 HistGBR 小网格调参(4.1),
那么best_estimator已经是“预处理 + 模型 + 最优参数”的完整管道。 - 直接用它即可,无需重新组装。
🧠 三、用全部训练数据训练模型
final_pipe.fit(X, y)
- 之前在交叉验证中,我们每次只用 80% 数据训练、20% 验证。
- 现在已经确定了最优模型,不再需要验证。
👉 用全部训练集重新训练一次模型,能让它学到更多模式、参数更稳。
🔮 四、在测试集上预测
test_pred = final_pipe.predict(X_test)
test_pred = np.clip(test_pred, 0, None)
.predict(X_test):在测试集上做预测。- 因为用了
TransformedTargetRegressor,预测结果已经是还原后的房价(SalePrice)。 np.clip(test_pred, 0, None):保险处理,防止出现负数预测(虽然理论上不会)。
🧾 五、生成 Kaggle 提交文件
submission = pd.DataFrame({"Id": test["Id"], "SalePrice": test_pred})
SAVE_PATH = "submission.csv" if best_estimator is None else "submission_tuned.csv"
submission.to_csv(SAVE_PATH, index=False)
print(f"\nSaved => {os.path.abspath(SAVE_PATH)}")
-
Kaggle 提交文件格式要求:
Id SalePrice 1461 169000.0 1462 187000.0 … … -
index=False避免 DataFrame 索引出现在 CSV 中。 -
如果你做了 4.1 微调,就命名为
submission_tuned.csv;否则是普通的submission.csv。 -
最后一行打印文件绝对路径,方便确认。
📈 六、结果评估建议(注释里的提示)
# 提示:比较本地 CV 均值(results[best_name][0])与 Kaggle Public LB 的差距:
# 若差距 < 0.02(越小越好),说明验证策略已较好对齐,可以进一步做 stacking / 更多特征探索等。
意思是:
- 你的本地交叉验证 RMSE(
results[best_name][0])
和 Kaggle 公榜 RMSE 应该尽量接近(差 < 0.02)。 - 如果差距很大(比如本地 0.12, Kaggle 0.16),
说明验证分布或特征工程不匹配,需要调整(例如 StratifiedKFold 的桶数或特征缺失处理)。
✅ 七、总结一句话
这段代码完成了从“交叉验证结果 → 最终模型 → 生成提交文件”的闭环:
| 阶段 | 动作 | 目的 |
|---|---|---|
| 构建管道 | 统一预处理+模型+log变换 | 保证预测一致性 |
| 训练全量 | 用全部数据拟合模型 | 提高最终性能 |
| 预测测试 | 输出预测结果 | 生成提交值 |
| 导出 CSV | Kaggle 可直接上传 | 完成比赛流程 |
好啦,这个项目结束了。我们前后用了两种方法进行了处理,一种是比较粗放的方法,特征工程简单易懂,当然成绩也仅仅堪堪及格;另一种就是比较精细地处理了数据再进行预测,分数也比前一种好得多。我们让爱老师来整理一下做完这个项目后我们的收获吧。
🧭 一、整体收获总览
| 模块 | 收获主题 | 具体能力提升 |
|---|---|---|
| 🧹 数据理解与预处理 | 理解数据字段、类型、分布 | 能分析数值型与类别型变量,识别伪数值列 |
| 🔧 特征工程 | 缺失值处理、特征构造、编码转换 | 会用 get_dummies()、均值填补、标准化、目标编码 |
| 📊 模型训练与验证 | 建模、交叉验证、误差评估 | 掌握 Ridge、Lasso、ElasticNet、HistGBR 等模型的使用 |
| 🧠 参数优化 | 网格搜索与微调 | 能根据模型特性挑选关键超参数并调优 |
| 📈 模型融合与预测 | 集成不同模型结果 | 了解线性模型+树模型融合的思路,提高稳定性 |
| 🧾 提交与评估 | Kaggle 提交流程与分数分析 | 能把模型输出转为 Kaggle 提交文件,比较 CV 与 LB |
| 💡 思维方式 | 机器学习项目化思维 | 从数据清洗→建模→评估→部署形成完整闭环 |
📘 二、分阶段学习收获(按项目流程)
| 阶段 | 做了什么 | 学到了什么 |
|---|---|---|
| 1️⃣ 数据加载与探索 (EDA) | 读取 train/test、查看列、画直方图 | 学会快速了解数据结构、分布与异常值 |
| 2️⃣ 数据清洗 | 处理缺失值、转换伪数值列 | 认识到数据质量对模型的重要性 |
| 3️⃣ 特征工程 | 构造新特征(TotalSF、BathTotal等)、目标编码 | 掌握让模型“看懂”更多信息的技巧 |
| 4️⃣ 数据标准化与独热编码 | 数值特征标准化、类别转 One-Hot | 理解机器学习算法对特征数值范围的敏感性 |
| 5️⃣ 模型训练 | 试多种模型:Ridge/Lasso/ElasticNet/HistGBR | 明白不同模型的优缺点(线性 vs 非线性) |
| 6️⃣ 交叉验证 | 使用 StratifiedKFold + log-space RMSE | 学会避免过拟合、正确评估模型表现 |
| 7️⃣ 参数微调 | 小网格调参(learning_rate、max_leaf_nodes 等) | 能够有针对性地优化模型性能 |
| 8️⃣ 最终训练与预测 | 用全量数据训练最佳模型并生成提交文件 | 完成一个机器学习项目的完整闭环 |
| 9️⃣ 分数分析与对比 | 比较本地 RMSE 与 Kaggle LB | 学会验证集对齐、理解模型泛化性 |
🧩 三、技术能力图谱(技能树形式)
| 领域 | 学到的关键工具 / 概念 |
|---|---|
| 数据分析 | pandas、numpy、matplotlib、数据类型分析 |
| 特征处理 | 缺失值填补 (fillna)、标准化 (StandardScaler)、One-Hot、目标编码 |
| 模型构建 | Ridge、Lasso、ElasticNet、HistGradientBoostingRegressor |
| 模型评估 | RMSE、交叉验证 (KFold, StratifiedKFold)、OOF 验证思维 |
| 模型优化 | GridSearchCV、小网格调参、参数平滑、防止过拟合 |
| 特征工程思维 | 特征组合、比例特征、布尔特征(HasGarage等) |
| 模型融合 | Ridge + RandomForest 平均融合,提高稳定性 |
| 工具与工程化 | sklearn Pipeline、ColumnTransformer、TransformedTargetRegressor |
| Kaggle 实战技能 | 提交文件格式、分数对齐、Public/Private 差距分析 |
🌱 四、方法论与思维层面的提升
| 类别 | 思维转变 |
|---|---|
| 从“代码”到“项目” | 不只是写模型,而是要理解数据、验证策略、提交结果整个流程 |
| 从“堆模型”到“验证科学” | 明白交叉验证比盲目调参更重要 |
| 从“默认参数”到“主动优化” | 学会针对数据问题精调关键参数 |
| 从“结果”到“解释” | 理解模型结果背后的特征含义与贡献 |
| 从“独立算法”到“管道化工程” | 掌握 sklearn Pipeline,把预处理、建模整合为一体 |
💡 五、个人成长总结
- 掌握了从数据清洗 → 特征工程 → 建模 → 评估 → 提交的完整机器学习项目流程。
- 理解并实现了交叉验证、分层折(StratifiedKFold)与 OOF 目标编码等核心技术。
- 熟悉 Ridge、Lasso、ElasticNet、树模型的特点与调参思路。
- 能独立构建 sklearn Pipeline 管道,提高代码复用性与可维护性。
- 具备分析验证分布差异、评估模型泛化性能的意识。
- 提升了问题分析、实验设计与结果解释的系统思维。
2542

被折叠的 条评论
为什么被折叠?



