python实现AdaBoost算法的示例
代码
'''
数据集:Mnist
训练集数量:60000(实际使用:10000)
测试集数量:10000(实际使用:1000)
层数:40
------------------------------
运行结果:
正确率:97%
运行时长:65m
'''
importtime
importnumpyasnp
defloadData(fileName):
'''
加载文件
:paramfileName:要加载的文件路径
:return:数据集和标签集
'''
#存放数据及标记
dataArr=[]
labelArr=[]
#读取文件
fr=open(fileName)
#遍历文件中的每一行
forlineinfr.readlines():
#获取当前行,并按“,”切割成字段放入列表中
#strip:去掉每行字符串首尾指定的字符(默认空格或换行符)
#split:按照指定的字符将字符串切割成每个字段,返回列表形式
curLine=line.strip().split(',')
#将每行中除标记外的数据放入数据集中(curLine[0]为标记信息)
#在放入的同时将原先字符串形式的数据转换为整型
#此外将数据进行了二值化处理,大于128的转换成1,小于的转换成0,方便后续计算
dataArr.append([int(int(num)>128)fornumincurLine[1:]])
#将标记信息放入标记集中
#放入的同时将标记转换为整型
#转换成二分类任务
#标签0设置为1,反之为-1
ifint(curLine[0])==0:
labelArr.append(1)
else:
labelArr.append(-1)
#返回数据集和标记
returndataArr,labelArr
defcalc_e_Gx(trainDataArr,trainLabelArr,n,div,rule,D):
'''
计算分类错误率
:paramtrainDataArr:训练数据集数字
:paramtrainLabelArr:训练标签集数组
:paramn:要操作的特征
:paramdiv:划分点
:paramrule:正反例标签
:paramD:权值分布D
:return:预测结果,分类误差率
'''
#初始化分类误差率为0
e=0
#将训练数据矩阵中特征为n的那一列单独剥出来做成数组。因为其他元素我们并不需要,
#直接对庞大的训练集进行操作的话会很慢
x=trainDataArr[:,n]
#同样将标签也转换成数组格式,x和y的转换只是单纯为了提高运行速度
#测试过相对直接操作而言性能提升很大
y=trainLabelArr
predict=[]
#依据小于和大于的标签依据实际情况会不同,在这里直接进行设置
ifrule=='LisOne':
L=1
H=-1
else:
L=-1
H=1
#遍历所有样本的特征m
foriinrange(trainDataArr.shape[0]):
ifx[i]=div:
#与上面思想一样
predict.append(H)
ify[i]!=H:
e+=D[i]
#返回预测结果和分类错误率e
#预测结果其实是为了后面做准备的,在算法8.1第四步式8.4中exp内部有个Gx,要用在那个地方
#以此来更新新的D
returnnp.array(predict),e
defcreateSigleBoostingTree(trainDataArr,trainLabelArr,D):
'''
创建单层提升树
:paramtrainDataArr:训练数据集数组
:paramtrainLabelArr:训练标签集数组
:paramD:算法8.1中的D
:return:创建的单层提升树
'''
#获得样本数目及特征数量
m,n=np.shape(trainDataArr)
#单层树的字典,用于存放当前层提升树的参数
#也可以认为该字典代表了一层提升树
sigleBoostTree={}
#初始化分类误差率,分类误差率在算法8.1步骤(2)(b)有提到
#误差率最高也只能100%,因此初始化为1
sigleBoostTree['e']=1
#对每一个特征进行遍历,寻找用于划分的最合适的特征
foriinrange(n):
#因为特征已经经过二值化,只能为0和1,因此分切分时分为-0.5,0.5,1.5三挡进行切割
fordivin[-0.5,0.5,1.5]:
#在单个特征内对正反例进行划分时,有两种情况:
#可能是小于某值的为1,大于某值得为-1,也可能小于某值得是-1,反之为1
#因此在寻找最佳提升树的同时对于两种情况也需要遍历运行
#LisOne:Lowisone:小于某值得是1
#HisOne:Highisone:大于某值得是1
forrulein['LisOne','HisOne']:
#按照第i个特征,以值div进行切割,进行当前设置得到的预测和分类错误率
Gx,e=calc_e_Gx(trainDataArr,trainLabelArr,i,div,rule,D)
#如果分类错误率e小于当前最小的e,那么将它作为最小的分类错误率保存
ife
程序运行结果
startreadtransSet
startreadtestSet
startinittrain
iter:0:40,sigleerror:0.0804,finallerror:0.0804
iter:1:40,sigleerror:0.1448,finallerror:0.0804
iter:2:40,sigleerror:0.1362,finallerror:0.0585
iter:3:40,sigleerror:0.1864,finallerror:0.0667
iter:4:40,sigleerror:0.2249,finallerror:0.0474
iter:5:40,sigleerror:0.2634,finallerror:0.0437
iter:6:40,sigleerror:0.2626,finallerror:0.0377
iter:7:40,sigleerror:0.2935,finallerror:0.0361
iter:8:40,sigleerror:0.3230,finallerror:0.0333
iter:9:40,sigleerror:0.3034,finallerror:0.0361
iter:10:40,sigleerror:0.3375,finallerror:0.0325
iter:11:40,sigleerror:0.3364,finallerror:0.0340
iter:12:40,sigleerror:0.3473,finallerror:0.0309
iter:13:40,sigleerror:0.3006,finallerror:0.0294
iter:14:40,sigleerror:0.3267,finallerror:0.0275
iter:15:40,sigleerror:0.3584,finallerror:0.0288
iter:16:40,sigleerror:0.3492,finallerror:0.0257
iter:17:40,sigleerror:0.3506,finallerror:0.0256
iter:18:40,sigleerror:0.3665,finallerror:0.0240
iter:19:40,sigleerror:0.3769,finallerror:0.0251
iter:20:40,sigleerror:0.3828,finallerror:0.0213
iter:21:40,sigleerror:0.3733,finallerror:0.0229
iter:22:40,sigleerror:0.3785,finallerror:0.0218
iter:23:40,sigleerror:0.3867,finallerror:0.0219
iter:24:40,sigleerror:0.3850,finallerror:0.0208
iter:25:40,sigleerror:0.3823,finallerror:0.0201
iter:26:40,sigleerror:0.3825,finallerror:0.0204
iter:27:40,sigleerror:0.3874,finallerror:0.0188
iter:28:40,sigleerror:0.3952,finallerror:0.0186
iter:29:40,sigleerror:0.4018,finallerror:0.0193
iter:30:40,sigleerror:0.3889,finallerror:0.0177
iter:31:40,sigleerror:0.3939,finallerror:0.0183
iter:32:40,sigleerror:0.3838,finallerror:0.0182
iter:33:40,sigleerror:0.4021,finallerror:0.0171
iter:34:40,sigleerror:0.4119,finallerror:0.0164
iter:35:40,sigleerror:0.4093,finallerror:0.0164
iter:36:40,sigleerror:0.4135,finallerror:0.0167
iter:37:40,sigleerror:0.4099,finallerror:0.0171
iter:38:40,sigleerror:0.3871,finallerror:0.0163
iter:39:40,sigleerror:0.4085,finallerror:0.0154
starttotest
theaccuracyis:97%
timespan:3777.730945825577
以上就是python实现AdaBoost算法的示例的详细内容,更多关于python实现AdaBoost算法的资料请关注毛票票其它相关文章!