300 サンプルの分類にアンサンブル分類器を使用したい (15 のポジティブ サンプルと 285 のネガティブ サンプル、つまりバイナリ分類を意味する)。これらのサンプルから 18 の特徴を抽出しました。それらはすべて数値であり、特徴間にはある程度の相関関係があります。私は MATLAB を初めて使用し、「fitensemble」を使用してみましたが、「AdaBoostM1」、「LogitBoost」、「GentleBoost」、「RobustBoost」、「Bag」または「Subspace」のどの方法を使用すればよいかわかりません。機能の数が 18 であるため、天候ブースト アルゴリズムが役立つかどうかはわかりません。一方で、学習者の数に問題があります。この問題に適した学習者は何人で、最適な分類を得ることができます。よろしくお願いします。
3 に答える
私は多くの問題でアンサンブル手法を使用しています。このデータベースにはデータの不均衡の問題があります。サンプル数が非常に少なく、データの不均衡がある場合... 機械学習を使用するのは難しいでしょう。Svm は、データの不均衡の問題に非常に敏感です。単一の svm を使用する場合は、異なるクラスから欠落しているサンプルのコストを変更する必要があります。
matlab 関数を使用する場合、完全に制御することはできません。あなたの問題も多機能でなければならないこと。
バギング手法の使用から始めます。基本学習者は、メジャー クラスのダウン サンプリングを使用して svm にすることができます。マイナー クラスのすべてのサンプルとメジャー クラスの 15 個のサンプルを使用します。基本学習器をトレーニングするたびに、メジャー クラスのサンプルをランダムにサンプリングできます。
使用する基本学習器の数は、メジャー クラスのサンプル数 / マイナー クラスのサンプル数です。
テスト用: すべての基本学習器を使用してサンプルをテストし、平均を見つけます。
精度が高くない場合。これは、分類問題が難しいことを意味します。そして、アダブーストを使用することをお勧めします。アダブーストの使用に関する良い記事があります:
ヴィオラ・ジョーンズ・アダブースト
このアダブーストはとても良いです。データの不均衡と機能の選択を処理します
私の頭の上では、15 個のポジティブ サンプルと 18 個の特徴しかないことを考えると、アンサンブル分類器はやり過ぎだと思います。この小さなデータ セットの場合、k 最近傍分類器から始めます。それでもうまくいかない場合は、サポート ベクター マシンを試してください。
可能であれば、少なくとも各クラスの 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