1.下载缓存数据集

字典DATA_HUB,二元组包含数据集的url和验证文件完整性的sha-1密钥

import hashlib
import os
import tarfile
import zipfile
import requests#@save
DATA_HUB = dict()
DATA_URL = 'http://d2l-data.s3-accelerate.amazonaws.com/'

download到本地目录(默认情况下为…/data)并返回下载文件的名称

def download(name, cache_dir=os.path.join('..', 'data')):  #@save"""下载一个DATA_HUB中的文件,返回本地文件名。"""assert name in DATA_HUB, f"{name} 不存在于 {DATA_HUB}."url, sha1_hash = DATA_HUB[name]os.makedirs(cache_dir, exist_ok=True)fname = os.path.join(cache_dir, url.split('/')[-1])if os.path.exists(fname):sha1 = hashlib.sha1()with open(fname, 'rb') as f:while True:data = f.read(1048576)if not data:breaksha1.update(data)if sha1.hexdigest() == sha1_hash:return fname  # Hit cacheprint(f'正在从{url}下载{fname}...')r = requests.get(url, stream=True, verify=True)with open(fname, 'wb') as f:f.write(r.content)return fname

2.访问和读取数据集

# 如果pandas没有被安装,请取消下一句的注释。
# !pip install pandas%matplotlib inline
import numpy as np
import pandas as pd
import torch
from torch import nn
from d2l import torch as d2lDATA_HUB['kaggle_house_train'] = (  #@saveDATA_URL + 'kaggle_house_pred_train.csv','585e9cc93e70b39160e7921475f9bcd7d31219ce')DATA_HUB['kaggle_house_test'] = (  #@saveDATA_URL + 'kaggle_house_pred_test.csv','fa19780a7b011d9b009e8bff8e99922a8ee2eb90')
train_data = pd.read_csv(download('kaggle_house_train'))
test_data = pd.read_csv(download('kaggle_house_test'))print(train_data.shape)
print(test_data.shape)print(train_data.iloc[0:4, [0, 1, 2, 3, -3, -2, -1]])
all_features = pd.concat((train_data.iloc[:, 1:-1], test_data.iloc[:, 1:]))

2.数据预处理

使特征具有零均值和单位方差,即 E[x−μσ]=μ−μσ=0 和 E[(x−μ)2]=(σ2+μ2)−2μ2+μ2=σ2 。

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)

one-hot编码

# `Dummy_na=True` 将“na”(缺失值)视为有效的特征值,并为其创建指示符特征。
all_features = pd.get_dummies(all_features, dummy_na=True)
all_features.shape

从pandas的numpy格式转成tensor格式

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.SalePrice.values.reshape(-1, 1),dtype=torch.float32)

3.训练

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的值设置为1clipped_preds = torch.clamp(net(features), 1, float('inf'))rmse = torch.sqrt(loss(torch.log(clipped_preds), torch.log(labels)))return rmse.item()
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

4.k折交叉验证

将数据划分

def get_k_fold_data(k, i, X, y):assert k > 1fold_size = X.shape[0] // kX_train, y_train = None, Nonefor 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_partelif X_train is None:X_train, y_train = X_part, y_partelse: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, 0for 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]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'fold {i + 1}, train log rmse {float(train_ls[-1]):f}, 'f'valid log rmse {float(valid_ls[-1]):f}')return train_l_sum / k, valid_l_sum / k

5.模型选择

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}')

6.提交到kaggle

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'train log rmse {float(train_ls[-1]):f}')# 将网络应用于测试集。preds = net(test_features).detach().numpy()# 将其重新格式化以导出到Kaggletest_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)
train_and_pred(train_features, test_features, train_labels, test_data,num_epochs, lr, weight_decay, batch_size)

提交到kaggle(以下两步建议科学上网)
1.注册账号
2.Make Submission

总结

图像识别中,减均值除方差没什么用,在输入层加个BN就可以了
特征维度多或者少,影响不大

疑问:

k折交叉验证,可以尽可能的在数据量不大的前提下,使用更多的数据量进行训练,但是这样的话,会有不同的模型,模型选择问题
答:K折交叉验证只要是看模型的泛化能力的,另外也有使用更多的数据量进行训练的意思。
怎么kaggle上传自己的模型呢,
答:net实例中就包含了权重参数。

李沐《动手学》-kaggle-房价预测-submission相关推荐

  1. 李沐动手学深度学习V2-全卷积网络FCN和代码实现

    一.全卷积网络FCN 1. 介绍 语义分割是对图像中的每个像素分类,全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换 ,与前 ...

  2. 李沐动手学深度学习v2/总结1

    总结 编码过程 数据 数据预处理 模型 参数,初始化参数 超参数 损失函数,先计算损失,清空梯度(防止有累积的梯度),再对损失后向传播计算损失关于参数的梯度 优化算法,使用优化算法更新参数 训练求参数 ...

  3. 李沐动手学深度学习:08 线性回归(代码逐行理解)

    目录 一.相关资料连接 1.1 李沐视频 1.2 代码.PPT 二.代码及笔记(使用Jupyter Notebook) 2.1 线性回归从零开始实现 2.1.1 基本概念 2.1.2 基础优化算法 2 ...

  4. 【李沐动手学深度学习】读书笔记 01前言

    虽然之前已经学过这部分内容和深度学习中的基础知识,但总觉得学的不够系统扎实,所以希望再通过沐神的课程以及书籍,系统条理的学习一遍.在读书过程中,利用导图做了一下梳理,形成了这个读书笔记.如有侵权,请联 ...

  5. 李沐动手学深度学习(pytorch版本)d2lzh_pytorch包的缺少安装问题

    学习深度学习时候,很多人参考的是李沐的动手学深度学习Pytorch版本(附上官方地址:https://tangshusen.me/Dive-into-DL-PyTorch/#/). 在学习3.5.1节 ...

  6. windows上配置深度学习(李沐-动手学深度学习)

    1.安装miniconda windows下安装,去清华大学开源镜像下载,速度比较快. 选中Miniconda3-latest-Windos-x86_64.exe下载安装包(目前最新的是py3.9) ...

  7. 关于李沐动手学深度学习(d2l)pytorch环境本地配置

    本地安装d2l 由于之前试了很多次d2l课本的安装方法失败了,这里提供一种我可以成功安装d2l包的方法. pytorch安装 首先安装cuda.cudnn.pytroch(gpu版本).可以参考这篇文 ...

  8. 李沐动手学深度学习V2-实战Kaggle比赛:狗的品种识别(ImageNet Dogs)和代码实现

    一. 实战Kaggle比赛:狗的品种识别(ImageNet Dogs) 1. 介绍 在这场比赛中,将识别120类不同品种的狗,这个数据集是ImageNet的数据集子集,与 CIFAR-10数据集中的图 ...

  9. 李沐动手学深度学习V2-实战Kaggle比赛:叶子分类(Classify Leaves)和代码实现

    一. 叶子分类 预测叶子图像的类别,该数据集包含 176 个类别,18353 个训练图像,8800 个测试图像.每个类别至少有 50 张图像用于训练,测试集平均分为公共和私人排行榜,网址为:https ...

  10. 李沐动手学深度学习v2-目标检测中的锚框和代码实现

    一.目标检测中的锚框 前提: 本节锚框代码实现,使用了很多Pytorch内置函数,如果有对应函数看不懂的地方,可以查看前面博客对相应函数的具体解释,如下链接所示: Pytorch中torch.mesh ...

最新文章

  1. leetcode--删除排序数组中的重复项--python
  2. PAT1017 和强迫症做斗争
  3. windows Pycharm 常用快捷键
  4. 【caffe-Windows】caffe+VS2013+Windows+GPU配置+cifar使用
  5. 狂雨CMS小说采集规则 附教程
  6. C语言中以二进制形式输出文件
  7. linux命令大全 美pdf,Linux编程命令详解_10331298_(美)Richard..pdf-得力文库
  8. 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
  9. mvc:annotation-driven /
  10. 记一次物理服务器Linux系统中未找到网卡的处理方式
  11. 进行DosBox的下载与配置
  12. kali之msfconsole
  13. win10pe命令打开计算机,win10系统制作PE启动盘的操作方法
  14. qqxml图片代码_QQxml卡片代码合集超大图
  15. mac电脑投屏到小米盒子_巧用手机自带功能向电脑传无损照片视频 华为小米苹果均支持 小米盒子 苹果手机 投屏软件...
  16. java二元一次方程求极值_二元一次方程的最值怎么求,最大值和最 二元一次方程...
  17. c#尝试写入或者读取受保护的内存_C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 | 学步园...
  18. vue 使用tracking.js开发人脸识别功能
  19. 隔离升压电源模块24V功率可达40W宽电压输入高电压稳压输出
  20. 最全的人力资源行业精美报表模板,免费下载啦

热门文章

  1. GWAS和GS的结合:Single Step GWAS的应用
  2. 学渣的刷题之旅 leetcode刷题 7.整数反转
  3. 计算机图形学椭圆_椭圆算法| 计算机图形学
  4. 【Leetcode】232.用栈实现队列
  5. Android FFmpegMediaMetadataRetriever获取歌曲的作者
  6. python操作xlsx格式文件
  7. 金融科技数据中台基于 DolphinScheduler 的应用改造
  8. 我 stormzhang 来报道了!
  9. 视频播放移动端app网页前端模板源码下载
  10. JavaScript笔记(狂神说)