IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 使用paddlepaddle来预测房价 -> 正文阅读

[人工智能]使用paddlepaddle来预测房价

导读

这篇文章我们介绍如何使用paddlepaddle来预测UCI房价,UCI房价数据集一共包含了506条数据,每条数据包含13个特征和该类房价的中位数。

paddlepaddle预测房价

  • 加载数据集
import os,paddle
import numpy as np

#设置加载数据集的batch_size
BATCH_SIZE = 32

#加载训练集和验证集
train_datasets = paddle.text.datasets.UCIHousing(mode="train")
val_datasets = paddle.text.datasets.UCIHousing(mode="test")

#数据加载器用于训练时加载数据
train_dataloader = paddle.io.DataLoader(train_datasets,batch_size=BATCH_SIZE,shuffle=True,drop_last=True)
val_dataloader = paddle.io.DataLoader(val_datasets,batch_size=BATCH_SIZE,shuffle=True,drop_last=True)
  • 查看UCI数据
print(train_datasets[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))
"""
  • 定义预测网络结构
    这里我们使用一个全连接层来构建房价的预测网络,即全连接层的输入是13个节点,输出是1个节点,实现的数学公式如下
    z = ω 1 x 1 + ω 2 x 2 + . . . . . + ω 13 x 13 + b z = \omega_1x_1+\omega_2x_2+.....+\omega_{13}x_{13}+b z=ω1?x1?+ω2?x2?+.....+ω13?x13?+b
    在这里插入图片描述
#模型的输入是[13]输出[1]
model = paddle.nn.Linear(13,1)
  • 定义损失函数
    对于回归问题,我们通常都是采用平方误差函数作为损失函数
#predict为模型的预测值,true_label表示数据对应的真实标签
paddle.nn.functional.square_error_cost(predict,true_label)
  • 优化器
    设置优化算法,优化算法我们采用SGD
#设置学习率
optimizer = paddle.optimizer.SGD(learning_rate=0.001,parameters=net.parameters())
  • 绘制迭代次数随loss的变化关系
import matplotlib.pyplot as plt

def draw_loss_change(epoch_list,loss_list,title):
    plt.title(title,fontsize=24)
    plt.xlabel("epoch",fontsize=24)
    plt.ylabel("loss",fontsize=24)
    plt.plot(epoch_list,loss_list,color="red",label="loss")
    plt.grid()
    plt.show()
  • 模型的验证
def evaluate(model):
    #用来统计模型在验证集上的loss
    val_total_loss = 0
    val_batch_num = 0
    for batch_id,batch_data in enumerate(val_dataloader):
        batch_input = paddle.to_tensor(batch_data[0])
        batch_label = paddle.to_tensor(batch_data[1])
        batch_output = model(batch_input)
        #计算batch data上的loss
        batch_loss = paddle.mean(paddle.nn.functional.square_error_cost(batch_output,batch_label)).numpy()[0]
        val_total_loss += batch_loss
        val_batch_num += 1
    return val_total_loss / val_batch_num
  • 训练模型
def train():
    #记录每个epoch训练集loss的变化情况
    epoch_list = []
    train_loss_list = []
    val_loss_list = []
    #用来保存最小的loss
    best_val_loss = 1000
    #定义迭代的轮数
    EPOCH_NUM = 100
    for epoch in range(EPOCH_NUM):
        #用来统计total loss和计算每个epoch的平均loss
        epoch_total_loss = 0
        epoch_batch_num = 0
        for batch_idx,batch_data in enumerate(train_dataloader):
            batch_input = paddle.to_tensor(batch_data[0])
            batch_label = paddle.to_tensor(batch_data[1])
            #获取数据的预测结果
            batch_output = model(batch_input)
            #计算数据的平均loss
            batch_loss = paddle.mean(paddle.nn.functional.square_error_cost(batch_output,batch_label))
        
            #计算batch loss的梯度
            batch_loss.backward()
            #更新参数
            optimizer.step()
            #梯度清零
            optimizer.clear_grad()

            epoch_total_loss += batch_loss.numpy()[0]
            epoch_batch_num += 1
        
        #计算epoch loss
        epoch_loss = epoch_total_loss / epoch_batch_num
        epoch_list.append(epoch+1)
        train_loss_list.append(epoch_loss)
        
        #计算模型在验证集上的loss
        val_loss = evaluate(model)
        if val_loss < best_val_loss:
            paddle.save(model.state_dict(),"best_fit.pdparams")

        print("epoch num:{},train loss:{:.2f},val loss:{:.2f}".format(epoch+1,epoch_loss,val_loss))
             
    #绘制loss和epoch的变化
    draw_loss_change(epoch_list,train_loss_list,title="train loss")

在这里插入图片描述

  • 模型预测
def draw_predict_grounds(ground_truths,predict_results,title="Boston"):
    plt.title(title,fontsize=24)
    
    x = np.arange(1,30)
    y = x
    plt.plot(x,y,color="red")
    plt.xlabel("ground truth",fontsize=14)
    plt.ylabel("predict result",fontsize=14)
    plt.scatter(ground_truths,predict_results,color="green",label="ground-predict cost")
    plt.grid()
    plt.show()


import paddle

#加载验证集
valid_dataset = paddle.text.UCIHousing(mode="test")
valid_data_loader = paddle.io.DataLoader(valid_dataset,batch_size=200)

#加载模型
model = paddle.nn.Linear(13,1)
param = paddle.load("best_fit.pdparams")
model.set_dict(param)

#用来保存模型的预测结果和真实值
predict_results = []
groud_truths = []

for batch_data in valid_data_loader:
    batch_input = paddle.to_tensor(batch_data[0])
    batch_predict = model(batch_input).numpy()

    predict_results.extend(batch_predict)
    groud_truths.extend(batch_data[1].numpy())

predict_results = np.squeeze(np.array(predict_results))
groud_truths = np.squeeze(np.array(groud_truths))


draw_predict_grounds(groud_truths,predict_results)

在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:31:25  更:2022-02-26 11:33:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:34:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码