从零开始学人工智能--统计学习:统计学习基础知识
Posted royalflush
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始学人工智能--统计学习:统计学习基础知识相关的知识,希望对你有一定的参考价值。
统计学习基础知识
现在我们开始统计学习系列课程的学习,首先先给大家介绍一下统计学习的基础知识。
1. 统计学习种类
统计学习一般分为两个主要类别:监督学习(predictive learning, supervised learning)以及非监督学习(descriptive learning, unsupervised learning),因为监督学习在实际中应用更为广泛,我们将主要精力放在监督学习上。
1.1 监督学习
监督学习的目标是在一个输入输出对的集合中(训练集)(D={(x_i,y_i)}_{i=1}^N)学习一个从输入变量(x)到输出变量(标签)(y)的映射,(N)是训练样本(采样)的数目。简单来看,(x_i)可以是一个向量,例如一个人的身高,体重等,复杂来看(x_i)可以是一张图片,一句话,一封邮件,一个时间序列等等。输出(y_i)可以是连续的,也可以是离散的,当(y_i)是连续的时,该学习问题被称为回归(regression)问题,当(y_i)是离散的时,该学习问题被称为分类(classification)问题。
1.1.1 分类问题
分类问题的输出在(yinleft{1,2,3,...,C ight})中取值,(C=2)对应二分类问题,(C>2)对应多分类问题。
例如:
这是一个二分类问题,左侧是形象化描述,方框中的训练集用图形展示,右侧是数据化描述,训练集用表格展示。训练数据有很多个形状和颜色,某些搭配是属于‘yes’类的,某些搭配是属于‘no‘类的,我们要推断新出现的蓝色的月亮,黄色的环和蓝色的箭头属于哪一类(泛化能力)
概率描述的必要性
因为新出现的蓝色的月亮,黄色的环和蓝色的箭头是在训练集中没有的,我们无法100%确定他们属于哪一类别,所以要引入概率来描述这种不确定性
用条件概率(p(y|x,D,M))来描述输出(y)的概率分布,(x)是新出现的输入,(D)是训练集,(M)是选择的模型,在上述例子中,(p(yes|蓝色月亮,D,M)+p(no|蓝色月亮,D,M)=1)。一般情况下,(D)和(M)都是确定的,所以条件概率也被简写为(p(y|x))。
给定输出条件概率,我们一般用取值最大的猜测作为新输入的推断(预测)输出(hat{y}):
[
hat{y}=hat{f}(x)=mathop{argmax}_{c=1,2,...,C}p(y=c|x)
]
这对应着最可能的类别标签,也叫作(p(y|x))的众数。
一些实际应用
文本分类
(x)是文本的一种结构化表示,文本分类是计算概率(p(y=c|x)),一个特殊的应用是垃圾邮件过滤,其中(y=1)代表垃圾邮件,(y=0)代表非垃圾邮件
大部分分类学习算法要求输入向量(x)是定长的,可以用bag of words的方式来表示变长的文档,基本思路是当词(j)在文档(i)中出现时(x_{ij}=1),这样训练集就可以被结构化为一个binary的共现矩阵,在共现矩阵上可以应用各种分类算法来学习规律
图片分类
图片和文本都具备明显的局部性,通过挖掘这种局部性而诞生的算法框架称为卷积神经网络和循环神经网络,二者共同大力推动了AI从传统统计学习向深度学习的发展
1.1.2 回归问题
分类问题的输出(y)是在一个连续的区间内取值,在推断时取后验概率分布的期望(E(y|x))。其应用例子包括:
预测某只股票第二天的最高股价
预测某篇文章接下去1小时的点击次数
预测一个机器人手臂在空中的位置
预测某个医院科室接下去一个月的就诊人数
回归问题和分类问题的主要区别不是输出的离散或者连续(就诊人数也可以认为是一个多分类问题),二者最主要的区别是对输出的分布假设不同,后续我们会涉及到。
1.2 非监督学习
非监督学习只有输入数据(x)而没有输出(y),我们的目标是挖掘(x)中感兴趣的信息,非监督学习有时也被称为知识发现,其代表就是聚类,主成分分析,关联分析,协同过滤,社区发现等。以聚类为例:小时候你在区分猫和狗的时候,别人和你说,这是猫,那是狗,最终你遇到猫或狗你都能区别出来(而且知道它是猫还是狗),这是监督学习的结果。但如果小时候没人教你区别猫和狗,不过你发现猫和狗之间存在差异,应该是两种动物(虽然能区分但不知道猫和狗的概念),这是无监督学习的结果。
聚类正是做这样的事,按照数据的特点,将数据划分成多个没有交集的子集(每个子集被称为簇)。通过这样的划分,簇可能对应一些潜在的概念,但这些概念就需要人为的去总结和定义了。
聚类可以用来寻找数据的潜在的特点,还可以用来其他学习任务的前驱。比如市场分割。也许你在数据库中存储了许多客户的信息,而你希望将他们分成不同的客户群,这样你可以对不同类型的客户分别销售产品或者分别提供更适合的服务。
聚类示意:
2. 统计学习中的基本概念
让我们看看一个简单的案例,曲线拟合:
我们有如下的数据点,这个数据点是通过(y=sin(2pi x))加上一些高斯噪声生成的
现在考虑一个关于(x)的多项式拟合上述蓝颜色的点:
[
f(x,w)=w_0+w_1x+w_2x^2+...+w_Mx^M=sum_jw_jx^j
]
虽然(f(x,w))是关于(x)的非线性函数,但是是关于参数(w)的线性函数,这种和参数保持线性关系的模型被称为线性模型。
可以通过最小化(f(x,w))和(y)的差别来求解参数(w),其中一种是误差的平方和:
[
E(w)=frac12sum_n{f(x_n, w)-y_n}^2
]
因为(E(w))是关于(w)的二次函数,所以其导数是关于(w)的一次函数,(E(w))的最小值是唯一的,当数据量比较小时,可以通过最小二乘直接获得解析解,在数据量比较大时,一般通过梯度下降法来逼近这个解。
2.1 统计学习三要素:模型,策略,算法
模型: 在上述的曲线拟合问题中,线性函数(f(x,w))就是模型,当然我们也可以选择其他的线性模型或者非线性模型,选择合适的模型是应用统计学习算法的第一步
策略: 有了模型,统计学习接着需要考虑的是按照什么样的准则学习最优的模型,在上述的曲线拟合问题中,误差平方和(E(w))就是一个准则(策略,损失函数),其余的准则还有0-1损失函数,绝对值损失函数,对数损失函数等
算法: 有了准则,就要考虑在该准则的约束下如何寻找参数(w)的最小值,最常用的就是梯度下降法或者同类别的基于梯度的算法(我更倾向于叫这一步为优化或者寻优,算法是一个比较泛的概念)
2.2 欠拟合和过拟合
上述模型,策略和算法都是针对模型的学习过程(拟合过程)的,而统计学习最终是要预测我们没有见过的样本(泛化能力),这里就涉及到一个在训练样本上的拟合程度的问题,是损失函数(E(w))越小泛化能力越强吗?答案是不一定,还是考虑上述曲线拟合问题,当多项式的阶数(M)不同时,拟合的效果如下:
可以看到在(M=0)和(M=1)时,模型未能很好的拟合训练集的散点,在(M=3)时看起来还不错,在(M=9)时拟合的程度最好,事实上,在(M=9)时,可以做到(E(w)=0)(思考一下为什么),但在(M=9)时,拟合出来的曲线和真正的数据分布的曲线(y=sin(2pi x))相去甚远,当有一个新的数据点出现时,例如在左边的第一个和第二个点之间,预测曲线会给出一个非常差的预测结果,此时称为模型过拟合。而在(M=0)和(M=1)时,称为欠拟合。
事实上,当(M)从(0)取到(9)时,有如下的训练误差和测试误差的对比:
以及不同模型的参数取值:
2.3 如何避免过拟合
2.3.1 从模型出发(交叉验证,AIC, BIC)
从曲线拟合问题的直观上来看,我们可以选择复杂度较低的模型,例如(M=3)。那么在面对一般化的问题时,该如何选取合适复杂度的模型呢?可以从训练的数据集中抽出一部分,作为验证集,验证集不参与训练,但是能够作为一个假的测试集来验证模型是欠拟合还是过拟合。
分割训练集和验证集,也是比较主观的,如果分割的不合适,可能也对选出的模型泛化能力有负面作用,另外,训练数据是比较珍贵的,扔掉一部分数据是比较可惜的,所以会采取利用全部数据的交叉验证(cross validation)的方式:
上图描述的是(10)折交叉验证,常用的还有(3)折,(5)折,(N)折((N)为样本数量)交叉验证,(N)折交叉验证也称为留一交叉验证(leave one out cross validation),交叉验证选择在验证集上平均误差最低的模型。交叉验证也存在一些缺陷,当模型比较复杂时,要训练和测试多次,尤其当可选择的模型范围很大时,训练和测试的次数会成指数级增加。但交叉验证仍然是在数据集有限的情况下最常用也是最好用的避免过拟合的方式之一。
此外,还有计算量相对较小的(AIC)和(BIC)准则,(AIC)由日本统计学家赤池弘次在1974年提出,$BIC$1978年由Schwarz提出。他们提供了权衡估计模型复杂度和拟合数据优良性的标准。
AIC准则的其中一种表达式为:
[
AIC=k+E(w)
]
BIC准则的其中一种表达式为:
[
BIC=kln(N)+E(w)
]
其中(k)代表模型参数的个数,(N)代表训练集样本数目。通常(AIC)或(BIC)的取值越小,模型泛化能力越强。
2.3.2 从策略出发(正则化)
在参数取值图中,我们可以看到,(M=9)的多项式模型的参数取值和波动非常大,虽然这个模型有很强的能力来拟合训练集。而在(M=3)时,参数是在一个相对较为合理的范围之内的,那么如何把模型的参数限制在一个较为合理的范围之内呢?我们考虑在损失函数(E(w))上加入一个对参数取值的惩罚:
[
E(w)=frac12sum_n{f(x_n, w)-y_n}^2+fraclambda2||w||^2
]
参数(lambda)用来控制惩罚的程度,(||w||)是(L2)范数,在回归问题中,上述策略被称为岭回归(ridge regression)。
或者:
[
E(w)=frac12sum_n{f(x_n, w)-y_n}^2+lambda||w||_1
]
(||w||_1)是(L1)范数,在回归问题中,上述策略被称为lasso回归。他们的统计学意义我们后续会涉及。
2.3.3 从寻优出发(Early Stopping)
考虑上述多项式拟合(M=9)的情况,那么大的参数取值是寻优算法通过不断迭代得到的。那么我们在寻优时,是否能否通过早一些停止迭代来避免这个问题呢,答案是可以的,而且在实际工程中这个办法也很有效,就是早停法(Early Stopping)。
一般在算法寻优时,训练集和验证集的误差呈如下的曲线:
我们可以根据验证集误差的变化来决定何时停止训练,选取参数被调整到最合适的模型。实际工程中,早停法有很多种应用方式,例如在连续多次迭代验证集误差都持续上升则停止,上升比例超过一定程度停止等等。
2.3.4 从数据出发(增加数据集)
考虑上述多项式拟合(M=9)的情况,当我们把数据量从(10)个增加到(15)个和(100)个的时候,拟合曲线有如下的变化:
直观上来看,大的数据量和大的模型容量是适配的,这样能在很大程度上避免过拟合,但是在实际工程中仍然要结合交叉验证,正则化和早停法一起使用。另外,有标注的样本是非常昂贵的,一方面需要在实际生产过程中采集样本,另一方面要给每个样本打上一个合适的标签(答案)(y),有些标签是随着业务运行获得的,有些标签是需要人为标注的。
例如,在机器学习在风控场景的应用中,为了预测一个客户未来贷款违约的可能性,我们要找很多历史上违约和履约的客户进行学习,而违约的客户量本身就是很少的,坏样本(违约)很珍贵。
在图像识别中,为了识别一张图片是猫还是狗,需要人为给每张图片标注猫,狗或者其它的分类
为了识别一张图片上的文字区域,需要人为给每个文字区域画上框:
自动驾驶为了识别车道线,行人,建筑物,汽车等元素,需要人为给每个像素点做标注:
自然语言处理为了识别每个单词的词性,需要人为给每个汉字做标注:
今年海钓比赛在厦门市与金门之间的海域举行。
今(O)年(O)海(O)钓(O)比(O)赛(O)在(O)厦(B-LOC)门(I-LOC)市(E-LOC)与(O)金(B-LOC)门(E-LOC)之(O)间(O)的(O)海(O)域(O)举(O)行(O)。
数据是AI的“衣食父母”,尤其在现在深度学习算法更加依赖大量的数据,有标注的数据十分珍贵,数据也是AI公司的核心竞争能力之一。
2.4 过拟合产生的原因
令(f(x;D))为在训练集(D)上学习的函数(f)在新样本(x)上的预测输出,(y)代表真实的输出
我们考虑在同一个学习场景下的很多个数据集,例如在曲线拟合案例中,在(y=sin(2pi x))上生成很多个(N)个点的数据集,学习算法在这些数据集上的期望预测为(ar{f}(x)=E_D(f(x;D)))
使用样本数相同的不同训练集产生的方差(variance)为:
[
var(x)=E_D((f(x;D)-ar{f}(x))^2)
]
方差的含义:方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。
期望输出与真实标记的差别称为偏差(bias),即:
[
bias(x)=(ar{f}(x)-y)^2
]
偏差的含义:偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
模型的泛化能力可以分解为偏差和方差的和:
[
E_D((f(x;D)-y)^2)=E_D((f(x;D)-ar{f}(x))^2)+(ar{f}(x)-y)^2
]
一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variance dilemma)。考虑上述曲线拟合问题,如果我们在(y=sin(2pi x))上新采样(10)个不同的样本点,那么(9)阶的多项式将会发生非常大的波动,但仍然能拟合这(10)个点,这就是低偏差,高方差的一个表现,最后泛化误差仍然很高。下图给出了一个示意图:
一个形象的打靶示意图来解释bias和variance的区别:
那么如何合理的在bias和variance中寻找一个折中呢,这时就可以考虑应用2.3节中的方法了。
2.5 最大似然估计和贝叶斯估计
2.5.1 贝叶斯定理
(A)和(B)代表两个事件,则(A)和(B)共同发生的概率为:
[
P(A,B)=P(A|B)P(B)=P(B|A)P(A)
]
贝叶斯定理有如下表示:
[
P(A|B)=frac{P(B|A)P(A)}{P(B)}
]
我们开看如下的具体案例:
假设一个人去医院做一个结肠癌的检查,这个检查不太准确,一个确定有癌症的人可以有80%的概率检查为阳性,一个没有癌症的人可以有10%的概率检查为阳性,即(p(x=1|y=1)=0.8),(p(x=1|y=0)=0.1)
其中(y=1)为这个人有癌症,(y=0)为这个人没有癌症,(x=1)为检查为阳性。
假设这个人的检测呈阳性,那么直观来看他有很大的几率有结肠癌。但是如果考虑结肠癌在人群中发生的概率(P(y=1)=0.004)(先验知识),那么此时有:
[
P(y=1|x=1)=frac{P(x=1|y=1)P(y=1)}{P(x=1|y=1){P(y=1)}+P(x=1|y=0){P(y=0)}}=0.031
]
也就是说只有百分之三的概率这个人真正有结肠癌,这就是先验知识对观测的修正作用,贝叶斯定理在统计学习中应用十分广泛,下两小节我们考虑一个简单的参数估计和统计推断问题来探索一下贝叶斯估计的应用。
2.5.2 最大似然
考虑一个扔硬币问题,硬币投掷的结果(xin{0,1}),其中(x=1)代表投掷结果为正面,(x=0)代表投掷结果为反面。我们假设这个硬币是不均匀的,也就是每次投掷正反面出现的概率是不一样的,假设正面的概率为(mu)
[
p(x=1|mu)=mu
]
那么自然,反面的概率为(1-mu):
[
p(x=0|mu)=1-mu
]
统一上述两式子就是经典的伯努利分布(Bernoulli distribution)
[
p(x|mu)=mu^x(1-mu)^{1-x}
]
假设我们观测了一个投掷序列(D={x_1,x_2,...,x_N}),似然函数定义为这些观测出现的概率乘积
[
p(D|mu)=prod_{n=1}^N{p(x_n|mu)}=prod_{n=1}^N{mu^{x_n}(1-mu)^{1-x_n}}
]
最大似然就是认为(mu)的取值应该使似然函数取值最大,假设我们观测10次,其中有7个正面,3个反面,那么似然函数为:
[
p(D|mu)=mu^7(1-mu)^3
]
上述式子求最大值可以先进行对数,变成(ln(p(D|mu))=7lnmu+3ln(1-mu)),对其求导,可以得到(mu=0.7)
一般来说,有(mu_{ML}=frac1N{sum_{n=1}^N{x_n}})
2.5.3 贝叶斯估计
在上述的最大似然中,存在一个致命的问题,假设我们观测的样本数量为3个,但是3次都是正面,我们会得出(mu_{ML}=1),即我们会判断以后每一次都会扔出正面,这符合数学逻辑,但是不符合我们的常识和直观感受,比如有人在你之前扔过这个硬币20次,其中正面是10次,那此时你是否还非常确信以后每一次都是正面呢?是否要修正自己的判断呢?那如何修正自己的判断呢?此时就要在似然函数的基础上引入关于(mu)的先验分布。
假设有如下的关于(mu)的先验分布:
[
p(mu)proptomu^{10}(1-mu)^{10}
]
此时根据贝叶斯定理:
[
p(mu|D)propto{p(D|mu)p(mu)}
]
此时结合我们的观测3次,正面次数为3次,可知:
[
p(mu|D)proptomu^{13}(1-mu)^{10}
]
此时我们最大化(p(mu|D))会得到(mu_{MAP}=frac{13}{23}),这个推断要远远比(mu_{ML}=1)更加合理,这就是引入先验知识的意义。在我们观测的样本量比较小的时候,引入先验分布会显得尤为重要。这种将结合先验和似然结合到一起的参数估计方式也称为最大后验概率推断(MAP: Max a Posterior)
(基于篇幅有限,此段略去大量的数学证明和数学表达,只为让大家能够形象化的理解贝叶斯估计的思想,准确的数学推导可以参考Pattern Recognition and Machine Learning,以及Machine Learning A Probabilistic Perspective)
3. 线性回归
3.1 经典线性回归
对于一个一般的线性模型而言,其目标就是要建立输入变量和输出变量之间的回归模型。该模型是既是参数的线性组合。从数学上来说,线性回归有如下表达形式:
[
h_{ heta}(x) = heta_{0} + heta_{1}x_1 + heta_{2}x_2 + cdots + heta_{n}x_n = sum_{i = 0}^{n} heta_{i}x_{i} = heta^Tx
]
其中(x_0=1),当(x=(x_0,x_1))时,就是一元的线性回归,例如房屋面积和销售价格的关系:
Living area(feet^2) | Price |
---|---|
2104 | 400 |
1600 | 330 |
2400 | 369 |
... | ... |
(x)和(y)的散点图如下:
一元线性回归的函数表达形式(h_{ heta}(x))是二维平面上的一条直线:
我们可以引入更高维度的特征变量(x),考虑多变量的例子:
Living area(feet^2) | badrooms | Price |
---|---|---|
2104 | 3 | 400 |
1600 | 3 | 330 |
2400 | 2 | 369 |
... | ... | ... |
此时称为多元线性回归,实际上函数(h_{ heta}(x))拟合的是一个高维空间中的平面:
现在我们假设预测值( heta^Tx)与真实值(y)之间存在一个误差(epsilon), 于是可以这样写:
[
y = heta^Tx + epsilon
]
线性回归假设(epsilon)是独立同分布的, 服从与均值为(0), 方差为(sigma^2)的正态分布(高斯分布)
[
P(epsilon) = frac{ 1 }{sqrt{2pi}sigma} e^{-frac{(epsilon)^2}{2sigma^2}}
]
那么(y)服从均值为( heta^Tx),方差为(sigma^2)的正态分布:
[
P(y|x; heta) = frac{ 1 }{sqrt{2pi}sigma} e^{-frac{(y - heta^Tx)^2}{2sigma^2}}
]
所有的样本可以认为是从上述分布中抽样,则(M)个样本的似然函数为:
[
L( heta) = prod_{i=1}^{m}
ho(y^i|x^i; heta) = prod_{i=1}^{m}frac{ 1 }{sqrt{2pi}sigma} e^{-frac{(y^i - heta^Tx^i)^2}{2sigma^2}}
]
上面的函数式子中,(x^i)与(y^i)都是已知的样本,(θ)是要学习的参数。
为计算方便,我们把(L( heta))取对数:
[
logL( heta)= logprod_{i=1}^{m}frac{ 1 }{sqrt{2pi}sigma} e^{-frac{(y^i - heta^Tx^i)^2}{2sigma^2}}= sum_{i=1}^mlogfrac{ 1 }{sqrt{2pi}sigma}e^{-frac{(y^i - heta^Tx^i)^2}{2sigma^2}}= mlogfrac{ 1 }{sqrt{2pi}sigma}-frac{1}{sigma^2}centerdotfrac{1}{2}sum_{i=1}^m(y^i - heta^Tx^i)^2
]
上面的公式取最大值,也就是下面的函数取最小值:
[
J( heta) = frac{1}{2}sum_{i=1}^m(h_{ heta}(x^i) - y^i)^2
]
求(J( heta))的最小值,可以直接对上式求驻点:
首先,将上式变形:
[
J( heta) = frac{1}{2}sum_{i=1}^m(h_{ heta}(x^i) - y^i)^2= frac{1}{2}(X heta - y)^T(X heta - y)
]
下一步对参数( heta)求导可得:
[
igtriangledown_{ heta} J( heta) = igtriangledown_{ heta}(frac{1}{2}(X heta - y)^T(X heta - y))=igtriangledown_{ heta}(frac{1}{2}( heta^TX^T-y^T)(X heta - y)=igtriangledown_{ heta}(frac{1}{2}( heta^TX^TX heta- heta^TX^Ty-y^TX heta+y^Ty) = frac{1}{2}(2X^TX heta-X^Ty-(y^TX)^T)= X^TX heta-X^Ty
]
驻点满足:
[
X^TX heta-X^Ty = 0
]
即得到 :
[
heta = (X^TX)^{-1}X^Ty
]
上式也称为Normal Equation?,当然也可以利用梯度下降法迭代求解:
[
heta_j= heta_j-alpha dfrac{partial}{partial heta_j}J( heta)
= heta_j-alphasum_{i=1}^m(h_{ heta}(x^i) - y^i)x_j^{i}
]
梯度下降法和Normal Equation?的区别如下:
Gradient Descent | Normal Equation |
---|---|
需要选择学习率(alpha) | 无需选择学习率 |
需要迭代,需要选择初始值 | 不需要迭代 |
不需要求逆矩阵 | 需要求矩阵(X^TX)的逆矩阵,复杂度较高 |
当特征维度(n)很高时也能使用 | 特征维度(n)很高时几乎无法使用 |
在工程上一般采取梯度下降法或者随机梯度下降法求解。
3.2 岭回归(ridge regression)
经典线性回归是假设误差满足标准正态分布,岭回归是在这个基础上加上了参数( heta)也满足标准正态分布,用最大后验估计推导可得似然函数为:
[
egin{aligned}
argmax_{ heta} quad L( heta)
& = ln prod_{i=1}^{n} frac{1}{sigma sqrt{2pi}} e^{ -frac{(y_{i}- heta^{T}x_{i})^{2}}{2sigma^2} } cdot prod_{j=1}^{d} frac{1}{ au sqrt{2pi}} e^{-frac{ heta^{2}}{2 au^{2}}} & = -frac{1}{2sigma^{2}} sum_{i=1}^{n}(y_{i}- heta^{T}x_{i})^{2} -frac{1}{2 au^{2}} sum_{i=1}^{d} heta_{j}^{2} - nlnsigmasqrt{2pi} - dln au sqrt{2pi}
end{aligned}
]
最大似然等价于最小化如下的损失函数:
[
egin{aligned}
argmin_{ heta} quad f( heta)
& = sum_{i=1}^{n}(y_{i}- heta^{T}x_{i})^{2} + lambda sum_{j=1}^{d} heta_{j}^{2} \end{aligned}
]
岭回归的Normal Equation?为:
[
heta = (X^TX+lambda I)^{-1}X^Ty
]
岭回归因为矩阵(lambda I)的对角元素全是(1),像一条山岭,故而得名。岭回归的示意图如下:
岭回归因为对参数取值范围的抑制在一定程度上避免了过拟合的问题,另外在存在特征变量间的共线性时(特征变量间有较强的相关性)可以避免(X^TX)不可逆的情况。
3.3 lasso回归和ElasticNet
lasso回归和岭回归的不同是假设参数( heta)也满足laplace分布,用最大后验估计推导可得似然函数为:
[
egin{aligned}
argmax_{ heta} quad L( heta)
& = ln prod_{i=1}^{n} frac{1}{sigma sqrt{2pi}} e^{ -frac{(y_{i}- heta^{T}x_{i})^{2}}{2sigma^2} } cdot prod_{j=1}^{d} frac{1}{2b} e^{-frac{lvert heta_{i}
vert}{b} } & = -frac{1}{2sigma^{2}} sum_{i=1}^{n}(y_{i}- heta^{T}x_{i})^{2} -frac{1}{b} sum_{i=1}^{d} lvert heta_{j}
vert - nlnsigmasqrt{2pi} - dln 2b
end{aligned}
]
最大似然等价于最小化如下的损失函数:
[
egin{aligned}
argmin_{ heta} quad f( heta)
& = sum_{i=1}^{n}(y_{i}- heta^{T}x_{i})^{2} + lambda sum_{j=1}^{d} lVert heta_{j}
Vert_{1} \end{aligned}
]
因为(lVert heta_{j}
Vert_{1})不可导,lasso回归的求解需要用到坐标轴下降或者最小角回归,受限于篇幅,这里不做展开,lasso回归的示意图如下:
相比岭回归,lasso回归的解更容易出现在坐标轴上,所以更容易出现稀疏的解,对特征之间的共线性也有比较好的抑制作用,在一定程度上实现了特征选择的效果。lasso回归全称是Least absolute shrinkage and selection operator。
ElasticNet回归是将岭回归和lasso回归进行结合,吸收二者的优点,损失函数为:
[
egin{aligned}
argmin_{ heta} quad f( heta)
& = sum_{i=1}^{n}(y_{i}- heta^{T}x_{i})^{2} + lambda_1 sum_{j=1}^{d} heta_{j}^{2}+lambda_2 sum_{j=1}^{d} lVert heta_{j}
Vert_{1} \end{aligned}
]
4. 线性分类
通俗来讲,分类是将(N)个样本点(x)分为(C)类的过程,不同的样本类别在空间中的边界称为决策边界,当决策边界是输入的线性组合时((D)维的空间中是一个(D-1)维的超平面),称为线性分类,示意图如下:
一维数据的线性决策边界:
二维数据的线性决策边界:
三维数据的线性决策边界:
上述三种场景都是线性可分的,即可以找到一个超平面将样本分开。有时样本的空间分布无法找到这样的一个超平面线性可分,如下图的样本分布:
此时虽然仍然可以利用线性决策边界,但是分类的效果就会变得很差,这种数据的分布就会用到其它非线性的方法如神经网络,knn,决策树等等,或者对其做一些变换让其线性可分(支持向量机等)这些是后面要讨论的内容。
数据集的线性可分性定义如下(针对二分类):
给定一个数据集:
[
T = {(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)},
]
其中,(x_i in R^{ n}, y_i in gamma = {+1, -1}, i = 1, 2, ..., N),如果存在某个超平面(S):
[
w cdot x + b = 0
]
能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,则称数据集为线性可分数据集(linear separable data set)。
线性分类任务的目标就使数据集尽可能的分到(S)两侧(数据集本身不一定是线性可分的),错误分配的样本会用一个损失函数来量化,最后通过最小化这个损失函数来找到参数(w)和(b)
4.1 感知机
感知机是1957年,由Rosenblatt提出。感知机是二分类的线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是(+1)和(-1)。假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据集正实例点和负实例点完全正确分开的分离超平面。如果是非线性可分的数据,则最后无法获得超平面。
感知机从输入空间样本(x)到输出空间样本(y)的模型如下:
[
f(x)=sign(w cdot {x}+b)
]
其中:
[
sign(x)= egin{cases} -1& {x<0} 1& {xgeq 0} end{cases}
]
(M)为误分点的集合,感知机的优化目标是最小化如下函数:
[
L(w,b) = sumlimits_{{x_i} in M}^{} { - {y_i}(w{x_i} + b)}
]
其导数如下:
使用随机梯度下降每次选一个样本点做更新:
算法流程:
输入:训练数据集(T = {(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)}),其中
(x_i in chi = R^{ n}, y_i in gamma = {+1, -1}, i = 1, 2, ..., N)。学习率(eta(0 < eta leq 1))
输出:(w, b);感知机模型:(f(x) = sign(w cdot x + b))
STEP 1选取初值(w_0, b_0)
STEP 2在训练集中选取数据((w_i, y_i))
STEP 3如果(y_i(w cdot x_i + b) leq 0),则:
[ w leftarrow w + eta y_ix_i b leftarrow b + eta y_i ]
STEP 4转至步骤2,直到训练集中没有误分类点。
动手做一做
训练数据集:
正实例点是([10,8],[6,9],[6,8],[7,6],[7,8],[9,6],[11,3],[10,6],[12,5])
负实例点是([1,2],[2,2],[3,1],[1,1],[3,6],[4,4],[3,2],[2,6],[6,2])
利用上述随机梯度下降法求解感知机模型
4.2 逻辑回归(logistic regression)
逻辑回归的表现形式和线性回归有些类似,逻辑回归解决的是二分类问题,假设(yin{0,1}),为了使输出在(0)到(1)之间,逻辑回归采用如下的函数形式:
[
h_ heta(x)=frac{1}{1+e^{- heta^Tx}}
]
即将线性回归的函数形式( heta^Tx)用logistic sigmoid函数进行映射,logistic sigmoid函数的形式为:
[
sigma(z)=frac{1}{1+e^{-z}}
]
该函数具有如下的特性:当(x)趋近于负无穷时,(y)趋近于(0);当(x)趋近于正无穷时,(y)趋近于1;当(x= 0)时,(y=0.5)
最早logistic sigmoid函数是皮埃尔·弗朗索瓦·韦吕勒在1844或1845年在研究它与人口增长的关系时命名的。sigmoid曲线可以模仿一些情况人口增长的 S 形曲线。起初阶段大致是指数增长;然后随着开始变得饱和,增加变慢;最后,达到成熟时增加停止。
逻辑回归假设(y)服从伯努利分布,并且用(h_ heta(x))代表(y=1)的概率,即:
[
P(y=1|x; heta) = h_ heta(x)
]
[ P(y=0|x; heta) = 1-h_ heta(x) ]
将上述两个式子合并成一个:
[
P(y|x; heta) = (h_ heta(x))^y(1-h_ heta(x))^{1-y}
]
现在有训练数据集(T = {(x^1, y^1), (x^2, y^2), ..., (x^N, y^N)})
似然函数为:
[
l( heta)=prod_{i=1}^{N}P(y^i|x^i; heta)=prod_{i=1}^{N} (h_ heta(x^i))^{y^i}(1-h_ heta(x^i))^{1-y^i}
]
最大似然等价于对似然函数的负对数求最小值:
[
J( heta)=-lnl( heta)=-sum_{i=1}^N(y^iln(h_ heta(x^i))+(1-y^i)ln(1-h_ heta(x^i)))
]
利用梯度下降求解的参数的更新公式为:
[
heta_j:= heta_j-alphadfrac{partial}{partial heta_j}J( heta)
]
展开后为:
[
heta_j:= heta_j-alphasum_{i=1}^N(h_{ heta}(x^i) - y^i)x_j^{i}
]
可以看到逻辑回归的参数更新递推式和线性回归的参数更新递推式在形式上是一样的,只是逻辑回归的(h_ heta(x))是在线性回归的(h_ heta(x)= heta^Tx)的外面套了一层sigmoid函数。
4.3 Softmax回归
在 softmax回归中,我们解决的是多分类问题(相对于 logistic 回归解决的二分类问题)。
因此对于训练集(T = {(x^1, y^1), (x^2, y^2), ..., (x^N, y^N)}),我们有(y^iin{1,2,...,k})。(注意此处的类别下标从$ 1 $开始,而不是 (0))。
对于给定的输入(x),我们想用假设函数针对每一个类别j估算出概率值(P(y=j|x))。也就是说,我们想估计(x)的每一种分类结果出现的概率。因此,我们的假设函数将要输出一个(k)维的向量(向量元素的和为(1))来表示这(k)个估计的概率值。 具体地说,我们的假设函数(h_ heta(x))形式如下:
softmax回归的代价函数为(推导过程略去):
其中(1{})为示性函数,({})中的取值为真的时候为(1),否则为(0)。
值得注意的是,上述公式是logistic回归代价函数的推广。logistic回归代价函数可以改为:
对于(J( heta))的最小化问题,目前还没有闭式解法。因此,我们使用迭代的优化算法(例如梯度下降法)。经过求导,我们得到梯度公式如下:
有了梯度,就可以用梯度下降法去迭代更新参数了。
Softmax 回归 vs. k 个二元分类器
如果你在开发一个音乐分类的应用,需要对(k)种类型的音乐进行识别,那么是选择使用 softmax 分类器呢,还是使用 logistic 回归算法建立$ k $个独立的二元分类器呢?
这一选择取决于你的类别之间是否互斥,例如,如果你有四个类别的音乐,分别为:古典音乐、乡村音乐、摇滚乐和爵士乐,那么你可以假设每个训练样本只会被打上一个标签(即:一首歌只能属于这四种音乐类型的其中一种),此时你应该使用类别数 (k = 4) 的softmax回归。(如果在你的数据集中,有的歌曲不属于以上四类的其中任何一类,那么你可以添加一个“其他类”,并将类别数(k)设为(5)。)
如果你的四个类别如下:人声音乐、舞曲、影视原声、流行歌曲,那么这些类别之间并不是互斥的。例如:一首歌曲可以来源于影视原声,同时也包含人声 。这种情况下,使用(4)个二分类的 logistic 回归分类器更为合适。这样,对于每个新的音乐作品 ,我们的算法可以分别判断它是否属于各个类别。
现在我们来看一个计算视觉领域的例子,你的任务是将图像分到三个不同类别中。(i) 假设这三个类别分别是:室内场景、户外城区场景、户外荒野场景。你会使用sofmax回归还是$ 3$个logistic 回归分类器呢? (ii) 现在假设这三个类别分别是室内场景、黑白图片、包含人物的图片,你又会选择 softmax 回归还是多个 logistic 回归分类器呢?
在第一个例子中,三个类别是互斥的,因此更适于选择softmax回归分类器 。而在第二个例子中,建立三个独立的 logistic回归分类器更加合适。
4.4 广义线性模型
在之前的章节中,我们谈到了服从高斯分布的线性回归和服从伯努利分布的逻辑回归,它们的解决过程十分相似。实际上,他们都是广义线性模型的特例,对于这类问题我们有比较统一的解决方案。
在介绍广义线性模型之前,我们先来引入指数分布族这一概念,一个单参数指数分布族可以表示为:
[
p(y;eta) = b(y)exp(eta^TT(y) - a(eta))
]
在这里,(eta)被称为自然参数(natrual parameter),一般来说,(T(y) = y),(a(eta))被称为log partition function。这里(e^{-a(eta)})起到归一化常数的作用。如果我们确定(T, a, b),通过不断改变(eta),我们就可以得到一个分布族。
伯努利分布属于指数分布族
对于伯努利分布我们有:
[
p(y;phi ) = phi ^y(1 - phi )^{(1 - y)} = exp(ylogphi + (1 - y)log(1 - phi )) = expleft(logleft(frac{phi }{1 - phi }
ight)y+ log(1 - phi)
ight)
]
很显然,伯努利方程是符合指数分布族形式:
[
eta = log(frac{phi} {1- phi}) T(y) = y a(eta) = -log(1 - phi)
= log(1 + e^eta) (y) = 1 ]
可以看到上式蕴含着:(phi = frac{1}{1 + e^{(- eta)}}),也就是我们之前引入的sigmoid函数
高斯分布属于指数分布族
[
p(y;mu) = frac{1}{sqrt{2pi}}expleft(-frac{1}{2}(y - mu)^2
ight) = frac{1}{sqrt{2pi}}expleft(-frac{1}{2}y^2
ight)expleft(mu y - frac{1}{2}mu^2
ight)
]
因此,在指数分布族形式下,我们只需要进行如下转换:
[
eta = mu T(y) = y a(eta) = mu^2/2
= eta^2/2 (y) = (1/sqrt{2pi})exp(-y^2/2)
]
还有很多常见的分布都属于指数分布族,在此就不展开。
广义线性模型
广义线性模型有如下的假设:
(P(y|x; heta) sim 指数分布(eta))
(eta)与(x)成线性关系,即(eta = heta^TX)
给定一个(x),我们需要目标函数为(h_ heta(x) = E[y|x])
根据如上假设,我们可以推导出高斯分布的线性回归模型:
[
h_ heta(x) = E[y|x; heta] = mu = eta = heta^Tx
]
上式中第一个等号是因为假设三,第二个等号则是由于高斯分布的基本性质,第三个等号则是由于前文中高斯分布中推导过的和的关系,最后一个等号则是由于假设二。
同样,我们也可以推导出逻辑回归模型:
[
h_ heta(x) = E[y|x; heta] = phi = frac{1}{1 + e^{-eta}} = frac{1}{1 + e^{- heta^Tx}}
]
上式中第一个等号是因为假设三,第二个等号则是由于伯努利分布的基本性质,第三个等号则是由于前文中伯努利分布中推导过的和的关系,最后一个等号则是由于假设二。
从以上可以看出,线性回归和逻辑回归的sigmoid函数形式并非是拍脑袋想出来的,而是符合更广泛的广义线性模型的假设而得出的自然推论。
4.5 从另一个角度看逻辑回归
考虑二分类问题,根据贝叶斯公式有:
[
P(y=1|x)=frac{P(x|y=1)P(y=1)}{P(x|y=1)P(y=1)+P(x|y=0)P(y=0)}
]
如果我们定义:
[
eta=lnfrac{P(x|y=1)P(y=1)}{P(x|y=0)P(y=0)}
]
那么有:
[
P(y=1|x)=frac{1}{1+e^{-eta}}
]
这和我们最初引入的sigmoid函数形式也是一致的。
实际上,给定(y=0)和(y=1)这两个类别的样本的分布假设(如高斯分布),我们是可以用最大似然求解分布的均值和方差的,进而可以显示的得到联合概率分布(P(y=1,x))和(P(y=0,x)),进而获得后验概率(P(y=1|x))。只不过在逻辑回归中,直接用线性表达式(eta= heta^Tx)来对(lnfrac{P(x|y=1)P(y=1)}{P(x|y=0)P(y=0)})进行建模。这就引出了4.6节的生成模型和判别模型。
极大似然的求解示意:
假设先验(P(y=1)=pi),则(P(y=0)=1-pi),对于一个来自(y=1)类别的数据点(x^n),联合概率分布如下,假设每一类的样本分布为正态分布并且方差相同:
[
P(x^n,y=1)=P(y=1)P(x^n|y=1)=pi{N(x^n|mu_1,Sigma)}
]
[ P(x^n,y=0)=P(y=0)P(x^n|y=0)=(1-pi){N(x^n|mu_2,Sigma)} ]
这样似然函数可以写为:
[
prod_{n=1}^N(pi{N(x^n|mu_1,Sigma))}^{y^n}((1-pi){N(x^n|mu_2,Sigma))}^{1-y^n}
]
为了确定联合概率分布,需要确定(pi,mu_1,mu_2,Sigma)四个未知变量,分别为:
[
pi=frac{1}{N}sum_{n=1}^Ny^n
]
[ mu_1=frac{1}{N_1}sum_{n=1}^Ny^nx^n ]
[ mu_2=frac{1}{N_2}sum_{n=1}^N(1-y^n)x^n ]
[ Sigma=frac{N_1}{N}S_1+frac{N_2}{N}S_2 ]
其中:
(S_1=frac{1}{N_1}sum_{nin{y=1}}(x^n-mu_1)(x^n-mu_1)^T)
(S_2=frac{1}{N_2}sum_{nin{y=0}}(x^n-mu_2)(x^n-mu_2)^T)
可以看到先验概率(pi)就是样本点所占的比例,而(mu_1)和(mu_2)分别为两类样本的均值,协方差(Sigma)为两类样本方差的加权平均。这些参数确定后,对于一个新的样本(x),我们就可以很方便的获得(P(y=1|x))的取值。
4.6 生成模型和判别模型
给个例子感觉一下: 如果我想知道一个人A说的是哪个国家的语言,我应该怎么办呢?
生成式模型
我把每个国家的语言都学一遍,这样我就能很容易知道A说的是哪国语言,并且C、D说的是哪国的我也可以知道,进一步我还能自己讲不同国家语言。
判别式模型
我只需要学习语言之间的差别是什么,学到了这个界限自然就能区分不同语言,我能说出不同语言的区别,但我不会讲。
如果我有输入数据(x),并且想通过标注(y)去区分不同数据属于哪一类,生成式模型是在学习样本和标注的联合概率分布(P(x,y)) 而判别式模型是在学习条件概率(P(y|x)) 。
生成式模型(P(x,y))可以通过贝叶斯公式转化为(P(y|x)=frac{P(x,y)}{P(x)}),并用于分类,而联合概率分布(P(x,y))也可用于其他目的,比如用来生成样本对((x,y))
判别式模型的主要任务是找到一个或一系列超平面,利用它(们)划分给定样本(x)到给定分类(y),这也能直白的体现出“判别”模型这个名称。
在4.5节中,直接用逻辑回归建模就是判别式的模型,而对(P(x^n,y=1))和(P(x^n,y=0))进行建模就是生成式的模型。
4.7 分类器评价标准
分类算法有很多,不同分分类算法又用很多不同的变种。不同的分类算法有不同的特定,在不同的数据集上表现的效果也不同,我们需要根据特定的任务进行算法的选择,如何选择分类,如何评价一个分类算法的好坏,直观上来看,我们可以用正确率(accuracy)来评价分类算法。
正确率确实是一个很好很直观的评价指标,但是有时候正确率高并不能代表一个算法就好。比如某个地区某天地震的预测,假设我们有一堆的特征作为地震分类的属性,类别只有两个:0:不发生地震、1:发生地震。一个不加思考的分类器,对每一个测试用例都将类别划分为0,那那么它就可能达到99%的正确率,但真的地震来临时,这个分类器毫无察觉,这个人类带来的损失是巨大的。为什么99%的正确率的分类器却不是我们想要的,因为这里数据分布不均衡,类别1的数据太少,完全错分类别1依然可以达到很高的正确率却忽视了我们关注的东西。接下来详细介绍一下分类算法的评价指标。
这里首先介绍几个 常见 的 模型评价术语,现在假设我们的分类目标只有两类,计为正例/正样本(positive)和负例/负样本(negtive)分别是:
1)True positives(TP): 被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数
2)False positives(FP): 被错误地划分为 正 例的个数,即 实际为负例但被分类器划分为正例的实例数;
3)False negatives(FN):被 错误地划分为 负 例的个数,即 实际为 正 例但被分类器划分为 负 例的实例数;
4)True negatives(TN): 被正确地划分为 负 例 的个数 ,即实际为 负 例且被分类器划分为 负 例的实例数。
混淆矩阵:
预测正 | 预测负 | 总计 | |
---|---|---|---|
实际正 | TP | FN | 正样本总数 |
实际负 | FP | TN | 负样本总数 |
总计 | 预测为正样本的总数 | 预测为负样本的总数 | 所有样本总数 |
评价指标:
1)正确率(accuracy)
正确率是我们最常见的评价指标, accuracy = (TP+TN)/(TP+FN+FP+TN),这个很容易理解,就是被分对的样本数除以所有的样本数,通常来说,正确率越高,分类器越好;
2)错误率(error rate)
错误率则与正确率相反,描述被分类器错分的比例,error rate = (FP+FN)/(TP+FN+FP+TN),对某一个实例来说,分对与分错是互斥事件,所以 accuracy =1 - error rate;
3)灵敏度(sensitive)
sensitive = TP/(TP+FN),表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力;
4)特效度(specificity)
specificity = TN/(FP+TN), 表示的是所有负例中被分对的比例,衡量了分类器对负例的识别能力;
FPR = 1-specificity=FP/(FP+TN),表示的是所有负例中被分错的比例
5)精度(precision)
精度是精确性的度量,表示被分为正例的示例中实际为正例的比例, precision=TP/(TP+FP);
6)召回率(recall)
召回率是覆盖面的度量,度量有多个正例被分为正例, recall=TP/(TP+FN)=TP/P=sensitive,可以看到召回率与灵敏度是一样的。
ROC曲线
下图是一个二分模型真实的输出结果,一共有20个样本,输出的概率就是模型判定其为正例的概率,第二列是样本的真实标签。
其中class一栏表示真实值,p为正例,n为反例,这20个样本中有10个正例10个反例;score一栏则是分类器给出的分类评分。一般的二分类的实现方法就是选择一个阈值,将大于这个阈值的样本认为是正例,小于这个阈值的样本认为是反例。于是,不妨对 样本4来看,如果将样本4的评分设置为分类阈值,被分类器为正例的样本有1 2 3 4,其中真正的正例样本有1 2 4,故其TPR=3/10=0.3,FPR=1/10=0.1(分母虽然数值一样但是意义不同,前面TPR的分母是样本总体中的真正例个数,后者是样本总体中的真反例个数)。接着不妨设置样本9的评分0.51作为阈值,那么样本1~9都会被分类器认为是正例样本,其中为真正例的有1 2 4 5 6 9共6个,所以TPR=6/10=0.6,FPR=3/10=0.3.如此这样,将1~20每个样本的评分均作为分类器的判定阈值,可以得到20组TPR和FPR的有序数对;然后不妨以TPR和FPR为两个坐标轴建立一个直角坐标系,就可以得到这样的图像:
这样每一组图像在图中都会有一个坐标,可以连成一条折线。一般地我们希望分类器得到的分类结果是完全正确的,也就是正例样本全部都能够被检测出来,并且不会混入真反例样本,这个时候TPR接近1且FPR接近0,反应在图像上好的分类器的折线应该更加接近左上角。当样本足够多时,折线就近似为圆滑的曲线,类似于这个样子:
从这个图上看,分类器A的结果肯定比分类器B要好。
还有一种更直观的绘制ROC曲线的方法,这边简单提一下。就是把横轴的刻度间隔设为1/N,纵轴的刻度间隔设为1/P,N,P分别为负样本与正样本数量。然后再根据模型的输出结果降序排列,依次遍历样本,从0开始绘制ROC曲线,每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,遍历完所有样本点以后,曲线也就绘制完成了。究其根本,其最大的好处便是不需要再去指定阈值寻求关键点了,每一个样本的输出概率都算是一个阈值了。
声明
本博客所有内容仅供学习,不为商用,如有侵权,请联系博主谢谢。
参考文献
[1] 人工智能:一种现代的方法(第3版)
以上是关于从零开始学人工智能--统计学习:统计学习基础知识的主要内容,如果未能解决你的问题,请参考以下文章
数据分析学习资料《利用Python进行数据分析第2版》+《Python数据分析与挖掘实战》+《从零开始学Python数据分析与挖掘》