kaggle房价预测

通过前面的学习,实战一个房价预测项目,kaggle房价预测,该数据集涵盖了2006-2010年期间亚利桑那州埃姆斯市的房价,包含了很多特征。

导入所需的包

%matplotlib inline
import pandas as pd
import torch
import numpy as np
from torch import nn
from d2l import torch as d2l

使用pands读取数据并查看

train_data = pd.read_csv('D:\kaggle\data\kaggle_house/train.csv')
test_data = pd.read_csv('D:\kaggle\data\kaggle_house/test.csv')
print(train_data.shape)
print(test_data.shape)
(1460, 81)
(1459, 80)

可以看到,训练数据集包括1460个样本,每个样本80个特征和1个标签, 而测试数据集包含1459个样本,每个样本80个特征。

查看一些特征:

print(train_data.iloc[0:4, [0, 1, 2, 3, -3, -2, -1]])
   Id  MSSubClass MSZoning  LotFrontage SaleType SaleCondition  SalePrice
0   1          60       RL         65.0       WD        Normal     208500
1   2          20       RL         80.0       WD        Normal     181500
2   3          60       RL         68.0       WD        Normal     223500
3   4          70       RL         60.0       WD       Abnorml     140000

可见每个样本的第一个特征是 ID,它对预测起不到任何作用,因此,在将数据提供给模型之前,我们将其从数据集中删除。

all_features = pd.concat((train_data.iloc[:, 1:-1], test_data.iloc[:, 1:]))

数据预处理

在开始建立模型之前, 需要对数据进行预处理,要考虑数据是否过大,数据缺失,离散数据的问题。

我们先将所有的数据放到一个共同的尺度上,通过数据均值和标准差进行处理:

\large x \leftarrow \frac{x - \mu }{\sigma }

并且对数据中缺失的值填充为 0 :

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)

然后对离散的数据进行处理,使用 pd.get_dunmmies方法,例如 MSZoning 包含RL,RM值,该方法会创建两个新的特征,MSEoning_RL,MSEoning_RL ,它们值为 0 或 1,这样就能对离散的数据进行表示:

all_features = pd.get_dummies(all_features, dummy_na=True)
all_features.shape

这样处理完之后,特征的总数据增加到了 331 个:

2919, 331)

最后将数据转换成 tensor ,得到train_features,test_features,便于训练:

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)

训练

我们仍然使用损失平方的线性模型,并构建神经网络:

loss = nn.MSELoss()
in_features = train_features.shape[1]def get_net():net = nn.Sequential(nn.Linear(in_features,1))return net

还要考虑的一个关键问题是在最后测试房价预测情况时,用什么函数进行误差分析,如果单纯的考虑绝对误差  \large y - \widehat{y} 时,比如在农村地区估计房价时,假设那里的房子平均价格 13 万美元,模型预测偏差了 10 万美元,这样的误差很大,但是相同的误差在豪宅区的房价预测就是比较优秀的预测,比如那里房子平均价格 400 万美元。

这里用价格的对数来衡量差异:

\large (\frac{1}{n} \sum_{i = 1}^{n}(logy_{i} - log\widehat{y_{i}})^{2})^{1/2}

def log_rmse(net, features, labels):clipped_preds = torch.clamp(net(features), 1, float('inf'))rmse = torch.sqrt(loss(torch.log(clipped_preds),torch.log(labels)))return rmse.item()

这里的训练函数使用Adam优化器,Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率更新所有的权重,学习率在训练过程中并不会改变。而 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

K折交叉验证

该算法需要先将数据分成 K 份,然后先是第一份数据是验证集,剩余数据合并成训练集,然后第二份数据是验证集,剩余数据合并成训练集 …… 最后训练 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 = np.concatenate([X_train, X_part], 0)y_train = np.concatenate([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'折{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 折交叉验证设置合理的参数

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}')
折1,训练log rmse0.169478, 验证log rmse0.156870
折2,训练log rmse0.161967, 验证log rmse0.188370
折3,训练log rmse0.164111, 验证log rmse0.168343
折4,训练log rmse0.167733, 验证log rmse0.154772
折5,训练log rmse0.162926, 验证log rmse0.182832
5-折验证: 平均训练log rmse: 0.165243, 平均验证log rmse: 0.170237
<Figure size 252x180 with 1 Axes>

最终得到了 5- 折验证的平均训练损失和平均验证损失,由于我们对数据进行了充分的利用,该验证具有不错的稳定性,使得最终的数据集上较难发生过拟合,那么就可以把该损失当成一个指标。可以对模型中的一些参数进行调整,最终得到更低的损失。

并且,有时调整参数后的训练误差可能非常低,但K折交叉验证的误差要高得多, 这表明模型过拟合了。 在整个训练过程中,更加希望监控训练误差和验证误差。较少的过拟合可能表明现有数据可以支撑一个更强大的模型。

最后对整个训练集进行训练得到的误差也是接近 K 折交叉验证得到的误差:

def trainp(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}')

trainp(train_features, test_features, train_labels, test_data,num_epochs, lr, weight_decay, batch_size)
训练log rmse:0.162241

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas与ChatGPT的超强结合,爆赞!

来自公众号&#xff1a;数据STUDIO Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据科学家和分析师的必备工具。它提供了一种有效的方法来管理结构化数据(Series和DataFrame)。 在人工智能领域&#xff0c;Pandas经常用于机器学习和深…

一个浏览器插件畅享Chat GPT,还有更多实用小组件、高清壁纸

即使chatGPT已经火爆了一段时间了&#xff0c;但它仍然是目前备受关注的话题。而在国内使用需要一定的成本&#xff0c;许多人甚至根本找不到注册的办法&#xff0c;因此也衍生了不少代注册服务。但其实国内也有不少可以体验和chatGPT几乎同样服务的办法&#xff0c;这篇文章就…

docker一键部署网址导航+博客+管理系统(强势开源)

花森门户 码云仓库地址&#xff1a;https://gitee.com/HuaSenJioJio/huasenjio-compose Github仓库地址&#xff1a;https://github.com/huasenjio/huasenjio-compose &#x1f4cc; 关于 花森系列网站增添新作品&#xff0c;&#xff08;huasenjio-compose&#xff09;官方仓…

【LLMs】关于LLMs的语义搜索

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

AI_Papers:第一期

2023.02.06—2023.02.12 文摘词云 Top Papers Subjects: cs.CL 1.Multimodal Chain-of-Thought Reasoning in Language Models 标题&#xff1a;语言模型中的多模式思维链推理 作者&#xff1a;Zhuosheng Zhang, Aston Zhang, Mu Li, Hai Zhao, George Karypis, Alex Sm…

基于ChatGPT用AI实现自然对话

1.概述 ChatGPT是当前自然语言处理领域的重要进展之一&#xff0c;通过预训练和微调的方式&#xff0c;ChatGPT可以生成高质量的文本&#xff0c;可应用于多种场景&#xff0c;如智能客服、聊天机器人、语音助手等。本文将详细介绍ChatGPT的原理、实战演练和流程图&#xff0c…

怎样用一周时间研究 ChatGPT

我是怎样用一周时间研究 ChatGPT 的&#xff1f; 上周大概开了 20 多个会&#xff0c;其中有一些是见了觉得今年可能会比较活跃出手的机构&#xff0c;其余见的绝大多数是和 ChatGPT 相关。 我后面就以 ChatGPT 为例&#xff0c;讲下我是如何快速一周 cover 一个赛道的&#x…

走进机器学习

作者简介&#xff1a;本人是一名大二学生&#xff0c;就读于人工智能专业&#xff0c;学习过c&#xff0c;c&#xff0c;java&#xff0c;python&#xff0c;Mysql等编程知识&#xff0c;现在致力于学习人工智能方面的知识&#xff0c;感谢CSDN让我们相遇&#xff0c;我也会致力…

Spring 20年:缔造Java领域神话,近90% Java程序员形影不离

题图 | Image by Freepik 摘要&#xff1a;在编程世界&#xff0c;代码耦合性高、复杂性大的问题一直折磨着所有开发人员。为了解决这个问题&#xff0c;程序员前仆后继开发出了各种框架。但是没有一个特别能打、且让大部分程序员拍手称快的框架诞生。直到有一位年轻但经验丰富…

程序员的三大优点:懒惰、急躁和傲慢

1987 年的今天&#xff0c;Perl 1.0 发布。 今天是 Perl 语言诞生 35 周年。 忽略一下这张图的时间 Perl 语言发明人 Larry Wall 是一位传奇的黑客、一个风趣幽默的人。他的传世名言—— 程序员的三大优点是&#xff1a;懒惰、急躁和傲慢。 在编程圈子的普及程度大概仅次于——…

Qt6教程之三(19) Git版本管理工具

一 Git简介 Git的由来 是一个开源的分布式版本控制系统 ,用于有效、高速的处理从很小到非常大的项目版本管理。 Git 最初是由Linus Torvalds设计开发的&#xff0c;用于管理Linux内核开发。 GitHub是一个基于Git的远程文件托管平台&#xff08;同GitCafe、BitBucket和GitLab等…

Android中如何使用GPS

Android中如何使用GPS获取位置信息&#xff1f;一个小Demo如下 GPS简介 Gobal Positioning System&#xff0c;全球定位系统&#xff0c;是美国在20世纪70年代研制的一种以人造地球卫星为基础的高精度无线电导航的定位系统&#xff0c;它在全球任何地方以及近地空间都能够提供…

【万字长文】深度解析 Transformer 和注意力机制(含完整代码实现)

深度解析 Transformer 和注意力机制 在《图解NLP模型发展&#xff1a;从RNN到Transformer》一文中&#xff0c;我介绍了 NLP 模型的发展演化历程&#xff0c;并用直观图解的方式为大家展现了各技术的架构和不足。有读者反馈图解方式虽然直观&#xff0c;但深度不足。考虑到 Tra…

全球首位 AI 律师出庭,花 100 万美元找“传话筒”!网友:头脑正常的人谁会同意?...

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 在 ChatGPT 的热潮下&#xff0c;近来在国内外科技网站上&#xff0c;各类 AI 话题几乎成为了“热搜常驻户”&#xff0c;其中不乏一些看起来极具噱头的新闻&#xff1a; 本周&#xff0c;AI 公司 Do…

Edge浏览器的美化

用了扩展软件后的Edged的界面为 非常方便 &#xff0c;同时它还可以添加一些你需要用用到的app&#xff0c;无需下载。 它侧栏还有程序员选择&#xff0c;我们在这里可以直接进入CSDN。 废话不多说直接上教程&#xff1a; 1.打开Edge找到扩展选项&#xff0c;点击管理扩展。 …

这才是我想要是游览器——打造最强Microsoft edge+ChatGPT

这也许是你的Microsoft edge界面&#xff1a; 而这时我的edge游览器界面&#xff1a; 对比一下&#xff0c;第一个是默认的游览器界面&#xff0c;第二个是升级后的游览器界面。 是不是感觉第一个比较土呢第二个更高大上一些呢 其实相差巨大的主页&#xff0c;其实只是一个插…

TR外汇黑平台资金盘深度揭秘,谨防上当受骗,迟早会跑路

本人是有着13年外汇经验的外汇人&#xff0c;行业的大小事情&#xff0c;各级的产业链也基本都接触过&#xff0c;算是一个很资深的行业人士了&#xff0c;这么多年可以说是从刀光剑影中走过来&#xff0c;想想也很不容易了。本人vx&#xff1a;yunshao886 本篇所讲内容&#…

玩转 ChatGPT,看这条就够了,Prompt 最全中文合集

Prompt 最全中文合集 玩转 ChatGPT&#xff0c;看这条就够了&#xff01; &#x1f680; 简化流程&#xff1a;ChatGPT Shortcut 提供了快捷指令表&#xff0c;可以快速筛选和搜索适用于不同场景的提示词&#xff0c;帮助用户简化使用流程。 &#x1f4bb; 提高生产力&#…

美国探亲签证面签时一定要用英语吗?

签证问题&#xff1a;美国探亲签证面签时一定要用英语吗&#xff1f; 知识人网&#xff1a;申请美国探亲签证&#xff0c;面签时不会说英语也没有关系的。面签时不一定要说英语&#xff0c;您可以用中文面谈。美国签证官都精通英语和中文&#xff0c;您在面签时可以选择用中文…

中外互免签证协定一览表(普通护照与公务普通护照)

普通护照&#xff1a;由公安部出入境管理机构或者公安部委托的县级以上地方人民政府公安机关出入境管理机构以及中华人民共和国驻外使馆、领馆和外交部委托的其他驻外机构签发&#xff0c;主要颁发给出国定居、探亲、访友、继承财产、留学、就业、旅游等因私事出国的中国公民。…