MENU

R でアンサンブル学習のバギングを行う方法

バギングというアンサンブル学習を R でやってみる。

>>もう統計で悩むのは終わりにしませんか? 

↑期間・数量限定で無料プレゼント中!

目次

ランダムフォレストとバギングの違い

ランダムフォレストとバギングの違いは、以下の記事を参照。

バギングのための R パッケージの準備

adabagパッケージをインストールする。

install.packages("adabag")

インストール後、呼び出しておく。

library(adabag)

>>もう統計で悩むのは終わりにしませんか? 

↑1万人以上の医療従事者が購読中

バギングためのデータの準備

例題のデータを準備する。

データはirisを使う。

irisは150行のデータ。一部を学習データにする。

150を50ずつ3つに分けて、それぞれ50個から35個をランダムに取りだして、105個のsubという数列を作る。subに一致する行番号のデータを学習データにする。

いつも同じ結果ができるようにseedを決めておく。

set.seed(17)
sub <- c(sample(1:50, 35), sample(51:100, 35), sample(101:150, 35))

バギングの解析例

irisのSpeciesを分類する識別器をbaggingで求める。mfinalは分類木の数。デフォルトは100。

set.seed(17)
iris.bagging<-bagging(Species ~ ., data=iris[sub,], mfinal=10)
iris.bagging

分類木は以下の10個が作られた。

> iris.bagging$trees
1
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 66 versicolor (0.3238095 0.3714286 0.3047619)
2) Petal.Length< 2.5 34  0 setosa (1.0000000 0.0000000 0.0000000) *
3) Petal.Length>=2.5 71 32 versicolor (0.0000000 0.5492958 0.4507042)
6) Petal.Width< 1.7 40  1 versicolor (0.0000000 0.9750000 0.0250000) *
7) Petal.Width>=1.7 31  0 virginica (0.0000000 0.0000000 1.0000000) *
2
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 67 setosa (0.36190476 0.29523810 0.34285714)
2) Petal.Length< 2.5 38  0 setosa (1.00000000 0.00000000 0.00000000) *
3) Petal.Length>=2.5 67 31 virginica (0.00000000 0.46268657 0.53731343)
6) Petal.Width< 1.75 34  3 versicolor (0.00000000 0.91176471 0.08823529) *
7) Petal.Width>=1.75 33  0 virginica (0.00000000 0.00000000 1.00000000) *
3
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 59 versicolor (0.20000000 0.43809524 0.36190476)
2) Petal.Width< 1.7 71 25 versicolor (0.29577465 0.64788732 0.05633803)
4) Petal.Length< 2.5 21  0 setosa (1.00000000 0.00000000 0.00000000) *
5) Petal.Length>=2.5 50  4 versicolor (0.00000000 0.92000000 0.08000000) *
3) Petal.Width>=1.7 34  0 virginica (0.00000000 0.00000000 1.00000000) *
4
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 63 setosa (0.4000000 0.2761905 0.3238095)
2) Petal.Length< 2.6 42  0 setosa (1.0000000 0.0000000 0.0000000) *
3) Petal.Length>=2.6 63 29 virginica (0.0000000 0.4603175 0.5396825)
6) Petal.Width< 1.75 33  4 versicolor (0.0000000 0.8787879 0.1212121)
12) Petal.Length< 4.95 26  0 versicolor (0.0000000 1.0000000 0.0000000) *
13) Petal.Length>=4.95 7  3 virginica (0.0000000 0.4285714 0.5714286) *
7) Petal.Width>=1.75 30  0 virginica (0.0000000 0.0000000 1.0000000) *
5
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 68 setosa (0.35238095 0.31428571 0.33333333)
2) Petal.Length< 2.5 37  0 setosa (1.00000000 0.00000000 0.00000000) *
3) Petal.Length>=2.5 68 33 virginica (0.00000000 0.48529412 0.51470588)
6) Petal.Length< 4.8 31  0 versicolor (0.00000000 1.00000000 0.00000000) *
7) Petal.Length>=4.8 37  2 virginica (0.00000000 0.05405405 0.94594595) *
6
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 70 setosa (0.33333333 0.33333333 0.33333333)
2) Petal.Length< 2.6 35  0 setosa (1.00000000 0.00000000 0.00000000) *
3) Petal.Length>=2.6 70 35 versicolor (0.00000000 0.50000000 0.50000000)
6) Petal.Length< 4.75 34  0 versicolor (0.00000000 1.00000000 0.00000000) *
7) Petal.Length>=4.75 36  1 virginica (0.00000000 0.02777778 0.97222222) *
7
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 60 versicolor (0.25714286 0.42857143 0.31428571)
2) Petal.Length< 2.6 27  0 setosa (1.00000000 0.00000000 0.00000000) *
3) Petal.Length>=2.6 78 33 versicolor (0.00000000 0.57692308 0.42307692)
6) Petal.Length< 4.75 42  0 versicolor (0.00000000 1.00000000 0.00000000) *
7) Petal.Length>=4.75 36  3 virginica (0.00000000 0.08333333 0.91666667) *
8
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 66 setosa (0.37142857 0.30476190 0.32380952)
2) Petal.Length< 2.6 39  0 setosa (1.00000000 0.00000000 0.00000000) *
3) Petal.Length>=2.6 66 32 virginica (0.00000000 0.48484848 0.51515152)
6) Petal.Length< 4.75 31  0 versicolor (0.00000000 1.00000000 0.00000000) *
7) Petal.Length>=4.75 35  1 virginica (0.00000000 0.02857143 0.97142857) *
9
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 59 versicolor (0.22857143 0.43809524 0.33333333)
2) Petal.Width< 1.7 71 25 versicolor (0.33802817 0.64788732 0.01408451)
4) Petal.Length< 2.6 24  0 setosa (1.00000000 0.00000000 0.00000000) *
5) Petal.Length>=2.6 47  1 versicolor (0.00000000 0.97872340 0.02127660) *
3) Petal.Width>=1.7 34  0 virginica (0.00000000 0.00000000 1.00000000) *
10
n= 105
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 105 67 setosa (0.3619048 0.3333333 0.3047619)
2) Petal.Length< 2.6 38  0 setosa (1.0000000 0.0000000 0.0000000) *
3) Petal.Length>=2.6 67 32 versicolor (0.0000000 0.5223881 0.4776119)
6) Petal.Width< 1.7 35  0 versicolor (0.0000000 1.0000000 0.0000000) *
7) Petal.Width>=1.7 32  0 virginica (0.0000000 0.0000000 1.0000000) *

分類木の決定は Plurality Vote(多数代表制)で決める。

The majority vote (the most often predicted class) で併合する。

adabag: An R Package for Classification with Boosting and Bagging (PDF)

テストデータ(-subで行番号を指定)で予測性能を確認する。

predict.bagging()でテストデータでの予測が行える。

iris.predbagging<-predict.bagging(iris.bagging, newdata=iris[-sub,])
iris.predbagging

Confusion tableで誤分類を確認する。

versicolorをvirginicaに1件、virginicaをversicolorに2件、誤分類した。

> iris.predbagging$confusion
Observed Class
Predicted Class setosa versicolor virginica
setosa         15          0         0
versicolor      0         14         2
virginica       0          1        13

誤分類率は0.067(6.7%)と計算された。

> iris.predbagging$error
[1] 0.06666667

まとめ

バギングは、学習セットからブートストラップ法で何度もサンプリングして、分類器をいくつも作り、それを併合してよりよい分類器を作る方法。

Rでは、adabagパッケージのbagging()で実行可能。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

リサーチクエスチョン探し?データ分析?論文投稿?、、、で、もう悩まない!

第1章臨床研究ではなぜ統計が必要なのか?計画することの重要性
  • 推定ってどんなことをしているの?
  • 臨床研究を計画するってどういうこと?
  • どうにかして標本平均を母平均に近づけられないか?
第2章:研究目的をどれだけ明確にできるのかが重要
  • データさえあれば解析でどうにかなる、という考え方は間違い
  • 何を明らかにしたいのか? という研究目的が重要
  • 研究目的は4種類に分けられる
  • 統計専門家に相談する上でも研究目的とPICOを明確化しておく
第3章:p値で結果が左右される時代は終わりました
  • アメリカ統計協会(ASA)のp値に関する声明で指摘されていること
  • そうは言っても、本当に有意差がなくてもいいの…?
  • なぜ統計専門家はp値を重要視していないのか
  • 有意差がない時に「有意な傾向があった」といってもいい?
  • 統計を放置してしまうと非常にまずい
第4章:多くの人が統計を苦手にする理由
  • 残念ながら、セミナー受講だけで統計は使えません。
  • インプットだけで統計が使えない理由
  • どうやったら統計の判断力が鍛えられるか?
  • 統計は手段なので正解がないため、最適解を判断する力が必要
第5章:統計を使えるようになるために今日から何をすれば良いか?
  • 論文を読んで統計が使えるようになるための5ステップ
第6章:統計を学ぶために重要な環境
  • 統計の3つの力をバランスよく構築する環境

以下のボタンをクリックして、画面に出てくる指示に従って、必要事項を記入してください。

この記事を書いた人

統計 ER ブログ執筆者

元疫学研究者

統計解析が趣味

コメント

コメントする

目次