- デシジョン ツリーは、 教師あり学習手法 これは分類問題と回帰問題の両方に使用できますが、ほとんどの場合、分類問題を解決する場合に好まれます。これはツリー構造の分類子です。 内部ノードはデータセットの特徴を表し、ブランチは決定ルールを表します そして 各リーフ ノードは結果を表します。
- デシジョン ツリーには 2 つのノードがあります。 意思決定ノード そして リーフノード。 デシジョン ノードは何らかの意思決定を行うために使用され、複数の分岐があります。一方、リーフ ノードはそれらの意思決定の出力であり、それ以上の分岐は含まれません。
- 決定またはテストは、指定されたデータセットの特徴に基づいて実行されます。
- これは、ツリーと同様にルート ノードから始まり、さらに枝を広げてツリー状の構造を構築するため、決定ツリーと呼ばれます。
- ツリーを構築するには、 CARTアルゴリズム、 を表します 分類および回帰ツリー アルゴリズム。
- デシジョン ツリーは単に質問をし、その答え (はい/いいえ) に基づいてツリーをさらにサブツリーに分割します。
- 以下の図は、デシジョン ツリーの一般的な構造を説明しています。
注: デシジョン ツリーには、数値データだけでなくカテゴリ データ (YES/NO) も含めることができます。
デシジョン ツリーを使用する理由
機械学習にはさまざまなアルゴリズムがあるため、特定のデータセットと問題に最適なアルゴリズムを選択することが、機械学習モデルを作成する際に覚えておくべき主なポイントです。デシジョン ツリーを使用する 2 つの理由は次のとおりです。
- デシジョン ツリーは通常、意思決定を行う際の人間の思考能力を模倣するため、理解しやすいです。
- デシジョン ツリーはツリー状の構造を示しているため、その背後にあるロジックを簡単に理解できます。
デシジョン ツリーの用語
デシジョン ツリー アルゴリズムはどのように機能しますか?
Javaのinstanceof
デシジョン ツリーでは、指定されたデータセットのクラスを予測するために、アルゴリズムがツリーのルート ノードから開始されます。このアルゴリズムは、ルート属性の値をレコード (実際のデータセット) 属性と比較し、その比較に基づいて分岐をたどって次のノードにジャンプします。
次のノードでは、アルゴリズムは属性値を他のサブノードと再度比較し、さらに先に進みます。ツリーのリーフ ノードに到達するまでプロセスが続行されます。以下のアルゴリズムを使用すると、プロセス全体をよりよく理解できます。
例: 内定を持っている候補者がいて、その内定を受け入れるかどうかを決定したいとします。したがって、この問題を解決するために、決定木はルート ノード (ASM による給与属性) から始まります。ルート ノードは、対応するラベルに基づいて、次の決定ノード (オフィスからの距離) と 1 つのリーフ ノードにさらに分割されます。次の決定ノードはさらに 1 つの決定ノード (Cab 機能) と 1 つのリーフ ノードに分割されます。最後に、意思決定ノードは 2 つのリーフ ノード (承認されたオファーと拒否されたオファー) に分割されます。以下の図を考えてみましょう。
属性選択の尺度
デシジョン ツリーを実装する際、ルート ノードとサブノードに最適な属性をどのように選択するかという主な問題が発生します。そこで、このような問題を解決するために、と呼ばれるテクニックがあります。 属性選択メジャーまたは ASM。 この測定により、ツリーのノードに最適な属性を簡単に選択できます。 ASM には次の 2 つの一般的な手法があります。
1. 情報の取得:
- 情報ゲインは、属性に基づいてデータセットをセグメント化した後のエントロピーの変化の測定値です。
- 特徴がクラスに関してどの程度の情報を提供するかを計算します。
- 情報利得の値に応じてノードを分割し、決定木を構築します。
- 決定木アルゴリズムは常に情報ゲインの値を最大化しようとし、最も高い情報ゲインを持つノード/属性が最初に分割されます。以下の式を使用して計算できます。
Information Gain= Entropy(S)- [(Weighted Avg) *Entropy(each feature)
エントロピ: エントロピーは、特定の属性の不純物を測定するための指標です。データのランダム性を指定します。エントロピーは次のように計算できます。
Entropy(s)= -P(yes)log2 P(yes)- P(no) log2 P(no)
どこ、
「プリムのアルゴリズム」
2. ジニ指数:
- ジニ指数は、CART (分類および回帰ツリー) アルゴリズムで決定木を作成する際に使用される不純物または純度の尺度です。
- 高いジニ指数と比較して、低いジニ指数を持つ属性が優先される必要があります。
- バイナリ分割のみが作成され、CART アルゴリズムは、Gini インデックスを使用してバイナリ分割を作成します。
- ジニ指数は以下の式を使用して計算できます。
Gini Index= 1- ∑<sub>j</sub>P<sub>j</sub><sup>2</sup>
枝刈り: 最適な意思決定ツリーの取得
枝刈りは、最適な決定木を得るためにツリーから不要なノードを削除するプロセスです。
ツリーが大きすぎると過学習のリスクが高まり、ツリーが小さいとデータセットの重要な特徴をすべて捉えられない可能性があります。したがって、精度を低下させることなく学習木のサイズを縮小する手法は枝刈りとして知られています。木には大きく分けて2種類あります 剪定 使用されているテクノロジー:
デシジョンツリーの利点
- 人間が実生活で何らかの意思決定を行う際にたどるのと同じプロセスに従うため、理解しやすいです。
- 意思決定に関連した問題を解決するのに非常に役立ちます。
- 問題に対して考えられるすべての結果について考えるのに役立ちます。
- 他のアルゴリズムと比べて、データ クリーニングの必要性が低くなります。
デシジョンツリーの欠点
- デシジョン ツリーには多くのレイヤーが含まれているため、複雑になります。
- オーバーフィッティングの問題がある可能性がありますが、これは次の方法で解決できます。 ランダムフォレストアルゴリズム。
- クラスラベルの数が増えると、決定木の計算の複雑さが増加する可能性があります。
デシジョン ツリーの Python 実装
次に、Python を使用してデシジョン ツリーを実装します。このために、データセット「」を使用します。 ユーザーデータ.csv 」、これは以前の分類モデルで使用しました。同じデータセットを使用することで、デシジョン ツリー分類子を次のような他の分類モデルと比較できます。 KNN SVM、 ロジスティック回帰など
手順も同じであり、以下に示します。
1. データの前処理ステップ:
以下は前処理ステップのコードです。
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv('user_data.csv') #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test)
上記のコードでは、データを前処理しました。データセットをロードした場所は次のようになります。
2. デシジョン ツリー アルゴリズムをトレーニング セットに適合させる
次に、モデルをトレーニング セットに適合させます。このために、 デシジョンツリー分類子 からのクラス sklearn.tree 図書館。以下はそのコードです。
zip用のLinuxコマンド
#Fitting Decision Tree classifier to the training set From sklearn.tree import DecisionTreeClassifier classifier= DecisionTreeClassifier(criterion='entropy', random_state=0) classifier.fit(x_train, y_train)
上記のコードでは、分類子オブジェクトを作成し、その中に 2 つの主要なパラメーターを渡しました。
これに対する出力は次のとおりです。
Out[8]: DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=0, splitter='best')
3. テスト結果の予測
次に、テスト セットの結果を予測します。新しい予測ベクトルを作成します y_pred。 以下はそのコードです。
#Predicting the test set result y_pred= classifier.predict(x_test)
出力:
Javaのstring.replaceall
以下の出力画像には、予測出力と実際のテスト出力が示されています。予測ベクトルには実際のベクトル値とは異なる値がいくつかあることがはっきりとわかります。これらは予測誤差です。
4. 結果の精度のテスト(混同行列の作成)
上記の出力では、いくつかの誤った予測があることがわかりました。そのため、正しい予測と誤った予測の数を知りたい場合は、混同行列を使用する必要があります。以下はそのコードです。
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
出力:
上の出力画像では、混同行列がわかります。 6+3= 9 件の間違った予測 そして 62+29=91 件の正しい予測。したがって、他の分類モデルと比較して、デシジョン ツリー分類器は優れた予測を行ったと言えます。
5. トレーニング セットの結果を視覚化します。
ここでは、トレーニング セットの結果を視覚化します。トレーニング セットの結果を視覚化するために、決定木分類器のグラフをプロットします。分類子は、ロジスティック回帰で行ったように、SUV 車を購入したユーザーまたは購入しなかったユーザーについて「はい」または「いいえ」を予測します。以下はそのコードです。
#Visulaizing the trianing set result from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('purple','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) fori, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('purple', 'green'))(i), label = j) mtp.title('Decision Tree Algorithm (Training set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
出力:
ディレクトリの名前を変更する
上記の出力は、残りの分類モデルとはまったく異なります。年齢と推定給与変数に応じてデータセットを分割する垂直線と水平線の両方があります。
ご覧のとおり、ツリーは各データセットをキャプチャしようとしていますが、これは過学習のケースです。
6. テスト セットの結果を視覚化します。
テスト セットの結果の視覚化は、トレーニング セットがテスト セットに置き換えられることを除いて、トレーニング セットの視覚化と同様です。
#Visulaizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('purple','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) fori, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('purple', 'green'))(i), label = j) mtp.title('Decision Tree Algorithm(Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
出力:
上の画像でわかるように、紫色の領域内に緑色のデータ ポイントがいくつかあり、その逆も同様です。したがって、これらは混同マトリックスで説明した誤った予測です。