机器学习——简单线性模型预测与分析

本文通过实例演示了如何使用TensorFlow实现简单的线性模型预测,并通过调整学习率等参数来观察对训练效果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章参考http://weixin.niurenqushi.com/article/2016-08-21/4400879.html

对简单线性模型预测进行一些重点突出与调参测试以达到对一些参数进行分析的目标。

先了解两个概念(这里直接引用,想深入了解请点击链接):

1、模型

为了使用机器学习来做预测,我们需要选择一个能够拟合收集到的数据的最佳模型。

(1)线性模型:我们可以选择一个线性(直线)模型,并通过改变其陡度/梯度和位置对其进行调整,从而匹配数据点。

例如模型:y = a * x + b


从图中我们可以看出,参数a是调整直线的斜率,也就是我们机器学习里说的梯度。参数b可以调整直线的位置。

我们常常将a为Weights(权重),b称为biases(偏执)。模型就可以转换成:y = Weights * x + biases。

(2)指数模型:当然,我们也可以选择一个指数(曲线)模型,并通过改变其曲率(curvature)和位置对其进行调整,从而匹配同一数据点集。


大家可以从图中看出中间的那条曲线拟合程度最好。

2、成本函数

为了比较哪个模型拟合得更严密,数学上我们将最佳拟合定义为一个需要被最小化的成本函数。 成本函数的一个简单样例是每个数据点所代表的实际输出与预测输出之间偏差的绝对值总和(实际结果到最佳拟合曲线的垂直投影)。用图表表示,成本函数被描述为下表中蓝色线段的长度和。


图中计算点到线的距离采用了垂直投影来表示,其实这里并不是按照严格的数学公式推导,而是通过不改变结果的逻辑推导,推导过程后续贴出来。

注意:更准确地说,成本函数往往是实际输出和预测输出之间的方差,因为差值有时是负数;这也称为最小二乘法。

好了,概念了解完毕,下面就举个栗子,我们就来预测简单的线性模型:y = Weights * x + biases

例如我们随便设置一个实际模型:y = 7 * x + 20

我们希望通过机器学习给出最接近的权重和偏执值:Weights = 7,biases = 20

这两个值与实际值越接近说明我们训练出来的模型就好。

打开Spyder编译器,Tensorflow以及Spyder的环境安装上篇已经介绍过了。

首先引入tensorflow与numpy(科学计算库)

import tensorflow as tf
import numpy as np

完整代码如下:

import tensorflow as tf
import numpy as np

#随机生成100个测试数据集x_data
x_data = np.random.rand(100).astype(np.float32)
#构建实际的 y 值
y = 7 * x_data + 20

#声明权重 Weights 为1维,范围可以随便写
Weights = tf.Variable(tf.random_uniform([1],-1,1))
#声明偏执 riase 为1维,值为0
riase = tf.Variable(tf.zeros([1]))
#注意:权重和偏执都是tensorflow变量,因为tensorflow会在训练过程中不断调整这两个值

#构建预测 y_pre 值
y_pre = Weights * x_data + riase

#成本函数:最小均方误差
cost = tf.reduce_mean(tf.square(y_pre - y))
#采用梯度下降算法最小化成本函数
#将学习率改为0.9可以看出 Weights 与 riase 的值来回震荡,这时候说明学习率大了,要调小
train = tf.train.GradientDescentOptimizer(0.5).minimize(cost)

#构建tensorflow会话
with tf.Session() as sess:
    #初始化tensorflow所有变量
    sess.run(tf.initialize_all_variables())
    #开始循环301次训练
    for step in range(301):
        sess.run(train)
        if step % 20 == 0:
            print(step,sess.run(cost),sess.run(Weights),sess.run(riase)) 

        

点击运行后查看训练输出结果:


第一列是指第几次训练,第二列是成本函数,第三列是Weights ,第四列是biases 。

成本函数的确是在逐渐减小的,e-12是e的负12次方。

可以看出红色箭头指出的地方已经是函数收敛的地方了,也就是说训练到220次时已经找到最优解:

Weights = 7.00000668,biases = 19.99999619

这两个值已经非常接近我们的实际值了。

那我们把学习率由0.5调小到0.3看下运行结果:


这次并没有看到函数收敛,那么这种情况我们可以将学习率调大一些或者将训练的次数增大一些就可以了。

例如将训练次数由300调大到500:


可以看出训练到320次时函数已经收敛了。

如果在训练过程中函数收敛的速度特别快导致剩余的训练都是白费的。

如果在训练过程中函数收敛的速度特别慢,这时候需要更大的训练次数才能达到收敛,这样可以认为是慢学习。

那么,或许我们有个疑问:如果把学习率设置过大会有什么样的结果呢?

我们将学习率由0.5调整到0.9试下:


可以看出Weights 和biases 这两个值一会大一会小,形成来回震荡现象,并且无法得到最优解。

看下面这个图可能更容易理解

那么如果遇到这种来回震荡的现象,就说明我们的学习率设置过大了,步子太大导致把最优解的点给迈过去了,我可以将学习率逐渐调小试下。

本文通过调参分析参数如何影响训练结果,所以说调了一手好参数在机器学习中挺重要的,那么如何调好参数就是要经验+分析了。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值