在一个难数据集上应用 AdaBoost
此较难数据即逻辑回归算法中从疝气病症预测病马的数据
说明:
将 horseColicTraining2.txt
和 horseColicTest2.txt
放在当前目录下。
from numpy import *
单层决策树生成的函数
"""
单层决策树分类函数
Parameters:
dataMatrix - 数据矩阵
dimen - 第dimen列,也就是第几个特征
threshVal - 阈值
threshIneq - 标志
Returns:
retArray - 分类结果
第一个函数stumpClassify()是通过阈值比较对数据进行分类的。
所有在阈值一边的数据会分到类别1,而在另外一边的数据分到类别+1。该函数可以通过数组过
滤来实现,首先将返回数组的全部元素设置为1,然后将所有不满足不等式要求的元素设置为1。
可以基于数据集中的任一元素进行比较,同时也可以将不等号在大于、小于之间切换
"""
def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):
#初始化retArray为1
retArray = ones((shape(dataMatrix)[0],1))
if threshIneq == 'lt':
#如果小于阈值,则赋值为-1
retArray[dataMatrix[:,dimen] <= threshVal] = -1.0
else:
#如果大于阈值,则赋值为-1
retArray[dataMatrix[:,dimen] > threshVal] = -1.0
return retArray
"""
找到数据集上最佳的单层决策树
Parameters:
dataArr - 数据矩阵
classLabels - 数据标签
D - 样本权重
Returns:
bestStump - 最佳单层决策树信息
minError - 最小误差
bestClasEst - 最佳的分类结果
"""
def buildStump(dataArr,classLabels,D):
dataMatrix = mat(dataArr)
labelMat = mat(classLabels).T
m,n = shape(dataMatrix)
numSteps = 10.0; bestStump = {
}; bestClasEst = mat(zeros((m,1)))
#最小误差初始化为正无穷大
minError = inf
#遍历所有特征
for i in range(n):
#找到特征中最小的值和最大值
rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max();
#计算步长
stepSize = (rangeMax-rangeMin)/numSteps
for j in range(-1,int(numSteps)+1):
#大于和小于的情况,均遍历。lt:less than,gt:greater than
for inequal in ['lt', 'gt']: #go over less than and greater than
#计算阈值
threshVal = (rangeMin + float(j) * stepSize)
#计算分类结果
predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)
#初始化误差矩阵
errArr = mat(ones((m,1)))