osakar_5: r言語による決定木入門
TRANSCRIPT
R言語による決定木入門
@langstat
Osaka.R #5
2011年4月23日(土)、ロックオン大阪本社
1
自己紹介
• 小林 雄一郎 (こばやし ゆういちろう)
– 大阪大学大学院言語文化研究科/日本学術振興会
– 関心領域(「専門領域」ではない):
コーパス言語学・統計的テキストマイニング
2
• Rコミュニティーとの関わり
– 2010/04/09 「R言語による検定入門」 Osaka.R#2
– 2010/06/19 「R言語によるプロット入門」 Nagoya.R#3
– 2010/06/19 「R言語による判別分析入門」 Nagoya.R#3
– 2010/06/26 「R言語によるテキストマイニング入門」–
Osaka.R#3
– 2010/12/02 「R言語によるコーパス分析入門」 Osaka.R#4
– 2011/03/26 「R言語による『機動戦士ガンダム』分析」
Nagoya.R#5
– (その他、Tokyo.RやShiga.Rにも参加)
3
決定木とは
• 回帰分析のような明示的な関数を用いずに、一連
の手続きに沿ってデータを分けていくことによって、
予測や判別を行うことを決定木(あるいは回帰木)と
いう
• 様々な分野で応用性が高く、予測や判別のための
有効な手法であることに加えて、分析イメージが容
易に理解でき、さらにその出力も大変理解しやすい
ため、様々な分野での実務に使われることの多い
ルール
4
木とは何か:ノードと分岐
データ全体データ全体
ルートノード
(根ノード)
データをどんどん
分けていくと木がで
きていくんだにゃ~
5
リーフノード(葉ノード)
または、ターミナルノード
木をどうやって作るか:クラスの分類
• 分岐を行うには、説明変数(手がかり)が必要
• ここでは、XとYという2つの説明変数を使って、二次元
空間上にプロット
• それぞれのデータは、○、△、□というクラス(特徴)
を持っている 1回目のを持っている
6
2クラスの分類を
繰り返していくん
だにゃ~
Y
X
1回目の
分岐
2回目の
分岐
10
5
決定木のイメージ
分岐に使う値は、
さっきの散布図と
対応してるんだ
データ全体データ全体
Xで分岐
X≦10X >10
7
対応してるんだ
にゃ~
Yで分岐
Y>5 Y≦5
どうやって分岐のルールを決めるのか
• 連続変数の場合
ある値を分岐点とする
8
株価
100円25円 250円0円
• カテゴリー変数の場合
岡
崎
本
田
・・・
家
長
前
田
・・・
9
岡
崎
前
田
・・・
カ
ズ
本
田
・・・
李
本
田
・・・
宇
佐
美
岡
崎
・・・組み合わせの数だけ
分岐点が存在する
主な決定木・回帰木の手法
• C5.0
– エントロピーに基づくゲイン比という基準で分割
• CHAID
– 統計検定(連続変数のときはF検定、カテゴリー変数のと
きはカイ2乗検定)の有意確率を基準に分割
• CART
– 不純度を表すGINI係数を基準に分割
– ノードを分岐させることによって、不純度が減少する(=分
岐後のそれぞれのノードの純度が増す)ような分岐点を
探す
– 「純度が増す」=「バラツキが少なくなる」
10
Rではこの手法!
RでCARTをやってみよう
• CART (Classification And Regression Tree)
– mvpartパッケージをCRANからダウンロード
• Fisherのirisデータを使用
– R
# mvpartパッケージのインストール
> install.packages(“mvpart”)
– Rにもともと格納されている
– がく (Sepal) の長さと幅、花びら (Petal) の長さと幅から、ア
ヤメ (iris) の種類を分類
– http://en.wikipedia.org/wiki/Iris_flower_data_set
11
# irisデータを表示
> iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
12
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
(中略)
150 5.9 3.0 5.1 1.8 virginica
# setosa, versicolor, verginicaが50サンプルずつ(計150サンプル)
# irisデータを奇数行(学習データ)と偶数行(評価データ)に分割
> n<-2*(1:75)-1
> iris.train<-iris[n,]
> iris.test<-iris[-n,]
奇数行データ
学習
13
全データ
(n=150)
奇数行データ
(n=75)
偶数行データ
(n=75)
分割
評価
# 分類モデルの構築
> library (mvpart)
# 同じ結果を出すために
> set.seed(20)
# エントロピーを用いる場合は、引数でsplit=“information”
> model<-rpart(Species~., iris.train)
# モデルの表示
> print(model, digit=1)
14
> print(model, digit=1)
n= 75
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 75 50 setosa (0.33 0.33 0.33)
2) Petal.Length< 2 25 0 setosa (1.00 0.00 0.00) *
3) Petal.Length>=2 50 20 versicolor (0.00 0.50 0.50)
6) Petal.Width< 2 25 1 versicolor (0.00 0.96 0.04) *
7) Petal.Width>=2 25 1 virginica (0.00 0.04 0.96) *
数字だけじゃ
よく分からないにゃ~
# 視覚化
> plot(model, uniform=T, branch=0.6, margin=0.5)
> text(model, use.n=T, all=T)
15
【引数】
uniform(ノードの間隔)
branch(枝の角度)
margin(図の外側の余白)
use.n(各ノードに含まれる
個体の数)
# 木の剪定
> plotcp(model)
【図の見方】
下の横軸がcpの値、上の横軸が木
のサイズ(リーフノードの数)、縦軸
が予測変数の相対誤差
16
が予測変数の相対誤差
Min+1SEは、交差確認の結果から
求められるリスクの最小値に標準
偏差を足した値
とりあえず、オレンジの点(直線
Min+1SEの下方で、最もその直線に
近い点)のある位置あたりにcpを設
定し直せばよい
# 剪定した木の視覚化
> model.prune<-prune(model, cp=0.02)
> plot(model.prune, uniform=T, branch=0.6, margin=0.5)
> text(model.prune, use.n=T)
cpのデフォルトが0.01だ
から、あまり結果が変わ
17
から、あまり結果が変わ
らなかったのかにゃ~
# 評価
> model.predict<-predict(model.prune, iris.test[,-5], type="class")
> table(iris.test[,5], model.predict)
model.predict
setosa versicolor virginica
setosa 25 0 0
versicolor 0 24 1
virginica 0 3 22
18
virginica 0 3 22
75サンプルのうち、
4サンプルを誤分類しているから、
正判別率は94.67%だにゃ~
参考文献
19
金明哲 (2007). 『Rによる
データサイエンス―デー
タ解析の基礎から最新
手法まで』 森北出版.
豊田秀樹 (2008). 『デー
タマイニング入門―Rで
学ぶ最新データ解析』
東京図書.
山口和範ほか (2004).
『図解入門よくわかる多
変量解析の基本と仕組
み』 秀和システム.