深度学习笔记丨李沐深度学习课程kaggle竞赛——加利福尼亚房价预测(我的第一个深度学习项目)

2023-11-11

记录作为小白的第一个深度学习项目。

1 kaggle竞赛题目

The task is to predict house sale prices based on the house information, such as # of bedrooms, living areas, locations, near-by schools, and the seller summary. The data consist of houses sold in California on 2020, with houses in the test dataset sold after the ones in the training dataset. Also the private leaderboard houses were sold after the ones in the public leaderboard.

题目和在课程中演示的基础竞赛一样,也是房价预测,回归模型。

2 训练数据分析与处理

# 读取数据
    train_data = pd.read_csv('train.csv')
    test_data = pd.read_csv('test.csv')

观察train.csvtest.csv,训练集共有47.3k个数据,训练集31.1k,数据量比课程中演示的都要大。此时采用One-hot编码处理文本标签就会导致内存爆炸,因此,需要对数据进行观察分析,分门别类地处理。

经过观察,数据分为以下类别

  • ID(在训练时直接删除)
  • 数值型数据(去中心化、归一化处理)
    • Sold price(train_label)
    • Year built, Bedrooms...
  • 文本型数据(单独处理)

数值型数据处理的方法在课程中已经给出

# 提取数值特征并标准化
    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
    all_features[numeric_features] = all_features[numeric_features].fillna(0)

观察文本型数据,发现有些可以简单分类,有些则需要运用NLP方法提取特征词来进行分类。

例如,Address类中有:540 Pine Ln、1727 W 67th St、28093 Pine Ave等数万个数据,难以进行分类,作为小白很难处理这种数据,几经尝试之后还是反复在内存上报错。因此只能暂时去掉这一类的特征,等掌握更多方法之后再来进行高阶的处理,相似的特征还有:Summary

将所有特征合并至all_features(上述需要删除的特征除外)

# 删除部分特征(ID,Address,summary)
    all_features = pd.concat((train_data.iloc[:, 4:], test_data.iloc[:, 3:]))

 其他一些特征,某些类别出现较多频次,也存在不好分类的描述,如Flooring特征,主要可以分为三大类[null],wood,other,而other类别中还有三万多类。对于此类特征,我采用较为粗略的大类分类法,选择频次最高的八类与缺失值,Other共同组成至少十类,并用One-hot编码处理,达到降维的目的。 

# 处理离散值/文本标签
    text_features = all_features.dtypes[all_features.dtypes == 'object'].index
    for feature in text_features:
        type_label = []
        # 统计词频
        word_counts = collections.Counter(all_features[feature])
        word_counts_top = word_counts.most_common(8)
        # 选择分类标签
        for counts in word_counts_top:
            type_label.append(counts[0])
        all_features[feature] = all_features[feature].fillna('NAN')
        type_label.append('NAN')
        # 将分类标签以外的类别归为Other类
        all_features[feature] = [i if i in type_label else 'Other' for i in all_features[feature]]
    # one-hot编码
    all_features = pd.get_dummies(all_features, dummy_na=True)
        

然后将所有数据转换为张量格式,以输入神经网络

n_train = train_data.shape[0]
train_features = torch.tensor(all_features[:n_train].values, dtype=torch.float32)
test_features = torch.tensor(all_features[n_train:].values, dtype=torch.float32)
train_labels = torch.tensor(train_data.iloc[:, 2], dtype=torch.float32)

3 训练(基础线性模型)

最开始先按照课堂给出的线性模型进行训练

3.1 定义损失与网络

损失为均方差损失,但在比较时使用log_rmse形式比较,网络为线性网络

loss = nn.MSELoss()
    in_features = train_features.shape[1]

    def get_net():
        net = nn.Sequential(nn.Linear(in_features, 1))
        return net

    def log_rmse(net, features, labels):
        # 为了在取对数时进一步稳定该值,将小于1的值设置为1
        clipped_preds = torch.clamp(net(features), 1, float('inf'))
        rmse = torch.sqrt(loss(torch.log(clipped_preds),
                               torch.log(labels)))
        return rmse.item()

3.2 定义训练函数

训练函数中使用批梯度下降、Adam优化算法

    def train(net, train_features, train_labels, test_features, test_labels,
              num_epochs, learning_rate, weight_decay, batch_size):
        train_ls, test_ls = [], []
        train_iter = d2l.load_array((train_features, train_labels), batch_size)
        # Adam优化算法
        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:
                optimizer.zero_grad()
                l = loss(net(X), y)
                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

3.3 K折交叉验证

get_k_fold_data获取第k折的切片数据,进行k次训练返回平均误差

    def get_k_fold_data(k, i, X, y):
        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], 0)
                y_train = torch.cat([y_train, y_part], 0)
        return X_train, y_train, X_valid, y_valid

    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()
            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]
            print(f'折{i + 1},训练log rmse{float(train_ls[-1]):f}, '
                  f'验证log rmse{float(valid_ls[-1]):f}')
        return train_l_sum / k, valid_l_sum / k

3.4 调参

调整超参数,来找到较低的一个误差值

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(f'{k}-折验证: 平均训练log rmse: {float(train_l):f}, '
      f'平均验证log rmse: {float(valid_l):f}')

略微调了一下参,整体处理的比较粗糙,所以得到一个误差较大的结果如下

 3.5 生成提交数据集

def train_and_pred(train_features, test_feature, train_labels, test_data,
                   num_epochs, lr, weight_decay, batch_size):
    net = get_net()
    train_ls, _ = train(net, train_features, train_labels, None, None,
                        num_epochs, lr, weight_decay, batch_size)
    d2l.plot(np.arange(1, num_epochs + 1), [train_ls], xlabel='epoch',
             ylabel='log rmse', xlim=[1, num_epochs], yscale='log')
    print(f'训练log rmse:{float(train_ls[-1]):f}')
    # 将网络应用于测试集。
    preds = net(test_features).detach().numpy()
    # 将其重新格式化以导出到Kaggle
    test_data['Sold Price'] = 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竞赛:California House Prices | Kaggle

沐神关于这一章的教程:4.10. 实战Kaggle比赛:预测房价 — 动手学深度学习 2.0.0-beta0 documentation (d2l.ai)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习笔记丨李沐深度学习课程kaggle竞赛——加利福尼亚房价预测(我的第一个深度学习项目) 的相关文章

随机推荐

  • 用Python做一个窗口

    import pygame 导入pygame库 pygame init pygame组件初始化 pygame display set caption 我的第一个窗口 设置窗口名称 height 600 窗口高度变量 width 400 窗口
  • UVM::phase的run order

    1 build time bulid connect end of elaboration 2 run time start of simulation run run有分为 pre reset reset post reset pre c
  • DVWA——CSRF(low)

    CSRF 界面 源代码
  • 正点原子STM32(基于HAL库)1

    正点原子B站视频地址 https www bilibili com video BV1bv4y1R7dp p 1 vd source cc0e43b449de7e8663ca1f89dd5fea7d 目录 单片机简介 Cortex M介绍
  • PAT 1033 旧键盘打字 (20分) python实现

    旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 代码 如下
  • 刷脸支付各行业有发挥一技之长的地方

    刷脸支付的技术在各方的监督下不断发展 安全性也被大大提高 引用范围愈发广泛 零售 教育 金融 安防 医疗等 都是刷脸支付可以发挥一技之长的地方 只有你想不到 没有刷脸支付触达不到 应广大家长和学生的要求 刷脸支付如今正肆无忌惮的入驻校园 帮
  • OTA-Docker架构设计&源码

    架构设计 Docker容器的主要任务 运行所需的应用程序 Docker容器映射文件目录 完成与本地文件共享数据 OTA Client控制共享文件目录下的更新和容器的重启 最终实现基于Docker的SOTA应用升级 整体架构的设计思路如下 终
  • C# - this 的用法

    引言 最近有接触到 C 静态方法中 this 做为参数紧跟类名 实现对类的扩展 觉得很好奇 便想了解一下 C 中 this 关键字的用法 主要有 5 类用法 内容提要 限定类似名称隐藏的成员 将对象作为参数传递给方法 声明索引器 串联构造函
  • 2018年泰迪杯心得总结--最全的数学建模、数据挖掘的比赛入门

    2018年泰迪杯总结 最全的数学建模 数据挖掘比赛入门 期待已久的泰迪杯数据挖掘比赛从3月1日开启到今天4月15日已经结束了 不同于美赛等数学建模比赛 它耗时更长 赛题难度更大 需要处理的数据更加庞大 奖金也超级丰厚hhh 笔者通过一个半月
  • SQL注入基础 sql注入详细解释 小白学习笔记

    sql注入作为安全攻防中最重要的一个部分 可以说是所有渗透测试注入中最为重要的一个注入 不管是预防还是测试 都需要扎实的基础才能明白sql注入 温馨提示 此文章仅限于学习记录与讨论 不得随意测试或者注入 互联网不是法外之地 任何除学习之外的
  • cdr怎么抠图轮廓线条_CDR怎么抠图?CorelDRAW快速抠图方法

    抠图这个词相信大家都有所耳闻 CDR中的抠图功能也比较实用 可以用于将图片的一部分单独取出来 或是用来给人物换背景 做照片的合成等 那么用CDR怎么抠图呢 CorelDRAW 2019 for Win中的抠图方法有很多 今天小编教大家两种
  • 深度学习之图像隐写去除(DDSP模型 Steganography Removal)

    文章目录 一 前言 二 论文内容 2 1 Abstract 2 2 Introduction 2 3 Background 2 3 1 Prior Work 2 3 2 Super Resolution GAN 超分辨率GAN 2 4 Da
  • python json5

    install pip install json5 test a json a b aa b1 b2 import json5a json5 load open a json r print a a b aa b1 b2 转载于 https
  • C语言小编程之九九乘法表

    在初学C语言中 我们会遇到很多九九乘法表的问题 在这我们进行一系列的分析 九九乘法表的格式是x x x的格式 接下来 我们要做的是利用循环结构 使得数量发生变化 在最后 要对乘法表的形状进行限定 首先我们先进行 对 两个乘数进行循环 然后求
  • mysql check执行流程,MySQL==> SQL执行流程剖析

    一 MySQL基本架构 从该图可以看出 MySQL 主要分为 Server 层和存储引擎层 Server 层中包罗毗邻器 查询缓存 剖析器 优化器 执行器 涵盖 MySQL 的大多数焦点服务功效 以及所有的内置函数 如日期 时间 数学和加密
  • 安装MMCV血泪史

    如果直接进行pip 是会出错的 需要先在服务器上或者Python控制台查找torch和cuda版本号 python c import torch print torch version 查找到版本号之后 在下面的链接查找对应版本的mmcv安
  • Unity3D Shader 新手教程(2/6) —— 积雪Shader

    如果你是一个shader编程的新手 并且你想学到下面这些酷炫的技术 我觉得你可以看看这篇教程 实现一个积雪效果的shader 创建一个具有凹凸纹理的shader 为每个像素修改其对应纹理值 在表面着色器中修改模型的顶点数据 引论 这是我们系
  • 方舟编译器分析十四——代码分析(十二)

    2021SC SDUSC ssa是MeFuncPhase类的phase之一 是除了ssaTab之外 和ssa相关的第二个phase 它在phases def中 排在ssaTab和aliasclass之后 前文已经分析过了ssaTab 本文将
  • Postgresql的并发(一)

    转载请注明URL http write blog csdn net postedit 50747829 翻译 卧龙居 pijing 13 1 简介 PostgreSQL提供了非常丰富的工具给开发者 以供开发者控制对于数据的并发访问 在内部
  • 深度学习笔记丨李沐深度学习课程kaggle竞赛——加利福尼亚房价预测(我的第一个深度学习项目)

    记录作为小白的第一个深度学习项目 1 kaggle竞赛题目 The task is to predict house sale prices based on the house information such as of bedroom