Main Content

oobPermutedPredictorImportance

回帰木のランダム フォレストについての並べ替えによる out-of-bag 予測子の重要度の推定

説明

Imp = oobPermutedPredictorImportance(Mdl) は、回帰木のランダム フォレスト Mdl を使用して、並べ替えによる out-of-bag 予測子の重要度の推定を返します。MdlRegressionBaggedEnsemble モデル オブジェクトでなければなりません。Imp は 1 行 p 列の数値ベクトルで、p は学習データ内の予測子変数の個数 (size(Mdl.X,2)) です。Imp(j) は予測子 Mdl.PredictorNames(j) の重要度です。

Imp = oobPermutedPredictorImportance(Mdl,Name=Value) では、1 つ以上の名前と値の引数を使用して追加オプションを指定します。たとえば、予測子の重要度の推定に使用する木を指定したり、計算を並列に実行したりできます。

すべて折りたたむ

carsmall データ セットを読み込みます。与えられた加速、気筒数、エンジン排気量、馬力、製造業者、モデル年および重量に対して自動車の燃費の平均を予測するモデルを考えます。CylindersMfg および Model_Year はカテゴリカル変数であるとします。

load carsmall
Cylinders = categorical(Cylinders);
Mfg = categorical(cellstr(Mfg));
Model_Year = categorical(Model_Year);
X = table(Acceleration,Cylinders,Displacement,Horsepower,Mfg,...
    Model_Year,Weight,MPG);

データ セット全体を使用して、50 本の回帰木のランダム フォレストに学習をさせることができます。

Mdl = fitrensemble(X,'MPG','Method','Bag','NumLearningCycles',500);

'Method''Bag' である場合、fitrensemble は既定の木テンプレート オブジェクト templateTree() を弱学習器として使用します。この例では、再現性を得るため、木テンプレート オブジェクトを作成するときに 'Reproducible',true を指定し、このオブジェクトを弱学習器として使用します。

rng('default') % For reproducibility
t = templateTree('Reproducible',true); % For reproducibiliy of random predictor selections
Mdl = fitrensemble(X,'MPG','Method','Bag','NumLearningCycles',500,'Learners',t);

MdlRegressionBaggedEnsemble モデルです。

out-of-bag 観測値を並べ替えることにより、予測子の重要度の尺度を推定します。棒グラフを使用して推定を比較します。

imp = oobPermutedPredictorImportance(Mdl);

figure;
bar(imp);
title('Out-of-Bag Permuted Predictor Importance Estimates');
ylabel('Estimates');
xlabel('Predictors');
h = gca;
h.XTickLabel = Mdl.PredictorNames;
h.XTickLabelRotation = 45;
h.TickLabelInterpreter = 'none';

imp は、予測子の重要度の推定が含まれている 1 行 7 列のベクトルです。大きい値は、予測子が予測に与える影響が大きいことを示します。このケースでは、最も重要な予測子は Weight であり、次に重要なのは Model_Year です。

carsmall データ セットを読み込みます。与えられた加速、気筒数、エンジン排気量、馬力、製造業者、モデル年および重量に対して自動車の燃費の平均を予測するモデルを考えます。CylindersMfg および Model_Year はカテゴリカル変数であるとします。

load carsmall
Cylinders = categorical(Cylinders);
Mfg = categorical(cellstr(Mfg));
Model_Year = categorical(Model_Year);
X = table(Acceleration,Cylinders,Displacement,Horsepower,Mfg,...
    Model_Year,Weight,MPG);

カテゴリカル変数で表現されるカテゴリの個数を表示します。

numCylinders = numel(categories(Cylinders))
numCylinders = 3
numMfg = numel(categories(Mfg))
numMfg = 28
numModelYear = numel(categories(Model_Year))
numModelYear = 3

CylindersModel_Year には 3 つしかカテゴリがないので、予測子分割アルゴリズムの標準 CART ではこの 2 つの変数よりも連続予測子が分割されます。

データ セット全体を使用して、500 本の回帰木のランダム フォレストに学習をさせます。偏りの無い木を成長させるため、予測子の分割に曲率検定を使用するよう指定します。データには欠損値が含まれているので、代理分岐を使用するよう指定します。無作為な予測子の選択を再現するため、rng を使用して乱数発生器のシードを設定し、'Reproducible',true を指定します。

rng('default'); % For reproducibility
t = templateTree('PredictorSelection','curvature','Surrogate','on', ...
    'Reproducible',true); % For reproducibility of random predictor selections
Mdl = fitrensemble(X,'MPG','Method','bag','NumLearningCycles',500, ...
    'Learners',t);

out-of-bag 観測値を並べ替えることにより、予測子の重要度の尺度を推定します。並列計算を実行します。

options = statset('UseParallel',true);
imp = oobPermutedPredictorImportance(Mdl,'Options',options);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

棒グラフを使用して推定を比較します。

figure;
bar(imp);
title('Out-of-Bag Permuted Predictor Importance Estimates');
ylabel('Estimates');
xlabel('Predictors');
h = gca;
h.XTickLabel = Mdl.PredictorNames;
h.XTickLabelRotation = 45;
h.TickLabelInterpreter = 'none';

このケースでは、最も重要な予測子は Model_Year であり、次に重要なのは Cylinders です。これらの結果を予測子の重要度の推定の結果と比較します。

入力引数

すべて折りたたむ

回帰木のランダム フォレスト。fitrensemble によって作成された RegressionBaggedEnsemble モデル オブジェクトとして指定します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: oobPermutedPredictorImportance(Mdl,Learners=[1 2 3 5],UseParallel=true) は、Mdl 内の 1 番目、2 番目、3 番目、および 5 番目の学習器を使用し、計算を並列に実行するように指定します。

予測子の重要度の推定に使用する学習器のインデックス。正の整数の数値ベクトルとして指定します。値は Mdl.NumTrained 以下でなければなりません。oobPermutedPredictorImportance は、予測子の重要度を推定するときに、Mdl.Trained(learners) の学習器のみを含めます。learnersLearners の値です。

例: Learners=[1:2:Mdl.NumTrained]

並列計算オプション。statset によって返される構造体配列として指定します。Options を指定するには、Parallel Computing Toolbox™ のライセンスが必要です。

oobPermutedPredictorImportanceUseParallel フィールドのみを使用します。statset(UseParallel=true) はワーカーのプールを呼び出します。

例: Options=statset(UseParallel=true)

詳細

すべて折りたたむ

並べ替えによる out-of-bag 予測子の重要度の推定

"並べ替えによる out-of-bag 予測子の重要度の推定" では、応答の予測においてモデル内の予測子変数がどの程度影響を与えるかを測ります。この測定値が大きいほど、予測子の影響が大きくなります。

ある予測子が予測に影響を与える場合、その予測子の値を並べ替えるとモデルの誤差に影響があるはずです。ある予測子が予測に影響を与えない場合、その予測子の値を並べ替えてもモデルの誤差にはほとんどまたはまったく影響がないはずです。

並べ替えによる out-of-bag 予測子の重要度の値を推定するプロセスは、以下のようになります。T 個の学習器によるランダム フォレストが R、学習データ内の予測子の個数が p であるとします。

  1. 木 t (t = 1,...,T) について、以下を行います。

    1. out-of-bag 観測値と木 t を成長させるために分割された予測子変数のインデックス st ⊆ {1,...,p} を特定します。

    2. out-of-bag 分類誤差 εt を推定します。

    3. 予測子変数 xj (j ∊ st) のそれぞれについて、以下を行います。

      1. xj の観測値を無作為に並べ替えます。

      2. 並べ替えられた xj の値が含まれている out-of-bag 観測値を使用して、モデルの誤差 εtj を推定します。

      3. 差 dtj = εtj - εt を計算します。木 t を成長させるときに分割されなかった予測子変数は、差が 0 になります。

  2. 学習データ内の各予測子変数について、学習器 j = 1,...,p における差の平均 d¯j と標準偏差 σj を計算します。

  3. xj の並べ替えによる out-of-bag 予測子の重要度は、d¯j/σj です。

ヒント

fitrensemble の使用によりランダム フォレストを成長させる場合、

  • 標準 CART アルゴリズムには、相違する値が少ない分割予測子 (カテゴリカル変数など) よりも、相違する値が多い分割予測子 (連続変数など) を選択する傾向があります[3]。予測子データ セットが異種混合である場合や、一部の予測子が相違する値を他の変数よりも相対的に少なく含んでいる場合は、曲率検定または交互作用検定の指定を検討してください。

  • 標準 CART を使用して成長させた木は、予測子変数の交互作用の影響を受けません。また、多くの無関係な予測子が存在する状況では、このような木によって重要な変数が特定される可能性は、交互作用検定を適用した場合より低くなります。このため、予測子の交互作用を考慮し、重要度変数の特定を多くの無関係な変数が存在する状況で行うには、交互作用検定を指定します[2]

  • 多数の予測子が学習データに含まれている場合に予測子の重要度を分析するには、アンサンブルの木学習器について関数 templateTreeNumVariablesToSample として "all" を指定します。このようにしないと、重要度が過小評価されて一部の予測子が選択されない可能性があります。

詳細については、templateTree および分割予測子選択手法の選択を参照してください。

参照

[1] Breiman, L., J. Friedman, R. Olshen, and C. Stone. Classification and Regression Trees. Boca Raton, FL: CRC Press, 1984.

[2] Loh, W.Y. “Regression Trees with Unbiased Variable Selection and Interaction Detection.” Statistica Sinica, Vol. 12, 2002, pp. 361–386.

[3] Loh, W.Y. and Y.S. Shih. “Split Selection Methods for Classification Trees.” Statistica Sinica, Vol. 7, 1997, pp. 815–840.

拡張機能

バージョン履歴

R2016b で導入