jeffreyjoy271114/House_Price_Detection
GitHub: jeffreyjoy271114/House_Price_Detection
一个完整的机器学习管道,利用特征工程与多模型比较实现住宅房价预测。
Stars: 0 | Forks: 0
# 🏠 房价预测
### 深入回归分析 — 不对目标变量进行对数变换
      
一个完整的机器学习管道,用于预测住宅房价 — 涵盖探索性数据分析(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, 价格预测, 住宅, 华盛顿州, 回归分析, 回归模型, 异常值处理, 房价预测, 房地产, 散点图, 数据清洗, 无后门, 机器学习, 柱状图, 模型比较, 模型评估, 特征工程, 特征选择, 相关性分析, 端到端项目, 箱线图, 编码, 逆向工具, 随机森林