监督学习

39 阅读22分钟

监督学习

线性回归

让我们通过一个例子来开始:这个例子是预测住房价格的,我们要使用一个数据集,数据集包含俄勒冈州波特兰市的住房价格。在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集。比方说,如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱。那么,你可以做的一件事就是构建一个模型,也许是条直线,从这个数据模型上来看,也许你可以告诉你的朋友,他能以大约220000(美元)左右的价格卖掉这个房子。这就是监督学习中回归问题的一个例子。

image.png

我们将要用来描述这个回归问题的标记如下: m代表训练集中实例的数量

 x代表特征/输入变量

 y代表目标变量/输出变量

 (x,y)代表训练集中的实例

 (x^(i),y^(i))代表第i个实例

 f代表学习算法的解决方案或函数

y-hat代表y的预测值

image.png

其中最简单的回归算法就是单变量线性回归 f(x)= wx+bw和b称为模型的参数。 训练模型中的调参指的就是根据训练结果去调整参数的值。

线性回归--代价函数

如何评估模型f和训练数据的拟合程度,引入代价函数

其中平方误差成本函数是最通常用于线性回归的成本函数。

image.png

y-hat-y是误差error。这里计算公式 平均平方误差除以2的原因是为了更简洁

为了方便观察进行简化:假如这里b=0,那么f(x)=wxf(x)与j(w)的关系是可以看到:对于每个w值,都有一个f=wx函数进行对应,从而可以计算这个函数的代价函数J,也意味着可以在右边绘制w和J的曲线

image.png

那么由于J是衡量平方误差的代价函数,所以找到一个w值使J最小,便是我们的目标,使我们可以找到最好的模型。

image.png

更通用的来说,还有b的情况,即找到参数w和b值,使代价函数J最小,即可以获得我们想要的模型

下图为代价函数 J_wb 的3D可视化效果,即w为 x 轴,b为 y 轴, 而 J为 z 轴(高度),其中相同高度的代表他们的代价函数值相同,J(w = -10,b = -15) 是 w为-10,b为-15时,J函数的值。

image.png

3D可视化图可转化为等高线图。同一条线上的J值均相同。等高线图中的椭圆中心点是J函数的最小值即高度最小值的点

image.png 等高线图上蓝,绿,黄三点表示左上角图中的三条线所对应的J函数的值,也表示图下方中的三点所对应的J函数的值

线性回归--梯度下降

由于我们已经明确了代价函数J_wb,那么我们的目标就是找到参数w和b值,使代价函数值最小,这样才能最好的拟合曲线,那么怎么做呢?引入梯度下降法

梯度下降法是一个机器学习中很常用的用来求函数最值(其实是极值)的方法。包括适用于具有多个参数的模型,通过不断迭代计算函数的梯度,判断该点的某一方向和目标之间的距离,最终求得最小的损失函数和相关参数,为建立线性模型提供支持。

想象一下你正站立在山的一点上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,等到达这点后,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,不断迭代,依此类推,直到你接近局部最低点的位置。

image.png

同时我们发现选择不同的初始参数组合,可能会找到不同的局部最小值。即多个极值。

不过我们之前所讨论的平方误差成本函数总是碗形或弓形(即只有一个极小值,且极小值也是最小值)。那么我们在数学上该如何使用梯度下降来计算w的值和b的值呢:

可以通过图中所示来进行迭代,w-α* J关于w的偏微分对w进行赋值。。其中α是学习率(learning rate)并且大于0。同时需要注意的是,对于w和b同时存在情况下,我们往往需要同时更新w和b的值,那么应该采用左边corrrect(正确)的算法,而不是右边incorrect的。即保证w和b始终同步,而不是永远用更新的w去计算b的值。

image.png

让我们从图像上直观查看梯度下降的计算公式对于J成本函数的影响,我们简化J_wbJ_w,那么得到J关于w的图像(像之前显示的那样),当我们给定一个初始值后,计算J关于w的微分即斜率,当斜率为正时,由于α大于0,那么w进行迭代时,会w-正数,会变小。 当斜率为负时,由于α小于0,那么w-负数,即w会变大。

image.png

同时如果α值过小,那么可以发现每次w变化只会变一小点。如果α值过大,那么w变化又每次都会很大,甚至可能永远也无法收敛至一点上。

image.png

我们也可以发现,当迭代过程中不断趋近于极值时,我们的导数绝对值会变小,正数时减的值变小,负数时加的值变小,即w的变化会越来越小,即使我们的α是没有改变的。

image.png

下面理解了意义后,正式开始推导我们的第一个模型--具有梯度下降的线性回归模型,利用偏微分与链式求导法则,得到下面式子: image.png

代入梯度下降公式,得到下面模型公式:

image.png

由于我们这里特别关注的是平方误差成本函数,他只会有一个极小值,即最小值,也叫凸函数。所以这里我们只要给定一个合适的学习率,总可以让线性回归模型拥有最小的平方误差成本。

image.png

线性回归--多特征

前面讨论的是单特征的回归模型,例如房价根据房屋尺寸来进行预测。在实际中,可能会遇到多特征的情况,拿房价来举例,比如房屋尺寸、房间数、楼层、建成年份都会影响房价。这里引出了多特征回归模型。一个含有多个变量的模型,模型中的特征为(𝑥1,𝑥1,...,𝑥𝑛)。

image.png

这里上标i表示第 i 个训练样本, 下标j表示第j个特征值。综合看,x_ij表示第i个训练样本的第j个特征值。即第i行第j列。这里每一个训练样本为一个行向量,即含有多个特征的一组数。引入多特征回归模型后,原先的f = wx + b变为f = w1x1 + w2x2 + w3x3 +...wnxn + b可将wx均用向量进行表示(向量化),得到下图式子:f = 向量w 点积 向量x + b

image.png

向量化代码

由于我们这里引入了多特征模型,有时特征量会多到成千上万个,如果在代码中直接实现一个具有很多特征的模型,将会耗费很多时间,所以引入了计算机中向量化的概念。

向量化(vectorization)是计算机科学中的关键技术,指将程序中的标量代码转换为向量代码的过程,其核心是通过并行处理数组或矩阵中的元素,显著提升计算性能

image.png

通过numpy中的dot函数,即可实现向量化。在代码简洁的同时,大幅提升了运行速度。

import numpy as np #导入numpy库
a = np.array([1,2,3,4]) #创建一个数据a
print(a)
# [1 2 3 4]

import time #导入时间库
a = np.random.rand(1000000)
b = np.random.rand(1000000) #通过round随机得到两个一百万维度的数组
tic = time.time() #现在测量一下当前时间

#向量化的版本
c = np.dot(a,b)
toc = time.time()
print("Vectorized version:" + str(1000*(toc-tic)) +"ms") #打印一下向量化的版本的时间

#继续增加非向量化的版本
c = 0
tic = time.time()
for i in range(1000000):
    c += a[i]*b[i]
toc = time.time()
print(c)
print("For loop:" + str(1000*(toc-tic)) + "ms")#打印for循环的版本的时间

image.png 它的核心原理是利用了计算机的并行处理硬件来计算。当有大量数据集和大量个特征时,我们要用向量化来高效的执行代码。

image.png

多元线性回归下的梯度下降

类比单特征线性回归,写出多特征下的线性回归梯度下降公式,用来求解多特征时的成本函数最小值。

image.png

代入J(w,b) = (1/2m)*∑(w1x1+w2x2+w3x3+...wjxj + b-y)^2的式子,以及对J(w,b)求w_j和b的偏导。比较简单,得到多特征线性回归的梯度下降公式,不断迭代w和b后,可得到较好的结果。

image.png

补充-正规方程(最小二乘法)

还有一种方法可以求w和b的值,使得J的值最小。他不需要多次迭代,但是不能推广到其他算法。并且当特征数量较大时,正规方程也比较慢。所以对于大多数算法,梯度学习法仍是较好的选择

梯度下降实践

特征缩放

我们可以观察到当实际一个特征的尺度x1可能很大时,那么一个学习算法应该给他一个较小的参数值w1(权重),当一个特征x2的尺度很小时,那么一个算法应该给他一个较大的参数值w2。不然最终值只会相关于大尺度特征。并且变化非常大。 image.png

以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000 平方英尺,而房间数量的值则是0-5,以w1,w2两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁(因为w1只要稍微一改变, f 值就会变化很大,而w2需要变化很多,f值才会变化像刚才w1改变时那样多。),梯度下降算法需要非常多次的迭代才能收敛(因为现在更加倾斜了,斜率绝对值变大,在迭代时会造成在中心两侧来回跳的情况)。

image.png

所以引入了特征缩放的概念,我们常用的特征缩放方法是标准差标准化,通过减去均值并除以标准差使得数据成功缩放,使得数据分布的均值为0,标准差为1

image.png

代入x最大值最小值,可以算出缩放后的范围。进行特征缩放时,不用过于严格,只要尺度变小成个位数就行,不过进行特征缩放没有坏处,可以大胆去do,

image.png

判断梯度下降是否收敛

即判断在若干次迭代后,是否和我们所想的一样,成本函数J的值不断变小,我们可以建立左边的迭代次数和成本函数的图表来观测算法在何时趋于收敛。那时就是我们想要的结果。如果J在某次迭代后会变大,说明可能学习率选取过大或者代码出现bugimage.png

学习率选择

image.png

为了判断是否是代码有bug,我们可以将学习率选为一个非常非常小的值,如果仍旧会出现某次迭代后 J成本函数变大的情况,那么就是代码问题

学习率过大可能出现错误,学习率过小会导致成本函数下降太慢,迭代次数过多。

通常可以考虑尝试些学习率: 0.01,0.03,0.1,0.3,1,3,10。 通过不断尝试找到可以快速使J下降,但同时也会趋于稳定的学习率取值。

特征工程

对于一个算法来说,选择合适的特征至关重要。举例如房价问题:

image.png

特征工程通常是通过转化或组合现有的特征,或者定义新特征来对问题进行描述,得到更好的模型

多项式回归

有时线性回归往往无法满足我们的需求,所以引入多项式回归,比如二次,三次,根式

image.png

同时注意特征缩放。梯度下降等方法类似于线性回归

逻辑回归

在实际处理问题中,我们往往还会遇到一种问题,分类问题,分类问题的输出值不像回归问题那样是连续值,而是离散值。例如

  • 照片中的水果属于哪一种
  • 邮件是否是垃圾邮件
  • 图中信号灯是红色还是绿色还是黄色。

它们的结果往往只有几种,而最常见最简单的是二分类问题,是/否。我们可以借助二分类问题来进行分类问题的分析。对于多分类问题,我们也可以把多分类问题转化成一组二分类问题。比如最简单的是OVA(One-vs-all)方法,比如一个10分类问题,我们可以分别判断输入 x 是否属于某个类,从而转换成10个二分类问题。

我们将因变量可能属于的两个类分别称为负向类正向类,即因变量 y= 0或 y = 1 ,其中 0 表示负向类,1 表示正向类。它不是传统意义的好坏,而只是代表我们所提出问题的结果的存在/不存在。

线性回归的输出是一个数值f_wb = wx + b ,而不是一个标签,显然不能直接解决二分类问题。那我如何改进我们的回归模型来预测标签呢? 一个最直观的办法就是设定一个阈值,比如0,如果我们预测的数值 y > 0 ,那么属于标签A,反之属于标签B,直接给出标签,采用这种方法的模型又叫做感知机

另一种方法,我们不去直接预测标签,而是去预测标签为A概率,我们知道概率是一个[0,1]区间的连续数值,那我们的输出的数值就是标签为A的概率。一般的如果标签为A的概率大于0.5,我们就认为它是A类,否则就是B类。这就是我们的 逻辑回归模型

如果直接用我们之前的线性回归方程,发现它的值域wx+b是(负无穷,正无穷)。而不是我们想的那样的【0,1】区间。所以我们引入了逻辑回归,使用Sigmoid函数(逻辑函数)来将线性回归的结果映射为一个概率值。因为sigmoid函数具有良好的性质(平滑连续可导),并且值域在0到1之间。所以代入后就得到了我们的逻辑回归模型

image.png

因为是概率,并且y只能取值为0或1 也可以表示为:

image.png

可以看到:y为0和1的概率用表达式表达为:(当然也可以0和1的概率换位置)

image.png

可以合并式子为 分类正确的概率:(可以分别代入0和1看下,y=0时,概率为1-p(y=1)的概率)

image.png

那么我们得到的这个逻辑回归模型如何来进行预测分析呢?

让我们观察逻辑函数图像

image.png

由于y的取值只有0和1,但逻辑函数是这样连续的,所以我们实际用时会设定一个阈值,比如0.5,当 y 值大于0.5,那么就判定为正即(y=1),y 值小于0.5,那么判定为负(y=0)。发现 y>=0.5时,当且仅当 z值大于等于0。 即我们的 wx+b >=0 。 也就是说当 wx+b >=0 ,时我们一般会认为正类。 (这块儿的设定阈值不会影响实际结果,因为就算比如阈值是0.7,那么 z假如此时等于3,那么1和0的概率就是wx+b>=3的概率和wx+b< 3的概率,而b是常数,怎么都是一样的)

实际给定一堆数据后,比如下图中红叉为正类,蓝圈为负类,对于这种二分类问题,我们是需要找出决策边界(wx+b=0)的,也就是模型预测输出发生改变的区域。也就是我们之前所说的 y=0.5(wx+b=0)的位置。当wx+b>=0,即大于决策边界时,那么为正类,否则为负类。 决策边界的几何形式取决于分类模型的复杂性。比如下图,那么wx+b = x1+x2-3

image.png

比如下图 wx+b = x1^2+x2^2-1

image.png

逻辑回归--代价函数

对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们 也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将逻辑函数的f_wb带入时,得到的平方误差成本函数J_wb为非凸函数,即有多个极小值,那么我们就无法用梯度下降很好的求出最小值。

image.png

为了便于分析,这里观察平方误差成本函数,将其中蓝色框区域式子定义为损失函数L,即针对单个训练样本预测值与真实值产生的误差,通常损失函数与成本函数的关系是,成本函数=损失函数之和/样本数

在逻辑回归中,模型通过最大化训练数据的似然函数来估计参数。对于逻辑回归,我们希望尽可能地找到一个模型使其对于样本数据分类正确概率变大,即对于实际为正类样本,它的正类概率大;实际为负类样本,它的负类概率大(对应线性回归中的找到一条直线较好地拟合数据,使其平方差的均值变小)。那么我们将样本数据分类正确概率(之前提到了)表示为:

image.png 因为每次样本的判断是互不干涉的,所以其实就是分类正确的概率的连乘。然后我们只要通过最大化这个条件概率,来求出最佳的w和b参数值即可。

想要最大化它,采用最大似然估计法

将刚才的联合概率求对数,将连乘转为连加

image.png

这样就得到了完整的对数似然估计函数。为了便于梯度下降,而不是梯度上升,我们将其取负号,使其最大化问题转为最小化问题(因为对数似然估计是凹函数有最大值,我们将对数似然估计取负,就可以获得一个凸函数,有最小值。)。

因为y只能取0或1,将其代入上述取负后的式子,并考虑单个样本,得到损失函数

分析其性质:

image.png

image.png

发现具有良好的性质,满足我们要求,所以最终我们的成本函数 J_wb为:,并且它是一个凸函数,具有最小值(这里不证明了)

image.png

逻辑回归--梯度下降

我们已经获得了逻辑回归的成本函数J_wb,那么让我们看下如何能够找到合适的w值与b值,使得成本函数值最小。 依旧采用梯度下降法,通过不断迭代、同步更新去迭代w和b值(这里的求偏导过程省略,感兴趣自行求导,俺的导数公式忘差不多了。。。)这里虽然很巧结果和线性回归看起来一样,但其实f_wb的式子是不一样的,所以梯度下降求的结果还是一样的。

image.png

因为都是梯度下降法,所以关于梯度下降的特征缩放、迭代次数曲线、包括向量化等都可以应用到其中。

过拟合

我们依旧是拿房价来举例:在我们训练时,会出现两种极端情况,分别是左边和右边两张图,一种是欠拟合(高偏差),一种是过拟合(高方差)。

欠拟合指的是模型对于训练数据和测试数据都表现较差的情况,即模型的复杂度较低,无法拟合训练数据中的真实关系,导致不能泛化到新的数据上。 解决欠拟合的方法一般是增加模型的复杂度、改进数据预处理等。

过拟合指的是模型对于训练数据的拟合性太好,能拟合几乎所有的训练数据,导致模型的泛化能力(即对于训练数据外的新数据预测能力)较差,解决过拟合的方法一般是 增加训练数据、减少参数、或正则化。其实就是预测曲线或决策边界不平滑

我们机器学习的目标其实是找到一个 既不欠拟合、也不过拟合的模型,即刚刚好的模型。

image.png

同样地,对于逻辑回归也会存在过拟合和欠拟合的情况:

image.png

解决过拟合的方法

  1. 收集更多的训练数据,随着训练集的增大,学习算法将拟合一个比较平滑,变化不那么大的曲线。这时依旧可以保持我们的高阶多项式或特征很多的函数。 image.png

  2. 使用更少的特征,有时也叫特征选择。我们可以为学习算法选择比较重要的特征,而不是全部特征,但这种方法会导致 可能全部特征都是对于结果有影响的,但我们丢弃了一些特征。

  3. 正则化

image.png 当我们要消除一些特征时,我们其实就是将其对应的参数设置为0,而正则化其实是一种温和地减少某些特征影响的方法,正则化的作用是鼓励学习算法缩小参数值,而不必要求参数正好设置成0。保留所有特征,防止特征产生过大的影响从而造成过拟合。事实证明,即使拟合更高阶的多项式,只要能让算法使用更小的参数值,最终得到的曲线可以更好地拟合训练数据。

通常我们只减小w_j的值,而不会减小b的值,因为实际是否对参数b进行正则化没有太大区别。

正则化时的代价函数

让我们看一下正则化时的代价函数,从而方便后续引出正则化线性回归、正则化逻辑回归。 以下图为例:

image.png 右边曲线能很好地拟合训练数据,但是泛化能力较差,通过之前的正则化描述,我们期望做的是将w3和w4的值尽量变小,从而防止特征产生过大的影响而造成过拟合。由于w值是通过梯度下降的方式 求成本函数最小值 不断迭代出来的,所以我们这里假设成本函数在原先基础上+1000w3^2 + 1000 w4^2。既然想要最小化成本函数,那么就需要这两个值比较小,所以w3和w4就需要比较小。

更普遍地,正则化往往是我们有很多特征,比如一百个,我们不知道应该去惩罚哪些,所以我们通常对所有特征进行惩罚,即惩罚所有的w参数。所以正则化时成本函数如下:这种正则化也叫L2正则化

image.png

λ 通常被我们称为 正则化参数。λ 要做的就是控制在两个目标中的平衡关系。

第一个目标是我们的均方差项,想要它尽可能的小,去找到合适的 w 和 b 值,使的模型能够较好地拟合训练数据。 第二个目标是我们的正则化项,想要参数w保持较小,避免过拟合。

λ过小时,正则化项接近于0不会起到作用,会依旧过拟合。λ过大时,正则化项权重过大,为了使J较小,会导致实际所有 w值都接近于0,也就相当于只剩了b,相当于一条直线,导致极度欠拟合。所以λ选择很重要。

正则化线性回归梯度下降

有了成本函数后,实际进行梯度下降,求偏导得到线性回归的梯度下降公式:

image.png

正则化逻辑回归梯度下降

逻辑回归的成本函数也是同样加的L2正则化项,因为实际想实现的都是获得较小的参数值,即在成本函数里加一个正则化项去获得,所以和逻辑和线性没关系。有了成本函数,就进行梯度下降求偏导,同步更新:

image.png