Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Pytorch实战Kaggle房价预测比赛

Pytorch实战Kaggle房价预测比赛

作者头像
BBuf
发布于 2019-12-04 10:06:51
发布于 2019-12-04 10:06:51
3.5K00
代码可运行
举报
文章被收录于专栏:GiantPandaCVGiantPandaCV
运行总次数:0
代码可运行

前言

这是分享的第一个Kaggle比赛,也是Kaggle中难度最低的比赛之一,房价预测是一个回归问题,给出了房子的一些特征要求预测房子的价格。本文使用Pytorch构建一个线性模型来完成预测。比赛地址为:我们可以在房价预测⽐赛的⽹⻚上了解⽐赛信息和参赛者成绩,也可以下载数据集并提交⾃⼰的预测结果。该⽐赛的⽹⻚地址是 https://www.kaggle.com/c/house-prices-advanced-regression-techniques 。

在这里插入图片描述

1. 获取和读取数据集

⽐赛数据分为训练数据集和测试数据集。两个数据集都包括每栋房⼦的特征,如街道类型、建造年份、 房顶类型、地下室状况等特征值。这些特征值有连续的数字、离散的标签甚⾄是缺失值“na”。只有训练数据集包括了每栋房⼦的价格,也就是标签。我们可以访问⽐赛⽹⻚,点击的“Data”标签,并下载这些数据集。

导入头文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import torch.utils.data
from IPython import display
import torch.nn as nn
import numpy as np
import pandas as pd
import sys
import matplotlib.pyplot as plt

解压后的数据集被我放在F盘的根目录下,下面用pandas读取训练和测试文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_data = pd.read_csv("F:\\house\\train.csv")
test_data = pd.read_csv("F:\\house\\test.csv")

训练数据集包含1460个样本,80个特征和1个标签。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_data.shape
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(1460, 81)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test_data.shape
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(1459, 80)

让我们来查看前4个样本的前4个特征,后2个特征和标签(SalePrice):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_data.iloc[0:4, [0, 1, 2, 3, -3, -2, -1]]

Id

MSSubClass

MSZoning

LotFrontage

SaleType

SaleCondition

SalePrice

0

1

60

RL

65.0

WD

Normal

208500

1

2

20

RL

80.0

WD

Normal

181500

2

3

60

RL

68.0

WD

Normal

223500

3

4

70

RL

60.0

WD

Abnorml

140000

可以看到第⼀个特征是Id,它能帮助模型记住每个训练样本,但难以推⼴到测试样本,所以我们不使⽤ 它来训练。我们将所有的训练数据和测试数据的79个特征按样本连结。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
all_features = pd.concat((train_data.iloc[:, 1:-1], test_data.iloc[:, 1:]))

2. 预处理数据

我们对连续数值的特征做标准化(standardization):设该特征在整个数据集上的均值为,标准差为 。那么,我们可以将该特征的每个值先减去 再除以 得到标准化后的每个特征值。对于缺失的特征值,我们将其替换成该特征的均值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()))
# 标准化后,每个特征的均值变为0,所以可以直接⽤0来替换缺失值
all_features = all_features.fillna(0)

接下来将离散数值转成指示特征。举个例⼦,假设特征MSZoning⾥⾯有两个不同的离散值RL和RM,那 么这⼀步转换将去掉MSZoning特征,并新加两个特征MSZoning_RL和MSZoning_RM,其值为0或1。如果⼀个样本原来在MSZoning⾥的值为RL,那么有MSZoning_RL=1且MSZoning_RM=0。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# dummy_na=True将缺失值也当作合法的特征值并为其创建指示特征
all_features = pd.get_dummies(all_features, dummy_na=True)
all_features.shape
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(2919, 354)

可以看到这⼀步转换将特征数从79增加到了354。最后,通过 values 属性得到NumPy格式的数据,并转成 NDArray ⽅便后⾯的训练。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

3. 训练模型

我们使用一个基本的线性回归模型和平方损失函数来训练模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss = torch.nn.MSELoss()

def get_net(feature_num):
    net = nn.Linear(feature_num, 1)
    for param in net.parameters():
        nn.init.normal_(param, mean=0, std=0.01)
    return net

下⾯定义⽐赛⽤来评价模型的对数均⽅根误差。给定预测值和对应的真实标签,它的定义为:

对数均⽅根误差的实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def log_rmse(net, features, labels):
    with torch.no_grad():
        # 将小于1的值设成1,使得取对数时数值更稳定
        clipped_preds = torch.max(net(features), torch.tensor(1.0))
        rmse = torch.sqrt(2 * loss(clipped_preds.log(), labels.log()).mean())
    return rmse.item()

下⾯的训练函数跟本章中前⼏节的不同在于使⽤了Adam优化算法。相对之前使⽤的⼩批量随机梯度下 降,它对学习率相对不那么敏感。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def train(net, train_features, train_labels, test_features, test_labels, num_epochs,
          learning_rate, weight_decay, batch_size):
    train_ls, test_ls = [], []
    dataset = torch.utils.data.TensorDataset(train_features, train_labels)
    train_iter = torch.utils.data.DataLoader(dataset, batch_size, shuffle=True)
    # 这⾥使⽤了Adam优化算法
    optimizer = torch.optim.Adam(params=net.parameters(), lr=learning_rate, weight_decay=weight_decay)
    net = net.float()
    for epoch in range(num_epochs):
        for X, y in train_iter:
            l = loss(net(X.float()), y.float())
            optimizer.zero_grad()
            l.backward()
            optimizer.step()
        train_ls.append(log_rmse(net, train_features, train_labels))
        if test_labels is not None:
            test_ls.append(log_rmse(net, test_features, test_labels))
    return train_ls, test_ls

4. K折交叉验证

下⾯实现了⼀个函数,它返回第 i 折交叉验证时所需要的训练和验证数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_k_fold_data(k, i, X, y):
    # 返回第i折交叉验证时所需要的训练和验证数据
    assert k > 1
    fold_size = X.shape[0] // k
    X_train, y_train = None, None
    for j in range(k):
        idx = slice(j * fold_size, (j + 1) * fold_size)
        X_part, y_part = X[idx, :], y[idx]
        if j == i:
            X_valid, y_valid = X_part, y_part
        elif X_train is None:
            X_train, y_train = X_part, y_part
        else:
            X_train = torch.cat((X_train, X_part), dim=0)
            y_train = torch.cat((y_train, y_part), dim=0)
    return X_train, y_train, X_valid, y_valid

在k折交叉验证中我们训练k次并返回训练和验证的平均误差。有时候你会发现⼀组参数的训练误差可以达到很低,但是在k折交叉验证上的误差可能反⽽较⾼。这种现象很可能是由过拟合造成的。因此,当训练误差降低时,我们要观察k折交叉验证上的误差是否也相应降低。

我们先定义作图函数semilogy,其中y轴使用了对数尺度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def use_svg_display():
    # 用矢量图表示
    display.set_matplotlib_formats('svg')
def set_figsize(figsize=(3.5, 2.5)):
    use_svg_display()
    # 设置图的尺寸
    plt.rcParams['figure.figsize'] = figsize
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def semilogy(x_vals, y_vals, x_label, y_label, x2_vals=None, y2_vals=None,
             legend=None, figsize=(3.5, 2.5)):
    set_figsize(figsize)
    plt.xlabel(x_label)
    plt.ylabel(y_label)
    plt.semilogy(x_vals, y_vals)
    if x2_vals and y2_vals:
        plt.semilogy(x2_vals, y2_vals, linestyle=':')
        plt.legend(legend)
    plt.show()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def k_fold(k, X_train, y_train, num_epochs, learning_rate, weight_decay, batch_size):
    train_l_sum, valid_l_sum = 0, 0
    for i in range(k):
        data = get_k_fold_data(k, i, X_train, y_train)
        net = get_net(X_train.shape[1])
        train_ls, valid_ls = train(net, *data, num_epochs, learning_rate, weight_decay, batch_size)
        train_l_sum += train_ls[-1]
        valid_l_sum += valid_ls[-1]
        if i == 0:
            semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'rmse',
                     range(1, num_epochs + 1), valid_ls, ['train', 'valid'])
        print('flod %d, train rmse %f, valid rmse %f' % (i, train_ls[-1], valid_ls[-1]))
    return train_l_sum / k, valid_l_sum / k

k, num_epochs, lr, weight_decay, batch_size = 5, 100, 5, 0, 64
train_l, valid_l = k_fold(k, train_features, train_labels, num_epochs, lr, weight_decay, batch_size)
print('%d-fold validation: avg train rmse %f, avg valid rmse %f'%(k, train_l, valid_l))

在这里插入图片描述

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flod 0, train rmse 0.239874, valid rmse 0.221404
flod 1, train rmse 0.229332, valid rmse 0.269407
flod 2, train rmse 0.232131, valid rmse 0.238519
flod 3, train rmse 0.238633, valid rmse 0.218897
flod 4, train rmse 0.231179, valid rmse 0.258849
5-fold validation: avg train rmse 0.234230, avg valid rmse 0.241415

5. 预测并在KAGGLE上提交结果

下⾯定义预测函数。在预测之前,我们会使⽤完整的训练数据集来᯿新训练模型,并将预测结果存成提交所需要的格式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def train_and_pred(train_features, test_features, train_labels, test_data,
                  num_epochs, lr, weight_decay, batch_size):
    net = get_net(train_features.shape[1])
    train_ls, _ = train(net, train_features, train_labels, None, None, num_epochs,
                       lr, weight_decay, batch_size)
    semilogy(range(1, num_epochs+1), train_ls, 'epochs', 'rmse')
    print('train rmse %f'%train_ls[-1])
    preds = net(test_features).detach().numpy()
    test_data['SalePrice'] = pd.Series(preds.reshape(1, -1)[0])
    submission = pd.concat([test_data['Id'], test_data['SalePrice']], axis=1)
    submission.to_csv("./submission.csv", index=False)

设计好模型并调好超参数之后,下⼀步就是对测试数据集上的房屋样本做价格预测。如果我们得到与交叉验证时差不多的训练误差,那么这个结果很可能是理想的,可以在Kaggle上提交结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_and_pred(train_features, test_features, train_labels, test_data, num_epochs, lr,
               weight_decay, batch_size)

在这里插入图片描述

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train rmse 0.229618

上述代码执⾏完之后会⽣成⼀个submission.csv⽂件。这个⽂件是符合Kaggle⽐赛要求的提交格式的。这时,我们可以在Kaggle上提交我们预测得出的结果,并且查看与测试数据集上真实房价(标签)的误差。具体来说有以下⼏个步骤:登录Kaggle⽹站,访问房价预测⽐赛⽹⻚,并点击右侧“Submit Predictions”或“Late Submission”按钮;然后,点击⻚⾯下⽅“Upload Submission File”图标所在的虚线框选择需要提交的预测结果⽂件;最后,点击⻚⾯最下⽅ “Make Submission”按钮就可以了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GiantPandaCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【深度学习基础】多层感知机 | 实战Kaggle比赛:预测房价
  之前几节我们学习了一些训练深度网络的基本工具和网络正则化的技术(如权重衰减、暂退法等)。本节我们将通过Kaggle比赛,将所学知识付诸实践。Kaggle的房价预测比赛是一个很好的起点。此数据集由Bart de Cock于2011年收集,涵盖了2006-2010年期间亚利桑那州埃姆斯市的房价。这个数据集是相当通用的,不会需要使用复杂模型架构。它比哈里森(Harrison)和鲁宾菲尔德(Rubinfeld)的波士顿房价数据集要大得多,也有更多的特征。
Francek Chen
2025/02/02
4330
【深度学习基础】多层感知机 | 实战Kaggle比赛:预测房价
动手学深度学习(五) 梯度消失、梯度爆炸
深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion)。
致Great
2020/02/25
6870
动手学深度学习(五) 梯度消失、梯度爆炸
从零开始学Pytorch(五)之欠拟合和过拟合
训练误差(training error)指模型在训练数据集上表现出的误差,泛化误差(generalization error)指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
墨明棋妙27
2022/09/23
9510
动手学深度学习(四) 过拟合欠拟合及其解决方案
在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
致Great
2020/02/25
1.3K0
动手学深度学习(四) 过拟合欠拟合及其解决方案
深度学习相关基础知识点
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
村雨遥
2019/09/09
5890
深度学习相关基础知识点
[深度学习概念]·模型选择、欠拟合和过拟合原理分析(基于MXNet实现)
如果你改变过实验中的模型结构或者超参数,你也许发现了:当模型在训练数据集上更准确时,它在测试数据集上却不一定更准确。这是为什么呢?
小宋是呢
2019/06/27
1K0
[深度学习概念]·模型选择、欠拟合和过拟合原理分析(基于MXNet实现)
【动手学深度学习笔记】之过拟合与欠拟合实例
每个小批量设置为10,使用TensorDataset转换为张量,使用DataLoader生成迭代器。
树枝990
2020/08/20
7390
【动手学深度学习笔记】之通过权重衰减法解决过拟合问题
为了减轻上一篇文章提到的过拟合现象,往往需要增大训练集,但增大训练集的代价往往是高昂的。
树枝990
2020/08/19
1.7K0
过关斩将打进 Kaggle 竞赛 Top 0.3%,我是这样做的
导读:刚开始接触数据竞赛时,我们可能会被一些高大上的技术吓到。各界大佬云集,各种技术令人眼花缭乱,新手们就像蜉蝣一般渺小无助。今天本文就分享一下在 kaggle 的竞赛中,参赛者取得 top0.3% 的经验和技巧。让我们开始吧!
Python数据科学
2019/07/16
9460
【动手学深度学习】多层感知机模型选择、欠拟合和过拟合研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/06
2740
【动手学深度学习】多层感知机模型选择、欠拟合和过拟合研究详情
过关斩将打进Kaggle竞赛Top 0.3%,我是这样做的
从下图可以看出,融合后的模型性能最好,RMSE 仅为 0.075,该融合模型用于最终预测。
AI科技大本营
2019/07/18
2K1
过关斩将打进Kaggle竞赛Top 0.3%,我是这样做的
从零开始学Pytorch(十九)之Kaggle上的狗品种识别
在本节中,我们将解决Kaggle竞赛中的犬种识别挑战,比赛的网址是https://www.kaggle.com/c/dog-breed-identification 在这项比赛中,我们尝试确定120种不同的狗。该比赛中使用的数据集实际上是著名的ImageNet数据集的子集。
墨明棋妙27
2022/09/23
4900
Kaggle 专利匹配比赛赛后总结
在专利匹配数据集中,选手需要判断两个短语的相似度,一个是anchor ,一个是target ,然后输出两者在不同语义(context)的相似度,范围是0-1,我们队伍id为xlyhq,a榜rank 13,b榜ran12,非常感谢@heng zheng、@pythonlan,@leolu1998,@syzong四位队友的努力和付出,最后比较幸运的狗到金牌。
致Great
2022/09/09
4520
【colab pytorch】训练和测试常用模板代码
写一个label_smoothing.py的文件,然后在训练代码里引用,用LSR代替交叉熵损失即可。label_smoothing.py内容如下:
西西嘛呦
2020/08/26
2.6K0
在 Python 中使用 Tensorflow 预测燃油效率
预测燃油效率对于优化车辆性能和减少碳排放至关重要,这可以使用python库tensorflow进行预测。在本文中,我们将探讨如何利用流行的机器学习库 Tensorflow 的强大功能来使用 Python 预测燃油效率。通过基于 Auto MPG 数据集构建预测模型,我们可以准确估计车辆的燃油效率。让我们深入了解在 Python 中使用 Tensorflow 进行准确的燃油效率预测的过程。
很酷的站长
2023/08/11
4380
在 Python 中使用 Tensorflow 预测燃油效率
从零开始学Pytorch(二)之线性回归
简单的说,线性回归预测是基于某个变量 X (自变量)来预测变量 Y (因变量)的值,当然前提是 X 和 Y 之间存在线性关系。这两个变量之间的线性关系可以用直线表示(称为回归线)。
墨明棋妙27
2022/08/24
6690
从零开始学Pytorch(二)之线性回归
【AI 进阶笔记】cv 小白上手 Kaggle Bird vs Drone 【图像分类】
看一下解压后的标签,可以看到标签的风格是 YOLO 风格的,其中每个标签的第一列是类别,后面是归一化的边界框坐标。不过我想先尝试一下不用 label,不对内容进行目标检测,仅仅用图片名称的分类数据来进行分类检测
繁依Fanyi
2025/04/05
4731
TorchVision Faster R-CNN 微调,实战 Kaggle 小麦检测
本文将利用 TorchVision Faster R-CNN 预训练模型,于 Kaggle: 全球小麦检测[1] ? 上实践迁移学习中的一种常用技术:微调(fine tuning)。 本文相关的 Ka
GoCoding
2021/05/06
1.4K0
TorchVision Faster R-CNN 微调,实战 Kaggle 小麦检测
CLIP-图文预训练模型
CLIP: Contrastive LanguageImage Pre-training
iResearch666
2023/09/13
8300
CLIP-图文预训练模型
【深度学习基础】多层感知机 | 模型选择、欠拟合和过拟合
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/22
2250
【深度学习基础】多层感知机 | 模型选择、欠拟合和过拟合
推荐阅读
相关推荐
【深度学习基础】多层感知机 | 实战Kaggle比赛:预测房价
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验