kaggle比赛:Predict California sales prices(房价预测)

目录

  • 1、比赛介绍:
  • 2、导入数据:
  • 3、项目构建:
    • 特征选择:
    • 预处理:
    • 训练:
    • 模型推理及保存预测结果:
  • 4、上传预测结果到kaggle:
  • 5、总结:

本文内容来源于《动手深度学习》一书。跟着沐神做kaggle比赛。

1、比赛介绍:

该任务是预测房屋销售价格的基础上的信息,如卧室的数量,生活区,位置,附近的学校,和卖方总结。

数据包括2020年在加州售出的房屋,测试数据集中售出的房屋排在训练数据集中之后。此外,私人排行榜房屋也在公开排行榜房屋之后出售。

数据如下图所示,通过下面的网址,下载训练数据和测试数据:

比赛链接.
在这里插入图片描述

2、导入数据:

在jupyter notebook里编写的,下面的格式也是:

使用pandas读入数据:

%matplotlib inline
import numpy as np
import pandas as pd
import torch
from torch import nn
from d2l import torch as d2ltrain_data = pd.read_csv(r"../data/kaggle_house_pred/train.csv")
test_data = pd.read_csv(r"../data/kaggle_house_pred/test.csv")
# print(train_data.columns)
# print(test_data.columns)
print(train_data.shape) # (47439, 41)
print(test_data.shape) # (31626, 40),少了一个出售价格,需要我们预测

(47439, 41)
(31626, 40)

其中trian_data比test_data多了一列,这一列就是我们要预测的房价。

[i for i in train_data.columns if i not in test_data.columns]

[‘Sold Price’]

从上面可以看出,我们要预测的房价列名为Sold Price

3、项目构建:

打印训练数据的前四列,看看特征,以及相应标签,以便我们选择特征:

train_data.iloc[0:4]

(这里打印很乱,截图)
在这里插入图片描述

可以发现,一共有41列,也就是41个特征。额,这么说也不对,其中还有一列是标签,一列是id。

特征选择:

特征选择是个挺麻烦的事,直接关系到后面模型预测的结果,而且要是特征选择的特别多,而我们的数据不够多,很容易就过拟合了。

先看看train_data和test_data有哪些特征:

train_data.columns
Index(['Id', 'Address', 'Sold Price', 'Summary', 'Type', 'Year built','Heating', 'Cooling', 'Parking', 'Lot', 'Bedrooms', 'Bathrooms','Full bathrooms', 'Total interior livable area', 'Total spaces','Garage spaces', 'Region', 'Elementary School','Elementary School Score', 'Elementary School Distance','Middle School', 'Middle School Score', 'Middle School Distance','High School', 'High School Score', 'High School Distance', 'Flooring','Heating features', 'Cooling features', 'Appliances included','Laundry features', 'Parking features', 'Tax assessed value','Annual tax amount', 'Listed On', 'Listed Price', 'Last Sold On','Last Sold Price', 'City', 'Zip', 'State'],dtype='object')
test_data.columns
Index(['Id', 'Address', 'Summary', 'Type', 'Year built', 'Heating', 'Cooling','Parking', 'Lot', 'Bedrooms', 'Bathrooms', 'Full bathrooms','Total interior livable area', 'Total spaces', 'Garage spaces','Region', 'Elementary School', 'Elementary School Score','Elementary School Distance', 'Middle School', 'Middle School Score','Middle School Distance', 'High School', 'High School Score','High School Distance', 'Flooring', 'Heating features','Cooling features', 'Appliances included', 'Laundry features','Parking features', 'Tax assessed value', 'Annual tax amount','Listed On', 'Listed Price', 'Last Sold On', 'Last Sold Price', 'City','Zip', 'State'],dtype='object')

train_data中Sold Price需要剔除,因为是标签。 train_data和test_data中的Id需要剔除,因为和结果无关。(重点放在,删除的语法怎么写,以后方便查看)


在从数据集中删除ID,同时把训练和测试数据集合并起来:

合并起来的原因是:为了在整个数据集上进行归一化。

all_features = pd.concat((train_data.iloc[:, 1:-1], test_data.iloc[:, 1:])) # 注意:这里将训练集和测试集合并成了一个数据集,以便归一化数据

因为都是加州的房子,需要剔除State;Summary是文本数据,分析有限就直接剔除,同理Address:每个房子的地址都不同,如果进行独热编码负担太大,分析也有限,所以也剔除。另外:

由于我打算使用MLP进行房价预测,比较简单,所有我就自己选择了一些认为影响房价的特征:Year built、Lot、Bedrooms、Bathrooms、Full bathrooms、Total spaces、High School Score、Tax assessed value、Annual tax amount、Listed Price、Last Sold Price、Zip

(我原本想着Summary是文本数据,也就是对房子的评价,建立一个模型把Summary进行分类,再送入预测房价的模型中,但是有点麻烦,主要还是不熟,就没弄)。

all_features = all_features.loc[:, ["Year built", "Lot", "Bathrooms", "Full bathrooms", "Total spaces", "High School Score","Tax assessed value", "Annual tax amount", "Listed Price", "Last Sold Price", "Zip"]]

预处理:

存在缺失值,这里的原始数据用NAN表示缺失。看看是否有nan值,也就是缺失值

np.any(all_features.isnull()) # 看看是否有nan值,也就是缺失值
# 返回True,说明有缺失值

True

发现有缺失值。


  • 一、数值特征:将所有缺失的值替换为相应特征的平均值。 通过将特征重新缩放到零均值和单位方差来标准化数据:
# 获取数值特征的索引名
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) # 因为已经标准化数据了,这些特征的缺失值用平均值0填充
print(numeric_features)

Index([‘Year built’, ‘Lot’, ‘Bathrooms’, ‘Full bathrooms’, ‘Total spaces’,
‘High School Score’, ‘Tax assessed value’, ‘Annual tax amount’,
‘Listed Price’, ‘Last Sold Price’, ‘Zip’],
dtype=‘object’)

  • 二、离散值特征:用一次独热编码替换
# 字符串特征,则用one-hot编码替换
all_features = pd.get_dummies(all_features, dummy_na=True) # pd.get_dummies是:利用pandas实现one hot encode的方式
all_features.shape

(79065, 11)


从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)
print(train_features.shape) # 两个维度,0维:样本数;1维:特征数
print(train_labels.shape) # 标签

torch.Size([47439, 11])
torch.Size([47439, 1])

训练:

loss = nn.MSELoss() # 均方损失函数
in_features = train_features.shape[1] # 特征数def get_net():net = nn.Sequential(nn.Linear(in_features, 32),nn.ReLU(),nn.Linear(32, 16),nn.ReLU(),nn.Linear(16, 1)) # 多层感知机return net

我们更关心相对误差 y − y ^ y \frac{{{\rm{y}} - \hat y}}{y} yyy^(RMSE),解决这个问题的一种方法是用价格预测的对数来衡量差异:

def log_rmse(net, features, labels):# torch.clamp函数:将输入input张量每个元素的夹紧到区间 [min,max][min,max],并返回结果到一个新张量。这里是区间1~无穷大clipped_preds = torch.clamp(net(features), 1, float('inf')) # 将标签和预测值取对数,并送入rmse中rmse = torch.sqrt(loss(torch.log(clipped_preds), torch.log(labels)))return rmse.item() # 返回数值,而不是tensor

我们的训练函数将借助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) # 将训练数据打包成batch_size大小,并可迭代取出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) # 计算损失,注意:pytorch会自动将向量转换成标量,以便反向传播计算导数l.backward() # 反向传播:计算梯度optimizer.step() # 更新参数train_ls.append(log_rmse(net, train_features, train_labels)) # 将训练的对数rmse保存下来,以便返回if test_labels is not None:test_ls.append(log_rmse(net, test_features, test_labels)) # 将测试的对数rmse保存下来,以便返回return train_ls, test_ls

K折交叉验证:

def get_k_fold_data(k, i, X, y): # i表示第几折assert k > 1fold_size = X.shape[0] // k # 分成k份,每折的大小X_train, y_train = None, Nonefor j in range(k):idx = slice(j * fold_size, (j + 1) * fold_size) # slice() 函数实现切片对象,主要用在切片操作函数里的参数传递。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): # 做k次data = get_k_fold_data(k, i, X_train, y_train) # 获取训练集和验证集net = get_net() # 模型if torch.cuda.is_available():net = net.cuda()data = data.cuda()train_ls, valid_ls = train(net, *data, num_epochs, learning_rate,weight_decay, batch_size) # 得到损失,注意:data传入的是列表train_l_sum += train_ls[-1]valid_l_sum += valid_ls[-1]if i == 0: # 画第1折训练的曲线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

模型训练及选择:

k, num_epochs, lr, weight_decay, batch_size = 5, 100, 0.01, 0.1, 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}')

fold 1, train log rmse 0.496148, valid log rmse 0.481028
fold 2, train log rmse 0.515603, valid log rmse 0.496411
fold 3, train log rmse 0.348585, valid log rmse 0.334969
fold 4, train log rmse 0.341814, valid log rmse 0.354099
fold 5, train log rmse 0.367565, valid log rmse 0.438403
5-折验证: 平均训练log rmse: 0.413943, 平均验证log rmse: 0.420982

在这里插入图片描述

模型推理及保存预测结果:

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()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(r'../data/kaggle_house_pred/submission.csv', index=False) # 将预测的房价结果保存下来train_and_pred(train_features, test_features, train_labels, test_data,num_epochs, lr, weight_decay, batch_size)

train log rmse 0.309912

在这里插入图片描述

4、上传预测结果到kaggle:

在这里插入图片描述
下面是我得的分数,也就是使用多层感知机(MLP)进行预测:
在这里插入图片描述

5、总结:

其实对于机器学习模型,最费时间,最费精力的不是模型的构建,而是数据的处理,就比如这个房价预测,要是把数据处理好了,好多模型都可以使用框架快速的搭建出来。

在这里我使用了 两层的感知机,并在每层使用relu激活函数,得到的预测结果还不错。但是我对于特征的选择和处理方面做的太少了。

看别人使用了全基本全部的特征,使用了多种方法,自然得分更高。我在最开始也把所有特征加入了,但是由于字符串特征直接用one-hot编码,使得特征变得很大(10万+),而我对于其他的编码不熟悉,因此就手动的选择了特征。

后面学到更多的模型了再做改进!!!

加油!!!

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

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

相关文章

实际波动率预测:kaggle比赛

实际波动率预测 1. 比赛概述1.1 背景介绍1.2 赛事目标1.3 评估指标和结果提交 2. 数据介绍2.1 book_[train/test].parquet2.2 trade_[train/test].parquet2.3 train.csv2.4 test.csv2.5 sample_submission.csv 3. Optiver提供的[官方帮助文档](https://www.kaggle.com/jiashenl…

[Kaggle比赛] 高频股价预测小结

高频股价预测 文章目录 高频股价预测问题描述问题分析数据分析数据集数据清洗 解决方案数据预处理归一化PricesVolume时间信息对于预测值的处理噪声 模型探索基于LSTM的RNN模型递归神经网络(RNN)长短期记忆(LSTM)网络模型实现参数调整 卷积神经网络卷积神…

Predict Future Sales 预测未来销量, Kaggle 比赛,LB 0.89896 排名6%

Predict Future Sales 数据分析1. 数据基本处理1.1 读入数据集1.2 基线模型预测1.3 节省存储空间 2. 数据探索2.1 训练集分析 sales_train2.1.1 每件商品的销量2.1.2 每个商店的销量2.1.3 每类商品的销量2.1.4 销量和价格的离群值 2.2 测试集分析2.3 商店特征2.3.1 商店信息清洗…

世界杯押注还得看技术流,这个预测AI把赔率也算上了

胡澎 发自 凹非寺 量子位 报道 | 公众号 QbitAI 世界杯小组赛将收官,你还依然信AI吗? 冷门频出,黑马击败豪强。不少AI模型始料未及。 到底还能不能愉快找到科学规律?或者说足球比赛乃至其他竞技体育赛事,数据科学家在A…

足球大数据预测实战之高胜率盈亏条件验证及优化算法

上周接到一位老用户,之前为他做过数据验证,给出了组合条件下的胜率回查,结果有些难看啊。这期主要介绍常用人工智能算法中在足球预测中的应用,以及数据验证后的实际效果。 由上图为用户依据条件查证后的比赛场次和概率统计。可以看…

苹果手机朝下无法唤醒Siri,这个解决方法你知道吗

Siri对于苹果手机的用户来说是一个非常大的吸引点,能够指挥苹果手机中的Siri去做很多事情,如:放一首歌曲、百度一些知识点、这句话用英语怎么说等等功能。但是,不知道你们有没有发现一般我们苹果手机朝下无法唤醒Siri。是不是觉得…

如何解决Siri无法正常运行的问题

Siri 是一位智能助理,能帮助你在 Apple 设备上更快速轻松地处理各种事务,甚至不用等你开口。 Mac 上的 Siri 可帮助您执行日常任务,如获取问题的快速***、播放音乐等。您可以询问 Siri 几乎任何内容,Siri 都可以为您执行或回答您的问题。如果在使用 Siri…

【推荐实践】多场景多任务学习在美团到店餐饮推荐的实践

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年2月份热门报告合集 ChatGPT团队背景研究报告 ChatGPT的发展历程、原理、技术架构及未来方向 ChatGPT使用总结:150个ChatGPT提示此模板 ChatGPT数据集之谜 …

倒计时3天!2023新榜AIGC生态大会看点剧透

倒计时3天!「AIGC赋能重塑内容生态」2023新榜AIGC生态大会将于7月14日在北京丽都皇冠假日酒店重磅登场。 内容行业正在步入AI时代。 AIGC(AI Generated Content,即人工智能生成内容)被认为是继OGC、PGC和UGC之后的新型内容生产方式…

携程平台增长部总经理王绩强:原生互联网企业正在经历一场数字升级丨数据猿专访...

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 以大数据和人工智能为核心,众多新兴技术开始赋能数字营销。于是,智能营销已然从工具化走向了业务化。 如今,数字化营销已经成为了企业数字化转型中的重要一环。相较于传统营销逻辑&#x…

技术总监亲自上阵,手撸了个推荐系统!

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年2月份热门报告合集 从0到1详解推荐系统基础知识和框架 推荐技术在vivo互联网商业化业务中的实践.pdf 推荐系统基本问题及系统优化路径.pdf 大规模推荐类深度学习系统的…

融合GPT大模型产品,WakeData新一轮产品升级

近期,WakeData惟客数据(以下简称 “ WakeData ” )完成了新一轮的产品能力升级。就 ToB 企服公司如何融合GPT 大模型,WakeData 给出了自己的答案。 在2022年11月的产品发布会上,已传递出WakeData的“三个坚定”&#x…

借助chatGPT强大的源码理解能力,来快速学习elasticsearch 7.11.1整体源码结构(用chatGPT学源码太香了)

ES阅读学习源码的难处 es的源码非常之多。能够查阅的资料非常少。如果是我们一行一行的去扒着源码看,在我看来至少需要2年的时间,并且至少要耗费四分之一的头发。源码读起来很枯燥,特别是在我们一头雾水的时候。很容易产生放弃的念头。很少有…

大语言模型中的涌现现象是不是伪科学?

深度学习在理论上的孱弱一直被诟病,但科学史上存在大量先有应用再有理论的事例,而其中不能解释的重大实验现象往往预示着理论创新的契机。我们首先从现象出发,来看下LLM中最神秘的emergent ability,如图 上图中x、y轴分别表示模型…

自制开源的 Midjourney、Stable Diffusion “咒语”作图工具

本篇文章聊聊如何通过 Docker 和八十行左右的 Python 代码,实现一款类似 Midjourney 官方图片解析功能 Describe 的 Prompt 工具。 让你在玩 Midjourney、Stable Diffusion 这类模型时,不再为生成 Prompt 描述挠头。 写在前面 本文将提供两个版本的工…

【区块链技术社区】区块链微信群

磨链mochain社区-区块链技术讨论交流不定期进行线上的技术交流学习,技术分享。线下技术交流,成员主要在北京、上海、浙江、广东等地。欢迎:区块链技术大咖、区块链爱好者、区块链技术爱好者、想了解区块链技术的小白不欢迎:广告党…

区块链笔记:典型应用:数据资产、交易系统、即时通信、链上游戏、追踪溯源等

数据资产 1 ) 详解 这是区块链的一个比较核心的应用,对于软件系统或者说对于互联网系统来讲,对数据的处理、分析、计算,这些功能是属于比较基本的软件功能对于区块链来讲它的核心的功能是在于创新式的提供了一个原先各种软件都没…

靠谱的区块链应用到底是啥?通证啊!——第二次中关村-CSDN区块链开发技术沙龙【含PPT下载】

针对“通证”话题的多篇分析文章预热,本期沙龙在开始前就被区块链网友广泛关注。此次沙龙的参会者经过层层的严格筛选,才得以与众位大咖面对面沟通。 12月15日下午,中关村区块链产业联盟、CSDN、枫玉科技联合举办的区块链系列沙龙。来自中关村…

云图说丨不同区块链之间如何跨链交互?

本文分享自华为云社区《【云图说】第237期 不同区块链之间如何跨链交互?》,作者: 阅识风云。 可信跨链服务是基于一系列制定的可信区块链标准跨链协议,保证跨链交易全栈可追溯、可扩展性及可靠性等,助力不同区块链可…

知乎高赞 | 区块链是什么? (一)

首先不要把区块链想的过于高深,他是一个分布在全球各地、能够协同运转的数据库存储系统,区别于传统数据库运作——读写权限掌握在一个公司或者一个集权手上(中心化的特征),区块链认为,任何有能力架设服务器…