├── 01introduction.md ├── 02model_evaluation_and_model_selection.md ├── 03linear_model.md ├── 04decision_tree.md ├── 05neural_network.md ├── 06support_vector_machine.md ├── 07Bayes_classifier.md ├── 08ensemble_learning.md ├── 09clustering.md ├── 10dimension_reduction_and_metric_learning.md ├── 11feature_selection_and_sparse_learning.md ├── 12computational_learning_theory.md ├── 13semi-supervised_learning.md ├── 14probabilistic_graphical_model.md ├── 15rule_learning.md ├── 16reinforcement_learning.md ├── README.md ├── The Heavens of Machine Learning ├── EM.md ├── README.md └── SVM.md ├── code ├── .ipynb_checkpoints │ ├── Untitled-checkpoint.ipynb │ └── exercise3.3-checkpoint.ipynb ├── DrawLossFunction.py └── exercise3.3.ipynb ├── graph ├── LossFunction.png ├── NB.jpg ├── PointToHyperPlane.png ├── SMO.jpg ├── SPODE.jpg ├── TAN.jpg ├── exercise3.3.png ├── multi-layer_feedforward_neural_networks.png ├── perceptron.png ├── second_derivative_of_loss_function.png ├── second_derivative_of_sigmoid_function.png ├── version_space.pdf └── version_space.png ├── reading ├── 10种机器学习算法的要点.md └── 机器学习的局限与明天.md └── resource ├── Decision tree.pdf ├── Decision tree.pptx ├── GitHub with MathJax 0.2.3.crx └── watermelon3.0alpha.csv /01introduction.md: -------------------------------------------------------------------------------- 1 | # 绪论 2 | 3 | ## 什么是机器学习? 4 | 5 | 人可以通过经验学习,比方说“朝霞不出门,晚霞行千里”,就是通过经验得来的知识。获得知识后,即使在不同的地点,不同的时间,看到不同的霞,我们也能作出正确的判断。那么,机器是否也能学习并利用经验,从而对一些未出现过的情况,在不通过显式编程(人作出判断并告诉机器)的情况下也能作出正确的预测呢?答案是可以的,这就是**机器学习**。 6 | 7 | 对于机器来说,**经验**是通过**数据**传达的。机器学习的主要研究内容就是从数据中产生**模型**的算法,也即**学习算法**。Mitchell给出一个更为形式化的定义,假设我们用P来表示程序处理任务T时的性能,如果程序通过利用经验E提高了在任务T上的性能,则称该程序对E进行了学习。 8 | 9 | 在本书中,**模型**泛指所有从数据中学得的结果,在别的文献中,也有对**模型**和**模式**作出区分的,模型指学得的全局性结果(比如一棵决策树),模式指学得的局部性结果(比如一条规则)。 10 | 11 | ## 基本概念 12 | 13 | 要进行机器学习,首先要有数据,我们可以收集一组结构相同的记录,这组记录的集合就称为**数据集**。比如下面这个西瓜数据集: 14 | 15 | |编号|色泽|根蒂|敲声| 16 | |:-:|:-:|:-:|:-:| 17 | |001|青绿|蜷缩|浊响| 18 | |002|乌黑|稍蜷|沉闷| 19 | |003|浅白|硬挺|清脆| 20 | 21 | **注**:实际使用数据时往往需要先进行编码,即把文本改为数值(比如青绿=1,乌黑=2,等等),以便计算机进行处理。 22 | 23 | 接下来给出一些基本概念的定义: 24 | 25 | #### 示例(instance),样本(sample)
26 | > 数据集中的每条记录是对一个事件或对象(比如这里的西瓜)的描述,也称作示例或者样本。特别地,有时会把整个数据集称为一个样本,因为数据集可以看作是从样本空间中抽样所得。这时候就需要根据上下文信息来进行判断了。 27 | 28 | #### 属性(attribute),特征(feature),属性值(attribute value)
29 | > 对象具备一些性质,并由此可以进行区分,这些性质就称为属性或者特征,比方说表格中的色泽、根蒂和敲声。不同对象在这些属性上会有不同的取值,这个取值就称为属性值。 30 | 31 | #### 属性空间(attribute space),样本空间(sample space),输入空间,特征向量(feature vector)
32 | > 由属性张成的空间,比方说上面的表格中有3个属性,那就可以张成一个3维空间,每个样本都可以用空间中的一个点来表示,这个点对应于一个坐标向量,所以有时也把一个样本称为一个特征向量。 33 | 34 | #### 维数(dimensionality)
35 | > 即数据集中每个样本拥有的特征数目。 36 | 37 | #### 学习(learning),训练(training),训练样本(training sample),训练示例(training instance)
38 | > 从数据中获的模型的过程。在这个过程中使用的数据称为训练数据,里面的每个样本称为一个训练样本,也称训练示例或训练例。训练样本的集合就是训练集。 39 | 40 | #### 模型(model),学习器(learner),假设(hypothesis),真相(ground-truth)
41 | > 模型有时也称为学习器,可以看作一组参数的有序集合,能够把属性空间映射到输出空间上。每一个模型对应于一个假设,也即数据存在的某种规律。真相指的是真正存在的规律,学习就是为了接近真相。 42 | 43 | 如果我们希望通过机器学习来实现预测(prediction),那么只有样本是不够的,要让机器明白怎样的样本会产生怎样的结果,还需要为每个样本设置标记,标记有可能是离散值(分类任务),也可能是连续值(回归任务)。带标记的数据集如下: 44 | 45 | |编号|色泽|根蒂|敲声|标记| 46 | |:-:|:-:|:-:|:-:|:-:| 47 | |001|青绿|蜷缩|浊响|好瓜| 48 | |002|乌黑|稍蜷|沉闷|坏瓜| 49 | |003|浅白|硬挺|清脆|坏瓜| 50 | 51 | #### 标记(label),样例(example),标记空间(label space),输出空间
52 | > 标记指示的是对象的类别或者事件的结果,样本和标记组合起来就是样例。所有标记的集合称为标记空间,也称为输出空间。 53 | 54 | #### 分类(classification),回归(regression),聚类(clustering)
55 | > 根据预测值的不同,可以把任务分为几种不同的类别。若预测的是离散值,比如“好瓜”,“坏瓜”,则该任务称为分类任务;若预测的是连续值,比如瓜的重量,则该任务称为回归任务;还有一种聚类任务,旨在基于某种度量将样本分为若干个簇(cluster),使得同一簇内尽量相似,不同簇间尽量相异。聚类任务不需要对样本进行标记。 56 | 57 | > 特别地,只涉及两种类别的分类任务称为二分类任务(binary classification),通常称一个类为正类(positive class),另一个类为反类或者负类(negative class)。涉及到多个类别的分类任务就称为多分类(multi-class classification)任务。 58 | 59 | #### 测试(testing),测试样本(testing sample),测试示例(testing instance)
60 | > 训练完成后,使用模型预测新样本的标记这个过程称为测试。测试中使用到的样本称为测试样本,也称测试示例或测试例。 61 | 62 | #### 监督学习(supervised learning),无监督学习(unsupervised learning)
63 | > 根据训练样本是否标记可以把任务分为两大类,需要标记的是监督学习,不需要标记的是无监督学习。前者的代表是回归和分类,后者的代表是聚类。 64 | 65 | #### 泛化(generalization)能力
66 | > 让机器进行学习的目标并不仅仅是为了让模型能在训练数据上有好的表现,我们更希望模型在新的样本上也能有良好的表现。模型适用于新样本的能力就称为泛化能力,泛化能力好的模型能够更好地适用于整个样本空间。 67 | 68 | #### 独立同分布(independent and identically distributed)
69 | > 一般来说,训练数据只占训练空间很少的一部分,当我们希望这一小部分的采样能够很好地反映整个样本空间的情况,从而令学得的模型具有良好的泛化能力。通常假设样本空间中的所有样本都服从于一个未知的分布(distribution),并且训练样本都是从该分布上独立采样所得,这就称为独立同分布。训练样本越多,越能反映该分布的特性,从而能学得泛化能力更强的模型。 70 | 71 | ## 假设空间 72 | 73 | 类似由样本构成的样本空间和由标记构成的标记空间,所有的假设共同构成了假设空间。学习的过程就可以看作是在假设空间中搜索最能**匹配(fit)**训练集的假设。 74 | 75 | 假设空间的规模有多大呢?举个例子,样本空间维度是3,也即每个样本由3个特征来表示。这三个属性可能的取值分别为3,2,2。那么假设空间的规模就是 `4 × 3 × 3 + 1 = 37`,为什么呢?因为除了可能的取值之外,每个属性还有一种选择就是使用通配符*号表示,即无论取何值都可以。所以一个有3种可能取值的属性在排列组合时有4种情形。最后的加一表示的是**$\varnothing$假设**,它对应的是一种无论属性取何值都不可能达到目的的状况。比方说,前面的假设都是假设怎样的瓜会是好瓜,而$\varnothing$假设则对应于好瓜根本不存在。 76 | 77 | 有时候会出现多个假设都能匹配训练集的情形,这些假设的集合就称为**版本空间(version space)**。版本空间是假设空间的子空间。 78 | 79 | ## 归纳偏好 80 | 81 | 对于学习算法来说,要产生一个模型就意味着要从版本空间中挑选出一个假设。但是版本空间中的假设都和训练集一致,无法直接分辨出哪一个更好,这时候**归纳偏好**,简称**偏好**就起作用了。 82 | 83 | 注意区分**偏好**和**特征选择**,前者是基于某种领域知识而产生的,后者则是基于对训练样本的分析进行的。 84 | 85 | 偏好指的是,在多个假设等效时,学习算法会认为某一种假设更优,并选择这种假设来建立最终的模型。如果一个学习算法没有偏好,比方说每次随机地从版本空间中选择一个假设,则它所给出的结果是时好时坏,自相矛盾的。所以任何一个有效的学习算法都应当有自己的归纳偏好。 86 | 87 | 怎样确定归纳偏好呢?一个常用的原则是**奥卡姆剃刀(Occam's razor)**,用一句话概述就是:**若多个假设与观察一致,则选最简单的那个**。注意,奥卡姆剃刀并不是唯一的准则,并且如何诠释“最简单”也是待考虑的。 88 | 89 | 给定基于某种归纳偏好的算法产生的模型A和基于另一种归纳偏好的算法产生的模型B,有时我们会注意到,A和B在不同的样本集上的表现各有好坏,有时候A的效果更好,有时候B的效果更好。甚至一个随机产生的模型都有可能在某个样本集上表现得优于我们精心设计的算法所产生的模型。怎样去定位这个问题呢? 90 | 91 | 书中使用**NFL定理(No Free Lunch Theorem)**来解答了这个问题,有一个关键点就是**总误差与学习算法无关**,证明在书上有,这里主要解析一下书中想要表达的思路。当我们考虑样本空间的所有可能分布,并认为它们都以相同的概率出现或同等重要时,无论使用什么模型,造成的总误差都是相同的,与学习算法无关! 92 | 93 | 但是!现实中并不是这样的,我们只考虑样本空间服从同一种分布的情形。打个比方,模型A是精心设计的算法产生的,模型B则简单地设定为把任何样本预测为负类。那么对于按照样本分布抽样所得的测试集,模型A效果会比B好;但是如果只抽取负类样本作为测试集,则模型B优于A。显然这种情况下模型B没有任何意义,因为我们根本就不care全是负类这种分布! 94 | 95 | 所以说,若考虑所有潜在的问题,则所有算法都一样好。**要谈论算法的优劣,必须结合具体问题!**学习算法的归纳偏好和问题是否相配,往往起到决定性的作用。 96 | 97 | ## 其它 98 | 99 | 关于发展历程和应用状况,属于阅读材料,所以这里不作详细的笔记了。这个小节再补充一点其他内容。 100 | 101 | **归纳(induciotn)**和**演绎(deduction)**是科学推理的两大基本手段,前者是从特殊到一般的**泛化(generalization)**,后者是从一般到特殊的**特化(specialization)**。举个例子: 102 | 103 | #### 演绎 104 | 105 | ``` 106 | 大前提:人都会死 107 | 小前提:苏格拉底是人 108 | 结论: 苏格拉底会死 109 | ``` 110 | 111 | 演绎是一个层层递进的过程,条件A指出一个可能,条件B指出另一种可能,互相交叉,构成大小前提,一直往下,从而推出新的可能。数学公理系统中,新的定理就是通过一组公理的演绎得出的。 112 | 113 | #### 归纳 114 | 115 | ``` 116 | 事件1:苏格拉底死了 117 | 事件2:柏拉图死了 118 | 事件3:阿基米德死了 119 | 结论: 人终有一死 120 | ``` 121 | 122 | 归纳是从一组平等的事物中发现普遍规律/联系的过程。机器学习中从样例学习就属于归纳推理。 123 | 124 | **注:**对于提到的人名,我很抱歉T.T 125 | 126 | #### 归纳学习 127 | 128 | 归纳学习有广义和狭义之分。广义上,只要是从样例中学习就都属于归纳学习;狭义上,不仅要从样例中学习,还要求学得**概念(concept)**,因此也称为**概念学习**。概念学习技术目前应用和研究都比较少,因为要学得泛化性能好且语义明确的概念太难了。现在的技术大多都是产生**黑箱模型**,难以明白学得的是什么,只知道它确实有用。 129 | 130 | 简要带过以下归纳学习(广义)的几大主流技术,最早期的主流是**符号主义学习**,例如决策树,能直接模拟人类对概念进行判定的流程,有良好的解释性很强大的表示能力。但是表示能力太强也直接导致了假设空间太大,复杂度极高的缺陷。问题规模较大时难以进行有效的学习。 131 | 132 | 接下来发展的另一主流技术是连接主义学习,例如神经网络。与符号主义学习能产生明确的概念不同,连接主义产生的是“黑箱”模型。连接主义学习涉及到大量的参数设置,而**参数设置缺乏理论指导,只能依靠手动调参**,参数的设置是差之毫厘谬以千里,参数的一点点差别体现在结果上可能是极其巨大的。因此,试错性大大地限制了连接主义学习的发展。 133 | 134 | 再往后,统计学习技术就闪亮登场了,例如支持向量机。它与连接主义学习有密切的联系,但没有连接主义学习那么大的局限性。 135 | 136 | 而现在最火的深度学习技术,其实就属于连接主义学习技术,可以简单地理解为多层神经网络。深度学习的模型复杂度非常高,以至于使用者只要下功夫调参,性能往往就会很好。为什么深度学习会突然变得热门呢?有两大支持,一是**数据支持**,深度学习模型参数极多,如果数据不够,很容易会过拟合,但这是一个大数据时代,海量的数据允许我们构造出精准的模型;二是**计算支持**,随着计算机技术的发展,现代计算机具备了足够的计算海量数据的能力。 137 | 138 | ## 习题 139 | 140 | #### 1.1 141 | 142 | > 问:表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间。 143 | 144 | 此时训练集如下: 145 | 146 | | 编号 | 色泽 | 根蒂 | 敲声 | 好瓜 | 147 | |:-:|:-:|:-:|:-:|:-:| 148 | |1 | 青绿 | 蜷缩 | 浊响 | 是 | 149 | |4 | 乌黑 | 稍蜷 | 沉闷 | 否 | 150 | 151 | 由于好瓜的3个属性值与坏瓜都不同。所以能与训练集一致的假设就有很多可能了,从最具体的入手,往上逐层抽象可得: 152 | 153 | ![版本空间](https://github.com/familyld/Machine_Learning/blob/master/graph/version_space.png?raw=true) 154 | 155 | #### 1.2 156 | 157 | > 问:与使用单个合取式来进行假设表示相比,使用“析合范式”将使得假设空间具有更强的表示能力 。例如: 158 | 159 | $$好瓜 \quad \leftrightarrow \quad \lgroup (色泽=*) \wedge (根蒂=蜷缩) \wedge (敲声=*)\rgroup \\ 160 | \vee \lgroup (色泽=乌黑) \wedge (根蒂=*) \wedge (敲声=沉闷)\rgroup$$ 161 | 162 | > 会把 “$(色泽=*) \wedge (根蒂=蜷缩) \wedge (敲声=*)$” 以及 “$(色泽=乌黑) \wedge (根蒂=*) \wedge (敲声=沉闷)$” 都分类为好瓜。若使用最多包含 $k$ 个合取式的析合范式来表达表1.1西瓜分类问题的假设空间,试估算有多少种可能的假设。 163 | 164 | 首先要理解题意,“使用最多包含 $k$ 个合取式的析合范式来表达表1.1西瓜分类问题的假设空间” 这句话表达的意思是**每个假设可以由最少1个最多k个合取范式的析取来表示**。 165 | 166 | 表1.1: 167 | 168 | |编号|色泽|根蒂|敲声|好瓜| 169 | |:-:|:-:|:-:|:-:|:-:| 170 | |1|青绿|蜷缩|浊响|是| 171 | |2|乌黑|蜷缩|浊响|是| 172 | |3|青绿|硬挺|清脆|否| 173 | |4|乌黑|稍蜷|沉闷|否| 174 | 175 | 这里色泽有2种取值,根蒂有3种取值,敲声有3种取值。因为每个属性还可以用通配符表示取任何值都行,所以实际上这三个属性分别有3,4,4种选择。因此,在只考虑单个合取式的情况下,有 $3 \times 4 \times 4 = 48$ 种假设(因为训练集中有存在正例,所以 $\varnothing$ 假设不需考虑)。 176 | 177 | 现在我们考虑题目的条件,这实际上是一个组合问题。我们可以从48个基本假设中任意去1个到k个组合为新的假设: 178 | 179 | 使用1个合取式:$\binom{48}{1} = 48$ 种假设; 180 | 181 | 使用2个合取式:$\binom{48}{2} = \frac{48*47}{2*1} = 1128$ 种假设; 182 | 183 | ... 184 | 185 | 使用k个合取式:$\binom{48}{k} = \frac{48*47*...*(48-k+1)}{k!}$ 种假设; 186 | 187 | 把以上求得的各情形下的假设个数进行求和就得到问题的答案了。 188 | 189 | #### 1.3 190 | 191 | > 问:若数据包含噪声,则假设空间中有可能不存在与所有训练样本都一致的假设。在此情形下,试设计一种归纳偏好用于假设选择。 192 | 193 | 归纳偏好是在无法断定哪一个假设更好的情况下使用的。既然问题是存在噪声,那么如果能知道噪声的分布(例如高斯噪声),就可以将这些性能相同的假设对应的误差减去由噪声引起的部分,此时再使用奥卡姆剃刀原则或者多释原则来进行假设选择就好了。更常见的做法是引入**正则化(regularization)**项,在建立模型时避免拟合噪声。 194 | 195 | #### 1.4* 196 | 197 | > 问:本章1.4节在论述“没有免费的午餐”定理时,默认使用了“分类错误率”作为性能度量来对分类器进行评估。若换用其他性能度量 $\ell$,则式(1.1)将改为 198 | 199 | $$E_{ote}(\mathfrak{L}_a | X,f) = \sum_h \sum_{x \in \chi-X} P(x)\ell(h(x), f(x))P(h|X, \mathfrak{L})$$ 200 | 201 | > 试证明“没有免费的午餐定理”仍成立。 202 | 203 | 回顾NFL的证明可以发现,关键是要证明,在考虑所有可能的目标函数(对应所有可能的问题,或者说样本空间的所有分布情况)时,模型的性能变得与学习算法无关。 204 | 205 | 也即证明 $\sum_f \ell(h(x), f(x))$ 最终可以化简为与常数形式。 206 | 207 | 当我们考虑所有可能的f,并且f均匀分布时,任务就失去了优化目标,无论使用哪一种算法,所得模型的平均性能会变得相同。 208 | 209 | 如果想看更严谨的推导可以看Wolpert, D.H., Macready, W.G当初写的论文["No Free Lunch Theorems for Optimization"](http://ti.arc.nasa.gov/m/profile/dhw/papers/78.pdf)。 210 | 211 | 事实上我对这个定理存有疑问,**NFL定理是否适用于所有性能度量?**。比方说,推荐系统中使用到的覆盖率,可以简单理解为生成的推荐结果包含的商品数与训练集中出现的商品数的比率。对于这样一个性能度量,倾向于推荐更多商品的算法会明显比其他算法更优。并且,即使考虑所有可能的f,我们依然对这些算法存在偏好。 212 | 213 | #### 1.5 214 | 215 | > 问:试述机器学习能在互联网搜索的哪些环节起什么作用。 216 | 217 | 这题比较开放,机器学习能起到的作用有很多,例如利用机器学习知识进行数据挖掘,从应用的角度来说,可以构建推荐系统、赛事预测、语音识别等等。 218 | -------------------------------------------------------------------------------- /02model_evaluation_and_model_selection.md: -------------------------------------------------------------------------------- 1 | # 模型评估与选择 2 | 3 | ## 误差 4 | 5 | 在分类任务中,通常把错分的样本数占样本总数的比例称为**错误率(error rate)**。比如m个样本有a个预测错了,错误率就是`a/m`;与错误率相对的有**精度(accuracy)**,或者说正确率,数值上等于1-错误率。 6 | 7 | 更一般地,通常会把模型输出和真实值之间的差异称为**误差(error)**。在训练集上的误差称为**训练误差(training error)**或者**经验误差(empirical error)**。而在新样本上的误差则称为**泛化误差(generalization error)**。我们希望模型的泛化误差尽可能小,但现实是,我们无法知道新样本是怎样的,所以只能尽可能地利用训练数据来最小化经验误差。 8 | 9 | 但是否经验误差小,泛化误差就一定小呢?这不是一定的,如果模型相比训练数据来说过于复杂,那就很有可能把训练数据本身的一些特点当作整个样本空间的特点,从而使得在训练数据上有很小的经验误差,但一旦面对新样本就会有很大误差,这种情况叫做**过拟合(overfitting)**。相对的是**欠拟合(underfitting)**。 10 | 11 | 欠拟合很容易避免,只要适当地增加模型复杂度(比方说增加神经网络的层数)就好。但**过拟合是无法彻底避免的**,只能缓解(减少模型复杂度/增加训练数据),这也是机器学习发展中的一个关键阻碍。 12 | 13 | 在现实任务中,要处理一个问题,我们往往有多种算法可以选择,即使是同一个算法也需要进行参数的选择,这就是机器学习中的**模型选择(model selection)**问题。既然泛化误差无法使用,而经验误差又存在着过拟合问题,不适合作为标准,那么我们应该如何进行模型选择呢?针对这个问题,后面的三个小节会给出回答。 14 | 15 | 这里先简单归纳一下,书中将模型选择问题拆解为(1)评估方法;(2)性能度量;(3)比较检验;三个子问题。可以这样理解: 16 | 17 | - **评估方法**:用什么数据做评估?如何获得这些数据? 18 | 19 | - **性能度量**:评估时如何衡量模型的好坏?有哪些评价标准? 20 | 21 | - **比较检验**:如何比较模型的性能?注意不是简单地比大小!在机器学习中性能比较是相当复杂的。 22 | 23 | ## 评估方法 24 | 25 | 前面已经提到了不能把经验误差用作模型评估,否则会存在过拟合的嫌疑。那么很自然地,我们就会想到是否有一种方法能近似泛化误差呢?答案是有的,就是使用**测试集(testing set)**进行评估,利用**测试误差(testing error)**来近似泛化误差。 26 | 27 | 测试集和训练集一样,从样本空间中独立同分布采样而得,并且应尽可能与训练集互斥,也即用于训练的样本不应再出现在测试集中,否则就会高估模型的性能。为什么呢?举个例子,老师布置了2道题做课后作业,如果考试还是出这2两题,只能证明大家记住了这2道题;只有出不一样的题,才能看出大家是否真的掌握了知识,具备了举一反三的能力。 28 | 29 | **注意**!!测试数据更多地是指模型在实际使用中遇到的数据,为了和模型评估中使用的测试集进行区分,一般会把模型评估用的测试集叫做**验证集(validation set)**。举个例子,在Kaggle或者天池上参加比赛,我们一般会拿到一份带标记的原始数据集和一份不带标记的测试数据集。我们需要选用一种评估方法来把原始数据集划分成训练集和验证集,然后进行训练,并按照模型在验证集上的性能表现来进行选择。最后挑出最好的模型对测试集的样本进行预测,并提交预测结果。下文将介绍几种常用的评估方法。 30 | 31 | #### 留出法 32 | 33 | 直接将数据集划分为两个互斥集合,注意保持数据分布的一致性(比如比例相似)。保留类别比例的采样方式又叫**分层采样(stratified sampling)**。举个例子,原始数据集有100个样本,假设训练集占70个,验证集占30个。若训练集中正例反例各35个,也即比例为`1:1`,那么验证集中就应该正例反例个15个,同样保持`1:1`的比例。当然,这个比例最好还是遵循原始数据集中数据的分布规律。 34 | 35 | 单独一次留出法的结果往往不可靠,一般是进行多次随机划分,然后取各次评估的平均值作为评估结果。 36 | 37 | 留出法最大的缺点就是要进行划分,当训练集占的比例较大时,模型可以更准确地刻画原始数据集的特征,但是因为验证集较小,评估的结果往往不稳定也不准确;当训练集占的比例较小时,训练出的模型又不能充分学习到原始数据集的特征,评估结果可信度不高。这个问题没有完美的解决方案,一般取数据集2/3~4/5的样本作为训练集,余下的作为验证集。 38 | 39 | #### 交叉验证 40 | 41 | 又称为**k折交叉验证(k-fold cross validation)**,将数据集划分为k个互斥子集。每次使用k-1个子集的并集作为训练集,余下的一个子集作为验证集,这就构成了k组训练/验证集,从而可以进行k次训练和验证。最终取k次验证的均值作为评估结果。 42 | 常用的k值包括5,10,20。 43 | 44 | 类似于留出法,因为存在多种划分k个子集的方式,为了减少因不同的样本划分而引入的差别,需要进行多次k折交叉验证。例如10次10折交叉验证,指的是进行了总计100次训练和100次评估。 45 | 46 | 特别地,令k=数据集样本数的交叉验证称为**留一法(Leave-One-Out,简称LOO)**,即有多少样本就进行多少次训练/验证,并且每次只留下一个样本做验证。这样做的好处是不需要担心随即样本划分带来的误差,因为这样的划分是唯一的。一般来说,留一法的评估结果被认为是比较准确的。但是!当数据集较大时,使用留一法需要训练的模型太多了!这种计算开销是难以忍受的! 47 | 48 | #### 自助法 49 | 50 | 在留出法和交叉验证法中,我们都需要对数据集进行划分,从而使得训练所用的数据集比源数据集小,引入了一些因规模不同而造成的偏差,有没有办法避免规模不同造成的影响呢? 51 | 52 | **自助法(bootstrapping)**正是我们需要的答案,以**自助采样(bootstrap sampling)**为基础,对包含m个样本的源数据集进行有放回的m次采样以获得同等规模的训练集。在这m次采样中都不被抽到的概率大约为0.368,也即源数据集中有大约1/3的样本是训练集中没有的。因此,我们可以采用这部分样本作为验证集,所得的结果称为**包外估计(out-of-bag estimate)**。 53 | 54 | 55 | **注意**,自助法适用于数据集小,难以划分训练/验证集的情况。因为自助法能产生多个不同训练集,所以对集成学习也大有好处。但是!**自助法改变了数据集的分布**,也因此引入了一些额外的误差。因此,数据量足的时候还是留出法和交叉验证法用得多一些。 56 | 57 | #### 调参和最终模型 58 | 59 | **调参(parameter tuning)**一般先选定一个范围和变化步长,比如(0,1],步长0.2,这样就有五个参数候选值。然后进行评估,选出最好的一个。这样选出的未必是全局最优的参数,但为了在开销和性能之间折中,只能这么做,毕竟我们无法试尽参数的所有取值。而且多个参数组合的情况是指数上升的,比方说有3个参数,每个参数评估5种取值,就需要测试多达 $5^3$ 种情形。 60 | 61 | **特别注意**,训练/验证这个过程是为了让我们**确定学习算法和算法的参数**,确定了这些之后,我们需要再利用整个源数据集进行训练,这次训练所得的模型才是最终模型,也即提交给用户,进行测试的模型。 62 | 63 | ## 性能度量 64 | 65 | **性能度量(performance measure)**指的是用于衡量模型泛化能力的评价标准。使用不同的性能度量往往导致不同的评判结果。比方说搭建推荐系统,两个模型中一个精度高,一个覆盖度高,如果我们想让更多的商品得到推荐可以就会选后一个模型。所以说,模型的好坏是相对的,取决于我们采用什么性能度量,而**采用什么性能度量则应取决于我们的任务需求**。 66 | 67 | 这个小节主要介绍分类任务中常用的性能度量。 68 | 69 | #### 错误率和精度 70 | 71 | 在本章的开头已经提及到了,不再累述,这两个性能度量可写作更一般的形式,基于数据分布和概率密度函数进行定义。 72 | 73 | #### 查准率,查全率,F1 74 | 75 | 假设我们正常处理一个二分类问题,按照模型预测值和真实值可以把测试样本划分为四种情形:**真正例(true positive),假正例(false positive),真反例(true negative),假反例(false negative)**。可以把结果表示为下图这个矩阵——**混淆矩阵(confusion matrix)**。 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 |
真实情况预测结果
正例反例
正例TP(真正例)FN(假反例)
反例FP(假正例)TN(真反例)
99 | 100 | 101 | **查准率,又称准确率(precision)**,用于衡量模型避免错误的能力,分母是模型预测的正例数目。 102 | 103 | $$precision = \frac{TP}{TP+FP}$$ 104 | 105 | **查全率,又称召回率(recall)**,用于衡量模型避免缺漏的能力,分母是测试样本真正包含的正例数目。 106 | 107 | 一般来说,这两者是矛盾的,提高其中一者则另一者必然会有所降低。 108 | 109 | $$recall = \frac{TP}{TP+FN}$$ 110 | 111 | **F1**,是查准率和查全率的调和平均,用于综合考虑这两个性能度量。 112 | 113 | $$\frac{1}{F1} = \frac{1}{2} \times (\frac{1}{precision} + \frac{1}{recall}) \Rightarrow F1 = \frac{2 \times precision \times recall}{presion + recall}$$ 114 | 115 | 有时候我们对查准率,查全率的需求是不同的。比方说广告推荐,要尽量避免打扰用户,因此查准率更重要;而逃犯检索,因为漏检的危害很大,所以查全率更重要。这时就需要使用$F_\beta$了。 116 | 117 | **$F_\beta$**,是查准率和查全率的加权调和平均,用于综合考虑这两个性能度量,并采用不同的权重。 118 | 119 | $$\frac{1}{F_\beta} = \frac{1}{1+\beta^2} \times (\frac{1}{precision} + \frac{\beta^2}{recall}) \Rightarrow F_\beta = \frac{(1+\beta^2) \times precision \times recall}{(\beta^2 \times presion) + recall}$$ 120 | 121 | 其中 $\beta>0$ 度量了查全率对查准率的相对重要性,等于1时$F_\beta$退化为F1,小于1时查准率更重要,大于1时查全率更重要。 122 | 123 | 书中还介绍了如何对多次训练/测试产生的多个混淆矩阵进行评估,包括宏方法(先分别计算性能度量,再计算均值)和微方法(先对混淆矩阵各元素计算均值,再基于均值计算性能度量)两种途径。 124 | 125 | #### ROC与AUC 126 | 127 | 很多时候,使用模型对测试样本进行预测得到的是一个实值或者概率(比如神经网络),需要进一步设置**阈值(threshold)**,然后把预测值和阈值进行比较才能获得最终预测的标记。 128 | 129 | 我们可以按照预测值对所有测试样本进行排序,最可能是正例的排前面,最不能是正例的排后面。这样分类时就像是在这个序列中以某个**截断点(cut point)**把样本分成两部分。我们需要**根据任务需求来设置截断点**。比如广告推荐更重视查准率,可能就会把截断点设置得更靠前。 130 | 131 | 因此!**排序本身的质量很能体现出一个模型的泛化性能**,ROC曲线就是一个用来衡量排序质量的工具。 132 | 133 | **ROC,全称受试者工作特征(Receiver Operating Characteristic)**。怎样画ROC曲线呢?先定义两个重要的计算量:**真正例率(True Positive Rate,简称TPR)**和**假正例率(False Positive Rate,简称FPR)**。 134 | 135 | $$TPR = \frac{TP}{TP+FN}$$ 136 | 137 | $$FPR = \frac{FP}{TP+FN}$$ 138 | 139 | TPR其实就等于召回率。在绘制ROC曲线时,纵轴为TPR,横轴为FPR。首先按预测值对样本进行排序,然后按序逐个把样本预测为正例,并计算此时的TPR和FPR,然后在图上画出该点,并与前一个点连线。如下图: 140 | 141 | ![ROC curve](http://www.unc.edu/courses/2010fall/ecol/563/001/images/lectures/lecture22/fig4.png) 142 | 143 | 有两个值得注意的特例: 144 | 145 | - 经过 (0,1) 点的曲线,这代表所有正例都在反例之前出现(否则会先出现假正例从而无法经过 (0,1) 点),这是一个**理想模型**,我们可以设置一个阈值,完美地分割开正例和反例。 146 | 147 | - 对角线,这对应于**随机猜测**模型,可以理解为真正例和假正例轮换出现,即每预测对一次接下来就预测错一次,可以看作是随机猜测的结果。 148 | 149 | 若一个模型的ROC曲线完全包住了另一个模型的ROC曲线,我们就认为这个模型更优。但是如果两条曲线发生交叉,要怎么判断呢?比较合理的判据是**AUC(Area Under ROC Curve)**,即ROC曲线下的面积。 150 | 151 | $$AUC=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)\cdot(y_i+y_{i+1})$$ 152 | 153 | 补充一点,ROC曲线上的面积等于**排序损失(loss)**。也即有: 154 | 155 | $$AUC = 1 - \ell_{rank}$$ 156 | 157 | #### 代价敏感错误率与代价曲线 158 | 159 | 现实任务中,有时会遇到不同类型错误造成后果不同的状况。比如医生误诊,把患者诊断为健康人的影响远大于把健康人诊断为患者,因为可能因为这次误诊丧失了最佳治疗时机。为了权衡不同类型错误带来的不同损失,可以为这些错误类型赋以**非均等代价(unequal cost)**。 160 | 161 | 还是举二分类为类,可以**根据任务的领域知识**来设定一个**代价矩阵(cost matrix)**: 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 |
真实类别预测类别
第0类第1类
第0类0$cost_{01}$
第1类$cost_{10}$0
185 | 186 | 预测值与真实值相等时,自然错误代价为0。但把第0类错预测为第1类和把第1类错预测为第0类这两种错误的代价是不同的。注意,**重要的不是代价在数值上的大小,而是它们的比值**。比方说 $\frac{cost_{01}}{cost_{10}} > 1$, 这就说明把第0类错预测为第1类的代价更高。 187 | 188 | 使用了非均等代价之后,我们在使用性能度量时自然也需要作出相应的改变,比方说**代价敏感(cost-sensitive)**版本的错误率: 189 | 190 | $$E(f;D;cost) = \frac{1}{m}\lgroup\sum_{x_i \in D^+}\mathbb{I}(f(x_i) \neq y_i) \times cost_{01} + \sum_{x_i \in D^-}\mathbb{I}(f(x_i) \neq y_i) \times cost_{10}\rgroup$$ 191 | 192 | 由于ROC曲线不能反应使用非均等代价之后的期望总体代价,所以改用**代价曲线(cost curve)**来取替。 193 | 194 | 代价曲线图的纵轴为归一化代价(将代价映射到 [0,1] 区间),横轴为正例概率代价。画法类似于ROC曲线,它是将ROC曲线的每一个点转为图中的一条线。依次计算出ROC曲线每个点对应的FPR和FNR,然后把点 (0,FPR) 和点 (0,FNR) 连线。最终所得的图中,所有线的下界所围成的面积就是该模型的期望总体代价。 195 | 196 | ## 比较检验 197 | 198 | 看起来似乎有了获取测试集$^{*}$的评估方法和用于比较模型的性能度量之后,就能够通过不同模型在测试集上的性能表现来判断优劣了。但是!事实上,在机器学习中,模型比较并不是这样简单的比大小,而是要考虑更多。 199 | 200 | 注:指验证集,但无论是书中还是论文中,都使用测试集较多,明白两者的区别就可以了。 201 | 202 | 在模型比较中,主要有以下三个重要考虑: 203 | 204 | 1. 测试集上的性能只是泛化性能的近似,未必相同; 205 | 2. 测试集的选择对测试性能有很大影响,即使规模一致,但测试样例不同,结果也不同; 206 | 3. 一些机器学习算法有随机性,即便算法参数相同,在同一测试集上跑多次,结果也可能不同; 207 | 208 | 那么应该如何有效地进行模型比较呢?答案是采用**假设检验(hypothesis test)**。基于假设检验的结果,我们可以推断出,若在测试集上观察到模型A优于B,则是否A的泛化性能在统计意义上也优于B,以及做这个结论的把握有多大。 209 | 210 | 本小节首先介绍最基本的二项检验和t检验,然后再深入介绍其他几种比较检验方法。默认以错误率作为性能度量。 211 | 212 | 几个基础概念: 213 | 214 | - **置信度**:表示有多大的把握认为假设是正确的。 215 | - **显著度**:也称“显著性水平”,表示假设出错的概率。显著度越大,假设被拒绝的可能性越大。 216 | - **自由度**:不被限制的样本数,也可以理解为能自由取值的样本数,记为 $v$ 或 $df$。 217 | 218 | ### 单个模型、单个数据集上的泛化性能检验 219 | 220 | > 我们有多大把握相信对一个模型泛化性能的假设? 221 | 222 | #### 二项检验 223 | 224 | 在进行比较检验前,完成了一次模型预测,已知测试错误率为 $\hat{\epsilon}$。 225 | 226 | 一个泛化错误率为 $\epsilon$ 的模型在 $m$ 个样本上预测错 $m'$ 个样本的概率为: 227 | 228 | $$ P(\hat{\epsilon};\epsilon) = \binom{m}{m'} \epsilon^{m'} (1-\epsilon)^{m - m'}$$ 229 | 230 | 这个概率符合二项分布: 231 | 232 | ![二项分布](http://zy.swust.net.cn/07/1/sytjff/image/3.7a.gif) 233 | 234 | 又因为已知测试错误率为 $\hat{\epsilon}$,也即知道了该模型在 $m$ 个样本上实际预测错 了$\hat{\epsilon} \times m$ 个样本。代入公式,对 $\epsilon$ 求偏导会发现,给定这些条件时,**$\epsilon = \hat{\epsilon}$ 的概率是最大的**。 235 | 236 | 使用**二项检验(binomial test)**,假设泛化错误率 $\epsilon \leq \epsilon_0$,并且设定置信度为 $1-\alpha$。则可以这样定义错误率的阈值 $\overline{\epsilon}$: 237 | 238 | $$\overline{\epsilon} = \max{\epsilon} \qquad s.t. \qquad \sum_{i=\epsilon_0 \times m+1}^m \binom{m}{i}\epsilon^i (1-\epsilon)^{m-i} < \alpha$$ 239 | 240 | 其中 $s.t.$ 表示左式在右边条件满足时成立。右式计算的是发生不符合假设的事件的总概率,如果我们要有 $1-\alpha$ 的把握认为假设成立,那么发生不符合假设的事件的总概率就必须低过 $\alpha$。 241 | 242 | 在满足右式的所有 $\epsilon$ 中,选择最大的作为阈值 $\overline{\epsilon}$。如果在测试集中观测到的测试错误率 $\hat{\epsilon}$ 是小于阈值 $\overline{\epsilon}$的, 我们就能以$1-\alpha$ 的把握认为假设成立,即该模型的泛化误差 $\epsilon \leq \epsilon_0$。 243 | 244 | #### t检验 245 | 246 | 二项检验只用于检验某一次测试的性能度量,但实际任务中我们会进行多次的训练/测试,得到多个测试错误率,比方说进行了k次测试,得到 $\hat{\epsilon}_1$,$\hat{\epsilon}_2$, ... ,$\hat{\epsilon}_k$。这次就会用到**t检验(t-test)**。 247 | 248 | 定义这 $k$ 次测试的平均错误率 $\mu$ 和方差 $\sigma^2$: 249 | 250 | $$\mu = \frac{1}{k} \sum_{i=1}^k \hat{\epsilon_i}$$ 251 | 252 | $$\sigma^2 = \frac{1}{k-1} \sum_{i=1}^k (\hat{\epsilon_i} - \mu)^2$$ 253 | 254 | 注意!这里使用的是**无偏估计**的**样本方差**,分母是 $k-1$,因为当均值确定,并且已知 $k-1$ 个样本的值时,第 $k$ 个样本的值是可以算出来的,也可以说是**受限的**。 255 | 256 | 假设泛化错误率 $\epsilon = \epsilon_0$,并且设定显著度为 $\alpha$。计算统计量t: 257 | 258 | $$t = \frac{\sqrt{k}(\mu-\epsilon_0)}{\sigma}$$ 259 | 260 | 该统计量服从自由度 $v = k-1$ 的t分布,如下图: 261 | 262 | ![t分布](https://staff.aist.go.jp/t.ihara/t.files/image076.jpg) 263 | 264 | 自由度越大,约接近于正态分布,自由度为无穷大时变为标准正态分布($\mu=0$,$\sigma=1$)。 265 | 266 | 如果计算出的t统计量落在临界值范围 [$t_{-a/2}$,$t_{a/2}$] 之内(注:临界值由自由度 $k$ 和显著度 $\alpha$ 决定,通过查表得出),我们就能以$1-\alpha$ 的把握认为假设成立,即该模型的泛化误差 $\epsilon = \epsilon_0$。 267 | 268 | ### 两个模型/算法、单个数据集上的泛化性能检验 269 | 270 | > 我们有多大把握相信两个模型的泛化性能无显著差别? 271 | 272 | #### 交叉验证t检验 273 | 274 | 对两个模型A和B,各使用k折交叉验证分别得到k个测试错误率,即$\hat{\epsilon}_1^A$,$\hat{\epsilon}_2^A$, ... ,$\hat{\epsilon}_k^A$ 和 $\hat{\epsilon}_1^B$,$\hat{\epsilon}_2^B$, ... ,$\hat{\epsilon}_k^B$。使用**k折交叉验证成对t检验(paired t-tests)**来进行比较检验。 275 | 276 | 对于这两组k个测试错误率,计算两组之间的每一对的差,即 $\triangle_i = \hat{\epsilon}_k^A - \hat{\epsilon}_k^B$,从而得到k个 $\triangle$。我们可以计算 $\triangle$ 的均值 $\mu$ 和方差 $\sigma^2$,定义统计量t: 277 | 278 | $$t = \lvert \frac{\sqrt{k}\mu}{\sigma} \rvert$$ 279 | 280 | 可以看到,和前面的t检验相比,这里的分子没有被减项,其实是省略了。因为我们假设两个模型的泛化错误率相同,实际上是假设 $\lvert \epsilon^A - \epsilon^B \rvert = 0$,这个 $0$ 被省略了。 281 | 282 | 类似地,这个统计量服从自由度 $v = k-1$ 的t分布。我们设定好显著度 $\alpha$,查表获取临界值范围,如果计算出的t统计量落在在范围内,就能以$1-\alpha$ 的把握认为假设成立,即两个模型的泛化性能无显著差别,否则认为平均测试错误率较低的模型更胜一筹。 283 | 284 | #### McNemar检验 285 | 286 | 对于一个二分类问题,如果使用留出法,我们不仅可以获得两个算法A和B各自的测试错误率,或能够获得它们分类结果的差别(都预测正确、都预测错误、一个预测正确一个预测错误),构成一张**列联表(contingency table)**: 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 |
算法B算法A
分类正确分类错误
分类正确$e_{00}$$e_{01}$
分类错误$e_{10}$$e_{11}$
310 | 311 | 假设两个算法的泛化性能无显著区别,则 $e_{01}$ 应该等于 $e_{10}$,变量 $\lvert e_{01}-e_{10} \rvert$ 应服从均值为 $1$,方差为 $e_{01} + e_{10}$ 的正态分布,可以计算统计量 $\chi^2$: 312 | 313 | $$\chi^2 = \frac{(\lvert e_{01}-e_{10} \rvert -1)^2}{e_{01} + e_{10}}$$ 314 | 315 | 该变量服从自由度为 $v=1$ 的 $\chi^2$ 分布(卡方分布),类似t检验,设定好显著度 $\alpha$,按照自由度和显著度查表获得临界值。若计算所得的统计量 $\chi^2$ 小于临界值,则能以$1-\alpha$ 的把握认为假设成立,即两个算法的泛化性能无显著差别,否则认为平均测试错误率较低的算法更胜一筹。 316 | 317 | 注:这里 $v$ 为1是因为只有2个算法 318 | 319 | ### 多个模型/算法、多个数据集上的泛化性能检验 320 | 321 | > 我们有多大把握相信多个模型的泛化性能皆无显著差别?若有,接下来怎样做? 322 | 323 | 在**一组数据集**上进行**多个算法**的比较,情况就变得较复杂了,一种做法是使用前面的方法分开两两比较;另一种更直接的做法是使用基于算法排序的Friedman检验。 324 | 325 | #### Friedman检验 326 | 327 | 假设有 $N=4$ 个数据集,$k=3$ 种算法,可以使用一种评估方法,获得各个算法在各个数据集上的测试结果,然后按照性能度量由好到坏进行排序,序值为1,2,3。若并列,则取序值的平均值。然后对各个算法在各数据集上的序值求平均得到平均序值,如: 328 | 329 | | 数据集 | 算法A | 算法B | 算法C | 330 | |:-:|:-:|:-:|:-:| 331 | |D1|1|2|3| 332 | |D2|1|2.5|2.5| 333 | |D3|1|2|3| 334 | |D4|1|2|3| 335 | |平均序值|1|2.125|2.875| 336 | 337 | 令 $r_i$ 表示第 $i$ 个算法的平均序值,则 $r_i$ 服从均值为 $\frac{k+1}{2}$,方差为 $\frac{(k^2)-1}{12}$ 的正态分布。可以计算统计量 $\chi^2$: 338 | 339 | $$\chi^2 = \frac{12N}{k(k+1)}(\sum_{i=1}^k r_i^2 - \frac{k(k+1)^2}{4})$$ 340 | 341 | 在 $k$ 和 $N$ 都较大时(通常要求 $k>30$),该变量服从自由度为 $v=k-1$ 的 $\chi^2$ 分布(卡方分布)。 342 | 343 | 以上这种检验方式也称为**原始Friedman检验**,被认为过于保守,现在通常用统计量 $F$ 代替: 344 | 345 | $$F = \frac{(N-1)\chi^2}{N(k-1)-\chi^2}$$ 346 | 347 | 该变量服从于自由度为 $v=k-1$ 或 $v=(k-1)(N-1)$ 的 $F$ 分布。 348 | 349 | 和前面的检验方式有所区别,F检验是根据设定的显著度 $\alpha$ 和**算法个数** $k$ 以及 **数据集个数**$N$ 这三者来查表的,如果计算出的统计量 $F$ 小于查表所得的临界值,则假设成立,能以$1-\alpha$ 的把握认为认为这 $k$ 个算法的泛化性能无显著区别。 350 | 351 | 但如果这个假设被拒绝了呢?这时就需要进行**后续检验(post-hoc test)**,常用的有 **Nemenyi后续检验**。 352 | 353 | #### Nemenyi后续检验 354 | 355 | 定义**平均序值差别的临界值域**为: 356 | 357 | $$CD = q_\alpha \sqrt{\frac{k(k+1)}{6N}}$$ 358 | 359 | 其中 $q_\alpha$是由 显著度 $\alpha$ 和**算法个数** $k$ 确定的,通过查表获取。若两个算法的平均序值之差不超过 $CD$,则能以$1-\alpha$ 的把握认为这两个算法的泛化性能无显著区别,否则认为平均序值较小的更胜一筹。 360 | 361 | Nemenyi后续检验还可以通过Friedman检验图更直观地体现出来,横轴为性能度量,纵轴为算法,每个算法用一段水平线段表示,线段中心点为该算法的平均序值,线段长度为 $CD$。若两个算法的线段投影到x轴上有重叠部分,则可以认为这两个算法的泛化性能无显著区别。 362 | 363 | ## 偏差与方差 364 | 365 | 除了估计算法的泛化性能,我们往往还希望知道**为什么有这样的性能**?这时一个有用的工具就是**偏差-方差分解(bias-variance decomposition)**。 366 | 367 | 知乎上面有两个问题都有不错的答案,不妨先看看。[1] [机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?](https://www.zhihu.com/question/27068705);[2] [偏差和方差有什么区别?](https://www.zhihu.com/question/20448464)。 368 | 369 | 对学习算法的期望繁华错误率进行拆解,最终会发现能拆解为三个项(需要推导): 370 | 371 | $$E(f;D) = \mathbb{E}_D[(f(x;D) - \overline{f}(x))^2] + (\overline{f}(x) - y)^2 + \mathbb{E}_D[(y_D - y)^2]$$ 372 | 373 | 依次对应于**方差(variance)**、**偏差(bias)**、**噪声(noise)**: 374 | 375 | $$E(f;D) = var(x) + bias^2(x) + \epsilon^2$$ 376 | 377 | 这三者的含义是这样的: 378 | 379 | - 方差:使用同规模的不同训练集进行训练时带来的性能变化,刻画**数据扰动带来的影响**; 380 | 381 | - 偏差:学习算法的期望预测与真实结果的偏离程度,刻画**算法本身的拟合能力**; 382 | 383 | - 噪声:当前任务上任何算法所能达到的期望泛化误差的下界(即不可能有算法取得更小的误差),刻画**问题本身的难度**; 384 | 385 | 也即是说,泛化性能是有学习算法的拟合能力,数据的充分性以及问题本身的难度共同决定的。给定一个任务,噪声是固定的,我们需要做得就是尽量降低偏差和方差。 386 | 387 | 但是这两者其实是有冲突的,这称为**偏差-方差窘境(bias-variance dilemma)**。给定一个任务,我们可以控制算法的训练程度(如决策树的层数)。在训练程度较低时,拟合能力较差,因此训练数据的扰动不会让性能有显著变化,此时偏差主导泛化错误率;在训练程度较高时,拟合能力很强,以至于训练数据自身的一些特性都会被拟合,从而产生过拟合问题,训练数据的轻微扰动都会令模型产生很大的变化,此时方差主导泛化错误率。 388 | 389 | **注意**,将泛化性能完美地分解为方差、偏差、噪声这三项仅在**基于均方误差的回归任务**中得以推导出,分类任务由于损失函数的跳变性导致难以从理论上推导出分解形式,但已经有很多方法可以通过实验进行估计了。 390 | 391 | ## 习题 392 | 393 | #### 2.1 394 | 395 | > 问:数据集包含1000个样本,其中500个正例,500个反例,将其划分为包含70%样本的训练集和30%样本的测试集用于留出法评估,试估算共有多少种划分方式。 396 | 397 | 按照题意,训练集包含700个样本,测试集包含300个样本。并且为了保证训练集和测试集的类别比例一致,使用分层采样,训练集包含正例反例各350个;测试集包含正例反例个150个。 398 | 399 | 有多少种划分方式是一个排列组合问题,等于从500个正例中挑选出300个的所有可能组合乘上从500个正例中挑选出300个的所有可能组合: 400 | 401 | $$\binom{500}{350} \times \binom{500}{350} = \binom{500}{150} \times \binom{500}{150} $$ 402 | 403 | #### 2.2 404 | 405 | > 问:数据集包含100个样本,其中正反例各一半,假定学习算法所产生的模型是将新样本预测为训练样本数较多的类别(训练样本数相同时进行随机猜测),试给出用10折交叉验证法和留一法分别对错误率进行评估所得的结果。 406 | 407 | (1)10折交叉验证法:通过分层采样获得10个互斥子集,每个子集包含10个样本,正反例各5个。每次取其中9个子集做训练,1个子集做测试。因为在训练集中两个类别数目相当(都为 $9*5=45$ 个),所以只能进行随机猜测,错误率为50%。 408 | 409 | (2)留一法:每次取一个样本做测试,若取出的样本为正例,那么剩下的训练集中有50个反例,49个正例,因此预测结果为反例,反之亦然。故错误率为100%。 410 | 411 | #### 2.3 412 | 413 | > 问:若学习器A的F1值比学习器B高,试析A的BEP值是否也比B高。 414 | 415 | 模型A的F1值高于模型B的F1值也即: 416 | 417 | $$F1_A > F1_B \Leftrightarrow \frac{2 \times precision_A \times recall_A}{presion_A + recall_A} > \frac{2 \times precision_B \times recall_B}{presion_B + recall_B}$$ 418 | 419 | BEP是查准率precision与查全率recall相等时的取值,令式中的 $precision_A = recall_A = BEQ_A$,$precision_B = recall_B = BEQ_B$,因此有: 420 | 421 | $$\frac{2 \times BEQ_A^2}{2 \times BEQ_A} > \frac{2 \times BEQ_B^2}{2 \times BEQ_B} \Rightarrow BEQ_A > BEQ_B$$ 422 | 423 | 得证,若学习器A的F1值比学习器B高,则A的BEP值也比B高。 424 | 425 | #### 2.4 426 | 427 | > 问:试述真正例率(TPR)、假正例率(FPR)与查准率(P)、查全率(R)之间的联系。 428 | 429 | 430 | - 真正例率是真正例占真实正例的比例; 431 | 432 | - 假正例率是假正例占真实反例的比例; 433 | 434 | - 查准率是真正例占预测正例的比例; 435 | 436 | - 查全率是真正例占真实正例的比例; 437 | 438 | 其中,真正例指模型预测为正例并且预测正确的样例,假正例指模型预测为正例并且预测错误的样例。前缀真实表明在数据集中的真实标记,前缀预测表明模型预测出的标记。 439 | 440 | 特别地,查全率与真正例率是相等的。 441 | 442 | 443 | #### 2.5 444 | 445 | > 问:试证明 $AUC=1-\ell_{rank}$ 446 | 447 | 先回顾一下AUC的计算方法: 448 | 449 | $$AUC=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)\cdot(y_i+y_{i+1})$$ 450 | 451 | 计算方法类似于积分,把ROC曲线下的面积分解为m(样本个数)个小矩形,然后对这些小矩阵的面积求和。每个矩形的宽等于相邻的两个点横坐标的差值,每个矩形的高等于相邻两个点纵坐标之和的 $\frac{1}{2}$。上式把常数 $\frac{1}{2}$ 提到求和项外了。 452 | 453 | 再看看排序损失(指按算法预测值排序时带来的损失): 454 | 455 | $$\ell_{rank} = \frac{1}{m^+ \cdot m^-} \sum_{x^+ \in D^+}\sum_{x^- \in D^-} (\mathbb{I}(f(x^+) < f(x^-)) + \frac{1}{2}\mathbb{I}(f(x^+) = f(x^-)))$$ 456 | 457 | 其中 $m^+$ 和 $m^-$ 分别表示测试集中的正例集和反例集。 458 | 459 | 这题目前还没有头绪,AUC曲线上的面积是: 460 | 461 | $$\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)\cdot((1-y_i)+(1-y_{i+1})) \\ 462 | = -\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)\cdot(y_i+y_{i+1}-2)$$ 463 | 464 | 怎么证明这个表达式和 $\ell_{rank}$ 相等呢? 465 | 466 | #### 2.6 467 | 468 | > 问:试述错误率与ROC曲线之间的关系 469 | 470 | 错误率 $\epsilon$: 471 | 472 | $$\epsilon = \frac{FP + FN}{m}$$ 473 | 474 | 其中 $m$ 为样本总数, $FP$ 为假正例个数, $FN$ 为假反例个数。因为给定测试集,正例反例的数目是固定的。当我们以ROC曲线上的一个点作为阈值划分预测的正例和反例时,该点的真正例率(y轴)越高,那么假反例就会越少;该点的假正例率(x轴)越低,那么假正例就越少,从而使得错误率越低。归纳起来就是,在ROC曲线上距离左上角 (0,1) 点越近的点错误率越低。 475 | 476 | 477 | #### 2.7 478 | 479 | > 问:试证明任意一条ROC曲线都有一条代价曲线与之对应,反之亦然。 480 | 481 | 回顾代价曲线的作法,求ROC曲线上每一点对应的FPR和FNR,在代价平面连接点 (0,FPR) 和点 (1,FNR),代价曲线由所有连线的下界确定。由于ROC曲线是连续的,故必然有一条对应的代价曲线。 482 | 反过来,对代价曲线上的任何一点作切线,都可以得到对应的FPR与FNR,从而计算出ROC曲线上对应点的坐标。因此代价曲线也必然有一条对应的ROC曲线。 483 | 484 | #### 2.8 485 | 486 | > 问:$Min-Max$ 规范化和 $z-score$ 规范化是两种常用的规范化方法。令 $x$ 和 $x'$ 分别表示变量在规范化前后的取值,相应的,令 $x_{min}$ 和 $x_{max}$ 表示规范化前的最小值和最大值, $x_{min}'$ 和 $x_{max}'$ 表示规范化后的最小值和最大值,$\bar{x}$ 和 $\sigma_x$ 分别表示规范化前的均值和标准差。试析二者的优缺点。 487 | 488 | $Min-Max$ 规范化: 489 | 490 | $$x' = x_{min}' + \frac{x-x_{min}}{x_{max}-x_{min}} \times (x_{max}' - x_{min}')$$ 491 | 492 | $z-score$ 规范化: 493 | 494 | $$x' = \frac{x - \bar{x}}{\sigma_x}$$ 495 | 496 | $Min-Max$ 规范化比较简单,缺点在于当有新数据输入时,可能导致max和min的变化,需要重新定义。 497 | 498 | $z-score$ 规范化能把数据的原分布转换为标准正态分布,即均值为0,标准差为1,对于某些任务可能会有帮助。比如分类时,规范化后取值靠近-1的认为是负类,取值靠近1的认为是正类。注意!它并非是把数据映射到 [-1,1] 区间,会有超出的部分(回想正态分布曲线两段的延伸段),实际处理时一般把超出部分都修改为-1和1以满足映射到区间内的要求。这种规范化的缺点就是改变了数据的分布,这可能会引入某种误差。 499 | 500 | #### 2.9 501 | 502 | > 问:试述卡方检验过程。 503 | 504 | 根据概率论与数理统计中的内容(交大版本,P239)。卡方检验适用于方差的检验。步骤如下: 505 | 506 | 1)分均值已知与均值未知两种情况,求得卡方检验统计量; 507 | 508 | 2)根据备选假设以及α,求得所选假设对应的拒绝域(临界值区间); 509 | 510 | 3)根据1)中求得的卡方统计量与2)中求得的拒绝域,判断假设成立与否; 511 | 512 | #### 2.10* 513 | 514 | > 问:试述原始Friedman检验和F检验的区别。 515 | 516 | 暂时没有思路。 517 | -------------------------------------------------------------------------------- /03linear_model.md: -------------------------------------------------------------------------------- 1 | # 线性模型 2 | 3 | 给定一个包含d个属性的实例 $\mathbf{x} = (x_1;x_2;...;x_d)$,**线性模型(linear model)**的原理是学得一个可以通过属性的线性组合来进行预测的函数,也即: 4 | 5 | $$f(\mathbf{x}) = w_1x_1 + w_2x_2 + ... + w_dx_x + b$$ 6 | 7 | 一般写作向量形式:$f(\mathbf{x}) = \mathbf{w}^T\mathbf{x} + b$。其中权重向量 $\mathbf{w}$ 和偏置项 $b$ 就是我们需要学习的参数。 8 | 9 | 线性模型有良好的可解释性,每个属性对应的权重可以理解为它对预测的重要性。并且建模较为简单,许多功能更为强大的非线性模型都是在线性模型的基础上引入层级结构或高维映射得到的。 10 | 11 | 这一章的内容大致如下: 12 | 13 | - **线性回归**:如何把离散属性连续化?怎样用最小二乘法进行参数估计?多元线性回归如何求解?广义线性模型是怎样的?。 14 | 15 | - **对数几率回归**:分类任务和线性回归是如何关联起来的?从概率的角度来看,如何用极大似然法进行参数估计并获取最优解? 16 | 17 | - **线性判别分析**:二分类任务如何求得LDA模型的参数?如何推广到多分类任务? 18 | 19 | - **多分类学习**:如何把多分类任务拆分为二分类任务?有哪些拆分策略?是如何进行建模和预测的? 20 | 21 | - **类别不平衡问题**:再缩放思想以及三种解决类别不平衡问题的主要方法。 22 | 23 | ## 线性回归 24 | 25 | #### 离散属性连续化 26 | 27 | 由于不同模型对数据的要求不一样,在建模之前,我们需要对数据做相应的处理。一般的线性回归模型要求属性的数据类型为连续值,故需要对离散属性进行连续化。 28 | 29 | 具体分两种情况: 30 | 31 | 1. 属性值之间有序:也即属性值有明确的大小关系,比方说把三值属性 “高度” 的取值 {高,中,低} 转换(编码)为 {1.0,0.5,0.0}; 32 | 33 | 2. 属性值之间无序:若该属性有 $k$ 个属性值,则把它转换为 $k$ 维向量(把1个属性扩展为k个属性),比方说把无序离散属性 “商品” 的取值 {牙膏,牙刷,毛巾} 转换为 (0,0,1),(0,1,0),(1,0,0)。 这种做法在自然语言处理和推荐系统实现中很常见,属性 “单词” 和 “商品” 都是无序离散变量,在建模前往往需要把这样的变量转换为[哑变量](http://baike.baidu.com/link?url=K78QE2bn2kp9p1kHmNT2iwrFQruUbpXASH6P-Ug4nHdKLTRNTTKnVVsvGCOpnQ0d8WfCqFJFW_xWaBRjbTi4Q-Mim_y0TiNwOVdMzgfFuPguT_a6wyu4g_Bmw2rup2MY0jTHYomPerh-vruZ6FNfLo3CpWhekBTolTyUG6DaTYe),**否则会引入不恰当的序关系,从而影响后续处理**(比如距离的计算)。 34 | 35 | **补充**:对应于离散属性连续化,自然也有**连续属性离散化**。比方说决策树建模就需要将连续属性离散化。此外,在作图观察数据分布特征时,往往也需要对连续属性进行离散化处理(比方说画直方图)。 36 | 37 | #### 最小二乘法 38 | 39 | 回归任务最常用的性能度量是**均方误差(mean squared error, MSE)**。首先介绍**单变量线性回归**,试想我们要在二维平面上拟合一条曲线,则每个样例(即每个点)只包含一个实值属性(x值)和一个实值输出标记(y值),此时均方误差可定义为: 40 | 41 | $$E(f;D) = \frac{1}{m} \sum_{i=1}^m(y_i-f(x_i))^2\\ 42 | \qquad\qquad = \frac{1}{m} \sum_{i=1}^m(y_i-wx_i-b)^2$$ 43 | 44 | 有时我们会把这样描述模型总误差的式子称为**损失函数**或者**目标函数**(当该式是优化目标的时候)。这个函数的自变量是模型的参数 $w$ 和 $b$。由于给定训练集时,样本数 $m$ 是一个确定值,也即常数,所以可以把 $\frac{1}{m}$ 这一项拿走。 45 | 46 | **最小二乘法(least square method)**就是基于均方误差最小化来进行模型求解的一种方法,寻找可使损失函数值最小的参数 $w$ 和 $b$ 的过程称为最小二乘**参数估计(parameter estimation)**。 47 | 48 | 通过对损失函数分别求参数 $w$ 和 $b$ 的偏导,并且令导数为0,可以得到这两个参数的**闭式(closed-form)解**(也即**解析解**): 49 | 50 | $$w = \frac{\sum_{i=1}^m y_i(x_i - \bar{x})}{\sum_{i=1}^m x_i^2 - \frac{1}{m}(\sum_{i=1}^m x_i)^2}$$ 51 | 52 | $$b = \frac{1}{m} \sum_{i=1}^m (y_i-wx_i)$$ 53 | 54 | 在实际任务中,只要我们把自变量(x, y, m)的值代入就可以求出数值解了。 55 | 56 | 为什么可以这样求解呢?因为损失函数是一个**凸函数**(记住是向下凸,类似U型曲线),导数为0表示该函数曲线最低的一点,此时对应的参数值就是能使均方误差最小的参数值。特别地,**要判断一个函数是否凸函数,可以求其二阶导数**,若二阶导数在区间上非负则称其为凸函数,若在区间上恒大于零则称其为**严格凸函数**。 57 | 58 | #### 多元线性回归 59 | 60 | 前面是直线拟合,样例只有一个属性。对于样例包含多个属性的情况,我们就要用到**多元线性回归(multivariate linear regression)**(又称作多变量线性回归)了。 61 | 62 | 令 $\mathbf{\hat{w}} = (\mathbf{w};b)$。把数据集表示为 $m \times (d+1)$ 大小的矩阵,每一行对应一个样例,前 $d$ 列是样例的 $d$ 个属性,**最后一列恒置为1**,对应偏置项。把样例的实值标记也写作向量形式,记作 $\mathbf{y}$。则此时损失函数为: 63 | 64 | $$E_{\mathbf{\hat{w}}} = (\mathbf{y} - X\mathbf{\hat{w}})^T (\mathbf{y} - X\mathbf{\hat{w}})$$ 65 | 66 | 同样使用最小二乘法进行参数估计,首先对 $\mathbf{\hat{w}}$ 求导: 67 | 68 | $$\frac{\partial E_{\mathbf{\hat{w}}}}{\partial \mathbf{\hat{w}}} = 2 X^T(X\mathbf{\hat{w}} - \mathbf{y})$$ 69 | 70 | 令该式值为0可得到 $\mathbf{\hat{w}}$ 的闭式解: 71 | 72 | $$\mathbf{\hat{w}}* = (X^TX)^{-1}X^T\mathbf{y}$$ 73 | 74 | 这就要求 $X^TX$ 必须是可逆矩阵,也即必须是**满秩矩阵(full-rank matrix)**,这是线性代数方面的知识,书中并未展开讨论。但是!**现实任务中 $X^TX$ 往往不是满秩的**,很多时候 $X$ 的列数很多,甚至超出行数(例如推荐系统,商品数是远远超出用户数的),此时 $X^TX$ 显然不满秩,会解出多个 $\mathbf{\hat{w}}$。这些解都能使得均方误差最小化,这时就需要由学习算法的**归纳偏好**决定了,常见的做法是引入**正则化(regularization)**项。 75 | 76 | #### 广义线性模型 77 | 78 | 除了直接让模型预测值逼近实值标记 $y$,我们还可以让它逼近 $y$ 的衍生物,这就是**广义线性模型(generalized linear model)**的思想,也即: 79 | 80 | $$y = g^{-1}(\mathbf{w^Tx} + b)$$ 81 | 82 | 其中 $g(\cdot)$ 称为**联系函数(link function)**,要求单调可微。使用广义线性模型我们可以实现强大的**非线性函数映射**功能。比方说**对数线性回归(log-linear regression)**,令 $g(\cdot) = ln(\cdot)$,此时模型预测值对应的是**实值标记在指数尺度上的变化**: 83 | 84 | $$\ln y = \mathbf{w^Tx} + b$$ 85 | 86 | ## 对数几率回归(逻辑回归) 87 | 88 | 前面说的是线性模型在回归学习方面的应用,这节开始就是讨论分类学习了。 89 | 90 | 线性模型的输出是一个实值,而分类任务的标记是离散值,怎么把这两者联系起来呢?其实广义线性模型已经给了我们答案,我们要做的就是**找到一个单调可微的联系函数**,把两者联系起来。 91 | 92 | 对于一个二分类任务,比较理想的联系函数是**单位阶跃函数(unit-step function)**: 93 | 94 | $$y = 95 | \begin{cases} 96 | 0& \text{z<0;}\\ 97 | 0.5& \text{z=0;}\\ 98 | 1& \text{z>0,} 99 | \end{cases}$$ 100 | 101 | 但是单位阶跃函数不连续,所以不能直接用作联系函数。这时思路转换为**如何近似单位阶跃函数**呢?**对数几率函数(logistic function)**正是我们所需要的(注意这里的 $y$ 依然是实值): 102 | 103 | $$y = \frac{1}{1+e^{-z}}$$ 104 | 105 | 对数几率函数有时也称为对率函数,是一种**Sigmoid函数**(即形似S的函数)。将它作为 $g^-(\cdot)$ 代入广义线性模型可得: 106 | 107 | $$y = \frac{1}{1+ e^{-(\mathbf{w^Tx} + b)}}$$ 108 | 109 | 该式可以改写为: 110 | 111 | $$\ln{\frac{y}{1-y}} = \mathbf{w^Tx} + b$$ 112 | 113 | 其中,$\frac{y}{1-y}$ 称作**几率(odds)**,我们可以把 $y$ 理解为该样本是正例的概率,把 $1-y$ 理解为该样本是反例的概率,而几率表示的就是**该样本作为正例的相对可能性**。若几率大于1,则表明该样本更可能是正例。对几率取对数就得到**对数几率(log odds,也称为logit)**。几率大于1时,对数几率是正数。 114 | 115 | 由此可以看出,对数几率回归的实质使用线性回归模型的预测值逼近分类任务真实标记的对数几率。它有几个优点: 116 | 117 | 1. 直接对分类的概率建模,无需实现假设数据分布,从而避免了假设分布不准确带来的问题; 118 | 2. 不仅可预测出类别,还能得到该预测的概率,这对一些利用概率辅助决策的任务很有用; 119 | 3. 对数几率函数是任意阶可导的凸函数,有许多数值优化算法都可以求出最优解。 120 | 121 | #### 最大似然估计 122 | 123 | 有了预测函数之后,我们需要关心的就是怎样求取模型参数了。这里介绍一种与最小二乘法异曲同工的办法,叫做**极大似然法(maximum likelihood method)**。我在另一个项目中有这方面比较详细的讲解,欢迎前往[项目主页](https://github.com/familyld/SYSU_Data_Mining/tree/master/Linear_Regression)交流学习。 124 | 125 | 前面说道可以把 $y$ 理解为一个样本是正例的概率,把 $1-y$ 理解为一个样本是反例的概率。而所谓极大似然,就是最大化预测事件发生的概率,也即**最大化所有样本的预测概率之积**。令 $p(c=1|\mathbf{x})$ 和 $p(c=0|\mathbf{x})$ 分别代表 $y$ 和 $1-y$。(注:书中写的是 $y=1$ 和 $y=0$,这里为了和前面的 $y$ 区别开来,我用了 $c$ 来代表标记)。简单变换一下公式,可以得到: 126 | 127 | $$p(c=1|\mathbf{x}) = \frac{e^(\mathbf{w^Tx} + b)}{1+e^{\mathbf{w^Tx} + b}}$$ 128 | $$p(c=0|\mathbf{x}) = \frac{1}{1+e^{\mathbf{w^Tx} + b}}$$ 129 | 130 | 但是!由于预测概率都是小于1的,如果直接对所有样本的预测概率求积,所得的数会非常非常小,当样例数较多时,会超出精度限制。所以,一般来说会对概率去对数,得到**对数似然(log-likelihood)**,此时**求所有样本的预测概率之积就变成了求所有样本的对数似然之和**。对率回归模型的目标就是最大化对数似然,对应的似然函数是: 131 | 132 | $$\ell(\mathbf{w},b) = \sum_{i=1}^m \ln p(c_i | \mathbf{x_i;w};b)\\ 133 | = \sum_{i=1}^m \ln (c_ip_1(\hat{\mathbf{x_i}};\beta) + (1-c_i)p_0(\hat{\mathbf{x_i}};\beta))$$ 134 | 135 | 可以理解为若标记为正例,则加上预测为正例的概率,否则加上预测为反例的概率。其中 $\beta = (\mathbf{w};b)$。 136 | 137 | 对该式求导,令导数为0可以求出参数的最优解。特别地,我们会发现似然函数的导数和损失函数是等价的,所以说**最大似然解等价于最小二乘解**。最大化似然函数等价于最小化损失函数: 138 | 139 | $$E(\beta) = \sum_{i=1}^m (-y_i\beta^T\hat{x_i} + \ln (1+e^{\beta^T\mathbf{\hat{x_i}}}))$$ 140 | 141 | 这是一个关于 $\beta$ 的高阶可导连续凸函数,可以用最小二乘求(要求矩阵的逆,计算开销较大),也可以用数值优化算法如**梯度下降法(gradient descent method)**、**牛顿法(Newton method)**等逐步迭代来求最优解(可能陷入局部最优解)。 142 | 143 | ## 线性判别分析(LDA) 144 | 145 | #### 二分类 146 | 147 | **线性判别分析(Linear Discriminant Analysis,简称LDA)**,同样是利用线性模型,LDA提供一种不同的思路。在LDA中,我们不再是拟合数据分布的曲线,而是**将所有的数据点投影到一条直线上**,使得**同类点的投影尽可能近,不同类点的投影尽可能远**。二分类LDA最早有Fisher提出,因此也称为**Fisher判别分析**。 148 | 149 | 具体来说,投影值 $y = \mathbf{w}^T\mathbf{x}$,我们不再用 $y$ 逼近样例的真实标记,而是希望同类样例的投影值尽可能相近,异类样例的投影值尽可能远离。如何实现呢?首先,同类样例的投影值尽可能相近意味着**同类样例投影值的协方差应尽可能小**;然后,异类样例的投影值尽可能远离意味着**异类样例投影值的中心应尽可能大**。合起来,就等价于最大化: 150 | 151 | $$J = \frac{\Vert \mathbf{w}^T\mu_0 - \mathbf{w}^T\mu_1 \Vert^2_2}{\mathbf{w}^T\Sigma_0\mathbf{w}+\mathbf{w}^T\Sigma_1\mathbf{w}}\\ 152 | = \frac{\mathbf{w}^T(\mu_0 - \mu_1)(\mu_0 - \mu_1)^T\mathbf{w}}{\mathbf{w}^T(\Sigma_0+\Sigma_1)\mathbf{w}}$$ 153 | 154 | 其中,分子的 $\mu_i$ 表示第i类样例的**均值向量**(即表示为向量形式后对各维求均值所得的向量)。分子表示的是两类样例的均值向量投影点(也即类中心)之差的 $\ell_2$ 范数的平方,这个值越大越好。 分母中的 $\Sigma_i$ 表示第i类样例的**协方差矩阵**。分母表示两类样例投影后的协方差之和,这个值越小越好。 155 | 156 | 定义**类内散度矩阵(within-class scatter matrix)**: 157 | 158 | $$S_w = \sigma_0 + \sigma_1\\ 159 | = \sum_{x \in X_0} (\mathbf{x} - \mu_0)(\mathbf{x} - \mu_0)^T + \sum_{x \in X_1} (\mathbf{x} - \mu_1)(\mathbf{x} - \mu_1)^T$$ 160 | 161 | 定义**类间散度矩阵(between-class scatter matrix)**: 162 | 163 | $$S_b = (\mu_0 - \mu_1)(\mu_0 - \mu_1)^T$$ 164 | 165 | 这两个矩阵的规模都是 $d\times d$,其中 $d$ 是样例的维度(属性数目)。于是可以重写目标函数为: 166 | 167 | $$J = \frac{\mathbf{w}^T S_b \mathbf{w}}{\mathbf{w}^T S_w \mathbf{w}}$$ 168 | 169 | 也即 $S_b$ 和 $S_w$ 的**广义瑞利熵(generalized Rayleigh quotient)**。 170 | 171 | 可以注意到,分子和分母中 $w$ 都是二次项,因此,**最优解与 $w$ 的大小无关,只与方向有关**。 172 | 173 | 令分母为1,用拉格朗日乘子法把约束转换为方程,再稍加变换我们便可以得出: 174 | 175 | $$\mathbf{w} = S_w^{-1}(\mu_0 - \mu_1)$$ 176 | 177 | 但一般不直接对矩阵 $S_w$ 求逆,而是采用**奇异值分解**的方式。 178 | 179 | #### 多分类 180 | 181 | 多分类LDA与二分类不同在于,学习的是一个规模为 $d \times d'$ 的投影矩阵 $\mathbf{W}$,而不是规模为 $d \times 1$ 的投影向量 $\mathbf{w}$。这个投影矩阵把样本投影到 $d'$ 维空间(或者说 $d'$ 维超平面)上,由于 $d'$ 通常远小于样例原来的属性数目 $d$,且投影过程用到了类别信息(标记值),所以LDA也常常被视为一种**监督降维技术**。(注:$d'$ 最大可取为类别数-1) 182 | 183 | ## 多分类学习 184 | 185 | 有些二分类学习方法(如LDA)可以直接推广到多分类,但现实中我们更多地是**基于一些策略,把多分类任务分解为多个二分类任务**,利用二分类模型来解决问题。有三种最经典的拆分策略,分别是一对一,一对其余,和多对多。 186 | 187 | #### 一对一 188 | 189 | **一对一(One vs. One,简称OvO)**的意思是把所有类别两两配对。假设样例有N个类别,OvO会产生 $\frac{N(N-1)}{2}$ 个子任务,**每个子任务只使用两个类别的样例**,并产生一个对应的二分类模型。测试时,新样本输入到这些模型,产生 $\frac{N(N-1)}{2}$ 个分类结果,最终预测的标记由投票产生,也即把被预测得最多的类别作为该样本的类别。 190 | 191 | #### 一对其余 192 | 193 | **一对其余(One vs. Rest,简称OvR)**在有的文献中也称为**一对所有(One vs. All,简称OvA)**,但这种说法并不严谨。因为OvR产生 $N$ 个子任务,**每个任务都使用完整数据集**,把一个类的样例当作正例,其他类的样例当作反例,所以应该是一对其余而非一对所有。OvR产生 $N$ 个二分类模型,测试时,新样本输入到这些模型,产生 $N$ 个分类结果,若只有一个模型预测为正例,则对应的类别就是该样本的类别;若有多个模型预测为正例,则选择置信度最大的类别(参考模型评估与选择中的**比较检验**)。 194 | 195 | OvO和OvR各有优劣:OvO需要训练的分类器较多,因此**OvO的存储开销和测试时间开销通常比OvR更大**;OvR训练时要用到所有样例,因此**OvR的训练时间开销通常比OvO更大**。测试性能取决于具体的数据分布,大多情况下这两个拆分策略都差不多。 196 | 197 | #### 多对多 198 | 199 | **多对多(Many vs. Many,简称MvM)**是每次将多个类作为正例,其他的多个类作为反例。OvO和OvR都是MvM的特例。书中介绍的是一种比较常用的MvM技术——**纠错输出码(Error Correcting Outputs Codes,简称ECOC)**。 200 | 201 | MvM的正反例划分不是任意的,必须有特殊的构造,否则组合起来时可能就无法定位到预测为哪一类了。ECOC的工作过程分两步: 202 | 203 | - 编码:对应于训练。假设有N个类别,计划做M次划分,每次划分把一部分类别划为正类,一部分类别划分为反类,最终训练出M个模型。而每个类别在M次划分中,被划为正类则记作+1,被划为负类则记作-1,于是可以表示为一个M维的编码。 204 | 205 | - 解码:对应于预测。把新样本输入M个模型,所得的M个预测结果组成一个预测编码。把这个预测编码和各个类别的编码进行比较,跟哪个类别的编码距离最近就预测为哪个类别。 206 | 207 | 类别划分由**编码矩阵(coding matrix)**指定,编码矩阵有多重形式,常见的有二元码(正类为+1,负类为-1)和三元码(多出了**停用类**,用0表示,因为有停用类的存在,**训练时可以不必使用全部类别的样例**)。举个三元码的例子: 208 | 209 | ||f1
$\downarrow$|f2
$\downarrow$|f3
$\downarrow$|f4
$\downarrow$|f5
$\downarrow$|海明距离
$\downarrow$|欧氏距离
$\downarrow$| 210 | |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| 211 | |$C_1\rightarrow$| -1 | +1 | -1 | +1 | +1 | 4 | 4 | 212 | |$C_2\rightarrow$| +1 | -1 | -1 | +1 | -1 | 2 | 2 | 213 | |$C_3\rightarrow$| -1 | +1 | +1 | -1 | +1 | 5 | 2$\sqrt{5}$ | 214 | |$C_4\rightarrow$| -1 | -1 | +1 | +1 | -1 | 3 | $\sqrt{10}$ | 215 | |测试样本$\rightarrow$| -1 | -1 | +1 | -1 | +1 | - | - | 216 | 217 | 这里一共有4个类别,对应每一行。计划做5次划分,得到f1至f5共五个二分类器,对应每一列。可以看到每一个类别有一个5位的编码表示。测试时,把新样本输入到5个模型,得到预测编码。然后计算这个预测编码和每个类别编码的距离。这里举了海明距离(不同的位数的数目)和欧氏距离作为例子。可以看到测试样本与类别2的距离最近,因此预测该样本为类别2。 218 | 219 | 特别地,为什么称这种方法为**纠错**输出码呢?因为**ECOC编码对分类器的错误有一定的容忍和修正能力**。即使预测时某个分类器预测成了错误的编码,在解码时仍然有机会产生正确的最终结果。具体来说,对同一个学习任务,**编码越长,纠错能力越强**。但是相应地也需要训练更多分类器,增大了计算和存储的开销。 220 | 221 | 对同等长度的编码来说,理论上**任意两个类别之间的编码距离越远,纠错能力越强**。但实际任务中我们一般不需要获取最优编码,一方面非最优编码已经能产生不错的效果;另一方面,**即使获得理论上最优的编码,实际性能也不一定最好**。因为机器学习还涉及其他一些方面,在划分多个类时产生的新问题难度往往也不同,有可能理论最优的编码产生的类别子集难以区分,问题难度更大,从而使得性能下降。 222 | 223 | ## 类别不平衡问题 224 | 225 | **类别不平衡(class-imbalance)**问题非常普遍,比方说推荐系统中用户购买的商品(通常视作正例)和用户未购买的商品(通常视作反例)比例是极为悬殊的。如果直接用类别不平衡问题很严重的数据集进行训练,所得模型会严重偏向所占比例较大的类别。**本节默认正类样例较少,负类样例较多**。这里主要介绍三种做法: 226 | 227 | #### 欠采样 228 | 229 | **欠采样(undersampling)**针对的是负类,也即移取训练集的部分反例,使得正类和负类的样例数目相当。由于丢掉了大量反例,所以**时间开销也大大减少**。但是带来一个问题就是,**随机丢弃反例可能会丢失一些重要信息**。书中提到一种解决方法是利用**集成学习机制**,将反例划分为多个集合,用于训练不同的模型,从而使得**对每个模型来说都进行了欠采样,但全局上并无丢失重要信息**。 230 | 231 | #### 过采样 232 | 233 | **过采样(oversampling)**针对的是正类,也即增加训练集的正例,使得正类和负类的样例数目相当。过采样的**时间开销会增大很多**,因为需要引入很多正例。注意!过采样**不能简单地通过重复正例来增加正例的比例**,这样会引起严重的过拟合问题。一种较为常见的做法是对已有正例进行**插值**来产生新的正例。 234 | 235 | #### 阈值移动 236 | 237 | **阈值移动(threshold-moving)**利用的是**再缩放**思想。回想前面对数几率回归中,几率 $\frac{y}{1-y}$ 表示正例的相对可能性,我们默认以1作为阈值,其实是假设了样本的真实分布为正例反例各一半。但这可能不是真相,假设我们有一个存在类别不平衡问题的训练集,正例数目为 $m^+$,反例数目为 $m^-$,可以重定义: 238 | 239 | $$\frac{y'}{1-y'} = \frac{y}{1-y} \times \frac{m^-}{m^+}$$ 240 | 241 | 这就是**再缩放(rescaling)**。当几率大于 $\frac{m^+}{m^-}$ 时就预测为正例。但必须注意,这种思想是**基于观测几率近似真实几率这一假设**的,现实任务中这一点未必成立。 242 | 243 | ## 习题 244 | 245 | #### 3.1 246 | 247 | >问:试析在什么情形下,预测函数 $f(\mathbf{x}) = \mathbf{w}^T\mathbf{x} + b$ 中不必考虑偏置项 $b$。 248 | 249 | Quora上就有这个[问题](https://www.quora.com/Why-do-we-need-the-bias-term-in-ML-algorithms-such-as-linear-regression-and-neural-networks),而且解释得也不错。试想一下,拟合曲线时,如果不考虑偏置项,则只能拟合一条过原点的曲线。在多元线性回归中也同理,如果不考虑偏置项,那么拟合的超平面就只能过原点,但现实中数据点的分布并不是这样的。使用一个不依赖于属性的的偏置项能够让权重向量所描述的超平面更好地拟合数据点的分布。如果输出值的期望(均值)为0就不需要考虑偏置项了,或者说偏置项此时就等于0。 250 | 251 | #### 3.2 252 | 253 | >问:试证明,对于参数w,对率回归(logistics回归)的目标函数(式1)是非凸的,但其对数似然函数(式2)是凸的。 254 | 255 | 式1:$y = \frac{1}{1+ e^{-(\mathbf{w^Tx} + b)}}$ 256 | 257 | 式2:$E(\beta) = \sum_{i=1}^m (-y_i\beta^T\hat{x_i} + \ln (1+e^{\beta^T\mathbf{\hat{x_i}}}))$ 258 | 259 | 笔记中已经提到了,检验一个函数是否凸函数,可以看其二阶导数是否在区间上恒大于0. 260 | 261 | 目标函数(也即sigmoid函数): 262 | 263 | ![sigmoid function](https://github.com/familyld/Machine_Learning/blob/master/graph/second_derivative_of_sigmoid_function.png?raw=true) 264 | 265 | 显然,sigmoid的二阶导数在自变量大于0处取值小于0,所以它不是凸函数。 266 | 267 | 对数似然函数: 268 | 269 | ![loss funciton](https://github.com/familyld/Machine_Learning/blob/master/graph/second_derivative_of_loss_function.png?raw=true) 270 | 271 | 可以看到这个函数在区间上恒大于0(两边无限延伸),符合凸函数的要求,但我不太明白的是为什么作者把这个函数仍然称为对数似然函数,对数几率回归目标是最大化对数似然,最小化损失,私以为把这个函数称为损失函数更合适。 272 | 273 | #### 3.3 274 | 275 | >问:编程实现对率回归,并给出西瓜数据集3.0α上的结果 276 | 277 | 西瓜数据集3.0α: 278 | 279 | | 编号 | 密度 | 含糖率 | 好瓜 | 280 | |:-:|:-:|:-:|:-:| 281 | | 1 | 0.697 | 0.460 | 是 | 282 | | 2 | 0.774 | 0.376 | 是 | 283 | | 3 | 0.634 | 0.264 | 是 | 284 | | 4 | 0.608 | 0.318 | 是 | 285 | | 5 | 0.556 | 0.215 | 是 | 286 | | 6 | 0.403 | 0.237 | 是 | 287 | | 7 | 0.481 | 0.149 | 是 | 288 | | 8 | 0.437 | 0.211 | 是 | 289 | | 9 | 0.666 | 0.091 | 否 | 290 | | 10 | 0.243 | 0.0267 | 否 | 291 | | 11 | 0.245 | 0.057 | 否 | 292 | | 12 | 0.343 | 0.099 | 否 | 293 | | 13 | 0.639 | 0.161 | 否 | 294 | | 14 | 0.657 | 0.198 | 否 | 295 | | 15 | 0.36 | 0.37 | 否 | 296 | | 16 | 0.593 | 0.042 | 否 | 297 | | 17 | 0.719 | 0.103 | 否 | 298 | 299 | 把这个数据集转换为csv表格,并且注意要把**标记转换为0、1,注意不是-1、+1!!逻辑回归的二分类标记必须是0、1,对应于sigmoid函数的值域。** 300 | 301 | 代码实现放在了code文件下的[exercise3.3.ipynb](https://github.com/familyld/Machine_Learning/blob/master/code/exercise3.3.ipynb),不过Github似乎不支持ipynb的在线预览,可以下载下来用ipython notebook打开。结果如下: 302 | 303 | ![result](https://github.com/familyld/Machine_Learning/blob/master/graph/exercise3.3.png?raw=true) 304 | 305 | 用了梯度上升法来更新权值,步长0.05,最大迭代次数2000次。上图中红色为好瓜,绿色为坏瓜,圆形标记表示预测正确,叉号标记表示预测错误。可以看到有一个好瓜被预测为坏瓜,有两个坏瓜被预测为好瓜。事实上,在200次迭代后,已经基本定型了,权值并没有太大的变化。 306 | 307 | #### 3.4 308 | 309 | >问:选择两个UCI数据集,比较10折交叉验证法和留一法所估计出的对率回归的错误率。 310 | 311 | 在[UCI数据集](http://archive.ics.uci.edu/ml/)上可以进行下载。最近时间不多,暂且挖个坑。 312 | 313 | 314 | #### 3.5 315 | 316 | >问:编程实现线性判别分析,并给出西瓜数据集3.0α上的结果 317 | 318 | 最近时间不多,暂且挖个坑。 319 | 320 | #### 3.6 321 | 322 | >问:LDA仅在线性可分数据上能获得理想结果,试设计一个改进方法,使其能较好地用于非线性可分数据 323 | 324 | 可以利用核方法,把非线性可分数据的分布转换为线性可分,书上137页有介绍:KLDA(核线性判别分析方法)。 325 | 326 | #### 3.7 327 | 328 | >问:令码长为9,类别数为4,试给出海明距离意义下理论最优的EOOC二元码并证明之。 329 | 330 | 码长为9,即要产生9个分类器,因此需要9种划分方面。类别数为4,因此1V3有4种分法,2V2有6种分法,3V1同样有4种分法。书上说理论上任意两个类别之间的距离越远,纠错能力就越强。这句话可以理解为各个类别之间的距离之和越大约好。对于1个2V2分类器,4个类别的海明距离累积为4;对于3V1与1V3分类器,海明距离均为3,所以可以认为2V2的效果更好。故最优EOOC二元码由6个2V2分类器和3个3v1或1v3分类器构成。 331 | 332 | 333 | #### 3.8* 334 | 335 | >问:EOOC编码能起到理想纠错作用的重要条件是:在每一位编码上出错的概率相当且独立。试析多分类任务经ECOC编码后产生的二类分类器满足该条件的可能性及由此产生的影响。 336 | 337 | 在每一位编码上出错的概率即指在第i个分类器上的错误率,假设每个分类器选择相同的模型与最优的参数。那么满足概率相当并且独立应该需要每个分类器的正负例比例相当,并且每个分类器划分的正负例在空间中的相对分布情况应当相近。一般情况下一般很难满足这样的条件,肯定会有错误率较高的分类器。错误率较高的分类器在较少时影响不大,但当高错误率分类器占到多数时,就会拖低整体的错误率。所以我认为在某些极端情况下,增加码长可能会降低正确率 338 | 339 | #### 3.9 340 | 341 | >问:使用OvR和MvM将多分类任务分解为二分类任务求解时,试述为何无需专门针对类别不平衡性进行处理。 342 | 343 | 因为OvR或者MvM在输出结果阶段,是对各个二分类器的结果进行汇总,汇总的这个过程就会消除不平衡带来的影响(因为总和总是1) 344 | 345 | #### 3.10* 346 | 347 | >问:试推导出多分类代价敏感学习(仅考虑基于类别的误分类代价)使用“再缩放“能获得理论最优解的条件。 348 | 349 | 最近时间不多,暂且挖个坑。 350 | -------------------------------------------------------------------------------- /04decision_tree.md: -------------------------------------------------------------------------------- 1 | # 决策树 2 | 3 | 由于决策树的内容我之前有做过一个比较详细的[PPT分享](https://github.com/familyld/Machine_Learning/blob/master/resource/Decision%20tree.pdf),所以这一章的笔记暂时不打算花太大精力,主要是理清最重要的定义和思路,更详细的之后有时间会考虑补上。 4 | 5 | 这一章的内容大致如下: 6 | 7 | - **基本流程**:决策树是如何决策的?决策树学习的目的是什么?如何生成一颗决策树? 8 | 9 | - **划分选择**:怎样选择最优划分属性?有哪些判断指标?具体是怎样运作的? 10 | 11 | - **剪枝处理**:为什么要剪枝?如何判断剪枝后决策树模型的泛化性能是否提升?预剪枝和后剪枝是怎样工作的?有什么优缺点? 12 | 13 | - **连续与缺失值**:如何把连续属性离散化?如何基于离散化后的属性进行划分?和离散属性有何不同?如何在属性值缺失的情况下选择最优划分属性?给定划分属性,如何划分缺失该属性值的样本? 14 | 15 | - **多变量决策树**:决策树模型的分类边界的特点是怎样的?多变量决策数是如何定义的?又是如何工作的? 16 | 17 | ## 基本流程 18 | 19 | **决策树(decision tree)**是一种模仿人类决策的学习方法。举个例子,比方说买电脑,我们首先看看外观帅不帅气,然后再看看性能怎么样,还得看看价格如何,最终**经过一系列的判断做出**是否购买电脑的**决策**。 20 | 21 | 一棵决策树可以分成三个部分:叶节点,非叶节点,分支。**叶节点**对应**决策结果**,也即分类任务中的类别标记;**非叶节点**(包括根节点)对应一个**判定问题**(某属性=?);**分支**对应父节点**判定问题的不同答案**(可能的属性值),可能连向一个非叶节点的子节点,也可能连向叶节点。 22 | 23 | ![decision tree](https://upload.wikimedia.org/wikipedia/en/5/5a/Decision_tree_for_playing_outside.png) 24 | 25 | 决策就是从根节点开始走到叶节点的过程。每经过一个节点的判定,数据集就按照答案(属性值)划分为若干子集,**在子节点做判定时只需要考虑对应的数据子集就可以了**。 26 | 27 | 决策树学习的目的是为了**产生一棵泛化能力强,即处理未见示例能力强的决策树**。 28 | 29 | 决策树生成是一个**递归过程**: 30 | 31 | 生成算法: 32 | 33 | 1. 传入训练集和属性集 34 | 2. 生成一个新节点 35 | 3. 若此时数据集中所有样本都属于同一类,则把新节点设置为该类的叶节点,然后**返回**$^1$。 36 | 4. 若此时属性集为空,或者数据集中所有样本在属性集余下的所有属性上取值都相同,无法进一步划分,则把新节点设置为叶节点,类标记为数据集中样本数最多的类,然后**返回**$^2$ 37 | 5. 从属性集中选择一个最优划分属性 38 | - 为该属性的每个属性值生成一个分支,并按属性值划分出子数据集 39 | - 若分支对应的子数据集为空,无法进一步划分,则直接把子节点设置为叶节点,类标记为父节点数据集中样本数最多的类,然后**返回**$^3$ 40 | - 将子数据集和去掉了划分属性的子属性集作为算法的传入参数,继续生成该分支的子决策树。 41 | 42 | 稍微注意以下,3处返回中的第2处和第3处设置叶节点的类标记原理有所不同。第2处将类标记设置为当前节点对应为数据集中样本数最多的类,这是利用当前节点的**后验分布**;第3处将类标记设置为为父节点数据集中样本数最多的类,这是把父节点的样本分布作为当前节点的**先验分布**。 43 | 44 | ## 划分选择 45 | 46 | 在决策树模型中,我们不断进行判定的初衷是希望**划分后需要考虑的可能更少**,准确地说,是希望所得子节点的**纯度(purity)**更高(也可以说是混乱程度更低)。 47 | 48 | **信息熵(information entropy)**是一种衡量样本集纯度的常用指标: 49 | 50 | $$Ent(D) = -\sum_{k=1}^{|\mathcal{Y}|}p_klog_2p_k$$ 51 | 52 | **一定要记得最前面的负号!!!**其中 $|\mathcal{Y}|$ 为类别集合,$p_k$ 为该类样本占样本总数的比例。 53 | 54 | **信息熵越大,表示样本集的混乱程度越高,纯度越低**。 55 | 56 | #### 信息增益 57 | 58 | **信息增益(information gain)**是**ID3算法**采用的选择准则,定义如下: 59 | 60 | $$Gain(D,a) = Ent(D) - \sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)$$ 61 | 62 | 它描述的是按某种属性划分后纯度的提升,**信息增益越大,代表用属性 $a$ 进行划分所获得的纯度提升越大**。其中 $V$ 表示属性 $a$ 的属性值集合,$D^v$ 表示属性值为 $v$ 的数据子集。求和项也称为**条件熵**,我们可以理解为它是先求出每个数据子集的信息熵,然后按每个数据子集占原数据集的比例来赋予权重,比例越大,对提升纯度的帮助就越大。 63 | 64 | 多个属性都取得最大的信息增益时,任选一个即可。 65 | 66 | 信息增益又称为**互信息(Mutual information)**。 67 | 68 | - 一个连续变量X的不确定性,用方差Var(X)来度量 69 | - 一个离散变量X的不确定性,用熵H(X)来度量 70 | - 两个连续变量X和Y的相关度,用协方差或相关系数来度量 71 | - 两个离散变量X和Y的相关度,用互信息I(X;Y)来度量(直观地,X和Y的相关度越高,X对分类的作用就越大) 72 | 73 | #### (信息)增益率 74 | 75 | **增益率(gain ratio)**是**C4.5算法**采用的选择准则,定义如下: 76 | 77 | $$Gain\_ratio(D,a) = \frac{Gain(D,a)}{IV(a)}$$ 78 | 79 | 其中, 80 | 81 | $$IV(a) = -\sum_{v=1}^V\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}$$ 82 | 83 | **一定要记得最前面的负号!!!**IV称为属性的**固有值(intrinsic value)**,它的定义和信息熵是类似的,信息熵衡量的是样本集在类别上的混乱程度,而**固有值衡量的是样本集在某个属性上的混乱程度。固有值越大,则该属性混乱程度越高,可能的取值越多**。 84 | 85 | 之所以要定义增益率是为了**避免模型过份偏好用取值多的属性作划分**。这是使用信息增益作准则非常容易陷入的误区,比方说每个样本都有一个“编号”属性,这个属性的条件熵肯定是最小的,但如果选择了该属性作为根节点,那么构建出的决策树就没有任何意义了,因为这个模型根本不具备泛化性能。 86 | 87 | 注意了,**C4.5并非直接选择增益率最高的属性**,它使用了一个**启发式**:先从属性集中找到信息增益高于平均水平的属性作为候选,然后再比较这些候选属性的增益率,从中选择增益率最高的。 88 | 89 | #### 基尼指数 90 | 91 | **基尼指数(Gini index)**是**CART算法**采用的选择准则,定义如下: 92 | 93 | 基尼值: 94 | 95 | $$Gini(D) = \sum_{k=1}^{|\mathcal{Y}|}\sum_{k' \neq k}p_kp_{k'}\\ 96 | =1-\sum_{k=1}^{|\mathcal{Y}|}p_k^2$$ 97 | 98 | 基尼指数: 99 | 100 | $$Gini\_index(D,a) = \sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v)$$ 101 | 102 | 基尼值是另一种衡量样本集纯度的指标。反映的是**从一个数据集中随机抽取两个样本,其类别标志不同的概率**。 103 | 104 | **基尼值越小,样本集的纯度越高**。 105 | 106 | 由基尼值引伸开来的就是基尼指数这种准则了,**基尼指数越小,表示使用属性 $a$ 划分后纯度的提升越大**。 107 | 108 | ## 剪枝处理 109 | 110 | **剪枝(pruning)**是决策树学习算法应对**过拟合**的主要手段。因为决策树模型太强大了,很可能把训练集学得太好以致于把训练集本身的特性也给学习了(特别是属性数多于样本数的情况),所以去除掉一些分支是有必要的。 111 | 112 | 怎么判断剪枝有没有用呢?具体来说就是**判断剪枝后模型的泛化性能有没有提升**?这就涉及到第二章[模型评估与选择](https://github.com/familyld/Machine_Learning/blob/master/02model_evaluation_and_model_selection.md)的内容了。不过这里不用做比较检验,我们需要做的首先是**选定一种评估方法划分训练集和测试集**,然后**选定一种性能度量**用来衡量剪枝前后的模型在测试集上的效果。 113 | 114 | #### 预剪枝 115 | 116 | **预剪枝(prepruning)**是在决策树生成的过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能提升(比方说,划分后在测试集上错得更多了 / **划分前后在测试集上效果相同**),就停止划分并将当前节点标记为叶节点。 117 | 118 | #### 后剪枝 119 | 120 | **后剪枝(postpruning)**是先从训练集生成一颗完整的决策树,然后自底向上地逐个考察非叶节点,若将该节点对应的子树替换为叶节点能带来决策树泛化性能的提升,则将该子树替换为叶节点。实际任务中,即使没有提升,**只要不是性能下降,一般也会剪枝**,因为根据奥卡姆剃刀准则,简单的模型更好。 121 | 122 | 特别地,只有一层划分(即只有根节点一个非叶节点)的决策树称为**决策树桩(decision stump)**。 123 | 124 | #### 优缺点 125 | 126 | 预剪枝是一种贪心策略,因为它在决策树生成时就杜绝了很多分支展开的机会,所以不但**降低了过拟合的风险**,同时也**显著减少了模型的训练时间开销和测试时间开销**。但是!这种贪心策略有可能导致**欠拟合**,因为有可能当前划分不能提升模型的泛化性能,但其展开的后续划分却会显著提升泛化性能。在预剪枝中这种可能被杜绝了。 127 | 128 | 后剪枝是种比较保守的策略,**欠拟合的风险很小,泛化性能往往优于预剪枝的决策树**。但是由于后剪枝是在生成了完整决策树后,自底向上对所有非叶节点进行考察,所以**训练时间开销要比未剪枝决策树和预剪枝决策树都大得多**。 129 | 130 | ## 连续与缺失值 131 | 132 | #### 连续值 133 | 134 | 前面线性模型已经谈到了离散属性连续化,而决策树模型需要的则是**连续属性离散化**,因为决策树**每次判定只能做有限次划分**。最简单的一种离散化策略是C4.5算法采用的**二分法(bi-partition)**。 135 | 136 | 给定一个包含连续属性 $a$ 的数据集,并且 $a$ 在数据集中有 $n$ 个不同取值,我们先把属性 $a$ 的 $n$ 个属性值**从小到大进行排序**。**所谓“二分”是指将这些属性值分为两个类别**(比方说把身高这一属性分为高于170和低于170两个类别)。 137 | 138 | 这就产生了一个新问题,怎么找到合适的划分点(例如上面例子的170)呢? 139 | 140 | 在对连续属性值排序完之后,由于有 $n$ 个不同取值,取每**两个取值的平均值作为划分点**的话,就有 $n-1$ 个候选划分点。我们需要做得就是按照准则(比方说用ID3算法的话就是信息增益)进行 $n-1$ 次判断。每次拿出一个候选划分点,把连续属性分为两类,转换为离散属性。然后基于这个基础计算准则,最终选出一个最优的属性值划分点。 141 | 142 | 注意!和离散属性不同,连续属性用于当前节点的划分后,其**后代节点依然可以使用该连续属性进一步划分**。比方说当前节点用身高低于170划分了,那么它的后代节点还可以用身高低于160来进一步划分。 143 | 144 | #### 缺失值 145 | 146 | 确实值在实际任务中是非常常见的,如果直接丢弃包含缺失值的样本会造成极大的浪费。具体来说缺失值的处理分以下两个部分: 147 | 148 | - **如何在属性值缺失的情况下选择最优划分属性?** 149 | 150 | 假设数据集为 $D$,有缺失值的属性为 $a$,令 $\tilde{D}$ 表示 $D$ 中没有缺失属性 $a$ 的样本子集。我们只能基于 $\tilde{D}$ 来判断属性 $a$ 的优劣。但是我们又希望包含缺失值的样本也能在建模过程体现出一定的影响了,因此要**重新定义准则**。在那之前,先定义几个新定义用到的变量: 151 | 152 | $$\rho = \frac{\sum_{\mathbf{x} \in \tilde{D}}w_\mathbf{x}}{\sum_{\mathbf{x} \in D}w_\mathbf{x}}$$ 153 | 154 | 155 | $$\tilde{p_k} = \frac{\sum_{\mathbf{x} \in \tilde{D_k}}w_\mathbf{x}}{\sum_{\mathbf{x} \in \tilde{D}}w_\mathbf{x}},\quad (1 \leq k \leq |\mathcal{Y}|)$$ 156 | 157 | $$\tilde{r_v} = \frac{\sum_{\mathbf{x} \in \tilde{D^v}}w_\mathbf{x}}{\sum_{\mathbf{x} \in \tilde{D}}w_\mathbf{x}},\quad (1 \leq v \leq V)$$ 158 | 159 | $\rho$ 表示**无缺失值样本所占的比例**; 160 | 161 | $\tilde{p_k}$ 表示**无缺失值样本中第 $k$ 类所占的比例**; 162 | 163 | $\tilde{r_v}$ 表示**无缺失值样本中在属性 $a$ 上取值 $a^v$ 的样本所占的比例** ; 164 | 165 | 注意,这里的 $w_\mathbf{x}$ 表示样本的权值,它是**含缺失值样本参与建模**的一种方式。在根节点处初始时,所有样本 $\mathbf{x}$ 的权重都为1。 166 | 167 | 接下来重新定义信息熵和信息增益,推广到样本含缺失值的情况: 168 | 169 | $$Ent(\tilde{D}) = -\sum_{k=1}^{|\mathcal{Y|}}\tilde{p_k}log_2\tilde{p_k}$$ 170 | 171 | $$Gain(D,a) = \rho \times Gain(\tilde{D},a)\\ 172 | = \rho \times (Ent(\tilde{D}) - \sum_{v=1}^V\tilde{r_v}Ent(\tilde{D^v}))$$ 173 | 174 | 按照新的定义来计算包含缺失值的属性的信息增益,然后和其他属性的信息增益相比,选出最优的。 175 | 176 | - **给定划分属性,如何划分缺失该属性值的样本?** 177 | 178 | 假设有一个包含缺失值的属性被计算出是最优划分属性,那么我们就要按该属性的不同取值划分数据集了。缺失该属性值的样本怎么划分呢?答案是**按概率划分**,这样的样本会被**同时划入所有子节点**,并且其**权重更新**为对应的 $\tilde{r_v} \dot w_\mathbf{x}$。 179 | 180 | 可以把无缺失值的决策树建模想象为各样本权值恒为1的情形,它们**只对自己所属的属性值子集作贡献**。而样本含缺失值时,它会**以不同的概率对所有属性值子集作贡献**。 181 | 182 | ## 多变量决策树 183 | 184 | 前面提到的决策树都是**单变量决策树(univariate decision tree)**, 即在每个节点处做判定时都只用到一个属性。它有一个特点,就是形成的**分类边界都是轴平行(axis-parallel)的**。 185 | 186 | 如果把属性都当作坐标空间中的坐标轴,由于我们建模时假设样本的各属性之间是没有关联的,所以**各坐标轴是相互垂直的**。而决策数每次只取一个确定的属性值来划分,就等同于**画一个垂直于该属性坐标轴的超平面**(只有两个属性时就是一条线),它**与其他坐标轴都是平行的**,这就是轴平行。最终由多个与坐标轴平行的超平面组成分类边界。 187 | 188 | 这样有一个弊端就是,如果真实分类边界特别复杂,就需要画出很多超平面(线),在预测时就需要继续大量的属性测试(遍历决策树)才能得到结果,**预测时间开销很大**。 189 | 190 | **多变量决策树(multivariate decision tree)**,顾名思义,它不再是选择单个最优划分属性作为节点,而是试图寻找一个**最优的多属性的线性组合**作为节点,它的每个非叶节点都是一个形如 $\sum_{i=1}^d w_ia_i = t$ 的线性分类器。多变量决策树的决策边界能够**斜着走**,甚至**绕曲线走**,从而用更少的分支更好地逼近复杂的真实边界。 191 | 192 | ## 习题 193 | 194 | #### 4.1 195 | 196 | > 试证明对于不含冲突数据(即特征向量完全相同但标记不同)的训练集,必存在与训练集一致(即训练误差为0)的决策树 197 | 198 | 假设不存在与训练集一致的决策树,那么训练集训练得到的决策树至少有一个节点上存在无法划分的多个数据(若节点上没有冲突数据,那么总是能够将数据分开的)。这与前提-不含冲突数据 矛盾,因此必存在与训练集一致的决策树 199 | 200 | #### 4.2 201 | 202 | > 试析使用“最小训练误差”作为决策树划分选择的缺陷。 203 | 204 | 若以最小训练误差作为决策树划分的依据,由于训练集和真是情况总是会存在一定偏差,这使得这样得到的决策树会存在过拟合的情况,对于未知的数据的泛化能力较差。因此最小训练误差不适合用来作为决策树划分的依据。 205 | 206 | #### 4.3 207 | 208 | > 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树 209 | 210 | 最近时间不多,暂且挖个坑。 211 | 212 | #### 4.4 213 | 214 | > 试编程实现基于基尼指数进行划分选择的决策树算法,并为表4.2中数据生成预剪枝、后剪枝决策树,并与未剪枝决策树进行比较。 215 | 216 | 最近时间不多,暂且挖个坑。 217 | 218 | #### 4.5 219 | 220 | > 试编程实现基于对率回归进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树 221 | 222 | 最近时间不多,暂且挖个坑。 223 | 224 | #### 4.6 225 | 226 | > 试选择4个UCI数据集,对上述3种算法所产生的未剪枝、预剪枝、后剪枝决策树进行实验比较,并进行适当的统计显著性检验。 227 | 228 | 最近时间不多,暂且挖个坑。 229 | 230 | #### 4.7 231 | 232 | > 图4.2是一个递归算法,若面临巨量数据,则决策树的层数会很深,使用递归方法易导致“栈”溢出,试使用“队列”数据结构,以参数maxDepth控制数的最大深度,写出与图4.2等价、但不使用递归的决策树生成算法。 233 | 234 | 下面算法我没有尝试写对应的代码,若有朋友写过欢迎交流/指正。 235 | 236 | 以下代码为 队列+MaxDepth控制,即广度优先搜索。其实我觉得这里如果要用MaxDepth进行控制的话,应该选择堆栈而非队列,即应该用深度优先搜索。但下面还是给出队列的形式。若要改为深度优先搜索只需要将先进后出 改成 先进先出即可(即数据存取都在一端)。 237 | 238 | ``` 239 | —————————————————————————————————————————————————————— 240 | 输入:训练集 D={(x1,y1),(x2,y2),...,(xm,ym)}; 241 | 属性集 A={a1,a2,...,ad} 242 | 最大深度 MaxDepth 243 | 过程:函数TreeGenerate(D,A,MaxDepth) 244 | 1:生成节点root 245 | 2:if D中样本全部属于同一类别C then 246 | 3: 将root标记为C类叶节点;return 247 | 4:end if 248 | 5:if A=空集 or D中样本在A上取值相同 then 249 | 6: 将root标记为叶节点,其类别标记为D中样本数最多的类;return 250 | 7:end if 251 | 8:从A中选择最优划分属性a*; 252 | 9:将root标记为分支节点,属性为属性a*; 253 | 10:将root放入NodeQueue; 254 | 11:将D放入DataQueue; 255 | 12:将A\{a*}放入AQueue; 256 | 13:初始化深度depth=1; 257 | 14:将depth放入DepthQueue; 258 | 15:while NodeQueue 非空: 259 | 16: 取出NodeQueue队尾的节点rNode,其对应的属性是ra*; 260 | 17: 取出DataQueue队尾的数据集rD; #此处r均指队尾rear 261 | 18: 取出AQueue队尾的属性集rA; 262 | 19: 取出DepthQueue队尾的元素rdepth; 263 | 20: if rdepth==MaxDepth: 264 | 21: 将rNode标记为叶节点,类别标记为rD中样本最多的类; 265 | 22: continue; #跳过本次循环,即不再对这个节点做展开 266 | 23: for ra*的每一个取值ra*v do: 267 | 24: 为rNode生成一个分支节点,令rDv表示rD在ra*上取值为ra*v的样本子集; 268 | 25: if rDv为空 then: 269 | 26: 将分支节点标记为叶节点,其类别标记为rD中样本最多的类; 270 | 27: else if rD中样本全部属于同一类别C then 271 | 28: 将分支节点标记为C类叶节点; 272 | 29: else if rA=空集 or rD中样本在A上取值相同 then 273 | 30: 将分支节点标记为叶节点,其类别标记为rD中样本数最多的类; 274 | 31: else: 275 | 32: 从rA中选择最优划分属性a*v; 276 | 33: 将分支节点的属性记为a*v; 277 | 34: 将分支节点放入NodeQueue的队头; 278 | 35: 将rDv放入DataQueue的队头; 279 | 36: 将rA\{a*v}放入AQueue的队头; 280 | 37: 将(rDepth+1)放入DepthQueue的队头; 281 | 38: end if 282 | 39: end for 283 | 40:end while 284 | 输入:以root为根节点的一棵决策树 285 | —————————————————————————————————————————————————————— 286 | ``` 287 | 288 | #### 4.8 289 | 290 | > 试将决策树生成的深度优先搜索过程修改为广度优先搜索,以参数MaxNode控制树的最大结点数,将题4.7中基于队列的决策树算法进行改写。对比题4.7中的算法,试分析哪种方式更易于控制决策树所需储存不超过内存。 291 | 292 | 在4.7中写的基于队列的算法本身就是广度优先搜索的。若要写成深度优先搜索的方式应该将队列换成堆栈即可。 293 | 294 | 以下对4.7中的代码进行改写,用队列+MaxNode控制 295 | 296 | ``` 297 | —————————————————————————————————————————————————————— 298 | 输入:训练集 D={(x1,y1),(x2,y2),...,(xm,ym)}; 299 | 属性集 A={a1,a2,...,ad} 300 | 最大节点数 MaxNode 301 | 过程:函数TreeGenerate(D,A,MaxNode) 302 | 1:生成节点root 303 | 2:if D中样本全部属于同一类别C then 304 | 3: 将root标记为C类叶节点;return 305 | 4:end if 306 | 5:if A=空集 or D中样本在A上取值相同 then 307 | 6: 将root标记为叶节点,其类别标记为D中样本数最多的类;return 308 | 7:end if 309 | 8:从A中选择最优划分属性a*; 310 | 9:将root标记为分支节点,属性为属性a*; 311 | 10:将root放入NodeQueue; 312 | 11:将D放入DataQueue; 313 | 12:将A\{a*}放入AQueue; 314 | 13:初始化节点数numNode=1; 315 | 14:while NodeQueue 非空: 316 | 15: 取出NodeQueue队尾的节点rNode,其对应的属性是ra*; 317 | 16: 取出DataQueue队尾的数据集rD; #此处r均指队尾rear 318 | 17: 取出AQueue队尾的属性集rA; 319 | 18: if numNode==MaxNode: 320 | 19: 将rNode标记为叶节点,类别标记为rD中样本最多的类; 321 | 20: continue; #跳过本次循环,即不再对这个节点做展开。对于下一个节点,由于条件任然成立,故任然不展开 322 | 21: for ra*的每一个取值ra*v do: 323 | 22: 为rNode生成一个分支节点,令rDv表示rD在ra*上取值为ra*v的样本子集; 324 | 23: if rDv为空 then: 325 | 24: 将分支节点标记为叶节点,其类别标记为rD中样本最多的类; 326 | 25: else if rD中样本全部属于同一类别C then 327 | 26: 将分支节点标记为C类叶节点; 328 | 27: else if rA=空集 or rD中样本在A上取值相同 then 329 | 28: 将分支节点标记为叶节点,其类别标记为rD中样本数最多的类; 330 | 29: else: 331 | 30: 从rA中选择最优划分属性a*v; 332 | 31: 将分支节点的属性记为a*v; 333 | 32: 将分支节点放入NodeQueue的队头; 334 | 33: 将rDv放入DataQueue的队头; 335 | 34: 将rA\{a*v}放入AQueue的队头; 336 | 35: 将(rDepth+1)放入DepthQueue的队头; 337 | 36: end if 338 | 37: numNode+=1 339 | 38: end for 340 | 39:end while 341 | 输入:以root为根节点的一棵决策树 342 | —————————————————————————————————————————————————————— 343 | ``` 344 | 345 | 讨论:4.7中与4.8中用队列的话均为广度优先搜索,我觉得是出题的时候的疏忽。。 346 | 347 | 应该是广度优先搜索(队列)+MaxNode控制 与 深度优先搜索(堆栈)+MaxDepth控制 两种方法之间的比较。 348 | 349 | 个人认为,广度优先搜索(队列)+MaxNode 的方法更容易控制决策树所需内存不溢出。因为最大节点数目是固定的。队列中储存的是当前深度未处理的节点以及当前深度以处理节点的下一级节点,其数目是可控的,总小于最大节点数。而深度优先搜索在堆栈中储存的是当前节点的兄弟节点、当前节点的父节点、当前节点的父节点的兄弟节点.....若一些分支节点的分支数很多,那么堆栈的深度就会比较深,虽然有MaxDepth控制最大深度,但还是可能出现栈溢出的情况。 350 | 351 | #### 4.9 352 | 353 | > 试将4.4.2节对缺失值的处理机制推广到基尼指数的计算中去。 354 | 355 | 最近时间不多,暂且挖个坑。 356 | 357 | #### 4.10 358 | 359 | > 从网上下载或自己编程实现任意一种多变量决策树算法,并观察其在西瓜数据集3.0上产生的结果。 360 | 答:此处要求实现一种多变量决策树算法。实际上4.3与4.4题就是多变量决策树算法。其在西瓜数据集3.0上产生的结果如下 361 | 362 | 最近时间不多,暂且挖个坑。 363 | -------------------------------------------------------------------------------- /05neural_network.md: -------------------------------------------------------------------------------- 1 | # 神经网络 2 | 3 | 在机器学习中,**神经网络(neural networks)**一般是指“神经网络学习”。所谓神经网络,目前用得最广泛的一个定义是“神经网络是由**具有适应性的简单单元**组成的广泛**并行互连的网络**,它的组织能够模拟生物神经系统**对真实世界物体所做出的反应**”。它是一种**黑箱模型**,解释性较差,但效果很好。目前已有一些工作尝试改善神经网络的可解释性。 4 | 5 | 这一章的内容大致如下: 6 | 7 | - **神经元模型**:什么是神经元模型?它的构造是怎样的?激活函数是什么?如何组建神经网络? 8 | 9 | - **感知机与多层网络**:感知机的构造是怎样的?感知机不能解决什么问题?多层网络是怎样的?多层前馈神经网络有什么特点? 10 | 11 | - **误差逆传播算法**:BP算法如何调整参数?有什么值得注意的地方?标准BP算法和累积BP算法有什么区别?如何设置隐层神经元的个数?如何处理BP神经网络的过拟合问题? 12 | 13 | - **全局最小与局部极小**:什么是全局最小?什么是局部极小?如何跳出局部极小? 14 | 15 | - **其他常见神经网络**:有哪些常见的神经网络?它们各自有什么特点?什么是竞争型学习?可塑性、稳定性、增量学习、在线学习各指什么? 16 | 17 | - **深度学习**:深度学习是如何提升模型容量的?如何训练深度神经网络?怎么理解深度学习? 18 | 19 | ## 神经元模型 20 | 21 | **神经元(neuron)模型**是神经网络最基本的组成成分,不妨对比一下生物学中的神经元和机器学习中的神经元: 22 | 23 | ![neuron](http://www.neuralpower.com/images/tecnology/figure1.gif) 24 | ![neuron](http://blogs.cornell.edu/info2040/files/2012/11/neuron-model-24yuchi.png) 25 | 26 | 在生物学中,每个神经元都有多个**树突(dendrite)**,一个**轴突(axon)**,以及一个**细胞体(cell body)**。当它**兴奋**时,就会向相连的神经元发送化学物质,从而改变它们内部的电位。如果一个神经元的电位超过了**阈值(threshold,也称bias)**,那它就会被**激活**,也即兴奋,继而向其他相连神经元发送化学物质。 27 | 28 | 在机器学习中,最常用的是右图的**M-P神经元模型**(亦称为**阈值逻辑单元(threshold logic unit)**)。树突对应于输入部分,每个神经元接收到若干个来自其他神经元的输入信号,这些信号通过带权重的**连接(connection)**传递给细胞体,这些权重又称为**连接权**。细胞体分为两部分,前一部分计算**总输入值(即输入信号的加权和,或者说累积电平)**;后一部分先计算总输入值与该神经元的阈值的差值,然后通过**激活函数(activation function)**的处理,从轴突输出给其它神经元。也即: 29 | 30 | $$y = f(\sum_i w_i x_i -\theta)$$ 31 | 32 | 最理想的激活函数是阶跃函数,但它不连续。类似于线性分类,可以采用Sigmoid函数来近似。因为这类函数能把较大范围内变化的输入值挤压到 (0,1) 输出值范围内,所以也称为**挤压函数(squashing function)**。 33 | 34 | 将**多个神经元按一定的层次结构连接起来**,就得到了神经网络。它是一种包含许多参数的模型,比方说10个神经元两两连接,则有100个参数需要学习(每个神经元有9个连接权以及1个阈值)。若将每个神经元都看作一个函数,整个神经网络就是由这些函数相互嵌套而成。 35 | 36 | ## 感知机与多层网络 37 | 38 | #### 感知机 39 | 40 | **感知机(Perceptron)**仅由两层神经元组成,如下图: 41 | 42 | ![perceptron](https://github.com/familyld/Machine_Learning/blob/master/graph/perceptron.png?raw=true) 43 | 44 | 两层是指输入层和输出层,但**只有输出层是M-P神经元**,也即**只有一层功能神经元(functional neuron)**。输入层只负责把每一个样本的各个属性传递给输出层(**输入层的神经元数量等于样本的属性数目**),不进行函数处理。其实说白了这个模型跟逻辑回归是一样的,不过按我的理解就是感知机的输出层可以有多个神经元,产生多个输出。而且线性模型中偏置项是和属性一起加权求和的,但神经网络中则是求属性加权和和预测的差。 45 | 46 | 有时候阈值 $\theta$ 可以看作一个**输入固定为 $-1.0$ 的哑结点(dummy node)**,连接权为 $w_{n+1}$。这样就可以把权重和阈值的学习统一为权重的学习了。更新权重的方式如下: 47 | 48 | $$w_i \leftarrow w_i + \Delta w_i$$ 49 | 50 | $$\Delta w_i= \eta (y - \hat{y}) x_i$$ 51 | 52 | 其中,$\eta$ 称为**学习率(learning rate)**,取值范围是 (0,1)。感知机是**逐个数据点输入来更新**的。设定初始的权重后,逐个点输入,如果没有预测错就继续检验下一个点;如果预测错了就更新权重,然后重新开始逐个点检验,**直到所有点都预测正确了就停止更新**(所以这其实是一种最小化经验误差的方法)。 53 | 54 | 已经证明了,**若两类模式是线性可分(linearly separable)的,即存在一个线性超平面能将它们分开**。比如二维平面上可以用一条**直线**完全分隔开两个类别的点。由于感知机只有一层功能神经元,所以学习能力极其有限,**只能处理线性可分问题**。对于这类问题,感知机的学习过程必然**收敛(converge)**而求出适当的权向量;对于线性不可分问题,感知机的学习过程会发生**振荡(fluctuation)**,难以稳定下来。 55 | 56 | #### 多层网络 57 | 58 | **使用多层的功能神经元可以解决线性不可分问题**,比方说两层(功能神经元)的感知机就可以解决异或问题(在二维平面中需要使用两条直线才能分隔开)。在输入层和输出层之间的层称为隐层或者**隐含层(hidden layer)**,隐含层的神经元也是功能神经元。 59 | 60 | ![multi-layer feedforward neural networks](https://github.com/familyld/Machine_Learning/blob/master/graph/multi-layer_feedforward_neural_networks.png?raw=true) 61 | 62 | 上图展示的最为常见的多层神经网络——**多层前馈神经网络(multi-layer feedforward neural networks)**,它有以下特点: 63 | 64 | 1. 每层神经元与下一层神经元**全互连** 65 | 2. 神经元之间**不存在同层连接** 66 | 3. 神经元之间**不存在跨层连接** 67 | 68 | 因为说两层网络时容易有歧义(只包含输入层输出层?还是包含两层功能神经元?),所以一般称包含一个隐含层的神经网络为**单隐层网络**。只要包含隐层,就可以称为**多层网络**。神经网络的学习其实就是调整各神经元之间的**连接权(connection weight)**以及各神经元的阈值,也即是说,**神经网络学到的东西都蕴含在连接权和阈值中**了。 69 | 70 | ## 误差逆传播算法 71 | 72 | 训练多层网络要比感知机复杂多了,感知机的学习方法是不够的。**误差逆传播算法(error BackPropagation,简称BP)**也称为**反向传播算法**,是最为成功的一种神经网络学习方法之一。一般而言,**BP神经网络**是指用BP算法训练的多层前馈神经网络,但BP算法也能训练其他类型的神经网络,如递归神经网络。 73 | 74 | #### 标准BP算法 75 | 76 | 假设要训练的是一个单隐层的前馈神经网络,BP算法使用**均方误差**作为性能度量,基于**梯度下降(gradient descent)**策略,以目标函数的负梯度方向对参数进行调整。 77 | 78 | 流程如下: 79 | 80 | --- 81 | 82 | 输入:训练集 $D = {(\mathbf{x}_k,\mathbf{y}_k)}^m_{k=1}$,学习率 $\eta$。 83 | 84 | 过程:
85 | 1:在 $(0,1)$ 范围内随机初始化网络中所有连接权和阈值
86 | 2:$\mathbf{repeat}$
87 | 3:$\quad$ $\mathbf{for\ all}$ $(\mathbf{x}_k,\mathbf{y}_k \in D)$ $\mathbf{do}$
88 | 4:$\quad$ $\quad$ 根据当前参数计算出样本的输出 $\hat{\mathbf{y}}_k$
89 | 5:$\quad$ $\quad$ 计算输出层神经元的梯度项 $g_j$
90 | 6:$\quad$ $\quad$ 计算隐层神经元的梯度项 $e_h$
91 | 7:$\quad$ $\quad$ 更新连接权与阈值
92 | 8:$\quad$ $\mathbf{end for}$
93 | 9:$\mathbf{until}$ 达到停止条件
94 | 95 | 输出:连接权与阈值确定的多层前馈神经网络 96 | 97 | --- 98 | 99 | 所谓**逆传播**其实就是从输出层开始逐步往后更新,因为输出层的误差确定后就可以对输出层的连接权和阈值进行更新,并且可以推算出隐含层输出的“真实值”,从而计算出隐含层的“误差”,然后更新隐含层的连接权和阈值。BP就是这样一种**利用一层层倒推来最终更新整个神经网络**的方法,每一层的更新公式其实和感知机用的是类似的。 100 | 101 | 在学习过程中,学习率 $\eta$ 控制着每一轮迭代的更新步长,**太大则容易振荡**,**太小则收敛速度太慢**。有时为了**精细调节**,输出层和隐含层更新参数时会**使用不同的学习率**。 102 | 103 | #### 累积BP算法 104 | 105 | BP算法的目标是最小化训练集 $D$ 上的**累积误差**: 106 | 107 | $$E = \frac{1}{m}\sum_{k=1}^m E_k$$ 108 | 109 | 而标准BP算法**每输入一个样例就进行一次更新**,所以它的参数更新非常频繁,而且不同样例可能会对更新起到**抵消**效果,从而使得模型需要更多次迭代才能到达累积误差的极小点。 110 | 111 | 标准BP算法和累积BP算法的区别类似于**随机梯度下降**和**标准梯度下降**的区别。 112 | 113 | 如果把更新方式变为**每输入一遍训练集进行一次更新**,就得到**累积BP算法**,更新公式需要重新推导一下。这样更新一次就称为**一轮(one round,亦称one epoch)**学习。 114 | 115 | 使用累积BP算法时参数更新的频率要低得多,但是!在很多人任务中,**累积误差在下降到一定程度后,进一步下降会非常缓慢**。此时标准BP算法能更快地获得较好的解(特别是训练集 $D$ 很大的时候)。 116 | 117 | #### 隐层神经元个数 118 | 119 | 已证明**只需一个包含足够多神经元的隐层,多层前馈神经网络就能以任意精度逼近任意复杂度的连续函数**。那么该怎样设置隐层神经元的个数呢?**并不是越多越好**,因为可能会出现过拟合问题而得不偿失。 120 | 121 | 目前尚未有成熟的理论可以确定怎样设置隐层神经元的个数还有隐层的层数。实际应用中主要靠**试错法(trial-by-error)**来调整,也即是不断改变设置,试验模型给出的应答,然后选择结果最好的。 122 | 123 | #### 过拟合问题 124 | 125 | 鉴于BP神经网络强大的表达能力,很容易会遇到过拟合问题。主要有以下两种应对策略: 126 | 127 | - **早停(early stopping)**:把数据集分为训练集和验证集,若训练集误差降低但测试集误差升高,就停止训练,并返回具有最小验证集误差的连接权和阈值。 128 | 129 | - **正则化(regularization)**:在目标函数中添加一个用于**描述网络复杂度**的部分,比如连接权和阈值的平方和。这样训练时就会**偏好较小的连接权和阈值**,从而令输出更“光滑”。为什么可以用正则化来避免过拟合呢?可以看看[知乎上的解答](https://www.zhihu.com/question/20700829)。带正则化项的目标函数如下: 130 | 131 | $$E = \lambda\frac{1}{m}\sum_{k=1}^m E_k + (1-\lambda)\sum_i w_i^2$$ 132 | 133 | 其中 $\lambda$ 是用于对经验误差和网络复杂度折中的参数,常通过**交叉验证法**来估计。 134 | 135 | ## 全局最小与局部极小 136 | 137 | 学习模型的过程其实就是一个寻找最优参数的过程,在谈到最优时,一般会提到**局部极小(local minimum)**和**全局最小(global minimum)**。 138 | 139 | - 局部极小解:参数空间中的某个点,其邻域点的误差函数值均不小于该点的误差函数值。 140 | - 全局最小解:参数空间中的某个点,所有其他点的误差函数值均不小于该点的误差函数值。 141 | 142 | 这两个解对应的误差函数值分别成为**局部最小值**和**全局最小值**。 143 | 144 | 要成为局部极小,只要满足该点在参数空间中梯度为0就可以了。局部极小可以有多个,全局最小则只有一个。**全局最小一定也是局部极小,反之则不成立**。 145 | 146 | 因为用梯度下降搜索最优解可能会陷入非全局最小解的局部极小解,在现实任务中,人们会使用以下这些策略试图**跳出局部极小**: 147 | 148 | - **以多组不同参数值初始化多个神经网络**:经过训练后,取误差最小的解作为最终参数。这种方法相当于从多个不同的初始点开始搜索,从而增加找到全局最小解的可能性。 149 | 150 | - **模拟退火(simulated annealing)**技术:每次迭代都以一定的概率接收比当前解差的结果,从而有机会跳出局部极小(**当然也有可能跳出全局最小**),每次接受“次优解”的概率会随着时间推移逐渐减小,从而保证了算法的稳定。 151 | 152 | - **随机梯度下降(stochastic gradient descent,简称SGD)**:在计算梯度时加入了随机因素,因此即便陷入局部极小点,梯度依然可能不为0,从而有机会跳出局部极小,继续搜索。 153 | 154 | 155 | 除了这些方法之外,**遗传算法**也常用于训练神经网络以逼近全局最小。当这些技术大多是**启发式**,没有理论的保障。也就是说,这些方法指示基于直观或者经验构造的,能**在可接受的时间和空间花费下给出待解决的组合优化问题的一个可行解**,但**不能估计可行解与最优解的偏离程度**。 156 | 157 | ## 其他常见神经网络 158 | 159 | #### RBF网络 160 | 161 | **RBF(Radial Basis Function)网络**是一种单隐层前馈神经网络,它**使用径向基函数作为隐层神经元的激活函数**。输出层则直接使用隐层神经元的**线性组合**。 162 | 163 | #### ART网络 164 | 165 | **竞争型学习(competitive learning)**是神经网络中常用的一种无监督学习策略。使用该策略时,网络中的输出神经元相互竞争,**每次只有一个竞争获胜的神经元被激活**,其它输出神经元被抑制,这种机制又称为**胜者通吃(winner-take-all)**。 166 | 167 | **ART(Adaptive Resonance Theory,自适应谐振理论)**网络是竞争型学习的重要代表。该网络由四部份组成:**比较层**、**识别层**、**识别阈值**、**重置模块**。比较层就是输入层,只负责把样本传递给识别层。识别层也即输出层,但识别层的每个神经元对应一个模式类,而且**神经元的数目可以在训练过程中动态增加以增加新的模式类**。 168 | 169 | 识别层的每个神经元有一个对应的模式类的**代表向量**,每次输入一个样本,各识别层神经元相互竞争,代表向量与样本距离最小的胜出并被激活。获胜神经元会**向其他神经元发送信号,抑制其激活**。如果样本与获胜神经元的**距离小于识别阈值,则被分到对应的模式类**。否则,**重置模块会在识别层新增一个神经元,代表向量为该样本**。 170 | 171 | ART能有效缓解竞争型学习中的**可塑性-稳定性窘境(stability-plasticity dilemma)**。可塑性指神经网络要有**学习新知识的能力**,稳定性则指神经网络**在学习新知识时要保持对旧知识的记忆**。 172 | 173 | ART具备可塑性和稳定性,因此能进行**增量学习(incremental learning)**和**在线学习(online learning)**。 174 | 175 | 增量学习可以理解为**建立模型后再收到新的样例时可以对模型进行更新,但不用重新训练整个模型**,先前学得的有效信息会被保存。它可以逐个新样例进行更新,也能以**批模型(batch-mode)**,每次用一批新样例来更新。 176 | 177 | 在线学习则可以理解为**每拿到一个新样本就进行一次模型更新**,不需要一开始就准备好完整的训练集,每次收到新样例都能继续训练。可以看作**增量学习的一个特例**。 178 | 179 | #### SOM 网络 180 | 181 | ![SOM network](http://www.lohninger.com/comimg/kohonen1.gif) 182 | 183 | **SOM(Self-Organizing Map,自组织映射)**网络,又称为**自组织特征映射网络**或**Kohonen网络**。同样是一种竞争学习型无监督神经网络,只有输入层和输出层两层,输出层以矩阵形式排列。与样本距离最近的输出层神经元获胜,称为**最佳匹配单元(best matching unit)**。最佳匹配单元和邻近神经元的权向量会被调整,使得下次遇到相似的样本时距离更小。如此迭代,直至收敛。 184 | 185 | #### 级联相关网络 186 | 187 | **级联相关(Cascade-Correlation)网络**是一种典型的**结构自适应网络**,这类网络不仅通过训练来学习合适的连接权和阈值等参数,还会在训练过程中**找到最符合数据特点的网络结构**。 188 | 189 | 级联相关神经网络有两个主要成分: 190 | 191 | - **级联**:指**建立层次连接的层级结构**。开始训练时,只有输入层和输出层,随着训练进行逐渐加入隐层神经元,从而建立层级结构。注意,**隐层神经元的输入端连接权是冻结固定的**。 192 | 193 | - **相关**:指**通过最大化新神经元的输出与网络误差之间的相关性(correlation)来训练相关的参数**。 194 | 195 | #### Elman网络 196 | 197 | **递归神经网络(recurrent neural networks,简称RNN)**允许网络中出现环形结构,即一些**神经元的输出可以反馈回来当输入信号**,从而能够处理与时间有关的动态变化。 198 | 199 | Elman网络是最常用的递归神经网络之一,只有一个隐层,并且隐层神经元的输出会被反馈,在下一时刻与输入层神经元的输入信号一起作为隐层神经元的新输入。隐层神经元一般采用Sigmoid函数作为激活函数,并用BP算法训练整个网络。 200 | 201 | #### Boltzmann机 202 | 203 | 神经网络中有一类**基于能量的模型(energy-based model)**,把网络状态定义为一个能量,能量最小时网络达到理想状态,**模型的学习过程就是最小化能量函数**。Boltzmann机就是这样的模型,同时也是一种RNN。 204 | 205 | Boltzmann机的神经元**分为显层与隐层**,显层用于表达数据的输入与输出,隐层则是数据的内在。**每个神经元只有0、1两种状态**,也即抑制和激活。 206 | 207 | 标准的Boltzmann机是全连接图,即任意两个神经元之间都相连。但复杂度太高,难以用于解决现实任务,实际应用中用的是**受限Boltzmann机(Restricted Boltzmann Machine,简称RBM)**,把标准Boltzmann机退化为二部图,只保留显层和隐层之间的连接,同一层直接不相连。 208 | 209 | ## 深度学习 210 | 211 | 理论上,参数越多,模型复杂度就越高,**容量(capability,第12章中会讲到)**就越大,从而能完成更复杂的学习任务。**深度学习(deep learning)**正是一种极其复杂而强大的模型。 212 | 213 | 怎么增大模型复杂度呢?两个办法,一是**增加隐层的数目**,二是**增加隐层神经元的数目**。前者更有效一些,因为它不仅增加了功能神经元的数量,还增加了激活函数嵌套的层数。但是对于多隐层神经网络,经典算法如标准BP算法往往会在误差逆传播时**发散(diverge)**,无法收敛到稳定状态。 214 | 215 | 那要怎么有效地训练多隐层神经网络呢?一般来说有以下两种方法: 216 | 217 | - **无监督逐层训练(unsupervised layer-wise training)**:每次训练一层隐结点,把上一层隐结点的输出当作输入来训练,本层隐结点训练好后,输出再作为下一层的输入来训练,这称为**预训练(pre-training)**。全部预训练完成后,再对整个网络进行**微调(fine-tuning)**训练。一个典型例子就是**深度信念网络(deep belief network,简称DBN)**。这种做法其实可以视为把大量的参数进行分组,先找出每组较好的设置,再基于这些局部最优的结果来训练全局最优。 218 | 219 | - **权共享(weight sharing)**:令同一层神经元使用完全相同的连接权,典型的例子是**卷积神经网络(Convolutional Neural Network,简称CNN)**。这样做可以大大减少需要训练的参数数目。 220 | 221 | 事实上,深度学习可以理解为一种**特征学习(feature learning)**或者**表示学习(representation learning)**,无论是DBN还是CNN,都是**通过多个隐层来把初始与输出目标联系不大的输入表示转化为与输出目标更密切的表示**,使原来只通过单层映射难以完成的任务变为可能。也即通过多层处理,逐渐**将初始的“低层”特征表示转化为“高层”特征表示**,从而使得最后可以用简单的模型来完成复杂的学习任务。 222 | 223 | 传统任务中,样本的特征需要人类专家来设计,这称为**特征工程(feature engineering)**。特征好坏对泛化性能有至关重要的影响。而深度学习为**全自动数据分析**带来了可能,可以自动产生好的特征。 224 | 225 | ## 习题 226 | 227 | #### 5.1 228 | 229 | > 问:试述将线性函数$f(\mathbf{x}) = \mathbf{w}^T\mathbf{x}$ 用作神经元激活函数的缺陷。 230 | 231 | #### 5.2 232 | 233 | > 问:试述使用对数几率函数作为激活函数的神经元与对率回归的联系。 234 | 235 | #### 5.3 236 | 237 | > 问:对于图5.7中的$v_{ih}$,试推导出BP算法中的更新公式(5.13)。 238 | 239 | #### 5.4 240 | 241 | > 问:试述式(5.6)中学习率的取值对神经网络训练的影响。 242 | 243 | #### 5.5 244 | 245 | > 问:试编程实现标准BP算法和累积BP算法,在西瓜数据集3.0上分别用这两个算法训练一个单隐层网络,并进行比较。 246 | 247 | #### 5.6 248 | 249 | > 问:试设计一个BP改进算法,能通过动态调整学习率显著提升收敛速度。编程实现该算法,并选择两个UCI数据集与标准BP算法进行实验比较。 250 | 251 | #### 5.7 252 | 253 | > 问:根据式(5.18)和(5.19),试构造一个能解决抑或问题的单层RBF神经网络。 254 | 255 | #### 5.8 256 | 257 | > 问:从网上下载或自己编程实现SOM网络,并观察其在西瓜数据集3.0$\alpha$上产生的效果。 258 | 259 | #### 5.9* 260 | 261 | > 问:试推导用于Elman网络的BP算法。 262 | 263 | #### 5.10 264 | 265 | > 问:从网上下载或自己编程实现一个卷积神经网络,并在手写字符识别数据MNIST上进行实验编程。 266 | 267 | -------------------------------------------------------------------------------- /06support_vector_machine.md: -------------------------------------------------------------------------------- 1 | # 支持向量机 2 | 3 | **支持向量机**(Support Vector Machine,简称SVM)是一种针对二分类任务设计的分类器,它的理论相对神经网络模型来说更加完备和严密,并且效果显著,结果可预测,是非常值得学习的模型。 4 | 5 | 这一章的内容大致如下: 6 | 7 | - **间隔与支持向量**:如何计算空间中任一点到超平面的距离?什么是支持向量?什么是间隔?支持向量机求解的目标是什么? 8 | 9 | - **对偶问题**:求取最大间隔等价于怎样的对偶问题?KKT条件揭示出支持向量机的什么性质?如何用SMO算法进行高效求解?为什么SMO算法能高效求解? 10 | 11 | - **核函数**:如何处理非线性可分问题?什么是核函数?为什么需要核函数?有哪些常用的核函数?核函数具有什么性质? 12 | 13 | - **软间隔与正则化**:如何应对过拟合问题?软间隔和硬间隔分别指什么?如何求解软间隔支持向量机?0/1损失函数有哪些可选的替代损失函数?支持向量机和对率回归模型有什么联系?结构风险和经验风险分别指什么? 14 | 15 | - **支持向量回归**:什么是支持向量回归?与传统回归模型有什么不同?支持向量回归的支持向量满足什么条件? 16 | 17 | - **核方法**:什么是表示定理?什么是核方法?如何应用? 18 | 19 | ## 间隔与支持向量 20 | 21 | 给定一个二分类数据集,正类标记为+1,负类标记为-1(对率回归中负类标记是0,这点是不同的)。 22 | 23 | 分类学习试图从样本空间中找到一个超平面,使得该超平面可以将不同类的样本分隔开。但是满足这样条件的平面可能有很多,哪一个才是最好的呢? 24 | 25 | #### 支持向量 26 | 27 | 在SVM中,我们试图找到**处于两类样本正中间的超平面**,因为这个超平面**对训练数据局部扰动的容忍性最好**,新样本最不容易被误分类。也就是说这个超平面**对未见示例的泛化能力最强**。 28 | 29 | ![SVM](http://xiaofengshi.com/2018/11/11/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-SVM/svm_softmargin.gif) 30 | 31 | 上图的实线就是划分超平面,在线性模型中可以通过方程 $\mathbf{w}^T\mathbf{x}+b=0$ 来描述,在二维样本空间中就是一条直线。图中的 $\phi(\mathbf{x})$ 是使用了核函数进行映射,这里先不讨论。$\mathbf{w}$ 是线性模型的权重向量(又叫**投影向量**),也是**划分超平面的法向量,决定着超平面的方向**。偏置项 $b$ 又被称为 **位移项,决定了超平面和空间原点之间的距离**。 32 | 33 | 假设超平面能够将所有训练样本正确分类,也即对于所有标记为+1的点有 $\mathbf{w}^T\mathbf{x}+b>0$,所有标记为-1的点有 $\mathbf{w}^T\mathbf{x}+b<0$。只要这个超平面存在,那么我们必然可以对 $\mathbf{w}$ 和 $b$ 进行适当的**线性放缩**,使得: 34 | 35 | $$\mathbf{w}^T\mathbf{x}+b\geq+1,\quad y_i = +1$$ 36 | $$\mathbf{w}^T\mathbf{x}+b\leq-1,\quad y_i = -1$$ 37 | 38 | 而SVM中定义**使得上式等号成立的训练样本点**就是**支持向量(support vector)**(如果叫作**支持点**可能更好理解一些,因为事实上就是样本空间中的数据点,但因为我们在表示数据点的时候一般写成向量形式,所以就称为支持向量),它们是距离超平面最近的几个样本点,也即上面图中两条虚线上的点(图中存在比支持向量距离超平面更近的点,这跟**软间隔**有关,这里先不讨论)。 39 | 40 | 在SVM中,我们希望实现的是**最大化两类支持向量到超平面的距离之和**,那首先就得知道怎么计算距离。**怎样计算样本空间中任意数据点到划分超平面的距离**呢? 41 | 42 | ![PointToHyperPlane](https://github.com/familyld/Machine_Learning/blob/master/graph/PointToHyperPlane.png?raw=true) 43 | 44 | 画了一个图,方便讲解。图中蓝色线即超平面,对应直线方程 $\mathbf{w}^T\mathbf{x}+b=0$。投影向量 $\mathbf{w}$垂直于超平面,点 $x$ 对应向量 $\mathbf{x}$,过点 $x$ 作超平面的垂线,交点 $x_0$ 对应向量 $\mathbf{x_0}$。假设**由点 $x_0$ 指向 点 $x$ 的向量**为 $\mathbf{r}$,长度(也即点 $x$ 与超平面的距离)为 $r$。有两种方法计算可以计算出 $r$ 的大小: 45 | 46 | ##### 方法1:向量计算 47 | 48 | 由向量加法定义可得 $\mathbf{x} = \mathbf{x_0} + \mathbf{r}$。 49 | 50 | 那么向量 $\mathbf{r}$ 等于什么呢?它等于这个方向的单位向量乘上 $r$,也即有 $\mathbf{r} = \frac{\mathbf{w}}{\Vert \mathbf{w} \Vert} \cdot r$ 51 | 52 | 因此又有 $\mathbf{x} = \mathbf{x_0} + \frac{\mathbf{w}}{\Vert \mathbf{w} \Vert} \cdot r$。 53 | 54 | 由于点 $x_0$ 在超平面上,所以有 $\mathbf{w}^T\mathbf{x_0}+b=0$ 55 | 56 | 由 $\mathbf{x} = \mathbf{x_0} + \frac{\mathbf{w}}{\Vert \mathbf{w} \Vert} \cdot r$ 可得 $\mathbf{x_0} = \mathbf{x} - \frac{\mathbf{w}}{\Vert \mathbf{w} \Vert} \cdot r$,代入直线方程消去 $\mathbf{x_0}$: 57 | 58 | $$\mathbf{w}^T\mathbf{x_0}+b 59 | = \mathbf{w}^T(\mathbf{x} - \frac{\mathbf{w}}{\Vert \mathbf{w} \Vert} \cdot r)+b 60 | = 0$$ 61 | 62 | 简单变换即可得到: 63 | 64 | $$r = \frac{\mathbf{w}^T\mathbf{x}+b}{\Vert \mathbf{w} \Vert}$$ 65 | 66 | 又因为我们取距离为正值,所以要加上绝对值符号: 67 | 68 | $$r = \frac{|\mathbf{w}^T\mathbf{x}+b|}{\Vert \mathbf{w} \Vert}$$ 69 | 70 | ##### 方法2:点到直线距离公式 71 | 72 | 假设直线方程为 $ax_1 + bx_2 + c= 0$,那么有点到直线距离公式: 73 | 74 | $$r = \frac{|ax + bx_2 + c|}{\sqrt{a^2+b^2}}$$ 75 | 76 | 令 $\mathbf{w} = (a,b)$,$\mathbf{x} = (x_1,x_2)$,则可以把 $ax_1 + bx_2$ 写成向量形式 $\mathbf{w}^T\mathbf{x}$。把截距项设为$b$,则直线方程变为 $\mathbf{w}^T\mathbf{x}+b=0$,代入距离公式可得: 77 | 78 | $$r = \frac{|\mathbf{w}^T\mathbf{x}+b|}{\sqrt{\mathbf{w}^T\mathbf{w}}} = \frac{|\mathbf{w}^T\mathbf{x}+b|}{\Vert \mathbf{w} \Vert}$$ 79 | 80 | 该式扩展到多维情况下也是通用的。 81 | 82 | #### 间隔 83 | 84 | 前面已经提到,我们希望实现的是**最大化两类支持向量到超平面的距离之和**,而根据定义,所有支持向量都满足: 85 | 86 | $$\mathbf{w}^T\mathbf{x}+b = +1,\quad y_i = +1$$ 87 | $$\mathbf{w}^T\mathbf{x}+b = -1,\quad y_i = -1$$ 88 | 89 | 代入前面的距离公式可以得到支持向量到超平面的距离为 $\frac{1}{\Vert \mathbf{w} \Vert}$。 90 | 91 | 定义**间隔**(margin)为**两个异类支持向量到超平面的距离之和**: 92 | 93 | $$\gamma = 2 \cdot \frac{1}{\Vert \mathbf{w} \Vert} = \frac{2}{\Vert \mathbf{w} \Vert}$$ 94 | 95 | SVM的目标便是找到**具有最大间隔(maximum margin)**的划分超平面,也即找到使 $\gamma$ 最大的参数 $\mathbf{w}$ 和 $b$: 96 | 97 | $$\max_{\mathbf{w},b} \frac{2}{\Vert \mathbf{w} \Vert} \quad s.t. \quad y_i(\mathbf{w}^T\mathbf{x}+b) \geq 1, \quad i=1,2,...,m$$ 98 | 99 | 约束部分指的是全部样本都被正确分类,此时标记值($+1$ 或 $-1$)乘上预测值($\geq +1$ 或 $\leq -1$)必定是一个 $\geq 1$ 的数值。 100 | 101 | 看上去间隔大小只与 $\mathbf{w}$ 有关,但实际上位移项 $b$ 也通过约束影响着 $\mathbf{w}$ 的取值,进而对间隔产生影响。 102 | 103 | 由于最大化 $\Vert \mathbf{w} \Vert^{-1}$ 等价于最小化 $\Vert \mathbf{w} \Vert^{2}$,所以可以重写**目标函数**为: 104 | 105 | $$\min_{\mathbf{w},b} \frac{1}{2} \Vert \mathbf{w} \Vert^2 \quad s.t. \quad y_i(\mathbf{w}^T\mathbf{x}+b) \geq 1, \quad i=1,2,...,m\qquad(1)$$ 106 | 107 | 引入 $\frac{1}{2}$ 是为了求导时可以约去平方项的2,这便是**支持向量机的基本型**。 108 | 109 | 特别地,还有以下定义: 110 | 111 | **函数间隔**:$y_i(\mathbf{w}^T\mathbf{x}+b)$ 112 | 113 | **几何间隔**:$\frac{y_i(\mathbf{w}^T\mathbf{x}+b)}{\Vert \mathbf{w} \Vert^2}$ 114 | 115 | ## 对偶问题 116 | 117 | 式(1)是一个**带约束的凸二次规划(convex quadratic programming)问题**(凸问题就意味着必定能求到全局最优解,而不会陷入局部最优)。对这样一个问题,可以直接用现成的优化计算包求解,但这一小节介绍的是一种更高效的方法。 118 | 119 | 首先为式(1)的每条约束添加拉格朗日乘子 $a_i \geq 0$(对应m个样本的m条约束),得到该问题的拉格朗日函数: 120 | 121 | $$L(\mathbf{w},b,\mathbf{a}) = \frac{1}{2} \Vert \mathbf{w} \Vert^2 + \sum_{i=1}^m a_i(1-y_i(\mathbf{w}^T\mathbf{x}_i+b))\qquad(2)$$ 122 | 123 | 其中 $\mathbf{a} = (a_1;a_2;...;a_m)$,对拉格朗日函数求 $\mathbf{w}$ 和 $b$ 的偏导,并令偏导为0可以得到: 124 | 125 | $$\begin{split} 126 | \mathbf{w} &= \sum_{i=1}^m a_i y_i \mathbf{x}_i\qquad(3)\\ 127 | 0 &= \sum_{i=1}^m a_i y_i\qquad(4) 128 | \end{split}$$ 129 | 130 | 将式(3)代入式(2)可以消去 $\mathbf{w}$,又因为式(2)中 $b$ 的系数是 $a_i y_i$,由式(4)可知 $b$ 也可以消去。然后再考虑式(4)的约束就得到了式(1)的**对偶问题**(dual problem): 131 | 132 | $$\begin{split} 133 | \max_{\mathbf{a}} \sum_{i=1}^m a_i - \frac{1}{2} \sum_{i=1}^m\sum_{j=1}^m a_i a_j y_i y_j \mathbf{x}_i^T \mathbf{x}_j&\\ 134 | \text{s.t.} \sum_{i=1}^m a_i y_i &= 0, \quad a_i \geq 0, \quad i=1,2,...,m \qquad (5) 135 | \end{split}$$ 136 | 137 | 只要求出该对偶问题的解 $\mathbf{a}$,就可以推出 $\mathbf{w}$ 和 $b$,从而得到模型: 138 | 139 | $$\begin{split} 140 | f(\mathbf{x}) &= \mathbf{w}^T \mathbf{x} + b\\ 141 | &= \sum_{i=1}^m a_i y_i \mathbf{x}_i^T \mathbf{x} + b \qquad (6) 142 | \end{split}$$ 143 | 144 | 不过实际计算时一般不会直接求解 $\mathbf{a}$,特别是需要用核函数映射到高维空间时,因为映射后做内积很困难,而用少量支持向量进行表示,在原始空间进行计算显然更优,这点在后续章节会详细讲解。 145 | 146 | 注意,由于式(1)的约束条件是**不等式约束**,所以求解过程要求满足**KKT(Karush-Kuhn-Tucker)条件**: 147 | 148 | $$\left 149 | \{\begin{array} 150 | \\a_i \geq 0; 151 | \\y_i f(\mathbf{x}_i)-1 \geq 0; 152 | \\a_i (y_i f(\mathbf{x}_i)-1) = 0. 153 | \end{array} 154 | \right.$$ 155 | 156 | 这个KKT条件说明了,对任何一个样本 $\mathbf{x}_i$ 来说, 157 | 158 | - 要么对应的拉格朗日乘子 $a_i$ 为0,此时样本 $\mathbf{x}_i$ 对式(6)毫无贡献,不会影响到模型; 159 | - 要么函数间隔 $y_i f(\mathbf{x}_i) = 1$,此时样本 $\mathbf{x}_i$ 位于最大间隔边界上,是一个支持向量。 160 | 161 | 它揭示了SVM的一个重要性质:**最终模型只与支持向量有关,因此训练完成后,大部分的训练样本都不需保留**。 162 | 163 | #### SMO算法 164 | 165 | 可以发现对偶问题式(5)是一个二次规划问题,可以使用通用的二次规划算法求解。但**问题规模正比于样本数**,因此开销相当大。为了避免这个开销,可以使用高效的**SMO(Sequential Minimal Optimization)算法**。 166 | 167 | 初始化参数 $\mathbf{a}$ 后,SMO算法重复下面两个步骤直至收敛: 168 | 169 | 1. 选取一对需要更新的变量 $a_i$ 和 $a_j$ 170 | 2. 固定 $a_i$ 和 $a_j$ 以外的参数,求解对偶问题式(5)来更新 $a_i$ 和 $a_j$ 171 | 172 | **怎么选取 $a_i$ 和 $a_j$呢?** 173 | 174 | 注意到,只要选取的 $a_i$ 和 $a_j$ 中有一个不满足KKT条件,那么更新后目标函数的值就会增大。而且**违背KKT条件的程度越大,则更新后导致目标函数增幅就越大**。 175 | 176 | 因此,SMO算法**先选取一个违背KKT条件程度最大的变量 $a_i$**,然后再选一个使目标函数增长最快的变量 $a_j$,但由于找出 $a_j$ 的开销较大,所以SMO算法采用了一个**启发式**,使**选取的两变量对应的样本之间间隔最大**。这样两个变量差别很大,与选取两个相似变量相比,这种方法能为目标函数带来更大的变化,从而更快搜索到全局最大值。 177 | 178 | 由于SMO算法在每次迭代中,仅优化两个选定的参数,其他参数是固定的,所以会非常高效。此时,可将对偶问题式(5)的约束重写为: 179 | 180 | $$a_iy_i + a_jy_j = c,\quad a_i \geq 0, a_j \geq 0 \qquad (7)$$ 181 | 182 | 其中,$c = -\sum_{k \neq i,j} a_k y_k$ 看作是固定的常数。 183 | 184 | 利用式(7),我们可以把 $a_j$ 从式(5)中消去,这样就得到了一个**单变量二次规划问题**,只需考虑 $a_i \geq 0$ 这个约束。这样的问题具有**闭式解**,所以我们连数值优化方法都不需要了,可以直接算出 $a_i$ 和 $a_j$。 185 | 186 | 使用SMO算法计算出最优解之后,我们关注的是如何推出 $\mathbf{w}$ 和 $b$,从而得到最终模型。获得 $\mathbf{w}$ 很简单,直接用式(3)就可以了。而位移项 $b$ 则可以通过支持向量导出,因为对于任一支持向量 $(\mathbf{x}_s, y_s)$,都有函数间隔等于1,所以有: 187 | 188 | $$y_sf(\mathbf{x}) = y_s(\sum_{i \in S} a_i y_i \mathbf{x}_i^T \mathbf{x}_s + b)= 1 \qquad (8)$$ 189 | 190 | 这里的 $S$ 是所有支持向量的下标集(事实上,用所有样本的下标也行,不过非支持向量的拉格朗日乘子等于0,对求和没贡献,这一点前面已经提到了)。 191 | 192 | 理论上,我们只要选取任意一个支持向量代入式(8)就可以把 $b$ 算出来了。但实际任务中往往采用一种**更鲁棒**的做法:用所有支持向量求解的平均值。 193 | 194 | $$b = \frac{1}{|S|} \sum_{s \in S} (\frac{1}{y_s} - \sum_{i \in S}a_i y_i \mathbf{x}_i^T \mathbf{x}_s)$$ 195 | 196 | ## 核函数 197 | 198 | #### 如何处理非线性划分 199 | 200 | 在现实任务中,我们更常遇到的是**在原始样本空间中非线性可分**的问题。对这样的问题,一种常用的思路是将样本从原始空间映射到一个更高维的特征空间,使得样本在该特征空间中线性可分。幸运的是,**只要原始空间是有限维的(也即属性数目有限),那就必然存在一个高维特征空间使样本线性可分**。 201 | 202 | 举个例子,二维平面上若干样本点呈如下分布: 203 | 204 | ![map](https://my.csdn.net/uploads/201206/03/1338655829_6929.png) 205 | 206 | 此时要划分两类样本,需要一个非线性的圆型曲线。假设原始空间中两个属性是 $x$ 和 $y$,如果我们做一个映射,把样本点都映射到一个三维特征空间,维度取值分别为 $x^2$,$y^2$ 和 $y$,则得到下面的分布: 207 | 208 | ![map](https://my.csdn.net/uploads/201304/03/1364952814_3505.gif) 209 | 210 | 可以看到这个时候,我们只需要一个线性超平面就可以将两类样本完全分开了,也就是说可以用前面的方法来求解了。 211 | 212 | #### 什么是核函数 213 | 214 | 在上面的例子中,我们是把每个样本对应的二维的特征向量 $\mathbf{x}$ 映射为一个三维的特征向量,假设我们**用 $\phi(\mathbf{x})$ 来表示映射所得的特征向量**。则**在映射的高维特征空间中**,用于划分的线性超平面可以表示为: 215 | 216 | $$f(\mathbf{x}) = \mathbf{w}^T \phi(\mathbf{x}) + b$$ 217 | 218 | 类似式(1),可以得到此时的目标函数为: 219 | 220 | $$\min_{\mathbf{w},b} \frac{1}{2} \Vert \mathbf{w} \Vert^2 \quad s.t. \quad y_i(\mathbf{w}^T\phi(\mathbf{x})+b) \geq 1, \quad i=1,2,...,m\qquad(9)$$ 221 | 222 | 对应的对偶问题为: 223 | 224 | $$\max_{\mathbf{a}} \sum_{i=1}^m a_i - \frac{1}{2} \sum_{i=1}^m\sum_{j=1}^m a_i a_j y_i y_j \phi(\mathbf{x}_i)^T \phi(\mathbf{x}_j) \quad s.t. \quad \sum_{i=1}^m a_i y_i = 0, \quad a_i \geq 0, \quad i=1,2,...,m \qquad (10)$$ 225 | 226 | 注意到对偶问题中,涉及到 $\phi(\mathbf{x}_i)^T \phi(\mathbf{x}_j)$ 的计算,也即 $x_i$ 和 $x_j$ 映射到高维特征空间后的内积(比如 $x_i = (1,2,3)$,$x_j = (4,5,6)$,那么内积 $x_i^Tx_j$ 就等于 $1*4+2*5+3*6=32$),由于**特征空间维数可能很高**,所以**直接计算映射后特征向量的内积是很困难的**,如果映射后的特征空间是无限维,根本无法进行计算。 227 | 228 | 为了解决这样的问题,就引入了**核函数(kernel function)**。 229 | 230 | 打个比方,假设输入空间是二维的,每个样本点有两个属性 $x$ 和 $y$,存在映射将每个样本点映射到三维空间: 231 | 232 | $$\phi(\mathbf{x}) = \phi(x, y) = (x^2, \sqrt{2}xy, y^2)$$ 233 | 234 | 给定原始空间中的两个样本点 $\mathbf{v}_1=(x_1,y_1)$ 和 $\mathbf{v}_2=(x_2,y_2)$,则它们映射到高维特征空间后的内积可以写作: 235 | 236 | $$\begin{split} 237 | \quad \phi(\mathbf{v}_1)^T \phi(\mathbf{v}_2) &= <\phi(\mathbf{v}_1),\phi(\mathbf{v}_2)>\\ 238 | &=<(x_1^2, \sqrt{2}x_1y_1, y_1^2),(x_2^2, \sqrt{2}x_2y_2, y_2^2)>\\ 239 | &= x_1^2x_2^2 + 2x_1x_2y_1y_2 + y_1^2y_2^2\\ 240 | &= (x_1x_2 + y_1y_2)^2\\ 241 | &= <\mathbf{v}_1,\mathbf{v}_2>^2\\ 242 | &= \kappa(\mathbf{v}_1,\mathbf{v}_2)\\ 243 | \end{split}$$ 244 | 245 | 可以看到在这个例子里,高维特征空间中两个点的内积,可以写成一个**关于原始空间中两个点的函数** $\kappa(\cdot;\cdot)$,这就是核函数。 246 | 247 | 特别地,上面的例子中,映射用的是**多项式核**,多项式的次数 $d$ 取2。 248 | 249 | #### 为什么需要核函数 250 | 251 | 这里的例子为了计算方便,映射的空间维数依然很低,这里稍微解释一下**为什么需要核函数**?假设原始空间是二维的,那么对于两个属性 $x$ 和 $y$,取一阶二阶的组合只有5个(也即 $x^2$,$y^2$,$x$,$y$,$xy$)。但当原始空间是三维的时候,仍然取一阶二阶,组合就多达19个了(也即 $x$,$y$,$z$,$xy$,$xz$,$yz$,$x^2y$,$x^2z$,$y^2x$,$y^2z$,$z^2x$,$z^2y$,$x^2yz$,$xy^2z$,$xyz^2$,$x^2y^2z$,$x^2yz^2$,$xy^2z^2$,$xyz$)。**随着原始空间维数增长,新空间的维数是呈爆炸性上升的**。何况现实中我们遇到的问题的原始空间往往本来就已经是高维的,如果再进行映射,新特征空间的维度是难以想象的。 252 | 253 | 然而有了核函数,我们就可以在原始空间中通过函数 $\kappa(\cdot;\cdot)$ 计算(这称为**核技巧(kernel trick)**),而**不必直接计算高维甚至无穷维特征空间中的内积**。 254 | 255 | 使用核函数后,对偶问题式(10)可以重写为: 256 | 257 | $$\max_{\mathbf{a}} \sum_{i=1}^m a_i - \frac{1}{2} \sum_{i=1}^m\sum_{j=1}^m a_i a_j y_i y_j \kappa(\mathbf{x}_i;\mathbf{x}_j) \quad s.t. \quad \sum_{i=1}^m a_i y_i = 0, \quad a_i \geq 0, \quad i=1,2,...,m \qquad (11)$$ 258 | 259 | 求解后得到的模型可以表示为: 260 | 261 | $$\begin{split} 262 | f(\mathbf{x}) &= \mathbf{w}^T \phi(\mathbf{x}) + b\\ 263 | & = \sum_{i=1}^m a_i y_i \phi(\mathbf{x}_i)^T \phi(\mathbf{x}) + b\\ 264 | & = \sum_{i=1}^m a_i y_i \kappa(\mathbf{x}_i;\mathbf{x}) + b 265 | \end{split}$$ 266 | 267 | 这条式子表明了**模型最优解可通过训练样本的核函数展开**,称为**支持向量展式(support vector expansion)**。 268 | 269 | 在需要对新样本进行预测时,我们**无需把新样本映射到高维(甚至无限维)空间**,而是可以**利用保存下来的训练样本(支持向量)和核函数 $\kappa$ 进行求解**。 270 | 271 | 注意,**核函数本身不等于映射!!!**它只是一个与**计算两个数据点映射到高维空间之后的内积**等价的函数。 272 | 当我们发现数据在原始空间线性不可分时,会有把数据映射到高维空间来实现线性可分的想法,比方说引入原有属性的幂或者原有属性之间的乘积作为新的维度。假设我们把数据点都映射到了一个维数很高甚至无穷维的特征空间,而**模型求解和预测的过程需要用到映射后两个数据点的内积**,这时直接计算就没辙了。但我们又幸运地发现,原来**高维空间中两点的内积在数值上等于原始空间通过某个核函数算出的函数值**,无需先映射再求值,就很好地解决了计算的问题了。 273 | 274 | #### 核函数的性质 275 | 276 | **核函数定理**:给定一个输入空间 $\mathcal{X}$,函数 $\kappa(\cdot;\cdot)$ 是定义在 $\mathcal{X} \times \mathcal{X}$ 上的**对称函数**。当且仅当对于任意数据集 $D = \{\mathbf{x}_1,\mathbf{x}_2,...,\mathbf{x}_m\}$, 对应的**核矩阵(kernel matrix)**都是半正定的时候,$\kappa$ 是核函数。 277 | 278 | 核矩阵是一个规模为 $m \times m$ 的函数矩阵,每个元素都是一个函数,比如第 $i$ 行 $j$ 列的元素是 $\kappa(\mathbf{x}_i,\mathbf{x}_j)$。也即是说,**任何一个核函数都隐式地定义了一个称为“再生核希尔伯特空间(Reproducing Kernel Hilbert Space,简称RKHS)”的特征空间**。 279 | 280 | 做映射的初衷是希望**样本在新特征空间上线性可分**,新特征空间的好坏直接决定了支持向量机的性能,但是我们并**不知道怎样的核函数是合适的**。一般来说有以下几种常用核函数: 281 | 282 | | 名称 | 表达式 | 参数 | 283 | |:-:|:-:|:-:| 284 | | 线性核 | $\kappa(\mathbf{x}_i,\mathbf{x}_j)=\mathbf{x}_i^T\mathbf{x}_j$ |-| 285 | | 多项式核 | $\kappa(\mathbf{x}_i,\mathbf{x}_j)=(\mathbf{x}_i^T\mathbf{x}_j)^d$ | $d \geq 1$为多项式的次数,d=1时退化为线性核 | 286 | | 高斯核(亦称RBF核) | $\kappa(\mathbf{x}_i,\mathbf{x}_j)=\exp (-\frac{\Vert \mathbf{x}_i-\mathbf{x}_j \Vert ^2}{2\sigma^2})$ | $\sigma>0$ 为高斯核的带宽(width) | 287 | | 拉普拉斯核 | $\kappa(\mathbf{x}_i,\mathbf{x}_j)=\exp (-\frac{\Vert \mathbf{x}_i-\mathbf{x}_j \Vert}{\sigma})$| $\sigma>0$ | 288 | | Sigmoid核 | $\kappa(\mathbf{x}_i,\mathbf{x}_j)=\tanh(\beta \mathbf{x}_i^T\mathbf{x}_j+\theta)$ | $tanh$ 为双曲正切函数,$\beta>0,\theta<0$ | 289 | 290 | 特别地,**文本数据一般用线性核**,**情况不明可尝试高斯核**。 291 | 292 | 除了这些常用的核函数,要**产生核函数还可以使用组合的方式**: 293 | 294 | - 若 $\kappa_1$ 和 $\kappa_2$ 都是核函数,则 $a\kappa_1+b\kappa_2$ 也是核函数,其中 $a>0,b>0$。 295 | 296 | - 若 $\kappa_1$ 和 $\kappa_2$ 都是核函数,则其直积 $\kappa_1 \otimes \kappa_2(\mathbf{x},\mathbf{z}) = \kappa_1(\mathbf{x},\mathbf{z})\kappa_2(\mathbf{x},\mathbf{z})$ 也是核函数。 297 | 298 | - 若 $\kappa_1$ 是核函数,则对于任意函数 $g(\mathbf{x})$,$\kappa(\mathbf{x},\mathbf{z}) = g(\mathbf{x}) \kappa_1(\mathbf{x},\mathbf{z}) g(\mathbf{z})$ 也是核函数。 299 | 300 | ## 软间隔与正则化 301 | 302 | 上一节中,通过利用核函数映射来解决非线性可分的问题,但现实中很难找到合适的核函数,即使某个核函数能令训练集在新特征空间中线性可分,也难保这不是**过拟合**造成的结果。 303 | 304 | ![overfitting](http://blog.pluskid.org/wp-content/uploads/2010/09/Optimal-Hyper-Plane-2.png) 305 | 306 | 比方说上面这张图,黑色虚线是此时的划分超平面,最大间隔很小。但事实上,黑色圆圈圈起的蓝点是一个 **outlier**,可能是噪声的原因,它**偏离了正确的分布**。而训练模型时,我们并没有考虑这一点,这就导致**把训练样本中的 outlier当成数据的真实分布拟合了**,也即过拟合。 307 | 308 | 但当我们**允许这个 outlier 被误分类**时,得到的划分超平面可能就如图中深红色线所示,此时的最大间隔更大,预测新样本时误分类的概率也会降低很多。 309 | 310 | **在实际任务中,outlier 的情况可能更加严重**。比方说,如果图中的 outlier 再往右上移动一些距离的话,我们甚至会**无法构造出一个能将数据划分开的超平面**。 311 | 312 | 缓解该问题的一个思路就是**允许支持向量机在一些样本上出错**,为此,引入**软间隔(soft margin)**的概念。软间隔是相对于**硬间隔(hard margin)**的一个概念,**硬间隔要求所有样本都必须划分正确**,也即约束: 313 | 314 | $$y_i(\mathbf{w}^T\mathbf{x}_i+b) \geq 1$$ 315 | 316 | 软间隔则**允许某些样本不满足约束**(根据约束条件的不同,有可能某些样本出现在间隔内,甚至被误分类)。此时目标函数可以重写为: 317 | 318 | $$\min_{\mathbf{w},b} \frac{1}{2} \Vert \mathbf{w} \Vert^2 + C \sum_{i=1}^m \ell_{0/1}(y_i(\mathbf{w}^T\mathbf{x}+b)-1) \qquad (12)$$ 319 | 320 | 其中 $\ell_{0/1}$ 是**0/1损失函数**: 321 | 322 | $$\ell_{0/1}(z)= 323 | \left 324 | \{\begin{array} 325 | \\1, \quad if\ z<0; 326 | \\0, \quad otherwise. 327 | \end{array} 328 | \right.$$ 329 | 330 | 它的含义很简单:如果分类正确,那么函数间隔必定大于等于1,此时损失为0;如果分类错误,那么函数间隔必定小于等于-1,此时损失为1。 331 | 332 | 而 $C$ 则是一个大于0的常数,当 $C$ 趋于无穷大时,式(12)等效于带约束的式(1),因为此时对误分类的惩罚无限大,也即要求全部样本分类正确。**当 $C$ 取有限值时,允许某些样本分类错误**。 333 | 334 | 由于**0/1损失函数是一个非凸不连续函数**,所以式(12)难以求解,于是在实际任务中,我们采用一些**凸的连续函数**来取替它,这样的函数就称为**替代损失(surrogate loss)函数**。 335 | 336 | 最常用的有以下三种: 337 | 338 | - hinge损失:$\ell_{hinge}(z) = \max (0,1-z)$ 339 | 340 | - 指数损失(exponential loss):$\ell_{\exp}(z) = \exp (-z)$ 341 | 342 | - 对率损失(logistic loss):$\ell_{\log}(z) = \log (1+\exp (-z) )$ 343 | 344 | 不妨作图观察比较一下这些损失函数(code文件夹下有[实现代码](https://github.com/familyld/Machine_Learning/blob/master/code/DrawLossFunction.py)): 345 | 346 | ![loss function](https://github.com/familyld/Machine_Learning/blob/master/graph/LossFunction.png?raw=true) 347 | 348 | 这里有个问题是,书中提到对率损失中 $\log$ 指 $\ln$,也即底数为自然对数,但这种情况下对率损失在 $z=0$ 处不为1,而是0.693。但是书中的插图里,对率损失经过 $(0,1)$ 点,此时底数应为2,**上面的插图就是按底数为2计算的**。 349 | 350 | 实际任务中**最常用的是hinge损失**,这里就以hinge损失为例,替代0/1损失函数,此时目标函数式(12)可以重写为: 351 | 352 | $$\min_{\mathbf{w},b} \frac{1}{2} \Vert \mathbf{w} \Vert^2 + C \sum_{i=1}^m \max(0, 1-y_i(\mathbf{w}^T\mathbf{x}+b)) \qquad (13)$$ 353 | 354 | 引入**松弛变量(slack variables)** $\xi_i \geq 0$,可以把式(13)重写为: 355 | 356 | $$\min_{\mathbf{w},b} \frac{1}{2} \Vert \mathbf{w} \Vert^2 + C \sum_{i=1}^m \xi_i \quad s.t. \quad y_i(\mathbf{w}^T\mathbf{x}+b) \geq 1-\xi_i, \quad \xi_i \geq 0, \quad i=1,2,...,m \qquad (14)$$ 357 | 358 | 该式描述的就是**软间隔支持向量机**,其中每个样本都对应着一个松弛变量,用以**表示该样本误分类的程度**,松弛变量的值越大,程度越高。 359 | 360 | #### 求解软间隔支持向量机 361 | 362 | 式(14)仍然是一个二次规划问题,类似于前面的做法,分以下几步: 363 | 364 | 1. 通过拉格朗日乘子法把 $m$ 个约束转换 $m$ 个拉格朗日乘子,得到该问题的拉格朗日函数。 365 | 366 | 2. 分别对 $\mathbf{w}, b, \xi$ 求偏导,代入拉格朗日函数得到对偶问题。 367 | 368 | 3. 使用SMO算法求解对偶问题,解出所有样本对应的拉格朗日乘子。 369 | 370 | 4. 需要进行新样本预测时,使用支持向量及其对应的拉格朗日乘子进行求解。 371 | 372 | 特别地,因为式(14)有**两组各 $m$ 个不等式约束**,所以该问题的拉格朗日函数有 $a_i \geq 0$ 和 $\mu_i \geq 0$ 两组拉格朗日乘子。特别地,对松弛变量 $\xi$ 求导,令导数为0会得到一条约束式: 373 | 374 | $$C = a_i + \mu_i \qquad (15)$$ 375 | 376 | 有意思的是,**软间隔支持向量机的对偶问题和硬间隔几乎没有不同**,只是约束条件修改了一下: 377 | 378 | $$\max_{\mathbf{a}} \sum_{i=1}^m a_i - \frac{1}{2} \sum_{i=1}^m\sum_{j=1}^m a_i a_j y_i y_j \mathbf{x}_i^T \mathbf{x}_j \quad s.t. \quad \sum_{i=1}^m a_i y_i = 0, \quad 0 \leq a_i \leq C, \quad i=1,2,...,m \qquad (16)$$ 379 | 380 | 这里的 $a_i$ 不仅要求大于等于0,还要求小于等于 $C$。 381 | 382 | 类似地,由于式(14)的约束条件是**不等式约束**,所以求解过程要求满足**KKT(Karush-Kuhn-Tucker)条件**: 383 | 384 | $$\left 385 | \{\begin{array} 386 | \\a_i \geq 0; 387 | \\\mu_i \geq 0; 388 | \\y_i f(\mathbf{x}_i)-1+\xi_i \geq 0; 389 | \\a_i (y_i f(\mathbf{x}_i)-1+\xi_i) = 0; 390 | \\\xi_i \geq 0; 391 | \\\mu_i\xi_i = 0. 392 | \end{array} 393 | \right.$$ 394 | 395 | KKT条件可以理解为下面几点: 396 | 397 | - 对任意训练样本, 398 | - 要么对应的拉格朗日乘子 $a_i=0$; 399 | - 要么函数间隔等于1和对应的松弛变量之差($y_i(\mathbf{w}^T\mathbf{x}+b) = 1-\xi_i$)。 400 | 401 | - 如果一个样本的拉格朗日乘子 $a_i=0$,则它对模型没有任何影响,不需要保留。 402 | 403 | - 如果一个样本的拉格朗日乘子大于0,则它是支持向量。 404 | 405 | - 如果拉格朗日乘子 $a_i$ 小于 $C$,按照式(15)有 $\mu_i>0$,
因此松弛变量 $\xi_i=0$,此时函数间隔为1,样本落在最大间隔边界上。 406 | - 如果拉格朗日乘子 $a_i$ 等于 $C$,按照式(15)有 $\mu_i=0$,因此松弛变量 $\xi_i>0$。 407 | - 若 $\xi_i<1$,则样本落在间隔内,但依然被正确分类。 408 | - 若 $\xi_i>1$,则样本落在另一个类的间隔外,被错误分类 409 | 410 | ![KKT](https://www.researchgate.net/profile/Lang_Tran2/publication/327015448/figure/fig2/AS:659696117633025@1534295219130/SVM-with-soft-margin-kernel-with-different-cases-of-slack-variables.png) 411 | 412 | 上图就展示了一个典型的软间隔支持向量机。图中就有一些异常点,这些点有的虽然在虚线与超平面之间($0 < y_i(\mathbf{w}^T\mathbf{x}+b) < 1$),但也能被正确分类(比如 $\mathbf{x}_3$)。有的点落到了超平面的另一侧,就会被误分类(比如 $\mathbf{x}_4$ h和 $\mathbf{x}_5$)。 413 | 414 | 特别地,在 R. Collobert. 的论文 [Large Scale Machine Learning](http://ronan.collobert.com/pub/matos/2004_phdthesis_lip6.pdf) 中提到,**常数 $C$ 一般取训练集大小的倒数**($C = \frac{1}{m}$)。 415 | 416 | #### 支持向量机和逻辑回归的联系与区别 417 | 418 | 上面用的是hinge损失,不过我们也提到了还有其他一些替代损失函数,事实上,使用对率损失时,SVM得到的模型和LR是非常类似的。 419 | 420 | 支持向量机和逻辑回归的**相同点**: 421 | 422 | - 都是线性分类器,模型求解出一个划分超平面; 423 | - 两种方法都可以增加不同的正则化项; 424 | - 通常来说性能相当。 425 | 426 | 支持向量机和逻辑回归的**不同点**: 427 | 428 | - LR使用对率损失,SVM一般用hinge损失; 429 | 430 | - 在LR的模型求解过程中,每个训练样本都对划分超平面有影响,影响力随着与超平面的距离增大而减小,所以说**LR的解受训练数据本身的分布影响**;SVM的模型只与占训练数据少部分的支持向量有关,所以说,**SVM不直接依赖数据分布**,所得的划分超平面不受某一类点的影响; 431 | 432 | - 如果数据**类别不平衡**比较严重,LR需要先做相应处理再训练,SVM则不用; 433 | 434 | - SVM依赖于**数据表达的距离测度**,需要先把数据**标准化**,LR则不用(但实际任务中可能会为了方便选择优化过程的初始值而进行标准化)。如果数据的距离测度不明确(特别是高维数据),那么最大间隔可能就变得没有意义; 435 | 436 | - LR的输出有**概率意义**,SVM的输出则没有; 437 | 438 | - LR可以直接用于**多分类任务**,SVM则需要进行扩展(但更常用one-vs-rest); 439 | 440 | - LR使用的对率损失是光滑的单调递减函数,**无法导出支持向量**,解依赖于所有样本,因此预测开销较大;SVM使用的hinge损失有“零区域”,因此**解具有稀疏性**(书中没有具体说明这句话的意思,但按我的理解是解出的拉格朗日乘子 $\mathbf{a}$ 具有稀疏性,而不是权重向量 $\mathbf{w}$),从而不需用到所有训练样本。 441 | 442 | 在实际运用中,LR更常用于大规模数据集,速度较快;SVM适用于规模小,维度高的数据集。 443 | 444 | 在 Andrew NG 的课里讲到过: 445 | 446 | 1. 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM; 447 | 448 | 2. 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel; 449 | 450 | 3. 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况。 451 | 452 | #### 正则化 453 | 454 | 事实上,无论使用何种损失函数,SVM的目标函数都可以描述为以下形式: 455 | 456 | $$\min_f \Omega(f) + C \sum_{i=1}^m \ell(f(\mathbf{x}_i), y_i) \qquad (17)$$ 457 | 458 | 在SVM中第一项用于描述划分超平面的“间隔”的大小,第二项用于描述在训练集上的误差。 459 | 460 | 更一般地,第一项称为**结构风险(structural risk)**,用来描述**模型的性质**。第二项称为**经验风险(empirical risk)**,用来描述**模型与训练数据的契合程度**。参数 $C$ 用于权衡这两种风险。 461 | 462 | 前面学习的模型大多都是在最小化经验风险的基础上,再考虑结构风险(避免过拟合)。**SVM却是从最小化结构风险来展开的**。 463 | 464 | 从最小化经验风险的角度来看,$\Omega(f)$ 表述了我们希望得到具有何种性质的模型(例如复杂度较小的模型),为引入领域知识和用户意图提供了路径(比方说贝叶斯估计中的先验概率)。 465 | 466 | 另一方面,$\Omega(f)$ 还可以帮我们削减假设空间,从而降低模型过拟合的风险。从这个角度来看,可以称 $\Omega(f)$ 为**正则化(regularization)项**,$C$ 为正则化常数。正则化可以看作一种**罚函数法**,即对不希望出现的结果施以惩罚,从而使优化过程趋向于期望的目标。 467 | 468 | $L_p$ 范数是常用的正则化项,其中 $L_2$ 范数 $\Vert \mathbf{w} \Vert_2$ 倾向于 $\mathbf{w}$ 的分量取值尽量稠密,即非零分量个数尽量多; $L_0$ 范数 $\Vert \mathbf{w} \Vert_0$ 和 $L_1$ 范数 $\Vert \mathbf{w} \Vert_1$ 则倾向于 $\mathbf{w}$ 的分量取值尽量稀疏,即非零分量个数尽量少。 469 | 470 | ## 支持向量回归 471 | 472 | 同样是利用线性模型 $f(\mathbf{x}) = \mathbf{w}^T\mathbf{x}+b$ 473 | 来预测,回归问题希望预测值和真实值 $y$ 尽可能相近,而不是像分类任务那样,旨在令不同类的预测值可以被划分开。 474 | 475 | 传统的回归模型计算损失时直接取真实值和预测值的差,**支持向量回归(Support Vector Regression,简称SVR)**则不然。SVR假设我们能容忍最多有 $\epsilon$ 的偏差,**只有当真实值和预测值之间相差超出了 $\epsilon$ 时才计算损失**。 476 | 477 | ![SVR](http://www.saedsayad.com/images/SVR_2.png) 478 | 479 | 如图所示,以SVR拟合出的直线为中心,两边各构建出一个宽度为 $\epsilon$ 的地带,落在这个**宽度为 $2\epsilon$ 的间隔带**内的点都被认为是预测正确的。 480 | 481 | 因此,问题可以形式化为目标函数: 482 | 483 | $$\min_{\mathbf{w},b} \frac{1}{2} \Vert \mathbf{w} \Vert^2 + C \sum_{i=1}^m \ell_{\epsilon}(f(\mathbf{x}_i) - y_i) \qquad (18)$$ 484 | 485 | 其中 $C$ 为正则化常数, $\ell_{\epsilon}$ 称为 **$\epsilon-$不敏感损失($\epsilon-$insensitive loss)**函数。定义如下: 486 | 487 | $$\ell_{、epsilon}(z)= 488 | \left 489 | \{\begin{array} 490 | \\0, \quad if\ |z| \leq \epsilon; 491 | \\|z|-\epsilon, \quad otherwise. 492 | \end{array} 493 | \right.$$ 494 | 495 | 引入松弛变量 $\xi_i$ 和 $\hat{\xi}_i$,分别表示**间隔带两侧的松弛程度**,它们**可以设定为不同的值**。此时,目标函数式(18)可以重写为: 496 | 497 | $$\min_{\mathbf{w},b} \frac{1}{2} \Vert \mathbf{w} \Vert^2 + C \sum_{i=1}^m (\xi_i + \hat{\xi}_i) \qquad (19)\\ 498 | s.t.\ f(\mathbf{x}_i) - y_i \leq \epsilon + \xi_i,\\ 499 | \qquad \quad y_i - f(\mathbf{x}_i) \leq \epsilon + \xi_i\\ 500 | \qquad \qquad \qquad \xi_i \geq 0, \hat{\xi}_i \geq 0, i=1,2,...,m. 501 | $$ 502 | 503 | 注意这里有四组 $m$ 个约束条件,所以对应地有四组拉格朗日乘子。 504 | 505 | 接下来就是用拉格朗日乘子法获得问题对应的拉格朗日函数,然后求偏导再代回拉格朗日函数,得到对偶问题。然后使用SMO算法求解拉格朗日乘子,最后得到模型,这里不一一详述了。 506 | 507 | 特别地,**SVR中同样有支持向量的概念**,解具有稀疏性,所以训练好模型后不需保留所有训练样本。此外,SVR同样可以通过引入核函数来获得拟合非线性分布数据的能力。 508 | 509 | ## 核方法 510 | 511 | 无论是SVM还是SVR,如果不考虑偏置项b,我们会发现模型总能表示为核函数的线性组合。更一般地,存在**表示定理(representer theorem)**: 512 | 513 | 令 $\mathbb{H}$ 为核函数 $\kappa$ 对应的再生希尔伯特空间, $\Vert h \Vert_{\mathbb{H}}$ 表示 $\mathbb{H}$ 空间中关于 $h$ 的范数,对于任意**单调递增**函数 $\Omega:[0,\infty] \longmapsto \mathbb{R}$ 和任意**非负**损失函数 $\ell:\mathbb{R}^m \longmapsto [0,\infty]$,优化问题 514 | 515 | $$min_{h \in \mathbb{H}} F(h) = \Omega(\Vert h \Vert_\mathbb{H}) + \ell(h(\mathbf{x}_1,h(\mathbf{x}_2,...,h(\mathbf{x}_m)) \qquad (20)$$ 516 | 517 | 的解总可写为: 518 | 519 | $$h^x(\mathbf{x}) = \sum_{i=1}^m a_i \kappa(\mathbf{x},\mathbf{x}_i)$$ 520 | 521 | 这个定理表明,对于形如式(20),旨在最小化损失和正则化项之和的优化问题,解都可以表示为核函数的线性组合。 522 | 523 | 基于核函数的学习方法,统称为**核方法(kernal methods)**。最常见的就是通过**核化**(引入核函数),将线性学习器扩展为非线性学习器。这不仅限于SVM,事实上LR和LDA也都可以采用核函数,只是SVM使用hinge损失,解具有稀疏性所以用得更多。 524 | 525 | 书中还介绍了如何核化LDA,这部分不作详细记录了。 526 | 527 | ## 习题 528 | 529 | #### 6.1 530 | 531 | > 问:试证明样本空间中任一点$\mathbf{x}$到超平面的距离公式。 532 | 533 | 534 | #### 6.2 535 | 536 | > 问:试使用LIBSVM,在西瓜数据集3.0$a$上分别用线性核和高斯核训练一个SVM,并比较其支持向量的差别。 537 | 538 | 539 | #### 6.3 540 | 541 | > 问:选择两个UCI数据集,分别用线性核和高斯核训练一个SVM,并与BP神经网络和C4.5决策树进行实验比较。 542 | 543 | 544 | #### 6.4 545 | 546 | > 问:试讨论线性判别分析与线性核支持向量机在何种条件下等价。 547 | 548 | 549 | #### 6.5 550 | 551 | > 问:试述高斯核SVM与RBF神经网络之间的联系。 552 | 553 | 554 | #### 6.6 555 | 556 | > 问:试析SVM对噪声敏感的原因。 557 | 558 | 559 | #### 6.7 560 | 561 | > 问:试给出式(6.52)的完整KKT条件。 562 | 563 | 564 | #### 6.8 565 | 566 | > 问:以西瓜数据集3.0$a$的“密度”为输入,“含糖率”为输出,试使用LIBSVM训练一个SVR。 567 | 568 | 569 | #### 6.9 570 | 571 | > 问:是使用核技巧推广对率回归,产生“核对率回归”。 572 | 573 | 574 | #### 6.10* 575 | 576 | > 问:试设计一个能显著减少SVM中支持向量的数目而不显著降低泛化性能的方法。 577 | 578 | 579 | 分享一些蛮不错的问题和讲解,我在笔记中参考了部分内容: 580 | 581 | - [支持向量机(SVM)是什么意思?](https://www.zhihu.com/question/21094489) 582 | - [支持向量机中的函数距离和几何距离怎么理解?](https://www.zhihu.com/question/20466147) 583 | - [几何间隔为什么是离超平面最近的点到超平面的距离?](https://www.zhihu.com/question/30217705) 584 | - [支持向量机(support vector machine)--模型的由来](http://blog.csdn.net/zhangping1987/article/details/21931663) 585 | - [SMO优化算法(Sequential minimal optimization)](http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html) 586 | - [机器学习有很多关于核函数的说法,核函数的定义和作用是什么?](https://www.zhihu.com/question/24627666) 587 | - [Linear SVM 和 LR 有什么异同?](https://www.zhihu.com/question/26768865) 588 | - [SVM与LR的比较](http://www.mamicode.com/info-detail-1442931.html) 589 | - [SVM计算最优分类超平面时是否使用了全部的样本数据?](https://www.zhihu.com/question/46862433) 590 | - [现在还有必要对SVM深入学习吗?](https://www.zhihu.com/question/41066458) 591 | - [SVM的核函数如何选取?](https://www.zhihu.com/question/21883548) 592 | - [支持向量机通俗导论(理解SVM的三层境界)](http://blog.csdn.net/v_july_v/article/details/7624837) 593 | -------------------------------------------------------------------------------- /07Bayes_classifier.md: -------------------------------------------------------------------------------- 1 | # 贝叶斯分类器 2 | 3 | **贝叶斯分类器(Bayes Classifier)**是一种通过最大化后验概率进行单点估计的分类器。 4 | 5 | 这一章的内容大致如下: 6 | 7 | - **贝叶斯决策论**:如何计算某个样本误分类的期望损失/条件风险?贝叶斯判定准则是怎样的?什么是判别式模型?什么是生成式模型?贝叶斯定理中各个概率代表什么?估计后验概率有什么难处? 8 | 9 | - **极大似然估计**:如何估计类条件概率?频率学派和贝叶斯学派对参数估计有什么不同的见解?极大似然估计的思想是什么?如何处理概率连成造成的下溢?试想一下连续属性和离散属性的极大似然估计。这种估计方法有什么缺点? 10 | 11 | - **朴素贝叶斯分类器**:朴素贝叶斯分类器是基于什么假设的?表达式怎么写?为什么估计概率值时需要进行平滑?拉普拉斯修正是怎样的?现实任务中中如何使用朴素贝叶斯分类器? 12 | 13 | - **半朴素贝叶斯分类器**:半朴素贝叶斯分类器是基于什么假设的?什么是独依赖估计?独依赖分类器有哪些学习方法?AODE有什么优点?是否可以通过考虑属性之间的高阶依赖来进一步提升模型的泛化性能? 14 | 15 | - **贝叶斯网络**:什么是贝叶斯网络?它的结构是怎样的?如何进行模型的学习?如何对新样本进行推断? 16 | 17 | - **EM算法**:什么是隐变量?EM算法的步骤是怎样的?和梯度下降有什么不同? 18 | 19 | ## 贝叶斯决策论 20 | 21 | **贝叶斯决策论(Bayesian decision theory)**是概率框架下实施决策的基本方法。具体来说,在分类任务中,贝叶斯决策论基于概率和误判损失选择出最优的类别标记。 22 | 23 | 以多分类任务为例,假设有 $N$ 种标记,即 $\mathcal{Y} = {c_1, c_2,..., c_N}$,用 $\lambda_{ij}$ 表示把一个真实标记为 $c_i$ 的样本误分类为 $c_j$ 所产生的损失。那么将样本 $\mathbf{x}$ 分类为 $c_i$ 的**期望损失(expected loss)**或者说,在样本 $\mathbf{x}$ s上的**条件风险(conditional risk)**: 24 | 25 | $$ R(c_i | \mathbf{x}) = \sum_{j=1}^N \lambda_{ij} P(c_j | \mathbf{x})$$ 26 | 27 | 它描述的是,给定一个样本 $\mathbf{x}$,把它分类为 $c_i$ 需要冒多大的风险。或者说,当样本真实标记不是 $c_i$ 时,会有多大的损失。这个损失是一个求和,每一个求和项都是某一类别的后验概率和对应误分类损失的积。(**注**:书中这个地方不够细致,求和项的下标是要排除 $i$ 本身的) 28 | 29 | 在单个样本条件风险的基础上,可以定义**总体风险**: 30 | 31 | $$ R(h) = \mathbb{E}_{\mathbf{x}}[R(h(\mathbf{x})\ |\ \mathbf{x})]$$ 32 | 33 | 它描述的是,**所有样本的条件风险的数学期望**。其中 $h$ 是一种用于产生分类结果的判断准则。 34 | 35 | 那么我们的目标就是找出能最小化总体风险 $R(h)$ 的判断准则。怎样的判断准则能满足这个要求呢?很直观地,如果一个判断准则 $h$ 能最小化所有样本 $\mathbf{x}$ 的条件风险,那它对应的总体风险必然也是最小的。由此,可以得到**贝叶斯判定准则(Bayes decision rule)**:要最小化总体风险,只需**在每个样本上选择能使对应的条件风险 $R(c\ |\ \mathbf{x})$ 最小的标记**。即: 36 | 37 | $$h^*(\mathbf{x}) = \arg \min_{c \in \mathcal{Y}} R(c\ |\ \mathbf{x})$$ 38 | 39 | 这个判断准则 $h^*$ 称为**贝叶斯最优分类器(Bayes optimal classifier)**,对应的总体风险 $R(h^*)$ 称为**贝叶斯风险(Bayes risk)**,而 $1-R(h^*)$ 则反映了分类器所能达到的最好性能,也即**模型精度的理论上限**。 40 | 41 | 进一步地,如果我们学习模型的目标是**令分类错误率最小**,那么分类正确时误分类损失 $\lambda_{ij}$ 为0,反之为1。这是条件风险就是: 42 | 43 | $$R(c\ |\ \mathbf{x}) = 1-P(c\ |\ \mathbf{x})$$ 44 | 45 | 要令风险最小,我们只需要选择使样本 $\mathbf{x}$ 后验概率最大的一个类别标记就可以了。 46 | 47 | 问题在于,**怎样获取后验概率呢?** 48 | 49 | 事实上,从概率的角度来理解,机器学习的目标就是**基于有限的训练样本集尽可能准确地估计出后验概率**(当然,大多数机器学习技术无需准确估计出后验概率)。要实现这个目标,主要有两种策略: 50 | 51 | - 构建**判别式模型(discriminative models)**:给定样本 $\mathbf{x}$,直接对后验概率 $P(\mathbf{x}\ |\ c)$ 建模来预测 $c$。这类模型包括决策树、BP神经网络、支持向量机等等。 52 | 53 | - 构建**生成式模型(generative models)** :给定样本 $\mathbf{x}$,先对联合概率分布 $P(\mathbf{x},c)$ 建模,然后再利用联合概率计算出后验概率 $P(c\ |\ \mathbf{x})$,也即 $P(c\ |\ \mathbf{x}) = \frac{P(\mathbf{x},c)}{P(\mathbf{x})}$。 54 | 55 | 又因为联合概率 $P(\mathbf{x},c) = P(c\ |\ \mathbf{x}) \times P(\mathbf{x}) = P(\mathbf{x}\ |\ c) \times P(c)$,由此,能得到**贝叶斯定理**: 56 | 57 | $$P(c\ |\ \mathbf{x}) = \frac{P(\mathbf{x}\ |\ c) \times P(c)}{P(\mathbf{x})}$$ 58 | 59 | 在贝叶斯定理中,每个概率都有约定俗成的名称: 60 | 61 | - $P(c\ |\ \mathbf{x})$ 是类标记 $c$ 相对于样本 $\mathbf{x}$ 的条件概率,也由于得自 $\mathbf{x}$ 的取值而被称作 $c$ 的后验概率。 62 | 63 | - $P(\mathbf{x}\ |\ c)$ 是样本 $\mathbf{x}$ 相对于类标记 $c$ 的**类条件概率(class-conditional probability)**,或称为**似然(likelihood)**,也由于得自 $c$ 的取值而被称作 $\mathbf{x}$ 的后验概率。 64 | 65 | - $P(c)$ 是 $c$ 的先验概率(也称为边缘概率),之所以称为"先验"是因为它不考虑任何 $\mathbf{x}$ 方面的因素。在这里又称为**类先验(prior)概率**。 66 | 67 | - $P(\mathbf{x})$ 是 $\mathbf{x}$ 的先验概率。在这里是用作归一化的**证据(evidence)因子**,与类标记无关。 68 | 69 | 有了贝叶斯定理,如何估计后验概率 $P(c\ |\ \mathbf{x})$ 的问题就转化为**如何计算类先验概率 $P(c)$ 和类条件概率 $P(\mathbf{x}\ |\ c)$ **了。 70 | 71 | 类先验概率 $P(c)$ 表示的是**样本空间中各类样本的比例**,根据大数定律,**当训练集包含足够多的独立同分布样本**时,类先验概率可以直接通过**训练集中各类样本出现的频率**进行估计。 72 | 73 | 类条件概率 $P(\mathbf{x}\ |\ c)$ 的情况就复杂多了,它涉及到类 $c$ 中**样本 $\mathbf{x}$ 所有属性的联合概率**,假设每个样本有 $d$ 个二值属性,那么可能的取值组合就多达 $2^d$ 个,这个数目可能**远多于训练集的规模**,也就意味着很多样本的取值没有在训练集中出现,所以**直接用训练集出现的频率进行估计是不可行的**。必须注意**未被观测到**和**出现概率为0**的区别。 74 | 75 | **注意**,上述讨论中,均假设属性是离散型,对于连续型属性,只需把概率质量函数 $P(\cdot)$ 换为概率密度函数 $p(\cdot)$ 就可以了。 76 | 77 | ## 极大似然估计 78 | 79 | 估计类条件概率的一种常用策略是:先**假定该类样本服从某种确定的概率分布形式**,然后再**基于训练集中的该类样本对假定的概率分布的参数进行估计**。比方说假定该类样本服从高斯分布,那么接下来就是利用训练集中该类样本来估计高斯分布的参数——均值和方差。 80 | 81 | 具体来说,如果类 $c$ 的样本服从参数为 $\theta_c$(可能不止一个参数)的分布,那么我们从样本空间抽取到该类的某一个样本 $\mathbf{x}$ 的概率就是 $P(\mathbf{x}\ |\ \theta_c)$。使用 $D_c$ 来表示训练集中类 $c$ 的子集,可以定义数据集 $D_c$ 的**似然(likelihood)**为: 82 | 83 | $$P(D_c\ |\ \theta_c) = \prod_{\mathbf{x} \in D_c} P(\mathbf{x}\ |\ \theta_c)$$ 84 | 85 | 由于**连乘操作容易造成下溢**,实际任务中通常使用**对数似然(log-likelihood)**代替: 86 | 87 | $$LL(\theta_c) = \log P(D_c\ |\ \theta_c) = \sum_{\mathbf{x} \in D_c} \log P(\mathbf{x}\ |\ \theta_c)$$ 88 | 89 | 所谓**极大似然估计(Maximum Likelihood Estimation,简称MLE)**就是**找出令似然最大的参数 $\theta_c$**。也即从 $\theta_c$ 的所有可能取值中找到一个**令所抽取样本出现的可能性最大**的值。 90 | 91 | 求解的过程也很简单,就是求似然函数的导数,令导数为0,得到**似然方程**,解似然方程得到最优解,也即该类样本分布的参数。 92 | 93 | 特别地,对于参数估计,**频率主义学派(Frequentist)**和**贝叶斯学派(Bayesian)**有不同的见解。前者认为,参数虽然未知,却是**客观存在的固定值**,因此可以用优化似然函数等准则确定参数值;后者认为,参数是**未观测到的随机变量**,**参数本身也存在分布**。所以可以先假定参数服从一个先验分布,然后再根据观测到的数据计算参数的后验分布。这一节讨论的极大似然估计方法源于频率主义学派。 94 | 95 | 尽管极大似然估计能使我们求取类条件概率的过程变得相对简单,但它有最大的一个缺点就是:估计结果的**准确性严重依赖于所假设的概率分布形式是否符合潜在的真实数据分布**。在实际任务中,我们需要利用任务所属领域的一些经验知识,全凭猜测是很容易产生误导性结果的。 96 | 97 | P.S. 关于最大似然、最大后验与贝叶斯估计的爱恨纠缠可以看我写的另外一篇文章[参数估计:最大似然,最大后验与贝叶斯](https://github.com/familyld/SYSU_Data_Mining/tree/master/Linear_Regression)。 98 | 99 | ## 朴素贝叶斯分类器 100 | 101 | 前面提到了,估计后验概率 $P(c\ |\ \mathbf{x})$ 最大的一个难处是:类条件概率 $P(\mathbf{x}\ |\ c)$ 是所有属性上的联合概率,而多个属性的不同属性值组合并不一定全部囊括在训练集内,所以很难通过训练集估计。 102 | 103 | 为了避免这个障碍,**朴素贝叶斯分类器(naive Bayes clssifier)**采用**属性条件独立性假设(attribute conditional independence assumption)**。也就是说,假设**所有属性相互独立,单独地对分类结果产生影响**。 104 | 105 | 基于这个假设,可以把类条件概率写成连乘的形式,因此贝叶斯定理可重写为: 106 | 107 | $$P(c\ |\ \mathbf{x}) = \frac{P(\mathbf{x}\ |\ c) \times P(c)}{P(\mathbf{x})} = \frac{P(c)}{P(\mathbf{x})} \prod_{i=1}^{d} P(x_i\ |\ c) \qquad (1)$$ 108 | 109 | 其中 $d$ 为属性数目, $x_i$ 为样本 $\mathbf{x}$ 在第 $i$ 个属性上的取值。 110 | 111 | 又因为 $P(\mathbf{x})$ 与类别无关,所以**朴素贝叶斯分类器的表达式**可以写为: 112 | 113 | $$h(\mathbf{x}) = \arg \max_{c \in \mathcal{Y}} P(c) \prod_{i=1}^{d} P(x_i\ |\ c)$$ 114 | 115 | 前面已经提到过,当训练集包含足够多独立同分布样本时,类先验概率 $P(c)$ 可以直接算出,也即训练集该类样本的数目占训练集规模的比例: 116 | 117 | $$P(c) = \frac{|D_c|}{|D|} \qquad (2)$$ 118 | 119 | 而条件概率 $P(x_i\ |\ c)$,根据属性类型分离散和连续两种情况: 120 | 121 | - 离散型属性:条件概率 $P(x_i\ |\ c)$ 可以估计为,在类别 $c$ 的样本子集中,第 $i$ 个属性取值为 $x_i$ 的样本所占的比例: 122 | 123 | $$P(x_i\ |\ c) = \frac{|D_{c,x_i}|}{|D_c|} \qquad (3)$$ 124 | 125 | - 连续性属性:替换为概率密度函数,假设第 $i$ 个属性服从高斯分布,那么条件概率就写成 $p(x_i\ |\ c) \sim \mathcal{N}(\mu_{c,i},\sigma_{c,i}^2)$。我们利用类别 $c$ 的样本子集在该属性上的取值算出分布的均值和方差,然后把属性取值 $x_i$ 代入概率密度函数就可算出这个条件概率。 126 | 127 | #### 平滑 128 | 129 | 注意了,若**某个属性值在训练集中没有与某个类同时出现过**,那么它对应的条件概率 $P(x_i\ |\ c)$ 就为0。在连乘中,这就意味着整个式子值为0了,**其他属性携带的信息都被抹去了**。这是很常见的情况,举个例子,假设有一篇新闻应该在体育版发布的,它包含了 “罗纳尔多” 这个词,但由于我们构造分类器时,训练集中所有 “体育” 类的文本都没有出现这个词,于是,该新闻按照式(1)计算出的体育类的条件概率必定为0;而恰好 “娱乐” 类的文本中有一篇包含了这个词,那么计算出的娱乐类的条件概率就大于0,从而使得这篇新闻被误分到娱乐版发布了,这显然很不合理。 130 | 131 | 此时,我们就需要对概率值进行**平滑(smoothing)**了,最常用的是**拉普拉斯修正(Laplacian correction)**,假设**训练集中**包含 $N$ 个类别,第 $i$ 个属性包含 $N_i$ 种取值,则拉普拉斯修正把式(2)和式(3)修改为: 132 | 133 | $$P(c) = \frac{|D_c| + 1}{|D| + N} \qquad (4)$$ 134 | 135 | $$P(x_i\ |\ c) = \frac{|D_{c,x_i}| + 1}{|D_c| + N_i} \qquad (5)$$ 136 | 137 | 再回想一下上面新闻分类的例子,尽管所有 “体育” 类的文本都没有出现 “罗纳尔多” 这个词,但使用拉普拉斯修正后,这个词(文本分类中每个词是一个属性)对应的条件概率就不为0了,而是一个很小的值;而该新闻的其他词,比如 “足球”、“球场” 等等在体育类新闻中都出现得很频繁,所以最后累乘计算出的体育类的类条件概率就大于其他类,从而能正确地进行划分了。 138 | 139 | 拉普拉斯修正保证了**不会因为训练集样本不充分导致概率估值为零**。但它实际上是假设了**类别和属性值是均匀分布的**,相当于额外引入了先验,这个**假设并不总是成立**。不过当训练集规模足够大时,引入先验所产生的影响会变得非常低。也可以理解为,此时式(4)和式(5)的分母很大,使得分子中引入的1带来的变化非常小,此时概率的估计值会趋向于真实值。 140 | 141 | #### 实际使用 142 | 143 | 朴素贝叶斯分类器和前面学习的模型有一个不同的地方就是,我们并不是基于训练集和某些算法来学习模型的参数;而是利用训练集来算出一些概率,在预测时,根据新样本的情况,使用不同的概率计算出它被分到各个类的后验概率,然后取后验概率最大的一个类作为结果。 144 | 145 | 在实际任务中,有两种使用方式: 146 | 147 | - **查表**:若对预测速度要求较高,可以先根据训练集把所有涉及到的概率计算出来,然后存储好,在预测新样本时只需要查表然后计算就可以了。 148 | 149 | - **懒惰学习**:若数据更替比较频繁,也可以理解为用训练集算出的概率可能很快就失效了,更新换代的速度很快,那就采取**懒惰学习(lazy learning)**的方式,仅当需要预测时才计算涉及到的概率。 150 | 151 | 特别地,当我们采取了预先计算所有概率的方式时,如果有新数据加入到训练集,我们只需要更新新样本涉及到的概率(或者说计数)就可以了,可以很方便地实现**增量学习**。 152 | 153 | ## 半朴素贝叶斯分类器 154 | 155 | ![NB](https://raw.githubusercontent.com/familyld/Machine_Learning/master/graph/NB.jpg) 156 | 157 | 朴素贝叶斯分类器基于属性条件独立性假设,每个属性仅依赖于类别,如上图。但这个假设往往很难成立的,有时候**属性之间会存在依赖关系**,这时我们就需要对属性条件独立性假设适度地进行放松,**适当考虑一部分属性间的相互依赖信息**,这就是**半朴素贝叶斯分类器(semi-naive Bayes classifier)**的基本思想。 158 | 159 | **独依赖估计(One-Dependent Estimator,简称ODE)**是半朴素贝叶斯分类器最常用的一种策略,它假设的是**每个属性在类别之外最多仅依赖于一个其他属性**。也即: 160 | 161 | $$P(c\ |\ \mathbf{x}) \propto P(c) \prod_{i=1}^{d} P(x_i\ |\ c,{pa}_i)$$ 162 | 163 | 其中 ${pa}_i$ 是属性 $x_i$ 依赖的另一属性,称为 $x_i$ 的**父属性**。若已知父属性,就可以按式(5)来计算了。现在问题转化为**如何确定每个属性的父属性**? 164 | 165 | 这里介绍两种产生独依赖分类器的方法: 166 | 167 | #### SPODE 168 | 169 | ![SPODE](https://raw.githubusercontent.com/familyld/Machine_Learning/master/graph/SPODE.jpg) 170 | 171 | 在**SPODE(Super-Parent ODE)**中,所有属性都依赖于一个共同的属性,称为**超父(super-parent)**,比方说上图中的 $x_1$。可以通过交叉验证等模型选择方法来确定最合适的超父属性。 172 | 173 | #### TAN 174 | 175 | ![TAN](https://raw.githubusercontent.com/familyld/Machine_Learning/master/graph/TAN.jpg) 176 | 177 | **TAN(Tree augmented naive Bayes)**则是一种基于**最大带权生成树(maximum weighted spanning tree)**的方法,包含以下四个步骤: 178 | 179 | 1. 计算任意两个属性间的**条件互信息(conditional mutual information)**:
180 | $$I(x_i,x_j\ |\ y) = \sum_{x_i,x_j; c\in \mathcal{Y}} P(x_i,x_j\ |\ c) \log \frac{ P(x_i,x_j\ |\ c)}{ P(x_i\ |\ c) P(x_j\ |\ c)}$$ 181 | 182 | 2. 以属性为节点构建完全图,每条边的权重为对应的条件户信息。 183 | 184 | 3. 构建此完全图的最大带权生成树。选一个节点作为根节点,把边转换为有向边。 185 | 186 | 4. 加入类别节点 $y$,并增加从 $y$ 到每个属性的有向边。 187 | 188 | #### AODE 189 | 190 | 特别地,有一种更为强大的独依赖分类器——**AODE(Average One-Dependent Estimator)**,它基于集成学习机制。无须通过模型选择来确定超父属性,而是尝试将每个属性都作为超父属性来构建模型,然后把有足够训练数据支撑的SPODE模型集成起来导出最终结果。 191 | 192 | 类似于朴素贝叶斯分类器,AODE**无需进行模型选择**,既可以**通过预计算来节省预测时间**,又可以**采取懒惰学习**,需要预测时再进行计数,并且可以容易地实现增量学习。 193 | 194 | #### 高阶依赖 195 | 196 | ODE假设每个属性最多依赖类别以外的另一属性,但如果我们继续放宽条件,**允许属性最多依赖类别以外的 k 个其他属性**,也即考虑属性间的**高阶依赖**,那就得到了 kDE。 197 | 198 | 是不是考虑了高阶依赖就一定能带来性能提升呢?并不是这样的。随着 k 的增加,要准确估计条件概率 $P(x_i\ |\ c,\mathbf{pa}_i)$ **所需的训练样本会呈指数上升**。如果训练样本不够,很容易陷入高阶联合概率的泥沼;但如果训练样本非常充足,那就有可能带来泛化性能的提升。 199 | 200 | ## 贝叶斯网 201 | 202 | **贝叶斯网(Bayesian network)**亦称**信念网(belief network)**,它借助**有向无环图(Directed Acyclic Graph,简称DAG)**来刻画属性之间的依赖关系,并使用**条件概率表(Conditional Probability Table,简称CPT)**来描述属性的联合概率分布。 203 | 204 | 贝叶斯网的学习包括结构的学习和参数的学习,而预测新样本的过程则称为**推断(inference)**。这部分内容设计到一些后面章节,相对复杂一些,所以暂且放下,之后有时间再写详细的笔记。 205 | 206 | ## EM算法 207 | 208 | 前面讨论的极大似然估计方法是一种常用的参数估计方法,它是假设分布的形式,然后用训练样本来估计分布的参数。但实际任务中,我们遇到一个很大的问题就是**训练样本不完整**。这时就需要用到**EM(Expectation-Maximization)算法**了。 209 | 210 | 所谓不完整的样本,说的是这个样本某些属性的值缺失了。将每个属性的取值看为一个变量,那么缺失的就可以看作“未观测”变量,比方说有的西瓜根蒂脱落了,没办法看出根蒂是“蜷缩”还是“硬挺”,那么这个西瓜样本的根蒂属性取值就是一个“未观测”变量,更准确地说,称作**隐变量(latent variable)**。 211 | 212 | 整个训练集可以划分为已观测变量集 $X$ 和隐变量集 $Z$ 两部分。按照极大似然的思路,我们依然是想找出令训练集被观测到的概率最大的参数 $\Theta$。也即最大化对数似然: 213 | 214 | $$LL(\Theta\ |\ X,Z) = \ln P(X,Z\ |\ \Theta)$$ 215 | 216 | 但是,由于 $Z$ 是隐变量,我们没办法观测到,所以上面这个式子实际是没法求的。 217 | 218 | 怎么办呢?EM算法的思路很简单,步骤如下: 219 | 220 | 1. 设定一个初始的 $\Theta$ 221 | 2. 按当前的 $\Theta$ 推断隐变量 $Z$ 的(期望)值 222 | 3. 基于已观测变量 $X$ 和 步骤2得到的 $Z$ 对 $\Theta$ 做最大似然估计得到新的 $\Theta$ 223 | 4. 若未收敛(比方说新的 $\Theta$ 与旧的 $\Theta$ 相差仍大于阈值),就回到步骤2,否则停止迭代 224 | 225 | EM算法可以看作是用**坐标下降(coordinate descent)**法来最大化对数似然下界的过程,每次固定 $Z$ 或者 $\Theta$ 中的一个去优化另一个,直到最后收敛到局部最优解。 226 | 227 | 理论上,用梯度下降也能求解带隐变量的参数估计问题,但按我的理解,由于隐变量的加入,使得求导这个步骤非常困难,计算也会随着隐变量数目上升而更加复杂,EM算法避免了这些麻烦。 228 | 229 | ## 补充内容 230 | 231 | 朴素贝叶斯分类器的属性条件独立性假设在现实中很难成立,但事实上它在大多数情形下都有不错的性能。关于这点,有以下两种解释: 232 | 233 | 1. 对分类任务来说,只需各类别的条件概率**排序正确**,即使概率值不准确,也可以产生正确的分类结果; 234 | 2. 若属性间的相互依赖对所有类别影响都相同,或者依赖关系互相抵消,则属性条件独立性假设在降低开销的同时不会给性能带来负面影响; 235 | 236 | 注意,本章讨论的**贝叶斯分类器**和一般意义上的**贝叶斯学习(Bayesian learning)**是有很大差别的,本章讨论的贝叶斯分类器只是通过最大化后验概率来进行**单点估计**,获得的仅仅是一个数值;而贝叶斯学习则是进行**分布估计**或者说**区间估计**,获得的是一个分布。 237 | 238 | ## 习题 239 | 240 | #### 7.1 241 | 242 | > 问:试使用极大似然法估算西瓜数据集3.0中前3个属性的类条件概率。 243 | 244 | #### 7.2* 245 | 246 | > 问:试证明:条件独立性假设不成立时,朴素贝叶斯分类器仍有可能产生最优贝叶斯分类器。 247 | 248 | #### 7.3 249 | 250 | > 问:试编程实现拉普拉斯修正的朴素贝叶斯分类器,并以西瓜数据集3.0为训练集,对 page.151 的 “测1” 样本进行判别。 251 | 252 | #### 7.4 253 | 254 | > 问:实践中使用式(7.15)决定分类类别时,若数据的维数非常高,则概率连乘 $\prod_{i=1}^d P(x_i | c)$ 的结果通常会非常接近于0从而导致下溢。试述防止下溢的可能方案。 255 | 256 | #### 7.5 257 | 258 | > 问:试证明:二分类任务中两类数据满足高斯分布且方差相同时,线性判别分析产生贝叶斯最优分类器。 259 | 260 | #### 7.6 261 | 262 | > 问:试编程实现AODE分类器,并以西瓜数据集3.0为训练集,对 page.151 的 “测1” 样本进行判别。 263 | 264 | #### 7.7 265 | 266 | > 问:给定d个二值属性的二分类任务,假设对于任何先验概率项的估算至少需30个样例,则在朴素贝叶斯分类器式(7.15)中估算先验概率项 $P(c)$ 需 $30 \times 2 =60$ 个样例。试估计在AODE式(7.23)中估算先验概率项 $P(c, x_i)$ 所需的样例数(分别考虑最好和最坏情形)。 267 | 268 | #### 7.8 269 | 270 | > 问:考虑图7.3,试证明:在同父结构中,若 $x_1$ 的取值未知,则 $x_3\ ㅛ\ x_4$ 不成立;在顺序结构中,$y\ ㅗ\ z | x$,但 $y\ ㅛ\ z$ 不成立。 271 | 272 | #### 7.9 273 | 274 | > 问:以西瓜数据集2.0为训练集,试基于BIC准则构建一个贝叶斯网。 275 | 276 | #### 7.10 277 | 278 | > 问:以西瓜数据集2.0中属性 “脐部” 为隐变量,试基于EM算法构建一个贝叶斯网。 279 | 280 | -------------------------------------------------------------------------------- /08ensemble_learning.md: -------------------------------------------------------------------------------- 1 | # 集成学习 2 | 3 | **集成学习(ensemble learning)**通过构建并结合多个学习期来完成学习任务,有时也被称为**多分类器系统(multi-classifier system)**、**基于委员会的学习(committee-based learning)**等。 4 | 5 | 这一章的内容大致如下: 6 | 7 | - **个体与集成**:同质集成和异质集成有什么不同?集成学习对个体学习器有什么要求?集成学习研究的核心是什么?集成学习分哪两大类? 8 | 9 | - **Boosting**:Boosting的基本概念?AdaBoost算法的流程?如何基于加性模型最小化指数损失函数来推导?怎样处理基学习算法无法处理带权样本的情况?Boosting的优势是什么? 10 | 11 | - **Bagging与随机森林**:Bagging算法如何获得各个基学习器的训练集?预测时如何进行结合?相比AdaBoost有什么优势?随机森林的核心思想是什么?相比Bagging有什么优势? 12 | 13 | - **结合策略**:结合多个学习器有什么好处?平均法是怎样的?投票法是怎样的?学习法又是怎样的? 14 | 15 | - **多样性**:如何进行误差-分歧分解?说明了什么?有哪些多样性度量指标?有哪些增强多样性的手段? 16 | 17 | ## 个体与集成 18 | 19 | 集成学习先产生一组**个体学习器(individual learner)**,再用某种策略将它们结合起来。 20 | 21 | 当所有个体学习器都由同样的学习算法生成时,也即集成中只包含同种类型的个体学习器时,称为**同质(homogeneous)**集成,这些个体学习器又被称为**基学习器(base learner)**,相应的学习算法称为**基学习算法(base learning algorithm)**; 22 | 23 | 当个体学习器由不同的学习算法生成时,称为**异质(heterogenous)**集成,这些个体学习器称为**组件学习器(component learner)**或直接称为个体学习器。 24 | 25 | 集成学习通过结合多个学习器,通常能获得比单一学习器更优越的泛化性能,对**弱学习器(weak learner)**的提升尤为明显。注:弱学习器即略优于随机猜测的学习器,例如二分类任务中精度略高于50%。虽然理论上,集成弱学习器已经能获得很好的性能。但现实任务中,人们往往会使用比较强的学习器。 26 | 27 | 当我们使用集成学习的时候,我们其实是希望不同的个体学习器产生互补的效果,使得某个学习器错误的地方能有机会被其他学习器纠正过来,这就要求个体学习器应该尽量“不同”,即具有多样性;同时我们希望这种互补不会把正确改为错误,这就要求个体学习器应该尽量“准确”。合起来就是集成学习研究的核心——**如何产生并结合“好而不同”的个体学习器**。 28 | 29 | 根据个体学习器的**生成方式**,集成学习方法大致可分为两个大类: 30 | 31 | - 个体学习器间存在强依赖关系,必须串行生成的序列化方法,例如:Boosting算法族; 32 | - 个体学习器间不存在强依赖关系,可同时生成的并行化方法,例如:Bagging,随机森林; 33 | 34 | ## 习题 35 | 36 | #### 8.1 37 | 38 | > 问:假设抛硬币正面朝上的概率为 $p$,反面朝上的概率为 $1-p$。令 $H(n)$ 代表抛 $n$ 次硬币所得正面朝上的次数,则最多 $k$ 次正面朝上的概率为 39 | 40 | $$P(H(n) \leq k) = \sum_{i=0}^k \binom{n}{i} p^i (1-p)^{n-i}$$ 41 | 42 | > 对 $\delta > 0,\quad k=(p-\delta)n$,有 Hoeffding 不等式 43 | 44 | $$P(H(n) \leq (p-\delta)n) \leq e^{-2\delta^2n}$$ 45 | 46 | > 试推导出式(8.3) 47 | 48 | #### 8.2 49 | 50 | > 问:对于 0/1 损失函数来说,指数损失函数并非仅有的一直替代函数,考虑式(8.5),试证明:任意损失函数 $\ell(-f(\mathbf{x}H(\mathbf{x})))$,若对于 $H(\mathbf{x})$ 在区间 $[-\inf,\delta](\delta>0)$ 上单调递减,则 $\ell$ 是 0/1 损失函数的一致替代函数。 51 | 52 | 53 | #### 8.3 54 | 55 | > 问:从网上下载或自己编程实现 Adaboost,以不剪枝决策树为基学习器,在西瓜数据集 3.0$\alpha$ 上训练一个 AdaBoost 集成,并与图8.4进行比较。 56 | 57 | 58 | #### 8.4 59 | 60 | > 问:GradientBoosting 是一种常用的 Boosting 算法,试析其与 AdaBoost 的异同。 61 | 62 | 63 | #### 8.5 64 | 65 | > 问:试编程实现 Bagging,以决策树桩为基学习器,在西瓜数据集 3.0$\alpha$ 上训练一个 Bagging 集成,并与图8.6进行比较。 66 | 67 | 68 | #### 8.6 69 | 70 | > 问:试析 Bagging 通常为何难以提升朴素贝叶斯分类器的性能。 71 | 72 | 73 | #### 8.7 74 | 75 | > 问:试析随即森林为何比决策树 Bagging 集成的训练速度更快。 76 | 77 | 78 | #### 8.8 79 | 80 | > 问:MultiBoosting 算法将 AdaBoost 作为 Bagging 的基学习器,Iterative Bagging 算法则是将 Bagging 作为 AdaBoost 的基学习器,试比较二者的优缺点。 81 | 82 | 83 | #### 8.9* 84 | 85 | > 问:试设计一种可视的多样性度量,对习题8.3和习题8.5中得到的集成进行评估,并与 $\kappa$-误差图比较。 86 | 87 | 88 | #### 8.10* 89 | 90 | > 问:试设计一种能提升 $k$ 近邻分类器性能的集成学习算法。 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /09clustering.md: -------------------------------------------------------------------------------- 1 | # 聚类 2 | 3 | 在**无监督学习(unsupervised learning)**中,训练样本的标记信息是未知的,学习的目的是揭示数据的内在性质及规律,为进一步的数据分析提供基础。这类学习任务中研究最多,应用最广的是**聚类(clustering)**。 4 | 5 | 这一章的内容大致如下: 6 | 7 | - **聚类任务**:聚类过程是怎样的?聚类有什么用途?聚类的两个基本问题是什么? 8 | 9 | - **性能度量**:聚类的目标是什么?聚类性能度量的两大类指什么?各包含哪些度量指标? 10 | 11 | - **距离计算**:距离度量需要满足哪些基本性质?怎样度量有序属性?怎样度量无序属性?相似度度量和距离度量有什么区别? 12 | 13 | - **原型聚类**:什么是原型聚类?k均值算法是怎样的?学习向量量化算法是怎样的?高斯混合聚类是怎样的? 14 | 15 | - **密度聚类**:什么是密度聚类?DBSCAN算法是怎样的? 16 | 17 | - **层次聚类**:什么是层次聚类?AGNES算法是怎样的? 18 | 19 | ## 聚类任务 20 | 21 | 聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个**簇(cluster)**。通常来说每个簇可能对应一些特征,比方说音乐可以聚类成古典音乐、摇滚乐、流行乐等等。但**聚类过程仅产生簇结构,簇对应的概念语义需要使用者来把握和定名**。 22 | 23 | 简单来说,聚类可以分为两种用途: 24 | 25 | - 作为一个单独过程,用于寻找数据内在的分布结构; 26 | - 作为其他学习任务的前驱过程,比方说根据聚类结果定义类标记,然后再进行分类学习; 27 | 28 | 聚类算法的两大基本问题是**性能度量**和**距离计算**。 29 | 30 | ## 习题 31 | 32 | #### 9.1 33 | 34 | > 问:试证明: $p \geq 1$ 时,闵可夫斯基距离满足距离度量的四条基本性质;$0 \leq p \leq 1$ 时,闵可夫斯基距离不满足直递性,但满足非负性、同一性、对称性;$p$ 趋向无穷大时,闵可夫斯基距离等于对应分量的最大绝对距离,即 35 | 36 | $$\lim_{p \rightarrow + \inf} (\sum_{u=1}^n |x_{iu}-x_{ju}|^p)^{\frac{1}{p}} = \max_u |x_{iu}-x_{ju}|$$ 37 | 38 | 39 | 40 | #### 9.2 41 | 42 | > 问:同一样本空间中的集合 X 与 Z 之间的距离可通过 “豪斯多夫距离”(Hausdorff distance) 计算: 43 | 44 | $$dist_H(X,Z) = \max (dist_h(X,Z),dist_h(Z,X))$$ 45 | 46 | > 其中 47 | 48 | $$dist_h(X,Z) = \max_{x \in X} \min_{z \in Z} \Vert \mathbf{x} - \mathbf{z} \Vert_2$$ 49 | 50 | > 试证明:豪斯多夫距离满足距离度量的四条基本性质。 51 | 52 | #### 9.3 53 | 54 | > 问:试析 $k$ 均值算法能否找到最小化式(9.24)的最优解。 55 | 56 | 57 | 58 | #### 9.4 59 | 60 | > 问:试编程实现 $k$ 均值算法,设置三组不同的 $k$ 值、三组不同初始中心点,在西瓜数据集4.0上进行实验比较,并讨论怎样的初始中心有利于取得好结果。 61 | 62 | 63 | 64 | #### 9.5 65 | 66 | > 问:基于 DBSCAN 的概念定义,若 $\mathbf{x}$ 为核心对象,由 $\mathbf{x}$ 密度可达的所有样本构成的集合为 X,试证明:X满足连接性(9.39)与最大性(9.40)。 67 | 68 | 69 | 70 | #### 9.6 71 | 72 | > 问:试析 AGNES 算法使用最小距离和最大距离的区别。 73 | 74 | 75 | 76 | #### 9.7 77 | 78 | > 问:聚类结果中若每个簇都有一个凸包(包含蔟样本的凸多面体),且这些凸包不相交,则称为凸聚类。试析本章介绍的哪些聚类算法只能产生凸聚类,哪些能产生非凸聚类。 79 | 80 | 81 | 82 | #### 9.8 83 | 84 | > 问:试设计一个聚类性能度量指标,并与9.2节中的指标比较。 85 | 86 | 87 | 88 | #### 9.9* 89 | 90 | > 问:试设计一个能用于混合属性的非度量距离。 91 | 92 | 93 | 94 | #### 9.10* 95 | 96 | > 问:试设计一个能自动确定聚类数的改进 $k$ 均值算法,编程实现并在西瓜数据集4,0上运行。 97 | 98 | 99 | -------------------------------------------------------------------------------- /10dimension_reduction_and_metric_learning.md: -------------------------------------------------------------------------------- 1 | # 降维与度量学习 2 | -------------------------------------------------------------------------------- /11feature_selection_and_sparse_learning.md: -------------------------------------------------------------------------------- 1 | # 特征选择与稀疏学习 2 | -------------------------------------------------------------------------------- /12computational_learning_theory.md: -------------------------------------------------------------------------------- 1 | # 计算学习理论 2 | -------------------------------------------------------------------------------- /13semi-supervised_learning.md: -------------------------------------------------------------------------------- 1 | # 半监督学习 2 | -------------------------------------------------------------------------------- /14probabilistic_graphical_model.md: -------------------------------------------------------------------------------- 1 | # 概率图模型 2 | -------------------------------------------------------------------------------- /15rule_learning.md: -------------------------------------------------------------------------------- 1 | # 规则学习 2 | -------------------------------------------------------------------------------- /16reinforcement_learning.md: -------------------------------------------------------------------------------- 1 | # 强化学习 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Machine_Learning 2 | 3 | 注:Github的Markdown渲染器不支持渲染latex公式,Chrome浏览器用户请安装[GitHub with MathJax](https://chrome.google.com/webstore/detail/github-with-mathjax/ioemnmodlmafdkllaclgeombjnmnbima)插件,谢谢你的关注。无法科学上网的同学可以找到resource文件夹中的 GitHub with MathJax 0.2.3.crx 文件,下载后拖入到Chrome浏览器插件页安装即可。有部分公式过于复杂,该浏览器插件也无法覆盖,所以推荐还是下载到本地查看,之后会有渲染为 pdf 的打算。使用Sublime Text的朋友可以用 **OmniMarkupPreviewer** 插件来浏览,所有公式经过检查都是显示正常的~ 4 | 5 | 本项目主体是对周志华教授的《机器学习》一书所做的笔记,以及书中习题的试答(**周教授未提供习题的标准答案,笔者仅作试答,如有谬误,欢迎指出。习题中带\*星号的题目难度较大。**)。除此之外,本项目还会逐渐引入一些对其他精彩的机器学习相关文章的摘录与点评。想了解《机器学习》一书不妨查看周教授的[主页](http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/MLbook2016.htm),上面除了简介之外也包含了该书各印刷版的勘误情况。 6 | 7 | 全书共16章,因此,我的笔记也分为相应的16个章节,可以从以下目录进行快速访问: 8 | 9 | - [01. 绪论](https://github.com/familyld/Machine_Learning/blob/master/01introduction.md) 10 | - [02. 模型评估与选择](https://github.com/familyld/Machine_Learning/blob/master/02model_evaluation_and_model_selection.md) 11 | - [03. 线性模型](https://github.com/familyld/Machine_Learning/blob/master/03linear_model.md) 12 | - [04. 决策树](https://github.com/familyld/Machine_Learning/blob/master/04decision_tree.md) 13 | - [05. 神经网络](https://github.com/familyld/Machine_Learning/blob/master/05neural_network.md) 14 | - [06. 支持向量机](https://github.com/familyld/Machine_Learning/blob/master/06support_vector_machine.md) 15 | - [07. 贝叶斯分类器](https://github.com/familyld/Machine_Learning/blob/master/07Bayes_classifier.md) 16 | - [08. 集成学习](https://github.com/familyld/Machine_Learning/blob/master/08ensemble_learning.md) 17 | - [09. 聚类](https://github.com/familyld/Machine_Learning/blob/master/09clustering.md) 18 | - [10. 降维与度量学习](https://github.com/familyld/Machine_Learning/blob/master/10dimension_reduction_and_metric_learning.md) 19 | - [11. 特征选择与稀疏学习](https://github.com/familyld/Machine_Learning/blob/master/11feature_selection_and_sparse_learning.md) 20 | - [12. 计算学习理论](https://github.com/familyld/Machine_Learning/blob/master/12computational_learning_theory.md) 21 | - [13. 半监督学习](https://github.com/familyld/Machine_Learning/blob/master/13semi-supervised_learning.md) 22 | - [14. 概率图模型](https://github.com/familyld/Machine_Learning/blob/master/14probabilistic_graphical_model.md) 23 | - [15. 规则学习](https://github.com/familyld/Machine_Learning/blob/master/15rule_learning.md) 24 | - [16. 强化学习](https://github.com/familyld/Machine_Learning/blob/master/16reinforcement_learning.md) 25 | 26 | 这16个章节可以大致分为3个部分:第1部分包括第1~3章,是本书的引入部分,介绍了机器学习的一些基础知识;第2部分包括第4~10章,介绍一些经典而且常用的机器学习方法;第3部分包括第11~16章,介绍了一些进阶知识。除前3章以外,各章内容相对独立,可以根据兴趣和时间选择学习。 27 | 28 | ## 内容简介 29 | 30 | ### 绪论 31 | 32 | 本章首先讲述了什么是机器学习以及机器是如何学习的,然后引入了一些机器学习的基本概念。接下来从假设空间和归纳偏好两个方面来讲述模型的产生。最后介绍了机器学习的发展历程以及应用现状。 33 | 34 | ### 模型评估与选择 35 | 36 | 本章首先引入了经验误差和泛化误差的概念,从而很自然地引伸出了机器学习中模型选择的问题。然后通过评估方法、性能度量、比较检验三个章节来讲述模型选择的整个流程。最后还介绍了偏差-方差分解,这可以帮助我们更好地解释模型的泛化性能。 37 | 38 | ### 线性模型 39 | 40 | 本章首先通过最简单的线性回归讲述如何利用线性模型进行预测,并且使用最小二乘法来进行参数估计。接下来从单属性扩展到多属性的情形,也即多元线性回归,并进一步推广到可以求取输入空间到输出空间的非线性函数映射的广义线性模型。然后针对分类任务,介绍了两种线性分类方法——对数几率回归(逻辑回归)和线性判别分析(LDA)。接下来讨论了使用二分类模型解决多分类问题时的三种拆分策略。最后还介绍了解决类别不平衡问题的几种思路。 41 | 42 | ### 决策树 43 | 44 | 本章首先介绍了决策树模型的结构以及决策树学习的目标,然后自然地引入了在建立树结构时如何选择最优划分属性的问题,并介绍了三种最为常用的指标(信息增益、信息增益率和基尼指数)。针对过拟合问题,作者讲解了预剪枝和后剪枝这两种解决方案以及它们各自的优缺点。接下来还给出了数据集的连续值离散化以及缺失值处理的一些思路。最后简单地介绍了结合线性模型从而实现减少预测时间开销这一目的的多变量决策树模型。 45 | 46 | ### 神经网络 47 | 48 | 本章首先介绍了神经网络最基本的组成单位——神经元。然后引入了最简单的只有两层神经元的感知机,并在此基础上又引入了多层网络和多层前馈神经网络的概念。接下来介绍了神经网络的典型学习方法——BP算法,分为标准BP算法和累积BP算法两种。针对过拟合问题和陷入局部最小问题,作者给出了一些比较常见的思路。接下来作者还简单地介绍了一些其他的神经网络模型。在本章的最后,作者简要概述了今年最火的深度学习的思想,以及如何节省训练时间开销。 49 | 50 | ### 支持向量机 51 | 52 | 本章首先引入了支持向量机中最基础的两个概念——间隔和支持向量。然后介绍了如何把获取最大间隔超平面转换为对偶问题并使用SMO算法求解。接下来介绍了如何使用核函数来解决线性不可分问题以及有哪些常用的核函数。针对过拟合问题,作者介绍了软间隔这个概念以及软间隔支持向量机的求解方式,并讨论了常用的替代损失函数。接下来,作者介绍了支持向量回归以及对应的求解方法。在本章的最后,作者还介绍了核方法,也即通过引入核函数将线性学习器转换为非线性学习器的方法。 53 | 54 | ### 贝叶斯分类器 55 | 56 | 本章首先介绍了贝叶斯决策论的基础,贝叶斯分类器的目标是什么。然后介绍了如何用极大似然估计来估计概率模型的参数。接下来介绍了基于属性条件独立性假设的朴素贝叶斯分类器,以及基于独依赖估计的半朴素贝叶斯分类器。然后又介绍了更为强大的贝叶斯网络,从结构、学习、推断三个方面详细地进行了讲述。最后,针对缺失值问题,作者简要地介绍了EM算法。 57 | 58 | ### 集成学习 59 | 60 | 本章首先介绍了集成学习中一些最基本的概念和假设,以及集成学习的两个大类。接下来,作者介绍了几个常用的集成学习算法,包括Boosting算法族的AdaBoost算法,还有并行式集成算法的代表——Bagging算法和随机森林算法。除了这些常用算法之外,从多个基学习器结合的角度出发,作者介绍了一些常用的结合策略。在最后一个小节中,作者从误差-分歧分解的角度解释了为什么基学习器的多样性越大越好,并且介绍了一些多样性的度量指标,最后给出了一些增强多样性的方法。 61 | 62 | ### 聚类 63 | 64 | 本章首先介绍了聚类任务的目标和应用方式,然后首先讲述了聚类任务中的两大基本问题——性能度量和距离计算。接下来,作者介绍了三种不同的聚类思想,包括原型聚类、密度聚类和层次聚类,每一种聚类思想都有很多衍生的聚类算法。 65 | 66 | ### 降维与度量学习 67 | 68 | ### 特征选择与稀疏学习 69 | 70 | ### 计算学习理论 71 | 72 | ### 半监督学习 73 | 74 | ### 概率图模型 75 | 76 | ### 规则学习 77 | 78 | ### 强化学习 79 | -------------------------------------------------------------------------------- /The Heavens of Machine Learning/EM.md: -------------------------------------------------------------------------------- 1 | # 期望最大化算法 Expectation Maximization (EM) 2 | 3 | 最近在回顾机器学习的一些经典方法,顺带推推公式。检验自己是否充分理解一个方法最好的方式就是复述出来,看能否讲清楚。这是这个系列的第二篇,选了 EM 算法。 4 | 5 | EM 算法是在包含隐变量的问题中进行参数估计的一种迭代式优化算法,网上写的也非常多,大部分是基于 PRML 来讲的,但因为书中跳过了一些细节问题,所以初学时可能会有些困扰,始终掌握不了 EM 算法的本质。所以这篇文章会先从 EM 的推导出发,讲清楚 EM 的本质,从狭义 EM 推广到广义 EM,最后再结合使用高斯混合模型(Gaussian Mixture Model,GMM)求解聚类问题的例子来捋清使用 EM 的方法。 6 | 7 | EM 用于解决概率生成模型的问题。 8 | 9 | EM 算法是在包含隐变量的问题中进行参数估计的一种迭代式优化算法。为什么要有隐变量呢?其实我们是引入了一种归纳偏置。由于 $P(X)$ 可能非常复杂,直接去学太难了,我们就假设存在一些隐变量 $Z$ 决定了 $X$ 的生成过程,这样就能把问题进行分解,去学习相对简单的 $P(Z)$ 和 $P(X|Z)$。在真实世界中这样的例子很多,比如研究国内吃辣人群的分布 $P(X)$,由于我国幅员辽阔,每个地方都有爱吃辣和不爱吃辣的人,所以 $P(X)$ 超级复杂,但如果我们引入一个隐变量 $Z$ 表示每个人所属的省份,学习 $P(X|Z)$ 就会简单许多。 不过很多时候,隐变量 $Z$ 不一定有一个现实含义,它也可能是抽象的,未知的概念。 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /The Heavens of Machine Learning/README.md: -------------------------------------------------------------------------------- 1 | # 机器学习的天空 2 | 3 | > 21 世纪是人工智能的世纪,然而在晴朗的天空中却始终飘浮着令人不安的,名为数学的乌云,让一众初次进入这个领域的学生难以见着阳光,惶惶不可终日。—— 佚名 4 | 5 | 进入这个领域也好些年了,还记得刚刚开始学习的时候,因为数学基础不够扎实,看论文看书总是看着看着就迷糊了,始终掌握不到每个方法的精髓。经历过了挺痛苦的一段时间,后来看得多了,慢慢也就懂了。写这本“书”一方面是因为这段时间在回顾机器学习里的一些方法,所以顺带推推公式,理理思路,以免生疏;另一方面就是做个分享,希望可以帮到一些初学者,能够拨开乌云,看到这些方法背后智慧的光芒。当然,目前还远不能称为一本“书”,不知道会写多少,也没有一个明确的计划。有空了我就多写一点,也争取写得有趣一些~ 6 | 7 | 书的名字是向《数学的天空》致敬,虽然不是数学专业,但还挺喜欢这本书的。最前面的那句话是模仿物理学里的两朵乌云,当然这里说的数学问题只是理解上有点难,容易让初学者望而生畏,远远比不上那差点推倒经典物理学大厦的两朵乌云。这两朵乌云让近代物理学发生了颠覆性的改变,人类从此迈入了华丽的量子物理学时代。写在这里也是借这个美好的寓意,希望每个初学者都能克服机器学习里的这些数学问题,找到自己感兴趣的方向,研究出更好的方法,创造出一个更美好的时代。 8 | -------------------------------------------------------------------------------- /The Heavens of Machine Learning/SVM.md: -------------------------------------------------------------------------------- 1 | #! https://zhuanlan.zhihu.com/p/266533885 2 | # 支持向量机 Support Vector Machine (SVM) 3 | 4 | 最近在回顾机器学习的一些经典方法,顺带推推公式以免生疏。检验自己是否充分理解一个方法最好的方式就是复述出来,看能否讲清楚。SVM 是机器学习中的一个代表性模型,涉及到不少基础知识点,所以干脆就针对 SVM 写一篇文章。 5 | 6 | 写 SVM 的文章太多了,但总有些概念或者细节会被忽视,有些术语可能被频繁地提到,但没有说为什么要用或者具体怎么用?写这篇文章也是希望可以把思路理清晰一些,这样当我们遇到类似的优化问题时就能想起这些工具。当然,因为个人的研究方向不是优化,所以这篇文章不会具体地谈到如何证明 Slater's 条件能得出强对偶性或者如果由 Slater's 条件得到 KKT 条件等等这类问题,但是会讲到在 SVM 的问题里为什么需要用到它们以及怎么用。 7 | 8 | SVM 有三宝,间隔、对偶、核技巧。一般来说 SVM 可以分为三种类别,也即: 9 | 10 | 1. Hard-margin SVM 11 | 2. Kernel SVM 12 | 3. Soft-margin SVM 13 | 14 | 这篇推导也从最原汁原味的硬间隔 SVM 开始推导,然后引入核技巧,软间隔,最后讲解用于求解 SVM 对偶型的 SMO 算法。 15 | 16 | ## Hard-margin SVM 17 | 18 | ![SVM](https://pic4.zhimg.com/80/v2-e055ddb1d9fba54bcd85819db81587ca.png) 19 | 20 | 首先,SVM 最早是作为针对二分类任务设计的,给定数据集 21 | 22 | $$\mathcal{D} = \{(\mathbf{x}^{(i)},\ y^{(i)})\}_{i=1}^{N},$$ 23 | 24 | 其中 $\mathbf{x}^{(i)} \in \mathbb{R}^d,\ y^{(i)} \in \{-1, +1\}$。SVM 可以理解为特征空间中的一个超平面,用 $\mathbf{w}^T\mathbf{x}+b=0$ 表示,由参数 $\mathbf{w} \in \mathbb{R}^d$ 和 $b \in \mathbb{R}$ 决定。使用 $\text{sign}(\mathbf{w}^T\mathbf{x}+b)$ 来输出样本 $\mathbf{x}$ 的类别,是一个标准的判别模型。 25 | 26 | SVM 的目标是最大化间隔: 27 | 28 | $$\begin{aligned} 29 | \max_{\mathbf{w}, b} \text{margin}(\mathbf{w}, b) \quad \text{s.t.}\quad 30 | \left\{\begin{array}{l} 31 | \mathbf{w}^T\mathbf{x}^{(i)}+b > 0,\ y^{(i)}=+1\\ 32 | \mathbf{w}^T\mathbf{x}^{(i)}+b < 0,\ y^{(i)}=-1 33 | \end{array}\right. ,\forall i=1, \cdots, N 34 | \end{aligned}$$ 35 | 36 | 由于 $y^{(i)}$ 只有正负1两种取值,所以上式也可以简写为: 37 | 38 | $$\begin{aligned} 39 | \max_{\mathbf{w}, b} \text{margin}(\mathbf{w}, b) \quad \text{s.t.} \quad 40 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) > 0\ ,\forall i=1, \cdots, N 41 | \end{aligned}$$ 42 | 43 | 那么怎么定义 $\text{margin}(\cdot)$ 函数呢?从几何的角度来看,它其实就是**样本点与超平面间的最短距离**,根据点到直线距离公式有: 44 | 45 | $$\begin{aligned} 46 | \text{margin}(\textbf{w}, b) 47 | &= \min_{\textbf{x}^{(i)}} \text{distance}(\textbf{w}, b, \textbf{x}^{(i)})\\ 48 | &= \min_{\textbf{x}^{(i)}} \frac{1}{\Vert \textbf{w}\Vert}|\mathbf{w}^T\mathbf{x}^{(i)}+b|\\ 49 | &= \min_{\textbf{x}^{(i)}} \frac{1}{\Vert \textbf{w}\Vert} \mathbf{y}^{(i)}\mathbf{w}^T\mathbf{x}^{(i)}+b 50 | \end{aligned}$$ 51 | 52 | 因此,SVM 的目标可以重写为: 53 | 54 | $$\begin{aligned} 55 | &\max_{\mathbf{w}, b} \text{margin}(\mathbf{w}, b) \quad \text{s.t.}\quad 56 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) > 0\ ,\forall i=1, \cdots, N\\\Leftrightarrow 57 | &\max_{\mathbf{w}, b} \min_{\textbf{x}^{(i)}} \frac{1}{\Vert \textbf{w}\Vert} \mathbf{y}^{(i)}\mathbf{w}^T\mathbf{x}^{(i)}+b \quad \text{s.t.}\quad 58 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) > 0\ ,\forall i=1, \cdots, N\\\Leftrightarrow 59 | &\max_{\mathbf{w}, b} \frac{1}{\Vert \textbf{w}\Vert} \min_{\textbf{x}^{(i)}} \mathbf{y}^{(i)}\mathbf{w}^T\mathbf{x}^{(i)}+b \quad \text{s.t.}\quad 60 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) > 0\ ,\forall i=1, \cdots, N 61 | \end{aligned}$$ 62 | 63 | 本质上,这是对模型(超平面)的归纳偏好,SVM 认为间隔最大的超平面是最好的,直觉上这其实就是要找**处于两类样本正中间的超平面**,因为这个超平面**对训练数据局部扰动的容忍性最好**。新样本最不容易被误分类,也就是说这个超平面**对未见示例的泛化能力最强**。 64 | 65 | $\min_{\textbf{x}^{(i)}} \mathbf{y}^{(i)}\mathbf{w}^T\mathbf{x}^{(i)}+b$ 称为函数间隔,它与真实间隔相差了一个因子 $\frac{1}{\Vert \textbf{w}\Vert}$。我们不妨将函数间隔固定为1,这有助于后续推导,事实上,我们总能通过对参数 $\mathbf{w}$ 和 $b$ 进行放缩来满足这个条件。此时,SVM 的目标可以重写为: 66 | 67 | $$\begin{align} 68 | &\max_{\mathbf{w}, b} \frac{1}{\Vert \textbf{w}\Vert} \quad \text{s.t.}\quad 69 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \geq 1\ ,\forall i=1, \cdots, N \quad \text{函数间隔为1,消掉了}\\\Leftrightarrow 70 | &\min_{\mathbf{w}, b} {\Vert \textbf{w}\Vert} \quad \text{s.t.}\quad 71 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \geq 1\ ,\forall i=1, \cdots, N \quad \text{一般写作最小化的形式}\\\Leftrightarrow 72 | &\min_{\mathbf{w}, b} \sqrt{\textbf{w}^T\textbf{w}} \quad \text{s.t.}\quad 73 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \geq 1\ ,\forall i=1, \cdots, N \\\Leftrightarrow 74 | &\min_{\mathbf{w}, b} \frac{1}{2}\textbf{w}^T\textbf{w} \quad \text{s.t.}\quad 75 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \geq 1\ ,\forall i=1, \cdots, N \quad \text{引入}\frac{1}{2}\text{便于求导}\tag{1} 76 | \end{align}$$ 77 | 78 | 公式(1)所示就是 SVM 的基本型,从几何的角度出发,将最大化间隔的二分类问题转换为一个约束优化问题,更准确地来说,这是一个**凸二次规划问题**,目标函数是($\mathbf{w}$ 的)凸二次函数,约束都是线性约束。这类问题可以直接调用求解器求解,但对于样本数较多或特征维数较高(做非线性变换后甚至会出现无限维)的情况,直接求解的计算开销会非常大,因此,我们在使用 SVM 时更倾向于使用别的方法。 79 | 80 | 首先对约束项进行一个改写,将优化问题写作: 81 | 82 | $$\begin{align} 83 | \min_{\mathbf{w}, b} \frac{1}{2}\textbf{w}^T\textbf{w} \quad \text{s.t.}\quad 84 | 1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \leq 0\ ,\forall i=1, \cdots, N\tag{2} 85 | \end{align}$$ 86 | 87 | 式(2)一般称作 SVM 的**原问题(primal problem)**。拉格朗日乘子法是求解这类约束优化问题的常用方法,通过引入拉格朗日乘子将所有约束写进目标函数中,然后通过令偏导为0的方式求出极值。定义原问题的拉格朗日函数为: 88 | 89 | $$\begin{aligned} 90 | \mathcal{L}(\mathbf{w},b,\mathbf{\lambda}) = \frac{1}{2}\textbf{w}^T\textbf{w} + \sum_{i=1}^N \lambda^{(i)} 91 | [1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b)] 92 | \end{aligned}$$ 93 | 94 | 得到**原问题的等价形式**: 95 | 96 | $$\begin{align} 97 | \min_{\mathbf{w}, b} \max_{\mathbf{\lambda}}\mathcal{L}(\mathbf{w},b,\mathbf{\lambda}) \quad \text{s.t.} \quad \lambda^{(i)} \geq 0\ ,\forall i=1, \cdots, N\tag{3} 98 | \end{align}$$ 99 | 100 | 式(3)和式(2)描述的式相同的问题,因为对式(3)而言,$\lambda$ 要最大化 $\mathcal{L}(\mathbf{w},b,\mathbf{\lambda})$ 其实就只有两种情况: 101 | 102 | $$\begin{aligned} 103 | \left\{\begin{array}{l} 104 | \lambda^{(i)}=0, \quad &1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \leq 0\\ 105 | \lambda^{(i)}=+\infty, \quad &1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \gt 0 106 | \end{array}\right. 107 | \end{aligned}$$ 108 | 109 | 满足约束时,$\lambda$ 必须为0,否则式子就会加上一个负数变小;违背约束时,$\lambda$ 取为正无穷,可以让式子取值最大化。因此,式(3)和式(2)是完全等价的。由于式(3)外层是求 $\min$,它会迫使 $\mathbf{w}$ 和 $b$ 必须满足约束 $1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \leq 0$,从而让 $\lambda^{(i)}=0$。直观上,可以把 $\lambda$ 理解为违背约束时惩罚的力度。[从几何的角度理解](https://www.zhihu.com/question/38586401/answer/457058079),这种构造方式的本质是取得极值时,目标函数和约束条件描述的曲线相切,有着相同的法线方向。 110 | 111 | 原问题本身可以解,但我们往往都会解它的对偶问题,也即: 112 | 113 | $$\begin{align} 114 | \max_{\mathbf{\lambda}} \min_{\mathbf{w}, b} \mathcal{L}(\mathbf{w},b,\mathbf{\lambda}) \quad \text{s.t.} \quad \lambda^{(i)} \geq 0\ ,\forall i=1, \cdots, N\tag{4} 115 | \end{align}$$ 116 | 117 | 为什么要解对偶问题这里暂且跳过,先分析**对偶问题与原问题的解(分别记作 $d^*$ 和 $p^*$)之间的关系**。首先,对偶问题是求最小值中的最大值,原问题是求最大值中的最小值,所以这里很直观地可以得到: 118 | 119 | $$\begin{aligned} 120 | &d^* = \max_{\mathbf{\lambda}} \min_{\mathbf{w}, b}\mathcal{L}(\mathbf{w},b,\mathbf{\lambda}) \leq \min_{\mathbf{w}, b} \max_{\mathbf{\lambda}}\mathcal{L}(\mathbf{w},b,\mathbf{\lambda}) = p^* 121 | \end{aligned}$$ 122 | 123 | 也即对偶问题的解是原问题的解的下确界,这也称为**弱对偶性(weak duality)**,证明如下: 124 | 125 | 对于任意 $\mathbf{\lambda}$ 均有 $\min_{\mathbf{w}, b}\mathcal{L}(\mathbf{w},b,\mathbf{\lambda}) \leq \min_{\mathbf{w}, b} \max_{\mathbf{\lambda}} \mathcal{L}(\mathbf{w},b,\mathbf{\lambda})$。对于 $\mathbf{\lambda} = \arg\max_{\mathbf{\lambda}} \min_{\mathbf{w}, b}\mathcal{L}(\mathbf{w},b,\mathbf{\lambda})$ 亦然,得证。 126 | 127 | 由于我们要求的是原问题的最小值,得到一个下界没有什么用。我们真正需要的是**强对偶性**,也即 $d^* = p^*$,此时我们便可以通过求解对偶问题直接得到原问题的最优解。 128 | 129 | 为了得到强对偶性,我们需要用到 [Slater's Condition](https://en.wikipedia.org/wiki/Slater_condition): 130 | 131 | > In mathematics, Slater's condition (or Slater condition) is a **sufficient condition for strong duality** to hold for a **convex optimization problem**. 132 | 133 | 准确来说,它针对的是凸规划问题: 134 | 135 | $$\begin{aligned} 136 | \min _{x} f_{0}(x) 137 | \quad \text{s.t.} \quad 138 | \left\{\begin{array}{l} 139 | &f_{i}(x) \leq 0, \quad i=1, \cdots, m \\ 140 | &h_{i}(x)=0, \quad i=1, \cdots, p 141 | \end{array}\right. 142 | \end{aligned}$$ 143 | 144 | 其中,函数 $f_0, f_1, \cdots, f_m$ 都是凸函数,$h_0, h_1, \cdots, h_p$ 都是仿射变换(一次线性变换+平移)。**仅当存在点 $x^*$ 能满足所有约束项时(strictly feasible),该问题满足强对偶性**。 145 | 146 | 显然,式(3)所示的原问题属于凸规划问题,不过它没有等式约束,并且所有的不等式约束都是仿射变换。对于这种情形,我们可以使用 [a weak form of Slater’s condition](https://inst.eecs.berkeley.edu/~ee227a/fa10/login/l_dual_strong.html),它放宽了要求,如果 $f_i(x)$ 是仿射变换,则不需要 strict feasibility。也就是说,式(3)满足 Slater's 条件,该问题满足强对偶性! 147 | 148 | 以上就是为什么可以通过求解对偶问题来解决 SVM 的原问题。在谈及如何求解对偶问题和对偶问题的优点前,这里还需要指出一点。原始的拉格朗日乘子法是用于求解仅包含等式约束的问题的,而 SVM 的原问题中都是不等式约束。**要将拉格朗日乘子法推广到包含不等式约束的问题,最优解就必须满足 [KKT 条件(Karush–Kuhn–Tucker conditions)](https://en.wikipedia.org/wiki/Karush%E2%80%93Kuhn%E2%80%93Tucker_conditions)**: 149 | 150 | 1. **原问题可行(Primal feasibility)**:$\quad\qquad f_{i}(x) \leq 0, \quad g_{i}(x) = 0$ 151 | 2. **对偶问题可行(Dual feasibility)**:$\quad\qquad \lambda^{(i)} \geq 0$ 152 | 3. **互补松弛(Complementary slackness)**:$\lambda^{(i)}f_{i}(x)=0$ 153 | 154 | 有的文献还会写上 **Stationarity** 这一条,也即梯度为零,因为它包含在了后续求解过程中,所以有时候会忽略。那么 **SVM 原/对偶问题的解是否能满足 KKT 条件呢**? 155 | 156 | 要判断问题的解是否满足 KKT 条件,我们一般会看在该问题中 [Constraint Qualification (CQ)](https://en.wikipedia.org/wiki/Karush%E2%80%93Kuhn%E2%80%93Tucker_conditions#Regularity_conditions_(or_constraint_qualifications)) 是否成立,如果成立,那么问题的解就满足 KKT 条件。幸运的是,前面提到的 Slater's Condition 正是其中一种 CQ,所以 SVM 原/对偶问题的解均能满足 KKT 条件,并且 **KKT 条件是最优解的充要条件**。也即 SVM 的最优解满足: 157 | 158 | $$\begin{align} 159 | \left\{\begin{array}{l} 160 | & 1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \leq 0\\ 161 | & \lambda^{(i)} \geq 0\tag{5}\\ 162 | & \lambda^{(i)}[1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b)]=0 163 | \end{array}\right. 164 | \end{align}$$ 165 | 166 | 167 | 根据 Arthur Gretton 的[课件](http://www.gatsby.ucl.ac.uk/~gretton/coursefiles/Slides5A.pdf),Slater's Condition、强对偶性、KKT 条件与最优解之间的关系可以归纳如下: 168 | 169 | > If:
1. primal problem **convex** and
2. constraint functions satisfy **Slater's conditions**
then **strong duality** holds. If in addition:
- functions $f_i$, $h_i$ are **differentiable**
then KKT conditions necessary and sufficient for **optimality**. 170 | 171 | **注**:可微是因为 KKT 还要求最优解有偏导数为零(Stationarity)的性质,这恰恰也是用拉格朗日乘子法求解时的一个步骤。 172 | 173 | 我们现在知道了对偶问题式(4)与原问题式(3)有相同的最优解,并且最优解满足 KKT 条件,那就可以开始求解目标函数了。我们首先解 $\min_{\mathbf{w}, b}\mathcal{L}(\mathbf{w},b,\mathbf{\lambda})$,写出目标函数对参数 $b$ 和 $\mathbf{w}$ 的偏导数,并令其为零: 174 | 175 | $$\begin{align} 176 | \frac{\partial \mathcal{L}(\mathbf{w},b,\mathbf{\lambda})}{\partial b} 177 | &= \frac{\partial}{\partial b} \lgroup\frac{1}{2}\textbf{w}^T\textbf{w} + \sum_{i=1}^N \lambda^{(i)} 178 | [1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b)]\rgroup\\ 179 | &= \frac{\partial}{\partial b}[ \sum_{i=1}^N \lambda^{(i)} - \sum_{i=1}^N \lambda^{(i)} y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b)]\\ 180 | &= \frac{\partial}{\partial b} [- \sum_{i=1}^N \lambda^{(i)} y^{(i)}b]\\ 181 | &= - \sum_{i=1}^N \lambda^{(i)} y^{(i)} \triangleq 0\\ 182 | &\Leftrightarrow \sum_{i=1}^N \lambda^{(i)} y^{(i)} = 0 183 | \tag{6} 184 | \end{align}$$ 185 | 186 | $$\begin{align} 187 | \frac{\partial \mathcal{L}(\mathbf{w},b,\mathbf{\lambda})}{\partial \mathbf{w}}&= \frac{\partial}{\partial \mathbf{w}} \lgroup\frac{1}{2}\textbf{w}^T\textbf{w} + \sum_{i=1}^N \lambda^{(i)} 188 | [1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b)]\rgroup\\ 189 | &= \frac{\partial}{\partial \mathbf{w}} [\frac{1}{2}\mathbf{w}^T\mathbf{w}]+ \frac{\partial}{\partial \mathbf{w}}[ \sum_{i=1}^N \lambda^{(i)} - \sum_{i=1}^N \lambda^{(i)} y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b)]\\ 190 | &= \frac{1}{2} \cdot 2 \cdot \mathbf{w} - \frac{\partial}{\partial \mathbf{w}} [\sum_{i=1}^N \lambda^{(i)} y^{(i)} \mathbf{w}^T\mathbf{x}^{(i)}]\\ 191 | &= \mathbf{w}- \sum_{i=1}^N \lambda^{(i)} y^{(i)}\mathbf{x}^{(i)} \triangleq 0\\ 192 | &\Leftrightarrow w^* = \sum_{i=1}^N \lambda^{(i)} y^{(i)}\mathbf{x}^{(i)} \tag{7} 193 | \end{align}$$ 194 | 195 | 然后将式(6)和式(7)回代到目标函数中: 196 | 197 | $$\begin{aligned} 198 | & \mathcal{L}(\mathbf{w},b,\mathbf{\lambda})\\ 199 | =& \frac{1}{2}\textbf{w}^{*^{T}}\textbf{w}^* + \sum_{i=1}^N \lambda^{(i)} 200 | [1-y^{(i)}(\textbf{w}^{*^{T}}\mathbf{x}^{(i)}+b^*)]\\ 201 | =& \frac{1}{2} \textbf{w}^{*^{T}}\textbf{w}^* + \sum_{i=1}^N \lambda^{(i)} - \sum_{i=1}^N \lambda^{(i)}y^{(i)}\textbf{w}^{*^{T}}\mathbf{x}^{(i)}-\sum_{i=1}^N \lambda^{(i)}y^{(i)} \cdot b^* \quad \text{根据式(6),最后一项为0}\\ 202 | =& \frac{1}{2} (\sum_{i=1}^N \lambda^{(i)} y^{(i)}\mathbf{x}^{(i)})^T(\sum_{j=1}^N \lambda^{(j)} y^{(j)}\mathbf{x}^{(j)}) + \sum_{i=1}^N \lambda^{(i)} - \sum_{i=1}^N \lambda^{(i)}y^{(i)} (\sum_{i=j}^N \lambda^{(j)} y^{(j)}\mathbf{x}^{(j)})^T \mathbf{x}^{(i)}\\ 203 | =& \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \lambda^{(i)} \lambda^{(j)} y^{(i)} y^{(j)} \mathbf{x}^{{(i)}^T} \mathbf{x}^{(j)} + \sum_{i=1}^N \lambda^{(i)} - \sum_{i=1}^N \sum_{j=1}^N \lambda^{(i)} \lambda^{(j)} y^{(i)} y^{(j)} \mathbf{x}^{{(i)}^T} \mathbf{x}^{(j)}\\ 204 | =& -\frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \lambda^{(i)} \lambda^{(j)} y^{(i)} y^{(j)} \mathbf{x}^{{(i)}^T} \mathbf{x}^{(j)} + \sum_{i=1}^N \lambda^{(i)} 205 | \end{aligned}$$ 206 | 207 | 这样,式(4)的优化问题就变为一个只含变量 $\mathbf{\lambda}$ 的优化问题了,这也称为 SVM 的对偶型: 208 | 209 | $$\begin{align} 210 | & \max_{\mathbf{\lambda}} \min_{\mathbf{w}, b} \mathcal{L}(\mathbf{w},b,\mathbf{\lambda}) \quad \text{s.t.} \quad \lambda^{(i)} \geq 0\ ,\forall i=1, \cdots, N\\\Leftrightarrow 211 | & \max_{\mathbf{\lambda}} -\frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \lambda^{(i)} \lambda^{(j)} y^{(i)} y^{(j)} \mathbf{x}^{{(i)}^T} \mathbf{x}^{(j)} + \sum_{i=1}^N \lambda^{(i)} \quad \text{s.t.} \quad 212 | \left\{\begin{array}{l} 213 | &\lambda^{(i)} \geq 0\\ 214 | &\sum_{i=1}^N \lambda^{(i)} y^{(i)} = 0 215 | \end{array}\right.\ ,\forall i=1, \cdots, N 216 | \\\Leftrightarrow 217 | & \min_{\mathbf{\lambda}} \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \lambda^{(i)} \lambda^{(j)} y^{(i)} y^{(j)} \mathbf{x}^{{(i)}^T} \mathbf{x}^{(j)} - \sum_{i=1}^N \lambda^{(i)} \quad\quad \text{s.t.} \quad 218 | \left\{\begin{array}{l} 219 | &\lambda^{(i)} \geq 0\\ 220 | &\sum_{i=1}^N \lambda^{(i)} y^{(i)} = 0 221 | \end{array}\right.\ ,\forall i=1, \cdots, N 222 | \tag{8} 223 | \end{align}$$ 224 | 225 | 式(8)同样是一个凸二次规划问题,一样可以用求解器来解,但实践中有更高效的求解方法 —— **SMO 方法**。这里先不论如何求解,假设最优参数 $\lambda^{(i)}$ 已知,我们来看看得到的分类器 $\text{sign}(\mathbf{w}^{*^T}\mathbf{x}+b^*)$ 是怎样的。首先,$w^*$ 在式(7)中已经给出: 226 | 227 | $$ 228 | w^* = \sum_{i=1}^N \lambda^{(i)} y^{(i)}\mathbf{x}^{(i)} 229 | $$ 230 | 231 | 计算偏置 $b^*$ 需要利用到式(5),也即 KKT 条件中的互补松弛性质,由该性质我们可以知道 $\lambda^{(i)} \neq 0$ 时,必然有 $1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b)=0$。假设 $(\mathbf{x}^{(k)}, y^{(k)})$ 是满足该等式的其中一个样本点,则有: 232 | 233 | $$\begin{aligned} 234 | & 1-y^{(k)}(\mathbf{w}^{*^T}\mathbf{x}^{(k)}+b^*)=0\\\Leftrightarrow 235 | & y^{(k)}(\mathbf{w}^{*^T}\mathbf{x}^{(k)}+b^*)=1\\\Leftrightarrow 236 | & \mathbf{w}^{*^T}\mathbf{x}^{(k)}+b^*=y^{(k)} \quad \text{等式左右都乘上了}y^{(k)}\\\Leftrightarrow 237 | & b^* = y^{(k)}-\mathbf{w}^{*^T}\mathbf{x}^{(k)}\\\Leftrightarrow 238 | & b^* = y^{(k)}-\sum_{i=1}^N \lambda^{(i)} y^{(i)}\mathbf{x}^{(i)^{T}}\mathbf{x}^{(k)} 239 | \end{aligned}$$ 240 | 241 | 实践中为了提高鲁棒性,参数 $b$ 往往会采用所有支持向量算出的均值。可以看出最优参数 $\mathbf{w}^{*^T}$ 和 $b^*$ 都是样本点的加权组合,权值为 $\lambda^{(i)}$。由互补松弛性质可得,$1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \neq 0 \Leftrightarrow \lambda^{(i)}=0$,所以(通常情况下)大多数样本都是无用的,模型只与满足约束 $1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b)=0$ 的样本点有关,我们把这些样本点称为**支持向量**。 242 | 243 | **支持向量的数量一定很少吗?** 不一定,它只是求解 SVM 的一个副产物。支持向量很多也是完全有可能的,有时候这可能意味着过拟合。 244 | 245 | 那么到底**为什么要求解对偶问题而非原问题**呢?原因主要有以下几个方面: 246 | 247 | 1. **求解高效**:原问题需求解 $d+1$ 个变量,对偶问题只需求解 $N$ 个变量(早期的机器学习研究中数据集普遍较小,所以可能会有 $d \gg N$ 的情况),而且对偶问题有一些高效的解法(比如:SMO); 248 | 2. **核技巧**:对偶问题中用到了 $\mathbf{x}^{(i)^{T}}\mathbf{x}^{(k)}$,也即特征向量的内积,**便于使用核技巧**,隐式地将特征向量投影到高维甚至无穷维来计算,从而可以解决非线性分类问题(**主要原因**); 249 | 3. **计算高效**:对偶问题可以求出 $\lambda^{(i)}$,因为模型仅与支持向量有关,我们可以基于支持向量计算分类结果。利用核技巧就不需要显式地将特征向量投影到高维,直接与支持向量计算内积即可达到相同的效果。 250 | 251 | ## Kernel SVM 252 | 253 | 首先,[核方法](https://en.wikipedia.org/wiki/Kernel_method)是一类使用了[核函数](https://en.wikipedia.org/wiki/Positive-definite_kernel)的算法,包括 SVM,Gaussian processes,PCA,ridge regression,spectral clustering 等等。核函数有很多种,它们的特点就是可以在数据的原始表示空间 $\mathcal{X}$ 下计算它们在高维特征空间 $\mathcal{V}$ 下的相似性而无需显式地将其映射到 $\mathcal{V}$,也即用 $\kappa(\mathbf{x}^{(i)}, \mathbf{x}^{(j)})$ 替换 $\phi(\mathbf{x}^{(i)})^T\phi(\mathbf{x}^{(j)})$。这种使用核函数计算相似性的方法称为**核技巧(kernel trick)**。我们平常使用的神经网络等模型都是显式地对样本 $\mathbf{x}^{(i)}$ 进行映射,为此我们需要设定模型架构 $\phi(\mathbf{x}^{(i)})$,而核方法需要选择的则是核函数 $\kappa(\mathbf{x}^{(i)}, \mathbf{x}^{(j)})$。 254 | 255 | ![example](https://pic4.zhimg.com/80/v2-4efd5e6ca85897dc61e7492268cea642.png) 256 | 257 | 以上图为例,左边是数据的原始表示空间,两类数据是线性不可分的。但如果我们将其映射到右边的高维情况,它们就可以被一个超平面区分开。这里用到的映射函数 $\phi(\mathbf{x}^{(i)})=(\mathbf{x}^{(i)}_1, \mathbf{x}^{(i)}_2, \mathbf{x}^{(i)^2}_1+\mathbf{x}^{(i)^2}_2)$,对应的核函数是 $\kappa(\mathbf{x}^{(i)}, \mathbf{x}^{(j)}) = \mathbf{x}^{(i)^T}\mathbf{x}^{(j)} + \Vert \mathbf{x}^{(i)} \Vert^2\Vert \mathbf{x}^{(j)} \Vert^2$,不妨验证一下: 258 | 259 | $$\begin{aligned} 260 | \phi(\mathbf{x}^{(i)})^T\phi(\mathbf{x}^{(j)}) 261 | & = (\mathbf{x}^{(i)}_1, \mathbf{x}^{(i)}_2, \mathbf{x}^{(i)^2}_1+\mathbf{x}^{(i)^2}_2)^T(\mathbf{x}^{(j)}_1, \mathbf{x}^{(j)}_2, \mathbf{x}^{(j)^2}_1+\mathbf{x}^{(j)^2}_2)\\ 262 | & = \mathbf{x}^{(i)}_1\mathbf{x}^{(j)}_1 + \mathbf{x}^{(i)}_2\mathbf{x}^{(j)}_2 + (\mathbf{x}^{(i)^2}_1+\mathbf{x}^{(i)^2}_2)(\mathbf{x}^{(j)^2}_1+\mathbf{x}^{(j)^2}_2)\\ 263 | & = \mathbf{x}^{(i)^T}\mathbf{x}^{(j)} + \Vert \mathbf{x}^{(i)} \Vert^2\Vert \mathbf{x}^{(j)} \Vert^2 264 | \end{aligned}$$ 265 | 266 | 做显式映射 $\phi(\cdot)$ 需要把样本由 2 维映射到 3 维才能计算内积,而使用核函数 $\kappa(\cdot)$ 时所有的计算都能在 2 维的原始表示空间中进行。对于更为复杂的映射而言,使用核函数能节省很大的计算开销。 267 | 268 | 一些常见的核函数如下表所示: 269 | 270 | ![常见核函数](https://pic4.zhimg.com/80/v2-cab80be1d10a0f98131a46ffb51141cc.png) 271 | 272 | 将核函数用到 SVM 中就得到了 Kernel SVM,目标函数是: 273 | 274 | $$\begin{align} 275 | \min_{\mathbf{\lambda}} \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \lambda^{(i)} \lambda^{(j)} y^{(i)} y^{(j)} \kappa(\mathbf{x}^{(i)}, \mathbf{x}^{(j)}) - \sum_{i=1}^N \lambda^{(i)} \quad\quad \text{s.t.} \quad 276 | \left\{\begin{array}{l} 277 | &\lambda^{(i)} \geq 0\\ 278 | &\sum_{i=1}^N \lambda^{(i)} y^{(i)} = 0 279 | \end{array}\right.\ ,\forall i=1, \cdots, N \tag{9} 280 | \end{align}$$ 281 | 282 | 使用 Kernel SVM 进行预测: 283 | 284 | $$\begin{aligned} 285 | w^*\phi(\mathbf{x}^{(j)})+b^* = \sum_{i=1}^N \lambda^{(i)} y^{(i)}\kappa(\mathbf{x}^{(i)}, \mathbf{x}^{(j)}) + y^{(k)}-\sum_{i=1}^N \lambda^{(i)} y^{(i)} \kappa(\mathbf{x}^{(i)}, \mathbf{x}^{(k)}) 286 | \end{aligned}$$ 287 | 288 | 核函数怎么选网上也有不少文章给出了分析,这里不再赘述。 289 | 290 | ## Soft-margin SVM 291 | 292 | 前面讨论 Hard-margin SVM 和 Kernel SVM 时,我们都是认为数据要“完美地”线性可分,但现实中由于噪声数据的存在,一味地追求这种完美可能会导致严重的过拟合,最大间隔可能会变得非常非常窄,从而无法做出 robust 的预测。更糟的是,异常点的存在可能会让本来线性可分的数据变得线性不可分。因此,研究者提出了 Soft-margin SVM。 293 | 294 | Soft-margin SVM 的核心就是允许 SVM 犯错,但应该尽可能少地犯错,并且依据犯错的程度进行惩罚。为此,Soft-margin SVM 在参数 $\mathbf{w}$ 和 $b$ 之外,引入了一个用于度量样本违背式(10)约束的程度的变量 $\zeta^{(i)}$,称为**松弛变量(Slack variables)**。此时,原问题的约束就由 295 | 296 | $$ 297 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \geq 1\tag{10} 298 | $$ 299 | 300 | 变为: 301 | 302 | $$ 303 | y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \geq 1-\zeta^{(i)}\tag{11} 304 | $$ 305 | 306 | $\zeta^{(i)}$ 越大,意味着样本 $\mathbf{x}^{(i)}$ 违背式(10)约束的程度越大。当 $\zeta^{(i)}>1$ 时,样本点甚至被允许误分类到超平面的另一边。在修改了约束之后,我们需要对原问题,也即式(2)做出相应改变,得到 Soft-margin SVM 的原问题: 307 | 308 | $$\begin{align} 309 | \min_{\mathbf{w}, b, \mathbf{\zeta}} \frac{1}{2}\textbf{w}^T\textbf{w} + C \cdot \sum_1^N \zeta^{(i)} \quad \text{s.t.}\quad 310 | \left\{\begin{array}{l} 311 | &1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) - \zeta^{(i)}\leq 0\\ 312 | &-\zeta^{(i)} \leq 0 313 | \end{array}\right.\ ,\forall i=1, \cdots, N \tag{12} 314 | \end{align}$$ 315 | 316 | 这里有两点需要注意: 317 | 318 | 1. **超参数** $C$ 用于权衡对松弛向量的惩罚,如果将 $C$ 设置为 $+\infty$ 则会退化为 Hard-margin SVM,因为目标函数无法容忍任何违背式(10)约束的情况,而当我们设定 $C$ 为一个较小值时,会允许适当地违背约束以增大间隔,但要注意 $C$ 不应设为零或负数(否则就会无视约束甚至鼓励违背约束); 319 | 2. **松弛变量** $\zeta^{(i)} \geq 0$,否则解这个最小化问题就会让 $\zeta^{(i)} \rightarrow -\infty$,这就与我们期望 $\zeta^{(i)}$ 起到的作用相悖,不但没有放松约束,而且还加紧了。 320 | 321 | 类似 Hard-margin SVM,对于 Soft-margin SVM,我们也可以写出它的拉格朗日函数,然后求解其对偶问题: 322 | 323 | $$\begin{aligned} 324 | \mathcal{L}(\mathbf{w},b,\mathbf{\zeta},\mathbf{\lambda},\mathbf{\eta}) = \frac{1}{2}\textbf{w}^T\textbf{w} + C \cdot \sum_1^N \zeta^{(i)} + \sum_{i=1}^N \lambda^{(i)} 325 | [1-y^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b)-\zeta^{(i)}] + \sum_{i=1}^N \eta^{(i)} (-\zeta^{(i)}) 326 | \end{aligned}$$ 327 | 328 | 对偶问题为: 329 | 330 | $$\begin{align} 331 | \max_{\mathbf{\lambda}, \mathbf{\eta}} \min_{\mathbf{w}, b, \mathbf{\zeta}} \mathcal{L}(\mathbf{w},b,\mathbf{\zeta},\mathbf{\lambda},\mathbf{\eta}) \quad \text{s.t.} \quad \lambda^{(i)} \geq 0\ ,\forall i=1, \cdots, N\tag{13} 332 | \end{align}$$ 333 | 334 | 令偏导数为零可得: 335 | 336 | $$\begin{align} 337 | \frac{\partial \mathcal{L}(\mathbf{w},b,\mathbf{\zeta},\mathbf{\lambda},\mathbf{\eta})}{\partial \mathbf{w}} \triangleq 0 338 | \Rightarrow w^* = \sum_{i=1}^N \lambda^{(i)} y^{(i)}\mathbf{x}^{(i)} \tag{14} 339 | \end{align}$$ 340 | 341 | $$\begin{align} 342 | \frac{\mathcal{L}(\mathbf{w},b,\mathbf{\zeta},\mathbf{\lambda},\mathbf{\eta})}{\partial b} \triangleq 0 343 | \Rightarrow \sum_{i=1}^N \lambda^{(i)} y^{(i)} = 0 344 | \tag{15} 345 | \end{align}$$ 346 | 347 | $$\begin{align} 348 | \frac{\partial \mathcal{L}(\mathbf{w},b,\mathbf{\zeta},\mathbf{\lambda},\mathbf{\eta})}{\partial \zeta^{(i)}} \triangleq 0 349 | \Rightarrow \lambda^{(i)}+\eta^{(i)}=C 350 | \tag{16} 351 | \end{align}$$ 352 | 353 | 由式(16)可知 $\eta^{(i)} = C - \lambda^{(i)}$,又因为存在约束 $\eta^{(i)} \geq 0$,所以可以把约束写成 $0 \leq \lambda^{(i)} \leq C$ 消去变量 $\mathbf{\eta}$。代入式(13)消除掉除 $\mathbf{\lambda}$ 以外的所有变量,得到 Soft-margin SVM 的对偶型: 354 | 355 | $$\begin{align} 356 | \min_{\mathbf{\lambda}} \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \lambda^{(i)} \lambda^{(j)} y^{(i)} y^{(j)} \mathbf{x}^{{(i)}^T} \mathbf{x}^{(j)} - \sum_{i=1}^N \lambda^{(i)} \quad\quad \text{s.t.} \quad 357 | \left\{\begin{array}{l} 358 | &0 \leq \lambda^{(i)} \leq C\\ 359 | &\sum_{i=1}^N \lambda^{(i)} y^{(i)} = 0 360 | \end{array}\right.\ ,\forall i=1, \cdots, N 361 | \tag{17} 362 | \end{align}$$ 363 | 364 | **Note**:$0 \leq \lambda^{(i)} \leq C$ 这个约束也被称为 **box constraint**,因为 $\lambda^{(i)}$ 被限制在了边长为 $C$ 的“盒子”里。 365 | 366 | 最后,有的文献对式(12)的原问题会给出另外一种写法: 367 | 368 | $$\begin{align} 369 | \min_{\mathbf{w}, b} \frac{1}{N} \sum_{i=1}^{N} \max (0,1-y_{i}(\mathbf{w}^T \mathbf{x}^{(i)})+b) + \frac{C}{2}\textbf{w}^T\textbf{w}\tag{18} 370 | \end{align}$$ 371 | 372 | 它与式(12)是等价的,实质是令松弛变量 $\zeta^{(i)}=\max (0,1-y^{(i)}(\mathbf{w}^T \mathbf{x}^{(i)})+b)$。式(18)的第一项称为经验风险,采用 **铰链损失(hinge loss)** 作为损失函数,度量了模型对训练数据的拟合程度;第二项称为结构风险,削减了假设空间,可以避免过拟合发生;超参数 $C$ 用于权衡两种风险。这是对 Soft-margin SVM 的另一种理解。从这个损失函数出发,我们也可以直接使用 SGD 等方法进行优化,使得 SVM 可适用于流数据场景。 373 | 374 | ## SMO 375 | 376 | 尽管前面提到的对偶型都是凸二次规划问题,可以使用一些 QP 工具包(比如:CVXOPT)直接求解,但实践中一般会使用更高效的 **SMO(sequential minimal optimization)算法**或者其它变体。主要的原因就是直接求解需要进行矩阵乘法,计算和存储开销都是 O(N^2) 的,如果数据集比较大那么直接求解是不太实际的(特别是对于 SVM 被提出时的年代),SMO 可以帮助我们避免这个问题。 377 | 378 | 首先提一下 **坐标上升/下降(Coordinate ascent/descent)** 算法,它是解决多变量优化问题的一个比较常用的方法。思路很简单,就是将一个优化问题简化为多个子优化问题。假设存在 $N$ 个变量,每次更新参数时固定住其中的 $N-1$ 个,此时优化问题就变为余下那一个变量的单变量优化问题。SMO 的思路是类似的,在 SVM 中我们要解决的优化问题是式(17): 379 | 380 | $$\begin{aligned} 381 | \min_{\mathbf{\lambda}} \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \lambda^{(i)} \lambda^{(j)} y^{(i)} y^{(j)} \mathbf{x}^{{(i)}^T} \mathbf{x}^{(j)} - \sum_{i=1}^N \lambda^{(i)} \quad\quad \text{s.t.} \quad 382 | \left\{\begin{array}{l} 383 | &0 \leq \lambda^{(i)} \leq C\\ 384 | &\sum_{i=1}^N \lambda^{(i)} y^{(i)} = 0 385 | \end{array}\right.\ ,\forall i=1, \cdots, N 386 | \end{aligned}$$ 387 | 388 | 这个优化问题要求解 $N$ 个变量,但不同的是这里存在约束条件。由于存在 $\sum_{i=1}^N \lambda^{(i)} y^{(i)} = 0$ 这一约束,如果我们像坐标下降那样只修改一个变量 $\lambda^{(i)}$ 的值,就必然会违背约束。为了解决这个问题,我们可以每次修改两个变量值 $\lambda^{(i)}$ 和 $\lambda^{(j)}$,并且确保它们符合约束: 389 | 390 | $$\begin{align} 391 | \left\{\begin{array}{l} 392 | &0 \leq \lambda^{(i)} \leq C\\ 393 | &0 \leq \lambda^{(j)} \leq C\\ 394 | &\lambda^{(i)}y^{(i)}+\lambda^{(j)}y^{(j)}=\lambda^{(i)}y^{(i)}+\lambda^{(j)}y^{(j)}-\sum_{k=1}^N \lambda^{(k)} y^{(k)} \triangleq K 395 | \end{array}\right.\tag{19} 396 | \end{align}$$ 397 | 398 | 画成图其实就是这样: 399 | 400 | 401 | 402 | 可行的 $\lambda^{(i)}$ 和 $\lambda^{(j)}$ 都必须在 $[0, C]$ 的“盒子”内,并且在直线 $\lambda^{(i)}y^{(i)}+\lambda^{(j)}y^{(j)}=K$ 上。直线与“盒子”的交点会给 $\lambda^{(j)}$ 确定上下界,假设分别是 $L$ 和 $H$(根据直线方程会出现不同情况,比如直线刚好是“盒子”的对角线,那就会有 $L=0, H=C$)。由直线方程可知: 403 | 404 | $$\begin{align} 405 | \lambda^{(i)} 406 | &= \frac{(K-\lambda^{(j)}y^{(j)})}{y^{(i)}}\\ 407 | &= \frac{(K-\lambda^{(j)}y^{(j)})}{y^{(i)}} \cdot y^{(i)^2} \quad y^{(i)}\in\{-1, +1\}\text{, 所以乘上 }y^{(i)^2}=1\text{ 不会改变}\\ 408 | &= y^{(i)}(K-\lambda^{(j)}y^{(j)})\tag{20} 409 | \end{align}$$ 410 | 411 | 将式(20)代入到式(17)中,我们就得到了一个单变量优化问题,令目标函数对 $\lambda^{(j)}$ 的偏导数为零,即可求出最优的 $\lambda^{(j)}$。当然,为了满足约束,$\lambda^{(j)}$ 必须在 $[L, H]$ 区间内,所以还需要进行**裁剪(clipping)**,将得到的 $\lambda^{(j)}$ 代入到式(20)即可得到 $\lambda^{(i)}$。重复多次选取 $\lambda^{(i)}$ 和 $\lambda^{(j)}$,并求解子问题就构成了 SMO 算法。 412 | 413 | 最后,还有三个值得注意的点: 414 | 415 | 第一个是**如何初始化 $\mathbf{\lambda}$**?SMO 是直接将全部的拉格朗日因子初始化为0。 416 | 417 | 第二个是**如何选取** $\lambda^{(i)}$ 和 $\lambda^{(j)}$?最简单的当然是随机选取,但是实践中为了加快收敛速度,一般会采用某种启发式使得每次对目标函数的改变能最大化,比方说选取违背 KKT 条件最大的 $\lambda^{(i)}$,然后再选取与 $\lambda^{(i)}$ 间隔最大的 $\lambda^{(j)}$。 418 | 419 | 第三个是**如何判断收敛**?从前面的推导我们已经知道了 SVM 的最优解必然满足 KKT 条件,实践中我们会设定一个阈值 $\epsilon$,如果对 KKT 条件中互补松弛性质违背的程度低于 $\epsilon$,就可以认为算法已经收敛到最优解了。 420 | 421 | SMO 算法高效的秘诀一个在于它将问题简化为容易解决的子问题,另一个就是优化子问题时选取更新变量的启发式对收敛起到了加速作用。又因为 SMO 每次只选择两个拉格朗日乘子进行更新,所以计算开销和存储开销的问题都能大大缓解。 422 | 423 | 在实践中,SMO 算法还有很多小的细节,这里只关注思路而不一一赘述。 424 | 425 | ## 总结 426 | 427 | 最后总结一下: 428 | 429 | - SVM 本质上是从几何的角度切入,期望找出最鲁棒的一个分类超平面,把这个目标转化为了求最大间隔的问题。 430 | 431 | - 在最大化间隔的同时对分类结果进行约束就得到了 SVM 的原问题,又因为对偶问题有着更优良的性质,所以我们更倾向于求解对偶问题。 432 | 433 | - Slater's 条件给出的强对偶性表明求解对偶问题就可以得到原问题的解,而 KKT 条件则允许我们使用拉格朗日乘子法来求解这个带不等式约束的问题,给出了最优解需要满足的性质。 434 | 435 | - 使用拉格朗日乘子法消除掉其它变量后得到的对偶型中存在形如 $\mathbf{x}^{(i)^T}\mathbf{x}^{(j)}$ 的内积项,因此可以方便地引入核函数,利用核技巧将 SVM 拓展为非线性分类模型。 436 | 437 | - 为了避免过拟合,可以允许一部分样本违背原问题的约束,甚至误分类,这就是软间隔。我们引入了松弛变量 $\mathbf{\zeta}$ 来刻画样本违背约束的程度,并在新的目标函数中对其施加惩罚,然后同样可以推导出对偶型并求解对偶问题。 438 | 439 | - 由于使用求解器的计算&存储开销较大,所以实践中常用 SMO 算法求解对偶问题。SMO 采用的是一种类似坐标上升的思路,但为了保证约束条件成立,会每次选取两个拉格朗日乘子进行优化。 440 | 441 | ## 参考 442 | 443 | 1. [《Support Vector Machines Succinctly》](https://www.syncfusion.com/ebooks/support_vector_machines_succinctly) - Alexandre Kowalczyk, 2017(**非常推荐**) 444 | 2. [CS229 Lecture notes - Part Ⅴ Support Vector Machines](http://cs229.stanford.edu/notes/cs229-notes3.pdf) by Andrew Ng, Stanford(**经典课程**) 445 | 3. [Advanced Topics in Machine Learning: COMPGI13 - Lecture 9: Support Vector Machines](http://www.gatsby.ucl.ac.uk/~gretton/coursefiles/Slides5A.pdf) by Arthur Gretton, UCL 446 | 4. [机器学习-白板推导系列(六)-支持向量机SVM(Support Vector Machine)](https://www.bilibili.com/video/BV1Hs411w7ci) - shuhuai008 - B站(**良心 up 主**) 447 | 5. [从零推导支持向量机(SVM)](https://zhuanlan.zhihu.com/p/31652569) - 张皓的文章 - 知乎 448 | 6. [超详细SVM(支持向量机)知识点,面试官会问的都在这了](https://zhuanlan.zhihu.com/p/76946313) - 韦伟的文章 - 知乎 449 | 7. [SVM---这可能是最直白的推导了](https://zhuanlan.zhihu.com/p/86290583) - 文建华的文章 - 知乎 450 | 451 | 以上材料都是很好的参考材料,但因为作者的背景和水平各有不同,所以侧重点也会有所不同,说法可能会有出入,或者有一些小的错漏,这篇文章亦然,欢迎指正。 452 | 453 | -------------------------------------------------------------------------------- /code/.ipynb_checkpoints/Untitled-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 0 6 | } 7 | -------------------------------------------------------------------------------- /code/DrawLossFunction.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import numpy as np 4 | import seaborn 5 | from matplotlib import pyplot as plt 6 | 7 | def ZeroOneLoss(z): 8 | return 0 if z>0 else 1 9 | 10 | def HingeLoss(z): 11 | return max(0,1-z) 12 | 13 | 14 | def ExponentialLoss(z): 15 | return np.exp(-z) 16 | 17 | 18 | def LogisticLoss(z): 19 | return np.log2(1+np.exp(-z)) 20 | 21 | 22 | z = [i/1000 for i in range(-2000,2000,5)] 23 | 24 | y0 = [ZeroOneLoss(i) for i in z] 25 | y1 = [HingeLoss(i) for i in z] 26 | y2 = [ExponentialLoss(i) for i in z] 27 | y3 = [LogisticLoss(i) for i in z] 28 | 29 | plt.title('Loss function',fontsize=15) 30 | plt.plot(z,y0,'k',label='Zero-One loss') 31 | plt.plot(z,y1,'r',label='Hinge loss') 32 | plt.plot(z,y2,'g--',label='ExponentialLoss loss') 33 | plt.plot(z,y3,'b-.',label='Logistic loss') 34 | plt.xlabel('z',fontsize=15) 35 | plt.ylabel('Loss',fontsize=15) 36 | plt.ylim(0,3) 37 | plt.legend(fontsize=15) 38 | plt.show() 39 | -------------------------------------------------------------------------------- /graph/LossFunction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/LossFunction.png -------------------------------------------------------------------------------- /graph/NB.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/NB.jpg -------------------------------------------------------------------------------- /graph/PointToHyperPlane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/PointToHyperPlane.png -------------------------------------------------------------------------------- /graph/SMO.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/SMO.jpg -------------------------------------------------------------------------------- /graph/SPODE.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/SPODE.jpg -------------------------------------------------------------------------------- /graph/TAN.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/TAN.jpg -------------------------------------------------------------------------------- /graph/exercise3.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/exercise3.3.png -------------------------------------------------------------------------------- /graph/multi-layer_feedforward_neural_networks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/multi-layer_feedforward_neural_networks.png -------------------------------------------------------------------------------- /graph/perceptron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/perceptron.png -------------------------------------------------------------------------------- /graph/second_derivative_of_loss_function.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/second_derivative_of_loss_function.png -------------------------------------------------------------------------------- /graph/second_derivative_of_sigmoid_function.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/second_derivative_of_sigmoid_function.png -------------------------------------------------------------------------------- /graph/version_space.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/version_space.pdf -------------------------------------------------------------------------------- /graph/version_space.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/graph/version_space.png -------------------------------------------------------------------------------- /reading/10种机器学习算法的要点.md: -------------------------------------------------------------------------------- 1 | # 10种机器学习算法的要点 2 | 3 | 本文转载自伯乐在线,链接:[10种机器学习算法的要点(附 Python 和 R 代码)](http://blog.jobbole.com/92021/),原文是[英文版](http://www.analyticsvidhya.com/blog/2015/08/common-machine-learning-algorithms/)。我对内容和排版进行了一些的调整,舍弃了R的代码(因为个人主要关注Python),对R感兴趣的话直接阅读链接里的原文就可以了。 4 | 5 | 同时,我不得不说,该译版有相当多翻译不正确和词不达意的地方,所以更推荐读英文原版。负责任地说,读完以后,觉得这篇文章的内容比较一般,可能会对初学者有一点点的帮助,代码也只是很简单地调库。so...想好好学的话,还是认真找本书看吧。 6 | 7 | ## 前言 8 | 9 | > 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注,但是这家公司真正的未来在于机器学习,一种让计算机更聪明、更个性化的技术。 10 | 11 | 也许我们生活在人类历史上最关键的时期:从使用大型计算机,到个人电脑,再到现在的云计算。关键的不是过去发生了什么,而是将来会有什么发生。 12 | 13 | 工具和技术的民主化,让像我这样的人对这个时期兴奋不已。计算的蓬勃发展也是一样。如今,作为一名数据科学家,用复杂的算法建立数据处理机器一小时能赚到好几美金。但能做到这个程度可并不简单!我也曾有过无数黑暗的日日夜夜。 14 | 15 | ## 谁能从这篇指南里受益最多? 16 | 17 | 我今天所给出的,也许是我这辈子写下的最有价值的指南。 18 | 19 | 这篇指南的目的,是**为那些有追求的数据科学家和机器学习狂热者们,简化学习旅途**。这篇指南会让你动手解决机器学习的问题,并从实践中获得真知。我提供的是几个**机器学习算法的高水平理解**,以及运行这些算法的 R 和 Python 代码。这些应该足以让你亲自试一试了。 20 | 21 | 我特地跳过了这些技术背后的数据,因为一开始你并不需要理解这些。如果你想从数据层面上理解这些算法,你应该去别处找找。但如果你想要在开始一个机器学习项目之前做些准备,你会喜欢这篇文章的。 22 | 23 | ## 广义来说,有三种机器学习算法 24 | 25 | ### 1、 监督式学习 26 | 27 | 工作机制:这个算法由一个目标变量或结果变量(或因变量)组成。这些变量由已知的一系列预示变量(自变量)预测而来。利用这一系列变量,我们生成一个**将输入值映射到期望输出值的函数**。这个**训练过程会一直持续,直到模型在训练数据上获得期望的精确度**。监督式学习的例子有:回归、决策树、随机森林、K – 近邻算法、逻辑回归等。 28 | 29 | ### 2、非监督式学习 30 | 31 | 工作机制:在这个算法中,没有任何目标变量或结果变量要预测或估计。这个算法用在不同的**组内聚类分析**。这种分析方式被广泛地用来细分客户,根据干预的方式分为不同的用户组。非监督式学习的例子有:关联算法和 K – 均值算法。 32 | 33 | ### 3、强化学习 34 | 35 | 工作机制:这个算法**训练机器进行决策**。它是这样工作的:机器被放在一个能让它**通过反复试错来训练自己**的环境中。机器从过去的经验中进行学习,并且尝试利用了解最透彻的知识作出精确的商业判断。 强化学习的例子有马尔可夫决策过程。 36 | 37 | ## 常见机器学习算法名单 38 | 39 | 这里是一个常用的机器学习算法名单。这些算法几乎可以用在所有的数据问题上: 40 | 41 | 1. 线性回归 42 | 2. 逻辑回归 43 | 3. 决策树 44 | 4. SVM 45 | 5. 朴素贝叶斯 46 | 6. K最近邻算法 47 | 7. K均值算法 48 | 8. 随机森林算法 49 | 9. 降维算法 50 | 10. Gradient Boost 和 Adaboost 算法 51 | 52 | ## 1、线性回归 53 | 54 | 线性回归通常用于根据连续变量估计实际数值(房价、呼叫次数、总销售额等)。我们**通过拟合最佳直线来建立自变量和因变量的关系**。这条最佳直线叫做回归线,并且用 Y= a*X + b 这条线性等式来表示。 55 | 56 | 理解线性回归的最好办法是回顾一下童年。假设在不问对方体重的情况下,让一个五年级的孩子按体重从轻到重的顺序对班上的同学排序,你觉得这个孩子会怎么做?他(她)很可能会目测人们的身高和体型,综合这些可见的参数来排列他们。这是现实生活中使用线性回归的例子。实际上,这个孩子发现了身高和体型与体重有一定的关系,这个关系看起来很像上面的等式。 57 | 58 | 在这个等式中: 59 | 60 | - Y:因变量 61 | - a:斜率 62 | - x:自变量 63 | - b:截距 64 | 65 | 系数 a 和 b 可以通过最小二乘法获得。 66 | 67 | 参见下例。我们找出最佳拟合直线 y=0.2811x+13.9。已知人的身高,我们可以通过这条等式求出体重。 68 | 69 | ![Linear Regression](http://ww4.sinaimg.cn/mw690/6941baebjw1ewidicea70j20d807vglw.jpg) 70 | 71 | 线性回归的两种主要类型是一元线性回归和多元线性回归。**一元线性回归的特点是只有一个自变量。多元线性回归的特点正如其名,存在多个自变量**。找最佳拟合直线的时候,你**可以拟合到多项或者曲线回归**。这些就被叫做多项或曲线回归。 72 | 73 | **Python 代码** 74 | 75 | ```python 76 | #Import Library 77 | #Import other necessary libraries like pandas, numpy... 78 | from sklearn import linear_model 79 | 80 | #Load Train and Test datasets 81 | #Identify feature and response variable(s) and values must be numeric and numpy arrays 82 | x_train=input_variables_values_training_datasets 83 | y_train=target_variables_values_training_datasets 84 | x_test=input_variables_values_test_datasets 85 | 86 | # Create linear regression object 87 | linear = linear_model.LinearRegression() 88 | 89 | # Train the model using the training sets and check score 90 | linear.fit(x_train, y_train) 91 | linear.score(x_train, y_train) 92 | 93 | #Equation coefficient and Intercept 94 | print('Coefficient: n', linear.coef_) 95 | print('Intercept: n', linear.intercept_) 96 | 97 | #Predict Output 98 | predicted= linear.predict(x_test) 99 | ``` 100 | 101 | ## 2、逻辑回归 102 | 103 | 别被它的名字迷惑了!这是一个分类算法而不是一个回归算法。该算法可根据已知的一系列因变量估计离散数值(比方说二进制数值 0 或 1,是或否,真或假)。简单来说,它通过**将数据拟合进一个逻辑函数来预估一个事件出现的概率**。因此,它也被叫做逻辑回归。因为它预估的是概率,所以它的**输出值大小在 0 和 1 之间**(正如所预计的一样)。 104 | 105 | 让我们再次通过一个简单的例子来理解这个算法。 106 | 107 | 假设你的朋友让你解开一个谜题。这只会有两个结果:你解开了或是你没有解开。想象你要解答很多道题来找出你所擅长的主题。这个研究的结果就会像是这样:假设题目是一道十年级的三角函数题,你有70%的可能会解开这道题。然而,若题目是个五年级的历史题,你只有30%的可能性回答正确。这就是逻辑回归能提供给你的信息。 108 | 109 | 从数学上看,在结果中,几率的对数使用的是预测变量的线性组合模型。 110 | 111 | ```python 112 | odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence 113 | ln(odds) = ln(p/(1-p)) 114 | logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk 115 | ``` 116 | 117 | > 也即使用属性的线性组合来表示对数几率 118 | 119 | 在上面的式子里,p 是我们感兴趣的特征出现的概率。它**选用使观察样本值的可能性最大化的值作为参数**,而**不是通过计算误差平方和的最小值**(就如一般的回归分析用到的一样)。 120 | 121 | 现在你也许要问了,为什么我们要求出对数呢?简而言之,这种方法是复制一个阶梯函数的最佳方法之一。我本可以更详细地讲述,但那就违背本篇指南的主旨了。 122 | 123 | ![logicstic regression](http://ww2.sinaimg.cn/mw690/6941baebjw1ewidicf28vj20et0ba3z1.jpg) 124 | 125 | ```python 126 | # Import Library 127 | from sklearn.linear_model import LogisticRegression 128 | # Assumed you have, X (predictor) and Y (target) for training data set 129 | # and x_test(predictor) of test_dataset 130 | # Create logistic regression object 131 | model = LogisticRegression() 132 | 133 | # Train the model using the training sets and check score 134 | model.fit(X, y) 135 | model.score(X, y) 136 | 137 | # Equation coefficient and Intercept 138 | print('Coefficient: n', model.coef_) 139 | print('Intercept: n', model.intercept_) 140 | 141 | # Predict Output 142 | predicted= model.predict(x_test) 143 | ``` 144 | 145 | #### 更进一步: 146 | 147 | 你可以尝试更多的方法来改进这个模型: 148 | 149 | - 加入交互项 150 | - 精简模型特性 151 | - 使用正则化方法 152 | - 使用非线性模型 153 | 154 | > **交互项**:指的是将两个或多个特征组合在一起形成新的特征,比方说每个样本有特征 x1 和 x2,那么就可以产生一个交互项 x1*x2 作为新的特征。 155 | 156 | ## 3、决策树 157 | 158 | 这是我最喜爱也是最频繁使用的算法之一。这个监督式学习算法通常被用于分类问题。令人惊奇的是,它同时适用于分类变量和连续因变量。在这个算法中,我们将总体分成两个或更多的同类群。这是**根据最重要的属性或者自变量来分成尽可能不同的组别**。想要知道更多,可以阅读:[简化决策树](http://www.analyticsvidhya.com/blog/2015/01/decision-tree-simplified/)。 159 | 160 | ![decision tree](http://ww4.sinaimg.cn/mw690/6941baebjw1ewidibl4wpj20g30bujsw.jpg) 161 | 162 | 在上图中你可以看到,根据多种属性,人群被分成了不同的四个小组,来判断 “他们会不会去玩”。为了把总体分成不同组别,需要用到许多技术,比如说 Gini、Information Gain、Chi-square、entropy。 163 | 164 | 理解决策树工作机制的最好方式是玩Jezzball,一个微软的经典游戏(见下图)。这个游戏的最终目的,是在一个可以移动墙壁的房间里,通过造墙来分割出没有小球的、尽量大的空间。 165 | 166 | ![decision tree](http://ww4.sinaimg.cn/mw690/6941baebjw1ewidibflwaj208204uwei.jpg) 167 | 168 | 因此,每一次你用墙壁来分隔房间时,都是在尝试着在同一间房里创建两个不同的总体。相似地,决策树也在把总体尽量分割到不同的组里去。 169 | 170 | 更多信息请见:[决策树算法的简化](http://www.analyticsvidhya.com/blog/2015/01/decision-tree-simplified/) 171 | 172 | **Python代码** 173 | 174 | ```python 175 | # Import Library 176 | # Import other necessary libraries like pandas, numpy... 177 | from sklearn import tree 178 | 179 | # Assumed you have, X (predictor) and Y (target) for 180 | # training data set and x_test(predictor) of test_dataset 181 | # Create tree object 182 | model = tree.DecisionTreeClassifier(criterion='gini') 183 | # for classification, here you can change the algorithm as gini or 184 | # entropy (information gain) by default it is gini 185 | 186 | # model = tree.DecisionTreeRegressor() for regression 187 | # Train the model using the training sets and check score 188 | model.fit(X, y) 189 | model.score(X, y) 190 | 191 | #Predict Output 192 | predicted= model.predict(x_test) 193 | ``` 194 | 195 | ## 4、支持向量机 196 | 197 | 这是一种分类方法。在这个算法中,我们将每个数据在N维空间中用点标出(N是你所有的特征总数),每个特征的值是一个坐标的值。 198 | 199 | 举个例子,如果我们只有身高和头发长度两个特征,我们会在二维空间中标出这两个变量,每个点有两个坐标。 200 | 201 | ![SVM](http://ww3.sinaimg.cn/mw690/6941baebjw1ewidibaihyj20nw0g6jsi.jpg) 202 | 203 | 现在,我们会找到将两组不同数据分开的一条直线。对两个分组中距离该直线最近的那些点做最优化。 204 | 205 | ![SVM](http://ww1.sinaimg.cn/mw690/6941baebjw1ewidiaz88rj208c05ojrl.jpg) 206 | 207 | 上面示例中的黑线将数据分类优化成两个小组,两组中距离最近的点(图中A、B点)到达黑线的距离满足最优条件。这条直线就是我们的分割线。接下来,测试数据落到直线的哪一边,我们就将它分到哪一类去。 208 | 209 | 更多请见:[支持向量机的简化](http://www.analyticsvidhya.com/blog/2014/10/support-vector-machine-simplified/) 210 | 211 | **将这个算法想作是在一个 N 维空间玩 JezzBall。需要对游戏做一些小变动**: 212 | 213 | - 比起之前只能在水平方向或者竖直方向画直线,现在你可以在任意角度画线或平面。 214 | - 游戏的目的变成把不同颜色的球分割在不同的空间里。 215 | - 球的位置不会改变。 216 | 217 | **Python代码** 218 | 219 | ```python 220 | # Import Library 221 | from sklearn import svm 222 | 223 | # Assumed you have, X (predictor) and Y (target) for training data set 224 | # and x_test(predictor) of test_dataset 225 | # Create SVM classification object 226 | model = svm.svc() 227 | # there is various option associated with it, 228 | # this is simple for classification. 229 | # You can refer link, for more detail. 230 | 231 | # Train the model using the training sets and check score 232 | model.fit(X, y) 233 | model.score(X, y) 234 | 235 | # Predict Output 236 | predicted= model.predict(x_test) 237 | ``` 238 | 239 | ## 5、朴素贝叶斯 240 | 241 | 在预示变量间相互独立的前提下,根据贝叶斯定理可以得到朴素贝叶斯这个分类方法。用更简单的话来说,一个朴素贝叶斯分类器假设一个分类的特性与该分类的其它特性不相关。举个例子,如果一个水果又圆又红,并且直径大约是 3 英寸,那么这个水果可能会是苹果。即便这些特性互相依赖,或者依赖于别的特性的存在,朴素贝叶斯分类器还是会**假设这些特性分别独立**地暗示这个水果是个苹果。 242 | 243 | 朴素贝叶斯模型**易于建造,且对于大型数据集非常有用**。虽然简单,但是朴素贝叶斯的表现却超越了非常复杂的分类方法。 244 | 245 | 贝叶斯定理提供了一种从P(c)、P(x)和P(x|c) 计算后验概率 P(c|x) 的方法。请看以下等式: 246 | 247 | ![NB](http://ww4.sinaimg.cn/mw690/6941baebjw1ewidiaf1esj208c04sdg3.jpg) 248 | 249 | 在这里, 250 | 251 | - P(c|x) 是已知预示变量(属性)的前提下,类(目标)的后验概率 252 | - P(c) 是类的先验概率 253 | - P(x|c) 是可能性,即已知类的前提下,预示变量的概率 254 | - P(x) 是预示变量的先验概率 255 | 256 | **例子**:让我们用一个例子来理解这个概念。在下面,我有一个天气的训练集和对应的目标变量“Play”。现在,我们需要根据天气情况,将会“玩”和“不玩”的参与者进行分类。让我们执行以下步骤。 257 | 258 | 步骤1:把数据集转换成频率表。 259 | 260 | 步骤2:利用类似“当Overcast可能性为0.29时,玩耍的可能性为0.64”这样的概率,创造 Likelihood 表格。 261 | 262 | ![NB](http://ww4.sinaimg.cn/mw690/6941baebjw1ewidi9yyh7j20nx08qmz6.jpg) 263 | 264 | 步骤3:现在,使用朴素贝叶斯等式来计算每一类的后验概率。后验概率最大的类就是预测的结果。 265 | 266 | **问题**:如果天气晴朗,参与者就能玩耍。这个陈述正确吗? 267 | 268 | 我们可以使用讨论过的方法解决这个问题。于是 P(会玩 | 晴朗)= P(晴朗 | 会玩)* P(会玩)/ P (晴朗) 269 | 270 | 我们有 P (晴朗 |会玩)= 3/9 = 0.33,P(晴朗) = 5/14 = 0.36, P(会玩)= 9/14 = 0.64 271 | 272 | 现在,P(会玩 | 晴朗)= 0.33 * 0.64 / 0.36 = 0.60,有更大的概率。 273 | 274 | 朴素贝叶斯使用了一个相似的方法,通过不同属性来预测不同类别的概率。这个算法**通常被用于文本分类,以及涉及到多个类的问题**。 275 | 276 | **Python代码** 277 | 278 | ```python 279 | # Import Library 280 | from sklearn.naive_bayes import GaussianNB 281 | 282 | # Assumed you have, X (predictor) and Y (target) for training data set 283 | # and x_test(predictor) of test_dataset 284 | # Create SVM classification object 285 | model = GaussianNB() 286 | # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link 287 | # Train the model using the training sets and check score 288 | model.fit(X, y) 289 | 290 | # Predict Output 291 | predicted= model.predict(x_test) 292 | ``` 293 | 294 | ## 6、KNN(K – 最近邻算法) 295 | 296 | 该算法可用于分类问题和回归问题。然而,在业界内,K – 最近邻算法更常用于分类问题。K – 最近邻算法是一个简单的算法。它**储存所有的案例,通过周围k个案例中的大多数情况划分新的案例。根据一个距离函数,新案例会被分配到它的 K 个近邻中最普遍的类别中去**。 297 | 298 | 这些距离函数可以是欧式距离、曼哈顿距离、明式距离或者是汉明距离。前三个距离函数用于连续函数,第四个函数(汉明函数)则被用于分类变量。如果 K=1,新案例就直接被分到离其最近的案例所属的类别中。有时候,使用 KNN 建模时,**选择 K 的取值是一个挑战**。 299 | 300 | 更多信息:K – 最近邻算法入门(简化版) 301 | 302 | ![KNN](http://ww3.sinaimg.cn/mw690/6941baebjw1ewidi9vrbpj20jv08pwew.jpg) 303 | 304 | 我们可以很容易地在现实生活中应用到 KNN。如果想要了解一个完全陌生的人,你也许想要去找他的好朋友们或者他的圈子来获得他的信息。 305 | 306 | 在选择使用 KNN 之前,你需要考虑的事情: 307 | 308 | - KNN 的计算成本很高。 309 | - 变量应该先标准化(normalized),不然会被更高范围的变量偏倚。 310 | - 在使用KNN之前,要在野值去除和噪音去除等前期处理多花功夫。 311 | 312 | **Python代码** 313 | 314 | ```python 315 | # Import Library 316 | from sklearn.neighbors import KNeighborsClassifier 317 | 318 | # Assumed you have, X (predictor) and Y (target) for training data set 319 | # and x_test(predictor) of test_dataset 320 | # Create KNeighbors classifier object 321 | model = KNeighborsClassifier(n_neighbors=6) 322 | # default value for n_neighbors is 5 323 | 324 | # Train the model using the training sets and check score 325 | model.fit(X, y) 326 | 327 | # Predict Output 328 | predicted= model.predict(x_test) 329 | ``` 330 | 331 | ## 7、K 均值算法 332 | 333 | K – 均值算法是一种非监督式学习算法,它能解决聚类问题。使用 K – 均值算法来**将一个数据归入一定数量的集群**(假设有 k 个集群)的过程是简单的。**一个集群内的数据点是均匀齐次的,并且异于别的集群**。 334 | 335 | 还记得从墨水渍里找出形状的活动吗?K – 均值算法在某方面类似于这个活动。观察形状,并延伸想象来找出到底有多少种集群或者总体。 336 | 337 | ![KMeans](http://ww3.sinaimg.cn/mw690/6941baebjw1ewidi90napj207w08cq2y.jpg) 338 | 339 | **K – 均值算法怎样形成集群**: 340 | 341 | 1. K – 均值算法选择k个点。这些点称作为质心。 342 | 2. 每一个数据点与距离最近的质心形成一个集群,也就是 k 个集群。 343 | 3. 根据现有的集群成员,算出每个集群的平均点。也即新质心。 344 | 4. 当我们有新质心后,重复步骤 2 和步骤 3。找到距离每个数据点最近的质心,并把这个数据点与新的集群联系起来。重复这个过程,直到数据都收敛了,也就是当质心不再改变。 345 | 346 | **如何决定 K 值**: 347 | 348 | K – 均值算法涉及到集群,每个集群有自己的质心。一个集群内的质心和各数据点之间距离的平方和形成了这个集群的平方值之和。同时,当所有集群的平方值之和加起来的时候,就组成了当前方案的平方值之和。 349 | 350 | 我们知道,当集群的数量增加时,当前方案的平方值之和会持续下降。但是,如果你将用图表来表示,就会看到这个值开始时随k上升而快速减少,但到某个值 k 之后,减少的速度就大大下降了。从这里,我们可以找到集群数量的最优值。 351 | 352 | ![KMeans](http://ww2.sinaimg.cn/mw690/6941baebjw1ewidi8p97lj20sg0ect9p.jpg) 353 | 354 | **Python代码** 355 | 356 | ```python 357 | # Import Library 358 | from sklearn.cluster import KMeans 359 | 360 | # Assumed you have, X (attributes) for training data set and 361 | # x_test(attributes) of test_dataset 362 | # Create KNeighbors classifier object model 363 | model = KMeans(n_clusters=3, random_state=0) 364 | 365 | # Train the model using the training sets and check score 366 | model.fit(X) 367 | 368 | # Predict Output 369 | predicted= model.predict(x_test) 370 | ``` 371 | 372 | ## 8、随机森林 373 | 374 | 随机森林是表示决策树总体的一个专有名词。在随机森林算法中,我们有一系列的决策树(因此又名“森林”)。为了根据一个新对象的属性将其分类,每一个决策树有一个分类,称之为这个决策树“投票”给该分类。这个森林**选择获得森林里(在所有树中)获得票数最多的分类**。 375 | 376 | 每棵树是像这样种植养成的: 377 | 378 | 1. 如果训练集的案例数是 N,则从 N 个案例中用重置抽样法随机抽取样本。这个样本将作为“养育”树的训练集。 379 | 2. 假如有 M 个输入变量,则定义一个数字 m< 明天的机器学习,一定不是深度学习。 14 | 15 | ## 目录 16 | 17 | - [今日头条李磊:会思考的通用智能机器还有多远?](#今日头条李磊:会思考的通用智能机器还有多远?) 18 | - [类人智能](#类人智能) 19 | - [理性智能](#理性智能) 20 | - [林宙辰:机器学习一阶优化算法](#林宙辰:机器学习一阶优化算法) 21 | - [刘威:机器学习的明天会更好](#刘威:机器学习的明天会更好) 22 | - [刘铁岩:破解机器学习的阿喀琉斯之踵](#刘铁岩:破解机器学习的阿喀琉斯之踵) 23 | - [朱军:交互式机器学习](#朱军:交互式机器学习) 24 | - [机器学习的弱点与明天](#机器学习的弱点与明天) 25 | - [从各位专家的角度来看,现在的机器学习的算法存在哪些弱点,以及这些弱点该用哪些思路解决呢?](#戴文渊:从各位专家的角度来看,现在的机器学习的算法存在哪些弱点,以及这些弱点该用哪些思路解决呢?) 26 | - [以后两到三年,机器学习的发展方向?](#叶杰平:以后两到三年,机器学习的发展方向?) 27 | - [医疗行业对错误的容忍度是很低的,那么各位专家认为哪些行业会给机器学习成长的时间?在哪些行业能够得到快速的广泛应用?](#提问:刚才嘉宾有讲到医疗行业对错误的容忍度是很低的,那么各位专家认为哪些行业会给机器学习成长的时间?在哪些行业能够得到快速的广泛应用?) 28 | - [总结](#总结) 29 | 30 | 31 | ## 今日头条李磊:会思考的通用智能机器还有多远? 32 | 33 | 今日头条科学家、头条实验室总监李磊带来的演讲是《会思考的通用智能机器还有多远?》。在演讲中,李磊主要对: 34 | 35 | - 人工智能是什么? 36 | - 人工智能发展到什么程度? 37 | - 人工智能面临的挑战 38 | 39 | 这三个方面进行了阐述,李磊首先阐述了对人工智能的两种定义:类人智能和理性智能。 40 | 41 | #### 类人智能 42 | 43 | - 目标是让机器像人那样思考、决策、解决问题,具备学习能力和行动能力。 44 | 45 | #### 理性智能 46 | 47 | - 研究如何通过计算方法达到合理的感知、决策、解决问题、学习和行为能力。不是和人去比较,而是把计算看成自然现象。 48 | 49 |
50 | 51 | **人工智能**要研究的内容十分广泛,包括知识表示、形式化推理、规划与决策、**机器学习**、理解文字、自然语言(人类语言)、语音识别与合成、理解图像、视觉感知以及机器人控制。目前人工智能在某些具体任务上达到或超过人类能力,但通用型智能还有漫漫长路。 52 | 53 | > 可以看到人工智能的研究方向除了机器学习之外还包含非常多的内容 54 | 55 | 李磊介绍到头条最近发布了一款奥运机器人,可以在奥运期间自动发布了450条新闻。他谈到经过过去多次的实践证明:深度学习加大数据可以较好地解决监督学习的问题。 56 | 57 | 深度学习从人脑解决问题的的思路出发,创造了人工神经网络和人工神经单元的概念,随着层数的加深,神经网络能够完成一些合理对话之类的任务。但是仍需注意人工智能和机器学习不仅仅是监督学习和深度学习,要解决的问题其实更多,目前的**深度学习还有很大的局限性,例如依赖大量标注数据**,并且这些数据的获取代价非常高;此外,目前的**深度学习的通用性还不够强**。 58 | 59 | 最后,李磊总结了**明天机器学习需要突破的三个方面**: 60 | 61 | - 需要**有可解释性的机器学习**,当机器学习模型成功和失败的时候,需要知道它成功或者失败的原因; 62 | - 机器学习能够**做更多的推理**,而**不仅仅是简单的判断**; 63 | - 过去做深度学习时需要很多的计算集群,需要耗费大量的能力,未来的是否可以实现**在不影响性能的情况下实现单位能耗**呢? 64 | 65 | > 这里第三个方面的所说的 "单位能耗" 我理解为使用一台计算机也能在不影响性能的情况下完成计算(集群虽然快,但用了非常多的计算资源,能耗很大),事实上目前也有不少关于绿色计算的研究。 66 | 67 | ## 林宙辰:机器学习一阶优化算法 68 | 69 | 北京大学信息科学技术学院机器感知与智能教育部重点实验室教授林宙辰带来的分享是 《机器学习一阶优化算法》。他主要分享了**机器学习在过去、现在、未来的优化方面的问题**。从上个世纪90年代,优化技术就已经发展的比较完备了。在此之前,可以划分为两个阶段,第一阶段到上世界60年代,此前的优化方法较为缓慢;在60年代到90年代,随着计算机的发明,有着很大进展。 70 | 71 | 按照当时所用信息类别可以划分为三类: 72 | 73 | - 第一类是只用目标函数的方法; 74 | - 第二类是一阶的方法,也就是目标函数和梯度方法; 75 | - 第三类是二阶方法,如Newton’s Methods、Sequential Quadratic Programming、Interior Point Methods。 76 | 77 | ![Nonlinear Optimization](http://img.blog.csdn.net/20160829094132594) 78 | 79 | 接着,林宙辰谈到了选择一阶方法的两个原因,并认为一阶的方法是机器学习里面一个主流的学习方法。 80 | 81 | 1. 因为一阶方法对数字精度的要求不太高; 82 | 2. 一阶方法的存储和和计算的成本较低。 83 | 84 | > 这里对PPT的翻译似乎有一点点不准确,原因1应该是 **一阶方法的收敛速度相对快**,并且**精确度对于机器学习任务来说是可接受的**。 85 | 86 | 从90年代到现在,主要是对一些现有的方法进行复兴和更好的改进。接着,他总结了一阶方法从过去到现在的研究进展,主要包括六个方面: 87 | 88 | - **Smooth -> Nonsmooth**:光滑可以对每一个点选一个梯度,选非光滑就不能选梯度,那么次梯度就比较慢,现在就是使用Proximal(最近似的); 89 | 90 | - **Convex -> Nonconvex**:首先一般只能证明非真的,如果好一点就每个据点都会收到临界点上面,2012年开始有一个非常好的理论突破,就是把这个几何理论引入到优化里面,常用的函数基本都属于这种函数类型; 91 | 92 | - **Deterministic -> Stochastic**:在大数据情况下,很难能够有计算量支持确定性,所以只能随机抽取一些样本来算,2013年张老师提出来方差下降,可以进行加速; 93 | 94 | - **One/Two Blocks -> Multiple Blocks**:如果是一个或者两个Block可以作为一个交界; 95 | 96 | - **Synchronous -> Asynchronous**:同步会导致很多机器要等着其他的机器算完之后才能进行分析,所以需要异步; 97 | 98 | - **Convergence & Convergence Rate**:Convergence Rate分析方面有更好的技术,尤其是加速差值技巧。 99 | 100 | 演讲结尾,林宙辰表示,未来的机器研究方面会集中在两个方向: 101 | 102 | 1. 计算的规模会进一步增加,需要采用**完全随机**的方式进行,否则大数据之下是无法完成这些计算的; 103 | 104 | 2. 利用**量子计算**的方法来参与规划,可以在两个层面进行: 105 | - 将传统的算法每个步骤进行量子化; 106 | - 在整体上设计量子的算法。 107 | 108 | ## 刘威:机器学习的明天会更好 109 | 110 | 腾讯AI Lab计算机视觉组负责人刘威带来的分享是《机器学习的明天会更好》。他首先讲解了机器学习的概念:机器学习通过 **历史数据** 学习 **映射函数–输入数据** 到 **输出决策** 的关系。其中**决策有多重结构和角度**。 111 | 112 | 分享中,他提到机器学习大致可以分为**浅层和深层机器学习**,其中浅度学习主流方法主要Logistic Regression, SVM, Boosting 等,但 **浅度学习只能描述相对简单的映射关系**:手工设计数据的特征表示,使用浅层网络。但浅层学习并没有死亡,还有很多方面值得深入研究下去,如: 113 | 114 | - 超大规模学习:parameter server 115 | - 聪明地构建 F (x ): (structured) sparsity, low-rank 116 | - 随机优化算法: SGD, Newton 117 | - 组合优化问题:hashing, bipartite matching, TSP 118 | - 不做独立同分布假设:transfer learning 119 | 120 | 谈到机器学习的未来到底是不是深度学习?刘威认为**深度学习可能是机器学习未来的曙光**,有了这个曙光之后,很多现在无法完成任务可以得到实现。 121 | 122 | 因此,**深度学习目前和未来的探索应该放在更深的网络上**,因为只有用更深的网络才能建模更复杂的映射,处理更有挑战的问题、更广的应用; 123 | 124 | 另外还需要**推出更强的优化算法和推广性证明** —— **如何能够对深度学习做更强的理论的干预,将更加确定深度学习就是未来的曙光;如果不能证明,则深度学习是一个很错误的道路**。 125 | 126 | ![ML future](http://img.blog.csdn.net/20160829094205660) 127 | 128 | 紧接着,刘威通过对计算机视觉的案例分析,进一步解读深度学习和浅度学习。对比传统计算机视觉,基于深度学习的计算机视觉可以全自动学习更有价值的图像特征,同时卷积神经网络算法的突破导致物体识别精度大幅上升,到2015年错误率降低到3.57%,直接解决了此类问题。同时卷积神经网络一直在深度进化,算法和工程能力的不断提升,从2012年到2016年,层次完成了从8层到1001层的巨大飞跃。 129 | 130 | 刘威最后表示:机器学习的明天一定会更好。 131 | 132 | ## 刘铁岩:破解机器学习的阿喀琉斯之踵 133 | 134 | > 阿喀琉斯之踵(Achilles' Heel),原指阿喀琉斯的脚跟,因是其唯一一个没有浸泡到神水的地方,是他唯一的弱点。后来在特洛伊战争中被人射中致命,现在一般是指**致命的弱点,要害**。 135 | 136 | 微软亚洲研究院首席研究员刘铁岩本次带来的分享是《Addressing Achilles’ Heel of Machine Learning》。他认为要想很好的回答未来“机器学习的明天”这个问题,首先需要理解**目前机器学习繁荣背后存在的隐患和软肋**。只有清楚当前的问题才能明确未来发展的方向。 137 | 138 | ![Achilles' Heel](http://img.blog.csdn.net/20160829094243001) 139 | 140 | > 配图中公式的意思是寻找最小化损失函数L的映射f,可以说这是机器学习最基础的一个思想 141 | 142 | 接着,刘铁岩谈到了最近人工智能领域有突破性进展的几个例子,如阿尔法狗战胜李世石等。在繁荣的AI背后,可以通过上图所示的公式描述常做的机器学习。其中X表示采集样本、Y表示样本标签,定义了某种学习机制、L代表损失函数,可以通过某种高效优化算法尽量小的减少损失。此后,他谈到 **机器学习在最近成功的的三个因素:前所未有大数据、复杂的机器学习模型和云计算的能力**。 143 | 144 | 但这三个因素带来便利的同时,也带来了挑战。 145 | 146 | - 首先是大数据,**标注大数据是一件非常非常代价高的事情**,并不是所有的领域都有这个能力; 147 | 148 | - 其次,大的模型表达能力是很强,但同时也非常**难以优化**,甚至有时**模型的大小会超出你的运算设备内存**; 149 | 150 | - 此外,购买一个计算机机器集群可能比较容易的事,但**将复杂的机器学习任务部署在集群上,并保证运算是没有精度损失绝非易事**。如果这些方面的技术保证没有突破,其实机器学习会被这些大数据和大模型所绑架。 151 | 152 | 微软研究院研究人员的主要做法: 153 | 154 | 1. 在没有大量标注数据时,利用相反的思想,从一个无标签数据出发制造一个伪标签,(或)从标签出发制造一个伪数据。**通过互相博弈的过程生成网络**,然后大量甚至无节制地生成训练样本,某种程度解决了样本不足的问题。 155 | 156 | 2. 当有了足够的训练数据后,需要采用深度神经网络训练出有效的模型,针对训练层数高,导致训练不充分,残差消减的问题,可以采用**增加线性通路使梯度传播比较通畅地达到顶层**。 157 | 158 | 刘铁岩针对大数据量的并行运算同步等其他问题也给出了相应的回答。 159 | 160 | 未来,刘铁岩表示微软研究院会将机器学习的研究成果逐步通过开源项目展示给大众。 161 | 162 | ## 朱军:交互式机器学习 163 | 164 | 清华大学计算机科学与技术系特别研究员朱军带来的分享主题是《交互式机器学习》。分享中,他首先介绍了机器学习的现状,他表示,目前机器学习处于一个上升时期,因此未来机器学习会有一个很好的发展前景。**目前的机器学习是数据驱动的统计机器学习**,尽管深度学习在2006年取得突破,但机器学习仍然面临很多困难: 165 | 166 | - 首先,机器学习的过程**需要大量的专家知识**; 167 | - 其次成为有经验的研究生需要训练3-5年,专家需要5-10年; 168 | - 此外,机器学习被掌握(局限)在专家和专业的开发者手中。 169 | 170 | ![](http://img.blog.csdn.net/20160829100010465) 171 | 172 | 紧接着,朱军表示交互式机器学习可能可以解决机器学习面临的问题: 173 | 174 | 1. 与用户交互可以帮助解决应用问题; 175 | 176 | 2. 交互可以更好地理解/评价模型的性能。 177 | 178 | 分享中,他总结了目前交互式机器学习中关键问题: 179 | 180 | 1. 模型应该是易于理解、易于交互; 181 | 182 | 2. 这个模型**可以接受用户的反馈**模型和学习算法; 183 | 184 | 3. 需要具有相应的高效算法; 185 | 186 | 4. **对数据噪声的鲁棒性**以及**从小样本中学习的能力**都需要考虑进来。 187 | 188 | 然后,朱军展示了他和他的团队在交互式学习方面尝试的结果。其中很重要的一点是**信息的可视化**,通过主题模型对文本进行处理,将学习到的结果在界面上展示出来,用户也可以有反馈互动。 189 | 190 | 此外,朱军提到,在交互过程中,我们是希望获取知识,也就是**众包学习**问题。一个大规模的需要收集图片高质量标注的任务,可以采用众包标注的方法,例如在世界各国上网的用户都可以写标注,大大减少了工作难度。 191 | 192 | 朱军最后表示:正在向大家走近的交互机器学习是一个很重要的机器学习方法,我们需要做的是如何更好地实现交互和更好地学习。 193 | 194 | ## 机器学习的弱点与明天 195 | 196 | 在最后的讨论环节,全体嘉宾围绕机器学习的技术与应用问题进行讨论,并回答了现场观众的问题。这里精选部分问答如下。 197 | 198 | #### 戴文渊:从各位专家的角度来看,现在的机器学习的算法存在哪些弱点,以及这些弱点该用哪些思路解决呢? 199 | 200 | 李磊:对于大量的标注数据,在标注的过程中存在很多问题,要解决这个问题,通过部分标注数据,**通过更多的逻辑让机器学习能够在过程中学会推理**,去做更复杂的问题。 201 | 202 | 朱军:当前机器学习很关心的一个方面应该是机器学习方法本身,**现在机器学习没有考虑如何能够有效地把学习方法用到解决各种具体问题中**,解决思路我认为:**除了数据之外还要用到逻辑**,从某一方面提升学习有效性和效率。 203 | 204 | 刘铁岩:在深度学习变的很普通之前,机器学习是一个高大上的领域,比如怎么懂得定义特别好的模型结构,是专家才懂得事情;有了深度学习之后,这件事变成一个高富帅的事情,只要有钱就能做,因为深度学习的技术已经可以不用一个特别复杂、自行设计的网络结构,**只要有足够的计算能力就可以**。从某种意义讲深度学习给机器学习带来一个希望:将高高在上事物拉入人间。但**深度学习并不够,它只解决了表达学习的问题,但在参数调优、运算上都还有不足**。 205 | 206 | 刘威:机器学习的挑战或者难点,我更加欣赏“快”。用户不知道机器学习有多强大,他们最直观的反应是延迟有多短。因此**快是一个侧重点,但不能丢掉其他条件,例如安全性**。 207 | 208 |
209 | 210 | #### 叶杰平:以后两到三年,机器学习的发展方向? 211 | 212 | 林宙辰:在今后,对于**算法的学习性还要加强**,在算法整体上面来进行设计规划。 213 | 214 | 刘威:我觉得还是要**以用户为主**,用户喜欢什么,我们就做什么,向更快、更高、更强发展。因为在未来2-3年,我们会**更加注重收集用户的数据**,提高用户的社交体验、丰富用户的社交娱乐、更加精准推荐等。 215 | 216 | 刘铁岩:我觉得大家现在热捧的深度学习其实只是小荷才露尖尖角,其实机器学习的流程很复杂,整个机器学习是一个很复杂的流程,深度学习其实只是非常小的一个步骤。所以我所在的研究所接下来几年会做一件事情,就是希望用**机器学习自己的思想去解决机器学习所有的自动化的问题**,有一天如果机器学习真的可以不用人干预,**从数据采集到数据的输入到特征抽取,再到模型优化参数学习超参数学习,所有的事情都能自动化进行**,才是人工智能该骄傲的那一天。 217 | 218 | 朱军:刚才所讲的,人在其中是不可能很容易就被完全替换到的,至少在我关心的问题和关系的领域内是**需要人的干预和引导**的。因此我感兴趣的方向是**交互式的机器学习**,在一定层次上机器可以降低(人的)工作量,但是在关键领域,人还是非常重要是需要考虑的因素。 219 | 220 |
221 | 222 | #### 提问:刚才嘉宾有讲到医疗行业对错误的容忍度是很低的,那么各位专家认为哪些行业会给机器学习成长的时间?在哪些行业能够得到快速的广泛应用? 223 | 224 | 刘威:对于人工智能或者机器人容忍度多强或者能不能商用,先不谈商业化的问题,我们不在乎速度多慢或者耗费多少资源、成本。但这确实很难,从2011年至今,AI都都很难做到一个商用的状态。但按照中国国情来说,做与老百姓衣食住行相关的机器学习更容易,例如打车来晚一点,也能可以容忍的买。 225 | 226 | 林宙辰:有很多行业,如果把人工智能作为辅助手段,而不是完全依赖它,那么容忍度就会很好。 227 | 228 | 刘铁岩:很多行业对人工智能的期望过于高,例如希望用人工智能做客服,就想完全取代人工,但实际是做任何事情都必须踩在地上,因此我建议各位,需要管理这些对手的期望值,告诉他们人工智能能干什么。 229 | 230 | 朱军:前面几位专家都是从应用方面,希望机器学习能够帮助很好地解决问题。事实上,在学校我不太喜欢说机器学习飞快发展,这样会产生一个预期值太高的问题,所以从学校的角度来看,我们这个行业还是要非常仔细的探讨。 231 | 232 | 李磊:我们希望机器学习解决的问日或者是机器人解决的问题,应该满足三个标准:频率高、代价低、决策轻。现在机器学习能够利用大量数据做一些决策,但这些决策,即使机器学习做错了如新闻推送,产生的影响也应该不是很大。这应该机器学习目前这个阶段能够解决的比较好的问题。 233 | 234 |
235 | 236 | ## 总结 237 | 238 | 根据专家们的观点,对于人工智能的目标而言,**机器学习的发展还处在比较初级的阶段**,目前尚不能对机器学习期望太高。工业界的专家更期待机器学习对更多的应用的支持,但机器学习商用必须能够满足快速迭代的需求,计算速度要快,所以机器学习仍然需要很高的成本,而且在一些关键领域,机器学习的精度还没有达到用户的容忍度之内。 239 | 240 | 1. 机器学习仍然对大量(标注)数据有很强的依赖,规模仍然会继续增长; 241 | 242 | 2. 深度学习不一定是机器学习的明天,而且深度学习极为依赖计算能力,但深度学习毕竟降低了机器学习的门槛,结合大数据在很多场景下是有效的; 243 | 244 | 3. 当然,浅层学习也还有深入研究的必要; 245 | 246 | 4. 机器学习模型的可解释性对于成功很重要,深度学习需要推广性证明等理论的突破; 247 | 248 | 5. 机器学习流程的简化是专家们都关注的问题,交互式机器学习就是为此而生,另外深度学习也只是解决了表达学习,在参数调优、运算上都还有不足,未来希望从数据采集、数据输入到特征抽取,再到模型优化、参数学习、超参数学习,整个流程都能自动化进行。 249 | -------------------------------------------------------------------------------- /resource/Decision tree.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/resource/Decision tree.pdf -------------------------------------------------------------------------------- /resource/Decision tree.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/resource/Decision tree.pptx -------------------------------------------------------------------------------- /resource/GitHub with MathJax 0.2.3.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/familyld/Machine_Learning/79e29796676446d87315dbc3d9abb1f563355a05/resource/GitHub with MathJax 0.2.3.crx -------------------------------------------------------------------------------- /resource/watermelon3.0alpha.csv: -------------------------------------------------------------------------------- 1 | ID,density,Sugar_content,label 2 | 1,0.697,0.46,1 3 | 2,0.774,0.376,1 4 | 3,0.634,0.264,1 5 | 4,0.608,0.318,1 6 | 5,0.556,0.215,1 7 | 6,0.403,0.237,1 8 | 7,0.481,0.149,1 9 | 8,0.437,0.211,1 10 | 9,0.666,0.091,0 11 | 10,0.243,0.0267,0 12 | 11,0.245,0.057,0 13 | 12,0.343,0.099,0 14 | 13,0.639,0.161,0 15 | 14,0.657,0.198,0 16 | 15,0.36,0.37,0 17 | 16,0.593,0.042,0 18 | 17,0.719,0.103,0 19 | --------------------------------------------------------------------------------