我想使用整体分类器对300个样本进行分类(15个正样本和285个负样本,这意味着二进制分类)。我从这些样本中提取了18个特征,它们都是数字的,并且这些特征之间存在一些相关性。我是MATLAB的新手,我尝试使用“fitensemble”,但我不知道使用哪种方法:'AdaBoostM1','LogitBoost','GentleBoost','RobustBoost','Bag'或'Subspace'。由于功能的数量是18,我不知道天气增强算法可以帮助我。另一方面,我对学习者的数量有疑问。有多少学习者适合这个问题,我可以得到最佳分类。我很感谢你的帮助。
答案 0 :(得分:0)
在我的头顶上,我会说一个合奏分类器是一种矫枉过正,因为你只有15个正样本和18个特征。对于这么小的数据集,我将从k-最近邻分类器开始。如果效果不佳,请尝试使用支持向量机。
答案 1 :(得分:0)
我在许多问题中使用集合技术。 该数据库存在数据不平衡问题。 如果数据不平衡且样本数量很少......使用机器学习会很棘手。 Svm对数据不平衡问题非常敏感。如果您使用单个svm,则需要更改不同类别中缺少样本的成本。
如果使用matlab函数,则无法完全控制。你的问题也应该是多功能的。
从使用套袋技术开始:基础学习者可以是svm,对主要课程进行下采样。使用来自次要班级的所有样本和来自主要班级的15个样本。每次训练基础学习者时,可以随机抽取大班的样本。
使用的基础学习者数量可以是:大班的样本数/小班的样本数。
测试:使用所有基础学习者测试样本并找到平均值。
如果准确度不高。这意味着分类问题很难。最好使用adaboost。 有一篇关于使用adaboost的好文章:
viola jones adaboost
这个adaboost非常好。将处理数据不平衡和功能选择
答案 2 :(得分:0)
我认为如果可能的话,你应该尝试至少得到100个观察每个类的东西。它还将使超参数优化更加稳健。这将有助于找到合适的学习者数量,以及哪种方法最好。但是根据我有限的经验,你使用这些不同的合奏方法并没有太大的不同。如果你没有更多的数据,你可以循环多少学习者是合适的(10:5:300),并采用分类准确度的平均值超过100次重复的大多数类的随机抽样。
< p>下面是一些示例代码,您可以构建一个循环(在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