《机器学习实战》-机器学习基础
机器学习基础
- 什么是机器学习
- 机器学习的基本术语
- 监督学习和非监督学习
- 机器学习工具介绍
- 总结
人工智能的核心是机器学习,机器学习的本质是算法
机器学习的官方解释:机器学习是指如果一个程序可以在任务 T 上,随经验E 的增加,效果 P 也随之增加,则这个程序可以从经验中学习。A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.
机器学习的真实含义:机器学习能让我们自数据集中受到启发,换句话说,我们会利用计算机来彰显数据背后的真实含义。他也许不是我们所想象的那种会模仿的机器人,也不是那种具有人类感情的仿生人。 —《机器学习实战》
机器学习的应用场景:
- 你早上到了公司,点开你的公司邮箱检查昨晚有没有人给你发送邮件。*在你点开邮件系统的时候,垃圾邮件过滤器已经在后台帮你自动的过滤了垃圾广告邮件。*
- 工作闲暇之余,你去某宝通过关键字搜索某件你想要购买的东西,但是老板突然走了过了,你还没有购买便强行退出了某宝。*那么某宝会记录你这次的行为,然后你下次登陆某宝时会发现某宝换了一批你想要的产品推荐给你。*
- 工作之后,你去一个大商场购买一袋酒鬼花生,然后在结账的时候收银员给了你一张5元的优惠券,可以用于购买一打啤酒。*之所以你会得到这张优惠券,是因为这台收费软件基于以前的统计知识,认为买酒鬼花生的人往往也会买啤酒。*
- 回到家你拿出手机点开了抖音,你会发现抖音给你推送的都是你喜欢的短视频,你看的目不转睛。*因为抖音在你每次搜索之后都会记录你的行为,然后把所有与你搜索相关的视频作为推送给你的主要目标。*
总而言之,机器学习技术目前应用于各种场景,例如:人脸识别、手写数字识别、垃圾邮件过滤和某宝的产品推荐。
什么是机器学习
机器学习
把无序的数据转换成有用的信息。
应用场景
机器学习不限制某个单独的领域,机器学习可以应用于任何需要解释并操作数据的领域。
注意:机器学习无法保持完美地预测,但通过统计学的知识能够提高我们预测的正确率,并且在社会科学领域,如果某个分析的正确率能高达60%就会被认为是非常成功的。*如果我们需要建立一个模型,用此来预测如何能让每个人以同样的方式获得幸福。但这可想而知是很难得,因为大家对幸福的理解都是迥异不同的。*
海量数据
现在智能手机上有各式各样的传感器,例如磁力计、偏航率陀螺仪、三轴加速器、温度传感器和 GPS 接收器,通过这些传感器会产生海量的数据,也就意味着我们未来要面临越来越多的数据,因此如何从这些海量数据中抽取到有价值的信息将是一个非常重要的课题。
机器学习的重要性
在过去的半个世纪里,发达国家的多数工作岗位都从体力劳动转化为脑力劳动,但现在都在逐步消失,例如目前兴起的无人便利店、无人加油站、无人飞机、无人驾驶等等,而这些都依赖于对信息的处理,对海量数据的处理,机器学习也就运用而生,他将帮助我们从中抽取有用的信息。
机器学习的基本术语
如果我们工作一段时候后,打算去找中介买房。中介会询问你对房子的需求,例如:大小、布局、朝向、地理位置。当然,一定不仅仅只有这些,我们假设中介只会问你这四点,而这四点在机器学习中称之为特征feature,有时候也会称为属性attribute,以后我们会统称为特征。
之后你说出了你的需求——大小:100㎡、布局:三室一厅一卫、朝向:朝南、地理位置:上海市徐汇区——的房子,然后中介会去他们的搜索系统中找到这些特征输入对应的值,之后该系统会列出与你想要的房子相似的房源,并打印一份带有价格的表格给你,这个表格中的每一所房子在机器学习中都是一个具有相关特征的示例instance,也可以称之为样本sample。
表1-1:基于上述特征搜索的房源
大小 | 布局 | 朝向 | 地理位置 | 价格 |
---|---|---|---|---|
100㎡ | 三室一厅一卫 | 朝北 | 上海市徐汇区 | 500w |
105㎡ | 三室两厅一卫 | 朝南 | 上海市闵行区 | 502w |
100㎡ | 三室一厅一卫 | 朝南 | 上海市黄浦区 | 505w |
…… | …… | …… | …… | …… |
输出该表格的搜索系统就是一个机器学习系统,他会对我们给出的数据判断并把合适的结果推荐给我们,并且在推荐给我们之前他们使用回归算法对这些房子的价格进行了预测。*此处我们只拿房价预测举例*
*这个时候我们可能对买房不感兴趣了,因为我们只准备了100w,然而符合我们心里预期的房子最低也要500w,所以我们认为他们的机器学习系统对房价的预测是不准确的,所以我们想自己研究一个预测房价的机器学习系统卖给他们。现在我们就开始手动实现一个机器学习算法让我们可以通过这四个特征来预测这所房子的价格。*
- 因此我们去房源官网采集了一些数据,并对这些数据进行清洗,以确保我们的数据格式是我们的机器学习算法所需要的。
- 现在我们拥有了很多房子的数据供我们测试、分析,这些数据在机器学习中被称为训练集training set:训练集用于训练机器学习算法的数据样本集合,表1-1就是一个包含多个训练样本training sample的训练集,每个训练样本中包含4种特征、一个标记label:本例中标记是房价,是机器学习算法的预测结果。
- 在机器学习中,通常我们会把训练集中的数据分为训练数据training data和测试数据testing data,我们设计一个机器学习算法对训练数据进行训练,之后我们用测试数据来测试该算法的精准度——比对算法输出的结果与测试数据已有的结果,就可以得出我们该算法的精准度,如果精准度没有达到要求,我们就需要重新设计算法然后再分析。当然还有交叉验证集的概念,以后我们在叙述。
*如果我们做出的算法的精准度很高,我们就可以把机器学习算法转换为应用程序,我们就可以把这个系统卖给那所中介了。*
监督学习和非监督学习
监督学习:supervised learning
上述的房价的实例是通过房子的特征预测房价,而房价是连续值,因此用到的是回归regression,即通过给定的特征拟合数据点的位置,然后通过该拟合曲线与测试数据点的位置即可得到测试的结果。机器学习的另一项任务是分类classification,他的目标变量大都是离散值,如果房价≥500w 的我们称之为高房价,否则我们称之为低房价,则我们可以通过房子的特征判断房价是高房价还是低房价。分类和回归都属于监督学习,之所以称之为监督学习,是因为这类算法必须知道预测什么,即有明确的目标变量。
非监督学习:unsupervised learning
除了对房价的预测,我们还可以对房子分成若干个组,每组我们称为一个簇cluster,这些自动形成的簇可能对应一些潜在的概念划分,例如电梯房、无电梯房,但是电梯房和无电梯房这样的概念我们事先是不知道的,并且训练样本通常也无该标记信息,只是通过聚类clustering的方法对房子的数据进行分析,然后给出了我们这样一个潜在的概念。
当然,机器学习远不止这些内容,但是这些基本术语对我们这些初学者来讲,已经够用了。房子也买了,预测房价系统也实现了,相信大家对机器学习有了一个更深层次的了解,而不是《变形金刚》中的大黄蜂诸如此类…
*下面我们也要从一个买房者的身份转换成一个机器学习者,这样我们才能实现我们的房价预测系统顺带实现我们的买房大愿,而不是以程序员的口吻说出:“怎么能这么贵呢?一定是房价预测系统出了问题。”*
机器学习工具介绍
Python
首先浅谈我们的 Python 吧!Python 相信大家一定不陌生,这两年已经成了风口上的那头“神猪”,他能成为“神猪”的原因和机器学习是密不可分的,他虽然没有 编译语言如 C 那样的执行效率,但是他以开发效率快著称,他的语法清晰,易于操作纯文本文件,使用广泛,存在大量的开发文档。并且他一度被称作可执行伪代码,默认附带了很多高级数据类型,可以使用自己熟悉的编程风格,如面向对象编程、面向过程编程。
Python 自带的 SciPy 和 NumPy 等许多科学函数库都可以实现向量和矩阵的操作,并且这些科学函数库使用底层语言编写,极大的提高了相关应用程序的计算性能。
Python 自带的科学工具还可以与绘图工具 Matplotlib协同工作。Matplotlib 可以绘制2D、3D 图形,也可以处理科学研究中经常用到的图形。
Python 的好处不多叙述,不能因为我们用 Python 而去吹捧他,只是因为他是真的很适合我们这些新手吧。并且最最重要的是:Python 的核心代码可以使用 C 来替换,而没必要非得和编译型语言拼执行效率,那不是自寻死路吗?
非 Python
机器学习的工具中,在我心中除了 Python其他的都是非 Python,为什么这么讲呢?让我娓娓道来。
首先 MATLAB 不用多讲了,单个软件授权费就要花费上千美元。作为一个合格的程序员,如果让我花钱使用某个软件,那么我情愿……当然,你也可以使用 Octave,Octave 我也使用过一段时间,怎么讲呢?执行速度是不用讲的,但是 Octave 功能太单一,如果只是单纯的拿来操作矩阵,那是可以的,如果用它来进行机器学习程序的编写,我只能说有点累。
Java 和 C 等强类型语言也有矩阵数学库,但是曾经网上就流传过一段佳话:一个程序 C 写可能需要100行,Java 可能需要50行,而 Python 可能只需要20行。对于只写过 Python 代码的你来说,你可能无法体会,但对于我这个用过 C 的人来说,为什么你写个简单的九九乘法表那么麻烦?不论更代码是不是给人看的,更重要一点的是,在这个快社会,相比较快速的执行效率,公司还是希望更快的开发效率吧?毕竟现在是个人都想成为第一个吃螃蟹的人。当然,你自创的公司可能例外。
NumPy 函数库基础
注意:如果不熟悉线性代数也不用着急,这里用到的线性代数只是简化不同的数据点上执行的相同数学运算。将数据表示为矩阵形式,只需要执行简单的矩阵运算而不需要复杂的循环操作。*总而言之使用线性代数只是为了简化运算,并没有用到较深的数学只是,例如矩阵的运算其实可以使用 for 循环来代替,只不过使用矩阵运算更方便、更有效率。*
测试 Numpy 库
注意:再次重申,也许你不懂线性代数,也许你不知道什么是数组,什么是矩阵,什么是矩阵的逆,什么是单位矩阵,但这一点都不影响你成为一名机器学习专家,但他或许会影响你成为图灵、成为冯诺依曼那样的大师,但我极力推荐你需要去自己了解一些机器学习的原理,这就好比看 Django、看 Flask 源码一样令你心情舒畅。这里推荐吴恩达老师机器学习视频,以及周志华老师的《机器学习》西瓜书,都是很好的入门教材。
from numpy import *
print(random.rand(3,3)) # 构建一个3*3的随机数组
\'\'\'
array([[0.49464356, 0.76076607, 0.43525461],
[0.37401296, 0.83818918, 0.8630109 ],
[0.30685469, 0.65686257, 0.9354526 ]])
\'\'\'
# 将数组转化为矩阵
rand_mat = mat(random.rand(3,3))
print(rand_mat)
\'\'\'
matrix([[0.53549597, 0.1512243 , 0.13608029],
[0.43568756, 0.75499249, 0.27348369],
[0.06484205, 0.67025154, 0.25451123]])
\'\'\'
# 对矩阵求逆
inv_rand_mat = rand_mat.I
print(inv_rand_mat.I)
\'\'\'
matrix([[ 0.37301234, 2.22174614, -2.58680522],
[ -3.92575573, 5.37174698, -3.67318659],
[ 10.24338676, -14.7124522 , 14.26142481]])
\'\'\'
# 执行矩阵乘法
my_eye = inv_rand_mat * rand_mat
\'\'\'
计算结果本应该是单位矩阵,即对角线全是1,其他元素都是0,但是由于计算机处理有误差,矩阵里还留下了许多非常小的元素。
matrix([[1.00000000e+00, 1.76037137e-17, 1.35053809e-16],
[7.06118772e-17, 1.00000000e+00, 3.09252006e-16],
[1.93493163e-16, 1.02215889e-17, 1.00000000e+00]])
\'\'\'
# 得到误差值:
error = my_eye - eye(3)
\'\'\'
eye(3)得到一个3*3的单位矩阵
matrix([[ 0.00000000e+00, 1.76037137e-17, 1.35053809e-16],
[ 7.06118772e-17, -1.11022302e-16, 3.09252006e-16],
[ 1.93493163e-16, 1.02215889e-17, -3.33066907e-16]])
\'\'\'
测试 NumPy 库代码整合
rand_arra = random.rand(3,3)
rand_mat = mat(random.rand(3,3))
inv_rand_mat = rand_mat.I
my_eye = inv_rand_mat * rand_mat
error = my_eye - eye(3)
print("""
rand_arra: {0}\n
rand_mat: {1}\n
inv_rand_mat: {2}\n
my_eye: {3}\n
error: {4}""".format(
rand_arra,rand_mat,inv_rand_mat,my_eye,error))
总结
曾经热火朝天的互联网+、跌落神坛的比特币(区块链),不说接盘侠们,别那么悲观,我们更应该考虑的是他们给多少人带来了财富自由的机会,你要知道正态分布的左端只会涨不会跌。
现如今,如本文前面所说,现如今人类所能产生的数据量是海量的,随着大数据的推进,数据量只会越来越大,而机器学习的重要性也可想而知。虽然Python、机器学习已经踩在风口浪尖上,他随时有可能跌落神坛,但我们是无法预测他什么时候也会跌落神坛的,事实证明我们已经无法成为那第一头“神猪”,也正是这个无法预测、这个事实证明,我们才有机会,你要知道,最后称王的不是陈胜吴广、不是 ofo、不是 Uber、不是开心农场,后来者居上,正所谓“长江后浪推前浪,前浪被拍死在沙滩上”,我们要向牛顿学习——站在巨人的肩膀上,然后超过他们,而不是鄙夷之。
曾听过一段很经典的话,如果你只是单纯的做IT,那么每年会有数不清的人和你竞争,这个市场迟早会饱和,Python 也许会成为下一个 C、下一个.net、下一个 Java,但是在医药行业你会编程,在汽车行业你会编程,那么就是香饽饽了。而现如今机器学习给我们提供了一个很好的机会,正如本文所说机器学习不限领域,它更多地是对数据的处理。
世俗也好,名利也罢,希望本文能让你对机器学习有一个大概的了解,能够爱上他。也许他并没有你想的那么神秘。
预知后事如何,请看下回分解——k-近邻算法