机器学习笔记1 - Hello World In Machine Learning

前言

Alpha Go在16年以4:1的战绩打败了李世石,17年又以3:0的战绩战胜了中国围棋天才柯洁,这真是科技界振奋人心的进步。伴随着媒体的大量宣传,此事变成了妇孺皆知的大事件。大家又开始激烈的讨论机器人什么时候会取代人类统治世界的问题。

其实人工智能在上世纪5、60年代就开始进入了理论研究阶段,人们在不断探索人工智能技术的同时,也担忧起机器人会不会替代人类。然而现实比理想残酷的多,由于当时各种条件的限制(理论基础、技术基础、数据基础、硬件性能等),人工智能相关的项目进度缓慢,也缺少实际成效,研发资金、社会关注度也越来越低,人工智能进入第一次低谷期。

到了80年代,卡内基梅隆大学为数字设备公司设计了一套名为XCON的“专家系统”。这是一种,采用人工智能程序的系统,可以简单的理解为“知识库+推理机”的组合,XCON是一套具有完整专业知识和经验的计算机智能系统。人工智能再一次被各国政府和科研机构看好,大量的资金投入到研发中,但是好景不长,几年后随着苹果和IBM公司研发出了性能强劲的PC机,导致“专家系统”变得没有竞争力,人工智能发展又一次进入寒冬。

随后若干年,人工智能的发展趋于平稳和低调。时间来到21世纪,随着互联网的普及,大量数据被积累下来;摩尔定律一次又一次的被证实,计算机硬件性能以极快的速度在增长;“云”的普及,让普通大众也能轻松拥有调度大量算力的机会,人工智能不再是科学家和专业人员在实验室才能研究的东西了。数据+算力+易得这几方面的因素结合之后,将人工智能再一次推向了高潮。

可能这一波热潮又是人工智能发展史上的一个波峰,未来人工智能还有很长的路要走。但目前的人工智能发展已经惠及到商业领域,在这样一种技术+商业的结合中,我个人还是很看好这次浪潮的。尤其是在看过《最强大脑》中,百度在图像、音频方面的人工智能技术发展到这样一个水平之后(图像识别已经超超越了人类大脑对图像的识别能力,声音识别也几乎和人类最高水平持平),很希望自己也可以有机会涉足到这个领域中。


机器学习基础入门知识

机器学习是人工智能的一个分支,主要是通过数据+算法来训练得出模型,再用模型来预测数据的一种技术。

刚开始接触机器学习,发现基础理论中好多都是大学里学过的数理知识(一直以来困扰我的“大学为什么要学这些东西”的谜团总算被解开了:)。我个人做了Web开发近十载,大部分是应用级的,很少涉及数理算法,看来今后还要慢慢拾起这些知识。不过刚开始入门可以循序渐进,先弄懂机器学习是怎么回事,动手做一个“Hello world”,然后再逐步深入原理层面的知识。

要涉足机器学习,最好会一种编程语言,这点上我们程序员有先天优势。目前用于机器学习的主流语言是PythonRR我个人还没研究过,个人觉得Python是一个比较好的选择,流行度高、上手难度低、科学计算类库丰富、语法精简,如果本身就有其他面向对象的编程语言基础,不到一周就可以基本掌握Python了。

机器学习从从业分布来看,可以分成基础算法研究(设计师)和应(ban)用(zhuan)两个领域,其中大部分人都是在应(ban)用(zhuan)这个领域。

如果从技术层面来看,机器学习分成监督学习无监督学习以及半监督学习。如何来区分呢?首先解释下机器学习中的几个名词。

  • 特性(Features) - 其实就是数据
  • 分类器(Classifier) - 其实就是算法
  • 标签(Labels) - 其实就是种类
  • 模型(Models) - 其实就是最终输出的分类公式

监督学习,就是在有标签的前提下,找到一种最合适的分类器,分析特性标签之间的关系。
无监督学习,就是没有标签的前提下,将数据进行聚类(Clusting)
半监督学习,就是部分特性标签,部分则没有的状况(大部分特性可能是没有标签的情况)下进行分类。

监督学习相对来说最简单,由已知特性标签,利用合适的分类器训练出模型,再以模型套用到数据中来预测出数据的标签。当然,分类器并不需要我们自己来发明创造,我们大部分人也没这个能力做这些事情,所有的理论研究、科学论证、代码实现都是现成的。Python中有很多相关类库,比如scikit-learn。应用层面的机器学习,其实就是通过不停的调参(收集更多的数据、变换算法、选取合适的特征数据等工作)来找到一种更精准的预测模型的工作。


Hello World In Machine Learning

假设我们现在需要区分皮球(以直径15cm-25cm之间的球为例)和甜瓜的图片,如果是传统的硬编码的方式来写代码的话,可能需要写几百上千个if-else才能完成一个基本的算法,而且可扩展性特别差,比如如果图片是黑白的或者图片中有干扰物品,那可能需要修改源代码,添加更多的if-else来增加准确度。更糟的是,真正执行的时候会遇到很多事先没有预料到的特殊情况。
但如果通过机器学习,这个事情可能就会变得很简单。大致步骤如下:

  1. 将图片转换成特征向量(这个进阶知识不在本篇中涉及)
  2. 决定一种合适当前场景的分类器
  3. 结合1中得到的特征2中得到的分类器训练出模型
  4. 模型中的公式预测数据,估算出其属于某个标签的可能性,最大可能性的那个即模型推算出的结果

数据准备

转换过程略,假设共N条数据,转换得到的特性如下:

直径(厘米) 形状 颜色 标签
24 round white melon
35 ellipse white melon
24 round orange ball
24 ellipse yellow melon
22 round yellow ball
... ... ... ...

实现代码

features = [
    [24, 'round', 'white'],
    [35, 'ellipse', 'white'],
    [24, 'round', 'orange'],
    [24, 'ellipse', 'yellow'],
	[22, 'round', 'yellow'],
	...
]

labels = ['melon', 'melon', 'ball', 'melon', 'ball']

我们知道,计算机处理基础数据类型的速度,由快及慢为:boolintfloatstring...,因此,我们在处理数据的过程中,需要把原始数据抽象成计算机能最快处理的数据类型(因为机器学习运算量极大)。因此上面的代码经过转换之后:

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]]

# melon:1, ball: 2
labels = [1, 1, 2, 1, 2]

这里顺便提一下,大部分机器学习中,都是以GPU的性能来衡量处理速度的,而不是我们一般使用的CPU,这是因为GPU的物理架构和CPU不一样,GPU是专门为了处理图像而设计的,它对浮点数的处理速度是CPU的数十倍乃至数百倍。而机器学习基本上可以看做是对浮点数的大量运算,因此GPU更适合在机器学习领域被使用。


算法选取

机器学习中,解决一个问题的算法并不是唯一的,同一个问题可以适用不同的算法来解决,一般都会在效率准确率之间做权衡。本例中我们使用决策树(Deccision Tree)作为Classifier,关于决策树,可参考https://baike.baidu.com/item/%E5%86%B3%E7%AD%96%E6%A0%91


实现代码

from sklearn import tree
...
# 实例化classifier
clf = tree.DecisionTreeClassifier()

训练模型

scikit-learnclassifier中通过方法fit(features, labels)来训练模型。其返回值即我们所需的模型


实现代码

...
clf = tree.fit(features, labels)
...

预测数据

有了模型,我们就可以对今后的数据进行预测,以得出label值,从而达到对其归类的目的。


实现代码

...
# 假设现在有一个数据[23, 'round', 'white'],我们想知道他应该数据什么类型,先将其转换为[23, 1, 1], 然后调用模型的predict方法
print(clf.predict([[23, 1, 1]]))
...

得到的结果为:

# 代表机器学习测算得出结果是melon
[1]  

完整代码

from sklearn import tree

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]]

# melon:1, ball: 2
labels = [1, 1, 2, 1, 2]

# 实例化classifier
clf = tree.DecisionTreeClassifier()
# 训练
clf = clf.fit(features, labels)

print(clf.predict([[23, 1, 1]]))


后记

上例中,如果通过真正的人工智能肉眼来看,[23, 'round', 'white']被推算为melon的准确度其实并不高,因为[23, 'round', 'white']归类为ball也完全是可以的。上文提到过,机器学习其实就是不停的寻找合适的数据和算法以提升准确率的过程。想要提升准确率,我们可以有以下思路:

  • 加大训练样本量(训练样本必须和训练效率做好权衡,另外,最好避免重复的特性浪费算力,比如有了直径这列,就不需要半径、周长这样的特性了,这三者代表的是一个意思)
  • 变换算法(可以选用更高级的算法或者多个算法组合,但必须在准确度和效率之间做好权衡)
  • 抽象出更多的特性数据(比如本例中,如果有办法抽象出质量这样的特性,那对于预测准确率会有极大的提升)

至此为止,我们机器学习的Hello World程序已经完成了,也基本了解了机器学习是怎么回事,是不是还挺有意思的?



本文在我的博客园我的个人博客上同步发布,作者保留版权,转载请注明来源。

posted @ 2017-12-22 17:14  无上@诀  阅读(1522)  评论(0编辑  收藏  举报