分位数誤差とベイズ最適化の使用によるランダム フォレストの調整
この例では、分位数誤差を使用して回帰木のランダム フォレストのハイパーパラメーターを調整するベイズ最適化を実装する方法を示します。条件付き平均ではなく条件付き分位を予測するモデルを使用する場合、モデルの調整には平均二乗誤差よりも分位数誤差の使用が適切です。
データの読み込みと前処理
carsmall
データ セットを読み込みます。与えられた加速、気筒数、エンジン排気量、馬力、製造業者、モデル年および重量に対して自動車の燃費の中央値を予測するモデルを考えます。Cylinders
、Mfg
および 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
に渡すことにより、与えられた予測子データに対する燃費の中央値を予測できます。
参考
oobQuantileError
| TreeBagger
| bayesopt
| optimizableVariable