Python 机器学习实验报告
Python Machine Learning Experiment Report
学生所在学院:
学生所在班级:
学生姓名:
学生学号:
指导教师:
教 务 处
1
实验名称:线性回归:波士顿房价预测
实验时间: 成绩:
一、 实验内容
1.熟悉 AI Studio 操作环境
2. 通 过 波 士 顿 房 价 预 测 的 项 目 , 学 习 并 理 解 经 典 的 线 性 回 归 。 经 典 的 线 性 回 归 ( Linear
Regression )模型主要用来预测一些存在着线性关系的数据集。本次实验使用真实的数据集建立起一个
房价预测模型,并且了解到机器学习中的若干重要概念。
3.使用从 UCI Housing Data Set 获得的波士顿房价数据集进行模型的训练和预测。使用散点图展示
了使用模型对部分房屋价格进行的预测。
二、实验过程
1.准备数据
1.1 导入必要的包
import paddle.fluid as fluid
import paddle
import numpy as np
import os
1.2 读取训练数据
对 uci_housing 的训练集进行乱序,乱序化的缓存大小为 buf_size ,按批次读取乱序后的数据,
批次大小为 batch_size 。
train_reader = paddle.batch(
paddle.reader.shuffle(paddle.dataset.uci_housing.train(),buf_size=500),
batch_size=20)
1.3 读取测试数据
按批次读取 uci_housing 测试集,批次大小为 batch_size。
test_reader = paddle.batch(
paddle.reader.shuffle(paddle.dataset.uci_housing.test(), buf_size=500),
batch_size=20)
2.配置网络
2.1 定义简单的线性网络
定义一个简单的线性网络,网络有 1 层。输入层为 x,输出大小为 1,激活函数是 relu 的全连接
层。
#定义张量变量 x,表示 13 维的特征值
x = fluid.layers.data(name='x', shape=[13], dtype='float32')
2
#定义一个简单的线性网络
net=fluid.layers.fc(input=x,size=1,act=None)
# 定义损失函数
y = fluid.layers.data(name='y', shape=[1], dtype='float32')#定义张量 y,表示目标值
cost = fluid.layers.square_error_cost(input=net, label=y) #求一个 batch 的损失值
avg_cost = fluid.layers.mean(cost) #对损失值求平均值
# 定义优化方法
optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.001)
opts = optimizer.minimize(avg_cost)
3.训练网络
# 创建一个使用 CPU 的解释器
place = fluid.CPUPlace()
exe = fluid.Executor(place)
# 进行参数初始化
exe.run(fluid.default_startup_program())
# 定义输入数据维度
feeder = fluid.DataFeeder(place=place, feed_list=[x, y])
# 开始训练和测试
for pass_id in range(10): #训练 10 次
# 开始训练并输出最后一个 batch 的损失值
train_cost = 0
for batch_id, data in enumerate(train_reader()): #遍历 train_reader 迭代器
train_cost = exe.run(program=fluid.default_main_program(),#运行主程序
feed=feeder.feed(data), #喂入一个 batch 的训练数据
fetch_list=[avg_cost])
print("Pass:%d, Cost:%0.5f" % (pass_id, train_cost[0][0])) #打印最后一个 batch 的
损失值
# 开始测试并输出最后一个 batch 的损失值
test_cost = 0
for batch_id, data in enumerate(test_reader()): #遍历 test_reader 迭代器
test_cost = exe.run(program=fluid.default_main_program(), #运行测试 cheng
feed=feeder.feed(data), #喂入一个 batch 的测试数据
fetch_list=[avg_cost]) #fetch 均方误差
3
print('Test:%d, Cost:%0.5f' % (pass_id, test_cost[0][0])) #打印最后一个 batch 的
损失值
#保存模型
model_save_dir = "/home/aistudio/data/fit_a_line.inference.model"
# 如果保存路径不存在就创建
if not os.path.exists(model_save_dir):
os.makedirs(model_save_dir)
fluid.io.save_inference_model(model_save_dir, #保存推理 model 的路径
['x'], #推理(inference)需要 feed 的数据
[net], #保存推理(inference)结果的 Variables
exe) #exe 保存 inference model
4.模型评估
Pass:0, Cost:266.62946
Test:0, Cost:7.94936
Pass:1, Cost:35.87787
Test:1, Cost:16.00702
Pass:2, Cost:392.73615
Test:2, Cost:7.16628
Pass:3, Cost:21.06019
Test:3, Cost:3.56659
Pass:4, Cost:19.70699
Test:4, Cost:0.25422
Pass:5, Cost:241.50269
Test:5, Cost:5.52695
Pass:6, Cost:102.51204
Test:6, Cost:73.88786
Pass:7, Cost:15.30015
Test:7, Cost:20.83883
Pass:8, Cost:34.66841
Test:8, Cost:2.00481
Pass:9, Cost:174.08334
Test:9, Cost:5.17242
Pass:10, Cost:10.97983
Test:10, Cost:36.22707
Pass:11, Cost:36.18889
Test:11, Cost:8.12593
Pass:12, Cost:44.90562
4
Test:12, Cost:10.52768
Pass:13, Cost:102.76474
Test:13, Cost:9.12936
Pass:14, Cost:20.70418
Test:14, Cost:19.98223
Pass:15, Cost:86.59577
Test:15, Cost:6.96506
Pass:16, Cost:5.64195
Test:16, Cost:1.85170
Pass:17, Cost:15.30329
Test:17, Cost:4.67929
Pass:18, Cost:8.74174
Test:18, Cost:22.38131
Pass:19, Cost:19.88413
Test:19, Cost:1.09259
在训练过程中,我们可以看到输出的损失值在不断减小,证明我们的模型在不断收敛。
5.模型预测
infer_exe = fluid.Executor(place) #创建推测用的 executor
inference_scope = fluid.core.Scope() #Scope 指定作用域
with fluid.scope_guard(inference_scope):
#修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的 scope。
#从指定目录中加载 推理 model(inference model)
[inference_program, #推理的 program
feed_target_names, #str 列表,包含需要在推理 program 中提供数据的变量名称
etch_targets] = fluid.io.load_inference_model(model_save_dir,
#fetch_targets: 推断结果,model_save_dir:模型训练路径
infer_exe)
#infer_exe: 运行 inference model 的 executor
#获取推测数据
infer_reader = paddle.batch(paddle.dataset.uci_housing.test(),
#获取 uci_housing 的测试数据
batch_size=10) #从测试数据中读取一个大小为 10 的 batch 数据
#从 test_reader 中分割 x
test_data = next(infer_reader())
test_x = np.array([data[0] for data in test_data]).astype("float32")