2013-07-26 61 views
1

我想使用集成分類器分類300個樣本(15個正樣本和285個負樣本,這意味着二元分類)。我從這些樣本中提取了18個特徵,它們都是數值的,並且這些特徵之間有一些相關性。我是MATLAB新手,嘗試使用「fitensemble」,但我不知道使用哪種方法:'AdaBoostM1','LogitBoost','GentleBoost','RobustBoost','Bag'或'Subspace'。由於功能的數量是18,我不知道天氣促進算法可以幫助我或沒有。另一方面,我對學習者的數量有問題。有多少學習者適合這個問題,我可以得到最佳的分類。我希望你的幫助。matlab集成分類器

回答

0

關閉我的頭頂我會說,集合分類器是一個矯枉過正,因爲你只有15個正面樣本,只有18個功能。對於這樣一個小的數據集,我會從一個k最近鄰分類器開始。如果這樣做效果不好,請嘗試支持向量機。

0

我在許多問題中使用集合技術。 此數據庫有數據不平衡問題。 如果數據不平衡的樣本數很少......使用機器學習將會非常棘手。 Svm對數據不平衡問題非常敏感。如果您使用單個svm,則需要更改不同類別中缺失樣本的成本。

如果你使用matlab函數,你將不能完全控制。你的問題應該也是多功能的。

從使用套袋技術開始:基礎學習者可以是svm,並且可以對主要類進行下采樣。使用小班的所有樣本和主要班級的15個樣本。每次培訓基礎學員時,可以隨機抽取主要班級的樣本。

要使用的基礎學習者的數量可以是:主要類中的樣本數量/次要類別中的樣本數量。

進行測試:使用所有基礎學習者測試樣本並找出平均值。

如果精度不高。這意味着分類問題很困難。最好使用adaboost。 有關於使用AdaBoost的好文章:

中提琴瓊斯的adaboost

這adaboost的非常好。將照顧數據不平衡和功能選擇

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