一、装袋
对样本空间 D 进行 放回抽样,得到样本空间的一个子集 Di,由Di得到一个 分类器Mi。
不断的重复上述过程,就可以得到一系列分类器 M1,M2,M3....Mi ,在分类时用这些分类器进行投票来决定分类。
在R语言中装袋的函数存在于ipred (Improved Predictors)package中。
二、提升和AdaBoost
对长度为d(样本数为d)的训练样本空间 D 的每一个元组(每个样本)分配一个初始的权限 1/d, 然后开始一个迭代的过程:
根据元组的权限来作为抽取概率进行放回抽样,抽样出的样本的长度也必须为 Di,根据 Di 生成一个分类器 Mi。
使用 Mi 对 D进行分类,找出分类错误的元组,把这些元组的权重累加,得到该分类器的错误率 Ei
如果Ei大于0.5,舍弃 Mi。
如果Ei小于0.5,则调整那些被正确分类的元组,将其权重 乘以 Ei/(1-Ei),由于Ei小于0.5,所以正确分类的元组实际上权重被降低了。
从上面的过程得到 i 个分类器,在使用的过程中每个分类器有一个投票的权重,其值为 log2((1-Ei)/Ei
)。
AdaBoost会给每个样本定一个权值,这是很少见的,在R中实现AdaBoost的package叫“boost”。
三、随机森林
在装袋的基础上,在样本的维度上也采用随机选择的技术(或者随机选择的维度线性组合),得到众多的分类器,仿佛一片森林。
R中有“randomForest” package实现了这个算法。
四、样本不平衡时的解决办法
当样本中不同类别的元组数量差距很大时(比如类别A的元组有100个,而类别B的元组有10000个),可以采用一下方法提高分类准确度:
过抽样:在采样的时候把稀有类别的元组多复制几份放到样本中去
欠抽样:在采样的时候把多数类别的元组随机从样本中移除
阈值移动:分类器不再返回一个具体的类别,而是返回一个[-1,1]的数字,设定一个阈值X,当返回的数字大于X时,相当于分在了A类,反之分在了B类。