0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで学ぶ機械学習 入門編 #5 : 決定木(分類木)

Posted at

1.はじめに

今回から決定木ついて学習していきます。決定木は非常に汎用性が高く、多くの応用手法のもとになっている重要な分野です。実際にモデルを作成してみて理解を深めることを目的としています。
今回は実装した結果をもとに決定木とはどういうものなのかを理解していきます。

2.決定木とは

2.1. 決定木の直感的理解

まずは、決定木の仕組みを直感的に理解してみましょう。
決定木とは、特徴量に基づく条件分岐を繰り返して予測を行う、樹形図状のモデルです。
分類を行う決定木を分類木、回帰を行う決定木を回帰木と呼びます。

直感的な理解のための簡単な例として外出の有無を深さ2の木構造で表してみると以下のような図になります。

image.png
             図1.決定木の例

このように、特徴量(気温、天気など)を基準に条件分岐を行い、最終的な判断(外出する/しない)に到達する仕組みが決定木の基本的な考え方です。

2.2. CARTアルゴリズム

決定木では、どの条件や閾値(図1の「30℃」のような値)を使うかを、内部のアルゴリズムが自動的に決めていきます。
今回はCART(Classification and Regression Trees)と呼ばれるアルゴリズムを使って決定木を作成します。
CARTは、目的変数が連続値の場合は回帰木、カテゴリの場合は分類木として動作します。また他のアルゴリズムでは複数の分岐を生成できますがCARTは常に二分木を生成します。

不純度

CARTが、実際の分割をどのように選ぶのかを理解するには、分割の良し悪しを評価するための指標である 不純度 の考え方が重要になります。
不純度とは、ひとつのノードの中に異なるクラスがどれだけ混ざっているかを表す指標で、分類問題では、不純度の指標として ジニ指数ジニ不純度) を用いるのが一般的です。

ノード$t$のジニ不純度$I_G(t)$は、そのノードに含まれるデータがどれだけ混ざり合っているかを表す指標です。
クラス$j$の割合を$p(j|t)$とするとジニ不純度は次の式で計算されます。

    I_{G}(t) = 1 – \sum_{j} [p(j|t)]^2 \dotso(1)

すべてのサンプルが同じクラスならジニ不純度は 0 になり、クラスが混ざれば混ざるほど値が大きくなります。

分割の選び方

次に不純度を使い、分割の基準がどうなっているのか具体的に見ていきます。
CARTでは、ノードをどの特徴量でどの値で分割するかを決めるときに、**ジニ不純度の減少量(ΔI_G)**を基準にします。
例えば「気温」という特徴量なら、観測データを小さい順に並べ、その間の値を「ここで分けるとどうなるか」という候補として順番に試します。

決定木の一番上にある根ノードから分割を考えます。
根ノードにはすべてのデータが含まれているため、まず各特徴量についてどの値で分けたらうまく分類できるかを試すための候補点を作ります。
例えば「気温」という特徴量なら、観測データを小さい順に並べ、その間の値を「ここで分けるとどうなるか」という候補として順番に試します。

次に分割後の左右のノードのジニ不純度を求め、サンプル数で重み付き平均を計算し、分割後の全体不純度を求めます。
分割後の全体不純度は全体のサンプル数を$N$、左右のノードのサンプル数を$N_L$,$N_R$,左右のノードのジニ不純度を$I_G(t_L)$,$I_G(t_R)$とすると以下の式で求めることができます。

I_{after}=\dfrac{N_L}{N}I_G(t_L)+\dfrac{N_R}{N}I_G(t_R)

次に不純度の減少量を計算します。減少量は以下の式で求めます。
$I_G(parent)$は分割前のノードを表しています。

ΔI_G = I_G(parent)-I_{after}

$ΔI_G$が大きいほど「分割後のノードがより純粋になる」ことを意味します。
CARTはすべての候補の中から $ΔI_G$ が最大となる特徴量と閾値を選んで分割します。

ここまで式を使って説明しましたがより直感的に理解するために実装と可視化を行っていきます。

3.モデルの作成

3.1.データセットの準備

今回は前回に続きsklearnの Irisデータセット を使用します。
このデータセットはアヤメ(Iris)の3種類(setosa, versicolor, virginica)を分類するもので、サンプル数は150件(各クラス50件)です。
特徴量は次の4つです:
・sepal length(がく片の長さ)
・sepal width(がく片の幅)
・petal length(花びらの長さ)
・petal width(花びらの幅)

3.2 モデルの作成

以下のコードを実行します

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree

# 1. データセットの読み込み
iris = load_iris()
X = iris.data
y = iris.target

# 3. 分類木モデルの作成・学習
clf = DecisionTreeClassifier(max_depth=2, random_state=0)
clf.fit(X, y)

これでモデルの作成は完了しました。今回は深さ2(max_depth=2)としています。

4.可視化と解説

# 4. 可視化
plt.figure(figsize=(12, 8))
plot_tree(
    clf,
    feature_names=iris.feature_names,
    class_names=iris.target_names,
    filled=True,
    rounded=True,
)
plt.show()

結果
image.png

まず、可視化した決定木の一番上にある 根ノード を確認します。
根ノードには全150サンプルが含まれており、3つのクラス(setosa・versicolor・virginica)がそれぞれ 50 件ずつ含まれています。まだ分割を行っていないため、クラスは均等に混ざっています。

ジニ不純度がどのように計算されるかを具体的に見るために、根ノードのジニ不純度を求めてみましょう。

$
p(setosa) = p(versicolor) = p(virginica) = 50/150 = 1/3
$

式(1)に当てはめると、根ノードのジニ不純度は

$I_{G}(root) = 1 - ({1/3})^2- ({1/3})^2- ({1/3})^2 =0.667$

となります

式だけだと何をしているのかわかりにくいですが、具体例を使うと直感的に理解しやすくなります。

4.1. 最初の分割:petal width (cm) <= 0.8

次に、根ノードからの最初の分割を見ます。
CART は全ての特徴量と閾値を試し、不純度が最も下がる分割を選びます。

左ノード

まず、条件が True になる左側(オレンジ)のノードを確認します。
このノードの value は [50, 0, 0] となっており、setosa だけが含まれていることがわかります。この場合完全にsetosaだけを分けることができているのためジニ不純度は0になります。

右ノード

次に条件が False になる右側のノードを確認します。右側のノードには versicolor と virginica がそれぞれ 50 件ずつ含まれており、まだクラスは混ざった状態です。このノードのジニ不純度は0.5です。

ジニ不純度の減少量を計算してみる

ここでCART がどのように「良い分割」を選んでいるのかをより具体的に理解するために、分割前後でジニ不純度がどれだけ減ったのかを計算してみます。

・ 分割前(根ノード)
サンプル数:150
ジニ不純度:0.667

・ 分割後
左ノード(50サンプル、ジニ=0)
右ノード(100サンプル、ジニ=0.5)

重み付き平均ジニ不純度は、

I_{after}=\dfrac{50}{150}・0+\dfrac{100}{150}・0.5=0.333

不純度の減少量
$
ΔI_G=0.667 - 0.333 = 0.334
$

つまり、petal width ≤ 0.8 という分割により、不純度が 0.334 も減ったことがわかります。
CART は「不純度がどれだけ減るか」を指標にし、その減少量が最大となる特徴量と閾値を選びます。

4.2. 2回目の分割:petal width (cm) <= 1.75

右側のノードに対して、CART が選んだ次の分割はpetal width ≤ 1.75 です。
この分割により、versicolor が主に左、virginica が主に右に分かれますが、深さを 2 に制限しているため完全には分離しきれません。
可視化された結果でも、両方のノードに少しずつ他クラスが混ざっていることが確認できます。
ここまで内部の計算を見ていきましたが次に決定木のメリットとデメリットについて紹介します。

5.決定木のメリット・デメリット

5.1. メリット

決定木には様々なメリットがあります。決定木の最大のメリットは可視化のしやすさです。木構造になっているためどのように分割したのかを確認できるため分析過程がホワイトボックスとなり直感的な可視化が可能となります。
他にも以下のようなメリットがあります

  • 回帰、分類どちらともに対応可能
  • 複雑な前処理を必要としない
  • 特徴量の重要度が分かる
  • 外れ値に比較的強い

5.2. デメリット

決定木の代表的なデメリットは過学習しやすいという点です。特徴量が多かったりすると過学習を起こしてしまいます。
他にも以下のようなデメリットがあります。

  • 連続値の扱いで境界が階段状になる
  • 回帰では滑らかな予測ができない

6. まとめ

今回は 分類木Decision Tree Classifier)を実装しながら、その仕組みを具体的に理解することを目指しました。

決定木は、どの特徴量を使って、どのようにクラスを分割していくのかという 判断過程そのものを可視化できる のが大きな利点です。
機械学習モデルの中でも特に説明性が高く、データ分析における洞察や、非専門家への説明にも向いている手法だと言えます。

また、ジニ不純度を用いて「どの分割が最もデータをきれいに分けられるか」を評価し、候補となる全ての特徴量・全ての閾値を比較して最良の分割を選ぶという 分割の仕組み についても確認しました。

本記事で決定木の基本原理を理解しておくと、次に学ぶランダムフォレストや XGBoost などのアンサンブル学習の仕組みも格段に理解しやすくなります。
今後は、過学習を防ぐ工夫や、より高性能なモデルとの比較も扱っていきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?