https://www.mathworks.com/help/stats/fitensemble.html#bu_rbq9-5

函数

fitensemble:用于组合分类或者回归的分类器

函数形式

  • Mdl = fitensemble(Tbl, ResponseVarName, Method, NLearn, Learners)
  • Mdl = fitensemble(Tb1, formula, Method, NLearn, Learners)
  • Mdl = fitensemble(Tbl, Y, Method, NLearn, Learners)
  • Mdl = fitensemble(X, Y, Method, NLearn, Learners)
  • Mdl = fitensemble(__, Name, Value)

    函数解释

    fitensemble可以boost或者bag决策树或者判别分类器,还可以训练随机子空间集合的KNN或判别分类器。
    对于更简单的分类和回归的分类器接口函数,可以使用 fitcensemblefitrensemble

    函数一

  • Mdl = fitensemble(Tbl, ResponseVarName, Method, NLearn, Learners)

输入参数:

  • Tb1:包含的变量
  • ResponseVarName:变量的名字,就是我们的label标签变量名
  • Method:提升方式
  • NLearn:学习周期
  • Learners:基学习器

输出参数:

  • Mdl:分类或回归的学习器的组合形式

例子:
这个例子中的carsmall数据集包含的数据:Acceleration:100x1, Cylinders:100x1, Displacement:100x1, Horsepower:100x1, Mfg:100x13char, Model:100x33char, Model_Year:100x1char, MPG:100x1, Origin:100x7,
Weight:100x1

  1. %{
  2. 使用回归树集成学习器预测汽车用油价格。变量有:汽车的缸数、缸排量、马力和重量等
  3. %}
  4. load carsmall;
  5. Tb1 = table(Cylinders, Displacement, Horsepower, Weight, MPG); %选取变量
  6. t = templateTree('Surrogate','On'); %这个回归树模型使用Surrogate提升准确率
  7. %使用LSBoost提升,回归的价格是MPG,100是学习周期,t是学习的基学习器
  8. Mdl1 = fitensemble(Tb1, 'MPG', 'LSBoost', 100, t);
  9. predMPG = predict(Mdl1, [4, 200, 150, 3000]) %根据模型预测价格
  10. %{
  11. 预测结果
  12. predMPG =
  13. 22.8462
  14. %}
  15. %--------使用Displacement以外的变量重新训练一个分类器------------
  16. formula = 'MPG ~Cylinders + Horsepower + Weight';
  17. Mdl2 = fitensemble(Tb1, formula, 'LSBoost', 100, t);
  18. predMPG2 = predict(Mdl2, [4, 150, 3000])
  19. %{
  20. 预测结果
  21. predMPG2 =
  22. 23.9478
  23. %}
  24. %-----------计算均方误差-------------------------
  25. mse1 = resubLoss(Mdl1)
  26. %{
  27. 计算结果
  28. mse1 =
  29. 6.4721
  30. %}
  31. mse2 = resubLoss(Mdl2)
  32. %{
  33. 计算结果
  34. mse2 =
  35. 7.8599
  36. %}

函数二

  • Mdl = fitensemble(Tb1, formula, Method, NLearn, Learners)

例子在上面有

函数三

  • Mdl = fitensemble(Tbl, Y, Method, NLearn, Learners)

例子同上

函数四

  • Mdl = fitensemble(X, Y, Method, NLearn, Learners)

例子
数据集:ionosphere 包含X:351x34,Y:351x1大小,是分类的例子

  1. load ionosphere;
  2. %-------------训练分类器-------------
  3. ClassTreeEns = fitensemble(X,Y,'AdaBoostM1',100,'Tree');
  4. %------------计算累计损失----------------
  5. rsLoss = resubLoss(ClassTreeEns, 'Mode', 'Cumulative');
  6. %------------画出损失图-------------------
  7. plot(rsLoss);
  8. xlabel('Number of Learning Cycles');
  9. ylabel('Resubstitution Loss');

image.png
图1. 损失函数图

函数五

  • Mdl = fitensemble(__, Name, Value)

例子

  1. %找到合适的分割数据的点和要提升的树的类型
  2. load carsmall
  3. X = [Acceleration, Displacement, Housepower, Weight];
  4. Y = MPG;
  5. %{
  6. 寻找到合适的分割点的步骤:
  7. 1.
  8. 2. 交叉验证这些提升器
  9. 3. 对于每个提升的分类器,计算MSE
  10. 4. 比较不同的提升器的MSE,选择MSE最小的一个,就是最大的一个分割点数,最好的树的数量和最好的学习率
  11. %}
  12. MdlDeep = fitrtree(X, Y, 'CrossVal', 'on', 'MergeLeaves', 'off', 'MinParentSize', 1, 'Surrogate', 'on');
  13. MdlStump = fitrtree(X, Y, 'MaxNumSplits', 1, 'CrossVal', 'on', 'Surrogate', 'on');
  14. %{
  15. 使用150个回归树训练提升器,使用5折交叉验证。学习率选取{0.1, 0.25, 0.5, 1}
  16. %}
  17. n = size(X, 1);
  18. m = floor(log2(n - 1));
  19. lr = [0.1, 0.25, 0.5, 1];
  20. maxNumSplits = 2.^(0:m);
  21. numTrees = 150;
  22. Mdl = cell(numel(maxNumSplits), numel(lr));
  23. rng(1); %For reproducibility
  24. for k = 1:numel(lr) %选取不同的学习率
  25. for j = 1:numel(maxNumSplits) %选取不同的分割点
  26. t = templateTree('MaxNumSplits', maxNumSplits(j), 'Surrogate', 'on');
  27. Mdl{j, k} = fitensemble(X,Y, 'LSBoost', numTrees, t, 'Type', 'regression', ...
  28. 'KFole', 5, 'LearnRate', lr(k));
  29. end
  30. end
  31. %--------计算每个提升器的MSE
  32. kflAll = @(x)kfoldLoss(x, 'Mode', 'cumulative'); %得到函数句柄
  33. errorCell = cellfun(kflAll, Mdl, 'Uniform', false); %对于每个单元都是用这个函数计算
  34. error = reshape(cell2mat(errorCell), [numTrees, numel(maxNumSplits), numel(lr)]);
  35. errorDeep = kfoldLoss(MdlDeep);
  36. errorStump = kfoldLoss(MdlStump);
  37. %{观察一下随着树的深度和树桩的数目的增加提升器的MSE是怎么变化的%}
  38. mnsPlot = [1, round(numel(maxNumSplits)/2, numel(maxNumSplits))];
  39. figure;
  40. for k = 1:3
  41. subplot(2, 2, k);
  42. plot(squeeze(error(:, mnsPlot(k), :)), 'LineWidth', 2);
  43. axis tight;
  44. hold on;
  45. h = gca;
  46. plot(h.XLim, [errorDeep, errorDeep], '-.b', 'LineWidth', 2);
  47. plot(h.XLim, [errorStump, errorStump], '-.r', 'LineWidth', 2);
  48. plot(h.XLim, min(min(error(:, mnsPlot(k), :))).*[1, 1], '--k');
  49. h.YLim = [10, 50];
  50. xlabel('Number of trees');
  51. ylabel('Cross-validated MSE');
  52. title(sprintf('MaxNumSplits = %0.3g', maxNumSplits(mnsPlot(k))));
  53. hold off;
  54. end
  55. hL = legend([cellstr(num2str(lr', 'Learning Rate = %0.2f')); 'Deep Tree'; 'Stump'; 'Min.MSE']);
  56. hL.Position(1) = 0.6;

§ Fitensemble实现集成学习 - 图2
图2. 损失函数图

  1. [minErr, minErrIdxLin] = min(error(:));
  2. [idxNumTrees, idxMNS, idxLR] = ind2sub(size(error), minErrIdxLin);
  3. fprintf('\nMin.MSE = %0.5f', minErr);
  4. %{
  5. Min. MSE = 18.42979
  6. %}
  7. fprintf('\nOptimal Parameter Vaules:\nNum. Trees = %d', idxNumTrees)
  8. %{
  9. Optimal Parameter Values:
  10. Num. Trees = 1
  11. %}
  12. fprintf('\nMaxNumSplits = %d\nLearning Rate = %0.2f\n', maxNumSplits(idxMNS), lr(idxLR))
  13. %{
  14. MaxNumSplits = 4
  15. Learning Rate = 1.00
  16. %}

参数

输入参数

Tbl

Tbl:采样的数据
每列代表一个不同的变量,行数为点数。

  • 如果Tbl包含要标签,然后想用除了标签的以外的数据来预测的话,使用 ResponseVarName(标签的变量名)
  • 如果Tbl包含标签,并且标签以外的数据并不想全部使用的话,使用 formula
  • 如果Tbl不包含标签数据,我们就把标签数据这1个向量用Y表示

上述的意思简单来说就是我们的标签变量有没有在Tbl

Method

二分类的提升方式:

  • AdaBoostM1
  • LogitBoost
  • GentleBoost
  • RobustBoost
  • LPBoost
  • TotalBoost
  • RUSBoost
  • Subspace
  • Bag

三分类及以上的提升方式:

  • AdaBoostM2
  • LPBoost
  • TotalBoost
  • RUSBoost
  • Subspace
  • Bag

回归

  • LSBoost
  • Bag

    Learners

    | Weak Learner | Weak-Learner Name | Template Object Creation Function | Method Setting | | —- | —- | —- | —- | | Discriminant analysis | ‘Discriminant’ | templateDiscriminant | 推荐’Subspace’ | | k nearest neighbors | ‘KNN’ | templateKNN | 只有’Subspace’ | | Decision tree | ‘Tree’ | templateTree | 除了’Subspace’ |