极简PaddlePaddle的房价预测Demo
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了极简PaddlePaddle的房价预测Demo相关的知识,希望对你有一定的参考价值。
简 介: ※利用最简单的线性关系预测数据之间的相关性。
关键词
: 线性相关,预测#
§01 Demo房价预测
1.1 数据准备
1.1.1 数据集介绍
uci-housing
:数据集共506
行,
每行14
列。前13
列用来描述房屋的各种信息,最后一列为该类房屋价格中位数。
PaddlePaddle
提供了读取uci_housing
数据集的接口,paddle.text.datasets.UCIHousing
。
1.1.2 数据集加载
(1)文件下载
import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import paddle
train_dataset = paddle.text.datasets.UCIHousing(mode='train')
valid_dataset = paddle.text.datasets.UCIHousing(mode='test')
Cache file /home/aistudio/.cache/paddle/dataset/uci_housing/housing.data not found, downloading http://paddlemodels.bj.bcebos.com/uci_housing/housing.data
Begin to download
............
Download finished
(2)文件分析
Ⅰ.文件所在目录
aistudio@jupyter-262579-3225298:~/.cache/paddle/dataset/uci_housing$ ls
housing.data
aistudio@jupyter-262579-3225298:~/.cache/paddle/dataset/uci_housing$ cat housing.data
Ⅱ.文件内容显示
0.00632 18.00 2.310 0 0.5380 6.5750 65.20 4.0900 1 296.0 15.30 396.90 4.98 24.00
0.02731 0.00 7.070 0 0.4690 6.4210 78.90 4.9671 2 242.0 17.80 396.90 9.14 21.60
0.02729 0.00 7.070 0 0.4690 7.1850 61.10 4.9671 2 242.0 17.80 392.83 4.03 34.70
0.03237 0.00 2.180 0 0.4580 6.9980 45.80 6.0622 3 222.0 18.70 394.63 2.94 33.40
0.06905 0.00 2.180 0 0.4580 7.1470 54.20 6.0622 3 222.0 18.70 396.90 5.33 36.20
0.02985 0.00 2.180 0 0.4580 6.4300 58.70 6.0622 3 222.0 18.70 394.12 5.21 28.70
0.08829 12.50 7.870 0 0.5240 6.0120 66.60 5.5605 5 311.0 15.20 395.60 12.43 22.90
0.14455 12.50 7.870 0 0.5240 6.1720 96.10 5.9505 5 311.0 15.20 396.90 19.15 27.10
0.21124 12.50 7.870 0 0.5240 5.6310 100.00 6.0821 5 311.0 15.20 386.63 29.93 16.50
0.17004 12.50 7.870 0 0.5240 6.0040 85.90 6.5921 5 311.0 15.20 386.71 17.10 18.90
0.22489 12.50 7.870 0 0.5240 6.3770 94.30 6.3467 5 311.0 15.20 392.52 20.45 15.00
0.11747 12.50 7.870 0 0.5240 6.0090 82.90 6.2267 5 311.0 15.20 396.90 13.27 18.90
0.09378 12.50 7.870 0 0.5240 5.8890 39.00 5.4509 5 311.0 15.20 390.50 15.71 21.70
0.62976 0.00 8.140 0 0.5380 5.9490 61.80 4.7075 4 307.0 21.00 396.90 8.26 20.40
0.63796 0.00 8.140 0 0.5380 6.0960 84.50 4.4619 4 307.0 21.00 380.02 10.26 18.20
0.62739 0.00 8.140 0 0.5380 5.8340 56.50 4.4986 4 307.0 21.00 395.62 8.47 19.90
1.05393 0.00 8.140 0 0.5380 5.9350 29.30 4.4986 4 307.0 21.00 386.85 6.58 23.10
1.1.3 训练数据集
查看 一下上述训练数据集和的操作特性。
(1)访问训练数据集和
print(train_dataset[0])
(array([-0.0405441 , 0.06636363, -0.32356226, -0.06916996, -0.03435197,
0.05563625, -0.03475696, 0.02682186, -0.37171334, -0.21419305,
-0.33569506, 0.10143217, -0.21172912], dtype=float32), array([24.], dtype=float32))
(2)准备训练加载函数
train_loader = paddle.io.DataLoader(train_dataset, batch_size=20, shuffle=True, drop_last=True)
valid_loader = paddle.io.DataLoader(valid_dataset, batch_size=20, shuffle=True)
1.2 网络配置
1.2.1 网络搭建
对于线性回归来讲,它就是一个从输入到输出的简单的全连接层。
对于波士顿房价数据集,假设属性和房价之间的关系可以被属性间的线性组合描述。
z = a 1 w 1 + ⋯ + a K w K + b z = a_1 w_1 + \\cdots + a_K w_K + b z=a1w1+⋯+aKwK+b
▲ 图1.2.1 网络模型
对应的网络模型为:
# 输入数据形状为[13],输出形状[1]
net = paddle.nn.Linear(13, 1)
1.2.2 定义损失函数
此处使用均方差损失函数。
square_error_cost(input,lable):
接受输入预测值和目标值,并返回方差估计,
即为(y-y_predict
)的平方
1.2.3 定义优化函数
此处使用的是随机梯度下降。
optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters=net.parameters())
1.3 模型训练
1.3.1 回执模型损失值变化
def draw_train_process(iters, train_costs):
title = 'Train Cost'
plt.title(title, fontsize=24)
plt.xlabel('iter', fontsize=14)
plt.ylabel('Cost', fontsize=14)
plt.plot(iters, train_costs, color='red', label='Training, Cost')
plt.grid()
plt.show()
1.3.2 训练并保存模型
遍历轮次和数据集loader,将批次数据送入net里面进行计算,最终经过loss计算,在进行反向传播和参数优化。
注:enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,
(1)回执训练误差曲线
def draw_train_process(iters, train_costs):
title = 'Train Cost'
plt.title(title, fontsize=24)
plt.xlabel('iter', fontsize=14)
plt.ylabel('Cost', fontsize=14)
plt.plot(iters, train_costs, color='red', label='Training, Cost')
plt.grid()
plt.show()
(2)模型训练
iters = []
train_costs = []
EPOCH_NUM = 50
for pass_id in range(EPOCH_NUM):
tran_cost = 0
for batch_id, data in enumerate(train_loader()):
inputs = paddle.to_tensor(data[0])
labels = paddle.to_tensor(data[1])
out = net(inputs)
train_loss = paddle.mean(paddle.nn.functional.square_error_cost(out, labels))
train_loss.backward()
optimizer.step()
optimizer.clear_grad()
if batch_id % 40 == 0:
print("Pass:%d, Cost:%0.5f"%(pass_id, train_loss))
iters.append(iter)
train_costs.append(train_loss.numpy()[0])
test_loss = 0
for batch_id, data in enumerate(valid_loader()):
inputs = paddle.to_tensor(data[0])
labels = paddle.to_tensor(data[1])
out = net(inputs)
test_loss = paddle.mean(paddle.nn.functional.square_error_cost(out, labels))
print('Test:%d, Cost:%0.5f'%(pass_id, test_loss))
Test:40, Cost:15.72686
Pass:41, Cost:14.36966
Test:41, Cost:36.47432
Pass:42, Cost:33.35671
Test:42, Cost:34.79225
Pass:43, Cost:26.78240
Test:43, Cost:15.26566
Pass:44, Cost:36.29396
Test:44, Cost:31.65246
Pass:45, Cost:19.08393
Test:45, Cost:18.83397
Pass:46, Cost:6.80555
Test:46, Cost:54.55772
Pass:47, Cost:10.92786
Test:47, Cost:2.58322
Pass:48, Cost:8.35396
Test:48, Cost:4.08830
Pass:49, Cost:13.24368
Test:49, Cost:58.84323
(3)模型保存
paddle.save(net.state_dict(), 'fit_a_line.pdparams')
draw_train_process(iters, train_costs)
▲ 图1.3.1 训练测试误差
1.4 模型预测
1.4.1 可视化真实值与预测方法
infer_results = []
ground_truths = []
def draw_infer_result(ground_truths, infer_results):
title = 'Boston'
plt.title(title, fontsize=24)
x = arange(1, 20)
y = x
plt.plot(x, y)
plt.xlabel('Ground Truth', fontsize=14)
plt.ylabel('Infer result', fontsize=14)
plt.scatter(ground_truths, infer_results, color='green', label='training cost')
plt.grid()
plt.show()
#-----------------------------------------------------------
infer_net = paddle.nn.Linear(13, 1)
param = paddle.load('fit_a_line.pdparams')
infer_net.set_dict(param)
data = next(valid_loader())
inputs = paddle.to_tensor(data[0])
result = infor_net(inputs)
for idx, item in enumerate(zip(result, data[1])):
print('Index:%d, Infer result:%.2f,Ground Truth:%.2f'%(idx, item[0], item[1]))
infer_results.append(item[0].numpy()[0])
ground_truths.append(item[1].numpy()[0])
draw_infer_result(ground_truths, infer_results)
▲ 图1.4.1 训练测试误差
※ 总 结 ※
利用最简单的线性关系预测数据之间的相关性。
● 相关图表链接:
以上是关于极简PaddlePaddle的房价预测Demo的主要内容,如果未能解决你的问题,请参考以下文章