动手学深度学习(Pytorch版)代码实践 -深度学习基础-13Kaggle竞赛:2020加州房价预测

news2024/11/26 0:46:01

13Kaggle竞赛:2020加州房价预测

# 导入所需的库
import numpy as np
import pandas as pd
import torch
import hashlib
import os
import tarfile
import zipfile
import requests
from torch import nn
from d2l import torch as d2l

# 读取训练和测试数据
train_data = pd.read_csv('../data/california-house-prices/train.csv')
test_data = pd.read_csv('../data/california-house-prices/test.csv')

# 打印数据形状
# print(train_data.shape)
# print(test_data.shape)
# (47439, 41)
# (31626, 40)

# 打印前4行的部分列
# print(train_data.iloc[0:4, [0, 1, 2, 3, 4, 5, 6, -3, -2, -1]])

# 合并训练和测试数据,用于特征工程
all_features = pd.concat((train_data.iloc[:, train_data.columns != 'Sold Price'], test_data.iloc[:, 1:]))
# all_features.info()
# print(all_features.shape)
# (79065, 40)

# 去除ID列
all_features = all_features.iloc[:, 1:]

# 将字符型日期列转化为日期型
all_features['Listed On'] = pd.to_datetime(all_features['Listed On'], format="%Y-%m-%d")
all_features['Last Sold On'] = pd.to_datetime(all_features['Last Sold On'], format="%Y-%m-%d")

# 标准化数值特征
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)

# 打印每个字符型特征的唯一值数量
# for in_object in all_features.dtypes[all_features.dtypes == 'object'].index:
#     print(in_object.ljust(20), len(all_features[in_object].unique()))
"""
in_object.ljust(20):将列名左对齐,并填充空格使其长度至少为20个字符,这样打印时更整齐。
len(all_features[in_object].unique()):计算该列中唯一值的数量。
便于后续的独热编码,防止内存爆炸
"""

# 选择需要的特征
features = list(numeric_features)
features.extend(['Type'])
all_features = all_features[features[:]]

# 独热编码
all_features = pd.get_dummies(all_features, dummy_na=True, dtype=float)
# print(all_features.shape)
# (79065, 195)

# 查看全部特征的数据类型
# print(all_features.dtypes.unique())

# 从pandas格式中提取NumPy格式,并将其转换为张量表示用于训练
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['Sold Price'].values.reshape(-1, 1),
    dtype=torch.float32
)

# 是否使用GPU训练
if not torch.cuda.is_available():
    print('CUDA is not available. Training on CPU ...')
else:
    print('CUDA is available. Training on GPU ...')
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# 将特征和标签移到设备上
train_features = train_features.to(device)
test_features = test_features.to(device)
train_labels = train_labels.to(device)

# 定义均方误差损失函数
loss = nn.MSELoss()

# 输入特征的数量
in_features = train_features.shape[1]
# print(in_features)
# 195

# 定义神经网络模型
dropout1, dropout2, dropout3 = 0.2, 0.3, 0.5

def get_net():
    net = nn.Sequential(
        nn.Flatten(),
        nn.Linear(in_features, 128), nn.ReLU(),
        # nn.Dropout(dropout1),

        nn.Linear(128, 64), nn.ReLU(),
        # nn.Dropout(dropout2),

        nn.Linear(64, 32), nn.ReLU(),
        # nn.Dropout(dropout3),

        nn.Linear(32, 1))
    return net.to(device)  # 使用GPU

# 计算对数均方根误差
def log_rmse(net, features, labels):
    """
    使用 torch.clamp 函数将预测值的下限限制在 1,确保所有预测值至少为 1。
    这是为了避免在取对数时出现负值或零值,因为对数在这些点上未定义或会导致数值问题。
    """
    clipped_preds = torch.clamp(net(features), 1, float('inf'))
    rmse = torch.sqrt(loss(torch.log(clipped_preds), torch.log(labels)))

    # 将 PyTorch 张量转换为 Python 标量
    return rmse.item()

# 训练模型函数
def train(net, train_features, train_labels, test_features, test_labels,
          num_epochs, learning_rate, weight_decay, batch_size):
    
    train_ls, tets_ls = [], []  # 用于存储每个epoch的训练和测试损失
    train_iter = d2l.load_array((train_features, train_labels), batch_size)  # 创建训练数据迭代器
    optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate,
                                 weight_decay=weight_decay)  # 定义Adam优化器
    # weight_decay: 权重衰减,用于L2正则化。

    for epoch in range(num_epochs):
        for X, y in train_iter:
            X, y = X.to(device), y.to(device)  # 确保批次数据在GPU上
            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:
            # 计算并记录测试集上的对数均方根误差
            tets_ls.append(log_rmse(net, test_features, test_labels))

    return train_ls, tets_ls

# K折交叉验证
# 它选择第i个切片作为验证数据,其余部分作为训练数据
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.to(device), y_train.to(device), X_valid.to(device), y_valid.to(device)  # 确保在GPU上

# 在K折交叉验证中训练K次后,返回训练和验证误差的平均值。
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]
        # 将 train_ls 列表中的最新值(即当前 epoch 的训练损失)累加到 train_l_sum 变量中。
        valid_l_sum += valid_ls[-1]
        if i == 0:
            d2l.plot(list(range(1, num_epochs + 1)), [train_ls, valid_ls],
                     xlabel='epoch', ylabel='rmse', xlim=[1, num_epochs],
                     legend=['train', 'valid'], yscale='log')
        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

# 定义训练参数
k, num_epochs, lr, weight_decay, batch_size = 5, 100, 0.01, 0, 256

# 进行K折交叉验证
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}')

d2l.plt.show() 

# 提交Kaggle预测
def train_and_pred(train_features, test_features, 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}')
    # 将网络应用于测试集,并将结果从GPU转移到CPU再转换为NumPy数组
    preds = net(test_features).detach().cpu().numpy()
    # 将其重新格式化以导出到Kaggle
    test_data['Sold Price'] = pd.Series(preds.reshape(1, -1)[0])
    submission = pd.concat([test_data['Id'], test_data['Sold Price']], axis=1)
    submission.to_csv('../data/california-house-prices/submission.csv', index=False)

# 训练模型并进行预测
train_and_pred(train_features, test_features, train_labels, test_data,
               num_epochs, lr, weight_decay, batch_size)

d2l.plt.show()

运行结果:

1,训练log rmse0.356748, 验证log rmse0.3316662,训练log rmse0.337252, 验证log rmse0.3418753,训练log rmse0.317294, 验证log rmse0.3245164,训练log rmse0.337175, 验证log rmse0.3606255,训练log rmse0.356537, 验证log rmse0.379667
5-折验证: 平均训练log rmse: 0.341001, 平均验证log rmse: 0.347670
训练log rmse:0.307162

在这里插入图片描述
在这里插入图片描述

竞赛得分:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1835302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哈尔滨等保测评流程

哈尔滨的等保测评程序是一项严格的、系统化的检测程序,其目的在于保证信息系统的安全、稳定。下面详细介绍了这个过程: 一、引言 随着信息技术的飞速发展,信息系统在各行各业中的应用越来越广泛,信息安全问题也日益凸显。为了保障…

使用CSS常见问题解答卡片

常见问题解答卡片 效果展示 CSS 知识点 CSS 选择器的使用background 渐变背景色运用CSS 综合知识运用 页面整体布局 <div class"container"><h1>经常问的问题</h1><!-- 这里只是展示一个项目 --><div class"tab"><in…

API 设计技巧:基础知识与实践的方法

在这篇深入探讨中&#xff0c;我们将从基础开始&#xff0c;逐步介绍 API 设计&#xff0c;并探讨定义卓越API的最佳实践。 作为一名开发者&#xff0c;你可能已经熟悉了许多这些概念&#xff0c;但我将提供详细解释&#xff0c;以加深你的理解。 API 设计&#xff1a;电子商…

云上战场:ToDesk云电脑、青椒云、顺网云全面对决

前言 记得端午放假期间&#xff0c;我已经在旅游的路上了&#xff0c;老板突然发短信&#xff0c;让我给他画个图&#xff0c;我手上的战斗机已经是十年前的老古董了(平常一直用的公司电脑&#xff0c;也没想过要换)&#xff0c;压根满足不了老板的任务要求&#xff0c;不得已&…

Linux_应用篇(20) 串口应用编程

本小节我们来学习 Linux 下串口应用编程&#xff0c;串口&#xff08;UART&#xff09;是一种非常常见的外设&#xff0c;串口在嵌入式开发领域当中一般作为一种调试手段&#xff0c;通过串口输出调试打印信息&#xff0c;或者通过串口发送指令给主机端进行处理&#xff1b;当然…

ES6(ECMAScript 6.0) 新特性

1 ES6 基本介绍 &#xff08;1&#xff09;ECMAScript 6.0(简称 ES6)是 JavaScript 语言的下一代标准&#xff0c; 2015 年 6 月发布。 &#xff08;2&#xff09;ES6 设计目标&#xff1a;达到 JavaScript 语言可以用来编写复杂的大型程序&#xff0c;成为企业级开发语言 &…

基于 Arm 虚拟硬件实现人脸特征提取模型的部署

基于 Arm 虚拟硬件实现人脸特征提取模型的部署 文章目录 1 实验背景1.1 Arm 虚拟硬件介绍1.2 文章简介 2 实验目标3 实验前准备3.1 订阅 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例3.2 克隆实验代码 4 实验步骤4.1 配置开发环境4.1.1 配置 CMSIS-Toolbox 环境4.1.2 配置 P…

Log4j2(CVE-2021-44228)远程代码执行漏洞

目录 介绍 log4j2介绍&#xff1a; JNDI介绍 LDAP介绍 RMI介绍 log4j2漏洞 漏洞复现 漏洞的&#xff08;触发&#xff09;流程 利用log4j2漏洞反弹shell 最近打算学习一下JAVA中几个经典的漏洞&#xff0c;这里还是参考别的师傅总结的好文章进行学习 JAVA的几个经典漏…

【价值主张画布】以产品思维,将自己打造成“爆款”

经营自己等于经营公司&#xff1a; 1.客户细分&#xff1a;我能帮助谁&#xff1f;谁是我们最重要的客户&#xff1f; 2. 客户关系&#xff1a;怎样和对方打交道&#xff1f;一次交付还是持续交付&#xff1f; 3.渠道通路&#xff1a;怎样宣传自己和服务&#xff1f; 4. 价值主…

请查收2024年小朋友的暑假计划日程表

2024年盛夏将至&#xff0c;孩子们的暑假即将拉开帷幕&#xff0c;是时候为他们精心策划一份丰富多彩的暑期日程表&#xff0c;让他们的假期充实而难忘&#xff01; 具体时间规划 07:30-08:00 清晨准备 独立完成穿衣、如厕和洗漱 打开窗户通风 测量体温&#xff0c;关注健康…

少儿编程启蒙新篇章:Scratch引领图形化编程的奇妙之旅

随着信息技术的飞速发展&#xff0c;编程教育已不再是专业领域的专属&#xff0c;而是逐渐走进千家万户&#xff0c;成为孩子们成长过程中不可或缺的一部分。特别是在少儿编程领域&#xff0c;图形化编程工具如Scratch的普及&#xff0c;为孩子们打开了编程启蒙的大门&#xff…

Vulnhub——AI: WEB: 2

渗透复现 &#xff08;1&#xff09;平台框架存在目录穿越漏洞&#xff0c;利用该漏洞读取敏感信息 &#xff08;2&#xff09;Ping功能点绕过&#xff0c;进行命令执行操作&#xff0c;反弹shell无果后&#xff0c;利用目录穿越漏洞遍历敏感API&#xff0c;读取到用户SSH登录…

第三方仓库WMS仓储管理系统智能库存预警解决方案

在当今竞争激烈的物流市场中&#xff0c;第三方仓库扮演着连接供应链各环节的关键角色。面对不断变化的客户需求和日益严格的市场要求&#xff0c;如何提升仓库管理水平、优化库存结构、降低运营成本&#xff0c;成为了第三方仓库管理者必须面对的重要课题。在这一背景下&#…

pdfFactory虚拟打印机软件下载-pdfFactory虚拟打印机官方最新版下载附加详细安装步骤

pdffactory是一款办公软件&#xff0c;帮助用户更好的进行文件处理&#xff0c;轻松查询使用&#xff0c;不用担心故障的问题&#xff0c;而且打印速度快&#xff0c;效率高&#xff0c;保障用户日常打印轻松。 安 装 包 获 取 地 址&#xff1a; FinePrint-安装包 &#xff1…

006 spring事务支持

文章目录 事务回顾事务介绍事务并发问题(隔离性导致)事务隔离级别 Spring框架事务管理相关接口Spring框架事务管理的分类编程式事务管理(了解)声明式事务管理(重点) 事务管理之XML方式业务层持久层单元测试代码配置事务管理的AOP 事务管理之混合方式事务管理之基于AspectJ的纯注…

前沿技术丨实车测试必须注意的3个方面

在汽车网络通信中&#xff0c;ECU零部件测试、域/系统测试在测试条件上存在局限性&#xff0c;往往由于无法完全仿真工作环境、无法排除特殊干扰因素、异常场景预估不充分&#xff0c;导致在集成到整车后才新暴露出一些功能、性能、兼容性问题。 实车通信测试是作为测试验证的…

【数据分析】线性及逻辑回归模型和Python实现

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

FUANC机器人教程:速度倍率级数与倍率增量设定方法

目录 机器人速度倍率介绍 机器人运行速度倍率切换操作 快速切换速度倍率有效与无效设定 速度倍率级数与增量自定义 速度倍率级数与增量自定义举例 机器人速度倍率介绍 在机器人手动或自动运行时都离不开速度设定&#xff0c;机器人的运行速度由多个要素共同决定&#xff…

【毕业设计】Django 校园二手交易平台(有源码+mysql数据)

此项目有完整实现源码&#xff0c;有需要请联系博主 Django 校园二手交易平台开发项目 项目选择动机 本项目旨在开发一个基于Django的校园二手交易平台&#xff0c;为大学生提供一个安全便捷的二手物品买卖平台。该平台将提供用户注册和认证、物品发布和搜索、交易信息管理等…

如何使用Vue3和ApexCharts创建交互式热力图?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 热力图&#xff1a;可视化数据分布 应用场景介绍 热力图是一种数据可视化技术&#xff0c;它使用颜色来表示数据点的值。热力图常用于可视化分布数据&#xff0c;例如人口密度、温度变化或网站流量。 代码基…