【Scikit-learn】決定木分析で学習(CART法)

この記事では、Pythonと機械学習ライブラリ「scikit-learn」を用いて、決定木分析で学習を行う方法について解説します。

決定木分析とは

決定木分析 (Decision Tree Analysis)とは、決定木と呼ばれるデータ構造を用いて分類や回帰を行う学習手法です。
アルゴリズムがシンプルで、学習結果を可視化たり、事前にデータを正規化する手間を省けるといった利点があります。
決定木分析はCART法ともいいます。

【詳細】決定木分析のアルゴリズム(分類・回帰・木構造)

今回は、Python言語とscikit-learnモジュールで決定木分析で実装してきます。

sklearn.tree.DecisionTreeClassifier クラス

scikit-learnでは、sklearn.tree.DecisionTreeClassifierクラスを使うことで決定木分析を実装できます。
その使い方は下記の通りです。

書式

sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, class_weight=None, presort=False)

※各パラメータに設定されてる値(=の後)はデフォルト値

パラメータ 内容
criterion ジニ係数「gini」か情報量「entropy」のどちらで分割するかを指定
splitter 各ノードの分割を「best (最適)」と「random (ランダム最適)」のどちらで行うか選択
max_features 最適な分割を探索する際に用いる特徴数の最大値
max_depth 決定木の深さの最大値
min_samples_split サンプルを枝に分割する数の最小値
min_samples_leaf サンプル1つが属する葉の数の最小値
min_weight_fraction_leaf 1つの葉に属する必要のあるサンプルの割合の最小値
max_leaf_nodes 作成する葉の数の最大値(指定した場合max_depthは無効化)
class_weight 各説明変数の重み
random_state 乱数のシードを指定(指定しない場合はnp.randomを利用)
presort 高速化の目的で事前に入力データのソートを行うかどうか

【参考文献】 http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

ソースコード

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import pandas as pd
from sklearn import tree

def main():
    # CSVファイルを取得
    data = pd.read_csv("data.csv", sep=",")

    # 説明変数(x1, x2に設定)
    variables = ['x1', 'x2']

    # 決定木の分類器を生成
    clf = tree.DecisionTreeClassifier()

    # 分類器にサンプルデータを入れて学習(目的変数はx)
    clf = clf.fit(data[variables], data['x3'])

    # 学習結果を出力
    with open('graph.dot', 'w') as f:
        f = tree.export_graphviz(clf, out_file=f)
        
if __name__ == "__main__":
    main()

data.csv

x1,x2,x3
45,17.5,30
38,17.0,25
41,18.5,20
34,18.5,30
59,16.0,45
47,19.0,35
35,19.5,25
43,16.0,35
54,18.0,35
52,19.0,40

実行結果

サンプルプログラムの実行結果は下記の通りです。
出力したファイル(dot形式)の中身のコードを以下のサイトに貼り付け、「Generate Graph」ボタンを押すと決定木のグラフを表示できます。
http://www.webgraphviz.com/

このように得られた学習結果を可視化しやすいのが決定木の特徴です。

関連記事
1 Scikit-learn入門・使い方
2 Scikit-learnをインストールする方法
3 Python入門 サンプル集
関連記事