首页 » 机器学习实战 » 机器学习实战全文在线阅读

《机器学习实战》7.5 测试算法:基于AdaBoost的分类

关灯直达底部

一旦拥有了多个弱分类器以及其对应的alpha值,进行测试就变得相当容易了。在程序清单7-2的adaBoostTrainDS中,我们实际已经写完了大部分的代码。现在,需要做的就只是将弱分类器的训练过程从程序中抽出来,然后应用到某个具体的实例上去。每个弱分类器的结果以其对应的alpha值作为权重。所有这些弱分类器的结果加权求和就得到了最后的结果。在程序清单7-3中列出了实现这一过程的所有代码。然后,将下列代码添加到adaboost.py中,就可以利用它基于adaboostTrainDS中的弱分类器对数据进行分类。

程序清单7-3 AdaBoost分类函数

def adaClassify(datToClass,classifierArr):    dataMatrix = mat(datToClass)    m = shape(dataMatrix)[0]    aggClassEst = mat(zeros((m,1)))    for i in range(len(classifierArr)):        classEst = stumpClassify(dataMatrix,classifierArr[i]['dim'],classifierArr[i]['thresh'],classifierArr[i]['ineq'])        aggClassEst += classifierArr[i]['alpha']*classEst        print aggClassEst    return sign(aggClassEst)   

读者也许可以猜到,上述的adaClassify函数就是利用训练出的多个弱分类器进行分类的函数。该函数的输入是由一个或者多个待分类样例datToClass以及多个弱分类器组成的数组classifierArr。函数adaClassify首先将datToClass转换成了一个NumPy矩阵,并且得到datToClass中的待分类样例的个数m。然后构建一个0列向量aggClassEst,这个列向量与adaBoostTrainDS中的含义一样。

接下来,遍历classifierArr中的所有弱分类器,并基于stumpClassify对每个分类器得到一个类别的估计值。在前面构建单层决策树时,我们已经见过了stumpClassify函数,在那里,我们在所有可能的树桩值上进行迭代来得到具有最小加权错误率的单层决策树。而这里我们只是简单地应用了单层决策树。输出的类别估计值乘上该单层决策树的alpha权重然后累加到aggClassEst上,就完成了这一过程。上述程序中加入了一条print语句,以便我们了解aggClassEst每次迭代后的变化结果。最后,程序返回aggClassEst的符号,即如果aggClassEst大于0则返回+1,而如果小于0则返回-1。

我们再看看实际中的运行效果。加入程序清单7-3中的代码之后,在Python提示符下输入:

>>> reload(adaboost)<module 'adaboost' from 'adaboost.py'>   

如果没有弱分类器数组,可以输入如下命令:

>>> datArr,labelArr=adaboost.loadSimpData>>> classifierArr = adaboost.adaBoostTrainDS(datArr,labelArr,30)   

于是,可以输入如下命令进行分类:

>>> adaboost.adaClassify([0, 0],classifierArr)[[-0.69314718]][[-1.66610226]][[-2.56198199]]matrix([[-1.]])     

可以发现,随着迭代的进行,数据点[0,0]的分类结果越来越强。当然,我们也可以在其他点上进行分类:

>>> adaboost.adaClassify([[5, 5],[0,0]],classifierArr)[[ 0.69314718]             .             .[-2.56198199]]matrix([[ 1.],        [-1.]])    

这两个点的分类结果也会随着迭代的进行而越来越强。在下一节中,我们会将该分类器应用到一个规模更大、难度也更大的真实数据集中。