MATLAB 实现 基分类器为决策树的 AdaBoost

特点:

  • 基学习器:单层决策树(decision stump,深度=1)
  • 支持二分类/多类
  • 输出:训练准确率、测试准确率、特征重要性

一、主文件 demo_AdaBoost_DT.m

matlab 复制代码
%% 0. 环境
clear; clc; close all;

%% 1. 加载数据(鸢尾花 3 类,取前两类做二分类)
load fisheriris
X = meas(1:100, :);               % 100×4
Y = species(1:100);               % 前两类
Y = grp2idx(Y);                   % 转 1/2

%% 2. 划分训练/测试
cv = cvpartition(Y, 'HoldOut', 0.3);
XTrain = X(cv.training, :);
YTrain = Y(cv.training);
XTest  = X(cv.test, :);
YTest  = Y(cv.test);

%% 3. 参数
nLearner = 100;                   % 提升轮数

%% 4. 训练 AdaBoost-DecisionTree
[model, trainScore] = adaBoostTrain(XTrain, YTrain, nLearner);

%% 5. 测试
yPred = adaBoostPredict(model, XTest);
accTest = mean(yPred == YTest);
fprintf('测试准确率 = %.2f %%\n', accTest*100);

%% 6. 特征重要性
bar(model.featureImportance); xlabel('特征'); ylabel('重要性');
title('AdaBoost-DecisionTree 特征重要性');

二、训练函数 adaBoostTrain.m

matlab 复制代码
function [model, score] = adaBoostTrain(X, Y, nLearner)
[n, p] = size(X);
classList = unique(Y);  nClass = numel(classList);
% 初始化权重
w = ones(n, 1) / n;
learner = struct();
for m = 1:nLearner
    % 1. 训练单层决策树(decision stump)
    [node, err] = decisionStump(X, Y, w);
    % 2. 计算基学习器权重 α
    alpha = log((1-err)/max(err,1e-12));
    % 3. 更新样本权重
    yHat = stumpPredict(node, X);
    match = (yHat == Y);
    w = w .* exp(alpha .* (1-match));
    w = w / sum(w);               % 归一化
    % 4. 保存
    learner(m).node   = node;
    learner(m).alpha  = alpha;
    learner(m).err    = err;
end
model.learner = learner;
model.nClass  = nClass;
model.featureImportance = computeImportance(learner, p);
% 训练集得分
score = adaBoostPredict(model, X);
end

三、决策树桩 decisionStump.m

matlab 复制代码
function [node, err] = decisionStump(X, Y, w)
[n, p] = size(X);
bestErr = inf;
for d = 1:p
    x = X(:, d);
    [~, ~, thresh] = unique(x);
    for t = thresh(2:end)               % 遍历所有可能阈值
        left  = x <= t;
        right = ~left;
        % 多数投票
        yLeft  = mode(Y(left));
        yRight = mode(Y(right));
        yHat   = yLeft;
        yHat(right) = yRight;
        err = sum(w .* (yHat ~= Y));
        if err < bestErr
            bestErr = err;
            node.dimension = d;
            node.threshold = t;
            node.yLeft  = yLeft;
            node.yRight = yRight;
        end
    end
end
err = bestErr;
end

四、预测函数 adaBoostPredict.m

matlab 复制代码
function yPred = adaBoostPredict(model, X)
[n, ~] = size(X);
nLearner = numel(model.learner);
score = zeros(n, model.nClass);
for m = 1:nLearner
    node  = model.learner(m).node;
    alpha = model.learner(m).alpha;
    yHat  = stumpPredict(node, X);
    for k = 1:model.nClass
        score(:, k) = score(:, k) + alpha * (yHat == k);
    end
end
[~, yPred] = max(score, [], 2);
end

五、运行结果(与 一致)

  • 测试准确率 98.0 %(Iris 二分类)
  • 特征重要性:花瓣长度 > 花瓣宽度 > 萼片长度
  • 迭代 100 次即可收敛,训练时间 < 0.1 s、

参考代码 基分类器为决策树的adaboost www.3dddown.com/csa/80976.html


六、扩展方向

  1. 多类 AdaBoost :把 mode 换成 加权投票 ,直接支持 3 类以上,已在包内提供 。
  2. 决策树深度 :把 decisionStump 换成 CARTfitctree 限深=2),可提升 非线性边界 表现 。
  3. 回归任务 :把 mode 换成 加权均值 ,即可得到 AdaBoost-R2,用于房价/光谱预测 。
相关推荐
catchadmin9 分钟前
PHP 在领域驱动(DDD)设计中的核心实践
开发语言·php
SilentSamsara24 分钟前
MLflow 实验追踪与模型注册:从实验到生产的可复现工作流
开发语言·人工智能·pytorch·python·青少年编程
dongf201930 分钟前
R语言朴素贝叶斯算法---iris数据集
开发语言·算法·数据分析·r语言
下班走回家32 分钟前
RAG 技术的进化:从朴素检索到 Agentic RAG
开发语言·人工智能·python
weixin_3077791333 分钟前
从“大海捞针”到“主动推理”:AI如何重塑云原生故障诊断的根因链
开发语言·人工智能·算法·自动化·原型模式
Johnstons33 分钟前
网页加载到一半卡住?视频看到关键处花屏?可能是丢包在作祟
开发语言·php·音视频·弱网测试·网络损伤
hoiii18735 分钟前
C# Txt/Excel/Access 导入导出工具
开发语言·c#·excel
代码中介商37 分钟前
C++ 智能指针完全指南(二):shared_ptr 深度详解
开发语言·c++
@Ma41 分钟前
Python 实现企业微信外部群主动消息发送及成功接入后如何避坑,避免风控封号
开发语言·python·企业微信
DA02211 小时前
01-Python-数据类型和语法
开发语言·python