7.6 デシジョン・ツリー

ore.odmDT関数は、条件付き確率に基づいたデータベース内デシジョン・ツリー・アルゴリズムを使用します。

デシジョン・ツリー・モデルは分類モデルです。デシジョン・ツリーはルールを生成します。ルールは、ユーザーが容易に理解でき、レコード・セットを識別するためにデータベース内で使用できる条件文です。

デシジョン・ツリーは、一連の質問を問うことによってターゲット値を予測します。各段階で問われる質問はそれぞれ、直前の質問に対する回答によって決まります。最終的に特定のターゲット値を一意に識別できるような質問を重ねていきます。図形的には、このプロセスがツリー構造を形成します。

デシジョン・ツリー・アルゴリズムは、トレーニング・プロセスにおいて、ケース(レコード)のセットを2つの子ノードに分割する最も効率的な方法を繰り返し見つける必要があります。ore.odmDT関数では、この分岐の計算用に2つの同種メトリック(giniおよびentropy)を使用できます。デフォルトのメトリックはジニです。

ore.odmDT関数の引数の詳細は、help(ore.odmDT)をコールしてください。

デシジョン・ツリー・モデルの設定

次の表は、デシジョン・ツリー・モデルに適用される設定のリストです。

表7-5 デシジョン・ツリー・モデルの設定

設定名 設定値 説明

TREE_IMPURITY_METRIC

TREE_IMPURITY_ENTROPY

TREE_IMPURITY_GINI

デシジョン・ツリーのツリー不純メトリック。

ツリー・アルゴリズムでは、各ノードでのデータの分岐に最適なテスト質問が検索されます。最適な分岐および分岐値は、ノードのエンティティに対するターゲット値の同質性(純度)が最大限に高くなるものです。純度はメトリックによるものです。デシジョン・ツリーでは、純度メトリックとしてジニ(TREE_IMPURITY_GINI)またはエントロピ(TREE_IMPURITY_ENTROPY)のいずれかを使用できます。デフォルトでは、アルゴリズムでTREE_IMPURITY_GINIが使用されます。

TREE_TERM_MAX_DEPTH

デシジョン・ツリーの場合:

2 <= X <= 20

ランダム・フォレストの場合:

2 <= X <= 100

分岐の条件: ツリーの最大深度(ルート・ノードとリーフ・ノードとの間(リーフ・ノードを含む)の最大ノード数)。

デシジョン・ツリーの場合、デフォルトは7です。

ランダム・フォレストの場合、デフォルトは16です。

TREE_TERM_MINPCT_NODE

0 <= X <= 10

トレーニング・データ内の行の割合として表現されたノード内のトレーニング行の最小数。

デフォルトは0.05で、0.05%を表します。

TREE_TERM_MINPCT_SPLIT

0 < X <= 20

トレーニング行の割合として表現された、ノードの分割を検討するために必要な行の最小数。

デフォルトは0.1で、0.1%を表します。

TREE_TERM_MINREC_NODE

X >= 0

ノード内の行の最小数。

デフォルトは10です。

TREE_TERM_MINREC_SPLIT

X > 1

分岐の条件: 値として表現される親ノードのレコードの最小数。レコード数がこの値よりも少ない場合、分岐は試行されません。

デフォルトは20です。

例7-5 ore.odmDT関数の使用方法

この例では、入力ore.frameを作成し、モデルを構築して、予測を行い、混同マトリクスを生成します。

m <- mtcars
m$gear <- as.factor(m$gear)
m$cyl  <- as.factor(m$cyl)
m$vs   <- as.factor(m$vs)
m$ID   <- 1:nrow(m)
mtcars_of <- ore.push(m)
row.names(mtcars_of) <- mtcars_of
# Build the model.
dt.mod  <- ore.odmDT(gear ~ ., mtcars_of)
summary(dt.mod)
# Make predictions and generate a confusion matrix.
dt.res  <- predict (dt.mod, mtcars_of, "gear")
with(dt.res, table(gear, PREDICTION)) 

この例のリスト

R> m <- mtcars
R> m$gear <- as.factor(m$gear)
R> m$cyl  <- as.factor(m$cyl)
R> m$vs   <- as.factor(m$vs)
R> m$ID   <- 1:nrow(m)
R> mtcars_of <- ore.push(m)
R> row.names(mtcars_of) <- mtcars_of
R> # Build the model.
R> dt.mod  <- ore.odmDT(gear ~ ., mtcars_of)
R> summary(dt.mod)
 
Call:
ore.odmDT(formula = gear ~ ., data = mtcars_of)
 
  n =  32 
 
Nodes:
  parent node.id row.count prediction                         split
1     NA       0        32          3                          <NA>
2      0       1        16          4 (disp <= 196.299999999999995)
3      0       2        16          3  (disp > 196.299999999999995)
            surrogate                   full.splits
1                <NA>                          <NA>
2 (cyl in ("4" "6" )) (disp <= 196.299999999999995)
3     (cyl in ("8" ))  (disp > 196.299999999999995)
 
Settings: 
                          value
prep.auto                    on
impurity.metric   impurity.gini
term.max.depth                7
term.minpct.node           0.05
term.minpct.split           0.1
term.minrec.node             10
term.minrec.split            20
R> # Make predictions and generate a confusion matrix.
R> dt.res  <- predict (dt.mod, mtcars_of, "gear")
R> with(dt.res, table(gear, PREDICTION)) 
    PREDICTION
gear  3  4
   3 14  1
   4  0 12
   5  2  3