2.线性回归

目录

1  导入tensorflow

2  线性回归

2.1  含义

2.2  导入数据集

2.3  损失函数

2.4  梯度下降算法

2.5  构建模型

2.5.1  定义输入与输出数据

2.5.2  定义模型类型

2.5.3  添加模型中的层

2.5.4  查看模型整体情况

2.6  编译模型

2.7  训练模型

2.8  使用模型进行预测


我们使用线性回归引入tensorflow用法,顺便展示其基本操作




1  导入tensorflow

首先我们导入tensorflow

查看tensorflow版本

我们下面所有运行结果都会出现这些红字,我就不截上了




2  线性回归




2.1  含义

线性回归的含义我们应该在数学课中有所了解,大致是我当前有若干点,根据现有的若干点,拟合成 y = ax + b 的一条直线

2.2  导入数据集

在我们当前的路径下有一个名为 Income1.csv 的数据集,这个数据集内容为 受教育年限与收入的对应表

如果有Excel可以打开查看一下

现在我们使用pandas导入这个数据集,如果没有pandas我们使用 pip install pandas 装一个

下面就是该数据集的全部内容,一般来讲 当我们受教育的年限越高,我们的收入也就越高,我们可以理解为受教育年限与收入有线性关系

我们现在使用matplotlib将上面这个表绘制成图

导入matplotlib后我们可以使用notebook独有的方法%matplotlib inline,这样可以将图直接显示出来,我们现在用的是pycharm,所以用不了那个方法,我们这样写

我们绘制数据集的散点图,x轴为Education,y轴为Income

我们可以看出上面的数据大致有一个 y = ax + b 的线性关系,我们要获取这条直线实际上就是求解a和b,得出a和b后,我们将a和b放进方程中,之后再输入任意的x即可获取预测的y




2.3  损失函数

预测值与实际值总会有差距,我们希望预测值与实际值相差越小越好,相差的数值在人工智能领域中我们称为损失,通过损失函数可以得出损失的值

此时我们又需要定义一个损失函数,我们不难想到 预测值-实际值 = 损失值,但是预测的过程有时会预测大有时会预测小,如果把整体的损失值相加,我们会因为预测大时的损失值和预测小时的损失值相同而得到趋于0的结果,但是这样是不对的

我们不难又想到一点,使用绝对值,如果使用绝对值的话会消除正负号的影响,这个想法是对的,但是计算机很难计算绝对值,所以我们使用另一种算法 均方差

  • 均方差:预测值与实际值之间的差取平方之后再除以样本数,关于是否开方有两种说法,在下面会提到

用公式表示均方差是这样的

  • 通过损失函数得出的损失值与后面提到的loss值含义相同,关于定义这个Loss值有两种说法,一种是开我上面公式这个平方,一种是不开,这个没有一个定论,不过有一点loss值越趋近于0,该模型的准确度越高
  • 注:定义loss值的方法不只有均方差




2.4  梯度下降算法

回到我们原本的问题求a和b上来,在损失值越小的情况下,我们希望系统越快的得出a和b的结果,此时我们应该使用梯度下降算法

这个后面会提到,在本章我们就了解模型优化的方法为梯度下降算法




2.5  构建模型




2.5.1  定义输入与输出数据

首先我们定义x与y

2.5.2  定义模型类型

定义好之后我们定义顺序模型

  • 顺序模型:以我的理解是一行(层)一行(层)去写,第一行(层)的输入是下一行(层)的输入

我们的模型除了可以定义为顺序模型还可以定义为其他模型,我刚刚网上查了一下知乎上有一个回答有所介绍

深度学习笔记32_除了Sequential还有其它类型的模型 - 知乎

这个连接展示了除Sequential以外的其他模型

此时这个模型就创建好了,但是此时其中还没有东西,我们需要添加一层一层的网络




2.5.3  添加模型中的层

我们使用add()的方式添加层,我们此时添加Dense层,Dense会是我们之后比较常用的层,它可以定义输入数据与输出数据的个数

此时由于我们预测y,这个y只是一个数,所以y是一维的,输出个数为一维(输出是Dense层的第一个参数,输入是第二个参数),我们的输入也是一维,输入我们Dense层要求是一个元组,所以我们需要按下面这样写

维度的问题可通过查看数据的shape,如果shape的长度为2,就是二维的。长度是几就是几维度

  • numpy数组这个问题我们往后放一放,此时输入与输出都是一个数,所以是一维的

在模型中可以添加的层还有很多,我们可以用Pycharm打开tensorflow.keras.layers查看还可以导入什么层

以上是我当前tensorflow中layers的__init__中的内容,现在我们在这里一口气把所有的层都说了也不现实,此时我们就知道我们现在使用了Dense层




2.5.4  查看模型整体情况

使用summary()可以查看模型整体的情况

此时我们看Output Shape

由于我们此时还没有输入数据所以元组的第一个值为None,输入数据后None的位置是样本的个数,比如说我现在有100个样本且想要在一批次输入进去,那此时的Output Shape就是(100,1)

如果我一批只传入50个输入,那此时我们的Output Shape就是(50,1)

  • 我们像上面正常定义Dense层就好,这个None我们不用考虑

我们再看Param(参数)

此时显示的参数为2,正是ax+b中的a和b

现在我们有一个输出,有两个参数,我们可以理解为Dense的作用就是构造y = ax + b 的这样一个层




2.6  编译模型

  • 编译的过程只在使用keras中层的时候才需要编译,在后面学习到自定义循环后就不需要编译了,编译的过程可以理解为配置的过程

编译涉及到优化方法optimizer,我们此时用到的方法是梯度下降算法中的adam

  • tensorflow中内置了很多optimizer(优化器),这个我们放在后面再讲

另外一个参数为loss值,loss值我们刚刚提到过,次数我们使用均方差,均方差的英文简写为mse

此时我们的模型就配置完毕了

2.7  训练模型

我们使用fit方法进行训练,为了把过程记录下来,我们把fit的返回值赋值给一个变量

fit需要参数训练的x数据与y数据,这个我们刚刚在2.5.1中已经定义过了,还有训练的轮数epochs,在这里我们训练5000次

一共训练了5000多次我就只截取一头一尾

从上面这5000次训练我们可以看到loss值是不断下降的,也就是说我们最终的结果越来越准确




2.8  使用模型进行预测

我们现在可以对现有的x进行预测

  • 预测值

上面是我们所有的预测结果,行数和我们输入x的行数相同

  • 实际值

我们对比看一下,现在loss值为187.7181

  • 上面这个图的左侧是我之前的预测结果,在人工智能领域我们每次的预测是有细小的差异的

对比一下可以看出预测的结果是非常不准的,如果要增加准确率有三种方法

  • 增加样本
  • 增加epoch
  • 增加样本与epoch

当然也有别的方法,这个放到后面讲

当然我们也可以预测不在数据集内的值,由于我们的x在训练时使用的数据类型为pd.series,所以我们输入也要是pd.series

我们现在预测教育年限为20的结果

我们可以看到预测结果为 63.23592 ,这个就是当我x为20时输出的值

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suyuoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值