jeffreyjoy271114/House_Price_Detection

GitHub: jeffreyjoy271114/House_Price_Detection

一个完整的机器学习管道,利用特征工程与多模型比较实现住宅房价预测。

Stars: 0 | Forks: 0

# 🏠 房价预测 ### 深入回归分析 — 不对目标变量进行对数变换 ![Python](https://img.shields.io/badge/Python-3.x-blue?style=flat-square) ![scikit-learn](https://img.shields.io/badge/scikit--learn-ML-orange?style=flat-square) ![XGBoost](https://img.shields.io/badge/XGBoost-Regressor-green?style=flat-square) ![Pandas](https://img.shields.io/badge/Pandas-Data-purple?style=flat-square) ![Seaborn](https://img.shields.io/badge/Seaborn-Viz-teal?style=flat-square) ![Random Forest](https://img.shields.io/badge/Random_Forest-Ensemble-blue?style=flat-square) ![Feature Engineering](https://img.shields.io/badge/Feature_Engineering-✓-blueviolet?style=flat-square) 一个完整的机器学习管道,用于预测住宅房价 — 涵盖探索性数据分析(EDA)、特征工程、异常值处理、目标编码以及在线性回归、随机森林和 XGBoost 之间的模型比较。 ## 📊 数据集概览 | 属性 | 值 | |---|---| | 总行数 | 4,600 | | 原始特征数 | 18 | | 空值数量 | 0 | | 目标列 | `price`(float64) | | 位置 | 美国华盛顿州 | | 唯一邮政编码数 | 77 | ## 🔁 流水线步骤 | # | 步骤 | 细节 | |---|---|---| | 1 | **数据加载与 EDA** | `df.info()`、`df.shape`、对 `city`、`statezip`、`country` 进行 `value_counts` | | 2 | **列裁剪** | 删除 `street`(每行唯一)、`country`(全为 "USA")、`statezip`(由 `zip_code` 替代) | | 3 | **类型转换** | `date` → datetime64,`city` 与 `zip_code` → 类别,`floors` → 类别 | | 4 | **可视化** | 直方图 + KDE、箱线图(数值型)、计数图(分类型)、与价格的散点图、相关性热图 | | 5 | **特征工程** | `has_basement`、`house_age`(2026 − yr_built)、`is_renovated`、`total_sqft` | | 6 | **异常值处理** | 删除卧室数 ≤ 0 或 ≥ 7 的样本;将价格上限设为第 99 百分位数 | | 7 | **目标编码** | 用各组平均价格替换 `zip_code` 和 `city`(修复 OHE 噪声) | | 8 | **泄漏移除** | 删除 `price_per_sqft` — 由目标变量派生 | | 9 | **模型训练与评估** | 线性回归、随机森林(×2 次迭代)、XGBoost — 使用 5 折交叉验证 | ## 🤖 模型结果 | 模型 | 测试 R² | CV 平均 R² | 备注 | |---|---|---|---| | 线性回归 | ❌ 错误 | — | 训练/测试尺度不匹配错误 | | 随机森林(OHE) | 0.664 | — | 基线 | | 随机森林(目标编码) | 0.716 | 0.701 | 使用目标编码后提升 | | **XGBoost** | **0.724** | **0.683** | 表现最佳模型 | ## 🏆 重要特征(随机森林 / XGBoost) | 特征 | 重要性 | 备注 | |---|---|---| | `sqft_living` | ~44% | 最强预测因子 | | `zip_code_encoded` | ~35% | 通过目标编码的位置信号 | | `price_per_sqft` | — | ❌ 已删除 — 数据泄漏 | | `total_sqft` | ~6% | engineered 特征 | | `house_age` | ~4% | 从 `yr_built` 派生 | | `city_encoded` | ~3% | 通过目标编码的位置信号 | | `view`、`bathrooms`、`sqft_lot`、`bedrooms` | < 3% | 辅助特征 | ## 💡 关键决策与经验 ✅ **目标编码优于 OHE** — 对 `zip_code` 和 `city` 使用 one-hot 编码会产生 70 多列稀疏特征且重要性接近零,仅引入噪声。改用目标编码后,R² 从 0.664 提升至 0.716。 ⚠️ **有意跳过对数变换** — 笔记本标题体现了这一设计选择。注释掉的 `np.log1p()` 单元格保留用于比较两种方法。 ✅ **`yr_built` → `house_age`** — 转换后提升了模型的可解释性,并与房价呈现更线性的关系。 ⚠️ **发现并修复数据泄漏** — `price_per_sqft` 使 R² 虚增至约 0.91,因为它在公式中包含了目标变量 `price`。在最终评估前正确识别并移除了该特征。 ## ⚙️ 运行方式 ``` pip install pandas numpy seaborn matplotlib scikit-learn xgboost imbalanced-learn ``` 将 `House_Prices.csv` 放在同一目录中,然后打开并运行以下所有单元格: ``` House_Price_Prediction_Without_Log_Transform_on_the_Target.ipynb ``` ## 📁 项目结构 ``` ├── House_Price_Prediction_Without_Log_Transform_on_the_Target.ipynb ├── House_Prices.csv └── README.md ```
标签:Apex, Python, scikit-learn, Seaborn, XGBoost, 价格预测, 住宅, 华盛顿州, 回归分析, 回归模型, 异常值处理, 房价预测, 房地产, 散点图, 数据清洗, 无后门, 机器学习, 柱状图, 模型比较, 模型评估, 特征工程, 特征选择, 相关性分析, 端到端项目, 箱线图, 编码, 逆向工具, 随机森林