3.16 实战Kaggle比赛:房价预测

3.16.2 读取数据集

# 导入所需的模块和包%matplotlib inline
import d2lzh as d2l
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import data as gdata, loss as gloss, nn
import numpy as np
import pandas as pd# 注意路径:中文问题,使用斜杠 "/",不要使用反斜杠"\"
train_data = pd.read_csv('E:/kaggle/data/train.csv')
test_data = pd.read_csv('E:/kaggle/data/test.csv')# 训练数据集包含1460个样本、80个特征和1个标签
train_data.shape
output:(1460, 81)

测试数据集包含1459个样本和80个特征

# 需要将测试数据集中的每个样本的标签预测出来test_data.shape
output:(1459, 80)

查看训练数据集的前4个样本的前4个特征、后两个特征和标签

train_data.iloc[0 : 4, [0, 1, 2, 3, -3, -2, -1]]

查看测试数据集的前4个样本的前4个特征、后两个特征和标签

test_data.iloc[0 : 4, [0, 1, 2, 3, -3, -2, -1]]

  1. 数据集的第一个特征(第一列)是Id,它能帮助模型记住每个训练样本,但是不能推广到测试样本
  2. 测试样本的Id和训练样本的Id不能参与
  3. 训练集是[:, 1 : -1]是去掉Id和SalePrice特征
  4. 测试集是[:, 1:]是去掉Id
all_features = pd.concat((train_data.iloc[:, 1 : -1], test_data.iloc[:, 1:]))
all_features.shape
output:(2919, 79)

3.16.3 预处理数据集

# 对连续数值的特征做标准化:设该特征在整个数据集上的均值为μ,标准差为σ。
# 把该特征的每个值先减去μ再除以σ得到标准化后的每个特征值
# 对于缺失的特征值,将其替换成该特征的均值
# lambda定义简单函数,“:”后表达式只有一行且为函数返回值,":"之前是形式参数
# Python中apply函数的格式为:apply(func,*args,**kwargs)
# apply的返回值就是函数func函数的返回值
# fillna(a)会把缺失值填充为 anumeric_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[numeric_features] = all_features[numeric_features].fillna(0)# 将离散值转成知识特征# dummy_na = True 将缺失值也当作合法的特征值并为其创建指示特征
# pd.get_dummies用法参考:https://blog.csdn.net/maymay_/article/details/80198468all_features = pd.get_dummies(all_features, dummy_na = True)
all_features.shape# 通过values属性得到NumPy格式的数据,并转成NDArray方便后面的训练n_train = train_data.shape[0]   # 训练数据行数,即训练样本数
train_features = nd.array(all_features[:n_train].values)
test_features = nd.array(all_features[n_train:].values)
train_labels = nd.array(train_data.SalePrice.values).reshape((-1, 1))

3.16.4 训练模型

1. 使用基本的线性回归模型和平方损失函数来训练网络

loss = gloss.L2Loss()def get_net():net = nn.Sequential()net.add(nn.Dense(1))net.initialize()return net

2. 定义比赛用来评价模型的对数均方根误差

def log_rmse(net, features, labels):# 将小于1的值设为1,使得取对数时数值更稳定# 对net(features)处理成(1,float(inf)) 正无穷之间,小于1的取成1clipped_preds = nd.clip(net(features), 1, float('inf'))rmse = nd.sqrt(2 * loss(clipped_preds.log(), labels.log()).mean())return rmse.asscalar()

3. 使用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 = gdata.DataLoader(gdata.ArrayDataset(train_features, train_labels), batch_size, shuffle = True)# 这里使用Adam优化算法trainer = gluon.Trainer(net.collect_params(), 'adam', {'learning_rate':learning_rate, 'wd': weight_decay })for epoch in range(num_epochs):for X, y in train_iter:with autograd.record():l = loss(net(X), y)l.backward()trainer.step(batch_size)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.16.5 k折交叉验证

1. 实现函数,用来返回第i折交叉验证时所需要的训练和验证数据

# 用来选择模型设计并调节超参数def get_k_fold_data(k, i, X, y):assert k > 1                   # k = 1 就是原数据集,不用分了fold_size = X.shape[0] // k   # 整数除法,fold_size 是每份的样本数量X_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:                                         # 如果当前循环就是第i折交叉,当前数据就作为测试集X_valid, y_valid = X_part, y_partelif X_train is None:                             # 如果没有训练集,就把当前循环所使用数据作为训练数据X_train, y_train = X_part, y_partelse:                                             # 当前所使用的数据既不是测试数据,也不是第一份训练数据,就把X_train = nd.concat(X_train, X_part, dim = 0) # 当前数据添加进训练数据y_train = nd.concat(y_train, y_part, dim = 0)return X_train, y_train, X_valid, y_valid

2. 在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, 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,  # train_ls共有num_epochs个损失weight_decay, batch_size)train_l_sum += train_ls[-1]                              # 取train_ls的最后一个数是 本折循环 训练得到的最后损失valid_l_sum += valid_ls[-1]                              # 因为train函数中的train_ls是append进来的if i == 0:                                               # 只有第一次循环才画图d2l.semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'rmse',range(1, num_epochs + 1), valid_ls,['train', 'valid'])print('fold %d, train rmse %f, valid rmse %f'% (i, train_ls[-1], valid_ls[-1]))return train_l_sum / k, valid_l_sum / k

3.16.6 模型选择

  1. 使用一组未经调优的超参数并计算交叉验证误差
  2. 可改动这些超参数来尽可能地减小平均测试误差
k, num_epochs, lr, weight_decay, batch_size = 10, 1000, 6, 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))

output:fold 0, train rmse 0.123131, valid rmse 0.183182
fold 1, train rmse 0.123973, valid rmse 0.136109
fold 2, train rmse 0.122530, valid rmse 0.189163
fold 3, train rmse 0.117659, valid rmse 0.171328
fold 4, train rmse 0.118193, valid rmse 0.173402
fold 5, train rmse 0.123091, valid rmse 0.140670
fold 6, train rmse 0.122017, valid rmse 0.186078
fold 7, train rmse 0.124806, valid rmse 0.133579
fold 8, train rmse 0.112019, valid rmse 0.184292
fold 9, train rmse 0.121988, valid rmse 0.155886
10-fold validation: avg train rmse 0.120941, avg valid rmse 0.165369

3.16.7 预测并在Kaggle提交结果

1. 重训练数据集,得到预测结果submission.csv

  1. 在预测之前,使用完整的训练数据来重新训练模型,
  2. 并将预测结果存成提交所需要的格式
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.semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'rsme')print('train rmse %f' % train_ls[-1])preds = net(test_features).asnumpy()test_data['SalePrice'] = pd.Series(preds.reshape(1, -1)[0])submission = pd.concat([test_data['Id'], test_data['SalePrice']], axis = 1)submission.to_csv('E:/kaggle/data/submission.csv', index = False)
train_and_pred(train_features, test_features, train_labels, test_data, num_epochs, lr, weight_decay, batch_size)

output:train rmse 0.121889

2. 在kaggle网站上提交预测结果“submission.csv”

提交结果:

《动手学深度学习》笔记---3.16相关推荐

  1. 动手学深度学习笔记3.4+3.5+3.6+3.7

    系列文章目录 动手学深度学习笔记系列: 动手学深度学习笔记3.1+3.2+3.3 文章目录 系列文章目录 前言 一.softmax回归 1.1 分类问题 1.2 网络架构 1.3 全连接层的参数开销 ...

  2. [深度学习]动手学深度学习笔记-3

    Task-2 文本预处理:语言模型:循环神经网络基础 3.1 文本预处理 文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤: 读入文本 ...

  3. 动手学深度学习笔记(1)

    动手学深度学习 深度学习简介 深度学习简介 举一个小的例子,如何编写一个程序,让机器识别我输入的图片是否有一只猫?我们需要哪些值来帮助我们确定?事实上,要想解读图像中的内容,需要寻找仅仅在结合成千上万 ...

  4. 动手学深度学习:3.16 实战Kaggle比赛:房价预测

    3.16 实战Kaggle比赛:房价预测 作为深度学习基础篇章的总结,我们将对本章内容学以致用.下面,让我们动手实战一个Kaggle比赛:房价预测.本节将提供未经调优的数据的预处理.模型的设计和超参数 ...

  5. [深度学习]动手学深度学习笔记-5

    Task2--梯度消失.梯度爆炸 5.1 梯度消失与梯度爆炸的概念 深度神经网络训练的时候,采用的是反向传播方式,该方式使用链式求导,计算每层梯度的时候会涉及一些连乘操作,因此如果网络过深. 那么如果 ...

  6. [深度学习]动手学深度学习笔记-14

    Task9--目标检测基础 14.1 目标检测和边界框 在前面的一些章节中,我们介绍了诸多用于图像分类的模型.在图像分类任务里,我们假设图像里只有一个主体目标,并关注如何识别该目标的类别.然而,很多时 ...

  7. 动手学深度学习笔记4——微积分自动微分

    目录 1.微积分 1.1导数和微分 1.2偏导数 1.3梯度 1.4链式法则 1.5小结 1.6练习 2.自动微分 2.1一个简单的例子 2.2非标量变量的反向传播 2.3分离计算 2.4Python ...

  8. [深度学习]动手学深度学习笔记-15

    Task6--批量归一化和残差网络 15.1 批量归一化 本节我们介绍批量归一化(batch normalization)层,它能让较深的神经网络的训练变得更加容易.在(实战Kaggle比赛:预测房价 ...

  9. 动手学深度学习笔记(一)——权重衰退

            一直在csdn上学习别人发的博客,第一次尝试自己写博客,今天周日,在实验室小学一会,发现自己有些不明白的点突然想明白了,想记录一下在学习过程中遇到的难点或者有些迷惑的地方,希望自己以后 ...

  10. [深度学习]动手学深度学习笔记-12

    Task10--GAN:DCGAN 12.1 GAN原理 GAN的基本原理其实非常简单,这里以生成图片为例进行说明.假设我们有两个网络,G(Generator)和D(Discriminator).正如 ...

最新文章

  1. systemd下supervisord服务开机自启动以及注意事项
  2. python的切片和索引是什么_Python*really*中默认的切片索引是什么?
  3. 洛谷 P3128 [USACO15DEC]最大流Max Flow
  4. javascript 数组对象中的迭代方法
  5. SBuild 0.1.4 发布,基于 Scala 的构建系统
  6. 那些年,我们见过的 Java 服务端“问题”
  7. django mysql 游标,MySQL Cursor 存储过程之游标与相关循环
  8. java ip调天气预报接口_JAVA + WeatherWebService 实现天气预报接口调取
  9. NYOJ845 - 无主之地1
  10. 《MYSQL必知必会》—19~21.插入、更新、删除数据;创建、更新、删除表
  11. [导入]哪种图像格式最好?
  12. 「手把手带你学算法」本周小结!(动态规划系列七)
  13. QQ坦白说闹得我差点分手,破解揪元凶证清白
  14. 2021年度国内网络安全事件总结
  15. 一款经典的 jQuery Lightbox 灯箱效果
  16. 猿人学web端爬虫攻防大赛赛题解析_第七题:动态字体,随风漂移
  17. 女性内分泌失调的8种症状
  18. SSH新学,关于面向对象的看法
  19. Alexa 一键下单不好用?蓦然认知推出语音对话购物
  20. 关于bool operator< (const Edge W)const

热门文章

  1. Mysql_sql存储过程
  2. 陳三甲网络笔记:赚钱路上,一些人生思考(连载四)
  3. 【华为机试真题Java】用连续自然数之和来表达整数
  4. MT6739的Android9.0 Camera kernel 驱动
  5. 4、Linux:如何在zip压缩文件中搜索指定内容
  6. java 短信验证码(创蓝接口)调用
  7. 向量叉乘的右手螺旋定则
  8. js的高亮关键写法,简单粗暴,行之有效
  9. 华云大咖说 | 安超DCM给数据中心“做主”
  10. Realsense D435i Yolov5目标检测实时获得目标三维位置信息