matlab中的集合分类器

时间:2013-07-26 20:10:29

标签: matlab classification

我想使用整体分类器对300个样本进行分类(15个正样本和285个负样本,这意味着二进制分类)。我从这些样本中提取了18个特征,它们都是数字的,并且这些特征之间存在一些相关性。我是MATLAB的新手,我尝试使用“fitensemble”,但我不知道使用哪种方法:'AdaBoostM1','LogitBoost','GentleBoost','RobustBoost','Bag'或'Subspace'。由于功能的数量是18,我不知道天气增强算法可以帮助我。另一方面,我对学习者的数量有疑问。有多少学习者适合这个问题,我可以得到最佳分类。我很感谢你的帮助。

3 个答案:

答案 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