トップ 履歴 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Decision Tree Analysis

*disclaimer
641218

R
[R]
[R.package]

決定木分析


 概要

  • 決定木
    • 分類木:目的変数がカテゴリー
    • 回帰木:目的変数が数値(連続)

分析のアルゴリズム

  • C4.5:カテゴリー
  • CART
  • CHAID


 基本


モデルの作成

モデル <- rpart(目的変数 ~ 説明変数 + 説明変数, data=データ)

  • method="class"とオプションの指定で、目的変数をカテゴリーとして扱う
    • 指定がなければ、自動判別
  • method="anova"で、数値として扱う

可視化:グラフにする

plot(as.party(モデル))


分析結果の三つの見方

  1. as.party(モデル)
  2. モデルそのものを見る
  3. summary(モデル)


 Complex Parameter (cp)

  • 複雑性パラメタ
  • 木が複雑になりすぎた場合(分岐が多すぎる場合)、木が伸びすぎないように「剪定」する

printcp(モデル)

  • エラーの収束を見て、cpをどこまでにするかを判断する

plotcp(モデル)


標準を下回るところを見つける。カットオフポイント。





 サンプルデータとスクリプト


サンプルデータ(各指標)から、
1)欠損値を含むデータ2つを除き、
2)ファイル名のカラムを削除したものを、
jpn.4cというデータフレームに入れているものとします。

> nrow(jpn.4b)
[1] 287
> nrow(jpn.4c)
[1] 285
> head(jpn.4c)
  Score Token Type NoS       TTR       GI     MATTR      AWL      ASL
1     4   319  135  30 0.4231975 7.558549 0.5921317 4.304075 10.63333
2     4   356  161  29 0.4522472 8.532983 0.6649157 4.233146 12.27586
3     3   201  121  13 0.6019900 8.534682 0.7170149 4.746269 15.46154
4     4   260  140  27 0.5384615 8.682431 0.6877692 4.761538  9.62963
5     4   420  175  25 0.4166667 8.539126 0.6341905 3.995238 16.80000
6     3   261  124  20 0.4750958 7.675407 0.6390038 4.072797 13.05000

rpartでDecision Tree Analysis

パッケージ rpart をインストール。

Scoreを目的変数(分類カテゴリー)として、残りの言語指標(説明変数)のどれがどのくらい分類に寄与するかを観察します。

式は: rpart(目的変数 ~ ., data = データフレーム)
結果を、モデルとして保存するようにします。

具体的には、まず、attachして使うデータフレーム名を決めておく。

> attach(jpn.4c)
> jpn.DTmodel <- rpart(Score ~ ., data = jpn.4c)
> jpn.DTmodel
n= 285 

node), split, n, deviance, yval
      * denotes terminal node

 1) root 285 166.0491000 3.635088  
   2) Type< 130.5 152  45.8684200 3.118421  
     4) Token< 163.5 11   4.9090910 2.090909 *
     5) Token>=163.5 141  28.4397200 3.198582  
      10) Token< 262 109  14.2568800 3.082569  
        20) AWL< 4.72274 91   6.9890110 3.010989 *
        21) AWL>=4.72274 18   4.4444440 3.444444 *
      11) Token>=262 32   7.7187500 3.593750  
        22) AWL< 4.229472 19   4.4210530 3.368421 *
        23) AWL>=4.229472 13   0.9230769 3.923077 *
   3) Type>=130.5 133  33.2330800 4.225564  
     6) Token< 398 96  10.9895800 4.010417  
      12) Token< 272.5 10   2.4000000 3.600000 *
      13) Token>=272.5 86   6.7093020 4.058140 *
     7) Token>=398 37   6.2702700 4.783784  
      14) ASL< 13.07619 7   1.4285710 4.285714 *
      15) ASL>=13.07619 30   2.7000000 4.900000 *

結果のグラフ

install.packages("rpart.plot", dependencies = T)
library(rpart.plot)
rpart.plot(jpn.DTmodel)


  • 上から順に、重要な指標と位置づけられる。

  1. 一番重要な指標が Type 131以上あるか、
  2. 次に Token が398 以上あるか
  3. そのうえ、ASL(平均文長)が13以上あれば、評価は 4.9 になる。

  • 一番下のレベルで、AWL(平均語長)が基準として選ばれている。
  • まったく図に表れない指標(各種語彙多様性指標や文の数)はスコアの決定には寄与しないといえる。

  • どんな指標を入れるかにより、判断は変わってくるが、逆に、どんな指標を入れようが、重要でない指標は選ばれないし、それほど重要でない指標は下のほうに位置づけられる。常に上のほうに位置づけられる指標は、常に重要であると判断される。

  • どんな指標の組み合わせで分析を行うかは、分析の目的しだい。

 スコアをカテゴリー変数とみなして分析しなおしてみる

> jpn.5c <- jpn.4c
> jpn.5c$Score <- as.factor(jpn.5c$Score)
> jpn.DTmodel2 <- rpart(Score ~ ., data = jpn.5c)
> jpn.DTmodel2
n= 285 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 285 161 4 (0.007 0.032 0.4 0.44 0.12)  
   2) Token< 262 124  25 3 (0.016 0.073 0.8 0.11 0)  
     4) Token< 163.5 11   5 2 (0.18 0.55 0.27 0 0) *
     5) Token>=163.5 113  17 3 (0 0.027 0.85 0.12 0) *
   3) Token>=262 161  51 4 (0 0 0.099 0.68 0.22)  
     6) Token< 398 124  22 4 (0 0 0.13 0.82 0.048)  
      12) Type< 130.5 32  13 4 (0 0 0.41 0.59 0)  
        24) AWL< 4.229472 19   7 3 (0 0 0.63 0.37 0) *
        25) AWL>=4.229472 13   1 4 (0 0 0.077 0.92 0) *
      13) Type>=130.5 92   9 4 (0 0 0.033 0.9 0.065) *
     7) Token>=398 37   8 5 (0 0 0 0.22 0.78)  
      14) ASL< 13.07619 7   2 4 (0 0 0 0.71 0.29) *
      15) ASL>=13.07619 30   3 5 (0 0 0 0.1 0.9) *
> rpart.plot(jpn.DTmodel2)

summary(モデル)で、詳しい結果が表示される

 partykitを使った別のグラフ表示

library(rpart)
library(partykit)
plot(as.party(jpn.DTmodel2))

結果の解釈(Criterionで高得点を取るには)

  • 総語数が160語くらい書けないと評価3はもらえない。
  • 総語数が260語くらい書けると評価4がもらえる可能性が高くなる。
  • 総語数が400語以下の場合、語彙力が高ければ4がもらえる可能性が高くなる。
    • 多様な語彙(語彙タイプ数が130以上)もしくは
    • 単語長の長い(平均単語長5文字以上)「難しい」語彙の使用
  • 総語数が400語以上で、平均的に長い文(13単語以上)を書くと評価5がもらえる可能性が高い。

オプション

  • Nodeの出力をシンプルにする
    • plotで、オプションをつける
, type="simple"

 complex parameter (cp) によって剪定を行うことができる

https://toukeier.hatenablog.com/entry/2018/09/03/080713


printcp(モデル)


cp
複雑さ
nsplit
分岐の数
rel error
エラー率
xerror
交差確認のエラー率
xstd
交差確認のエラー率の標準偏差


plotcp(モデル)



 rpart.control で詳細設定

rpart.control(minsplit = 20, minbucket = round(minsplit/3), cp = 0.01, 
              maxcompete = 4, maxsurrogate = 5, usesurrogate = 2, xval = 10,
              surrogatestyle = 0, maxdepth = 30, ...)

minsplit
分岐に必要な最低データポイント数
minbucket
端末の「葉」に必要な最低データポイント数
cp
「complexity parameter」
maxcompete
価値のない分岐を「剪定」する値。(価値がない=説明率が上がらない)
maxsurrogate
対立項「competitor 」の数
usesurrogate
xval
交差検証の数
surrogatestyle
maxdepth
最大の深さ、30まで

 分岐

  • デフォルトはgini係数
    • informationを指定することもできる

  • gini係数が小さくなるように分岐する


 References

https://qiita.com/LTtoose/items/8d3ac23791ee6e1cb4ce