Main Content

分位数誤差とベイズ最適化の使用によるランダム フォレストの調整

この例では、分位数誤差を使用して回帰木のランダム フォレストのハイパーパラメーターを調整するベイズ最適化を実装する方法を示します。条件付き平均ではなく条件付き分位を予測するモデルを使用する場合、モデルの調整には平均二乗誤差よりも分位数誤差の使用が適切です。

データの読み込みと前処理

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);
rng('default'); % For reproducibility

調整パラメーターの指定

以下の調整を考えます。

  • 森の木の複雑度 (深さ)。深い木は過適合に、浅い木は適合不足になりがちです。したがって、各葉における観測値の最小数が 20 以下になるように指定します。

  • 木を成長させるときに各ノードで抽出する予測子の数。1 から全予測子の範囲で抽出するよう指定します。

ベイズ最適化を実装する関数 bayesopt には、これらの指定を optimizableVariable オブジェクトとして渡す必要があります。

maxMinLS = 20;
minLS = optimizableVariable('minLS',[1,maxMinLS],'Type','integer');
numPTS = optimizableVariable('numPTS',[1,size(X,2)-1],'Type','integer');
hyperparametersRF = [minLS; numPTS];

hyperparametersRF は 2 行 1 列の OptimizableVariable オブジェクトの配列です。

アンサンブル内の木の本数を調整することを検討する必要もあります。学習器の数が多いほどアンサンブルの精度が向上するので、bayesopt は多くの木が含まれているランダム フォレストを選択する傾向にあります。利用可能な計算リソースが検討対象であり、木の本数が少ないアンサンブルが好ましい場合、他のパラメーターとは関係なく木の本数を調整するか、学習器の数が多いモデルにペナルティを課すことを検討します。

目的関数の定義

ベイズ最適化アルゴリズムで最適化を行う目的関数を定義します。この関数は以下を行う必要があります。

  • 調整するパラメーターを入力として受け入れる。

  • TreeBagger を使用してランダム フォレストに学習をさせる。TreeBagger を呼び出すときに、調整するパラメーターを指定し、out-of-bag インデックスを返すように指定する。

  • 中央値に基づいて out-of-bag 分位数誤差を推定する。

  • out-of-bag 分位数誤差を返す。

function oobErr = oobErrRF(params,X)
%oobErrRF Trains random forest and estimates out-of-bag quantile error
%   oobErr trains a random forest of 300 regression trees using the
%   predictor data in X and the parameter specification in params, and then
%   returns the out-of-bag quantile error based on the median. X is a table
%   and params is an array of OptimizableVariable objects corresponding to
%   the minimum leaf size and number of predictors to sample at each node.
randomForest = TreeBagger(300,X,'MPG','Method','regression',...
    'OOBPrediction','on','MinLeafSize',params.minLS,...
    'NumPredictorstoSample',params.numPTS);
oobErr = oobQuantileError(randomForest);
end


ベイズ最適化の使用による目的関数の最小化

ベイズ最適化を使用して、木の複雑度および各ノードで抽出する予測子の数に関して、ペナルティを課した最小の out-of-bag 分位数誤差を達成するモデルを求めます。期待改善量プラスの関数を獲得関数として指定し、最適化情報の出力を抑制します。

results = bayesopt(@(params)oobErrRF(params,X),hyperparametersRF,...
    'AcquisitionFunctionName','expected-improvement-plus','Verbose',0);

results は、目的関数の最小値や最適化されたハイパーパラメーターの値などが格納されている BayesianOptimization オブジェクトです。

観測された目的関数の最小値と最適化されたハイパーパラメーターの値を表示します。

bestOOBErr = results.MinObjective
bestHyperparameters = results.XAtMinObjective
bestOOBErr =

    1.0890


bestHyperparameters =

  1×2 table

    minLS    numPTS
    _____    ______

      7        7   

最適化されたハイパーパラメーターの使用によるモデルの学習

データ セット全体と最適化されたハイパーパラメーターの値を使用してランダム フォレストに学習をさせます。

Mdl = TreeBagger(300,X,'MPG','Method','regression',...
    'MinLeafSize',bestHyperparameters.minLS,...
    'NumPredictorstoSample',bestHyperparameters.numPTS);

Mdl は、中央値の予測を最適化した TreeBagger オブジェクトです。Mdl と新しいデータを quantilePredict に渡すことにより、与えられた予測子データに対する燃費の中央値を予測できます。

参考

| | |

関連するトピック