(存在疑问的地方使用红色字体进行了标注)
第一章
什么是机器学习
人工智能:研究如何让机器变得像人一样拥有智能的学科
机器学习:让计算机像人一样能从数据中学习出规律的一类算法
深度学习:神经网络类的机器学习算法,是机器学习的子集
深度学习 ⊂ \subset ⊂机器学习 ⊂ \subset ⊂人工智能
人工智能的具体应用领域:
计算机视觉CV:让计算机拥有视觉能力
自然语言处理NLP:让计算机用于语言能力
推荐系统RS:让计算机精确分析出人的喜好
最快的方式学完西瓜书前五章即可开始深度学习
机器学习所研究的主要内容,是关于计算机从数据中产生“模型”的算法,即“学习算法”。有了学习算法,我们把经验数据提供给它,它就能基于这些数据产生模型,在面对新的情况时,模型会给我们相应的判断。机器学习是研究“学习算法”的学问。
【模型】西瓜书用“模型”泛指从数据中学得的结果。
机器学习的基本术语
常用术语解释
要进行机器学习必须要先有数据,数据的集合称为【数据集】,数据集是由一条一条的记录组成的,每一条记录是关于一个事件或者一个对象的描述,称为一个【示例】或【样本】。这条记录反映了事件或对象某方面的表现或性质的事项,例如“色泽”,“根蒂”,“敲声”,称为【属性】或【特征】。属性上的取值称为【属性值】。属性张成的空间成为【属性空间】、【样本空间】或【输入空间】。从几何上面说,我们也把一个样本等价于属性空间中的一个【特征向量】
符号表示
令 D = { x 1 , x 2 , ⋯ , x m } D=\{ x_1,x_2,\cdots,x_m\} D={x1,x2,⋯,xm}表示包含有m个样本的数据集,每个样本 x i x_i xi由 d d d个属性描述,即 x i = ( x i 1 ; x i 2 ; ⋯ ; x i d ) x_i=( x_{i1};x_{i2};\cdots;x_{id}) xi=(xi1;xi2;⋯;xid),每个样本是d维样本空间 X \mathcal{X} X中的一个向量,即 x i ∈ X x_i\in\mathcal{X} xi∈X。其中 x i j x_{ij} xij是样本 x i x_i xi在第j个属性上的取值,d成为样本 x i x_i xi的维数
注:有时D也可以表示成矩阵形式
D
=
[
x
11
x
12
⋯
x
1
d
x
21
x
22
⋯
x
2
d
⋮
⋮
⋱
⋮
x
m
1
x
m
2
⋯
x
m
d
]
=
[
x
1
T
x
2
T
⋮
x
m
T
]
D= \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1d}\\ x_{21} & x_{22} & \cdots & x_{2d}\\ \vdots & \vdots & \ddots & \vdots \\ x_{m1} & x_{m2} & \cdots & x_{md}\\ \end{bmatrix} =\begin{bmatrix} x_{1}^T \\ x_{2}^T \\ \vdots \\ x_{m}^T \\ \end{bmatrix}
D=
x11x21⋮xm1x12x22⋮xm2⋯⋯⋱⋯x1dx2d⋮xmd
=
x1Tx2T⋮xmT
从数据中学得模型的过程称为“学习”或“训练”,这个过程通过执行某种学习算法来完成。学得模型对应了关于训练数据的某种潜在规律,因此亦称“假设”;这种潜在规律自身则称为“真相”或“真实”。学习过程就是为找出真相或逼近真相。西瓜书有时称模型成为“学习器”,可看做学习算法在给定数据和参数空间上的实例化。
要建立关于“预测”的模型,需要获得训练样本的“结果”(“标签”)信息,一般地,用
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)完整的表示第i个样本,其中,
y
i
∈
Y
y_i\in\mathcal{Y}
yi∈Y是样本
x
i
x_i
xi的标记,
Y
\mathcal{Y}
Y是所有标记的集合,称为“标记空间”或“输出空间”。
若预测值为离散值,则称学习任务为“分类”(classfication);若预测值为连续值,则称学习任务为“回归”(regression)。一般地,预测任务是希望通过对训练集
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
m
,
y
m
)
}
\{ (x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
{(x1,y1),(x2,y2),⋯,(xm,ym)}进行学习,从而建立一个从输入空间
X
\mathcal{X}
X到输出空间
Y
\mathcal{Y}
Y的映射
f
:
X
→
Y
f:\mathcal{X}\rightarrow\mathcal{Y}
f:X→Y。对儿分类任务,通常令
Y
=
{
+
1
,
−
1
}
或
{
0
,
1
}
\mathcal{Y}=\{+1,-1\}或\{0,1\}
Y={+1,−1}或{0,1};对多分类任务,
∣
Y
∣
>
2
|\mathcal{Y}|>2
∣Y∣>2;对回归任务,
Y
=
R
\mathcal{Y}=R
Y=R。
根据训练数据是否拥有标记信息,学习任务可以大致分为两大类:“监督学习(supervised learning)”和“无监督学习(unsupervised learning)”,分类和回归是监督学习的代表,而聚类是无监督学习的代表。
【泛化能力】机器学习的目标是使学得的模型能够很好的适用于新样本,而不仅仅是在训练样本上表现得很好。学得模型适用于新样本的能力,称为“泛化”(generalization)能力
通常假设样本空间中全体样本服从一个未知“分布”
D
\mathcal{D}
D,我们获得每个样本都是独立地从这个分布上采样获得,即“独立同分布”。一般而言,训练样本越多,我们得到的关于
D
\mathcal{D}
D的信息就越多,这样就越有可能通过学习获得具有强泛化能力的模型。
假设空间与版本空间
归纳是从特殊到一般的“泛化”过程,演绎是从一般到特殊的“特化”过程。从样例中学习显然是一个归纳的过程
“记住”训练样本是所谓的机械学习,或称“死记硬背式的学习”
广义的归纳学习大体相当于从样例中学习,而狭义的归纳学习则要求从训练数据中学得概念,亦称“概念学习”或“概念形成”。概念学习中最基本的是布尔概念学习,即对“是”或“不是”这样的可表示为0/1布尔值的目标概念进行学习。以西瓜数据集为例,要学习的目标是“好瓜”,假设好瓜可由“色泽”、“根蒂”、“敲声”三个元素完全确定**。于是我们学得的将是“好瓜是某种色泽,某种根蒂,某种敲声的瓜”这样的概念。**
我们可以把学习过程看作一个在所有假设组成的空间中进行搜索的过程,搜索目标是找到与训练集匹配的假设,即能够将训练集中的瓜判断正确的假设。假设的表示形式一旦确定,假设空间及其规模大小就确定了。这里我们的假设空间由形如 **“(色泽=?)
Λ
\Lambda
Λ (根蒂=?)
Λ
\Lambda
Λ(敲声=?)”**的可能取值所形成的假设组成。
有许多策略可以对这个假设空间进行搜索,搜索过程中可以不断删除与正例不一致的假设,或与反例一致的假设,最终将会获得与训练集一致,即对所有训练样本能够正确判断的假设(有时可能会为空),这就是我们学得的结果。
需要注意的是,现实问题中我们常面临很大的假设空间,但学习过程是基于有限样本训练集进行的。因此可能有多个假设与训练一致,即存在着一个与训练集一致的“假设集合”,我们称之为“版本空间”。
归纳偏好
如果仅依靠训练样本,则无法判定上面三个假设中哪一个更好。然而,对于一个具体的学习算法而言,它必须要产生一个模型。这时学习算法本身的偏好就会起到关键的作用。机器学习算法在学习过程中对某种类型假设的偏好称为“归纳偏好”或简称为“偏好”,任何一个有效的机器学习算法,必有其归纳偏好,否则它将被假设空间中看似在训练集上等效的假设所迷惑,而无法产生确定的学习结果。如果没有偏好,我们的西瓜学习算法产生的模型每次在进行预测时,随机抽选训练集上的等效假设,那么学习模型可能有时告诉我们它是好瓜,有时告诉我们它是坏瓜,这样的学习结果显然是没有意义的,是不能复现的。
归纳偏好可看作学习算法自身在一个可能很庞大的假设空间中对假设进行选择的启发式或“价值观”,奥卡姆剃刀是一种常用的自然科学研究中最基本的原则,若有多个假设与观察一致,则选最简单的那个,并且我们认为“更平滑”意味着更简单。
事实上,归纳偏好对应了学习算法本身所做出的关于“什么样的模型更好”的假设。在具体的现实问题中,这个假设是否成立及算法的归纳偏好,是否与问题本身匹配,大多数时候直接决定了算法能否取得好的性能。
假设学习算法
L
a
L_a
La与学习算法
L
b
L_b
Lb有着不同的归纳偏好,其
L
a
L_a
La产生的模型更简单,即泛化能力更强。但是不得不承认的是,对一个学习算法
L
a
L_a
La,若它在某些问题上比学习算法
L
b
L_b
Lb好,则必然存在另一些问题,在那里
L
b
L_b
Lb比
L
a
L_a
La表现更好。
证明:假设样本空间
X
\mathcal{X}
X和假设空间
H
\mathcal{H}
H都是离散的,令
P
(
h
∣
X
,
L
a
)
P(h|X,L_a)
P(h∣X,La)代表算法
L
a
L_a
La基于训练数据
X
X
X产生假设
h
h
h的概率,
f
f
f为我们希望学得的真实目标函数。
算法
L
a
L_a
La在对某个测试样本
x
x
x预测的误差(预测错误的平均概率)为
∑
h
P
(
h
∣
X
,
L
a
)
I
(
h
(
x
)
≠
f
(
x
)
)
\sum_{h}P(h|X,L_a)I(h(x)\neq f(x))
∑hP(h∣X,La)I(h(x)=f(x))
L
a
L_a
La的“训练集外误差”,即
L
a
L_a
La在训练集之外的所有样本上的误差
E
o
t
e
(
L
a
∣
X
,
f
)
E_{ote}(L_a|X,f)
Eote(La∣X,f)为
∑
x
∈
X
−
X
P
(
x
)
∑
h
P
(
h
∣
X
,
L
a
)
I
(
h
(
x
)
≠
f
(
x
)
)
\sum_{x\in \mathcal{X}-X}{P(x)\sum_h{P(h|X,L_a)I(h(x)\neq f(x))}}
x∈X−X∑P(x)h∑P(h∣X,La)I(h(x)=f(x)),也就是
∑
x
∈
X
−
X
∑
h
P
(
x
)
P
(
h
∣
X
,
L
a
)
I
(
h
(
x
)
≠
f
(
x
)
)
\sum_{x\in \mathcal{X}-X}{\sum_h{P(x)P(h|X,L_a)I(h(x)\neq f(x))}}
x∈X−X∑h∑P(x)P(h∣X,La)I(h(x)=f(x))
其中
I
(
⋅
)
I(\cdot)
I(⋅)表示指示函数,若
⋅
\cdot
⋅为真,则取值为1,否则取值为0。
考虑二分类问题,且真实的目标函数可以是任何函数
X
→
{
0
,
1
}
\mathcal{X}\rightarrow \{0,1\}
X→{0,1},函数空间为
{
0
,
1
}
∣
X
∣
{\{0,1\}}^{|\mathcal{X}|}
{0,1}∣X∣。对所有可能的
f
f
f按照均匀分布(期望相加)对误差求和
∑
f
E
o
t
e
(
L
a
∣
X
,
f
)
=
∑
f
∑
h
∑
x
∈
X
−
X
P
(
x
)
P
(
h
∣
X
,
L
a
)
I
(
h
(
x
)
≠
f
(
x
)
)
=
∑
x
∈
X
−
X
P
(
x
)
∑
h
P
(
h
∣
X
,
L
a
)
∑
f
I
(
h
(
x
)
≠
f
(
x
)
)
=
∑
x
∈
X
−
X
P
(
x
)
∑
h
P
(
h
∣
X
,
L
a
)
1
2
2
∣
X
∣
=
1
2
2
∣
X
∣
∑
x
∈
X
−
X
P
(
x
)
∑
h
P
(
h
∣
X
,
L
a
)
=
2
∣
X
∣
−
1
∑
x
∈
X
−
X
P
(
x
)
\begin{equation} \begin{aligned} \sum_{f}E_{ote}(L_a|X,f)&=\sum_f{\sum_h{\sum_{x\in \mathcal{X}-X}{P(x)P(h|X,L_a)I(h(x)\neq f(x))}}} \\ &=\sum_{x\in \mathcal{X}-X}{P(x)\sum_{h}{P(h|X,L_a)\sum_f{I(h(x)\neq f(x))}}} \notag\\ &=\sum_{x\in \mathcal{X}-X}{P(x)\sum_{h}{P(h|X,L_a)\frac{1}{2}2^{|\mathcal{X}|}}} \notag\\ &=\frac{1}{2}2^{|\mathcal{X}|}\sum_{x \in \mathcal{X}-X}{P(x)\sum_{h}{P(h|X,L_a)}} \notag\\ &=2^{|\mathcal{X}|-1}\sum_{x \in \mathcal{X}-X}{P(x)} \end{aligned} \end{equation}
f∑Eote(La∣X,f)=f∑h∑x∈X−X∑P(x)P(h∣X,La)I(h(x)=f(x))=x∈X−X∑P(x)h∑P(h∣X,La)f∑I(h(x)=f(x))=x∈X−X∑P(x)h∑P(h∣X,La)212∣X∣=212∣X∣x∈X−X∑P(x)h∑P(h∣X,La)=2∣X∣−1x∈X−X∑P(x)
由上面的推导可以看出总误差与学习算法无关!对于任意两个学习算法都有
∑
f
E
o
t
e
(
L
a
∣
X
,
f
)
=
∑
f
E
o
t
e
(
L
b
∣
X
,
f
)
\sum_f{E_{ote}(L_a|X,f)}=\sum_f{E_{ote}(L_b|X,f)}
f∑Eote(La∣X,f)=f∑Eote(Lb∣X,f)
也就是说无论算法 L a L_a La多聪明、算法 L b L_b Lb多笨拙,他们的期望性能是相同的!这就是没有免费午餐定理(NFL)。
- NFL定理有一个重要前提:所有问题出现的机会相同,或所有问题同等重要。但在现实情形中,很多时候我们只关心这个算法在某个特定问题上是否为好算法,至于他在其他问题上的表现是不重要的。(“问题”的不同在公式中影响的是真实目标函数 f f f吗?)
- 在上面简短的推导中假设了 f f f是服从均匀分布的,而实际情况并非如此
总结:NFL定理最重要的寓意是让我们清楚地认识到,推理具体问题,空泛的谈论“什么学习算法更好”是毫无意义的。
第二章 模型评估与选择
经验误差与过拟合
一般地
【错误率】:
被分类错误的样本数
样本总数
×
100
%
(
E
=
a
m
×
100
%
)
\frac{被分类错误的样本数}{样本总数}\times100\%\quad (E=\frac{a}{m}\times 100\%)
样本总数被分类错误的样本数×100%(E=ma×100%)
【精度】:
1
−
错误率
或
(
1
−
a
m
)
×
100
%
1-错误率\quad或\quad(1-\frac{a}{m})\times 100\%
1−错误率或(1−ma)×100%
【误差】:学习器的实际预测输出与样本的真实输出之间的差异
【训练误差或经验误差】:学习器在训练数据上的误差
【泛化误差】:学习器在新样本上的误差
【过拟合】:当学习器把训练样本学得“太好了”(训练误差非常小)的时候,很可能把训练样本自身的一些特点当做了所有潜在样本都会具有的一般性质,从而导致了泛化能力的下降
【欠拟合】:与过拟合相对,指对训练样本的一般性质尚未学好
注:欠拟合比较容易克服,例如在决策树中扩展分支、在神经网络学习中增加训练轮数,而过拟合一般比较麻烦,是机器学习面临的关键障碍,各类学习算法都必然带有一些针对过拟合的措施。并且,过拟合是无法彻底避免的(P不等于NP),只能缓解。
模型选择和参数配置是一个学习器性能好坏的关键,理想的解决方案是对模型的泛化误差进行评估,然后选择泛化误差最小的那个模型。难点在于如何获得比较准确的泛化误差或者近似替代(训练误差由于过拟合现象不能简单地替代泛化误差)
针对上面的难点,给出下列模型评估方法
模型评估
分离测试集,将测试集上学习器的测试误差近似作为学习器的泛化误差,需要注意,选取的测试集应该尽量与训练集互斥,即测试样本尽可能不出现在训练集中。
那么如何从包含m个样本的数据集D中分离出训练集S与测试集T呢?
留出法
原则: D = S ∪ T ; S ∩ T = ∅ D=S\cup T;S\cap T=\emptyset D=S∪T;S∩T=∅
【注意】
- 训练/测试集的划分要尽可能保持数据分布的一致性,从采样的角度看,要符合分层采样的原则。
- 即使在给定训练/测试集的样本比例后,仍存在多种方式对初始数据集D进行分割。单次使用留出法的结果并不可靠,因此一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
- 训练集与测试集的样本数之比一般为7:3,常见的做法是把大约2/3~4/5的样本用于训练,其余用于测试
交叉验证法
交叉验证先将数据集地划分为k个大小相似的互斥子集,每个子集都尽可能保持数据分布的一致性,即从D中通过分层采样得到,然后用k- 1个子集的并集作为训练集,剩余的那个子集作为测试集,这样就可以获得k组训练测试集,从而可进行k次训练和测试,最终返回的是这k个测试结果的均值,显然交叉验证法评估结果的稳定性和保真性,在很大程度上取决于k的取值。为强调这一点,通常把交叉验证法称为k折,交叉验证k最常用的取值是10,此时称为十折交叉验证,其他常用的k值有5,20等。
与留出法相似,将数据集D划分为k个子集,同样存在多种划分方式。为减小因样本划分不同而引入的差别,k折交叉验证通常要随机使用不同的划分,重复p次,最终评估结果是这p次k折交叉验证结果的均值。常见的有十次十折交叉验证。
假定数据集D中包含m个样本,若令k=m,则得到了交叉验证法的一个特例——留一法。显然,留一法不受随机样本划分方式的影响,留一法使用的训练集与初始数据集D相比,只少了一个样本。在大多数情况下,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似。因此,留一法的评估结果往往被认为比较准确。但是留一法也有缺陷,在数据集比较大的时候,训练m个模型的计算开销往往是难以忍受的。另外,留一法的估计结果也未必永远比其他评估方法准确,没有免费午餐定理,对实验评估方法同样适用。
自助法
自助法以自助采样法为基础,给定包含m个样本的数据集D,我们对它进行采样,产生数据集
D
′
D^{'}
D′。每次随机从D中挑选一个样本,将其拷贝放入
D
′
D^{'}
D′中,然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被采到,这个过程重复执行m次后,我们就得到了包含m个样本的数据集
D
′
D^{'}
D′,这就是自助采样的结果。显然,D中会有一部分样本会在
D
′
D^{'}
D′中多次出现,而另一部分样本不出现。
可以做一个简单的估计,样本在m次采样中始终不被采到的概率是
(
1
−
1
m
)
m
{(1-\frac{1}{m})}^{m}
(1−m1)m,取极限得到
lim
m
→
∞
(
1
−
1
m
)
m
=
1
e
≈
0.368
\lim_{m\rightarrow \infty}{(1-\frac{1}{m})}^m=\frac{1}{e}\approx0.368
m→∞lim(1−m1)m=e1≈0.368即通过自助采样初始数据集D中约有36.8%的样本未出现在采样数据集
D
′
D^{'}
D′中,于是我们将
D
′
D^{'}
D′用作训练集,
D
\
D
′
D\backslash D^{'}
D\D′用作测试集。这样一来实际评估的模型与期望评估·的模型都使用了m个训练样本,而我们仍有数据总量约为1/3的,没在训练集中出现的样本用于测试。这样的测试结果,亦称“包外估计”。
自助法在数据集较小、难以划分训练/测试集时很有用,并且对集成学习有好处。然而自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差,因此在初始数据量足够的情况下,留出法和交叉验证法常用一些。
调参和最终模型
在进行模型评估与选择时,除了要对适用学习算法进行选择,还需要对算法参数进行设定,这就是通常所说的“参数调节”,简称“调参”。现实中,常用的做法是对每个参数选定一个范围和变化步长,例如在[0,0.2]范围内,以0.05为步长,则实际要评估的候选参数值有5个,最终是从这5个候选值中产生选定值。
性能度量
对学习期的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量。在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果,这意味着模型的好坏是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求。
在预测任务中,要评估学习器
f
f
f的性能,就要把学习器预测结果
f
(
x
)
f(x)
f(x)与真实标记
y
y
y进行比较。
回归任务最常用的性能度量是“均方误差”:
离散:$$E(f;D)=\frac{1}{m}\sum_{i=1}{m}{(f(x_i)-y_i)}2$$
连续:
E
(
f
;
D
)
=
∫
x
∼
D
(
f
(
x
)
−
y
)
2
p
(
x
)
d
x
E(f;D)=\int_{x\sim D}{(f(x)-y)}^2p(x)dx
E(f;D)=∫x∼D(f(x)−y)2p(x)dx
下面主要是分类任务中常用的一些性能度量。
错误率与精度
对于样例集D,分类错误率定义为
E
(
f
;
D
)
=
1
m
∑
i
=
1
m
I
(
f
(
x
i
)
≠
y
i
)
E(f;D)=\frac{1}{m}\sum_{i=1}^{m}{I(f(x_i)\neq y_i)}
E(f;D)=m1i=1∑mI(f(xi)=yi)
精度则定义为
a
c
c
(
f
;
D
)
=
1
m
∑
i
=
1
m
I
(
f
(
x
i
≠
y
i
)
)
=
1
−
E
(
f
;
D
)
\begin{equation} \begin{aligned} acc(f;D)&=\frac{1}{m}\sum_{i=1}^{m}{I(f(x_i\neq y_i))} \notag\\ &=1-E(f;D) \end{aligned} \end{equation}
acc(f;D)=m1i=1∑mI(f(xi=yi))=1−E(f;D)
更一般地,对于数据分布D和概率密度函数
p
(
⋅
)
p(\cdot)
p(⋅),错误率和精度可分别描述为
E
(
f
;
D
)
=
∫
x
∼
D
I
(
f
(
x
)
≠
y
)
p
(
x
)
d
x
E(f;D)=\int_{x\sim D}{I(f(x)\neq y)p(x)}dx
E(f;D)=∫x∼DI(f(x)=y)p(x)dx
a
c
c
(
f
;
D
)
=
∫
x
∼
D
I
(
f
(
x
)
=
y
)
p
(
x
)
d
x
=
1
−
E
(
f
;
D
)
\begin{equation} \begin{aligned} acc(f;D)&=\int_{x\sim D}{I(f(x)= y)p(x)}dx \notag\\ &=1-E(f;D) \end{aligned} \end{equation}
acc(f;D)=∫x∼DI(f(x)=y)p(x)dx=1−E(f;D)
查准率、查全率与F1
对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(True Positive),假正例(False Positive),真反例(True Negative),假反例(False Negative)四种情形,令TP、 FP、TN、FN分别表示其对应的样例数。则显然有TP+FP+TN+FN=样例总数。分类结果的混淆矩阵如表所示
查准率P与查全率R分别定义为
P
=
T
P
T
P
+
F
P
P=\frac{TP}{TP+FP}
P=TP+FPTP
R
=
T
P
T
P
+
F
N
R=\frac{TP}{TP+FN}
R=TP+FNTP
查准率和查全率是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低,而查全率高时,查准率往往偏低.通常只有在一些简单任务中,才可能是查全率和查准率都很高。