デシジョン ツリーは機械学習アルゴリズムの一種で、主に、関連する属性に従って、指定されたデータ セットのツリー構造に似た決定メカニズムを生成します。
ツリー構造は、特徴量の分岐に従ってフォークを作成し、すべての特徴を走査する限り、カジュアルに生成できます。ツリーは決定木です。ただし、最適な決定木を生成するには、適切なルート ノードを選択する必要があります。
ルート ノードを選択するアルゴリズムの 1 つは ID3 アルゴリズムで、情報ゲインに基づいてフィーチャをルート ノードとして選択します。
情報エントロピーの定義: シャノンは、確率変数の不確実性の測定を意味するエントロピーの概念を提案しました。
説明によると、ここでの不確実性は実際には確率の問題を意味しており、この確率和を計算するためにエントロピーの計算式が使用されます。X が有限の値を持つ離散確率変数であり、その確率分布が次のようになると仮定します。
の場合、確率変数 X のエントロピーは次のように定義されます。
この式は少し奇妙に見えます。情報エントロピーを計算するとき、それは確率の合計である必要があり、最終的には 0 より大きい数値になります。この式にはなぜマイナス記号があるのですか?実際、ここでの確率は次のとおりであることがわかっています。 0 ~ 1 の数値。最大値は 1 を超えず、対数関数の範囲が 0 ~ 1 の場合、結果は以下に示すように負の数になります。
したがって、ここでのマイナス記号は負の数を正の数に変換するだけであり、最終結果は 0 より大きく、負の数ではありません。
エントロピーの結果は、情報の不確実性を説明することしかできません。エントロピーが大きいほど、情報の不確実性は大きくなり、サンプルの分布はより分散します。エントロピーが小さいほど、不確実性は小さくなり、サンプルはより集中します。
たとえば、次の例で標本分布に対応するエントロピーを見てみましょう。
上の図では、
1. すべてのサンプルは 1 色であるため、エントロピーの最終計算結果は 0 になります。
2. サンプルに赤色が混入している場合、最終的な計算結果は 0.811 となります。
3. サンプル内の赤と青は同じであり、その確率は 50% であるため、エントロピーの結果は 1 になります。
エントロピーの結果は、固有値ではなく、サンプルの結果に関連します。
情報ゲインの定義: 文字通りに言うと、それは差、情報ゲインの差であり、この情報ゲインの差は特徴と固有値に関連付けられる必要があります。ここで重みが生成され、固有値はサンプルに対応します。サンプル全体の割合。それは別のレベルの確率です。
定義は次のとおりです。特徴 a に次の可能な値、つまり分岐があるとします: { }。a が除算に使用される場合、v の分岐が生成されます。それらのうち、v 番目のブランチには、で示されるサンプル X に値が含まれるサンプルが含まれており、上記の情報エントロピーの定義に従ってエントロピーを計算できます。異なるサンプル サイズを持つ v 個の分岐があることを考慮し、各分岐の重み を仮定すると、特徴 a を使用してデータセット X を分割することによる情報利得を計算できます。
情報利得の意味は、サンプル全体の純度の向上の大きさを特徴aで分けることであり、改善が大きいほど優れた特徴であるため、決定木を構築する際にはこの特徴を優先します。現在のフィーチャを選択した後、そのフィーチャを削除し、すべてのフィーチャの分割が完了するまで残りのフィーチャを使用して新しい分割を作成し続ける必要があります。
具体的な例に基づいて、適切なルート ノードを選択する方法を見てみましょう。
以下に示すのは、銀行が融資対象者の年齢、職業、財産、融資状況に基づいて融資を許可するかどうかを決定する例です。
最初の表はサンプル状況であり、2 番目の表は最初の表に基づくサンプル統計です。
次に、上記の情報エントロピーと情報ゲインを使用して関連データを計算します。
全体的な情報エントロピー。これは、サンプル内の「はい」と「いいえ」の確率によって計算するだけで済みます。
Ent(X) = = 0.971
情報の獲得:
ゲイン(X, 年齢) =
ゲイン(X, ジョブ) =
ゲイン(X, 特性) =
ゲイン(X, ローンステータス) =
上記の計算プロセスは、次のコードで示されます。
from math import log2
def create_datasets():
datasets = [[0, 0, 0, 0, 'no'],
[0, 0, 0, 1, 'no'],
[0, 1, 0, 1, 'yes'],
[0, 1, 1, 0, 'yes'],
[0, 0, 0, 0, 'no'],
[1, 0, 0, 0, 'no'],
[1, 0, 0, 1, 'no'],
[1, 1, 1, 1, 'yes'],
[1, 0, 1, 2, 'yes'],
[1, 0, 1, 2, 'yes'],
[2, 0, 1, 2, 'yes'],
[2, 0, 1, 1, 'yes'],
[2, 1, 0, 1, 'yes'],
[2, 1, 0, 2, 'yes'],
[2, 0, 0, 0, 'no']]
labels = ['F-Age', 'F-Work', 'F-House', 'F-Loan', 'Target']
return datasets, labels
def calc_shannon_entropy(datasets):
data_len = len(datasets)
label_count = {}
for i in range(data_len):
label = datasets[i][-1]
if label not in label_count:
label_count[label] = 0
label_count[label] += 1
entropy = -sum([(p / data_len) * log2(p / data_len) for p in label_count.values()])
return entropy
def cal_condition_entropy(datasets, axis=0):
data_len = len(datasets)
feature_sets = {}
for i in range(data_len):
feature = datasets[i][axis]
if feature not in feature_sets:
feature_sets[feature] = []
feature_sets[feature].append(datasets[i])
condition_entropy = sum([(len(p) / data_len) * calc_shannon_entropy(p) for p in feature_sets.values()])
return condition_entropy
def info_gain(entropy, condition_entropy):
return entropy - condition_entropy
def info_gain_train(datasets, labels):
count = len(datasets[0]) - 1
entropy = calc_shannon_entropy(datasets)
best_feature = []
for i in range(count):
info_gain_i = info_gain(entropy, cal_condition_entropy(datasets, axis=i))
best_feature.append((i, info_gain_i))
print('feature : {},info_gain : {:.3f}'.format(labels[i], info_gain_i))
best_ = max(best_feature, key=lambda x: x[-1])
return labels[best_[0]]
if __name__ == '__main__':
datasets, labels = create_datasets()
ent = calc_shannon_entropy(datasets)
print('entropy : {}'.format(ent))
feature = info_gain_train(datasets, labels)
print('best feature : {}'.format(feature))
実行結果:
エントロピー : 0.9709505944546686
特徴 : F-Age,info_gain : 0.083
特徴 : F-Work,info_gain : 0.324特徴 : F-
House
,info_gain : 0.420 特徴 : F-Loan,info_gain : 0.363
最高の特徴 : F-House
決定木の生成プロセスでは、上記の部分はほんの始まりにすぎず、最適なルート ノードが見つかり、その後、他の特性に基づいて新しい適切なノードを再帰的に解決し続ける必要があります。