R でバギングを実行する方法 (ステップバイステップ)
特定のデータセットのデシジョン ツリーを作成するときは、単一のトレーニング データセットのみを使用してモデルを構築します。
ただし、単一の決定木を使用する場合の欠点は、 分散が大きくなる傾向があることです。つまり、データセットを 2 つの半分に分割し、両方の半分にデシジョン ツリーを適用すると、結果は大きく異なる可能性があります。
単一の決定木の分散を減らすために使用できる方法の 1 つはバギングとして知られており、ブートストラップ集計とも呼ばれます。
バギングは次のように機能します。
1.元のデータセットからb 個のブートストラップ サンプルを取得します。
2.各ブートストラップ サンプルのデシジョン ツリーを作成します。
3.各ツリーからの予測を平均して、最終モデルを取得します。
数百、さらには数千の個別のデシジョン ツリーを構築し、すべてのツリーの平均予測を取得することにより、多くの場合、単一のデシジョン ツリーと比較してテスト エラー率がはるかに低い適合バッグ モデルが得られます。
このチュートリアルでは、R でバギングされたモデルを作成する方法の段階的な例を示します。
ステップ 1: 必要なパッケージをロードする
まず、この例に必要なパッケージをロードします。
library (dplyr) #for data wrangling library (e1071) #for calculating variable importance library (caret) #for general model fitting library (rpart) #for fitting decision trees library (ipred) #for fitting bagged decision trees
ステップ 2: 袋詰めされたモデルを適合させる
この例では、153 日にわたるニューヨーク市の大気質の測定値を含む、 Air Qualityという組み込みの R データセットを使用します。
#view structure of air quality dataset
str(airquality)
'data.frame': 153 obs. of 6 variables:
$ Ozone: int 41 36 12 18 NA 28 23 19 8 NA ...
$Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
$ Wind: num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
$ Temp: int 67 72 74 62 56 66 65 59 61 69 ...
$Month: int 5 5 5 5 5 5 5 5 5 5 ...
$Day: int 1 2 3 4 5 6 7 8 9 10 ...
次のコードは、 ipredライブラリのBagging()関数を使用して R でバギングされたモデルを適合する方法を示しています。
#make this example reproducible set.seed(1) #fit the bagged model bag <- bagging( formula = Ozone ~ ., data = airquality, nbagg = 150 , coob = TRUE , control = rpart. control (minsplit = 2 , cp = 0 ) ) #display fitted bagged model bag Bagging regression trees with 150 bootstrap replications Call: bagging.data.frame(formula = Ozone ~ ., data = airquality, nbagg = 150, coob = TRUE, control = rpart.control(minsplit = 2, cp = 0)) Out-of-bag estimate of root mean squared error: 17.4973
バギングされたモデルを構築するために150 個のブートストラップされたサンプルを使用することを選択し、推定される out-of-bag エラーを取得するためにcoobがTRUEであることを指定したことに注意してください。
rpart.control()関数では次の仕様も使用しました。
- minsplit = 2:これは、ノード内の分割に必要な観測値が 2 つだけであることをモデルに指示します。
- cp = 0 。これは複雑さのパラメーターです。これを 0 に設定すると、分割を実行するためにモデルが全体の適合性を改善できる必要がなくなります。
基本的に、これら 2 つの引数により、個々のツリーが非常に深く成長し、分散が高くてもバイアスが低いツリーが生成されます。次に、バギングを適用すると、バイアスを低く保ちながら最終モデルの分散を減らすことができます。
モデルの結果から、バッグ外の推定 RMSE は17.4973であることがわかります。オゾンの予測値と実際の観測値の差の平均値です。
ステップ 3: 予測変数の重要性を視覚化する
バギング モデルは個々のデシジョン ツリーよりも正確な予測を提供する傾向がありますが、フィッティングされたバギング モデルの結果を解釈して視覚化することは困難です。
ただし、特定の予測子の分布による RSS (残差二乗和) の合計の減少を計算し、すべてのツリーの平均を計算することで、予測子変数の重要性を視覚化できます。値が大きいほど、予測子の重要性が高くなります。
次のコードは、キャレットライブラリのvarImp()関数を使用して、適合バッグ モデルの変数重要度プロットを作成する方法を示しています。
#calculate variable importance VI <- data.frame(var= names (airquality[,-1]), imp= varImp (bag)) #sort variable importance descending VI_plot <- VI[ order (VI$Overall, decreasing= TRUE ),] #visualize variable importance with horizontal bar plot barplot(VI_plot$Overall, names.arg= rownames (VI_plot), horiz= TRUE , col=' steelblue ', xlab=' Variable Importance ')
Solar.R がモデル内で最も重要な予測変数であるのに対し、 Monthは最も重要ではないことがわかります。
ステップ 4: モデルを使用して予測を行う
最後に、適合バッグ モデルを使用して、新しい観測値についての予測を行うことができます。
#define new observation new <- data.frame(Solar.R=150, Wind=8, Temp=70, Month=5, Day=5) #use fitted bagged model to predict Ozone value of new observation predict(bag, newdata=new) 24.4866666666667
予測変数の値に基づいて、適合バッグ モデルは、この特定の日のオゾン値が24,487になると予測します。
この例で使用されている完全な R コードは、 ここにあります。