1

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

4

3 回答 3

0

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

于 2014-04-03T21:13:15.413 回答
0

我认为如果可能的话,你应该尝试至少对每个班级进行 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
于 2017-04-25T10:36:50.153 回答
0

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

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

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

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

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

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

中提琴琼斯 adaboost

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

于 2016-03-31T15:57:40.367 回答