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

前言

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

其实人工智能在上世纪五、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程序已经完成了,也基本了解了机器学习是怎么回事,是否是还挺有意思的?



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

相关文章
相关标签/搜索