首页 > 其他分享 >机器学习笔记(二)使用paddlepaddle,再探波士顿房价预测

机器学习笔记(二)使用paddlepaddle,再探波士顿房价预测

时间:2023-12-22 17:22:27浏览次数:40  
标签:数据 paddlepaddle 笔记 label values paddle model 波士顿 data

目标

用paddlepaddle来重写之前那个手写的梯度下降方案,简化内容

流程

实际上就做了几个事:

  1. 数据准备:将一个批次的数据先转换成nparray格式,再转换成Tensor格式
  2. 前向计算:将一个批次的样本数据灌入网络中,计算出结果
  3. 计算损失函数:以前向计算的结果和真是房价作为输入,通过算是函数sqare_error_cost计算出损失函数。
  4. 反向传播:执行梯度反向传播backward函数,即从后到前逐层计算每一层的梯度,并根据设置的优化算法更新参数(opt.step函数)。

数据准备

这部分代码和之前一样,读取数据是独立的

点击查看代码
#数据划分函数不依赖库,还是自己读
def load_data():
    # 从文件导入数据
    datafile = './work/housing.data'
    data = np.fromfile(datafile, sep=' ', dtype=np.float32)

    # 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
    feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
                      'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
    feature_num = len(feature_names)

    # 将原始数据进行Reshape,变成[N, 14]这样的形状
    data = data.reshape([data.shape[0] // feature_num, feature_num])

    # 将原数据集拆分成训练集和测试集
    # 这里使用80%的数据做训练,20%的数据做测试
    # 测试集和训练集必须是没有交集的
    ratio = 0.8
    offset = int(data.shape[0] * ratio)
    training_data = data[:offset]

    # 计算train数据集的最大值,最小值
    maximums, minimums = training_data.max(axis=0), training_data.min(axis=0)
    
    # 记录数据的归一化参数,在预测时对数据做归一化
    global max_values
    global min_values
   
    max_values = maximums
    min_values = minimums
    
    # 对数据进行归一化处理
    for i in range(feature_num):
        data[:, i] = (data[:, i] - min_values[i]) / (maximums[i] - minimums[i])

    # 训练集和测试集的划分比例
    training_data = data[:offset]
    test_data = data[offset:]
    return training_data, test_data

定义一个依赖paddle库的类

点击查看代码
class Regressor(paddle.nn.Layer):
    #self代表对象自身
    def __init__(self):
        #初始化父类的参数
        super(Regressor, self).__init__()
        #定义一层全连接层,输入维度是13,输出维度是1
        self.fc = Linear(in_features=13, out_features=1)

    #网络的前向计算函数
    def forward(self, inputs):
        x = self.fc(inputs)
        return x

在上面这个类中,不论是前向计算还是初始化,都是继承了这个paddle.nn.Layer类,用其内部的成员函数执行的

代码

我们定义一个循环来执行这个流程,如下:

点击查看代码
EPOCH_NUM = 10   # 设置外层循环次数
BATCH_SIZE = 10  # 设置batch大小

# 定义外层循环
for epoch_id in range(EPOCH_NUM):
    # 在每轮迭代开始之前,将训练数据的顺序随机的打乱
    np.random.shuffle(training_data)
    # 将训练数据进行拆分,每个batch包含10条数据
    mini_batches = [training_data[k:k+BATCH_SIZE] for k in range(0, len(training_data), BATCH_SIZE)]
    # 定义内层循环
    for iter_id, mini_batch in enumerate(mini_batches):
        x = np.array(mini_batch[:, :-1]) # 获得当前批次训练数据
        y = np.array(mini_batch[:, -1:]) # 获得当前批次训练标签(真实房价)
        # 将numpy数据转为飞桨动态图tensor的格式
        house_features = paddle.to_tensor(x)
        prices = paddle.to_tensor(y)
        
        # 前向计算
        predicts = model(house_features)
        
        # 计算损失
        loss = F.square_error_cost(predicts, label=prices)
        avg_loss = paddle.mean(loss)
        if iter_id%20==0:
            print("epoch: {}".format(epoch_id))
            print("iter: {}".format(str(iter_id)))
            print("loss is : {}".format(float(avg_loss)))
        
        # 反向传播,计算每层参数的梯度值
        avg_loss.backward()
        # 更新参数,根据设置好的学习率迭代一步
        opt.step()
        # 清空梯度变量,以备下一轮计算
        opt.clear_grad()

保存模型

在梯度下降得到一个模型了之后,可以把这个神经网络模型保存下来

点击查看代码
paddle.save(model.state_dict(), 'LR_model.pdparams')
print("模型保存成功,模型参数保存在LR_model.pdparams中")

读取模型

在启动模型之前,当然可以读取这样一个模型:

点击查看代码
def load_one_example():
    # 从上边已加载的测试集中,随机选择一条作为测试数据
    idx = np.random.randint(0, test_data.shape[0])
    idx = -10
    one_data, label = test_data[idx, :-1], test_data[idx, -1]
    # 修改该条数据shape为[1,13]
    one_data =  one_data.reshape([1,-1])

    return one_data, label        

# 参数为保存模型参数的文件地址
#读取保存模型
model_dict = paddle.load('LR_model.pdparams')
model.load_dict(model_dict) #读取模型文件
model.eval()	#转变为预测模式

尝试进行预测

点击查看代码
# 参数为数据集的文件地址
one_data, label = load_one_example()
# 将数据转为动态图的variable格式 
one_data = paddle.to_tensor(one_data)
#model是定义的模型,这个model(one_data)实际上是对one_Data进行了一次前向传播
predict = model(one_data)


# 因为这个predict的值实际上是做了归一化处理的,所以这里需要进行反归一化处理
predict = predict * (max_values[-1] - min_values[-1]) + min_values[-1]
# 对label数据做反归一化处理
label = label * (max_values[-1] - min_values[-1]) + min_values[-1]

#模型预测值是22.72234,,实际值是19.700000762939453
print("Inference result is {}, the corresponding label is {}".format(predict.numpy(), label))

标签:数据,paddlepaddle,笔记,label,values,paddle,model,波士顿,data
From: https://www.cnblogs.com/Leventure/p/17922044.html

相关文章

  • Burnside 引理 与 Pólya 定理 学习笔记
    为了防止明天就把好不容易听完的东西都还给rabbit_lb了,还是记一点吧。1.群论基础1.1群(group)的定义给定集合\(G\)和\(G\)上的二元运算\(\cdot\),满足下列条件称之为群:封闭性:若\(a,b\inG\),则\(a\cdotb\inG\)。结合律:对于任意\(a,b,c\inG\),有\((a\cdotb)\cd......
  • 机器学习笔记(一)从波士顿房价预测开始,梯度下降
    从波士顿房价开始目标其实这一章节比较简单,主要是概念,首先在波士顿房价这个问题中,我们假设了一组线性关系,也就是如图所示我们假定结果房价和这些参数之间有线性关系,即:然后我们假定这个函数的损失函数为均方差,即:那么就是说,我们现在是已知y和x,来求使得这个损失函数Loss最小......
  • Swift 笔记-1 基本类型,集合类型,控制流与基本函数
    目录基本类型变量与常量字符串单行多行整型浮点布尔值集合类型数组字典Dictionaries集合Sets枚举Enums控制流条件判断循环代码块抽象结构函数声明函数返回类型声明返回多个值自定义参数标签函数参数默认值函数与错误最近对iOS开发有兴趣,学习SwiftUI,主要跟的是hackingwiths......
  • 《软件需求十步走》阅读笔记四
    读到第四篇,就是需求工程的规划篇。   需求规划工作是面向“全业务、全信息、全系统”,业务是事项,采用分析综合、归纳演绎的逻辑方法整理出组织与对象的业务逻辑模型,在此业务的逻辑模型基础上进行系统的规划。也是事项的实作行为,也是对所做事项的总称。 业务研究就是借鉴科......
  • 【GUI软件】小红书详情数据批量采集,含笔记内容、转评赞藏等,支持多笔记同时采集!
    一、背景介绍1.1爬取目标您好!我是@马哥python说,一名10年程序猿。我用python开发了一个爬虫采集软件,可自动按笔记链接抓取笔记的详情数据。为什么有了源码还开发界面软件呢?方便不懂编程代码的小白用户使用,无需安装python,无需改代码,双击打开即用!软件界面截图:爬取结果截图:结......
  • 【GUI软件】小红书详情数据批量采集,含笔记内容、转评赞藏等,支持多笔记同时采集!
    目录一、背景介绍1.1爬取目标1.2演示视频1.3软件说明二、代码讲解2.1爬虫采集模块2.2软件界面模块2.3日志模块三、获取源码及软件一、背景介绍1.1爬取目标您好!我是@马哥python说,一名10年程序猿。我用python开发了一个爬虫采集软件,可自动按笔记链接抓取笔记的详情数据。......
  • 【学习笔记】使用科学和魔法。
    一直没有太理解我们是怎么上网的,今天逼着自己问了问GPT,这是他的回答。因为众所周知的原因,下文中“虚拟virtual私人private网络network”均用【数据删除】代替。连接WiFi:当用户在设备上连接WiFi时,他们实际上是连接到一个本地网络,这个网络由无线路由器提供。这个路由器......
  • ml.net例子笔记6-ml.net v2之AutoML
    AutoML1概念自动化机器学习也称为自动化ML或AutoML,是将机器学习模型开发过程中耗时的反复性任务自动化的过程。数据科学家、分析师和开发人员可以使用它来生成高度可缩放、高效且高产能的ML模型,同时保证模型的质量。https://learn.microsoft.com/zh-cn/dotnet/machine-l......
  • ml.net例子笔记7-ml.net与OMNX
    在整个模型生成过程中,模型位于内存中,并且可以在整个应用程序生命周期中访问。但是,一旦应用程序停止运行,而模型未在本地或远程的某个位置保存,则无法再访问该模型。通常情况下,在其他应用程序中训练模型之后,某些时候会使用模型进行推理或重新训练。因此,存储模型很重要。详细信息......
  • gnuradio笔记[1]-内嵌python代码块
    摘要在GNURadio中简单使用内嵌python代码块实现输出内容到文件.超链接解决无法编辑代码块内代码原理简介GNURadio简介[https://wiki.gnuradio.org/index.php?title=What_Is_GNU_Radio]GNURadioisafree&open-sourcesoftwaredevelopmenttoolkitthatprovidessig......