飞桨AI Studio之加州房子预测——机器学习的Hello world

目录

飞桨AI Studio之加州房子预测(上)——机器学习的Hello world

前言

一、比赛分析

二、数据分析及处理

导入库

读取数据

数据预处理

网络定义

RMSE定义

训练函数

超参数定义和训练

生成提交文件

提交结果

总结


前言

房价预测这个比赛,我个人认为是比MNIST更加适合新手入门的一个项目,而且Kaggle上有现成的比赛,可以通过这个平台去检验自己的一些成果。

这个比赛主要还是锻炼对于数据处理的能力,对于搭建模型没有什么特别大的需求,比较适合新手。

我这里只是使用了飞浆的平台,但比赛还是在Kaggle上比的,具体网址如下。

House Prices - Advanced Regression Techniquesw

我以下的所有代码都是在飞浆的AI Studio中运行的

notebook链接

一、比赛分析

简单的说,比赛提供了有关一些加州房子的信息,其中包括其买入价格,房子的修建情况等79项信息,其中的信息有数值信息也有包含字符的信息,我们需要根据这些信息去预测test数据集中得到房价。

在这个房价预测中,我们的评价指标是RMSE,且数据采用的是log形式(因为房价差距会很大,取log防止因为这个房价的定位影响结果)

 我们需要提交的形式是csv格式下,房子的Id和其销售价格

二、数据分析及处理

我这里因为只是作为一个baseline,主要是对数据做一个可视化和将其简单的处理使其可以训练。

导入库

import pandas as pd
import numpy as np
import paddle
import paddle.nn as nn
import paddle.nn.functional as F
import paddle.optimizer as optimizer
import matplotlib.pyplot as plt

读取数据

# 读取文件
train_path = '/home/aistudio/data/data109189/train.csv'
test_path = '/home/aistudio/data/data109189/test.csv'
train_dataset = pd.read_csv(train_path)
test_dataset = pd.read_csv(test_path)
print(train_dataset.shape)
print(test_dataset.shape)
train_dataset.head()"""
(1460, 81)
(1459, 80)
"""

Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape LandContour Utilities ... PoolArea PoolQC Fence MiscFeature MiscVal MoSold YrSold SaleType SaleCondition SalePrice
0 1 60 RL 65.0 8450 Pave NaN Reg Lvl AllPub ... 0 NaN NaN NaN 0 2 2008 WD Normal 208500
1 2 20 RL 80.0 9600 Pave NaN Reg Lvl AllPub ... 0 NaN NaN NaN 0 5 2007 WD Normal 181500
2 3 60 RL 68.0 11250 Pave NaN IR1 Lvl AllPub ... 0 NaN NaN NaN 0 9 2008 WD Normal 223500
3 4 70 RL 60.0 9550 Pave NaN IR1 Lvl AllPub ... 0 NaN NaN NaN 0 2 2006 WD Abnorml 140000
4 5 60 RL 84.0 14260 Pave NaN IR1 Lvl AllPub ... 0 NaN NaN NaN 0 12 2008 WD Normal 250000

5 rows × 81 columns

可以看到数据训练集包含1460个,其中除去ID和saleprice有79个特征。

测试集和1459个,不包含saleprice这一栏故有80列。

其中特征包含数字,文本,还有许多数据丢失。

数据预处理

这里数据的预处理主要是针对将数值数据作归一化,将字符数据做one-hot编码,对缺失数据进行处理和划分训练集和验证集

这里说一下,为什么要把训练集和测试集的特征放到一起处理

一是因为做one-hot编码时,训练集中的字符信息测试集不一定有,不一起处理,会导致总的特征数不一样。

二是因为一起处理更加方便

# 先把训练集的label取出来
train_label = train_dataset['SalePrice']
# 合并一下测试集和训练集的信息
train_test_data = pd.concat([train_dataset.iloc[:, 1:-1], test_dataset.iloc[:, 1:]])
# 获取数值特征
numeric_features = train_test_data.dtypes[train_test_data.dtypes != 'object'].index
# 均一化所有数值特征
train_test_data[numeric_features] = train_test_data[numeric_features].apply(lambda x: (x - x.mean())/ (x.std()) )
# 将所有丢失的数据变为0,因为上一步整个数据已经变为均值是0了,对整体没有影响
train_test_data[numeric_features] = train_test_data[numeric_features].fillna(0)
# 将非数值的特征转为one-hot编码
train_test_data = pd.get_dummies(train_test_data, dummy_na=True)
# 再把训练集和测试集重新划分出来
train_num = train_dataset.shape[0]
train_dataset = train_test_data[: train_num]
test_dataset = train_test_data[train_num: ]
print(train_dataset.shape)
print(test_dataset.shape)
# 简单划分一下训练集和验证集
num_train = round(1460*0.8)
training_data = np.array(train_dataset.iloc[0: num_train])
training_label = np.array(train_label.iloc[0: num_train])
val_data = np.array(train_dataset.iloc[num_train: ])
val_label = np.array(train_label.iloc[num_train: ])"""
处理完后,特征变成331个
(1460, 331)
(1459, 331)
"""

我这里因为后面训练直接把训练和验证集写在一个函数里的关系,所以要做一下合并

# 增加一个维度方便拼接
training_label = training_label[None]
val_label = val_label[None]
training_data = np.concatenate((training_data, training_label.T), axis=1)
val_data = np.concatenate((val_data, val_label.T), axis=1)
dataloader = {'train':training_data, 'val':val_data}

网络定义

这里简单的使用一个单全连接网络作为一个线性回归模型

class Net(nn.Layer):# self代表类的实例自身def __init__(self):# 初始化父类中的一些参数super(Net, self).__init__()# 定义一层全连接层,输入维度是331,输出维度是1self.fc1 = nn.Linear(in_features=331, out_features=1024)# 网络的前向计算def forward(self, inputs):x = self.fc1(inputs)return x

RMSE定义

没有现成的定义RMSE,手写一个

def log_rmse(preds, labels):# 为了在取对数时进⼀步稳定该值,将⼩于1的值设置为1preds = paddle.fluid.layers.clip(preds, 1, float('inf'))# 同时取logpreds = paddle.log(preds)labels = paddle.log(labels)# 做MSEloss = F.square_error_cost(preds, label=labels)loss = loss.mean()# 取sqrtrmse = paddle.sqrt(loss)return rmse.item()

训练函数

比较普通的训练函数,把训练和验证放的一起了

def train_model(modle, epoch_num, dataloader, batch_size, opt):# 记录最小的损失min_loss = 0# 用来画图,分别记录total_loss = {"train": [], "val": []}for epoch in range(epoch_num):# 输出格式print('Epoch {}/{}'.format(epoch, epoch_num - 1))print('-' * 10)# 选择训练模式或者测试模式for phase in ['train', 'val']:if phase == 'train':model.train()  # Set model to training modeelse:model.eval()  # Set model to evaluate mode# 随机打乱对于数据np.random.shuffle(dataloader[phase])mini_batches = [dataloader[phase][k:k+batch_size] for k in range(0, len(dataloader[phase]), batch_size)]running_loss = 0for index, mini_batch in enumerate(mini_batches):mini_batch = np.array(mini_batch).astype('float32')x = mini_batch[:, :-1]y = mini_batch[:, -1:]# 转换成paddle格式x = paddle.to_tensor(x)y = paddle.to_tensor(y)# 前行传播preds = modle(x)# 计算损失loss = F.square_error_cost(preds, label=y)avg_loss = loss.mean()train_ls = log_rmse(preds, y)running_loss += train_ls# 反向传播avg_loss.backward()# 梯度更新opt.step()# 梯度请0opt.clear_grad()running_loss = running_loss / indextotal_loss[phase].append(running_loss)print('{} Loss: {:.4f}'.format(phase, running_loss))plt.figure()epoch = np.arange(epoch_num)for phase in ['train', 'val']:plt.plot(epoch, total_loss[phase], label=phase)plt.show()

超参数定义和训练

# 定义超参数
model = Net()
model.train()
loss = nn.MSELoss()
opt = optimizer.SGD(learning_rate=0.01, parameters=model.parameters())
epoch_num = 100
batch_size = 64train_model(model, epoch_num , dataloader, batch_size , opt)

生成提交文件

# 提交测试集预测和生产kaggle提交文件csv
test_dataset = np.array(test_dataset).astype('float32')
test_dataset = paddle.to_tensor(test_dataset)
test_preds = model(test_dataset).detach().numpy()
test_sub = {'Id':None, 'SalePrice':None}
test_sub['SalePrice'] = pd.Series(test_preds.reshape(1, -1)[0])
test_sub['SalePrice'].to_csv('submission.csv')

这里生成完之后,将表头改为Id和SalePrices,Id序号要求从1461开始,自己修改一下

提交结果

将csv文件提交

最后得分是0.15877,作为一个baseline来说还行了

总结

后面根据前人大佬的一些数据处理来做一些改进

飞桨AI Studio之加州房价预测——机器学习的Hello world相关推荐

  1. 飞桨 AI Studio 课程学习 可以成为一名优秀的算法工程师

    如何成为一名算法工程师 从事 AI 行业需要学习哪些课程 最为高效的学习路线是什么样 很多对人工智能领域感兴趣的同学都会关注这些问题.不论是出于个人的专业兴趣或者是市场高薪资的吸引,算法工程师岗位已经 ...

  2. 飞桨AI Studio - 人工智能学习与实训社区

    开源项目 - 飞桨AI Studio - 人工智能学习与实训社区集开放数据.开源算法.免费算力三位一体,为开发者提供高效学习和开发环境https://aistudio.baidu.com/aistud ...

  3. 【机器学习】百度飞桨AI Studio平台项目:基于卷积神经网络分类方法的人脸颜值打分

    基于卷积神经网络分类方法的人脸颜值打分 说在前面 实验数据 解决过程 1.Precondition 2.Dataset Preparation 3.Network Configuration 4.Mo ...

  4. 基于OpenVINO与PP-Strucutre的文档智能分析 - 飞桨AI Studio

    ★★★ 本文源自AlStudio社区精品项目,[点击此处]查看更多精品内容 >>> 基于OpenVINO与PP-Strucutre的文档智能分析 本示例包含以下部分组成: 项目说明 ...

  5. PP飞桨 AI studio Notebook基础操作学习

    目录 执行和调试 多文件代码编辑 上传Notebook Notebook快捷键 Notebook中使用Shell命令 使用pip来安装自己需要的package (但不支持apt-get) 查看当前环境 ...

  6. 百度飞桨AI达人创造营 | Day01:创意是如何诞生的

    目录 一.将现有想法进行某种组合 二.创意来源于生活 三.多利用外部资源 四.个人思考 最近发现了一个比较有趣的学习网站(可能是吧)飞桨 AI Studio 百度人工智能学习与实训社区,官方介绍是:A ...

  7. 百度飞桨AI抠图+图片合成

    考虑到本科学校校庆即将到来,而又刚好学习了百度飞桨AI抠图以及图片合成的相关课程,因而想合成一张自己和本科学校的合照.(由于才疏学浅,略有翻车,请见谅) 使用工具:百度PaddleHub DeepLa ...

  8. 飞桨AI创造营2期-t3-数据处理

    飞桨AI创造营2期-数据处理 (Datawhale34期组队学习) 文章目录 飞桨AI创造营2期-数据处理 1知识点 2具体内容 2.1AI Studio Notebook命令 2.2Numpy基础 ...

  9. 【组队学习】【34期】百度飞桨AI达人创造营

    百度飞桨AI达人创造营 航路开辟者:百度飞桨 领航员:六一 航海士:阿水.颜鑫.宋泽山.刘洋.张文恺 基本信息 内容属性:合作课程 练习平台:https://aistudio.baidu.com/ai ...

  10. 统信 UOS 适配支持百度飞桨 AI 深度学习平台;阿里回应“马云遭印度法院传唤”;fastjson 1.2.73 发布 | 极客头条

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 一分钟 ...

最新文章

  1. VMware的快照和克隆总结
  2. 消息确认机制---confirm异步
  3. 软件工程概论 课堂练习 第3次作业3【画出“工资处理”子系统的结构图】
  4. linux 删除乱码的文件夹,Linux服务器删除乱码文件和文件夹的方法
  5. 有用的Copy-On-write,写时复制
  6. R-CNN 物体检测第二弹(Fast R-CNN)
  7. 作为函数的mixin
  8. python 当前目录_Python中的搜索路径顺序
  9. java object转map_Java 面试题:百度前 200 页都在这里
  10. JAVA math.sin(X)画圆_关于Math.sin(),Math.cos()画圆
  11. 学堂在线 python_利用API获取【学堂在线】课堂练习答案
  12. JAVA在线看CAD图纸快速入门
  13. 学到了林海峰,武沛齐讲的Day17-5 内置函数
  14. 强化学习中的基础概念和术语——spinning up文档翻译
  15. java 计算行驶里程,js根据经纬度换算行驶里程
  16. python 自动运维架构师_运维架构师-Python 自动化运维开发-031
  17. 今天,想和姐妹们聊聊技术与成长|大厂程序媛的升级打怪之路
  18. Web、app、H5、小程序测试的区别
  19. vue-router 报错Error: Avoided redundant navigation to current location: “/index/user“解决方式
  20. 2022年全球市场砂纸总体规模、主要生产商、主要地区、产品和应用细分研究报告

热门文章

  1. 腾讯游戏安全高级工程师胡和君:定制化对抗——游戏反外挂的安全实践
  2. 微软开发的www服务器程序是,WebDeploy 微软开发的IIS6同步应用程序
  3. JDK-8274609 JEP 421: Deprecate Finalization for Removal
  4. python教育学_为什么老男孩教育学Python课程更有优势?
  5. VUE中的filters过滤器2种用法
  6. 编辑网页document.body.contentEditable='true';
  7. kettle-java代码执行hive相关ktr时报错: database type with plugin id [HIVE2] couldn‘t be found!
  8. win10设置计算机关机时间,win10怎样固定时间关机_win10怎样设置电脑关机时间设置...
  9. 如何安装Eclipse WTP插件
  10. 两数之和——python