如果可能的话,我认为您应该尝试对每个班级至少进行 100 次观察。它也会使超参数优化更加健壮。这将有助于确定有多少学习者是合适的,以及哪种方法是最好的。但是根据我有限的经验,您使用这些不同的集成方法中的哪一种并没有太大的不同。如果您没有更多数据,您可以循环计算适合的学习者数量 (10:5:300),并在多数类的 100 次随机欠采样重复中取分类准确度的平均值。
这里是一些示例代码,您可以围绕它们构建循环(在 R2016b 或更高版本中使用 fitcensemble)。
switch classifierParameters.method{1}
case 'Bag'
t = templateTree( 'MinLeafSize', classifierParameters.minLeafSize, ...
'MaxNumSplits', classifierParameters.maxNumSplits, ...
'SplitCriterion', classifierParameters.splitCriterion{1}, ...
'NumVariablesToSample', classifierParameters.numVariablesToSample);
classificationEnsemble = fitcensemble(...
predictors, ...
response, ...
'Learners', t, ...
'Method', classifierParameters.method{1}, ...
'NumLearningCycles', classifierParameters.numLearningCycles, ...
'KFold',7);
case {'AdaBoostM1','GentleBoost','LogitBoost'}
t = templateTree( 'MaxNumSplits', classifierParameters.maxNumSplits,...
'MinLeafSize', classifierParameters.minLeafSize);
% Always 'SplitCriterion', 'mse' for Boosting
classificationEnsemble = fitcensemble(...
predictors, ...
response, ...
'Learners', t, ...
'Method', classifierParameters.method{1}, ...
'NumLearningCycles',classifierParameters.numLearningCycles,...
'KFold',7,...
'LearnRate',classifierParameters.learnRate);
case 'OptimizeHyperparameters'
strct = struct( 'KFold', 10, 'Verbose',1, 'MaxObjectiveEvaluations',1000, 'SaveIntermediateResults', true, ...
'Repartition',false);
classificationEnsemble = fitcensemble(...
predictors, ...
response, ...
'OptimizeHyperparameters', 'all',... {'Method', 'LearnRate', 'MinLeafSize','MaxNumSplits','SplitCriterion', 'NumVariablesToSample'},...
'HyperparameterOptimizationOptions', strct);
otherwise
error('Classification method not recognized')
end