
比赛描述
如果让购房者描述理想中的房子,他们可能不会提到"地下室天花板高度"或"东西向铁路距离"这样的细节。但本次比赛的数据集证明,房价谈判的影响因素远不止卧室数量或白色栅栏。
数据集包含79个特征变量 ,几乎涵盖了美国爱荷华州埃姆斯市住宅的方方面面。你的任务是预测每栋房子的最终售价。
实践技能:
- 创造性的特征工程
- 高级回归技术(如随机森林、梯度提升树)
数据集来源 :
由Dean De Cock整理,专为数据科学教育设计。作为波士顿房价数据集的现代升级版,它为数据科学家提供了更丰富的分析素材。
data:
train.csv

test.csv

代码
1. 环境准备与数据加载
ini
# 环境设置
import torch
import pandas as pd
# 加载数据
train_data = pd.read_csv('D:/kaggle/house/train.csv') # 训练集 (1460, 81)
test_data = pd.read_csv('D:/kaggle/house/test.csv') # 测试集 (1459, 80)
-
输入数据:
- 训练集:1460条样本,81列(80特征 + 1标签
SalePrice
) - 测试集:1459条样本,80列(无标签)
- 训练集:1460条样本,81列(80特征 + 1标签
2. 数据预处理
(1) 合并特征
css
all_features = pd.concat((train_data.iloc[:, 1:-1], test_data.iloc[:, 1:]))
- 合并训练集和测试集的特征(排除训练集的
Id
和SalePrice
列),便于统一处理。
(2) 数值特征标准化
less
numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index
all_features[numeric_features] = all_features[numeric_features].apply(
lambda x: (x - x.mean()) / (x.std()))
all_features[numeric_features] = all_features[numeric_features].fillna(0)
- 标准化:对数值特征进行Z-score标准化(均值=0,标准差=1)。
- 缺失值处理:标准化后用0填充缺失值(因均值已为0)。
(3) 类别特征编码
ini
all_features = pd.get_dummies(all_features, dummy_na=True)
- 使用独热编码(One-Hot Encoding)处理类别特征,
dummy_na=True
将缺失值也视为独立类别。 - 最终特征维度:331维(原始79维 → 编码后扩展)。
(4) 转换为PyTorch张量
ini
n_train = train_data.shape[0]
train_features = torch.tensor(all_features[:n_train].values, dtype=torch.float)
test_features = torch.tensor(all_features[n_train:].values, dtype=torch.float)
train_labels = torch.tensor(train_data.SalePrice.values, dtype=torch.float).view(-1, 1)
- 将处理后的数据转换为PyTorch张量,标签
SalePrice
调整为列向量。
3. 模型定义
线性回归模型
csharp
def get_net(feature_num):
net = nn.Linear(feature_num, 1) # 单层线性层
nn.init.normal_(net.weight, mean=0, std=0.01) # 权重初始化
nn.init.constant_(net.bias, 0) # 偏置初始化为0
return net
- 使用简单的线性模型(无隐藏层),适合结构化数据初步建模。
4. 评估指标
scss
def log_rmse(net, features, labels):
clipped_preds = torch.max(net(features), torch.tensor(1.0)) # 预测值截断(≥1)
rmse = torch.sqrt(loss(clipped_preds.log(), labels.log())) # 对数值计算RMSE
return rmse.item()
- 对数RMSE:比赛要求的评估指标,对预测值和真实值取对数后计算RMSE,避免高价房误差主导。
5. 训练与验证
(1) 训练函数
scss
def train(net, train_features, train_labels, ..., batch_size):
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate, weight_decay=weight_decay)
for epoch in range(num_epochs):
for X, y in train_iter: # 小批量训练
l = loss(net(X), y)
optimizer.zero_grad()
l.backward()
optimizer.step()
- 优化器 :使用Adam(自适应学习率)优化,支持L2正则化(
weight_decay
)。 - 批训练 :通过
DataLoader
实现小批量梯度下降。
(2) K折交叉验证
ini
def k_fold(k, X_train, y_train, ...):
for i in range(k):
X_train_part, y_train_part, X_valid, y_valid = get_k_fold_data(k, i, X_train, y_train)
net = get_net(X_train.shape[1])
train_ls, valid_ls = train(net, ...)
# 记录每折的RMSE
- K折验证 :将数据分为5折(
k=5
),轮流用4折训练、1折验证,评估模型泛化能力。
(3) 参数设置
ini
k, num_epochs, lr, weight_decay, batch_size = 5, 100, 5, 0, 64
- 超参数 :学习率(
lr=5
)较高(因使用Adam),无L2正则化(weight_decay=0
),批量大小64。
6. 预测与提交
scss
def train_and_pred(...):
net = get_net(train_features.shape[1])
train(net, ...) # 全量训练
preds = net(test_features).detach().numpy()
submission = pd.concat([test_data['Id'], pd.Series(preds.reshape(-1))], axis=1)
submission.to_csv('submission.csv', index=False)
- 预测:用全量训练数据训练模型,预测测试集房价。
- 输出 :生成Kaggle要求的提交格式(
Id, SalePrice
)。
提交
点击右上角的submit prediction,上传生成的submission.csv即可。