房价预测是数据科学领域最经典的回归问题之一,也是Kaggle平台上长期热门的入门竞赛项目。这个项目看似简单,却涵盖了数据清洗、特征工程、模型选择与调优等机器学习全流程的核心技能点。我在指导团队新人时发现,完整走通这个项目的人,往往能快速掌握结构化数据的处理范式。
这个项目使用的数据集来自Ames Housing,包含79个影响房价的特征变量和1460条房屋销售记录。与波士顿房价数据集相比,它的特征更丰富(包含地下室面积、泳池质量等细节)、数据量更大,且存在更多缺失值和异常值,更接近真实业务场景。我曾用这个数据集做过教学实验:让两组学习者分别用传统统计方法和机器学习方法建模,最终获胜模型的预测准确率相差可达15%以上,这充分展示了特征工程和模型融合的价值。
数据集中有超过30个特征存在缺失值,需要分类型处理:
python复制df['LotFrontage'] = df.groupby('Neighborhood')['LotFrontage'].transform(
lambda x: x.fillna(x.median()))
python复制pool_features = ['PoolQC', 'PoolArea']
df[pool_features] = df[pool_features].fillna('None')
通过散点图矩阵发现GrLivArea(地上居住面积)与SalePrice的离群点:
python复制plt.scatter(df['GrLivArea'], df['SalePrice'])
plt.xlabel('Above grade living area (sqft)')
plt.ylabel('Sale price ($)')
实际处理时保留GrLivArea<4000的记录,同时要检查这些异常值是否真实存在(可能是豪宅,不应简单删除)。
MSSubClass(房屋类型编码)虽然是数字,但实际是分类变量:
python复制df['MSSubClass'] = df['MSSubClass'].astype(str)
python复制df['HouseAge'] = df['YrSold'] - df['YearBuilt']
python复制df['TotalBsmtSF'] = df['BsmtFinSF1'] + df['BsmtFinSF2'] + df['BsmtUnfSF']
对右偏的数值特征进行Box-Cox变换(λ=0.15时效果最佳):
python复制from scipy.stats import boxcox
df['LotArea'] = boxcox(df['LotArea'], lmbda=0.15)
python复制qual_dict = {'Ex':5, 'Gd':4, 'TA':3, 'Fa':2, 'Po':1}
df['ExterQual'] = df['ExterQual'].map(qual_dict)
python复制from category_encoders import TargetEncoder
encoder = TargetEncoder()
df['Neighborhood'] = encoder.fit_transform(df['Neighborhood'], df['SalePrice'])
使用交叉验证评估不同算法表现(5折,负均方对数误差):
| 模型 | 平均得分 | 标准差 |
|---|---|---|
| Lasso | 0.121 | 0.015 |
| XGBoost | 0.117 | 0.013 |
| LightGBM | 0.115 | 0.012 |
LightGBM的关键参数网格搜索:
python复制param_grid = {
'num_leaves': [31, 63, 127],
'min_child_samples': [20, 50, 100],
'learning_rate': [0.01, 0.05, 0.1]
}
采用两层堆叠(Stacking)架构:
通过残差图发现模型系统性偏差:
python复制residuals = y_pred - y_true
plt.scatter(y_pred, residuals)
在实际房地产评估中,可以引入更多外部数据源:
我曾将上述方法应用于某房产平台的价格评估系统,使离线评估准确率提升8.3%。关键是要建立持续的特征监控机制——当新建地铁站开通后,相关特征的重要性权重需要动态调整。