019_決定木分析においてCHAID、C5.0などのデータ分割のアルゴリズムの特徴を理解し、適切な方式を選定できる

解説

 決定木分析は、機械学習の手法の一つで、教師あり学習に分類されます。インプットデータを特定のルールに沿って分割していき、木構造を作ることで、分類予測と回帰予測を行います。決定木は、最終的な結果をグラフィカルに表現できるため、直感的に結果を理解しやすいメリットがあります。一方で、予測値の種類数が少ない(制限される)ことが欠点としてあげられます。

種類 特徴 適用事例
回帰木 目的変数が数値データの場合に用いられる 特定企業の株価予測
分類木 目的変数がカテゴリカルデータの場合に用いられる スパムメールとハムメールの分類

入力されたデータが、どのような木構造になるかは、複数ある機械学習アルゴリズムによって異なります。以下に、そのアルゴリズムの一覧を記載します。処理する対象データと以下の表を元に、どの機械学習アルゴリズムを使用すべきかを検討しましょう。

種類 分岐に利用する情報 分岐数 目的変数の型 説明変数の型 特徴
AID 2分岐まで 数値変数 数値変数・カテゴリカル変数 1971年に、Morganらにより考案された「自動交互作用検知」と呼ばれるアルゴリズムです。変数間の関連を統計的に検出することが目的でしたが、AIDからCHAIDへ発展し、それが決定木を構築するツールとして一般的に使われるようになりました。
CHAID カイ2乗値 3分岐以上可能 カテゴリカル変数 数値変数・カテゴリカル変数 1980年に、Perreaultらにより考案された「カイ2乗AID」と呼ばれる学習アルゴリズムです。学習アルゴリズムの中で、最も古いものとして知られています。CARTやC5.0では過学習させてから枝刈りを行いますが、CHAIDでは過学習が起こるまえに木構造の生長を止めます。
CART ジニ係数 2分岐まで 数値変数・カテゴリカル変数 数値変数・カテゴリカル変数 1984年にBreimanらによって考案された「分類木と回帰木生成器」と呼ばれる学習アルゴリズムです。CARTは、C5.0と並び、決定木を構築する代表的なアルゴリズムとして用いられています。CARTでは、過学習を避け、正確な予測モデルを構築するために、いったん木を生長させた後に枝刈りを行います。なお、scikit-learnでは、最適化したバージョンのCARTを実装しているため、Pythonによる実装が容易です。
ID3 エントロピー 2分岐まで カテゴリカル変数 数値変数・カテゴリカル変数 1986年に、Quinlanにより考案された「繰り返し2分木生成器」と呼ばれる学習アルゴリズムです。最も単純な機械学習アルゴリズムとしても知られているいます。ヒストリカル変数に対して情報量を用いて、木を構築します。
C4.5 エントロピー 3分岐以上可能 カテゴリカル変数 数値変数・カテゴリカル変数 1993年に、Quinlanにより考案されたID3の改善版となる学習アルゴリズムです。メモリ効率が良く、意思決定ツリーが小さく、またboostingと呼ばれる技術により高精度であることが利点です。また、欠測のあるデータをそのまま利用することができるのも利点の一つとしてあげられます。C4.5 は学習済みの木を if-then で表されるセットに変換し、評価や枝刈り (決定木の不要な枝を取り除く技術) に用いられます。
C5.0 エントロピー 3分岐以上可能 カテゴリカル変数 数値変数・カテゴリカル変数 C4.5の改善版で、決定木を構築する代表的なアルゴリズムのひとつです。C4.5に比べ、より効率的にメモリを使用することでパフォーマンスの改善が行われています。CARTとよく似ていますが、CARTでは常に2分木構造の決定木を生成しますが、C5.0では3分岐以上の木を生成することができます。

 

ステップアップ

決定木を学習する上で、前述したモデルのベースとして用いられるBaggingBoostingなどのアンサンブル法も理解しておくことが重要です。
アンサンブル学習とは、多く試行して平均を取ることで結果の偏りを軽減する学習の仕組みです。いずれの手法も「弱い学習器」を複数集め、それにより良い予測値を得ることを目指しており、過適合しにくいのが特徴です。
Baggingとは、1つの方法として、データを全てを使うのではなく、その一部を利用して学習し、それを何度も繰り返して最後に合わせる方法のことをいいます。
Boostingとは、たくさんの学習機械を組み合わせて統合学習機械を作ることで、モデルの予測精度を向上させる手法のことを言います。Boostingでは、前回の結果を利用するため、並列処理を行うことができません。なお、代表的なものにAdaBoostがあります。

キーワード

  • 決定木分析
  • 回帰木
  • 分類木
  • 機械学習アルゴリズム
  • AID
  • CHAID
  • CART
  • ID3
  • C4.5
  • C5.0
  • アンサンブル学習
  • Bagging
  • Boosting

ソースコード

dispersion.py:CARTアルゴリズムを用いて、irisの品種を予測(分類)するプログラム

# -*- coding: utf-8 -*-
from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.externals.six import StringIO
import pydotplus

# irisデータの取得
iris = load_iris()

def decision_tree_for_iris(iris):

    # 決定木のモデル作成(木の深さ)
    clf = tree.DecisionTreeClassifier(max_depth=4)
    clf = clf.fit(iris.data, iris.target)

    # 決定木のモデルに説明変数を与え、予測 (分類) を行う
    predicted = clf.predict(iris.data)

    print("説明変数[がく片の長さ がく片の幅 花びらの長さ 花びらの幅]")
    print(iris.data)

    print("目的変数[品種]")
    print(iris.target)

    # 予測(分類)結果
    print("予測結果")
    print(predicted)

    # 正答率の表示
    print("正答率")
    print(sum(predicted == iris.target) / len(iris.target))

    # 作成した決定木を可視化 (pydotplus パッケージを利用)
    dot_data = StringIO()
    tree.export_graphviz(clf, out_file=dot_data)
    graph = pydotplus.graph_from_dot_data(dot_data.getvalue())

    # PDFファイルの生成
    graph.write_pdf("/Users/hiro/Desktop/hal_data/graph.pdf")

if __name__ == "__main__":
    decision_tree_for_iris(iris)

このプログラムを実行すると、irisの品種を予測し、正答率を表示します。
また、pydotplusパッケージを利用してPDFファイルを生成します。

説明変数[がく片の長さ がく片の幅 花びらの長さ 花びらの幅]
[[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]
 [ 5.4  3.9  1.7  0.4]
 [ 4.6  3.4  1.4  0.3]
 [ 5.   3.4  1.5  0.2]
 [ 4.4  2.9  1.4  0.2]
 [ 4.9  3.1  1.5  0.1]
 [ 5.4  3.7  1.5  0.2]
 [ 4.8  3.4  1.6  0.2]
 [ 4.8  3.   1.4  0.1]
 [ 4.3  3.   1.1  0.1]
 [ 5.8  4.   1.2  0.2]
 [ 5.7  4.4  1.5  0.4]
 [ 5.4  3.9  1.3  0.4]
 [ 5.1  3.5  1.4  0.3]
 [ 5.7  3.8  1.7  0.3]
 [ 5.1  3.8  1.5  0.3]
 [ 5.4  3.4  1.7  0.2]
 [ 5.1  3.7  1.5  0.4]
 [ 4.6  3.6  1.   0.2]
 [ 5.1  3.3  1.7  0.5]
 [ 4.8  3.4  1.9  0.2]
 [ 5.   3.   1.6  0.2]
 [ 5.   3.4  1.6  0.4]
 [ 5.2  3.5  1.5  0.2]
 [ 5.2  3.4  1.4  0.2]
 [ 4.7  3.2  1.6  0.2]
 [ 4.8  3.1  1.6  0.2]
 [ 5.4  3.4  1.5  0.4]
 [ 5.2  4.1  1.5  0.1]
 [ 5.5  4.2  1.4  0.2]
 [ 4.9  3.1  1.5  0.1]
 [ 5.   3.2  1.2  0.2]
 [ 5.5  3.5  1.3  0.2]
 [ 4.9  3.1  1.5  0.1]
 [ 4.4  3.   1.3  0.2]
 [ 5.1  3.4  1.5  0.2]
 [ 5.   3.5  1.3  0.3]
 [ 4.5  2.3  1.3  0.3]
 [ 4.4  3.2  1.3  0.2]
 [ 5.   3.5  1.6  0.6]
 [ 5.1  3.8  1.9  0.4]
 [ 4.8  3.   1.4  0.3]
 [ 5.1  3.8  1.6  0.2]
 [ 4.6  3.2  1.4  0.2]
 [ 5.3  3.7  1.5  0.2]
 [ 5.   3.3  1.4  0.2]
 [ 7.   3.2  4.7  1.4]
 [ 6.4  3.2  4.5  1.5]
 [ 6.9  3.1  4.9  1.5]
 [ 5.5  2.3  4.   1.3]
 [ 6.5  2.8  4.6  1.5]
 [ 5.7  2.8  4.5  1.3]
 [ 6.3  3.3  4.7  1.6]
 [ 4.9  2.4  3.3  1. ]
 [ 6.6  2.9  4.6  1.3]
 [ 5.2  2.7  3.9  1.4]
 [ 5.   2.   3.5  1. ]
 [ 5.9  3.   4.2  1.5]
 [ 6.   2.2  4.   1. ]
 [ 6.1  2.9  4.7  1.4]
 [ 5.6  2.9  3.6  1.3]
 [ 6.7  3.1  4.4  1.4]
 [ 5.6  3.   4.5  1.5]
 [ 5.8  2.7  4.1  1. ]
 [ 6.2  2.2  4.5  1.5]
 [ 5.6  2.5  3.9  1.1]
 [ 5.9  3.2  4.8  1.8]
 [ 6.1  2.8  4.   1.3]
 [ 6.3  2.5  4.9  1.5]
 [ 6.1  2.8  4.7  1.2]
 [ 6.4  2.9  4.3  1.3]
 [ 6.6  3.   4.4  1.4]
 [ 6.8  2.8  4.8  1.4]
 [ 6.7  3.   5.   1.7]
 [ 6.   2.9  4.5  1.5]
 [ 5.7  2.6  3.5  1. ]
 [ 5.5  2.4  3.8  1.1]
 [ 5.5  2.4  3.7  1. ]
 [ 5.8  2.7  3.9  1.2]
 [ 6.   2.7  5.1  1.6]
 [ 5.4  3.   4.5  1.5]
 [ 6.   3.4  4.5  1.6]
 [ 6.7  3.1  4.7  1.5]
 [ 6.3  2.3  4.4  1.3]
 [ 5.6  3.   4.1  1.3]
 [ 5.5  2.5  4.   1.3]
 [ 5.5  2.6  4.4  1.2]
 [ 6.1  3.   4.6  1.4]
 [ 5.8  2.6  4.   1.2]
 [ 5.   2.3  3.3  1. ]
 [ 5.6  2.7  4.2  1.3]
 [ 5.7  3.   4.2  1.2]
 [ 5.7  2.9  4.2  1.3]
 [ 6.2  2.9  4.3  1.3]
 [ 5.1  2.5  3.   1.1]
 [ 5.7  2.8  4.1  1.3]
 [ 6.3  3.3  6.   2.5]
 [ 5.8  2.7  5.1  1.9]
 [ 7.1  3.   5.9  2.1]
 [ 6.3  2.9  5.6  1.8]
 [ 6.5  3.   5.8  2.2]
 [ 7.6  3.   6.6  2.1]
 [ 4.9  2.5  4.5  1.7]
 [ 7.3  2.9  6.3  1.8]
 [ 6.7  2.5  5.8  1.8]
 [ 7.2  3.6  6.1  2.5]
 [ 6.5  3.2  5.1  2. ]
 [ 6.4  2.7  5.3  1.9]
 [ 6.8  3.   5.5  2.1]
 [ 5.7  2.5  5.   2. ]
 [ 5.8  2.8  5.1  2.4]
 [ 6.4  3.2  5.3  2.3]
 [ 6.5  3.   5.5  1.8]
 [ 7.7  3.8  6.7  2.2]
 [ 7.7  2.6  6.9  2.3]
 [ 6.   2.2  5.   1.5]
 [ 6.9  3.2  5.7  2.3]
 [ 5.6  2.8  4.9  2. ]
 [ 7.7  2.8  6.7  2. ]
 [ 6.3  2.7  4.9  1.8]
 [ 6.7  3.3  5.7  2.1]
 [ 7.2  3.2  6.   1.8]
 [ 6.2  2.8  4.8  1.8]
 [ 6.1  3.   4.9  1.8]
 [ 6.4  2.8  5.6  2.1]
 [ 7.2  3.   5.8  1.6]
 [ 7.4  2.8  6.1  1.9]
 [ 7.9  3.8  6.4  2. ]
 [ 6.4  2.8  5.6  2.2]
 [ 6.3  2.8  5.1  1.5]
 [ 6.1  2.6  5.6  1.4]
 [ 7.7  3.   6.1  2.3]
 [ 6.3  3.4  5.6  2.4]
 [ 6.4  3.1  5.5  1.8]
 [ 6.   3.   4.8  1.8]
 [ 6.9  3.1  5.4  2.1]
 [ 6.7  3.1  5.6  2.4]
 [ 6.9  3.1  5.1  2.3]
 [ 5.8  2.7  5.1  1.9]
 [ 6.8  3.2  5.9  2.3]
 [ 6.7  3.3  5.7  2.5]
 [ 6.7  3.   5.2  2.3]
 [ 6.3  2.5  5.   1.9]
 [ 6.5  3.   5.2  2. ]
 [ 6.2  3.4  5.4  2.3]
 [ 5.9  3.   5.1  1.8]]
目的変数[品種]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
予測結果
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
正答率
0.993333333333

データセット

関連する記事