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

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

将图片转换成特征向量(这个进阶知识不在本篇中涉及)

决定一种合适当前场景的分类器

结合1中得到的特征和2中得到的分类器训练出模型

用模型中的公式预测数据,估算出其属于某个标签的可能性,最大可能性的那个即模型推算出的结果


数据准备

转换过程略,假设共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']

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

# 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-learn的classifier中通过方法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程序已经完成了,也基本了解了机器学习是怎么回事,是不是还挺有意思的?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwygpp.html