-
Notifications
You must be signed in to change notification settings - Fork 243
/
Stanford机器学习课程笔记3-学习理论部分.html
184 lines (181 loc) · 17 KB
/
Stanford机器学习课程笔记3-学习理论部分.html
1
2
3
4
5
6
7
8
9
10
11
12
13
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<title></title>
<style type="text/css">code{white-space: pre;}</style>
<link rel="stylesheet" href="../stylesheets/Github.css" type="text/css" />
<title>Stanford机器学习课程笔记3-学习理论部分</title>
</head>
<body>
<div id="header"><center>
<p class="header_titleline">
<a href="../index.html" target="_self" title="主页">主页 </a><a href="../Search.html" target="_self" title="站内搜索">站内搜索 </a><a href="../Projects.html" target="_self" title="项目研究">项目研究 </a><a href="../Archives.html" target="_self" title="文章存档">文章存档 </a><a href="../README.html" target="_self" title="分类目录">分类目录 </a><a href="../AboutMe.html" target="_self" title="关于我">关于我 </a>
</p>
</center></div>
<h1>Stanford机器学习课程笔记3-学习理论部分</h1>
<h4>2014-05-04 / xiahouzuoxin</h4>
<h4>Tags: 机器学习</h4>
转载请注明出处: <a href="http://xiahouzuoxin.github.io/notes/">http://xiahouzuoxin.github.io/notes/</a>
<div id="TOC">
<ul>
<li><a href="#简单补充点svm吧">简单补充点SVM吧</a></li>
<li><a href="#偏置bias与方差variance">偏置(Bias)与方差(variance)</a></li>
<li><a href="#过拟合的解决方案">过拟合的解决方案</a></li>
<li><a href="#交叉验证cross-validation">交叉验证(Cross validation)</a></li>
<li><a href="#特征选择">特征选择</a></li>
<li><a href="#实际中各组件对分类的贡献error-analysis">实际中各组件对分类的贡献(Error Analysis)</a></li>
</ul>
</div>
<!---title:Stanford机器学习课程笔记3-学习理论部分-->
<!---keywords:机器学习-->
<!---date:2014-05-04-->
<p>博文都是以Andrew Ng的讲义为基础,但绝不是照搬照抄,完全是自己理解后的总结。</p>
<h2 id="简单补充点svm吧">简单补充点SVM吧</h2>
<p>关于SVM的笔记博客内没有整理,主要是因为</p>
<ol style="list-style-type: decimal">
<li>自己对SVM是比较熟悉,大大小小的识别也用过很多SVM了,对SVM的一些理论和使用技巧可看看我之前整理的关于LibSVM使用
<ol style="list-style-type: decimal">
<li><a href="http://blog.csdn.net/xiahouzuoxin/article/details/9369131">libsvm笔记系列(1)——编译使用LIBSVM</a></li>
<li><a href="http://blog.csdn.net/xiahouzuoxin/article/details/9372805">LibSVM笔记系列(2)——如何提升LibSVM分类效果</a></li>
<li><a href="http://blog.csdn.net/xiahouzuoxin/article/details/9377441">LibSVM笔记系列(3)——初学移植libsvm的C/C++版本</a></li>
</ol></li>
<li>已经有很多关于SVM的资料和博文</li>
</ol>
<p>另外,关于LibSVM的理论,除了Andrew Ng给的Handout外,推荐的就是林智仁两份资料:</p>
<ol style="list-style-type: decimal">
<li><a href="http://download.csdn.net/detail/xiahouzuoxin/5778927">林智仁SVM讲义(英文)</a></li>
<li><a href="http://download.csdn.net/detail/xiahouzuoxin/5778941">林智仁的SVM使用方法讲义</a></li>
</ol>
<p>好了,SVM不多说了,本文主要是要说一些偏机器学习中实践的东西(虽然标题是学习理论,但其实是机器学习实践更恰当些)。</p>
<h2 id="偏置bias与方差variance">偏置(Bias)与方差(variance)</h2>
<div class="figure">
<img src="../images/Stanford机器学习课程笔记3-学习理论部分/UnderfittingAndOverfitting.png" />
</div>
<p>如上图,左边是使用一阶线性模型欠拟合,右边是使用高阶模型而产生了过拟合。因此,有条很重要的结论:</p>
<blockquote>
<p>模型并不是越复杂越好,复杂模型应对简单问题容易产生过拟合。实践时要预先对问题进行分析和定义,比如:把数据plot出来看一下</p>
</blockquote>
<p>偏置(Bias)对应的就是线性最小二乘中损失函数J的大小,因此偏置越小说明对训练数据的拟合程度越好。如上右图偏置最小,尽管如此,我们不能以偏概全(因为偏置是在训练数据上进行的衡量,对于未知数据的预测效果并不一定很好),因此引入了方差(variance)。方差是指拟合模型的波动程度,如上右图拟合模型波动太大,产生了过拟合,因此方差也是越小越好。考虑对偏置和方差进行折中,上中图才是最佳的拟合方案。</p>
<p>对于分类器误差的衡量有两个重要的概念应该理解:</p>
<ol style="list-style-type: decimal">
<li>训练误差:也有称经验风险(emprical risk)/经验误差(emprical error),指的是模型在训练数据集的误差</li>
</ol>
<p><img src="http://latex.codecogs.com/gif.latex? \widehat{\varepsilon}(h)=\frac{1}{m}\sum_{i=1}^m1\{h(x^{(i)})\neq y^{(i)}\}"></p>
<ol start="2" style="list-style-type: decimal">
<li>预测误差:也有称泛化误差(generalization error),指的是模型在未知样本即预测数据集上的误差</li>
</ol>
<p><img src="http://latex.codecogs.com/gif.latex? \widehat{\varepsilon}(h)=\frac{1}{m}\sum_{i=1}^m1\{h(x^{(i)})\neq y^{(i)}\}">,其中D为预测数据集</p>
<div class="figure">
<img src="../images/Stanford机器学习课程笔记3-学习理论部分/HighVariance.png" />
</div>
<p>如上图是实际训练过程中训练误差和预测误差随训练样本数的变化:</p>
<ul>
<li>在m=m0位置,<img src="http://latex.codecogs.com/gif.latex? |\widehat{\varepsilon}(h)-\widehat{\varepsilon}(h)|"> 很大,即训练误差和预测误差差值很大,主要由于训练样本过少造成了过拟合(对应variance很大),导致训练误差很小而预测误差很大,针对上图的解决方案就是增加m值。应对过拟合问题还有一些其它的方式,当我们的样本数据集缺乏的时候,其它方案也非常有效(下面会讨论)</li>
<li>在m=m1位置,<img src="http://latex.codecogs.com/gif.latex? |\widehat{\varepsilon}(h)-\widehat{\varepsilon}(h)|"> 很小了,训练误差接近预测误差说明模型的泛化能力好,当继续增加训练样本数量已经很难再对模型的性能有很大改善了</li>
</ul>
<div class="figure">
<img src="../images/Stanford机器学习课程笔记3-学习理论部分/HighBias.png" />
</div>
<p>如上图是实际训练过程中训练误差和预测误差随训练样本数变化的另一种情况:</p>
<ul>
<li>训练误差很大,甚至超过了期望的误差边界,这个时候明显发生了欠拟合,也就是说模型还没有充分的学习训练数据特征。这个时候对应Bias很大,主要可能是两种情况造成的:
<ol style="list-style-type: decimal">
<li>模型国语简单,应该提高模型复杂度(比如:从2阶线性模型提高到4解线性模型,模型的参数也随之增加,或者改用更复杂的模型如SVM、深度学习等);</li>
<li>特征简单,区分特性差,应该进行特征选择(下面会讲到怎么做),检验特征是否合适并选择合适的特征进行训练</li>
</ol></li>
</ul>
<h2 id="过拟合的解决方案">过拟合的解决方案</h2>
<p>之前到北京电视台听一个现场节目,有个主持人问:怎么才能做好一个演讲?大家莫衷一是,没想到主持人给的回答却是:“把话筒对着自己的嘴”。想想,很有道理啊。如何应对过拟合问题?回答是:“你得确定确实已经发生了过拟合”。怎么确定?上一节其实已经提到过,“排除不是欠拟合(训练误差很大)的情况,当训练误差和预测误差相距甚远的时候(m=m0)的情况就是发生了过拟合”。应对过拟合一般有以下几种方案:</p>
<ol style="list-style-type: decimal">
<li>减小模型复杂度,降低模型阶次。当然,改模型不是最佳的办法,不得已而用之</li>
<li>减小特征维度n,仅保留有利特征,减少无效特征的干扰</li>
<li>增加训练样本数量。当然,数据是如此的珍贵,也不是说有就有的,如果有,这无疑是最简单的办法</li>
<li>规则化(Regularization),这是最常用的方法,尤其Paper中很常见。规则化也有多种办法:
<ol style="list-style-type: decimal">
<li>增加 <img src="http://latex.codecogs.com/gif.latex? \lambda\sum{w}"> 正则化项</li>
<li>用MAP替代ML估计,其中的参数先验概率p()有正则化(避免过拟合)效果。这部分就不做笔记了,详见<a href="http://cs229.stanford.edu/notes/cs229-notes5.pdf">Andrew Ng的讲义</a>中Bayesian statistics and regularizaiton部分</li>
</ol></li>
</ol>
<h2 id="交叉验证cross-validation">交叉验证(Cross validation)</h2>
<p>那既然不能用训练误差衡量分类器的好坏,那如何在训练数据集上衡量一个分类器的好坏呢。或者说,如何选择最佳的分类器参数呢?对了,就是交叉验证(CV)。CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。</p>
<ol style="list-style-type: decimal">
<li><p>Hold-Out Method</p>
<p>将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此Hold-OutMethod下分类器的性能指标.此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性.</p></li>
<li><p>K-fold Cross Validation(记为K-CV)</p>
<p>将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性.</p></li>
<li><p>Leave-One-Out Cross Validation(记为LOO-CV)</p>
<p>如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.相比于前面的K-CV,LOO-CV有两个明显的优点:</p>
<ul>
<li>每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。</li>
<li>实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。</li>
</ul>
<p>但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间.</p></li>
</ol>
<p>在LibSVM中,可以通过设置svm-train的-v参数设置交叉验证,-v表示交叉验证的分组数。</p>
<h2 id="特征选择">特征选择</h2>
<p>现在面临这么一个问题:现在采集了很多特征,有些对分类是有效的,有些是无效的,但不知道哪些有效,哪些无效。如何从这些特征集合F中选择有效的特征子集Fi,这本身是一个NP-Hard问题,如果随机组合特征放进训练机训练,则自少要有2^N种情况,N是特征类别数。有一种启发式的方法可以进行特征选择操作:</p>
<div class="figure">
<img src="../images/Stanford机器学习课程笔记3-学习理论部分/ForwardSearch.png" />
</div>
<p>然而,上面的方法效果一般来说还是不错,但依然很慢,需要O(N^2),该方法称为Forward search。当然,上面是一个个地加特征,也先设F为特征全集,然后一个个地减特征,这种方式称为Backward search。Andrew Ng老师还提供了复杂度更低,但相对效果要差一些的算法:Filter feature selection。计算特征xi和label y之间的相关特性,使用互信息(mutual information)来度量,</p>
<p><img src="http://latex.codecogs.com/gif.latex? MI(x,y)=\sum_{x_i \in \{0,1\}}\sum_{y\in\{0,1\}}p(x,y)log\frac{p(x_i,y)}{p(x_i)p(y)}"></p>
<p>其中p(xi,y)、p(xi)、p(y)都可以从训练数据中估计出来,上面的MI(x,y)其实就是KL距离,</p>
<p><img src="http://latex.codecogs.com/gif.latex? MI(x,y)=KL({p(x_i,y)}||{p(x_i)p(y)})"></p>
<p>KL距离表示了两个向量之间的diffrence,MI越接近0,说明特征xi与y之间的独立性越好,特征对label y的贡献越小。最后对MI排个序,选择相关性最大的K个特征就好。不过,实际效果听说要比直接用Forward search差不少,主要优势就是复杂度低O(1)。</p>
<h2 id="实际中各组件对分类的贡献error-analysis">实际中各组件对分类的贡献(Error Analysis)</h2>
<p>Andrew Ng老师下面的Face Recognition任务,任务中提取特征包括很多组件(背景移除、人脸检测、眼睛分割、鼻子分割、嘴分割),怎么衡量各个组件对最终分类效果的影响?</p>
<div class="figure">
<img src="../images/Stanford机器学习课程笔记3-学习理论部分/FaceRecognition.png" />
</div>
<p>先搭建系统原型(Overall system),直接输入图像作为特征进行识别,再逐一加入特征,没次加入特征后都与Groudtruth进行对比得到精度:</p>
<div class="figure">
<img src="../images/Stanford机器学习课程笔记3-学习理论部分/FaceRecognitionAccuracy.png" />
</div>
<p>从表中可以看出,从remove background到Face detection提升效果显著91%-85.1%,而remove background仅提升了1%,所以remove background是无关紧要的特征,而Face detection操作却非常重要。</p>
<div class="ds-thread" data-thread-key="Stanford机器学习课程笔记3-学习理论部分" data-title="Stanford机器学习课程笔记3-学习理论部分" data-url="xiahouzuoxin.github.io/notes/html/Stanford机器学习课程笔记3-学习理论部分.html"></div>
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"slide":{"type":"slide","bdImg":"5","bdPos":"right","bdTop":"300"},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
<!-- 多说公共JS代码 start (一个网页只需插入一次) -->
<script type="text/javascript">
var duoshuoQuery = {short_name:"xiahouzuoxin"};
(function() {
var ds = document.createElement('script');
ds.type = 'text/javascript';ds.async = true;
ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
ds.charset = 'UTF-8';
(document.getElementsByTagName('head')[0]
|| document.getElementsByTagName('body')[0]).appendChild(ds);
})();
</script>
<!-- 多说公共JS代码 end -->
<div id="footer">
<p class="footer_subline">联系邮箱: xiahouzuoxin@163.com</p>
<p class="footer_subline">声明: 本站所有文章如非特别说明均为原创,转载请注明出处!
<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1253219218'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/z_stat.php%3Fid%3D1253219218%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>
</p>
</div>
<!-- 回到顶部 -->
<script>
lastScrollY=0;
function heartBeat(){
var diffY;
if (document.documentElement && document.documentElement.scrollTop)
diffY = document.documentElement.scrollTop;
else if (document.body)
diffY = document.body.scrollTop
else
{/*Netscape stuff*/}
percent=.1*(diffY-lastScrollY);
if(percent>0)percent=Math.ceil(percent);
else percent=Math.floor(percent);
document.getElementById("full").style.top=parseInt(document.getElementById("full").style.top)+percent+"px";
lastScrollY=lastScrollY+percent;
}
suspendcode="<div id=\"full\" style='right:1px;POSITION:absolute;TOP:600px;z-index:100'><a onclick='window.scrollTo(0,0);'><img src='../images/top.png'></a><br></div>"
document.write(suspendcode);
window.setInterval("heartBeat()",1);
</script>
</body>
</html>