进一步理解Classifier的训练过程
这一节,我们换个角度来理解之前已经学过的supervised learning。一方面,巩固对这种机器学习过程的了解;另一方面,也更深入一点对机器学习过程的认识,其实它远没有我们想象的神奇。
评估不同学习算法的质量
为了评估不同的Classifier在supervised learning中的效果,我们需要以下几个步骤:
- 准备训练和测试数据;
- 设置Classifier使用的学习算法,并进行训练;
- 使用测试数据验证学习效果;
准备训练和测试数据
因此,要先准备好哪些数据用于训练,哪些数据用于测试。简单起见,我们还是使用Iris数据集。新建一个叫做fx.py
的文件,添加下面的代码:
# Load the iris data sets
from sklearn import datasets
iris = datasets.load_iris()
x = iris.data # Features
y = iris.target # Labels
# y = f(x)
这里,我们刻意使用了x
表示Features集合,y
表示Labels集合。这样,就可以把通过Features推导出Labels的过程,理解成数学中的y = f(x)
,也就是一个函数。而这个函数,想必大家已经可以想到了,就是Classifier。
接下来,我们还是把Iris数据集分割一下,去一部分用于训练,一部分用于验证,除了使用numpy
之外,Scikit也提供了更方便的方法,像这样:
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = .5)
# y_train = f(x_train)
# y_test = f(x_test)
我们把x
和y
分别分成了对等的两份,其中,y_train = f(x_train)
,它们稍后将用于训练,而y_test = f(x_test)
,它们将用于验证。由于Iris数据集中有150条记录,用于训练和验证的数据集中,各包含随机生成的75个记录。
训练和预测
数据集准备好之后,就可以开始训练了,先使用之前的决策树算法:
from sklearn import tree
cls = tree.DecisionTreeClassifier()
cls.fit(x_train, y_train)
然后,我们用学习的结果来验证x_test
:
predictions = cls.predict(x_test)
print(predictions)
执行python3s fx.py
就会看到类似下面这样的结果:
[2 0 1 0 2 1 1 2 2 0 2 2 0 2 2 1 2 1 0 2 0 1 0 0 0 0 2 2 2 2 2 1 1 2 0 0 0
1 0 0 1 2 1 0 0 1 0 1 1 2 1 2 0 2 0 2 2 0 2 0 0 1 0 2 0 1 2 1 0 2 1 2 1 0
2]
其中每一项,表示了对x_test
集合的预测结果。但是,这个结果究竟有多准确呢?我们知道y_test
中的值是绝对准确的,因为它来自Iris数据集的拆分,对应着x_test
中每一条记录对应的花的类型。于是,我们只要把predicitons
和y_test
进行比较,就可以得出结论了:
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, predictions))
# 0.9733333333
其中,accuracy_score
的用法很简单,只要把参考值和计算值分别传递给它就好了。重新执行一下,就能得到predictions
的评分了。我们的这次学习,得分是97。
这个值有可能会有一定的浮动,因为每次随机选择的训练和验证数据集并不一定相同。
更换一种学习算法
除了决策树之外,我们还可以使用其它算法来训练Classifier,例如:Neighbors。这里,我们先不用了解它的算法细节,直接拿来用就好了。把之前使用决策树的代码改成这样:
from sklearn.neighbors import KNeighborsClassifier
cls = KNeighborsClassifier()
cls.fit(x_train, y_train)
# 0.93333333333
我们就把整个学习使用的算法,从决策树换成了KNeighborsClassifier
重新执行一下,就能看到差异了,这种算法的得分只有93左右。但我们并不能就此论断kNeighborClassifier一定就比Decision Tree差,这和我们随机选择的数据集合有很大关系。我们可以分别执行多次测试,来评估一个分类器的效果。
理解学习过程:Label = f(Features)
通过前面对比两种学习算法,不难发现,supervised learning要表达的就是根据提供的Features,计算出对应Label的过程。而不同的算法,就是标题中的函数f
。那么,这个过程究竟是如何实现的呢?简单来说,就是基于一个数学模型,依据训练数据逐渐调整出来的。我们来看一个简单的线性模型:

当我们需要一个算法来区分平面坐标中蓝色和红色的点时,我们可以随意用一个线性方程开始,例如:y = 2x + 1
。
现在,假设训练中多了一个违规的蓝色点,我们就要相应调整线性模型在y轴的截距:

然后,如果训练中又多了一个违规的红色点,我们就要继续调整线性模型的斜率和y轴的截距:

于是,随着不断接受到新的训练数据,我们就不断的对已有数学模型进行调整,直到满足训练集合中的所有样本,或者,更换更复杂的数学模型,大体就是这样一个过程。
为了更形象的了解这个过程,Google提供了一个Tensorflow playground,我们可以按照下图中的说明更形象的看到,计算机学习不同分类数据的过程。
