ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

カテゴリカル レベルの数が多い分類

この例では、カテゴリカル レベルの数が多い予測子が含まれているデータを使用して分類木のアンサンブルに学習をさせる方法を示します。

一般に、カテゴリカル予測子では、31 を超えるレベルの分類は使用できません。ただし、LogitBoost および GentleBoost の 2 つのブースティング アルゴリズムでは、カテゴリカル予測子レベルや二項反応が多いデータを分類できます。詳細は、LogitBoostGentleBoost を参照してください。

この例では、米国勢調査局の人口統計データから構成されている census1994 データセットを使用して、個人の年収が $50,000 を超えるかどうかを予測します。

census1994 ファイルを読み込みます。変数名が格納されている文字ベクトルの cell 配列を指定します。

load census1994
VarNames = adultdata.Properties.VariableNames;

adultdata テーブル内の変数には、名前に _ という文字が含まれているものがあります。_ を空白に置き換えます。

VarNames = strrep(VarNames,'_',' ');

一部のカテゴリカル変数には、多くのレベルが含まれています。各カテゴリカル予測子のレベルの数をプロットします。

cat = ~varfun(@isnumeric,adultdata(:,1:end - 1),...
    'OutputFormat','uniform'); % Logical flag for categorical variables
catVars = find(cat);           % Indices of categorical variables

countCats = @(var)numel(categories(nominal(var)));
numCat = varfun(@(var)countCats(var),adultdata(:,catVars),...
    'OutputFormat','uniform');

figure
barh(numCat);
h = gca;
h.YTickLabel = VarNames(catVars);
ylabel 'Predictor'
xlabel 'Number of categories'

無名関数 countCats は予測子をノミナル配列に変換し、予測子の一意な空でないカテゴリをカウントします。予測子 14 ('native country') には、40 を超えるカテゴリカル レベルがあります。バイナリ分類の場合、fitctree では、計算のショートカットを使用して、多くのカテゴリを含むカテゴリカル予測子の最適な分割を見つけます。3 つ以上のクラスを含む分類の場合は、経験則アルゴリズムを選択して最適な分割を見つけることができます。詳細については、カテゴリカル予測子の分割を参照してください。

classreg.regr.modelutils.predictormatrix および応答ベクトルを使用し、予測子行列を指定します。

X = classreg.regr.modelutils.predictormatrix(adultdata,'ResponseVar',...
    size(adultdata,2));
Y = nominal(adultdata.salary);

X は数値行列であり、predictormatrix はすべてのカテゴリカル変数をグループ インデックスに変換します。名前と値のペアの引数 ResponseVar によって応答変数であることがわかる最終列を、予測子行列から除外します。Y はノミナルな categorical 配列です。

LogitBoost および GentleBoost を使用して、アンサンブル分類に学習させます。

rng(1); % For reproducibility
LBEnsemble = fitcensemble(X,Y,'Method','LogitBoost', ...
    'NumLearningCycles',300,'Learners','Tree',...
    'CategoricalPredictors',cat,'PredictorNames',VarNames(1:end-1),...
    'ResponseName','income');
GBEnsemble = fitcensemble(X,Y,'Method','GentleBoost', ...
    'NumLearningCycles',300,'Learners','Tree',...
    'CategoricalPredictors',cat,'PredictorNames',VarNames(1:end-1),...
    'ResponseName','income');

両方のアンサンブルについて再代入誤差を調べます。

figure
plot(resubLoss(LBEnsemble,'Mode','cumulative'))
hold on
plot(resubLoss(GBEnsemble,'Mode','cumulative'),'r--')
hold off
xlabel('Number of trees')
ylabel('Resubstitution error')
legend('LogitBoost','GentleBoost','Location','NE')

どちらのアンサンブルも、木の本数が増えるにつれて再代入誤差が減少し続けます。

交差検証によって、2 つのアルゴリズムの汎化誤差を推定します。

CVLBEnsemble = crossval(LBEnsemble,'KFold',5);
CVGBEnsemble = crossval(GBEnsemble,'KFold',5);
figure
plot(kfoldLoss(CVLBEnsemble,'Mode','cumulative'))
hold on
plot(kfoldLoss(CVGBEnsemble,'Mode','cumulative'),'r--')
hold off
xlabel('Number of trees')
ylabel('Cross-validated error')
legend('LogitBoost','GentleBoost','Location','NE')

木の本数が 300 まで増えるにつれ、交差検証損失はある点まで減少し、その後増加します。アンサンブルで使用する木の本数を決定するガイドラインは、検証誤差の改善が止まり、増加に転じた時点で木の追加をやめるということです。これが起こるのは、LogitBoost の場合は木が約 50 本、GentleBoost の場合は約 25 本になった後です。

参考

| |

関連するトピック