【问题标题】:ensemble classifier in matlabmatlab中的集成分类器
【发布时间】:2013-07-27 05:52:31
【问题描述】:

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

【问题讨论】:

    标签: matlab classification


    【解决方案1】:

    在我的脑海中,我会说集成分类器是一种过度杀伤,因为您只有 15 个正样本和 18 个特征。对于这么小的数据集,我将从 k 最近邻分类器开始。如果这不起作用,请尝试支持向量机。

    【讨论】:

      【解决方案2】:

      我在许多问题中都使用了集成技术。 该数据库存在数据不平衡问题。 当样本数量很少的数据不平衡时……使用机器学习会很棘手。 Svm 对数据不平衡问题非常敏感。如果您使用单个 svm,则需要更改不同类别的缺失样本的成本。

      如果您使用 matlab 函数,您将无法完全控制。你的问题也应该是多特征的。

      从使用 bagging 技术开始:基学习器可以是 svm,对主要类进行下采样。使用次要类的所有样本和主要类的 15 个样本。每次训练基学习器时,都可以随机抽取主要类的样本。

      要使用的基学习器数量可以是:大类样本数/小类样本数。

      对于测试:使用所有基础学习器测试样本并找到平均值。

      如果准确率不高。这意味着分类问题很困难。最好使用adaboost。 有一篇关于使用 adaboost 的好文章:

      中提琴琼斯 adaboost

      这个 adaboost 非常好。会处理数据不平衡和特征选择

      【讨论】:

        【解决方案3】:

        如果可能的话,我认为您应该尝试对每个班级至少进行 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
        

        【讨论】:

          猜你喜欢
          • 2012-02-17
          • 2015-12-09
          • 1970-01-01
          • 2016-02-05
          • 2020-04-07
          • 2014-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多