机器学习中的单变量线性回归问题其实就是用一个神经元解决的方法。
下面是一个简单的线性回归案例
线性回归中的一些术语
标签:
是我们要预测的真实事物,在上面例子线性回归中就是应变量y
特征:
是用于描述数据的输入变量,在上面例子线性回归中就是自变量x的取值集合{x1、x2、x3、…xn}
样本:
是数据的特定实例:x的一个取值
有标签样本就是{特征,标签}:{x,y},用来训练模型
无………………{特征,?}:{x,?},用来对新数据进行预测
模型:
可以将样本映射到预测标签:y’是由模型的内部参数定义,内部参数则是通过不断地学习而得到。
训练:
训练模型是指通过有标签的样本来学习所有的权重(x的系数)和偏差(截距)的理想值
在监督式学习中,机器学习算法可以通过检查多个样本并尝试找出可最大限度地减少损失的模型。(也被称之为经验风险最小化)
损失:
是对糟糕预测的惩罚,是一个对于单个样本而言模型预测的准确程度的数值指标。
训练模型的目标是从所有样本中找到一组平均损失“较小”的权重和偏差。
损失函数:
L1损失:基于模型预测值与标签的实际值之差的绝对值为指标
L2损失:基于模型预测值与标签的实际值之差的平均平方损失为指标(均方误差MSE)
模型训练的迭代方法
由上图可知,模型训练的要点:(对于单变量线性回归问题y=wx+b)
1.对权重w和偏差b进行初始猜测;
2.反复调整这些猜测;
3.一直迭代到获得损失可能最低的权重和偏差为止。
当不断迭代,直到损失不再发生变化或十分缓慢,就说这个模型已收敛。
上述线性回归问题产生的损失与权重图为凸型,最低点斜率为零处就是损失函数收敛之处。
这里采用的是梯度下降法。
梯度:就是一个矢量,表示某一函数在该点处的方向导数沿着该方向取得最大值(即函数在该点处沿着该方向(梯度方向)变化最快,变化率最大)
到这里小伙伴们是不是想起了当年高数A3的知识了呢。😉
注意梯度是一个矢量,因此具有方向和大小。
用梯度乘以一个名叫学习速率(也称步长)的标量,用来确定下一个权重的取值。
比如梯度大小为2.5,学习速率为0.05,则梯度下降算法会选择距离前一个点0.125的位置作为下一个点。
选取需要适中。
超参数:
在机器学习中,超参数是开始学习过程之前设置的参数,而不是训练得到的参数数据。
选择一组好的超参数可以提高学习的性能和效果。可以这样说:超参数是机器学习中用于调整的旋钮。
典型的一些超参数:学习率、神经网络隐含层的数量……
单变量线性回归机器学习求解
上面的基础知识了解之后就可以解决这个单变量线性回归问题了。
使用Tensorflow进行算法设计与训练的核心步骤:
(1)准备数据
(2)构建模型
(3)训练模型
(4)进行预测
(1)准备数据
通过生成一个近似采样随机分布人工数据集,使得w=2,b=1,并加入一个噪声,最大振幅为0.4
%matplotlib inline # 在浏览器直接生成
# 导入库
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
# 设置随机数种子
np.random.seed(5)
# 使用numpy数值计算库生成100个-1~1之间的点
x_data=np.linspace(-1,1,100)
y_data=2*x_data+1.0+np.random.randn(*x_data.shape)*0.4 # 加噪
使用matplotlib画出结果
plt.scatter(x_data,y_data) # 画出散点图
plt.plot(x_data,2*x_data+1.0,color="blue",linewidth=3) # 画出我们要学习的线性函数y=2x+1
(2)构建模型
# 定义占位符
x=tf.placeholder("float",name='x')
y=tf.placeholder("float",name='y')
# 定义模型函数
def model(x,w,b):
return tf.multiply(x,w)+b
# 创建变量(定义模型结构)
w=tf.Variable(1.0,name='w0')
b=tf.Variable(0.0,name='b0')
# 前向计算
pred=model(x,w,b)
# 训练参数设置
train_epochs=60 #迭代次数
learning_rate=0.05 # 学习率
display_step=10 # 显示的步长
loss_function=tf.reduce_mean(tf.square(y-pred)) #损失函数(这里是L2)
# 定义优化器(这里选择梯度下降优化器)
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
# 创建会话
sess=tf.Session()
# 变量初始化
init=tf.global_variables_initializer()
sess.run(init)
# 开始训练
step =0#记录训练的步数
loss_list=[] #保存loss值的列表
for epoch in range(train_epochs):
for xs,ys in zip(x_data,y_data):
_,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
loss_list.append(loss)
step=step+1
if step%display_step==0:
print("训练轮数:","%02d"%(epoch+1),"step:%03d"%(step),"loss={:.6f}".format(loss))
b0temp=b.eval(session=sess)
w0temp=w.eval(session=sess)
plt.plot(x_data,w0temp*x_data+b0temp)# 画图
……
从这个图可以看出来,拟合模型较简单,训练了4次就接近了收敛,对于复杂模型,可能需要很多次的训练。
# 打印当前w,b的值
print(sess.run(w))
print(sess.run(b))
结果:
1.9823
1.04201
(4)进行预测
x_test=6.66
predict=sess.run(pred,feed_dict={x:x_test})
print("预测值是:%f"%predict)
target=2*x_test+1.0
print("目标值是:%f"%target)
结果:
预测值是:14.244107
目标值是:14.320000
可看出基本吻合。
损失值进行可视化处理:
plt.plot(lost_list)
列表推导式进行筛选损失大于1的:
[x for x in loss_list if x>1]
结果:
[1.0133754,
1.2284044,
1.0088208,
1.2116321,
2.3539772,
2.3148305,
1.3175836,
1.0387748,
1.5018207,
1.547514,
1.5513999,
1.5517284,
1.5517554,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581,
1.5517581]
再次对上述数据可视化:
plt.plot([x for x in loss_list if x>1])
单元线性回归问题的步骤小结:
1.生成人工数据集
2.构建线性模型
3.定义损失函数
4.定义优化器、最小化损失函数
5.训练结果可视化
6.利用机器学到的模型进行预测。
虽然单变量线性回归问题很简单,但也是入门机器学习,了解机器学习步骤的好方法。
还是继续加油!业精于勤而荒于嬉,行成于思而毁于随!
来源:CSDN
作者:Dream&fighting
链接:https://blog.csdn.net/weixin_44225901/article/details/104748262