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即可。

相关推荐
Mr数据杨9 小时前
手写数字识别如何支撑文档数字化应用
机器学习·数据分析·kaggle
Mr数据杨13 小时前
四子棋智能体构建与在线对抗决策应用
机器学习·数据分析·kaggle
Mr数据杨15 小时前
灾害推文识别与应急信息筛选优化
机器学习·数据分析·kaggle
Mr数据杨16 小时前
房屋售价预测在房地产估价与风控中的应用
机器学习·数据分析·kaggle
Mr数据杨19 小时前
泰坦尼克乘客生存预测与风险决策建模
机器学习·数据分析·kaggle
Mr数据杨3 天前
飞船乘客状态预测与金融风控建模启发
大数据·机器学习·数据分析·kaggle
Mr数据杨3 天前
花卉图像分类在植物识别与生态监测中的应用
人工智能·机器学习·分类·数据挖掘·数据分析·kaggle
Mr数据杨3 天前
埃姆斯住宅房价预测与自动化估值建模
运维·机器学习·数据分析·自动化·kaggle
Mr数据杨6 天前
多语言句子对推理驱动事实核查与内容审核
机器学习·数据分析·kaggle
Mr数据杨8 天前
少样本规则推理模型与未知任务自适应应用
机器学习·数据分析·kaggle