线性回归(1)

MachineLearninginMarketing

感谢李宏毅《回归-案例研究》

部分内容为听取李宏毅老师讲座的笔记,也融入了自己对机器学习理解,个人推荐李宏毅老师的机器学习系列课程,尤其对于初学者强烈推荐。课程设计相对其他课程要容易理解。

在机器学习中算法通常分为回归和分类两种,今天我们探讨什么线性回归。以及如何设计一个线性回归模型。

什么回归

简单理解通过数据最终预测出来一个值。

回归问题的实例

就是找到一个函数,这个函数输入为宝可梦,而输出为宝可梦的进化后的 CP 值,所谓 CP 值就是宝可梦的战斗能力的指标。



Xcp : 表示宝可梦的战斗值
Xs:表示宝可梦的种类
Xhp : 表示生命值
Xw, Xh : 表示宝可梦的重量和高度

  1. 找一个模型
  2. 找一个最好的函数

设计模型

图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),其中学习率是常数。学习率是我们事先定义好的。

bandicam 2019-07-28 11-00-59-225.jpg


根据学习率(learning-rate)和该点微分值我们一步一步地移动 w 值来寻找最小 y 值,当移动到图中local optimal 局部小最值时候,以为概念微分为 0 所以我们就停止不前,其实全局最小值就不远处等着我们。我们就失去找到最小值的机会,大家不用担心梯度下降会帮助我们找到最小值。

从一个参数推广到两个参数

你可能感兴趣的:(线性回归(1))