李沐动手学深度学习 v2 实战Kaggle比赛:预测房价

news2024/11/24 10:44:07

前言

最近学习一些深度学习知识,观看了李沐老师的《动手学深度学习》的视频
练习一下 实战Kaggle比赛:预测房价
巩固一下 前面学习的知识, 不coding一下总感觉什么也没学
陆陆续续调了一天 记录一下

导包

%matplotlib inline
import numpy as np
import pandas as pd
import torch
from torch import nn
import matplotlib.pyplot as plt
from torch.nn import functional as F
from torch.utils import data
from tqdm import tqdm

数据处理

数据处理这块 我总是出错 写法也不是很优雅 主要py还是不太熟

#pd读一下数据
train_data = pd.read_csv('/kaggle/input/california-house-prices/train.csv')
test_data = pd.read_csv('/kaggle/input/california-house-prices/test.csv')
train_data.shape,test_data.shape

注意不要把target 也标准化了,第一次处理时没注意直接把y合并到all_features中了,导致target值也标准化了导致rmse时 全部变为1 出现了nan

# 先把y  target 分离出来
y = train_data['Sold Price']
train_data = train_data.drop(['Sold Price'],axis=1)

all_features = train_data.iloc[:,1:]
test_features = test_data.iloc[:,1:]

numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index
features = list(numeric_features)
# 加上类别数相对较少的Type  这个特征选择是借鉴别的文章 
#这2个特征做one-hot的话 不同项比较小 不会报内存    目前特征工程不太会
features.extend(['Type','Bedrooms'])
# 看一下 形状是否正确
all_features.shape,test_features.shape
((47439, 39), (31626, 39))
# 对训练和测试数据做标准化 然后缺失值补0
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)
all_features = pd.get_dummies(all_features[features],dummy_na=True)

test_features[numeric_features] = test_features[numeric_features].apply(
lambda x:(x - x.mean()) / (x.std()))

test_features[numeric_features] = test_features[numeric_features].fillna(0)
test_features = pd.get_dummies(test_features[features],dummy_na=True)

看一下特征数 这里发现测试集的特征数 少一些 可以直接减少一些特性

all_features.shape,test_features.shape
((47439, 442), (31626, 196))

final_test, final_train = test_features.align(all_features,
                                            join='left', axis=1)
test_features = final_test
all_features = final_train
all_features = all_features.fillna(0)
final_train.shape, final_test.shape
((47439, 196), (31626, 196))

把训练数据切割 成 训练和验证集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test= train_test_split(in_features,y, test_size=0.2, 
													random_state=1)

X_train.shape,y_train.shape,in_features.shape,test_features.shape
((37951, 196), (37951,), (47439, 196), (31626, 196))
# 把数据类型转成tensor
X_train = torch.tensor(X_train.values, dtype=torch.float32)
y_train = torch.tensor(y_train.values, dtype=torch.float32)
X_test = torch.tensor(X_test.values, dtype=torch.float32)
y_test = torch.tensor(y_test.values, dtype=torch.float32)

test_data_t = torch.tensor(test_features.values, dtype=torch.float32)

模型建立

简单感知机模型

class MLP(nn.Module):
    def __init__(self,in_features):
        super().__init__()
        self.layer1 = nn.Linear(in_features,256)
        self.layer2 = nn.Linear(256,64)
        self.out = nn.Linear(64,1)
        
    def forward(self,X):
        X = F.relu(self.layer1(X))
        X = F.relu(self.layer2(X))
        return self.out(X)

net = MLP(X_train.shape[1])

损失函数 mes均方损失, 这里用rmse 李沐老师有讲 取对数比较好优化 房价的波动比较大

loss = nn.MSELoss()

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()

训练函数
这里跟老师的代码差不多

def load_array(data_array,batch_size,is_Train=True):
    dataset = data.TensorDataset(*data_array)
    return data.DataLoader(dataset,batch_size,shuffle=is_Train)

def train(net,train_features,train_labels,test_features,test_labels,
         nums_epochs,lr,weight_decay,batch_size):
    train_ls,test_ls = [],[]
    train_iter = load_array((train_features,train_labels),batch_size)
    optimizer = torch.optim.Adam(net.parameters(),
                                lr = lr,
                                weight_decay = weight_decay)
    for epoch in tqdm(range(num_epochs)):
        for X, y in train_iter:
#             X,y = X.to(device),y.to(device)
            optimizer.zero_grad()
            l = loss(net(X),y)
            l.backward()
            optimizer.step()
        record_loss = log_rmse(net,train_features,train_labels)
#         record_loss = loss(net(train_features),train_labels)
        print({'loss': record_loss,'epoch': epoch})
        train_ls.append(record_loss)
        
        if test_labels is not None:
            record_loss_t = log_rmse(net,test_features,test_labels)
            test_ls.append(record_loss_t)
            print({'test loss': record_loss_t,'epoch': epoch})
    return train_ls,test_ls

这里直接训练了 没有做k折交叉验证 感觉数据量很大 做k折交叉验证提升不是很明显

参数设置

num_epochs, lr, weight_decay, batch_size = 500, 1e-3, 0.05, 256
print("network:",net)
train_ls, valid_ls = train(net, X_train,y_train,X_test,y_test,
                           num_epochs, lr, weight_decay, batch_size)

这里最后的loss 并不是很理想 验证集一直下不去
训练的loss 能到0.3-0.29 验证一直在1以上
在这里插入图片描述

测试结果

搞了一天没啥大优化 就这样吧

preds = net(test_data_t).detach().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('submission.csv', index=False)

最后结果能到0.44 感觉还可以
跟验证集的结果差的有点多 不知道是哪里的问题 可能是删去了只有测试集里的部分特征导致

在这里插入图片描述

总结

第一次这么正式写代码,把前面学习的知识复习了一下,之前感觉一些知识很模式,没怎么用过不太了解,总算实践了一下,但是plt这个画图工具还是不太熟悉,希望之后可以掌握一下,画图可能观察起来更直观。

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

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

相关文章

计算机网络第二章(谢希仁第八版)

作者:爱塔居 专栏:计算机网络 作者简介:大三学生,希望和大家一起进步 文章目录 目录 文章目录 前言 一、物理层的基本概念 1.1 物理层协议的主要任务 1.2 传输媒体(了解) 二、传输方式 2.1 串行传输…

第二十八章 Unity射线检测

本章节我们介绍一下射线。射线就是从一个固定点向一个方向发射出一条直线,在发射过程中需要判断该射线有没有与游戏物体发送碰撞。射线既可以用来检测射击游戏中武器指向目标;又可以判断鼠标是否指向游戏物体。射线的创建方式,一般使用代码来…

11. Kubernetes 开章

本章讲解知识点 Kubernetes 概念为什么要使用 KubernetesKubernetes 的部署架构Kubernetes 基本命令本章主要是针对 Kubernetes 基本概念为读者讲解,读者能有一个大概印象即可,不需要过于斟酌细节,针对 Kubernetes 的概念将在后面章节中详细讲解。 1. Kubernetes 概念 我们…

学习Transformer前言(Self Attention Multi head self attention)

一、前言 一直在做项目,也比较懒没有挤出时间去学习新的东西,感觉停滞很久了,好长一段时间都没有新的知识输入,早就需要就去学习transformer了,因此先来学习注意力机制,本文为个人的一个笔记总结。主要是基…

Linux系统编程(三)—— 文件编程(3)进程环境

一、main函数 现在的格式:int main(int argc, char *argv[])以前的main函数有三个参数,另一个参数就是环境变量 二、进程的终止(两种都要背下来) 2.1 正常终止 (1)从main函数返回 main函数被称为程序的…

第10章:堆

堆是什么? 堆是一种特殊的完全二叉树。 完全二叉树:每层节点都完全填满,最后一层若是没填满,则只缺少右边的节点。所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。jav…

软考——数据结构,算法基础,程序设计语言,法律法规,多媒体基础

数据结构与算法基础 数组与矩阵线性表广义表树与二叉树图排序与查找算法基础及常见算法 数组 稀疏矩阵 直接把(0,0)带入,排除B,C 将(1,1)带入,排除D, 最终…

Python | 人脸识别系统 — 博客索引

本博客为人脸识别系统的博客索引 工具安装、环境配置:Python | 人脸识别系统 — 简介 1、UI代码 UI界面设计:Python | 人脸识别系统 — UI界面设计UI事件处理:Python | 人脸识别系统 — UI事件处理 2、用户端代码 用户端博客索引:…

Jupyter Notebook入门教程

Jupyter Notebook(又称Python Notebook)是一个交互式的笔记本,支持运行超过40种编程语言。本文中我们将介绍Jupyter Notebook的主要特点,了解为什么它能成为人们创造优美的可交互式文档和教育资源的一个强大工具。 首先&#xff…

vue diff算法与虚拟dom知识整理(4) h函数虚拟节点嵌套

那么 先补充上文有一个没强调的点 h函数 当你不需要属性时 其实是可以不传的 例如 我们打开案例 打开 src下的index.js 修改代码如下 import {init,classModule,propsModule,styleModule,eventListenersModule,h,} from "snabbdom";//创建patch函数const patch ini…

CUBLAS 和 CUDNN

文章目录 一、什么是CUBLASCUBLAS实现矩阵乘法CUBLAS中的Leading DimensionCUBLAS LEVEL3函数 : 矩阵矩阵CUBLAS实现矩阵乘法 二、cuDNN使用CuDNN实现卷积神经网络 四、CUBLAS和CUDNN实践 一、什么是CUBLAS cuBLAS是BLAS的一个实现。BLAS是一个经典的线性代数库&am…

解决C语言的缺陷【C++】

文章目录 命名空间展开了命名空间域指定访问命名空间域域作用限定符命名空间定义 C输入&输出缺省参数全缺省参数半缺省参数缺省参数应用 函数重载参数类型不同参数个数不同参数类型顺序不同 引用引用的特性引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实…

基于Radon-分数傅里叶变换对消器的海杂波弱目标检测

海面微弱目标检测面临的主要困难来自: 慢速小目标回波微弱;空时变海杂波异常复杂,海杂波特性认知难度大;目标模型难以建立;目标、海杂波类别非平衡。 ARU效应 是由于海面波浪的起伏和涟漪引起的。在雷达回波信号中&am…

nodejs开发 | 安全工具端口扫描器

今天分享一个nodejs的demo,可以扫描出指定IP的端口开放情况。 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8…

[笔记]Python计算机视觉编程《一》 基本的图像操作和处理

文章目录 前言环境搭建 计算机视觉简介Python和NumPy第一章 基本的图像操作和处理1.1 PIL:Python图像处理类库1.1.1 转换图像格式1.1.2 创建缩略图1.1.3 复制和粘贴图像区域1.1.4 调整尺寸和旋转 1.2 Matplotlib1.2.1 绘制图像、点和线 前言 今天,图…

python基础实战6-python字符串

1字符串的表达方式 字符串是 Python 中最常用的数据类型。我们可以使用引号 ( 或 " ) 来创建字符串。 字符串表达方式 a " I m Tom" #一对双引号 b ’Tom said:" I am Tom" #一对单引号 c ‘Tom said: " I\m Tom" #转义字符 d T…

python库,科学计算与数据可视化基础,知识笔记(numpy+matplotlib)

文章目录 1、numpyndarray对象,数组指定形状创建(要会)数组的索引,切片与遍历(要会)数组的相加,转置,展开(要会)数组元素增删改查(最好会&#xf…

当CRM遇见ChatGPT,AI如何帮销售打造“最强大脑”

导读:这一轮AI浪潮将对CRM企业带来哪些新机遇? ChatGPT诞生至今不过100多天,但它已经对很多行业产生了巨大影响。 企业直面市场的一线战场——销售、营销、客服等领域也是如此。以ChatGPT为代表的人工智能技术热潮正在改变着传统营销、销售的…

MySQL--group by--聚合函数--内置函数--0415 22

目录 1.聚合函数 1.1 count 1.2 sum 1.3 avg 1.4 max 和 min 2. group by 2.1 group by 的条件筛选——having 2.2 总结 3.日期函数 4.字符串函数 concat replace substring 以首字母大写,其余字母小写的方式显示员工的姓名 5.数学函数 format rand()…

C plus plus ——【继承与派生】

系列文章目录 C plud plus ——【面向对象编程】 C plus plus ——【继承与派生】 文章目录 系列文章目录前言一、继承1.1 类的继承1.2 继承后可访问性1.3 构造函数访问顺序1.4 子类隐藏父类的成员函数 二、重载运算符2.1重载运算符的必要性2.2重载运算的形式与规则2.3 转换运…