アンサンブル学習


2012.03.10 Tokyo.R #21
  by @holidayworking




                         1
アジェンダ



• 自己紹介
• アンサンブル学習
• アンサンブル学習アルゴリズム
  • バギング
  • ブースティング
  • ランダムフォレスト
• R での実行方法



                    2
自己紹介
• Hidekazu Tanaka
• システムエンジニア
• 好きなもの
 • T-SQUARE
 • F1
アンサンブル学習とは




             4
アンサンブル学習とは




• 学習器の性能は汎化能力(未学習データに対する予測能力)で評価
• 汎化能力を向上させるためには
  • 単一の学習器の性能を向上させる方法
  • 個々に学習した複数の学習器を何らかの形で融合させて汎化能力を
 向上させる方法




                                     5
アンサンブル学習とは




• 学習器の性能は汎化能力(未学習データに対する予測能力)で評価
• 汎化能力を向上させるためには
  • 単一の学習器の性能を向上させる方法
  • 個々に学習した複数の学習器を何らかの形で融合させて汎化性能を
 向上させる方法




                                     6
アンサンブル学習の分類

• アンサンブルする学習器の複雑さという基準で
 (i)複雑な学習器を独立に学習し、それらをアンサンブルする形態
 (ii)単純な学習器を逐次的に学習し、それらをアンサンブルする形態
•アンサンブル学習器の種類という観点では
 (a)同じ学習器で学習した結果をアンサンブルする形態
 (b)異なる学習器で学習した結果をアンサンブルする形態


•今回紹介するアンサンブル学習アルゴリズムは
 •バギング、ランダムフォレストは(i)(a)
 •ブースティングは(ii)(a)

                                     7
なぜ,アンサンブル学習は有効か?




• アンサンブルの方法として,単純に弱学習器の多数決とする.
• 2値判別問題では, (m + 1)/2 個以上の弱学習器が誤判定を起こす
と,多数決によりアンサンブルの判定は誤りとなる.
• 各弱学習器が統計的に独立とし,かつ弱学習器の誤り確率を一律✓ と
すると,m 個の弱学習器の内,k 個の分類器の判定が誤る確率は
            P (k) =m Ck ✓k (1   ✓)m   k




                                          8
なぜ,アンサンブル学習は有効か?
        0.2
                                    m = 21, ✓ = 0.3
       0.18


       0.16


       0.14


       0.12
P(k)




        0.1


       0.08


       0.06


       0.04


       0.02


         0
              0   5   10       15              20
                                                      9
                           k
なぜ,アンサンブル学習は有効か?
        0.2
                                    m = 21, ✓ = 0.3
       0.18


       0.16


       0.14


       0.12
P(k)




        0.1


       0.08


       0.06


       0.04


       0.02


         0
              0   5   10       15              20
                                                      9
                           k
なぜ,アンサンブル学習は有効か?
        0.2
                                    m = 21, ✓ = 0.3
       0.18


       0.16


       0.14

       極めて直感的な説明であることに注意
       0.12


        詳細な解析はされていないらしい
P(k)




        0.1


       0.08


       0.06


       0.04


       0.02


         0
              0   5   10       15              20
                                                      9
                           k
代表的なアンサンブル学習アルゴリズム




• バギング
• ブースティング
• ランダムフォレスト




                     10
バギング




       11
バギングとは

•1996年 Breiman によって提案
•ブートストラップ法により弱学習器を構築し、それから最終的な学習
器を構築する方法

             学習サンプル



 復元抽出サンプル   復元抽出サンプル   復元抽出サンプル



   弱学習器      弱学習器       弱学習器



              学習器

                                   12
バギングのアルゴリズム



1.以下の手順を B 回繰り返す.
 a.データからm 回復元抽出して、新しいデータを作る.
 b.弱学習器 h を構築する.
2. B 個の弱学習器 h を用いて最終的な学習器を構築する.
 •判別問題の場合: H(x) = argmax|{i|hi = y}|
                     B
                     X
 •回帰問題の場合: H(x) = 1    hi
                      B   i=1




                                       13
ブースティング




          14
ブースティングとは

• ブースティングとは逐次的に弱学習器を構築するアンサンブル学習ア
ルゴリズム
• ブースティングのルーツは、機械学習方式を解析する理論的な枠組で
ある「確率的近似学習(PAC learning)」
• 最初にブースティングの問題を提案したのは Kearns と Valiant
• 1989年 Schapire によって理論的に保証されたアルゴリズム
• 1990年 Freund によって効率的である意味最適なアルゴリズム
• 1995年 Freund と Schapire が AdaBoost を考案
  • 初期のアルゴリズムの問題を改良
• 以降、様々なブースティングアルゴリズムが提案


                                           15
AdaBoost のアルゴリズム
入力 (x1 , u1 ), . . . , (xm , ym ) where xi 2 X, yi 2 Y = { 1, +1}
初期化 重みの初期値を      とする.
           D1 (i) = 1/m
繰り返し t = 1, . . . , T として,以下の手順を繰り返す.
 1.確率分布 Dt に従う弱学習器 ht : X ! { 1, +1} を構築する.
 2.弱学習器 ht の誤り率 ✏t を計算する.
                                               X
         ✏t = Prx⇠Dt [ft (xi ) 6= yi ] =                    Dt (i)
                                           i:ht (xi )6=yi

 3.弱学習器 ht の重要度 ↵t を計算                   1       1 ✏t
                                  ↵t = log(           )
 4.重みを更新する.              ⇢
                                         2         ✏t
                Dt (i)       e ↵t if ht (xi ) = yi
     Dt+1 (i) =        ⇥
                 Zt          e ↵t   if ht (xi ) 6= yi
                Dt (i)exp( ↵t yi ht (xi ))
              =
                            Zt!
                XT
出力 H(x) = sign       ↵t ht (x)                                       16
                      t=1
様々なブースティングアルゴリズム




• 多値判別問題に対応したアルゴリズム
  • AdaBoost.M1
  • AdaBoost.M2
• MadaBoost : フィルタリングに適したアルゴリズム
• U-Boost : 同時確率分布を推定するためのアルゴリズム




                                   17
ブースティングを勉強したい人へ


• ブースティング―学習アルゴリズ
 ムの設計技法
• 著者
  • 金森敬文
  • 畑埜晃平
  • 渡辺治
• 値段
  • 3,990円



                       18
ランダムフォレスト




            19
ランダムフォレストとは

• 2001年 Breiman によって提案
• 決定木を弱学習器とするアンサンブル学習アルゴリズム

             学習サンプル



 復元抽出サンプル   復元抽出サンプル   復元抽出サンプル



   決定木         決定木        決定木



               学習器

                                  20
ランダムフォレストのアルゴリズム


1.以下の手順を B 回繰り返す.
 a.訓練データからブートストラップサンプルを作成する.
 b.ブートストラップサンプルから決定木 Tiを構築する.このとき,
   指定したノード数 nmin になるまで,以下の手順を繰り返す.
   i. p 個の説明変数から m 個の変数をランダムに選択する.
   ii. m 個の説明変数から最も良い変数を分岐ノードとする.
2. B 個の決定木 Ti を用いて最終的な学習器を構築する
 •判別問題の場合は多数決
 •回帰問題の場合は平均


                                     21
アルゴリズムの補足



• パラメータ nmin と m をどう決めれば良いのか?
                           p
  • 判別問題の場合: nmin = 1, m = p
  • 回帰問題に場合: nmin = 5, m = p/3
• バギングとランダムフォレストの違いは?
  • バギングでは説明変数を全て使う
  • ランダムフォレストでは説明変数をランダムサンプリングして使う




                                     22
ランダムフォレストの特徴


• 精度が高い
• 説明変数が数百,数千でも効率的に動作
• 目的変数に対する説明変数の重要度を推定
• 事例の近似度を求めることができる
• 外れ値の特定をすることができる
• 欠損値の推定
• 欠損値を持つデータでも有効に動作
• 個体数がアンバランスでもエラーバランスが保たれる



                             23
OOB データとは?




• Out-Of-Bag の略
• ブートストラップサンプルから約3分の1を取り除いたデータのこと
  • 残りのデータで決定木を構築する
• 決定木を構築した後に OOB データでテストを行う.その誤判定率
を OOB 推定値と呼ぶ.




                                     24
説明変数の重要度の推定方法


構築した決定木と OOB データを使うことで説明変数の重要度を推定
することできる.
                    XT
                  1
           Im   =       (At   BT )
                  T t=1
T : 決定木の個数
A : OOB データを決定木に適用した時の正答数
B : ランダムに変数 m を並び替えた OOB データを決定木に
  適用した時の正答数




                                     25
DNAデータにおける説明変数の重要度
                       0.6

                      0.55

                       0.5
Variable Importance




                      0.45

                       0.4

                      0.35

                       0.3

                      0.25

                       0.2

                      0.15

                       0.1

                      0.05
                             0   20   40   60   80    100   120   140   160   180
                                                 Variable

                                                                                    26
DNAデータにおける説明変数の重要度
                       0.6

                      0.55

                       0.5
Variable Importance




                      0.45

                       0.4

                      0.35

                       0.3

                      0.25

                       0.2

                      0.15

                       0.1

                      0.05
                             0   20   40   60   80    100   120   140   160   180
                                                 Variable

                                                                                    26
事例の近似度の計算方法



1.各決定木ごとに以下の手順を繰り返す.
 a.決定木に訓練データと OOB データを適用する.
 b.事例 xn と xk が同じ終端ノードに存在した場合を,近似度      )    
                                  prox(xn , xk
   を1増加させる.
2.最終的な結果は prox(xn , xk ) を決定木の個数で割って正規化したもの
  とする.




                                              27
外れ値の特定方法


1.クラス j に属する事例 n と残りの事例の近似度の平均値を求める.
                     X
              ¯
             P (n) =   prox2 (n, k)
                        ↵(k)=j


2. out(n) を以下のように定義する.
                             ¯
                  out(n) = N/P (n)

3.各クラスにおける out(n) の中央値と絶対偏差を計算する.
4.最終的な結果は out(n) から中央値を引き,絶対偏差で割ったものと
  する.




                                        28
iris データにおける外れ値


               60
               50
               40
outlyingness

               30
               20
               10
               0




                                         29
                    0   50   100   150
R での実行方法




           30
パッケージ


• バギング
  • adabag
  • ipred
• ブースティング
  • ada
  • adabag
• ランダムフォレスト
  • randomForest



                           31
adabag パッケージ


• バギングとブースティングが実装されているパッケージ
  • Breiman's Bagging
  • Freund and Schapire's Adaboost.M1
  • AdaBoost-SAMME
• 弱学習器として決定木(rpart パッケージ)が使われる
• 関数
  • bagging
  • boosting



                                        32
bagging 関数



使い方
 bagging(formula, data, mfinal = 100, control)

引数
 mfinal     弱学習器の個数
 control   rpart.control 関数




                                                 33
bagging 関数の実行例


> set.seed(50)
> tr.num <- sample(4601, 2500)
> spam.train <- spam[tr.num,]
> spam.test <- spam[-tr.num,]
> spam.ba <- bagging(type~., data=spam.train)
> spam.bap <- predict(spam.ba, spam.test)
> spam.bap$confusion
                Observed Class
Predicted Class nonspam spam
        nonspam     1208 124
        spam          74 695
> spam.bap$error
[1] 0.09424084
                                                34
boosting 関数


使い方
 boosting(formula, data, boos = TRUE, mfinal = 100,
 coeflearn = 'Breiman', control)
引数
 mfinal    弱学習器の個数
          重要度 ↵t の計算方法
 coeflearn   Breiman : ↵t = 1/2log((1 ✏t )/✏t )
            Freund : ↵t = log((1 ✏t )/✏t )
 control    rpart.control 関数



                                                      35
boosting 関数の実行例


> spam.ad <- boosting(type~., data=spam.train)
> spam.adp <- predict(spam.ad, newdata=spam.test)
> spam.adp$confusion
                Observed Class
Predicted Class nonspam spam
        nonspam     1232   46
        spam          50 773
> spam.adp$error
[1] 0.04569253




                                                    36
randomForest パッケージ


使い方
 randomForest(formula, data=NULL, ..., subset,
 na.action=na.fail)
引数
 ntree        弱学習器の個数
 mtry         分岐に用いる説明変数の個数
 importance   説明変数の重要度を計算するか?
 proximity    個体の近似度を計算するか?




                                                 37
randomForest の実行例


> spam.rf <- randomForest(type~., data=spam.train,
                          na.action="na.omit")
> spam.rfp<-predict(spam.rf, spam.test[,-58])
> (spam.rft<-table(spam.test[,58], spam.rfp))
          spam.rfp
           nonspam spam
  nonspam     1240   42
  spam          75 744
> sum(diag(spam.rft))/sum(spam.rft)
[1] 0.9443122




                                                     38
決定木の個数と誤判別率の関係

> plot(spam.rf)                       spam.rf




                               nonspam
              0.10
              0.08
      Error




                                oob
              0.06




                                      spam
              0.04




                     0   100      200           300   400   500
                                                                  39
                                        trees
説明変数の重要度

                                                       spam.rf
   > varImpPlot(spam.rf)

charExclamation                                             charExclamation
remove                                                      charDollar
capitalAve                                                  remove
hp                                                          free
charDollar                                                  capitalAve
free                                                        capitalLong
capitalLong                                                 your
edu                                                         hp
capitalTotal                                                money
our                                                         capitalTotal
george                                                      our
your                                                        you
num1999                                                     num000
money                                                       george
re                                                          hpl
you                                                         edu
hpl                                                         num1999
charRoundbracket                                            charRoundbracket
meeting                                                     business
num000                                                      all
business                                                    internet
will                                                        will
num650                                                      re
internet                                                    email
font                                                        over
pm                                                          receive
technology                                                  mail
num85                                                       credit
receive                                                     address
credit                                                      num650

                   0.35   0.40 0.45 0.50 0.55 0.60   0.65                      0    50         100    150
                              MeanDecreaseAccuracy                                 MeanDecreaseGini




                                                                                                       40
アルゴリズムの比較




• アンサンブル学習アルゴリズムの比較をしたい
  • バギング
  • ブースティング
  • ランダムフォレスト




                          41
アルゴリズムの比較




• アンサンブル学習アルゴリズムの比較をしたい
  caretパッケージを使う!
  • バギング
  • ブースティング
  • ランダムフォレスト




                          41
caret パッケージとは?




• classification and regression training の略
• 100以上の機械学習アルゴリズムを一つのスキームで評価すること
できる
• 詳細は第11回R勉強会@東京(Tokyo.R#11)の @dichika さ
んの発表資料を参照




                                             42
モデルの作成と評価


> rpartFit <- train(trainDescr, trainMDRR, method="rpart",
                    preProcess=c("center", "scale"), trControl=fitControl)
> bagFit <- train(trainDescr, trainMDRR, method="treebag"
                  preProcess=c("center", "scale"), trControl=fitControl)
> adaFit <- train(trainDescr, trainMDRR, method="ada"
                  preProcess=c("center", "scale"), trControl=fitControl)
> rfFit <- train(trainDescr, trainMDRR, method="rf"
                 preProcess=c("center", "scale"), trControl=fitControl)

> allPred <- extractPrediction(list(rpartFit, bagFit, adaFit, rfFit),
                               testX=testDescr, testY=testMDRR)
> testPred <- subset(allPred, dataType=="Test")
> tp_rpart <- subset(testPred, model=="rpart")
> tp_bag <- subset(testPred, model=="treebag")
> tp_rf <- subset(testPred, model=="rf")



                    https://gist.github.com/2006235

                                                                             43
モデルの比較①
> confusionMatrix(tp_rpar$pred, tp_rpa$obs)      > confusionMatrix(tp_bag$pred, tp_bag$obs)
Confusion Matrix and Statistics                  Confusion Matrix and Statistics

           Reference                                        Reference
Prediction Active Inactive                       Prediction Active Inactive
  Active       132      51                         Active       129      32
  Inactive      17      64                         Inactive      20      83

               Accuracy   :   0.7424                            Accuracy   :   0.803
                 95% CI   :   (0.6852, 0.7941)                    95% CI   :   (0.7499, 0.8493)
    No Information Rate   :   0.5644                 No Information Rate   :   0.5644
    P-Value [Acc > NIR]   :   1.514e-09              P-Value [Acc > NIR]   :   2.566e-16

                  Kappa : 0.4579                                   Kappa : 0.5946
 Mcnemar's Test P-Value : 6.285e-05               Mcnemar's Test P-Value : 0.1272

            Sensitivity   :   0.8859                         Sensitivity   :   0.8658
            Specificity   :   0.5565                         Specificity   :   0.7217
         Pos Pred Value   :   0.7213                      Pos Pred Value   :   0.8012
         Neg Pred Value   :   0.7901                      Neg Pred Value   :   0.8058
             Prevalence   :   0.5644                          Prevalence   :   0.5644
         Detection Rate   :   0.5000                      Detection Rate   :   0.4886
   Detection Prevalence   :   0.6932                Detection Prevalence   :   0.6098

       'Positive' Class : Active                        'Positive' Class : Active            44
モデルの比較②
> confusionMatrix(tp_ada$pred, tp_ada$obs)       > confusionMatrix(tp_rf$pred, tp_rf$obs)
Confusion Matrix and Statistics                  Confusion Matrix and Statistics

           Reference                                        Reference
Prediction Active Inactive                       Prediction Active Inactive
  Active       133      33                         Active       133      31
  Inactive      16      82                         Inactive      16      84

               Accuracy   :   0.8144                            Accuracy   :   0.822
                 95% CI   :   (0.7622, 0.8594)                    95% CI   :   (0.7704, 0.8662)
    No Information Rate   :   0.5644                 No Information Rate   :   0.5644
    P-Value [Acc > NIR]   :   < 2e-16                P-Value [Acc > NIR]   :   < 2e-16

                  Kappa : 0.6161                                   Kappa : 0.6325
 Mcnemar's Test P-Value : 0.02227                 Mcnemar's Test P-Value : 0.04114

            Sensitivity   :   0.8926                         Sensitivity   :   0.8926
            Specificity   :   0.7130                         Specificity   :   0.7304
         Pos Pred Value   :   0.8012                      Pos Pred Value   :   0.8110
         Neg Pred Value   :   0.8367                      Neg Pred Value   :   0.8400
             Prevalence   :   0.5644                          Prevalence   :   0.5644
         Detection Rate   :   0.5038                      Detection Rate   :   0.5038
   Detection Prevalence   :   0.6288                Detection Prevalence   :   0.6212

       'Positive' Class : Active                        'Positive' Class : Active            45
考察



精度の比較
   決定木     Bagging   Boosting    RF
  0.7424    0.803    0.8144     0.822




                                        46
考察



精度の比較
   決定木     Bagging   Boosting    RF
  0.7424    0.803    0.8144     0.822




 ランダムフォレストが高い!

                                        46
まとめ


• アンサンブル学習
• アンサンブル学習アルゴリズム
  • バギング
  • ブースティング
  • ランダムフォレスト
• Rにおける実行方法
  • adabag
  • randomForest



                    47
参考文献



• 上田修功. アンサンブル学習の新展開. 電子情報通信学会技術研究報告. PRMU, パターン認識・
 メディア理解, Vol. 102, No. 379, pp. 31‒36, 2002.
• Y. Freund, R.E. Schapire, 阿部直樹. ブースティング入門. 人工知能学会誌, Vol. 14, pp.
 771‒780, 1999.
• Random forests - classification description
• T. Hastie, R. Tibshirani, J. Friedman. The Elements of Statistical Learning
 --- Data Mining, Inference, and Prediction Second Edition. Springer, 2009.
• 金森 敬文, 竹之内 高志, 村田 昇. パターン認識. Rで学ぶデータサイエンス (Vol. 5). 共立出版,
 2009.




                                                                                48
ご清聴有難う御座いました




               49

アンサンブル学習