一旦拥有了多个弱分类器以及其对应的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.]])
这两个点的分类结果也会随着迭代的进行而越来越强。在下一节中,我们会将该分类器应用到一个规模更大、难度也更大的真实数据集中。