感谢李宏毅《回归-案例研究》
部分内容为听取李宏毅老师讲座的笔记,也融入了自己对机器学习理解,个人推荐李宏毅老师的机器学习系列课程,尤其对于初学者强烈推荐。课程设计相对其他课程要容易理解。
在机器学习中算法通常分为回归和分类两种,今天我们探讨什么线性回归。以及如何设计一个线性回归模型。
什么回归
简单理解通过数据最终预测出来一个值。
回归问题的实例
就是找到一个函数,这个函数输入为宝可梦,而输出为宝可梦的进化后的 CP 值,所谓 CP 值就是宝可梦的战斗能力的指标。
Xcp : 表示宝可梦的战斗值
Xs:表示宝可梦的种类
Xhp : 表示生命值
Xw, Xh : 表示宝可梦的重量和高度
- 找一个模型
- 找一个最好的函数
设计模型
图1
y = b + W * Xcp
我们可以设计方程
图2
通过给不同参数 b 和 W 可以得到不同方程,我们任意带入参数得到不同方程,从而得到方程集合。然后我们从集合中挑选出最好的方程。我们可以根据常识过滤掉一些不合理方程。
找到第一个好的函数
import pandas as pd
pokemon = pd.read_csv("pokemon.csv",sep=",")
pokemon.head()
print(pokemon.head())
name species cp ... attack_strong_type_new attack_strong_value_new notes
0 Pidgey1 Pidgey 384 ... Flying 30 NaN
1 Pidgey2 Pidgey 366 ... Flying 30 NaN
2 Pidgey3 Pidgey 353 ... Flying 30 NaN
3 Pidgey4 Pidgey 338 ... Flying 30 NaN
4 Pidgey5 Pidgey 242 ... Dragon 25 NaN
x_data = [338., 333.,328.,207.,226.,25.,179.,60.,208.,606.]
y_data = [640.,633.,619.,393.,428.,27.,193.,66.,226.,1591.]
x 表示宝可梦的 cp 值,y 表示宝可梦的进化后的 cp 值
plt.scatter(x_data,y_data)
plt.show()
定义 Loss 函数
Losss 函数接受函数(模型)做为参数,输出一个评价该函数不好程度的值,大家也就明白了,Loss 函数就是帮助我们在众多函数中找最好函数作为预测的模型。
x = np.arange(-200,-100,1) #bias
y = np.arange(-5,5,0.1) #weight
Z = np.zeros((len(x),len(y)))
X, Y = np.meshgrid(x,y)
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
w = -4
lr = 0.0000001
iteration = 100000
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
# plot
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()
在图上我们,这里颜色越偏红色值越大,表示函数越不好。
梯度下降
在函数有两个参数决定方程好坏,分别是 w 和 b,我们可以分别考量这两个参数。我们需要找到 w 让 L(w) 值最小,可以穷举所有 w 来找到 L(w),虽然这样做可行,但是没有效率的。我们需要随机选取一个 w ,通过梯度下降方式找到让曲线值输出值 y 最小的 w
随机选取 w 点
对 w 进行左移(增加)还是右移(减少)
图
从图上看,如果切线斜率是负数,显然左边 loss 值高,而右边loss 值比较低,所以要降低 loss 值需要增加 w 的值。
解释说明一下,模型(Model)是一系列函数集合,这里假设为 y = b + W*X(cp)。这一系列函数根据参数 b 和 w 来确定,这两个参数不同决定函数也就是不同。我们输入 X(cp) 是一个宝可梦的战斗值,而输出为宝可梦的进化后的 cp 值。下面是训练数据
这里 Loss 函数接受我们函数集合(模型 Model) 中一个一个函数作为参数,输出一个用于评估方程好坏的值,Loss 表示损失的意思,那么也就是这个值越小说明我们输入函数越好,对应 Loss 值最小函数也就是最佳函数。我们知道 w 和 b 就决定我们方程长成什么样子。所以我们 Loss 也就是评判这两个参数好坏的。
这个列子比较简单,我们就是用户 b + W*X(cp) 和期望值进行求差后平方,来计算函数计算值和期望值的差值,求平方表示距离然后对所有所有数据的偏差求和。
我们将 Model(方程集合)中可能方程一个一个带入到 Loss 方程后计算损失值来评估方程的好坏,值最小的那个就是我们要找的方程
那么如何在 Loss 方程找到最小值所对应的最佳函数呢?带着这个问题我们继续然后,首先我们将 Loss 函数在图上表示出来,我们需要找到最低点,也就是函数的最小值。
首先
怎么增加,增加多少最为合适
增加(也就是步进多少)取决两个参数分别为该点微分值和学习率(learning rate),其中学习率是常数。学习率是我们事先定义好的。
根据学习率(learning-rate)和该点微分值我们一步一步地移动 w 值来寻找最小 y 值,当移动到图中
local optimal
局部小最值时候,以为概念微分为 0 所以我们就停止不前,其实全局最小值就不远处等着我们。我们就失去找到最小值的机会,大家不用担心梯度下降会帮助我们找到最小值。