进一步理解Classifier的训练过程

2020-03-12  本文已影响0人  醉看红尘这场梦

这一节,我们换个角度来理解之前已经学过的supervised learning。一方面,巩固对这种机器学习过程的了解;另一方面,也更深入一点对机器学习过程的认识,其实它远没有我们想象的神奇。

评估不同学习算法的质量

为了评估不同的Classifier在supervised learning中的效果,我们需要以下几个步骤:

  1. 准备训练和测试数据;
  2. 设置Classifier使用的学习算法,并进行训练;
  3. 使用测试数据验证学习效果;

准备训练和测试数据

因此,要先准备好哪些数据用于训练,哪些数据用于测试。简单起见,我们还是使用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)

我们把xy分别分成了对等的两份,其中,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中每一条记录对应的花的类型。于是,我们只要把predicitonsy_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。那么,这个过程究竟是如何实现的呢?简单来说,就是基于一个数学模型,依据训练数据逐渐调整出来的。我们来看一个简单的线性模型:

dt1

当我们需要一个算法来区分平面坐标中蓝色和红色的点时,我们可以随意用一个线性方程开始,例如:y = 2x + 1

现在,假设训练中多了一个违规的蓝色点,我们就要相应调整线性模型在y轴的截距:

dt1

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

dt1

于是,随着不断接受到新的训练数据,我们就不断的对已有数学模型进行调整,直到满足训练集合中的所有样本,或者,更换更复杂的数学模型,大体就是这样一个过程。

为了更形象的了解这个过程,Google提供了一个Tensorflow playground,我们可以按照下图中的说明更形象的看到,计算机学习不同分类数据的过程。

dt1
上一篇 下一篇

猜你喜欢

热点阅读