kaggle——房价预测

比赛描述

如果让购房者描述理想中的房子,他们可能不会提到"地下室天花板高度"或"东西向铁路距离"这样的细节。但本次比赛的数据集证明,房价谈判的影响因素远不止卧室数量或白色栅栏。

数据集包含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列(无标签)

2. 数据预处理

(1) 合并特征
css 复制代码
all_features = pd.concat((train_data.iloc[:, 1:-1], test_data.iloc[:, 1:]))
  • 合并训练集和测试集的特征(排除训练集的IdSalePrice列),便于统一处理。
(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即可。

相关推荐
九思Atopos2 个月前
如何应对kaggle离线安装环境?
kaggle
Dontla9 个月前
Kaggle入门指南(Kaggle竞赛)
kaggle
蓝皮怪9 个月前
基于机器学习与深度学习的贷款批准预测
深度学习·随机森林·机器学习·逻辑回归·kaggle·mlp
₫从心1 年前
kaggle平台free使用GPU
深度学习·机器学习·kaggle
Xiao_Ya__1 年前
Kaggle——Deep Learning(使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络)
深度学习·tensorflow·keras·kaggle
Q天马A行空Q1 年前
kaggle:房价预测
kaggle·集成学习·岭回归·bagging
政安晨1 年前
政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(三)—— 随机梯度下降
深度学习·机器学习·tensorflow·keras·kaggle·损失函数·随机梯度下降
深度之眼2 年前
Kaggle新赛:HMS-有害大脑活动分类大赛(信号分类)
人工智能·深度学习·机器学习·kaggle
深度之眼2 年前
kaggle新赛:SenNet 3D肾脏分割大赛(3D语义分割)
kaggle·语义分割