集成学习(1)--Matlab/Python

来源:互联网 发布:软件编写专业 编辑:程序博客网 时间:2024/06/04 23:27
  1. 集成学习理论
  2. Matlab代码分析
  3. Python代码分析

=================================================
集成学习(ensemble learning)也通过构建并结合多个学习器来完成学习任务,也可以称为多分类器系统。
集成学习一般结构:
这里写图片描述

一般结构: 先产生一组“个体学习器”再用某种策略将他们结合起来。个体学习器可以从现有的算法中得到(BP,决策树等)。如果个体学习器都是一种类型的,这样的集成为:“同质”,称为:基学习算法,其中的学习器称为:基学习器。如果个体学习器是不同类型的,即为“异质”,其中的学习器称为:组件学习器。
一般地,集成学习对于弱分类器效果明显(弱分类器指泛化性能略优于随即猜测的学习器)
那么就产生一个问题: 多个学习器结合起来,如何获得比单一学习器好的效果呢?
经验上: 要获得好的集成,个体学习器应该好而不同,也就是说,个体学习器之间要具有一定的准确性(学习器不能太坏)和多样性(学习器之间要具有差异性)。
在实际的任务中,分类器是为解决同一个问题训练出来的,个体学习器准确性多样性本身就存在冲突。如何产生并结合‘好而不同’的个体学习器就成为集成学习研究的核心,
目前集成学习方法大致可以分为两大类:
1 个体学习去之间存在强依赖关系、必须串行生成的序列化方法(Boosting)
2 个体学习器之间不存在强依赖关系、可同时生成的并行化方法(Bagging 和随机森林)

===========================================
Boosting
英语上:Boosting是增强、强化的意思。 机器学习中,Boosting是指一簇可讲学习器提升为强学习器的算法。基本工作机制:
先使用一个原始的学习算法从初始训练集中训练出一个基学习器,再根据基学习器的表现对训练样本进行调整,对不能正确分类的样本加大权重,使得先前基学习器做错的样本在后续得到更大的关注,然后基于调整后的样本分布来训练下一个基学习器,如此反复的进行,直到基学习器数目达到预先指定的值T,最终这T个基学习器进行加权结合。
这里写图片描述

Boosting算法中最著名的代表就是AdaBoost (Adaptive Boosting 自适应增强)

这里写图片描述
其中 : Zt=sum(Dt(x)) 为归一化参数

matlab demo

clc; clear;n = 50; % 训练数据个数x = randn(n,2);  % 随机生成n行2列 标准正态分布y = 2 * (x(:,1)>x(:,2)) - 1; % 生成x对应y值 x(:,1)>x(:,2) 返回1 最终y=1 ,其余为0T = 5000;  % 分类器预先指定值 Y = zeros(50,50); % 最终要输出的强分类器  fyy = zeros(size(y));   % 预测出来的标签值w = ones(n,1)/n;   % 初始权重为 1/nX0 = linspace(-3,3,50);  % 生成-3 到 3 之间50个数据,相邻数据跨度相同,返回行向量·[X(:,:,1) X(:,:,2)] = meshgrid(X0);  % meshgrid函数 注(a)for i = 1:T        % 以下用剪枝分类器作为初始分类器   注(b)    wy = w .* y; %          % 以下代码为剪枝分类器    d = ceil(2*rand); % ceil(x)大于x的最小整数 随机生成 1 或者 2    [xs,xi] = sort(x(:,d)); % 任意选定一维  从小到大排列    e1 = cumsum(wy(xi)); % 返回和wy维数一至的,各行(列)的累加 注(c)    eu = cumsum(wy(xi(end:-1:1)));  %  据选取的维度的数值进行分类    e = eu(end-1:-1:1)-e1(1:end-1);  %      [em,ei] = max(abs(e));      c = mean(xs(ei:ei+1));     s = sign(e(ei));    yh = sign(s*(x(:,d)-c));  % 弱分类器    %%%%%    R = w' * (1-yh.*y)/2; % 对分类错误的样本所对应权重进行累加得到加权误分类率(0/1损失的权重之和) 这里我们是基于权重向量而不是其他的错误计算指标来评价分类器的    t = log((1-R)/R)/2; % 各分类器权重     yy = yy+yh*t;  % 更新强分类器    w = exp(-yy.*y); % 样本对应的权重    w = w / sum(w); %  更新样本权重    Y = Y + sign(s*(X(:,:,d)-c))*t;  % 最终的集成分类器endfigure(1);clf;hold on; axis([-3 3 -3 3]);colormap([1 0.7 1; 0.7 1 1]);contourf(X0,X0,sign(Y));plot(x(y==1,1),x(y==1,2),'bo');plot(x(y==-1,1),x(y==-1,2),'rx')


(a)meshgrid 函数用来生成网格矩阵,可以是二维网格矩阵,也可以是三维。
对于生成二维网格,用法为:[x y]=meshgrid(a b); % a 和b是一维数组,如a=[1 2 3]; b= [2 3 4 ]; 则生成的 x 和 y 都是二维的矩阵,x 的每行都是 1 2 3,共三行,y 每列都是2 3 4,共三列。
(b)剪枝分类器 : 对于d次维的输入变量x=(x1,.....,xd)T任意选定其中的一维,通过将其值与给定的阈值相比较来进行分类的线性分类器。(以输入空间内的坐标轴与超平面进行正交的方式对模式进行分类)
具体而言:对于n个训练样本,首先根据选取的维度的数值进行分类,然后对于i=1,…, n-1,计算顺序为ii+1 的训练样本在分类时的误差,使分类误差为最小的来决定分类边界。也就是说,剪枝分类器的候补解最多只有n-1个,所以通过对可能的解进行分类误差的计算并确定最小值,由此就可以求出最终的解。
(c) A=[1;2;3;4;5]; cumsum(A); 输出 : [1;3;6;10;15]
(d) 下图为T=1 和T=5000的结果:
这里写图片描述
这里写图片描述

T=0 就相当于 原始的剪枝分类器。
T = 5000 为集成分类器

遗留问题:
在Matlab中的剪枝分类器 代码到底如何和理论相对应?

AdaBoost 的权重具体的证明 请参照 :机器学习-周志华

下一节来介绍Python 相关代码和解释

0 0
原创粉丝点击