分類アルゴリズム-ディシジョンツリー

デシジョンツリーの概要

一般に、デシジョンツリー分析は、多くの領域に適用できる予測モデリングツールです。決定木は、さまざまな条件に基づいてさまざまな方法でデータセットを分割できるアルゴリズムアプローチによって構築できます。決定ストレスは、教師ありアルゴリズムのカテゴリに分類される最も強力なアルゴリズムです。

これらは、分類タスクと回帰タスクの両方に使用できます。ツリーの2つの主要なエンティティは、データが分割されて離れ、結果が得られる決定ノードです。年齢、食生活、運動習慣などのさまざまな情報を提供して、人が健康か不健康かを予測するための二分木の例を以下に示します。

上記の決定木では、質問は決定ノードであり、最終的な結果は葉です。次の2種類の決定木があります-

  • Classification decision trees−この種の決定木では、決定変数はカテゴリカルです。上記の決定木は、分類決定木の例です。

  • Regression decision trees −この種の決定木では、決定変数は連続的です。

デシジョンツリーアルゴリズムの実装

ジニ係数

これは、データセット内のバイナリ分割を評価するために使用されるコスト関数の名前であり、カテゴリのターゲット変数「Success」または「Failure」で機能します。

ジニ係数の値が高いほど、均一性が高くなります。完全なジニ係数値は0で、最悪は0.5です(2クラスの問題の場合)。分割のジニ係数は、次の手順を使用して計算できます-

  • まず、成功と失敗の確率の2乗の合計である式p ^ 2 + q ^ 2を使用して、サブノードのジニ係数を計算します。

  • 次に、その分割の各ノードの加重ジニスコアを使用して、分割のジニ係数を計算します。

分類および回帰ツリー(CART)アルゴリズムは、ジニ法を使用してバイナリ分割を生成します。

スプリットクリエーション

分割とは、基本的にデータセット内の属性と値を含むことです。次の3つの部分を使用して、データセットの分割を作成できます-

  • Part1: Calculating Gini Score −前のセクションでこの部分について説明しました。

  • Part2: Splitting a dataset−データセットを、属性のインデックスとその属性の分割値を持つ2つの行リストに分割することとして定義できます。データセットから右と左の2つのグループを取得した後、最初の部分で計算されたジニスコアを使用して分割の値を計算できます。分割値は、属性がどのグループに存在するかを決定します。

  • Part3: Evaluating all splits−ジニスコアを見つけてデータセットを分割した後の次の部分は、すべての分割の評価です。この目的のために、最初に、候補分割として各属性に関連付けられたすべての値をチェックする必要があります。次に、分割のコストを評価して、可能な限り最良の分割を見つける必要があります。最適な分割は、決定木のノードとして使用されます。

木の構築

私たちが知っているように、ツリーにはルートノードとターミナルノードがあります。ルートノードを作成した後、次の2つの部分でツリーを構築できます-

パート1:ターミナルノードの作成

デシジョンツリーのターミナルノードを作成する際の重要なポイントの1つは、ツリーの成長を停止するタイミング、またはさらにターミナルノードを作成するタイミングを決定することです。これは、次の2つの基準、つまり最大ツリー深度と最小ノードレコードを使用して実行できます。

  • Maximum Tree Depth−名前が示すように、これはルートノードの後のツリー内のノードの最大数です。ツリーが最大の深さに達したら、つまりツリーが最大数のターミナルノードを取得したら、ターミナルノードの追加を停止する必要があります。

  • Minimum Node Records−特定のノードが担当するトレーニングパターンの最小数として定義できます。ツリーがこれらの最小ノードレコードまたはこの最小値を下回ったら、ターミナルノードの追加を停止する必要があります。

ターミナルノードは、最終的な予測を行うために使用されます。

パート2:再帰的分割

ターミナルノードを作成するタイミングについて理解したので、ツリーの構築を開始できます。再帰的分割は、ツリーを構築する方法です。この方法では、ノードが作成されると、同じ関数を何度も呼び出すことで、データセットを分割して生成されたデータの各グループに子ノード(既存のノードに追加されたノード)を再帰的に作成できます。

予測

デシジョンツリーを構築した後、それについて予測する必要があります。基本的に、予測には、特別に提供されたデータの行を使用して決定木をナビゲートすることが含まれます。

上記のように、再帰関数を使用して予測を行うことができます。同じ予測ルーチンが、左ノードまたは子右ノードで再度呼び出されます。

仮定

以下は、デシジョンツリーを作成する際に行う仮定の一部です。

  • デシジョンツリーを準備している間、トレーニングセットはルートノードとして機能します。

  • 決定木分類器は、特徴値がカテゴリカルであることを優先します。連続値を使用する場合は、モデルを構築する前に離散化する必要があります。

  • 属性の値に基づいて、レコードは再帰的に配布されます。

  • 統計的アプローチを使用して、ルートノードまたは内部ノードなどの任意のノード位置に属性を配置します。

Pythonでの実装

次の例では、ピマインディアン糖尿病に決定木分類器を実装します-

まず、必要なpythonパッケージのインポートから始めます-

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

次に、次のようにWebリンクからアイリスデータセットをダウンロードします-

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
pima = pd.read_csv(r"C:\pima-indians-diabetes.csv", header=None, names=col_names)
pima.head()
pregnant    glucose  bp    skin  insulin  bmi   pedigree    age   label
0       6         148      72    35     0       33.6    0.627     50      1
1       1         85       66    29     0       26.6    0.351     31      0
2       8         183      64     0     0       23.3    0.672     32      1
3       1         89       66    23     94      28.1    0.167     21      0
4       0         137      40    35     168     43.1    2.288     33      1

ここで、データセットを次のように機能とターゲット変数に分割します-

feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

次に、データをトレイン分割とテスト分割に分割します。次のコードは、データセットを70%のトレーニングデータと30%のテストデータに分割します-

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

次に、sklearnのDecisionTreeClassifierクラスを使用して、次のようにモデルをトレーニングします。

clf = DecisionTreeClassifier()
clf = clf.fit(X_train,y_train)

最後に、予測を行う必要があります。次のスクリプトを使用して実行できます-

y_pred = clf.predict(X_test)

次に、精度スコア、混同行列、分類レポートを次のように取得できます。

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

出力

Confusion Matrix:
[[116 30]
[ 46 39]]
Classification Report:
            precision   recall   f1-score    support
      0       0.72      0.79       0.75     146
      1       0.57      0.46       0.51     85
micro avg     0.67      0.67       0.67     231
macro avg     0.64      0.63       0.63     231
weighted avg  0.66      0.67       0.66     231

Accuracy: 0.670995670995671

デシジョンツリーの視覚化

上記の決定木は、次のコードを使用して視覚化できます-

from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus

dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,
      filled=True, rounded=True,
      special_characters=True,feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('Pima_diabetes_Tree.png')
Image(graph.create_png())