机器学习

1. 机器学习引入
引用著名的西瓜书上对机器学习的引入。试想这样一个场景,傍晚小街路面上沁出微雨
后的湿润,和煦的细风吹来,抬头看看天边的晚霞。心里想着明天又是一个好天气。走到水
果摊旁,挑了个色泽青绿、敲起来声音浊响的青绿西瓜,一边期待着西瓜皮薄肉厚瓤甜的爽
落感,一边愉快地想着,明天学习 Python 机器学习一定要狠下功夫,基础概念搞得清清楚
楚,案例作业也是信手拈来,我们的学习效果一定差不了。
希望大家在学习完之后有这样的感觉,我们首先大致了解什么是“机器学习”(machine
learning)。
回想刚刚我们买西瓜的场景,我们会发现这里涉及很多基于经验做出的预判。
( (1 )为什么看到微湿路面、感到和风、天边晚霞就认为明天是好天呢?
答:这是因为在我们的生活经验中已经遇见过很多类似的情况,前一天观察到上述特征
后,第二天天气通常会很好。
( (2 )为什么色泽青绿、敲声浊响就能判断出是正熟的好西瓜呢?
答:这是因为我们吃过、看过很多的西瓜,所以基于色泽、敲声这几个特征我们就可以
做出相当好的判断。
我们从以往的学习经验知道,在学习上下足了功夫、弄清了概念、做好了作业,自然可
以取得好成绩。
通过前面几个例子,我们能做出有效的预判,是因为我们积累了许多经验,而通过对经
验的利用就能对新情况做出有效决策。
上面对经验的利用是靠我们人类自身完成的,计算机能帮我们做什么?
因此,我们引入【 基础概念】机器学习,它正式这样一门学科,它致力于研究如何通过
计算(CPU 计算和 GPU 计算)的手段,利用经验来改善(计算机)系统自身的性能。
解 【加深理解 1】 】专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技
能,重新组织已有的知识结构使之不断改善(计算机系统)自身的性能。 它是 人工智能 的核心 ,
是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域 。
【解 加深理解 2】而在计算机中,“经验”通常以“数据”形式存在。因此,机器学习所
研究的主要内容就是关于在计算机上从数据中产生 “ 模型( (model) ) ” 算法,也叫做 “ 学习
算法(learning algorithm) )”,一般“模型”泛指从数据中学得的(全局性的)结果。
有了学习算法我们就可以把经验数据提供给它,它就能基于这些数据产生模型;而在
面对新的情况时(如看到一个没切开的西瓜),模型会给我们提供相应的判断(如是不是
好瓜)。
接下来了解一下机器学习的发展:
2. 机器学习三次浪潮
机器学习的三次浪潮也可以说是人工智能的三次浪潮,因为机器学习是人工智能
(Artificial Intelligence)研究发展到一定阶段的必然产物。
 1956 Artificial Intelligence 提出
1956年夏季,以麦卡赛、明斯基、罗切斯特和申农等为首的一批有远见卓识的年轻科
学家在一起聚会,共同研究和探讨用机器模拟智能的一系列有关问题,并首次提出了“人工
智能”这一术语,它标志着“人工智能”这门新兴学科的正式诞生。IBM 公司“深蓝”电脑
击败了人类的世界国际象棋冠军更是人工智能技术的一个完美表现。人工智能的目的就是让
计算机这台机器能够像人一样思考。
 1950-1970
符号主义流派:专家系统占主导地位
1950 :图灵设计国际象棋程序
1962 :IBM Arthur Samuel 的跳棋程序战胜人类高手(人工智能第一次浪潮)
 1980-2000
统计主义流派
主要用统计模型解决问题
Vapnik 1993
1997 :IBM 深蓝战胜卡斯帕罗夫(人工智能第二次浪潮)
 2010- 至今
神经网络、深度学习、大数据流派
Hinton 2006
2016 :Google AlphaGO 战胜李世石(人工智能第三次浪潮)
【对上述发展过程解释】
人工智能这个概念一点都不新,机器学习也一点都不高深,计算机视觉也谈不上神奇,
为什么这样说?
我们人工智能实际上在历史上,有三次浪潮。
(1)第一次 50 年代到 70 年代,叫符号主义流派,专家系统占主导地位。
什么叫专家系统?就是人去学一个东西,然后把学到的知识理论化,再把这些理论模型
化,最后把这个模型程序化,形成一个系统,就叫专家系统。
专家系统巅峰在 1962 年,IBM 公司的跳棋,战胜了当时的人类高手,引爆了第一次浪
潮。
专家系统能解决一些问题,但是也解决不了很多问题。
(2)到了 1980 年,统计时代开始盛行。统计流派巅峰在 1993 年,Vapnik 系统性的提
出了一篇论述叫支持向量机,现在这个算法在很多地方被大量的使用,它非常有效。
引爆第二波浪潮的重点就是 1997 年,IBM 的深蓝(采用了暴力穷举的方式)战胜了当
时的国际象棋冠军卡斯帕罗夫。
(3)2016 年的 AlphaGO 引爆了第三波浪潮。
2006 年 Hinton 提出过一个经典的论文,Hinton 这篇论文虽然在 2006 年提出,但是我们
神经网络是一个非常老的概念,它的前身要追溯到 1986 年的多层感知器反向传播算法。
据说这里边还有一段历史公案,就是 Vapnik 老爷子和 Hinton 老爷子,他们学术矛盾很
深,在 80、90 年代外面 SVM 一个占据主流的时候,神经网络被打压到连论文都发不出去,
学生都毕业不了。现在 Hinton 老爷子算是打了一个翻身仗。
【 论述】
刚才说到我们三次浪潮,前两次每次都是这样,说人类要毁灭了,后来发现其实并不是
这样。我们现在就处在这个状态,人类又要毁灭了。其实和前两次比,还是有一点区别。
【我们可以用三盘棋来解释这个纳 高德纳 Gartner 曲线图(计数成熟度曲线),就是历史
上人工智能分别在跳棋,象棋,和围棋方面战胜了人类,所以现在这个时期是属于最后的平
稳增长曲线】
刚才说到我们三次浪潮,前两次每次都是这样,说人类要毁灭了,后来发现其实并不是
这样, 人工智能仍然在高速发展。
我觉得最大的一个区别就是它现在真的是深入到我们生活的每一个角落,打开你的手机
看看,淘宝,智能推荐,拍一拍,谷歌翻译,搜索引擎,智能出行,智能规划,微信,智能
助理,头条,智能推荐,还有机器识别,其实它已经深入的改变了我们生活的每一个角落,
而将来它会改变更多。
【总结】 随着 2016 年 Alpha Go 在围棋击败李世石,2017 年初卡内基梅隆大学人工智
能系统 Libratus在长达 20 天的鏖战中,打败 4 名世界顶级德州扑克玩家,这标志着人工智
能技术又达到了一个新的高峰。人工智能已经不再是在各大公司幕后提供各种智能推荐、语
音识别算法的工具,它已经慢慢走向台前进入到平常百姓的视野之中。曾经有人描述人工智
能就向一列缓缓开向人们的火车,一开始非常遥远而且看起来非常缓慢,它慢慢接近,直到
人们清楚看到它的时候,它已经呼啸而过,把人远远抛在身后。现在似乎就是人们可以远远
看到人工智能的时候,它已经发展数十年,但直到最近才引起广泛注意,随着大数据的积累、
算法的改进、硬件的提升,人工智能可以在很多细分的领域成为专家,辅助人类甚至超过人
类。机器学习是人工智能的核心,是使计算机具有智能的根本途径。
3. 从国家层面谈人工智能
2017年 7 月 20 日国务院印发《新一代人工智能发展规划》部署了战略目标,到 到 2020
年 , 人工智能总体技术和应用与世界先进水平同步,人工智能称为新的重要的经济增长点,
人工智能技术应用称为改善民生新途径,有力支撑进入创新型国家行列和全面建成小康社会
的奋斗目标。
到 第二步到2025 年 年 , 人工智能理论基础实现重大突破 、 技术与应用部分达到世界领先水
平,人工智能称为带动我们产业和经济转型的主要动力,智能社会建设取得积极进展。
到 第三步到 2030 年 年 , 人工智能理论 、 技术与应用总体达到世界领先水平,成为世界主要
人工智能创新中心,智能经济、智能社会建设取得明显成效,为跻身创新型国家前列和经济
强国奠定重要基础。
其中纲要中提到了加快培养聚焦人工智能高端人才培养:
(1)培育高水平人工智能创新人才和团队
(2)加大高端人工智能人才引进力度
(3)建设人工智能学科
参考资料:
[1]http://mp.weixin.qq.com/s/OM_zfRvIM0r1F4MzAo4xcQ
[2]http://mp.weixin.qq.com/s/mc7FD1PInEwyLFl38zGLvA
既然有这么多的名词,人工智能,深度学习,机器学习等,我们就有必要详细阐述这几
个概念之间的区别?
4. 几个概念的区别
1 4.1 人工智能、机器学习、深度学习的关系
【笔记】机器学习是人工智能的一个分支,深度学习是实现机器学习的一种技术。
机器学习是研究如何使计算机能够模拟或实现人类的学习功能,从大量的数据中发现规
律,提取知识,并在实践中不断地完善和增强自我。机器学习是机器获取知识的根本途径,
只有让计算机系统具有类似人的学习能力,才可能实现人工智能的终极目标。
机器学习是人工智能研究的核心问题之一,也是当前人工智能研究的一个热门方向,同
时也是人工智能理论研究和实际应用的主要瓶颈之一。
如上图,区别三者最简单的方法:想象同心圆,人工智能(AI)是半径最大的同心圆,向
内是机器学习(Machine Learning),最内是深入学习(Deep Learning)。人工智能是最早出现的,
也是最大、最外侧的同心圆;其次是机器学习,稍晚一点;最内侧,是深度学习,当今人工
智能大爆炸的核心驱动。
深度学习使得许多机器学习应用得以实现,并拓展了人工智能的整个领域。深度学习一
一实现了各种任务,并使得所有的机器辅助变成可能。无人驾驶汽车、电影推荐等,都触手
可及或即将成为现实。人工智能就在现在,也在未来。有了深度学习,人工智能可能甚至达
到像我们畅想的科幻小说一样效果。
( 更简单理解)人工智能是祖辈,机器学习是父辈,深度学习是儿子辈!
2 4.2 数据分析和数据挖掘的基本概念
首先我们了解什么是数据,什么是信息?
(1) 数据--- 即观测值,例如测量数据,你的身高,体重都是测量数据。
(2) 信息:(信息抽象地说就是)可信的数据。
数据------>信息:数据和信息最大的区别就是一个是客观一个是主观。如:用尺子量桌
子宽度,测量得到的值就是数据,这是客观存在的。
而对于用户而言只会关心桌子是长还是短、高还是低,大了买小的等。这种主观对客观
数据的接受和在描述,就是信息。
(3) 数据分析 : 对数据的一种操作手段 , 目标是经过先验 ( 已有经验 ) 的约束 , 对数
据进行整理、筛选和加工,最后得到信息。【从数据到信息的转化过程】
(4) 数据挖掘:是对数据分析之后的信息,进行价值化的分析。【信息的价值化】
(5) 数据挖掘和数据分析的关系
第一层是递归的关系:
【笔记】数据分析的结果是信息,这些信息作为数据又去数据挖掘。 而数据挖掘,又
使用了数据分析的手段,如此反反复复。
数据挖掘和数据分析最大区别:
数据分析,以输入数据为基础,通过先验约束,对数据进行处理,但是不以结论如何做
调整。(重在于数据有效性、真实性和先验约束正确性)
数据挖掘,是对信息的价值化的获取。价值化自然不考虑数据本身,而是考虑数据是否
有价值。由此,一批数据,尝试对他做不同的价值评估,就是数据挖掘。对比数据分析,最
大的特点就是你需要调整你的不同的先验约束,在此对数据进行分析。
(6)举例 1: 钻戒的例子
你打算跟你女朋友买戒指,那么你手上有一批品牌和款式名单,你按照价格、风格、材
质分类,得到如下结论:
钻石戒指比钢戒贵
大钻戒比小钻戒贵
钢戒样式比较多、钻戒款式少
这就是数据分析,根据你的先验约束(按照什么划分)获得的结论
But,不是最贵的你女朋友就最喜欢,而对于男同胞来讲就是需要用最少的钱让你女朋
友最开心,由此我们需要进行数据挖掘。
最优的标准就是最少的投入,最大的开心。
因此,任务就是根据先验(历史数据)去寻找贵的戒指不买的理由,比如钻戒款式少、
大钻戒要比钢戒要小。同时你要去问问你女朋友怎么样才开心。
于是,我们又去做数据分析,此时实际上是使用价值的评判标准,对数据进行价值化。
因此如果你确定了分析方式,则动作确实是数据分析,但是带上了确定价值化的评价标准动
作,这就是数据挖掘。
最后的最后,你得到了理由既花钱少又能让女朋友开心。
(7)举例 2: 买菜的例子
老婆早上给你 50 元让你买一天的菜,要求鸡猪鱼肉俱全,且蛋菜葱蒜豆品必备。
于是你屁颠屁颠的到了菜市场先是饶了一圈,在各个档口拉拉家常,问问价格。猪肉十
几块一斤,好一点品种的鱼也很贵,数据分析下来,拿出手机打开计算器的 App 噼里啪啦
的按,数字长的比韭菜还长,最后得到一个价格,这就是数据分析。根据客观的数据,先验
的公式得到的信息。
但是对你而言,最大的价值是:用最少的钱满足老婆要求,还可以留点私房钱和朋友吃
饭等。那么现在就要开始数据挖掘了,但是你必须具备评价标准。
多少肉算一天的量
猪肉、鱼肉、各种肉怎么个选法
青菜白菜都是菜,便宜营养我最爱
怎么个选法才能让老婆满意,同时价格落于你可承受的范围。于是,根据设定的范围,
包括菜怎么卖、肉怎么买、中饭怎么配、晚饭怎么配等,最终可以确定一个都买方案,这就
是数据挖掘。
(8) 总结:
数据分析:针对历史数据,分析得出各项指标,经过数据分析我们得到的是信息。
数据挖掘[ 大量的数据挖掘规律]: : 经过数据挖掘我们得到的是有价值的信息 , 即对信息
进行价值提取或数据挖掘。
举例: 啤酒和尿布的故事
数据分析(信息):根据沃尔玛历史销售数据,分别分析买各种商品的人各自具有什么
特征。
数据挖掘(有价值的信息):根据历史销售数据,使用关联规则挖掘,分析买了啤酒的
人还会购买什么,从而得出尿布。
3 4.3 各技术点的交叉
了解了数据挖掘,我们在介绍下机器学习和数据挖掘的关系。
用机器学习的方法来进行数据挖掘。机器学习是一种方法;数据挖掘是一件事情;还
有一个相似的概念就是模式识别,这也是一件事情。而现在流行的深度学习技术只是机器
学习的一种;(看图)
(解释)机器学习就是让机器从数据中学习模型,模型可形象地理解为预测力,机器学
习侧重于模型的构建。深度学习是机器学习的一种,属于当前比较热的领域,属于机器学习
技术的重大突破,因此你可以看到人脸识别、机器翻译等人工智能领域的产品越来越神奇。
数据挖掘是从一堆数据中发现潜在价值的过程,有时会用机器学习算法,有时不需要用。
人工智能是研究如何让机器具有类人智能的学科,目标是让机器具有人类的智能。机
器学习,是达到人工智能目标的手段之一;模式识别也是达到人工智能的手段之一;
如上图所示,对数据挖掘而言,数据库提供数据管理技术,机器学习和统计学提供数据
分析技术。
人工智能范围比较大,机器学习相对来说属于人工智能的范畴。数据挖掘则是将机器学
习作为工具,利用机器学习的算法用来完成数据挖掘。另外数据挖掘也使用到其他很多内容。
5. 机器学习
在开始讲解术语概念之前我们首先梳理下之前讲到的一些概念。
(基本认识)机器学习 专门研究计算机怎样模拟或实现人类的学习行为, 使之不断改
善自身性能。 。是一门能够发掘数据价值的算法和应用,它是计算机科学中最激动人心的领域。
我们生活在一个数据资源非常丰富的年代,通过机器学习中的自学习算法,可以将这些数据
转换为知识。
(机器学习库)借助于近些年发展起来的诸多强大的开源库,我们现在是进入机器学
习领域的最佳时机。
(机器学习目的)从 20世纪后半段,机器学习已经逐渐演化成为人工智能的一个分支,
其 目的是通过自学习算法 从数据中获取知识,进而对未来进行预测。与以往通过大量数据
分析而人工推导出规则并构造模型不同,机器学习提供了一种从数据中获取知识的方法,同
时能够逐步提高预测模型的性能,并将模型应用于基于数据驱动的决策中去。
(应用 )机器学习技术的存在,使得人们可以享受强大的 垃圾邮件过滤带来的便利,拥
有方便的 文字和语音识别软件,能够使用可靠的 网络搜索引擎,同时在象棋的网络游戏对阵
中棋逢对手,而且 Google 已经将机器学习技术应用到了 无人驾驶汽车中。
0 5.0 基本术语


以西瓜数据集为例进行练习:


要进行机器学习,先要有数据。假定我们收集了一批关于西瓜的数据:
{颜色=乌黑,敲声=浊响}
{颜色=青绿,敲声=清脆}
【念 基础概念 1】将这组记录的集合称为一个“ 数据集”(data set),其中每条记录是关
于一个事件或对象(这里说的是西瓜)的描述,也称为一个“样本”(sample)。
【念 基础概念 2】而我们所说的西瓜的色泽,这种可以反应事件或对象在某方面的表现或
性质的事项,称为“ 特征”(feature)或“ 属性”(attribute)”
属性上的取值,如色泽青绿等,这个取值称为 属性值(attribute value)。
【念 基础概念 3】属性构成的空间称为“ 属性空间”或样本空间(sample space)或输入
空间。比如将西瓜的颜色,敲声作为两个坐标轴,则它们可以张成一个用于描述西瓜的二维
空间,每个西瓜都可以在这个空间中找到自己的坐标位置。由于空间中的每个点都对应一个
坐标向量,因此我们也把一个样本称作一个“ 特征向量”(feature vector)。
假设 ) ...... , (
2 1 id i i i
x x x x  是西瓜数据集 } .......x x , {x
m 2 1
 D 的第 i 个样本,其中
j i
x 是
i
x
在第 j 个属性上的取值,如第 3 个西瓜在第 1 个属性(颜色)上取值为“乌黑”。d称为样

i
x 的“维度数或维数”(dimensionality)。数据集 D 中的
i
x 表示第 i 个样本或示例。
【念 基础概念 4】从数据中学得模型得过程称为“ 学习”(learning)或 训练(training),
这个过程是通过执行某个学习算法来完成的。训练过程中使用的数据称为“ 训练数据”
(training set)。
训练数据:由输入 X 与输出Y 对组成。训练集在数学上表示为:
)} y , (x ),..., y , (x ), y , {(x
N N 2 2 1 1
 T
【念 基础概念 5】 模型有时也称为“ 学习器”(learner),可以看作是学习算法在给定数
据和参数空间上的实例化。
【念 基础概念 6】如果希望学得一个能帮助我们判断西瓜是不是“好瓜”的模型,仅仅有
前面的样本数据是不够的,要建立这样的关于“预测(prediction)”的模型,我们需要获
得训练样本的“结果”信息,如:{(颜色=青绿,敲声=浊响),好瓜}。这里的结果信息,
称为样本的“ 标记( (label) )”;拥有了标记信息的样本,则称为“ 样例( (example) )”。用
) , .... , (
2 1 i i
y x x x 表示第 i 个样例,y i 是样本 x 的标识,一般把标记的集合称为标记空间(label
space)或输出空间。
学习完模型后,就需要进行预测,预测的过程称为“测试”(testing),被预测的样本
称为“ 测试样本”(testingsample)。
测试数据: :也是由输入 X 与输出 Y 组成,是用于测试训练好的模型对于新数据的预测能
力。 例如在中学阶段的函数可表示为 y=f(x),这里的 f 指的是通过学习得到的模型,对于测
试 x,可得到其预测标记 y=f(x)。
有了上面基本概念铺垫,我们可以学习机器学习的三种不同方法
1 5.1 监督学习
【念 基础概念 6】监督学习(supervised learning)从训练数据(training data)集合中学习模
型,对测试数据(test data)进行预测。
术语解释:
监督( (supervised )是指训练数据集中的每个样本均有一个已知的输出项(类标 label),
也就是上述的输出 Y 值。
输入变量 X 和输出变量 Y 有不同类型,可以是连续的,也可以是离散的。人们根据输入、
输出变量不同类型,对预测任务给予不同的名称:
 对输入变量和输出变量均为连续变量的预测问题称为 回归(regression) 问题。
 输出变量为有限个离散变量的预测问题称为 分类问题。
 输入变量和输出变量均为变量序列的预测问题,称为 标注问题。
以西瓜数据集为例:
如果我们预测瓜是“好西瓜”或“坏西瓜”,这类的学习任务称为“分类(classification)”
任务;如果想要预测的是连续值,比如根据上述的色泽、敲声判断西瓜的成熟度为 0.50,080
等,此类学习任务称为“回归(regression)”。如果只涉及两个类别的分类我们称之为二
分类(binary classification)任务,一个是“正类”(positive class),另一个是反类(negative
class)。涉及到多个分类的问题称之为“多分类”(multi-class classification)问题。
以(过滤)垃圾邮件为例:
基于有类标的电子邮件样本库,可以使用监督学习算法训练生成一个判定模型,用来判
别一封新的电子邮件是否为垃圾邮件;其中在用于训练的电子邮件样本库中,每一封电子邮
件都已被准确地标记是否为垃圾邮件。监督学习一般使用离散的类标(class label),类似
于过滤垃圾邮件的这类问题也被称为分类(classification)。
通俗易懂地讲:监督学习指的是人们给机器一大堆标记好的数据,比如一大堆照片,标
记住那些是猫的照片,那些是狗的照片,然后让机器自己学习归纳出算法或模型,然后所使
用该算法或模型判断出其他照片是否是猫或狗。代表的算法或模型有 Linear regression、
Logistic regression、SVM、Neural network 等。如下图流程所示:
课堂笔记的图示:
首先,我们使用带有类标的训练数据套用在相应的机器学习算法中上,经过训练得
到一个预测模型,当有新数据来的时候,通过预测模型可以得到具体的输出类别或输出
值。
5.1.1 利用分类对类标进行预测
输出变量为有限个离散值的情况称为分类问题(classification) )
如果类别为正类或负类的时候,这个是一个二分类问题
如果类别是一个多类别的时候,这就是一个多分类问题。
分类问题包括了学习和分类两个过程:
( (1) ) 学习:根据已知的训练数据集利用有效的学习方法学习一个分类器。
( (2) ) 分类:利用学习到的算法判定新输入的实例对其进行分类。
分类是监督学习的一个核心问题。在监督学习中,当输出变量 Y 取有限个离散值时,预
测问题便成了分类问题。监督学习从数据中学习一个分类模型或分类决策函数,称为分类器
(classifer),分类器对新的输入进行输出的预测(prediction),称为分类(classification)。
分类的类别是多个时,称为多类分类问题。
分类问题包括学习和分类的两个过程。在学习过程中,根据已知的训练数据集利用有效
的学习方法学习一个分类器;在分类的过程中,利用学习的分类器对新的输入实例进行分类。
如上述的垃圾邮件就是一个 2 分类问题,使用相应的机器学习算法判定邮件属于垃圾邮
件还是非垃圾邮件。如下图给出了 30个训练样本集实例:15个样本被标记为负类别(negative
class)(图中圆圈表示);15 个样本被标记为正类别(positive class)(图中用加号表示)。
由于我们的数据集是二维的,这意味着每个样本都有两个与其相关的值:
2 1
x x 和 ,现在我
们可以通过有监督学习算法获得一条规则,并将其表示为图中的一条黑色的虚线将两类样本
分开,并且可以根据
2 1
x x 和 值将新样本划分到某个类别中(看位于直线的那一侧)。
分类的任务就是将具有类别的、无序类标分配给各个新样本。
5.1.2 利用回归预测连续输出值
另一类监督学习方法针对连续型输出变量进行预测,也就是所谓的回归分析(regression
analysis)。回归分析中,数据中会给出大量的自变量和相应的连续因变量(对应输出结果),
通过尝试寻找自变量和因变量的关系,就能够预测输出变量。
如下图中,给定了一个自变量 x 和因变量 y,拟合一条直线使得样例数据点与拟合直线
之间的距离最短,最常采用的是平均平方距离来计算。如此,我们可以通过样本数据的训练
来拟合直线的截距和斜率,从而对新的输入变量值所对应的输出变量进行预测。
比如生活中常见的房价问题,横轴代表房屋面积,纵轴代表房屋的售价,我们可以画出
图示中的数据点,再根据使得各点到直线的距离的平均平方距离的最小,从而绘制出下图的
拟合直线。根据生活常识随着房屋面积的增加,房价也会增长。
回归问题的分类有:根据输入变量的个数分为一元回归和多元回归;按照输入变量和输
出变量之间的关系分为线性回归和非线性回归(模型的分类)。
5.1.3 标注问题
标注问题是分类问题的一种推荐,输入是一个观测序列,输出是一个标记序列或状态序
列。标注问题的目标在于学习一个模型,使它能够对观测序列给出标记序列作为预测。
标注问题常用的方法有:隐马尔科夫模型、条件随机场。
自然语言处理中的词性标注就是一个标注问题:给定一个由单词组成的句子,对这个句
子中的每一个单词进行词性标注,即对一个单词序列预测起对应的词性标注序列。
2 5.2 无监督学习
【念 基础概念 7】通俗地讲:非监督学习(unsupervised learning)指的是人们给机器一大堆
没有分类标记的数据,让机器可以对数据分类、检测异常等。
5.2.1 通过聚类发现数据的子群
【念 基础概念 8】聚类是一种探索性数据分析技术,在没有任何相关先验信息的情况下(相
当于不清楚数据的信息),它可以帮助我们将数据划分为有意义的小的别 组别(也叫簇 cluster)。
其中每个簇内部成员之间有一定的相似度,簇之间有较大的不同。这也正是聚类作为无监督
学习的原因。
下图中通过聚类方法根据数据的
2 1
x x 和 两个特征值之间的相似性将无类标的数据划分
到三个不同的组中。
【例子】我们可以用下图表示西瓜的色泽和敲声两个特征,分别为
2 1
x x 和
,我们可以
将训练集中的西瓜分成若干组,每一组称为一个“簇”,这些自动形成的簇可能对应一些潜
在的概念划分,如“浅色瓜”、“深色瓜”、“本地瓜”或“外地瓜”。通过这样的学习我
们可以了解到数据的内在规律,能为更深入地分析数据建立基础。
需要注意的是我们事先并不知道西瓜是本地瓜、浅色瓜,而且在学习过程中使用的训练
样本通常不拥有标记(label)信息。
5.2.2 数据压缩中的降维
【念 基础概念 9】数据降维(dimensionality reduction)是无监督学习的另一个子领域。通
常,面对的数据都是高维的,这就对有限的数据存储空间以及机器学习算法性能提出了挑战。
无监督降维是数据特征预处理时常用的技术,用于清除数据中的噪声,能够在最大程度保留
相关信息的情况下将数据压缩到额维度较小的子空间,但是同时也可能会降低某些算法准确
性方面的性能。
如下图一个三维空间的数据映射到二维空间的实例。
3 5.3 半监督学习
半监督学习的现实需求也非常强烈,因为在现实生活中往往能容易地收集到大量未“标
记”的样本,而获取有标记的样本却需要耗费人力、物力。在互联网应用的最为明显,例如
在进行网页推荐时需要请用户标记出感兴趣的网页,但是很少的用户愿意花很多时间来提供
标记,因此,有标记的网页样本少,但互联网上存在无数网页可作为未标记样本使用。
半监督学习就是提供了一条利用“廉价”的未标记样本的途径。
通常在处理未标记的数据时,常常采用“主动学习”的方式,也就是首先利用已经标记
的数据(也就是带有类标签)的数据训练出一个模型,再利用该模型去套用未标记的数据,
通过询问领域专家分类结果与模型分类结果做对比,从而对模型做进一步改善和提高,这种
方式可以大幅度降低标记成本,但是“主动学习”需要引入额外的专家知识,通过与外界的
交互来将部分未标记样本转化有标记的样本。但是如果不与专家进行互动,没有额外的信息,
还能利用未标记的样本提高模型的泛化性能吗?
答案是肯定的,因为未标记样本虽然未直接包含标记信息,但它们与有标记样本有一些
共同点,我们可以利用无监督学习的聚类方法将数据特征相似的聚在一个簇里面,从而给未
标记的数据带上标记。这也是在半监督学习中常用的“聚类假设”,本质上就是“利用相似
的样本拥有相似的输出”这个基本假设。
半监督学习进一步划分为了纯半监督学习和直推学习(transductive learning),前者假
定训练数据中的未标记样本并不是待测数据,而直推学习假设学习过程中所考虑的未标记样
本恰恰是待预测样本。无论是哪一种,我们学习的目的都是在这些未标记的样本上获得最优
的泛化性能(泛化简单的指的是模型无论对训练集表现效果好,对测试集效果也很不错,在
模型选择中我们会详细讲解)。
4 5.4 强化学习
【念 基础概念 10】强化学习(Reinforcement Learning)是机器学习的一个重要分支,主要
用来解决连续决策的问题。比如围棋可以归纳为一个强化学习问题,我们需要学习在各种局
势下如何走出最好的招法。还有我们要种西瓜的过程中需要多次种瓜,在种瓜过程中不断摸
索,然后才能总结出好的种瓜策略,将例子中的过程抽象出来就是“强化学习”。
强化学习不像无监督学习那样完全没有学习目标,又不像监督学习那样有非常明确的目
标(即 label),强化学习的目标一般是变化的、不明确的,甚至可能不存在绝对正确的标
签。最近火热的无人驾驶技术是一个非常复杂、非常困难的强化学习任务,在深度学习出现
之前,几乎不可能实现,无人驾驶汽车通过摄像头、雷达、激光测距仪、传感器等对环境进
行观测,获取到丰富的环境信息,然后通过深度强化学习模型中的 CNN、RNN 等对环境信
息进行处理、抽象和转化,在结合强化学习算法框架预测出最应该执行的动作(是加速、减
速、转向等),来实现自动驾驶。当然,无人驾驶汽车每次执行的动作,都会让它到目的地
的路程更短,即每次行动都会有相应奖励。
深度强化学习最具有代表性的一个里程碑是 AlphaGo,围棋是棋类游戏中最复杂的游
戏,19*19 的棋盘给它带来了 3 361 种状态,这个数量级别已经超过了宇宙中原子数目的状态
数。因此,计算机是无法通过像 IBM 深蓝那样暴力搜索来战胜人类,就必须给计算机抽象
思维的能力,而 AlphaGo 做到了这一点。
如下图所示,强化学习目标是构建一个系统 Agent,在于环境 Environment 交互过程中
提高系统的性能。环境的当前状态信息中通常包含一个反馈(Reward)信号和行为 State。Agent
通过与环境 Environment 交互,Agent 可以通过强化学习来得到一系列行为,通过探索性的
试错或借助精心设计的激励系统使得正向反馈最大化。
Agent 可以根据棋盘上的当前局势(环境)决定落子的位置,而游戏结束时胜负的判定
可以作为激励信号。
DeepMind 公司现在在探索如何通过深度强化学习训练一个可以战胜《星际争霸 2》世
界冠军的人工智能,拭目以待。
5 5.5 通过 s Iris 数据集强化基本概念
鸢尾花 Iris Dataset 数据集是机器学习领域经典数据集,该数据集可以从加州大学欧文分
校(UCI)的机器学习库中得到。鸢尾花数据集包含了 150 条鸢尾花信息,每 50 条取自三个
鸢尾花中之一:Setosa、Versicolour 和 Virginica,每个花的特征用下面 5 种属性描述。
(1)萼片长度(厘米)
(2)萼片宽度(厘米)
(3)花瓣长度(厘米)
(4)花瓣宽度(厘米)
(5)类(Setosa、Versicolour、Virginica)
花的萼片是花的外部结构,保护花的更脆弱的部分(如花瓣)。在许多花中,萼片是绿
的,只有花瓣是鲜艳多彩的,然而对与鸢尾花,萼片也是鲜艳多彩的。下图中的 Virginica
鸢尾花的图片,鸢尾花的萼片比花瓣大并且下垂,而花瓣向上。
每一行的数据我们称之为样本数据(或观测数据、记录数据等),是指的实际观察到的
数据。该数据集共有 150 行样本数据,因此样本的总数为 150。
第一列为样本的序号,第一个样本序号为 1,第二个样本序号为 2,依次往后直到第 150
个样本。
从第二列到第五列为样本的特征(或属性)列,这里分别为萼片长度,萼片宽度、花瓣
长度和花瓣的宽度,每一个样本都有上述四个特征,并且我们可以根据上述特征区分样本数
据究竟是哪种鸢尾花。
最后一列是类标(Label)列,这里指的花的类型是三种类型的哪一种。
为了加固我们理论基础,保证描述过程中更加高效易懂,我们采用线性代数(Linear
algebra)中的一些基本知识,主要使用矩阵和向量来标识数据。我们通常约定:矩阵 X 中的
每一行代表一个样本,而样本的每个特征都表示为单独的列,从而就可以和源数据进行对应。
鸢尾花中花数据集中,包含 150 个样本和4 个特征,因此将其记作 150x4 维的矩阵,
4 150
R X ,其中 R 表示向量空间,这里表示 150 行 4 维的向量,记作:















) 150 (
4
) 150 (
3
) 150 (
2
) 150 (
1
) 2 (
4
) 2 (
3
) 2 (
2
) 2 (
1
) 1 (
4
) 1 (
3
) 1 (
2
) 1 (
1
, , ,
..... .......... ..........
, , ,
, , ,
x x x x
x x x x
x x x x
X
我们一般使用上标(i)来指代第 i 个训练样本,使用小标(j)来指代训练数据集中第 j
维特征。一般小写字母代表向量,大写字母代表矩阵。
) 150 (
2
x 表示第 150 个花样本的第 2 个特征萼片宽度。在上述 X 的特征矩阵中,每一行表
代表一个花朵的样本,可以记为一个四维行向量  
) i (
4
) i (
3
) i (
2
) i (
1
i
, , , x x x x x 
) (
数据中的每一列代表样本的一种特征,可以用一个 150 维度的列向量表示:















) 150 (
) 2 (
) 1 (
...
j
j
j
j
x
x
x
x
类似地,可以用一个 150 维度的列向量存储目标变量(类标)
}) , , { (
...
150
2
1
Virginica Versicolor Setosa y
y
y
y
y 















) (
) (
) (
6 环境搭建
Windows 平台安装Anaconda 数据科学环境
接下来一起进入激动人心的、触手可及的环境搭建环节,我们主要采用在 windows平
台上完成环境搭建。这里面我们主要使用的是 Anaconda 的数据科学环境。
AnacondaPython是完全免费的企业级的 Python 发行版本,主要用于大规模数据处理、
预测分析和科学计算工具。
Anaconda 是 Python 科学技术的合集,功能类似于 Python(x,y),可以算是后起之秀,也
已经更新了多次。Anaconda 的包管理使用 conda 命令,集成了大多数科学计算包。Anaconda
支持所有的操作系统,它的安装、更新都是很方便的,且所有的东西都安装在一个目录中。
6.6.1 安装步骤
下载地址:https://www.continuum.io/why-anaconda
(1)点击“下载”按钮
(2)选择对应的版本
(3)一直下一步下一步,如果不想安装在 C 盘的话可以选择对应的其他盘符。

(1)Windows 版本只需要选择对应的 Python 版本即可下载,安装的时候通过点击下一
步直至安装完成为止。默认 anaconda 会加入环境变量中。
(2)这里面建议大家安装 python2.7 版本,很多的公司仍然在用 Python2.7,当然也可
以两个版本全部安装,主要原因是 Python3.X 的版本是以后的主流版本,3.X 也被定为该语
言未来发展方向。2.X 版本到 2020 年将不再更新。另外,最近流行的深度学习库 tensorflow
目前在 Windows 中仅支持 Python3.x 版本。
通过 Win+R 键打开控制台应用程序,输入 python 查看当前的 Python 环境即可。
接下来我们看以下 Anaconda 里面集成了那些功能?
Anaconda 主要是使用的功能有 Anaconda Prompt 和 jupyter notebook。在 Windows 下通
过开始键打开 Anaconda Prompt。
6.6.2 面向机器学习的 notebook 方法
notebook 已经成为学术界和工业界众人青睐的学习工具,因为该工具技能动态驱动,
还具备重复生成的特点。
大部分 notebook接口有一系列代码块(成为单元)构成。其开发过程是一个探索的过
程,开发者借此可以在一个单元中开发和运行代码,然后基于上一个单元的结果继续填写下
一个单元代码。特别是机器学习从业者分析大型数据时,这种交互方式利于从业者迅速发现
数据模式或者提出数据洞见。因此 notebook 型的开发过程提供了探索式和交互式的途径来
编写代码,并可立即检查结果。
Notebook允许用户在同一文件中无缝地融合代码、输出和注释,这便于机器学习从业
者在后一阶段重复他们的工作。
采用 notebook 方法确保了可复用性,分析和计算、展现一致性,从而结束管理的负值
和粘贴的方式。
我们在机器学习使用最多的是 Python 的 jupyter notebook 和 R 语言的 R notebook。
6.6.2ipython-notebook
 使用一种基于 Web 技术的交互式计算文档格式,Notebook 在交互上使用了 CS 架构,
它是通过 Tornado 建立一个 shell 服务器,并且使用浏览器作为客户端。
 Ipython notebook 使用浏览器作为界面,向后台的 ipython服务器发送请求,并且显示
结果。Cell 有多种类型,经常使用的有表示格式化文本的 Markdown 单元,和表示代码
的 Code 单元。
 被保存为 ipynb 的格式,该格式是类似于Json 格式文件。
(1) 在cmd 中输入 jupyter notebook 或者 ipythonnotebook 或者通过快捷方式打开
ipythonnotebook 均可。
(2)默认浏览器会打开http://localhost:8888/tree,如下图 所示 启动服务之
后,web 浏览器就打开了一个 jupyter 的界面,通过“New”--->Python Root 新建
一个Python 的脚本,该文本的格式为 ipynb。
(3)看到了 cell(单元格子),在其中我们输入 import numpy as np 在执行该命令
(Alt+Enter),看会不会出错。
我们可以通过 New 一个 Python[root]新建一个 jupyter,可以在每个格子中输入代码或代码
段,点击左上角 运行按钮即可。
6.6.3Anaconda 常用的快捷键
(1)运行当前行并切换到下一行:shift+enter
(2)运行当前行:ctrl+enter
(3)可以通过按键 M 切换代码行为 markdown 格式的文本输入
6.6.4Anaconda Prompt
打开 Anaconda Prompt 后,该窗口和 Dos窗口一样的,我们可以输入命令就可以控制和
配置 Python,最常用的是 conda 命令,此外 Anaconda 也集成了 pip 的安装方式,我们可以
通过 pip list 或者conda list 尝试查看本机已安装的 python 包,如下图所示:
conda 可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。
包管理与 pip 的使用类似,环境管理则允许用户方便地安装不同版本的 python 并可以快速
切换。Anaconda 则是一个打包的集合,里面预装好了 conda、某个版本的 python、众多
packages、科学计算工具等等,所以也称为 Python 的一种发行版。
操作如下:
(1)打开 Anaonda prompt
(2)使用conda命令,比如conda list列出所有使用conda命令安装包的列表。同时Anaconda
支持 pip 安装包的方式,这里面也可以使用 pip list 查看使用 pip 安装的一些包。
6.6.5Spyter 集成开发环境
Spyder 是 Python(x,y)的作者为它开发的一个简单的集成开发环境。和其他的 Python 开
发环境相比,它最大的优点就是模仿 MATLAB 的“工作空间”的功能,可以很方便地观察和
修改数组的值。
6.6.6 Pycharm 使用 Anaconda 配置开发环境
Pycharm 网址:http://www.jetbrains.com/pycharm/
Anaconda 是数据科学的集成环境,当我们开发比较大型项目的时候应该选择比较好用
的 IDE,比如做 java 及 javaweb 开发使用 IDEA或 Eclipse,我们做 Python 开发也选用 jetbrains
公司的 pycharm 产品,通常情况下我们选择社区 Community 版本就可以完成一些基本的任
务。
在 Pycharm 的Files>>settings>>Project Interpreter>>Add local 里面添加 Anaconda 的
python.exe. 应用之后就可以调用各种 Anaconda 的库。
下午
n 7.Scikit-learn 机器学习库
n 7.1Scikit-learn 介绍
地址:http://scikit-learn.org/stable/
官网地址如果打不开,请绕道 github:https://github.com/scikit-learn/scikit-learn
官方简介:scikit-learning 是一个用于机器学习的 Python 模块,建立在 SciPy 之上,并按
照 3条 BSD 许可证分发。
该项目于 2007 年由 David Cournapeau 开始,作为“Google 夏季代码”项目,此后,许
多志愿者做出了贡献。 请参阅 AUTHORS.rst 文件以获取完整的贡献者列表。
目前由志愿者团队维护。
Scikit-learn 是 Python 中的机器学习库,简称为 sklearn,是目前通用的机器学习算法库
中实现的比较完全的库。Sklearn 库包含了完整的详尽的文档和示例,我们需要在了解初步
的机器学习原理基础上再阅读 sklearn 的 API 就会得心应手。
特点如下:
 简单高效的数据挖掘和数据分析工具
 可供大家使用,可在各种环境中重复使用
 建立在 NumPy,SciPy 和 matplotlib 上
 开源,可商业使用-获取 BSD 许可证
BSD 开源协议:是一个给于使用者很大自由的协议。使用者可以自由的使用,修改源代
码,也可以将修改后的代码作为开源或者专有软件再发布等。
Scikit-learn 中包含了大量常用的算法,如下图所示,基本功能分为六个部分:分类、回
归、聚类、数据降维、模型选择、数据预处理。
注:除了模型选择其他几个部分大家已经有了基本的了解,我们将在最后的部分讲解模
型选择。
我们需要详细了解机器学习的知识,加上 scikit-learn 为我们提供的 API 完成基本上可以
完成项目中的机器学习问题。根据上面的了解通常机器学习问题分为三个步骤:
 数据准备和预处理
 模型选择与训练
 模型验证与参数调优
在后面我们会详细的了解并深入。
n 7.2Scikit-learn 算法选择建议
8. 第一个机器学习任务
0 8.0 数字识别思路
将采集到的原始数据转化为特征提取所能接受的形式,如灰度图像或二值图像,这里我
们采用二值图像。
下图为 32*32 的二值图像(二进制图像),表示数值 0。
下图为 8*8 的二值图像,表示数值 0
通常为了使用机器学习分类器,首先将图像格式化为一个向量,如将 8*8 的矩阵转化为
1*64 的向量。
车牌、验证码识别的普通方法为:
(1) 将图片灰度化与二值化。(这样做的目的是将图片的每一个象素变成 0 或者 255,以
便以计算。同时,也可以去除部分噪音。)
灰度化与二值化处理过后的图片:
(2) 去噪,然后切割成一个一个的字符
(3) 提取每一个字符的特征,生成特征矢量或特征矩阵
(4)分类与学习。将特征矢量或特征矩阵与样本库进行比对,挑选出相似的那类样本,将
这类样本的值作为输出结果。
1 8.1 数据探索
利用 Python 的机器学习库 scikit-learn 将一个叫作digits(手写体识别) 的数据读入。
注 意 : scikit-learn 源 于 于 SciPy , 事 实 上 scikit 有 很 多 个
(https://scikits.appspot.com/scikits),我们使用的 scikit-learn 包是专门用于机器学习以及
数据探索的,这也是为什么使用 learn 来命名。
我们首先由 sklearn 包载入 datasets 模块,然后使用 datasets 模块的 load_digits() 方
法来输入数据。
#-*-coding:utf8-*-
# 1.首先由 sklearn 包载入 datasets 模块,然后使用 datasets 模块的 load_digits()方法读入数据。
from sklearnimport datasets
#2.读取手写体识别数据
digits=datasets.load_digits()
#3.打印数据
print digits
datasets 模块还有其他读取资料的方法,也可以用它来产生数据资料。我们现在所使用
的数据集 digits 也可以从加州大学Irvine 欧文分校的机器学习资料集载入,下面程序中有
一个链接可以直接载入。下面将从加州大学 Irvine 欧文分校的机器学习资料集载入 digits。
#-*-coding:utf8-*-
#1.导入加载数据所需要的包 pandas
import pandas as pd
#2.使用 read_csv 文件将文件读入
digits=pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra",header=None)
#3.打印数据
print digits#[3823 rows x 65 columns]
值得注意的是,(1)从文件名的 .tra 与 .tes 可以得知,加州大学欧文分校的机器学
习数据集已经切分好训练与测试数据,而上面这段程序中我们只读入了训练数据,如果要在
机器学习中使用还需要再读入测试数据。
(2)技巧:上述第二种导入数据的方式使用 Python 的 Pandas 包来读入与整理数据
的技巧。
假如我们直接通过 scikit-learn 读入 digits 数据,那么不同于加州大学欧文分校的机器
学习数据集在网页中提供描述或文件,我们必须另外通过使用 digits 的属性与方法来探究
基本的属性。
我们将透过 digits 的 keys() 方法来得知有哪些基本数据可以搜集;透过 data属性观
察预测变数;透过 target属性观察目标变数;透过 DESCR 属性阅读数据的描述文件。
#4.打印属性信息
print "KEYS",digits.keys()
print "data:",digits.data
print "data:",digits.data.shape # (1797L,64L)
print "target:",digits.target
print "DESC",digits.DESCR
print digits.images
print digits.images.shape
print len(np.unique(digits.target))
接著我们回忆一下在第一个练习中印出的 digits,里面出现很多的 numpy 矩阵,了解
矩阵最重要的特性是形状(shape)。假如我们有一个3d 阵列:y= np.zeros((2, 3, 4)),这个
阵列的形状就是 (2,3,4),由整数组成的 tuple 元组数据结构。
注意:手写体识别的数据共 1797 条数据,并且每幅图片是 8*8=64 的像素矩阵表示,在
模型使用这些像素矩阵的时候,我们习惯上将 2D 的图片转化为首尾拼接的1D 像素矩阵表
示。即将原来 8 行 8 列的表述形式转化为了 1 行 64 列的表述形式。
小结:
我们在这小结一下,查看 digits.data.shape 可以得知资料有 1797 个观测值,64 个变
量,检视 digits.target.shape 可以得知资料有 1797 个目标值(或称标记值或样本标签),
而检视 len(np.unique(digits.target)) 可以得知所有的目标值只有 10 个相异值:0 到 9,即
我们的模型是要辨识手写数字图片是 0 到 9 中的哪一个数字。
最后是 digits.images 的三个维度:1797个 8 x8 像素的矩阵,我们可以进一步将
digits.images 转换(reshape)为两个维度,并且使用 numpy 的 all() 方法比较阵列内的元
素是否与 digits.data 完全相同:print(np.all(digits.images.reshape((1797,64)) == digits.data)),
而我们会得到 True 的结果。
使用 matplotlib 视觉化手写数字图片
绘制方法 1:(掌握)
def show_digits():
digits=load_digits()
fig=plt.figure()
for i in range(20):
ax=fig.add_subplot(4,5,i+1)
ax.imshow(digits.images[i],cmap=plt.cm.gray_r,interpolation='bilinear')
plt.show()
show_detail()
绘制方法 2:(了解)
接下来我们要使用 Python 的可视化库 matplotlib 来可视化这些手写数字图片:
#从 `sklearn` 载入 `datasets`
from sklearnimport datasets
#载入 matplotlib
import matplotlib.pyplot as plt
#载入 `digits`
digits = datasets.load_digits()
#设定图形的大小(宽, 高)
fig = plt.figure(figsize=(4, 2))
#调整子图形
fig.subplots_adjust(left=0, right=1, bottom=0,top=1, hspace=0.05, wspace=0.05)
#把前 8 个手写数字显示在子图形
for i in range(8):
#在 2 x4网格中第 i + 1 个位置绘製子图形,并且关掉座标轴刻度
ax =fig.add_subplot(2, 4, i + 1, xticks = [], yticks =[])
#显示图形,色彩选择灰阶
ax.imshow(digits.images[i], cmap =plt.cm.binary)
#在左下角标示目标值
ax.text(0, 7, str(digits.target[i]))
#显示图形
plt.show()
这段程序看起来有点难懂,让我们分开来看:
 载入 matplotlib 包。
 设定一个长 2 ,宽 4 的空白画布,准备待会将子图形画在上面。
 调整子图形的一些参数。
 使用一个 for 循环开始要将空白画布填满。
 初始化 8 个子图形,并依序填入 2 x 4 网格中的每一格。
 最后画龙点睛的部分是在每个子图形 (0, 7)的位置(左下角)显示目标值。
 别忘了使用 plt.show() 将画好的图显示出来。、
如下图所示:
为每个图加标题然后绘制图形:
#从 `sklearn` 载入 `datasets`
from sklearnimport datasets
#载入 matplotlib
import matplotlib.pyplot as plt
#载入 `digits`
digits = datasets.load_digits()
#将观测值与目标值放入一个 list
images_and_labels =list(zip(digits.images, digits.target))
# list 中的每个元素
for i, (image, label)in enumerate(images_and_labels[:8]):
#在 i + 1 的位置初始化子图形
plt.subplot(2, 4, i + 1)
#关掉子图形座标轴刻度
plt.axis('off')
#显示图形,色彩选择灰阶
plt.imshow(image, cmap = plt.cm.binary)
#加入子图形的标题
plt.title('Training: ' + str(label))
#显示图形
plt.show()
完成后我们可以看到这张视觉化图形:
在这个例子中,我们将两个矩阵存入 images_and_labels 这个变量,然后将这个变量中
的前 8 个元素(包含 digits.images 与相对应的 digits.target)在一个 2 x 4 的格线上绘制子
图形,并且使用 plt.cm.binary 这个灰阶色彩,搭配子图形标题显示出来。
经过这两个视觉化练习之后,您应该对目前手上处理的 digits 资料有更深的认识!
2 8.2 机器学习方法解决手写体识别问题
通过上述的数据探索大家应该明确我们机器学习的目标和任务,我们要解决的是一个多
分类的分类问题,识别手写体图像是 0-9 数字中的那个数值。
大家都知道在邮政系统每天都会处理大量的信件,最为紧要的就是根据信件上的收件人
邮编进行识别和分类,以便确定信件的投送地。原本这项任务是依靠强大的人工来进行的,
后来人们尝试着使用计算机来代替人工。然而因为多数的邮编都是手写的数字,并且样式各
异,所以没有统一的规则可以很好地用于识别和分类。机器学习兴起之后,开始逐渐考虑该
需求,这里面我们采用了机器学习中的 SVM 算法识别手写体图片,具体的理论推导和原理
内容我们会在后期讲解。
8.2.1 机器学习第一步:导入手写体数据
8.2.2 机器学习第二步:数据切分为测试集和训练集
8.2.3 机器学习第三步:数据简单预处理
初学时候好奇为何,训练样本用 fit_transform,而测试样本用 transform?
仔细阅读官方文档发现,fit 方法是用于从一个训练集中学习模型参数,其中就包括了
归一化时用到的均值,标准偏差。transform 方法就是用于将模型用于位置数据,fit_transform
就很高效的将模型训练和转化合并到一起,训练样本先做 fit,得到 mean,standard deviation,
然后将这些参数用于 transform(归一化训练数据),使得到的训练数据是归一化的,而测
试数据只需要在原先得到的 mean,std 上来做归一化就行了,所以用 transform 就行了。
StandardScaler 对矩阵作归一化处理,变换后的矩阵各特征均值为0,方差为 1。
8.2.4 机器学习第四步:使用机器学习算法识别数字图像
8.2.5 机器学习第五步:对机器学习算法分类性能进行评估
3 8.3 构建机器学习系统
我们使用机器学习预测模型的工作流程讲解机器学习系统整套处理过程。
整个过程包括了数据预处理、模型学习、模型验证及模型预测。其中数据预处理包
含了对数据的基本处理,包括特征抽取及缩放、特征选择、特征降维和特征抽样;我们
将带有类标的原始数据划按照 82 原则分为训练数据集和测试集。使用训练数据集用于
模型学习算法中学习出适合数据集的模型,再用测试数据集用于验证最终得到的模型,
将模型得到的类标签和原始数据的类标签进行对比,得到分类的错误率或正确率。
当有新数据来的时候,我们可以代入模型进行预测分类。
注:特征缩放、降维等步骤中所需的参数,只可以从训练数据中获取,并能够应用
于测试数据集及新的样本,但仅仅在测试集上对模型进行性能评估或许无法监测模型是
否被过度优化(后面模型选择中会提到这个概念)。
8.3.1 数据预处理(特征工程)
数据预处理是机器学习应用的必不可少的重要步骤之一,以提到的 Iris Dataset 为例,将
花朵的图像看做原始数据,从中提取有用的特征,其中根据常识我们可以知道这些特征可以
是花的颜色、饱和度、色彩、花朵整体长度以及花冠的长度和宽度等。首先了解一下几个数
据预处理方法:
 (数据归一化与标准化,缺失值处理)大部分机器学习算法为达到性能最优的目
的,将属性映射到[0,1]区间,或者使其满足方差为 1、均值为 0 的标准正态分布,从而提取
出的特征具有相同的度量标准。
 (数据降维)当源数据的某些属性间可能存在较高的关联,存在一定的数据冗余。
此时,我们使用机器学习算法中的降维技术将数据压缩到相对低纬度的子空间中是非常有用
的。数据降维算法不仅可以能够使得所需的存储空间更小,而且还能够使得学习算法运行的
更快。
 (数据集切分) )为了保证算法不仅在训练集上有效,同时还能很好地应用于新数据,
我们通常会随机地将数据集划分为训练数据集和测试数据集,使用训练数据集来训练及优化
我们的机器学习模型,完成后使用测试数据集对最终模型进行评估。
数据预处理也称作特征工程,所谓的特征工程就是为机器学习算法选择更为合适的特
征。当然,数据预处理不仅仅还有上述的三种。
** 数据预处理实战
8.3.2 选择预测模型进行模型训练
任何分类算法都有其内在的局限性,如果不对分类任务预先做一些设定,没有任何一个
分类模型会比其他模型更有优势。因此在实际的工作处理问题过程中,必不可少的一个环节
就是选择不同的几种算法来训练模型,并比较它们的性能,从中选择最优的一个。
(1)如何选择最优的模型呢?我们可以借助一些指标,如分类准确率(测量值和真实
值之间的接近程度)、错误率等指标衡量算法性能。
(2)疑问:选择训练模型的时候没有使用测试数据集,却将这些数据应用于最终的模
型评估,那么判断究竟哪一个模型会在测试数据集有更好的表现?
针对该问题,我们采用了交叉验证技术,如 10 折交叉验证,将训练数据集进一步分为
了训练子集和测试子集,从而对模型的泛化能力进行评估。
(3)不同机器学习算法的默认参数对于特定类型的任务来说,一般都不是最优的,所
以我们在模型训练的过程中会涉及到参数和超参数的调整。
什么是超参数呢?超参数是在模型训练之前已经设定的参数,一般是由人工设定的。
什么是参数呢?参数一般是在模型训练过程中训练得出的参数。
8.3.3 模型验证与使用未知数据进行预测
使用训练数据集构建一个模型之后可以采用测试数据集对模型进行测试,预测该模型在
未知数据上的表现并对模型的 泛化误差进行评估。如果对模型的评估结果表示满意,就可以
使用此模型对以后新的未知数据进行预测。(模型评估部分会专门在下节讲解~)
但什么是泛化误差呢?我们带着这个问题分别对模型验证这块涉及到的基础概念做一
个深入理解:
【念 基础概念 11】通常我们把分类错误的样本数占样本总数的比例称为“错误率(error
rate)”,如果在 m 个样本中有 a 个样本分类错误,则错误率为 E=a/m;从另一个角度,1-a/m
则称为“分类精度(accurary)”,也就是“精度+错误率=1”。
我们将模型(或学习器)的实际输出与样本的真实值之间的差异称为“误差(error)”,
学习器在训练集上的误差称为“训练误差(training error)”或经验误差(empirical error),
在新的样本上的误差称为“泛化误差(generalization error)”。
我们在模型验证的时候 期望得到泛化误差小的学习器。
实际的任务中,我们事先并不知道新样本是什么样子的,实际能做的就是努力使得训练
误差最小。但是真正当一个模型对训练集的分类错误率为 0,分类精度为100%,但是这是
我们真正想要的学习器吗?通常情况下,训练集上的分类精度太高,模型在测试集上的性能
不会太好。所以我们 初步讨论下模型的评估及模型选择问题。
( 叙述 :模型评估主要从准备率、召回率等几个指标做预测模型的评估,模型选择我们
主要从模型的泛化性能的两个方面展开,一个是欠拟合,一个是过拟合。)
8.3.4 模型评估
构建机器学习模型的一个关键步骤就是在新数据上对模型的性能进行评估,模型评估就
是评估得到的经训练数据集结合机器学习算法训练得到的预测模型是否是最优的或者对新
数据有较强的泛化能力。我们通过以下几个性能指标评估预测模型:分类的混淆矩阵、分类
准确率、召回率以及 F1-score,K 折交叉验证几个部分来学习模型评估。
1. 混淆矩阵读取
首先,认识混淆矩阵 confusion matrix,该矩阵是展示学习算法性能的一种矩阵。
(1)首先绘制混淆矩阵,该矩阵为方阵
(2)如下图,该矩阵用于展示分类器预测结果----真正 TP(true positive)、真负 TN(true
negative)、假正 FP(false positive)、假负 FN(falsenegative)。
Sklearn 提供的 confusion_matrix 函数生成该矩阵,MNIST 手写体识别的混淆矩阵如下:
2 准确率和召回率、1 F1 分数
预测误差(error,ERR)和准确率(accurary,ACC)都提供了误分类样本数量的相关信息。
误差可以理解为预测错误样本与所有被预测样本数量量的比值,而准确率计算方法则是正确
预测样本的数量与所有被预测样本数量的比值。
TN TP FN FP
FN FP
ERR
  

 错误率
TN TP FN FP
TN TP
  

 CC A 准确确率
对类别数量不均衡的分类问题来说,真正率 TPR 与假正率 FPR 是更重要的指标:
TN FP
FP
N
FP
FPR

  ,
TP FN
TP
N
TP
TPR

 
比如在肿瘤诊断中,我们更为关注是正确检测出的恶性肿瘤,使得病人得到治疗。然而
降低良性肿瘤(假负 FN)错误被划分为恶性肿瘤,但对患者影响并不大。与 FPR 相反,真
正率提供了有关正确识别出来的恶性肿瘤样本(或相关样本)的有用信息。
由此提出了准确率(persoon,PRE)和召回率(recall,REC),是与真正率、真负率相关的性
能评价指标,召回率实际上与真正率含义相同,定义如下:
(真正率是看矩阵的行,即实际情况)
TP FN
TP
N
TP
TPR REC

  
准确率(模型的预测情况,看矩阵的列)定义:
FP TP
TP
PRE


实际中,常采用准确率与召回率的组合,称为 F1-Score
REC PRE
REC PRE
F


 2 1
Sklearn 的调用如下代码所示:
d 3.Khold 评估模型性能
验证模型准确率是非常重要的内容,我们可以将数据手工切分成两份,一份做训练,一
份做测试,这种方法也叫“留一法”交叉验证。这种方法很有局限,因为只对数据进行一次
测试,并不一定能代表模型的真实准确率。因为模型的准确率和数据的切分是有关系的,在
数据量不大的情况下,影响比较大。因此我们提出了 K 折交叉验证,K-Fold 交叉验证。
K-Fold 交叉验证,将数据随机且均匀地分成 k 分,常用的 k 为 10,数据预先分好并保持
不动。假设每份数据的标号为 0-9,第一次使用标号为 0-8 的共 9 份数据来做训练,而使用
标号为 9 的这一份数据来进行测试,得到一个准确率。第二次使用标记为1-9 的共 9份数据
进行训练,而使用标号为0 的这份数据进行测试,得到第二个准确率,以此类推,每次使用
9 份数据作为训练,而使用剩下的一份数据进行测试,这样共进行 10 次,最后模型的准确
率为 10 次准确率的平均值。这样就避免了数据划分而造成的评估不准确的问题。
如下图:
4 使用 n scikit-learn 实现 d k-fold 验证
1. cross_val_score 方法可以将不同分块的性能评估分布到多个cpu 上处理
2. n_jobs 参数设置为 1 就和 StratifiedKFold 一致了,只使用一个 CPU 对性能评估
3. 如果设置 n_jobs=2 可以将 10 轮的交叉验证分布到两块 CPU 上
4. 如果设置 n_jobs=-1,则可以计算机所有的 cpu 并行地进行计算。
注:第一个矩阵里面由 10 个数据组成,这里设置为 10 折交叉,即将数据集划分为 10
份。第一个数据为使用标号为 0-8 的共 9 份数据来做训练,而使用标号为 9的这一份数据来
进行测试,得到一个准确率,以此类推。最后得到的模型准确率在 95%左右(+or-0.10,即
1%)。
4 8.4 模型的选择
一个模型可能有很多种情况出现,那么我们如何选择最优的模型呢?
8.4.1 那条曲线拟合效果是最好的?
观察上述图示:
利用已知的样本点在图示的坐标轴上画出了绿色的曲线,表示源数据的大致分布状况。
假设我们使用后面要学习的线性回归去解决样本点拟合问题, 比如用多项式表示线性回归
模型: N B kx y
n
   n , ,当 n=0 时,y=k,就是图一的平行于 x 轴的直线,此时该直线不
能很好的拟合样本数据;当 n=1 时,y=kx+B,得到图 2 的一次直线,我们可以注意到无论怎
么调整该直线都不能很好的拟合样本数据;上述 n=0 或 1 时是模型的欠拟合情况。当 n=3
时, B x k x k x k y    
3
2
2
3
1
,得到图 3 的三次函数拟合曲线,这种情况是能够很好的拟
合样本数据;但是,当 n=9 时,得到图 4 的拟合曲线。当 n 取值越高的时候,当前样本的
数据能够很好的拟合,但是在新的数据上效果却很差,这时出现了过拟合情况。
通过上述图大家应该能看到,即便我们确定了使用线性回归模型去处理,我们在选择参
数的时候也是有很多种情况。如 B x k x k x k y    
3
2
2
3
1
,可以调整不同的 k1、k2 和 k3
的值,同时也对应了不同的拟合直线,我们希望可以从这些参数中找到拟合较好的直线,但
不能过分的好,因为我们要考虑当新数据来了模型的分类情况。
由此我们引入了模型的“泛化”能力的概念。
8.4.2 泛化
机器学习的目标是使学得的模型能很好地适用于“新样本”,而不是仅仅在训练样本上
工作的很好;即便对聚类这样的无监督学习任务,我们也希望学得的簇划分能适用于没在训
练集中出现的样本。学得模型适用于新样本的能力,称为“泛化”(generalization)能力。
具有强泛化能力的模型能很好地适用于整个样本空间。(现实任务中的样本空间的规模通常
很大,如 20 个属性,每个属性有 10 个可能取值,则样本空间的规模是 10 20 )。
还有一个泛化的概念:
【念 基础概念 12】模型具有好的泛化能力指的是:模型不但在训练数据集上表现的效果
很好,对于新数据的适应能力也有很好的效果。
当我们讨论一个机器学习模型学习能力和泛化能力的好坏时,我们通常使用过拟合和欠
拟合的概念,过拟合和欠拟合也是机器学习算法表现差的两大原因。
【念 基础概念 13】过拟合 overfitting:模型在训练数据上表现良好,在未知数据或者测试
集上表现差。
【念 基础概念 14】欠拟合 underfitting:在训练数据和未知数据上表现都很差。
8.4.3 欠拟合
图 1和图 2 都是模型欠拟合的情况:即模型在训练集上表现的效果差,没有充分利用数
据,预测准确率很低,拟合结果严重不符合预期。
产生的原因:模型过于简单
出现的场景:欠拟合一般出现在机器学习模型刚刚训练的时候,也就是说一开始我们的
模型往往是欠拟合也正是因为如此才有了优化的空间,我们通过不断优化调整算法来使得模
型的表达能力更强。
解决办法:(1)添加其他特征项:因为特征项不够而导致欠拟合,可以添加其他特征
项来很好的解决。
(2)添加多项式特征,如图(3)我们可以在线性模型中通过添加二次或三次项使得模
型的泛化能力更强。
(3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟
合,需要减少正则化参数。
8.4.4 过拟合
图四是模型过拟合的情况:即模型在训练集上表现的很好,但是在测试集上效果却很差。
也就是说,在已知的数据集合中非常好,再添加一些新数据进来效果就会差很多。
产生的原因:可能是模型太过于复杂、数据不纯、训练数据太少等造成。
出现的场景:当模型优化到一定程度,就会出现过拟合的情况。
解决办法:(1)重新清洗数据:导致过拟合一个原因可能是数据不纯导致的,
(2)增大训练的数据量:导致过拟合的另一个原因是训练数据量太小,训练数据占总
数据比例太低。
(3)采用正则化方法对参数施加惩罚:导致过拟合的原因可能是模型太过于复杂,我
们可以对比较重要的特征增加其权重,而不重要的特征降低其权重的方法。常用的有 L1 正
则和 L2正则,我们稍后会提到。
(4)采用 dropout 方法,即采用随机采样的方法训练模型,常用于神经网络算法中。
注意:模型的过拟合是无法彻底避免的,我们能做的只是缓解,或者说减小其风险,因
为机器学习面临的是 NP 难问题(这列问题不存在有效精确解,必须寻求这类问题的有效近
似算法求解),但是有效算法必然是在多项式时间内运行完成的,因此过拟合是不可避免的。
在实际的任务中往往通过多种算法的选择,甚至对同一个算法,当使用不同参数配置时,也
会产生不同的模型。那么,我们也就面临究竟选择哪一种算法,使用哪一种参数配置?这就
是我们在机器学习中的“模型选择(model select)”问题,理想的解决方案当然是对候选
模型的泛化误差进行评估,然后选择泛化误差最小的那个模型。我们更详细的模型选择会有
专门的专题讲到,如具体的评估方法(交叉验证)、性能度量准则、偏差和方差折中等。
补充:NP 难问题
NP 是指非确定性多项式(non-deterministic polynomial,缩写 NP)。所谓的非确定性是
指,可用一定数量的运算去解决多项式时间内可解决的问题。
例如,著名的推销员旅行问题(Travel Saleman Problem or TSP):假设一个推销员需要
从香港出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。任意两个城市之
间都有飞机直达,但票价不等。假设公司只给报销 C 元钱,问是否存在一个行程安排,使
得他能遍历所有城市,而且总的路费小于 C?
推销员旅行问题显然是NP 的。因为如果你任意给出一个行程安排,可以很容易算出
旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检
查所有可能的旅行安排! 这将是个天文数字。
迄今为止,这类问题中没有一个找到有效算法。倾向于接受 NP 完全问题(NP-Complet
或 NPC)和 NP 难题(NP-Hard 或 NPH)不存在有效算法这一猜想,认为这类问题的大型
实例不能用精确算法求解,必须寻求这类问题的有效的近似算法。
8.4.5 奥卡姆剃刀原则
奥卡姆剃刀原则是模型选择的基本而且重要的原则。
模型是越复杂,出现过拟合的几率就越高,因此,我们更喜欢采用较为简单的模型。这
种策略与应用就是一直说的奥卡姆剃刀(Occam’s razor)或节俭原则(principe of parsimony)
一致。
奥卡姆剃刀:给定两个具有相同泛化误差的模型,较简单的模型 比较复杂的模型更可取。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值