결정 트리(Decision Tree)는 일종의 기계 학습 알고리즘으로, 관련 속성에 따라 주어진 데이터 세트에 대해 트리 구조와 유사한 결정 메커니즘을 주로 생성합니다.
트리 구조는 자연스럽게 생성될 수 있습니다. 즉, 특성 값의 분기에 따라 포크가 만들어지고 모든 특성이 순회되기만 하면 트리가 결정 트리입니다. 그러나 최적의 의사결정 트리를 생성하려면 적합한 루트 노드를 선택해야 합니다.
루트 노드를 선택하는 한 가지 알고리즘은 정보 획득을 기반으로 기능을 루트 노드로 선택하는 ID3 알고리즘입니다.
정보 엔트로피의 정의: Shannon은 무작위 변수의 불확실성 측정을 의미하는 엔트로피 개념을 제안했습니다.
설명에서 볼 때, 여기서의 불확실성은 실제로 확률의 문제를 의미하며, 이 확률 합을 계산하기 위해 엔트로피 계산 공식이 사용됩니다. X가 유한한 값을 갖는 이산 확률 변수이고 확률 분포가 다음과 같다고 가정합니다.
이면 확률 변수 X의 엔트로피는 다음과 같이 정의됩니다.
이 공식은 좀 이상해 보입니다. 정보 엔트로피를 계산할 때 확률 합이 되어야 하며, 이는 궁극적으로 0보다 큰 숫자입니다. 이 공식에 마이너스 기호가 있는 이유는 무엇입니까? 사실 여기서 우리는 확률이 0이라는 것을 알고 있습니다. 0-1 사이의 숫자. 최대값은 1을 초과하지 않으며 로그 함수는 0-1 범위에 있으며 결과는 아래와 같이 음수입니다.
따라서 여기서 빼기 기호는 음수를 양수로 변환하며 최종 결과는 음수가 아닌 0보다 큽니다.
엔트로피의 결과는 정보의 불확실성만을 설명할 수 있습니다. 엔트로피가 클수록 정보의 불확실성이 커지고 표본 분포가 더 분산되며, 엔트로피가 작을수록 불확실성이 작아지고 표본이 더 집중됩니다.
예를 들어, 다음 예를 통해 샘플 분포에 해당하는 엔트로피를 살펴보겠습니다.
위 그림에서 우리는
1. 모든 샘플은 단일 색상이므로 최종 엔트로피 계산 결과는 0입니다.
2. 샘플에 빨간색이 혼합되어 있는 경우 최종 계산 결과는 0.811입니다.
3. 표본에서 빨간색과 파란색은 동일하며 확률은 50%이므로 엔트로피 결과는 1입니다.
엔트로피 결과는 고유값이 아닌 표본 결과와 관련이 있습니다.
정보 획득의 정의: 말 그대로 차이, 정보 획득의 차이이며, 이 정보 획득 차이는 특징 및 고유값과 연결되어야 하며 여기서 가중치가 생성되고 고유값은 다음을 설명하는 샘플에 해당합니다. 전체 표본 비율. 또 다른 수준의 확률입니다.
정의는 다음과 같습니다. 특성 a에 다음과 같은 가능한 값, 즉 분기가 있다고 가정합니다. { }, 분할에 a를 사용하면 v 분기가 생성됩니다. 그 중 v번째 브랜치에는
로 표시된 샘플 X에 값이 있는 샘플이 포함되어 있으며, 위의 정보 엔트로피 정의에 따라 엔트로피를
계산할 수 있습니다 . 서로 다른 샘플 크기를 가진 v 개의 가지가 있다는 점을 고려하고 각 가지의 가중치를 가정하면 특성 a를 사용하여 데이터 세트 X를 나누는 데 따른 정보 이득을 계산할 수 있습니다.
정보 획득의 의미는 특징 a를 사용하여 전체 샘플의 순도 향상 정도를 나누는 것이며, 개선 정도가 클수록 특징이 더 좋은 것이므로 의사 결정 트리를 구축할 때 이 특징을 우선시합니다. 현재 기능을 선택한 후에는 해당 기능을 제거하고 모든 기능 분할이 완료될 때까지 나머지 기능을 계속 사용하여 새로운 분할을 만들어야 합니다.
구체적인 예를 바탕으로 좋은 루트 노드를 선택하는 방법을 살펴보겠습니다.
아래 그림과 같이 은행이 대출대상자의 연령, 직장, 부동산, 대출상태 등을 기준으로 대출 여부를 결정하는 샘플입니다.
첫 번째 표는 표본상황이고, 두 번째 표는 첫 번째 표를 기준으로 한 표본통계량이다.
그런 다음 위의 정보 엔트로피와 정보 이득을 사용하여 관련 데이터를 계산합니다.
전체 정보 엔트로피는 표본에서 예와 아니오의 확률로만 계산하면 됩니다.
엔트(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
의사결정 트리 생성 과정에서 위의 부분은 시작에 불과하며, 가장 적합한 루트 노드를 찾은 다음, 다른 특성을 기반으로 새로운 적합한 노드를 재귀적으로 계속해서 해결해야 합니다.