Signal prediction based on boosting and decision stump

694 阅读5分钟

1. 基本介绍:

改论文题目的中文意思:基于boosting和decision stump(决策树桩)的信号预测。
论文下载

Shi L, Duan Q, Dong P, et al. Signal prediction based on boosting and decision stump[J]. International Journal of Computational Science and Engineering, 2018, 16(2): 117-122.

image.png 该期刊虽然没有被SCI/SCIE收录,CiteScore也比较低,但是本身对于Adaboost算法、decision stump的介绍是十分完整的,也有相对应的实验进行验证,属于基础知识学习的较好期刊。\

本人拿出这篇文章的目的是了解这篇文章的大致思想,复现其所提出的boosting and decision stump的算法,然后利用它文中的数据集进行验证,但是验证的算法仅仅是decision stump和boosting and decision stump这两种,其他的对比算法就没有验证了。

2. 论文的中心思想

decision stump也称一层决策树,主要根据实例的某个特征来对实例进行分类。boosting方法是一种功能强大的集成方法,通过集成多个decision stump(弱分类器),能显著提高实例的预测性能。该期刊结合boosting算法和decision stump算法,对信号数据进行了分析和预测。 关于decision stump的介绍:decision stump的原理和代码实现。数据集采用了UCI数据集存储库中的信号数据集,即sonar数据集,数据集下载通道
image.png

3. Boosting and decision stump-based algorithm 详解

算法流程图和示意图:

image.png

image.png
在这里需要关注的几个点:

  • (a),(b)两个过程主要就是如何在实例数据集中选出一个最佳的决策树桩的问题,使得选出的决策树桩预测出来的错误率最小。
  • (d)过程就是更新权重的问题,目的就是使得预测错误的个体前的权重加大,但是对应决策树桩(弱分类器)前的权重减小。这里涉及到指数损失函数。
  • 第5步就是将T个弱分类器集成成一个强分类器,以此提高预测准确率。 指数损失函数:
L(y,f(x))=exp[yf(x)]L(y, f(x))=\exp [-y f(x)]

根据上述函数表达式可知:当y与f(x)不相同的时候,比如1与-1,那L就很大;反之,那L就很小。

但是该算法存在质疑的点在于,d过程中的-α\alpha适不适合做为系数放到指数损失函数里面?因为ϵ\epsilon增大,α\alpha是减小的,那么预测错误越大的个体前的权重反而减小了。是不是取1/α\alpha。我接下来复现会做实验分析。

4. Boosting and decision stump-based algorithm 复现

image.png

4.1 decision stump复现

改算法的复现以及代码:通道

% 根据决策树桩的阈值来分类(1,-1)
function predi_labels = decision(data, i_col, thresh_val, thresh_ineq)
% data:num_row*num_col,i_col:表示第i列,thresh_val:表示决策树桩的阈值,thresh_ineq:采用大于或者小于来比较阈值
% predi_labels:根据决策树桩的阈值来获得分类后的labels,num_row*1
num_row = size(data, 1);
% 初始化predi_labels为全1
predi_labels = ones(num_row, 1);
if thresh_ineq == 1
    % 1表示小于阈值,如果小于阈值,则判定为-1
    predi_labels(data(:, i_col) <= thresh_val) = -1;
elseif thresh_ineq == 2
    % 如果大于阈值,则判定为-1
    predi_labels(data(:, i_col) > thresh_val) = -1;
end
end
function [classifier, min_error, best_labels] = decision_stump(data, weight, label)
% decision_stump 确定最优决策树桩并返回分类函数
% data:num_row*num_col; weights:num_row*1(初始值均为1/num_row); labels:num_row*1(初始值为1或-1)
% classifier有dim(哪一维特征识别率最高),thresh_val(阈值何值时候该维征识别率最高),thresh_ineq(是大于阈值识别高还是小于阈值识别高)
num_row = size(data, 1);
num_col = size(data, 2);
% 优化迭代次数
max_iter = 100;
% 初始化相关参数
min_error = Inf;
best_labels = ones(num_row , 1);
classifier.dim = 0;
classifier.thresh_val = 0;
classifier.thresh_ineq = 0;
for i = 1:num_col
    cur_thresh_val = min(data(:, i));
    step_size = (max(data(:, i)) - min(data(:, i))) / max_iter;
    for j = 1:max_iter
        for k = 1:2
            thresh_val = cur_thresh_val + (j - 1) * step_size;
            predi_labels = decision(data, i, thresh_val, k);
            err = sum(weight .* (predi_labels ~= label));
            fprintf("iter %d dim %d, threshVal %.2f, thresh ineqal: %d, the weighted error is %.3f\n", j, i, thresh_val, k, err);
            if err < min_error
                %更新相关参数
                min_error = err;
                best_labels = predi_labels;
                classifier.dim = i;
                classifier.thresh_val = thresh_val;
                classifier.thresh_ineq = k;
            end
        end
    end
end
end

4.2 引入Boosting

function [Boost_error, Boost_labels] = Boosting_decision_stump(data, weight, label, T)
dim = zeros(T,1);
thresh_val = zeros(T,1);
thresh_ineq = zeros(T,1);
arr_alpha = zeros(T,1);
num_row = size(data, 1);
Boost_labels = zeros(num_row, 1);
for i = 1:T
    [classifier, min_error, best_labels] = decision_stump(data, weight, label);
    % alpha>0
    alpha = 0.5 * log((1 - min_error) / min_error);
    % 更新每个样本的权重
    weight = weight .* exp(-alpha .* label .* best_labels);
    weight = weight / (sum(weight));
    % 保留分类器以及对应的权重
    dim(i) = classifier.dim;
    thresh_val(i) = classifier.thresh_val;
    thresh_ineq(i) = classifier.thresh_ineq;
    arr_alpha(i) = alpha;
end
% 利用集成分类器对实例进行预测
for i = 1:T
    predi_labels = decision(data, dim(i), thresh_val(i), thresh_ineq(i));
    Boost_labels = Boost_labels + arr_alpha(i) * predi_labels;
end
% Boost_labels中大于0就设置为1,小于0就设置为0.因为predi_labels只存在1与-1的情况
Boost_labels(Boost_labels >= 0) = 1;
Boost_labels(Boost_labels < 0) = -1;
Boost_error = sum(Boost_labels ~= label) / num_row;
end

5. 信号预测实验对算法的验证

数据集展示:
X数据集:208*60,有60维变量。

image.png Y数据集:208*1。

image.png

5.1自己复现的对比实验

clc;clear;clearvars;
% 加载数据[data, label]([X,Y])
[data, label] = loadData();
% 初始化每个数据点的相对权重,创建数值均为1/num_row的num_row*num_col数组
num_row = size(data, 1);
num_col = size(data, 2);
weight = repmat(1 / num_row, num_row, 1);
[classifier, min_error, best_labels] = decision_stump(data, weight, label);
% 输出最佳的决策树桩相关参数
fprintf("dim %d, threshVal %.2f, thresh ineqal: %s, the weighted error is %.3f\n", ...
    classifier.dim, classifier.thresh_val, classifier.thresh_ineq, min_error);
% disp(best_labels);

image.png
预测准确率是76%
接着展示Boosting and decision stump-based algorithm预测的准确率(Accuracy):

clc;clear;clearvars;
% 加载数据[data, label]([X,Y])
[data, label] = loadData();
% 初始化每个数据点的相对权重,创建数值均为1/num_row的num_row*num_col数组
num_row = size(data, 1);
num_col = size(data, 2);
weight = repmat(1 / num_row, num_row, 1);
T = 1;
[Boost_error, Boost_labels] = Boosting_decision_stump(data, weight, label, T);
fprintf("Boosting_decision_stump althgoritm T: %d, error is %.3f\n", T, Boost_error);
T = 10;
[Boost_error, Boost_labels] = Boosting_decision_stump(data, weight, label, T);
fprintf("Boosting_decision_stump althgoritm T: %d, error is %.3f\n", T, Boost_error);
T = 100;
[Boost_error, Boost_labels] = Boosting_decision_stump(data, weight, label, T);
fprintf("Boosting_decision_stump althgoritm T: %d, error is %.3f\n", T, Boost_error);

image.png
当1个弱分类器时候预测准确率是76%,与decision stump一致;10个弱分类器时候预测准确率是88%,100个弱分类器时候预测准确率是100%,

5.2期刊中的对比实验结果展示

本人只展示了Accuracy, 感觉已经可以说明问题了,就没有计算其他的衡量算法的变量。文章中用到了3个变量,下面给大家展示一下:

image.png

image.png

image.png

image.png

image.png

image.png
总体来说该文章十分简单,但是有利于你去了解Adaboost还是不错的,它虽然和Adaboost不太一样,我主要认为它采用了指数损失函数这里的方法。但是用该方法来进行分类,不仅算法执行速度快,而且识别精度也是十分高,适合一定环境下的模式识别任务。