決定木モデルを作る #alteryx #03 | Alteryx Advent Calendar 2016

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、小澤です。

当エントリは『Alteyx Advent Calendar 2016』の03日目のエントリです。

前回は大矢による『クロス集計表の作成』でした。
Alteryxは内部的にRのプログラムを呼び出すことで実現している機能があります。今回はそれを利用した決定木モデルの作成をしてみたいと思います。

決定木とは

決定木(Decision Tree)は2つの側面を有しています。

  • 意思決定のためのデータモデリング
  • 機械学習としての予測への活用

このような活用が可能な理由としては、決定木はルールベースのようなものをデータから生成してくれる点にあります。 決定木で作成されるモデルはその名前からも分かる通り、下の図のような木構造になっています。

スクリーンショット 2016-11-21 11.37.46

このように、決定木ではデータからパターンを抽出する際にどのよのうな基準で場合分けしたかを階層的に可視化することができます。 決定木は他の機械学習アルゴリズムなどと比較した際に決して予測精度の高いものではありませんが、このように基準が明確でわかりやすいため、意思決定の際にどこに注力すれば良いかの判断材料として使えるモデルになっています。 また、Random ForestやXGBoostなどの応用した手法もあるため、覚えておいて損はない手法といえるでしょう。

決定木のアルゴリズム

Alteryxの内部で使っているのは決定木の中でもCARTと呼ばれる手法のようです。 ここでは、実際に内部で利用されているrpartの決定木モデルを作る際のパラメータについて見てみます。 決定木を利用する際には2つほど確認しておく点があります。

  • 分割する基準をどのように決めているか
  • どこまで深く掘り進めるか

の2点です。

分割の基準

与えられたデータのうち、どの特徴のどんな値を利用して分割するべきかは内部的にどのように決まっているのでしょうか。 決定木の分割に不純度という指標を最も下げるような分割の仕方をします。 これはどういうことかというと、分割後の木の各葉において特定のクラスに属するデータが多く含まれるようにするという考え方となります。

下の図はある商品を買った人と買わなかった人を決定木で分類した例です。 この例では、特徴として各人の「性別」と「事前にwebサイトで商品情報を見ていたか」の2つがあるとして、実際の購入に繋がったか否かをそれぞれで分けています。 これを見ると、性別よりもwebサイトを見たかの方が購入に結びついていることがわかるので、性別によるセグメンテーションよりもweb広告をもっと出して商品ページを見てもらう施策のほうが有効であろうなどの判断ができます。

tree

購入者に関する情報が他にもあればさらにそれらで階層的に深堀していくことも可能です。

tree3

この分割の際の計算の仕方はAlteryx内部ではデフォルトでジニ係数というものを使っており、オプションで交差Entropyに変更することもできます。 ジニ係数は

latex-image-13

で表されます。 Kはクラス数なので、上記の図の例で言うと、性別であればk=1の時C_1は男性、k=2のC_2を女性のように割り当てるイメージです。 P(C_k|t)はノードにおける各クラスの割合です。上の図で言えばノードに含まれる全●×の数のうち、●の割合と×の割合になります。 上の図中の計算はジニ係数を実際に当てはめたものになります。

交差エントロピーでは

latex-image-1

を計算しています。

枝分かれしたそれぞれのノードの不純度が計算できたら、最後に分割後のツリーがどれだけ情報量が増えたかを計算します。 枝分かれする前後で上で計算した数値がどれだけ減ったかが、分割によってどれだけ情報量が増えたかとして計算しています。なので、最終的には下記の計算結果が最も高くなる特徴でツリーを分割します。

latex-image-19

Q(t)は分割前の不純度、分割された数がNとした時の各ノードのQ(t)をQ_n(t)としています。P_n(t)は分割された際の各ノードに含まれるデータ件数の割合になります。 N=2とすると、親ノードのうち右に行ったデータの割合と右のノードの不純度を掛ける、左にも同様の計算を行ってそれらを足し合わせます。 最後に元のQ(t)から引いた値が最も大きくなる分割の仕方を選択しています。

枝の剪定

次にどこまでこの枝を伸ばしていくのかについてです。 Q(t)の値が変わらなくなるまでと考えると、上記の計算では個々のノードに単一のクラスしか含まれない状態まで枝を伸ばすことができます。 一見すると、そうなった決定木は完璧にデータを分けれているように思えますが、実はこれには問題があります。 実は与えられたデータを完璧に分類できるようになるということは、「そのデータしか分類できない」という状態になっていることを指しています。データが生成される過程ではノイズが発生します。これには本質的ではない特徴の値まで捉えていたり、測定や入力ミス、外れ値となるような値が存在している場合など様々要因はあります。 そういったものまで、捉えてしまうと実際に予測を行う際に全然違う結果になってしまいます(これを過学習(Over fitting)と呼びます)。それを防ぐためにある程度完璧ではなくても普遍性の高い状態で木の成長を止めておく必要があります。

Alteryx内部で使用しているRのrpartではこれをcp(complexity parameter)というパラメータで指定するのですが、Alteryxでは利用者が直接指定する設定がありません。内部で適切な値を計算して、それを利用してくれているようです。 この計算には、コスト複雑度枝刈り(cost complexity pruning)という手法が使われているようで、

latex-image-18

のような計算式を使っています。Tは葉ノードです。この式では、左辺の二項目で葉ノードが多くなるほど結果に対してペナルティがかけられるようになっていますので、分割しすぎるとやがてコストの方が大きくなってしまします。 Cross Validationによって予測時のこのコスト値が最も小さくなるようにαの値を決定します。

ここでは完璧に分類するのではなく、枝切りを行うことで汎用性を高めているということだけを覚えておいていただければいいかと思います。 また、実際にはcpの指定は行いませんが、1ノードあたりに含まれるデータが何件以上であるや、木の深さの最大値などは指定できます。

補足: Cross Validationとは

学習に使ったデータに対しての当てはまりではなく、予測の際の当てはまりでどれだけ信頼できるかを求めるための手法の1つとなります。 機械学習などでは、未知のデータの予測がどれだけ行えるかが重要となるため、データの一部を学習には使わずに作成されたモデルに対する予測がどの程度うまくいかに利用したりします。 Cross Validationはデータが少ないときなどに効果的なやり方で、データ全体をn個に分割してn-1個を学習に、残りの1個を評価に用いるというのをn回繰り返す手法になります。

cv

Alteryxで利用する

ではAlteryxで決定木モデルの作成を行っています。

sample

まずはサンプルにあるものを実行しています。 Sample Workflow > Predictive Analytics > 6 Decision Tree を利用します。 Workflowを開くと下記のような画面が表示されます。

スクリーンショット 2016-11-21 15.54.10

生成されるツリーを見てみる

まずはこれを実行して、結果を見てみましょう。

alteryx1

いろいろと結果が表示されているのですが、とりあえずスクロールして行って、ツリーのプロットを見てみます。

スクリーンショット 2016-11-21 16.00.51

一回の枝分かれしか行われていませんが、Chk_Balという値が、A13かA14のいずれかに所属しているかでほぼ分類ができるようです。

詳細について見ていく

処理の流れを順を追って見ていきましょう。 まずは入力となるデータです。これの一部は

スクリーンショット 2016-11-21 16.09.30

のようになっています。これだけではよくわからないのですが、commnity blogによると、ここで使っているデータはUCIにあるStatlog (German Credit Data) Data Setの一部ようです。データの詳細に関する説明はそちらを参照してください。

次にDecision Tree Toolを利用してこの入力データを決定木の入力にしています。モデルの設定は、画面上に配置されたツールを選択したのち、左側の画面で確認できます。

スクリーンショット 2016-11-21 16.48.43

Required Parametersタブではモデル作成に関する基本的な情報を入れています。 Select the target variableで目的変数、すなわち予測対象の変数を選択しています。 Select the predictor variablesは特徴となる変数を選択します。これは複数選択可能です。 この2つは先ほど決定木の解説で行った、ツリーの分岐に使われるのがpredictor variables, 最終的な●×の値となるのがtarget variableとなっています。

次に、Model Customizationのタブを確認します。 こちらに関してはモデルのパラメータチューニングをするための項目となります。このデータに関しては、パラメータを変更してもあまり影響がないため、こちらに関しての詳細な説明は今回割愛します。 木の最大の深さや1つのノードに含むことができる最小のレコード数などが設定項目として存在しています。

スクリーンショット 2016-11-21 16.48.56

最後にRender Toolに接続することで、結果のレポーティングのためのファイルを作成してくれています。

Renderの結果

まずは上半分です。こちらはRの呼び出しや結果のテーブルなどがあります。

スクリーンショット 2016-11-21 17.13.39

一番上は実際に呼び出した関数です。モデル設定で指定した変数やパラメータが記載されています。 その次は作成したモデルに関するサマリ情報が簡単に記載されています。

Pruning Tableが木の階層ごとのそこで枝刈りしたとの各種結果です。 cpの値は実際には、「Call:」のところに表示されているものではなく、一番下にあるPruning Plotで最も低い値を利用しているようです。 Real Error, X Errorなどは今回は解説していませんでしたが、cpの計算にも利用されています。

Leaf Summaryはツリーを表現しています。

その下に2つのプロットがあります。決定木に関してはこちらでモデルの状況をつかむのが楽な気がします。 作成される木や各深さでのどれだけうまく行っていてなどが確認できます。

スクリーンショット 2016-11-21 16.00.51

スクリーンショット 2016-11-21 17.25.39

他のデータでやってみる

Sampleのデータではあまり枝分かれしなかったので他のデータでもやってみます。 簡単なデータになってしまいますが、動かしてみるにはちょうどいいということでIris Datasetを使ってみます。 Workflowは最低限の要素のみで構成してします。

スクリーンショット 2016-11-21 17.34.03

Select Toolを挟んでいるのは適切な型を与えてやるためです。

スクリーンショット 2016-11-21 17.35.26

実行すると同様のフォーマットの結果が得られます。

スクリーンショット 2016-11-21 17.37.55スクリーンショット 2016-11-21 17.38.13

結果の見方は同様です。今回はもう1段階深い階層ができました。

補足:Decision Treeの中身について

Decision Tree Toolの実態はマクロにになっているようです。 ツールを右クリックして Open Macro: を選択すると詳細が見れるのですが、こちらはかなり複雑な構造になっているようです。

このレベルのマクロの作成はかなり大変かもしれませんが、これは他のアルゴリズムも同様に実装可能である可能性が伺えます。

終わりに

AlteryxのDecision TreeのSampleを触ってみました。 結果を確認するにはある程度元のアルゴリズムを知っている必要性がありそうですが、プログラムの実装なしで実現することが可能です。 プログラムに詳しくないがデータの見方はわかっていて統計に関する知識も持っている人に有益なツールとなることと思います。

明日4日目は山口の『製品ラインナップ』の予定です。明日もお楽しみに!

参考