机器学习笔记---回归(regression)

这篇博客探讨了回归分析的应用,如股票预测、推荐系统、自动驾驶和宝可梦CP值预测。通过线性模型和梯度下降法寻找最佳函数,解释了模型验证和过拟合现象。文章还展示了如何通过增加参数和正则化来优化模型,以应对过拟合问题。最后,通过代码实例展示了回归实现过程。

regression应用

1.股票预测:给定股票的历史数据,来预测股市明天的平均值
2.推荐系统:给定不同商品的特性,来预测购买某商品的可能性
3.自动驾驶:无人车上各个传感器的数据,来预测方向盘的角度
4.以及本节课重点讲解的预测宝可梦的cp值:给定进化前的cp值,物种,血量,重量等,来预测进化后的cp值
加一点自己的理解,感觉预测也可以叫判断或者计算

regression步骤

step1:model

选定一个model来进行训练,视频中选用的是线性模型,用训练资料去找一个最好的function

在这里插入图片描述
其实就相当于一个多元一次方程,每个元就是我们的特征,我们的目的是找到一个合适的系数。

step 2: Goodness of Function

定义模型的好坏。
判断好坏,我们可以用每个数据的预测值与真实值的差值的平方来定义模型的好坏,要是这个值越小,那么这个模型就越好,如下图。
在这里插入图片描述
在这里插入图片描述

step3 Best function 找出最好的function

我们定义了判断function的函数后,我们就可以根据这个函数来找到一个最佳值。在这个最佳值的function就是best function

在这里插入图片描述
视频中采用的是梯度下降法来进行求解。
在这里插入图片描述
首先我们对w入手,先随机选取一个w0,并计算当前的微分,就是上图中猴子站的地方的斜率,如果说斜率大于零,则往右边走,如果斜率小于0,则往左边走,走的长度我们定义为学习率,一直重复,直到找到最值 。但是这种方法有个缺点,就是找到的最值可能是局部最值而不是全局最值。
在这里插入图片描述
我们注意到,上图只是针对于单个变量w来进行最值寻找,但是我们的线性模型其实有多个变量。怎样求出多个变量的最值呢?
在这里插入图片描述
其实很简单,我们可以先求w,再求b,在视频中用一个矩阵(上图)标红的地方来表示梯度。其实梯度就是各个参数的偏微分,下图是计算方法。
在这里插入图片描述
在这里插入图片描述

下图是w和b的图形演示,下面这个图的颜色代表loss的大小。可以看红点的位置是怎么更新的。可以发现,红点一直是在往loss比较小的地方前进。
在这里插入图片描述
但是梯度下降最大的麻烦是可能找到局部最优值,而不是全局最优值,但是本节视频里面的线性模型不会出现这种情况
在这里插入图片描述

模型的验证

在视频中,采用训练集和测试集的平均误差来验证模型的好坏,如下图
在这里插入图片描述
测试集误差
在这里插入图片描述

尝试一下其他模型–一元N次模型

比如说一元二次模型
在这里插入图片描述
也可以尝试三次式,四次式的情况,如下图
在这里插入图片描述
在这里插入图片描述

过拟合

在这里插入图片描述
可以看到模型越复杂,在训练集的误差会减小,但是会在测试集的误差会先变小再变大,这种情况叫过拟合

尝试优化

通过增加样本数量分析,会发现宝可梦的种类对分类的结果有影响
在这里插入图片描述

step1.将四个线性模型合并到一个模型中

在这里插入图片描述
在这里插入图片描述

step2. 加入更多参数,更多样本

将血量(HP)、重量(Weight)、高度(Height)也加入到模型中
在这里插入图片描述
在这里插入图片描述
结果发现还是过拟合

step3. 加入正则化

在这里插入图片描述

回归实现代码

import numpy as np
import matplotlib.pyplot as plt

x_data=[338.,333.,328.,207.,226.,25.,170.,60.,208.,606.]
y_data=[640.,633.,619.,393.,428.,27.,193.,66.,226.,1591.]
x=np.arange(-200,-100,1)
y=np.arange(-5,5,0.1)
z=np.zeros((len(x),len(y)))
X,Y = np.meshgrid(x,y)##生成网络点坐标矩阵
#计算loss
for i in range(len(x)):
 for j in range(len(y)):
  b=x[i]
  w=y[j]
  z[j][i] = 0
  for n in range(len(x_data)):
   z[j][i] = z[j][i] + (y_data[n] -b -w*x_data[n])**2
  z[j][i] = z[j][i]/len(x_data)


b = -120 #initial b
w = -4
lr = 0.0000001 #learning rate
iteration = 1000000


b_history = [b]
w_history = [w]

#迭代
for i in range(iteration):
    b_grad = 0.0
    w_grad = 0.0
    for n in range(len(x_data)):
        b_grad = b_grad - 2.0*(y_data[n] - b - w*x_data[n])*1.0
        w_grad = w_grad - 2.0*(y_data[n] - b - w*x_data[n])*x_data[n]

    #梯度更新
    b = b - lr*b_grad
    w = w - lr*w_grad
    

    b_history.append(b)
    w_history.append(w)

#plot the figure
plt.contourf(x,y,z,50,alpha=0.5,cmap=plt.get_cmap('jet'))
plt.plot([-188.4],[2.67],'x',ms=12,markeredgewidth=3,color='orange')
plt.plot(b_history,w_history,'o-',ms=3,lw=1.5,color='black')
plt.xlim(-200,-100)
plt.ylim(-5,5)
plt.xlabel(r'$b$',fontsize=16)
plt.ylabel(r'$w$',fontsize=16)
plt.show()

在这里插入图片描述
发现其实没有到达最优解,我们可以尝试增大学习率试一下。
lr=0.000001,增大了10倍
在这里插入图片描述
再增大10倍来看看。
在这里插入图片描述
结果很不好,最后视频中,李老师给两个参数特质化了learning rate,来修正结果

 lr_b = 0
lr_w = 0

for i in range(iteration):
    b_grad = 0.0
    w_grad = 0.0
    for n in range(len(x_data)):
        b_grad = b_grad - 2.0*(y_data[n] - b - w*x_data[n])*1.0
        w_grad = w_grad - 2.0*(y_data[n] - b - w*x_data[n])*x_data[n]
    lr_b = lr_b + 2.0*b_grad**2
    lr_w = lr_w + 2.0*w_grad**2
    b = b - lr/np.sqrt(lr_b)*b_grad
    w = w - lr/np.sqrt(lr_w)*w_grad
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值