Pythonによる決定木アルゴリズムの実装を詳しく説明していく

スポンサーリンク

こんにちは!今回は、Pythonで決定木の重要な概念に焦点を当てます。

では、さっそく始めましょう。

決定木は、予測を行うための最も簡単で最も一般的に使用されている教師あり機械学習アルゴリズムです。

決定木アルゴリズムは回帰問題だけでなく、分類問題にも使用されます。

読んで理解するのはとても簡単です。


スポンサーリンク

決定木とは

決定木とは、ある決定に対して、ある条件に基づいて考えられるすべての解決策をフローチャートのように木構造で表したものです。

ルートから始まり、木のようにいくつもの決定に枝分かれしていくので決定木と呼ばれる。

ツリーは、最も重要な属性が置かれるルートノードからスタートします。

枝は意思決定全体の一部を表し、各葉のノードが意思決定の結果を保持します。

P(+) = 3/10 and P(-) = 7/10

属性選択メジャー

属性選択メジャー(ASM)を用いて、最適な属性や特徴を選択します。

選択される属性は、ルートノードの特徴です。

属性選択尺度は、タプル間の識別に最適な属性を選択するための手法です。

各属性にランク付けを行い、最適な属性を分割基準として選択します。

最も一般的な選択方法は

  1. エントロピー
  2. 情報利得
  3. 利得率
  4. ジニ指数

1. エントロピー

情報利得を理解するためには、まず、エントロピーの概念を知る必要がある。

エントロピーとは、処理される情報のランダム性のことです。

分割の純度を測るものです。

エントロピーが大きくなると、情報から結論を導き出すことが難しくなる。

0から1の間であり、1は完全に不純な部分集合であることを意味します。

H(s)= -3/10 * log2 (3/10) - 7/10 * log2 ( 7/10)  ≈ 0.88

ここで、P(+) /P(-) = +ve クラスの % / -ve クラスの % です。

例えば、以下の様になります。

例: クラスに合計100個のインスタンスがあり,そのうち30個が陽性で70個が陰性であれば,次のようになる.

H(s) = -[ ( 5/10)  * log2 (5/10) +  (5/10) * log2 (5/10) ] = 1
H(s) = -[ ( 4/6) * log2 ( 4/6) + (2/6) * log2 (2/6) ] = 0.917

2. 情報利得

情報利得とは、エントロピーの減少のことです。

決定木は情報利得とエントロピーを利用して、どの素性をノードに分割すればより予測に近づくか、また分割をいつ止めるかを決定することができる。

H(s)= - [ ( 3/4) * log2 (3/4) + (1/4) * log2 (1/4) ] = 0.811

ここで、S はインスタンスの集合、A は属性、Sv は S の部分集合です。

例えば、以下の様になります。

例:

Net Entropy = (6/10) * 0.917 + (4/10) * 0.811 = 0.874

データ全体では、「はい」が5回、「いいえ」が5回です。

Total Reduction = 1- 0.874 = 0.126 

では、Trueの値を分析してみましょう。

Yesが4回、Noが2回です。

GR(S,A) = Gain( S,A)/ IntI(S,A)

偽の値の場合。

P(C1) = 0/6 = 0
P(C2) = 6/6 = 1
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn import tree
iris=load_iris()

この値( 0.126 )を情報利得と呼ぶ。

3. 利得率

利得率は、情報利得の修正です。

属性を選択する際に、枝の数と大きさを考慮します。

本質的な情報を考慮します。

print(iris.feature_names)

4. ジニ指数

ジニ指数もまた、情報利得を計算するのに役立つ基準の一種です。

これはノードの不純度を測定し、バイナリ値に対してのみ計算される。

['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

例えば、以下の様になります。

C1 = 0 , C2 = 6

print(iris.target_names)
['setosa' 'versicolor' 'virginica']

ジニ不純物はエントロピーより計算効率が良い。


Decision Tree Algorithms in Python

Pythonで決定木のいくつかを見てみましょう。

1. 反復的二分法3 (ID3)

このアルゴリズムは、情報利得を計算することによって分割を選択するために使用される。

木の各レベルの情報利得が再帰的に計算される。

2. C4.5

ID3 アルゴリズムを改良したアルゴリズム。

情報利得や利得比を利用して最適な属性を選択します。

連続属性と欠損属性の両方を扱うことができる。

3. CART (分類と回帰の木)

このアルゴリズムは、回帰木と同様に分類木も作成することができる。

分類木では、対象変数が固定されている。

回帰木では、対象変数の値が予測される。


Scikit-learnを用いた決定木分類。

scikit-learn ライブラリを使用してモデルを構築し、虹彩のデータセットを使用します。

データセットには3つのクラス、Iris Setosa, Iris Versicolour, Iris Virginica があり、以下の属性があります。

  • 萼片の長さ
  • セパルの幅
  • 花弁の長さ
    花弁の長さ * 花弁の幅

我々は、その属性に基づいてアヤメ科植物のクラスを予測する必要がある。

1. まず、必要なライブラリをインポートします。

#Spilitting the dataset
removed =[0,50,100]
new_target = np.delete(iris.target,removed)
new_data = np.delete(iris.data,removed, axis=0)

2. 次に、虹彩データセットをロードします。

#train classifier
clf = tree.DecisionTreeClassifier() # defining decision tree classifier
clf=clf.fit(new_data,new_target) # train data on new data and new target
prediction = clf.predict(iris.data[removed]) #  assign removed data as input

データセット中の全特徴を見るには、print 関数を使用します。

print("Original Labels",iris.target[removed])
print("Labels Predicted",prediction)

を結果を出力すると、以下の様になります。

Original Labels [0 1 2]
Labels Predicted [0 1 2]

データセットに含まれる全てのターゲット名を見るには

tree.plot_tree(clf)

結果は以下の通りです。

Add A Heading
Decision Tree for predicting if a person is fit or unfit.

3. ラベルの削除

ここで、0番目、50番目、100番目の位置の要素を削除します。

0 番目の要素は Setosa 種に、50 番目の要素は Versicolor 種に、100 番目の要素は Virginica 種に属しています。

このようにラベルを削除することで、決定木分類器をよりよく学習させ、データをうまく分類できるかどうかをチェックすることができます

Entropyyyy 1

4. 決定木分類器の学習

最後に、scikit-learnの決定木分類器を用いて分類を行います。

Gaineee

ここで、予測されたラベルが元のラベルと一致するかどうかを確認します。

1 2 3 4 5 6 7 8 9 10 1
Possession of TV at home against monthly income

結果は以下の通りです。

Gini Impu

なんと 我々のモデルの精度は100%です。

Giniiiiiiiii
Plott
Sphx Glr Plot Iris Dtc 002
Image Source : Scikit-learn docs

まとめ

この記事では、決定木の最適な属性の選択、情報利得、エントロピー、利得率、ジニ指数などの重要な概念について学習しました。

また、決定木アルゴリズムの種類と、scikit-learnを用いた決定木分類器の実装を理解しました。

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