Machine-learning-with-python-classification-algorithms-decision-tree

提供:Dev Guides
移動先:案内検索

分類アルゴリズム-決定木

デシジョンツリーの概要

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

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

デシジョンツリーの概要

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

  • 分類決定ツリー-この種の決定ツリーでは、決定変数はカテゴリーです。 上記の決定木は、分類決定木の一例です。
  • 回帰決定木-この種の決定木では、決定変数は連続的です。

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

ジニ指数

これは、データセット内のバイナリスプリットを評価するために使用されるコスト関数の名前であり、カテゴリターゲット変数「成功」または「失敗」と連動します。

Giniインデックスの値が高いほど、均質性は高くなります。 完全なGiniインデックス値は0で、最悪は0.5です(2クラスの問題の場合)。 スプリットのGiniインデックスは、次の手順の助けを借りて計算することができます-

  • まず、式_p ^ 2 + q ^ 2_を使用してサブノードのGiniインデックスを計算します。これは、成功と失敗の確率の2乗の合計です。
  • 次に、スプ​​リットの各ノードの加重Giniスコアを使用して、スプリットのGiniインデックスを計算します。

分類回帰ツリー(CART)アルゴリズムは、Giniメソッドを使用してバイナリ分割を生成します。

分割作成

分割には、基本的にデータセットの属性と値が含まれます。 次の3つの部分の助けを借りて、データセットに分割を作成できます-

  • パート1:Giniスコアの計算-前のセクションでこのパートについて説明しました。
  • パート2:データセットの分割-データセットを、属性のインデックスとその属性の分割値を持つ行の2つのリストに分割することとして定義できます。 データセットから2つのグループ(左右)を取得した後、最初の部分で計算されたGiniスコアを使用してsplitの値を計算できます。 分割値は、属性がどのグループに属するかを決定します。
  • パート3:すべての分割の評価-Giniスコアを見つけてデータセットを分割した後の次の部分は、すべての分割の評価です。 この目的のために、最初に、各属性に関連付けられているすべての値を分割候補として確認する必要があります。 次に、分割のコストを評価して、最適な分割を見つける必要があります。 最適な分割は、決定ツリーのノードとして使用されます。

ツリーを構築する

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

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

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

  • 最大ツリーの深さ-名前が示すように、これはルートノードの後のツリー内のノードの最大数です。 ツリーが最大深度に達したら、ターミナルノードの追加を停止する必要があります。 ツリーが最大数のターミナルノードを取得すると、
  • 最小ノードレコード-特定のノードが担当するトレーニングパターンの最小数として定義できます。 ツリーがこれらの最小ノードレコードに達するか、この最小値を下回ると、ターミナルノードの追加を停止する必要があります。

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

パート2:再帰的分割

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

予測

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

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

仮定

以下は、意思決定ツリーの作成中に行う仮定の一部です-

  • 決定木の準備中、トレーニングセットはルートノードとして使用されます。
  • 決定木分類器は、特徴値がカテゴリカルであることを好みます。 連続値を使用する場合は、モデル構築の前に離散化する必要があります。
  • 属性の値に基づいて、レコードは再帰的に配布されます。
  • 統計的アプローチを使用して、任意のノード位置、つまりルートノードまたは内部ノードに属性を配置します。

Pythonでの実装

次の例では、Pima Indian Diabetesにディシジョンツリー分類子を実装します-

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

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

次に、次のようにそのウェブリンクから虹彩データセットをダウンロードします-

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 33.6 0.627 50 1
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:
   [[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())

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