常用的 Python Machine Learning 开源库
- scikit-learn
- TensorFlow
之后主要就演示使用 scikit-learn 进行 Machine Learning 的学习
什么是机器学习
我们可以把 机器学习看作是人工智能的一个子领域,初期的 AI 人工智能程序只能做好一件事情,eg: 深蓝很会下棋,但只会下棋
但是现在我们写的程序可以解决更多问题,而不需要重新编码, eg: 阿尔法狗, 不仅会下棋,还很会玩打砖块的游戏
之后我们学的就是这样一种 可以从样本中学习的算法,它取代了硬编码规则
区分苹果和橘子的代码怎么写?
需求: 以一张图片为基础,做一些分析,然后辨别出图上是哪一种水果
分析: 需要写出大量的规则来完成这种分析,比如写一个程序将橘子的像素点相加,然后比较其中绿色像素点的数量,这个比例可以给你判断这是哪种水果的依据
但是更深刻的看这个问题时,你将会发现这个世界充满着不确定因素,你好不容易写的规则可能会被一些个例打破,eg :你要写怎样的代码才能识别黑白照片,或者图片中根本没有苹果和橘子呢?
事实上,不管你写多少规则,都能找到一张没法让他识别的图片,你必须写成千上万的规则而这只是用来区分 苹果跟橘子, 如果换一个问题,你又得重写这些代码
对于这类问题,我们需要一种算法,可以自动生成规则,这样我们就不需要一条条重复劳动了,为了做到这些,我们需要训练一个分类器 Classifier
你可以将分类器看作一个 方法, 它将接受一些数据作为输入,然后它们分配标签作为输出
比如,给我一张图片,我需要知道图片上到底是橘子还是苹果,或者我收到一封邮件,我需要区分这到底是不是一封垃圾邮件
用来实现自动分类器的技术,我们称之为 监督学习: Supervised Learning
Supervised Learning :
- Create a classifier by finding patterns in examples
Hello World
Installing scikit-learn
Supervised Learning
Supervised Learning 有这样几个基本步骤
收集数据
首先将描述的水果属性作为输入数据:根据像质量、质感等特性对收集到的数据进行预测,这到底是一个苹果还是橘子
我们把测量好的数据记录在一张表中,在机器学习中,我们把这种测量得到的值叫做 特征
表格的每一行都是我们训练数据的一个样本,它描述了一个水果的属性,最后一列我们把它叫做标签,用来标注每行的数据是什么水果
我们需要让 训练器 学习这所有的数据,我们拥有更多的训练数据,分类器就能更好的工作
Train Classifier
现在我们用代码来表示训练数据,首先我们定义两个变量:features 和 labels
features 包含了上面图中表格前两列的数据:分类器的输入
label 特指最后一列数据:我们希望分类器给出的输出
- features 中第二个数据 smooth& bumpy 用 0&1 表示是因为:scikit-learn uses real-values features,所以用整数而不是字符串
- label 中 0 -> 苹果, 1 -> 橘子
#Firest Machine Learing Program
from sklearn import tree
features = [[140,1], [130,1], [150,0], [170,0]]
labels = [0,0,1,1]
下面要用这些示例数据来训练我们的分类器,这里我们用到的分类器类型叫做 决策树
暂时不做深入解释,但现在,我们可以把分类器看作是汇集了很多规则的盒子,有很多类型的分类器,但是输出输入型总是一样的,
from sklearn import tree
...
clf = tree.DecisonTreeClassifier()
上面的代码中我们使用了 决策树,到这一步,它还是一个没有规则的空盒子,完全不知道如何区别苹果和橘子,为了训练它,我们需要一种算法
如果分类器是一种有许多规则的盒子,你可以把学习算法思想看成是 创造这个盒子的过程,它通过训练来寻找一些固有的模式,比如,它会注意到橘子可能会更重一点,苹果会更光滑一点(我会什么会想到妹子的皮肤呢,=-=)
那么它会创造一条规则,对于重一些的水果,有较大可能是个橘子
在 scikit 这个库里,训练算法包含在分类器实例中,叫 fit, 你可以把 fit 理解成 发现数据固有模式的同义词
clf = clf.fit(features, labels)
Make Predictions
输入数据: 一个重约 150g, 表皮粗糙的水果,输出0 -> 苹果,输出1 -> 橘子
print(clf.predict([[150, 0]]))
完整代码
#Firest Machine Learing Program
from sklearn import tree
features = [[140,1], [130,1], [150,0], [170,0]]
labels = [0,0,1,1]
#使用决策树
clf = tree.DecisionTreeClassifier()
clf = clf.fit(features, labels)
print(clf.predict([[150, 0]]))