【Python】CHAIDの決定木を実装して結果を可視化する

この記事は約5分で読めます。

 

こんにちは、ミナピピン(@python_mllover)です。今回はCHAIDという決定木のアルゴリズムを使って決定木分析をやってみたので、その過程で詰まった点とかをメモっておきます。

 

 

Scikit-learnの決定木

 

Scikit-learnでの決定木にはCART(指標:giniまたはentropy)他が採用されています。CARTは下記の2点を含め、さまざまな理由から使われていません。

 

  1. 2分岐のみのため単純すぎる
  2. 過学習させるアルゴリズムのため、小さすぎる区分が出現するので扱いにくい

 

一方CHAIDは初出は1980年で学習アルゴリズムの中で、最も古いものとして知られています。CARTやC5.0では過学習させてから枝刈りを行いますが、CHAIDでは過学習が起こるまえに木構造の生長を止めます。これによってCARTなどと違い小さなノードが出現しにくいです。

 

よくコンペとかだと精度を出すことが求められますが、実際のデータ分析の実務だと精度を出すより、要因分析のケースの方が多く、要因を可視化しやすい決定木は非常に重宝されます。

 

要因を把握することが決定木の主な使われ方であり、そんなときにCARTなどを使っても結果の決定木のノードが細分化されてしまい結果がうまく解釈できなくなるので、基本的に大まかに分類してくれるCHAIDを使っています。

 

PythonでCHAIDを実装する

 

というわけでいよいよCHAIDの決定木をPythonで実装してみましょう。前述したようにCHAIDのアルゴリズムはscikit-learnに含まれていないので、別のライブラリを使用します。

 

使用するデータ:https://github.com/beginerSE/titanic_sample

 

データの中身はkaggleのタイタニックのデータを欠損値を加工したものです。ダウンロードして適当な場所に配置してください。次に以下のライブラリをインストールします。

 

# ライブラリをインストール
$ pip install CHAID, graphviz
$ conda install orca

 

ここでインストールしているgraphvizとorcaは決定木を可視化するのに使用します。orcaはpipじゃなくてcondaコマンド推奨です。またgraphvizもインストールが少し厄介なライブラリで、rootにpathを通さないとエラーを吐くので注意してください。

 

参照記事:【Python】Window10でGaraphVizがインポートできないエラーの対処法

 

ANACONDAの環境構築に始まり、Pythonのモジュールエラーは大抵PATH絡みなので環境変数へのPathの通し方は知っておいて損はないと思います。

 

PythonでのCHAIDの決定木を実装するコードは以下になります。

 

from CHAID import Tree, NominalColumn
import plotly, os
import numpy as np
import pandas as pd
import orca

# データの読み込み
train = pd.read_csv('titanic_train_mod.csv')

df = train[["Pclass", "Sex", "Age", "Fare"]]
df.columns = ["Pclass", "Sex", "Age", "Fare"]
df['Survived'] = train['Survived']
independent_variable_columns = ["Pclass", "Sex", "Age", "Fare"]
dep_variable = 'Survived'

tree = Tree.from_pandas_df(df, dict(zip(independent_variable_columns, ['nominal'] * 3)), dep_variable, dep_variable_type='continuous')
tree.render(path='test.gv',view=True)

 

細かい部分は公式ドキュメントを参照してください。tree.render()の引数はview=Trueにすることで出力結果が画像として表示されます。Falseに変えるとディレクトリに出力されるだけになります。

 

ちなみにファイル名はpath=の部分で決めないと向こうが自動で決めるのですが、datetimeの時刻をそのままファイル名にしようとしているらしく内部でInvalid argumentを起こすので、ディレクトリだけでなくファイル名まで指定してあげましょう。(ここで2時間くらいハマりました笑)

 

そして、実行結果はこんな感じ↓、うーんSPSSとちょっと見せ方が違う。。。引数とかを弄れば変わるのかもしれないが如何せん情報がほぼ公式ドキュメントしかないので、ちょっと手間が掛かりそう。SPSSで分析したときの結果の違いと合わせて、気が向いたらまた調べるかもってところですね。まあとりあえずはSPSSでよさげ、SPSSがない会社の人は重宝しそうってところですかね?

 

 

 

 

 

 

コメント

タイトルとURLをコピーしました