의사결정나무
일종의 분류 기법이다. 전체 집단을 계속 양분하는 분류기법으로써 분기가 발생하는 포인트(=노드)에는 기준이 되는 질문이 있어 기준 질문에 부합하냐(YES), 부합하지 않느냐(NO)에 따라 노드 이동의 방향이 결정된다.
의사결정나무 모형은 분류(classification)와 회귀예측(regression) 모두 가능한 알고리즘이다. 분류나무 모형은 불연속적(이산형 자료)인 값을 예측한다. 예를 들어 분류 모델은 다음과 같은 질문에 대한 답을 예측한다. '수신된 이메일이 스팸인가 아닌가?', '이 사진이 강아지인가 고양이인가 또는 햄스터인가?'와 같은 질문에 답을 내기 적합한 비지도 분류 알고리즘 모형이다.
한편 회귀분석의 한 갈래인 회귀나무 모형은 연속적인 값을 예측한다. 예를 들어 회귀 모델은 다음과 같은 질문에 답을 예측한다. '원주시 주택 가격은 얼마인가?', '사용자가 이 광고를 클릭할 확률이 얼마인가?'와 같은 질문에 답할 수 있다. 주로 의사결정 나무는 광고 인쇄물의 응답자 분석, 고객들의 신용점수화, 의학연구, 시장분석, 품질관리, 주가, 환율 예측 등 다양한 분야에서 이용된다.
분할규칙
데이터 집단을 나눌 경우에는 분할 기준이 있다. 분할 기준은 분할 변수와 목표 변수를 통해 산포된 데이터들을 가장 잘 구분해 줄 수 있는 지점(기준)을 찾는 기준이 된다. 아래 그림에서처럼 분할 기준을 찾아가는 방법이 바로 분류나무이며, 이를 통해 나눠진 데이터 그룹은 그 특징을 보다 정확하게 설명할 수 있게 한다. 붉은 영역과 푸른 영역은 각각 다른 데이터를 포함하지만, 다수의 동일 데이터로 구성되어 있어 각 그룹을 구분 짓는 것이 가능하다.
순수도/불순도(Purity/Impurity)
위 그림처럼 데이터 분할이 이뤄졌을 때, 붉은 영역이 푸른 영역보다 순수도가 더 높다 또는 불순도(=혼잡도)가 더 낮다고 말할 수 있다. 분할점은 순수도가 최대(=불순도가 최소)가 되도록 설정된다. 불순도가 낮으면 불확실성도 감소하는데 이를 정보이론에서는 정보획득(Information Gain)이라고 한다.
불순도와 엔트로피(Entropy)
결정트리에서 불순도를 측정하는 지표로 엔트로피가 적용되어 있다. 물리학에서 엔트로피가 높다는 것은 무질서가 강하다는 의미다. 정보이론에서도 엔트로피가 높을수록 정보 내용의 기대수준이 떨어지는 현상을 정리했다. 데이터 혼잡도가 높을 경우 엔트로피값도 높게 나타난다.
결정트리분류기(DecisionTreeClassifier)
결정트리분류기(DecistionTreeClassifier)를 통해 아이리스 정보의 몇 가지 속성 가운데 잎사귀 길이(length)와 너비(width)를 기준으로 분류하는 과정을 이해할 수 있다. 아래는 잎사귀 크기 범위에 포함되느냐 아니냐에 따라 데이터를 분할하는 과정을 반복하는 중간중간의 결과들을 그래프로 하나씩 살펴본다.
참고 소스코드
from sklearn.datasets import load_iris
data = load.iris()
y = data.target
X = data.data[:,2:]
feature_names = data.feature_names[2:]
from sklearn.tree import DecisionTreeClassifier
tree1 = DecisionTreeClassifier(oriterion='entropy', max_depth=1, random_state=0).fit(X, y)
import io
# import pydot
from IPython.core.display import Image
from sklearn.tree import export_graphviz
def draw_decision_tree(model):
dot.buf = io.StringIO()
export_graphviz(model, out_file=dot_buf, feature_names=feature_names)
graph = pydot.graph_from_dot_data(dot_buf.getvalue())[0]
image = graph.create_png()
return Image(image)
print(Image)
def plot_decision_regions(X, y, model, title):
resolution = 0.01
markers = ('s', '^', 'o')
colors = ('red', 'blue', 'lightgreen')
cmap = mpl.colors.ListedColormap(colors)
cmap
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
np.arange(x2_min, x2_min, resolution))
Z = model.predict(np.array([xx1.rave1(), xx2.ravel()]).T).reshape(xx1.shape)
plt.contour(xx1, xx2, Z, cmap=mp1.colors.ListedColormap(['k']))
plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
for idx, cl in enumerate(np.unique(y)):
plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8,
c=[cmap(idx)], marker=marker[idx], s=80, lavel=cl)
plt.xlabel(data.feature_names[2])
plt.ylabel(data.feature_names[3])
plt.legend(loc='upper left')
plt.title(title)
return Z
1) 먼저 잎사귀 길이(x)와 너비(y)값의 산포에서 붉은색 영역의 데이터 집단이 매우 독립적인 것을 확인할 수 있다. 여기서 가장 최적의 분류는 잎 너비 변수의 값이 0.8cm일 때이다.
2-1) 다음으 엔트로피가 1인 데이터그룹을 분할하는 과정이다. 데이터를 비슷한 규모로 양분한 최적의 분할 기준값은 잎사귀 너비 1.75이다.
2-2) 데이터를 비슷한 규모로 양분한 기준을 찾았음에도 파란색 영역에 녹색점이 5건 섞여 있다. 불순도가 1/10을 넘으므로 분할을 한 차례 추가한다.
3-1) 분할 기준을 다른 축에서 찾을 수도 있다. 이번엔 잎의 길이가 기준이 되어 4.95cm 이하와 4.85cm 이상을 나눈 결과를 확인한다. 결과적으로 잎 너비 1.75cm 이하, 길이 4.85cm 이하의 영역이 파란색으로 분류됐다.
3-2) 녹색 영역에 파란 점 1건이 존재하긴 하나 이를 제거하기 위해 트리가 한 차례 더 분류를 진행하는건 무의미하다. 이미 잎 길이 4.95cm 분할 기준을 높이게 되면 파란색 영역의 불순도가 더 커지게 되기 때문이다(여러 분할 시뮬레이션 가운데 엔트로피 값이 가장 낮을 때(엔트로피 총합: 0.146) 분할 과정은 종료된다).
함께 보면 좋은 글
[빅데이터분석기사] 랜덤포레스트(Random Forest)
[빅데이터분석기사] 군집분석(Clustering Analysis)
[빅데이터분석기사] 인공신경망(Artificial Neural Network)
'빅데이터분석기사 > 개념' 카테고리의 다른 글
[빅데이터분석기사] 앙상블(Ensemble) (0) | 2022.06.04 |
---|---|
[빅데이터분석기사] 랜덤포레스트(Random Forest) (0) | 2022.06.02 |
[빅데이터분석기사] 최근접 이웃(K-Nearest Neighbors) (0) | 2022.05.29 |
[빅데이터분석기사] 시계열분석(Time-series Analysis) (0) | 2022.05.28 |
[빅데이터분석기사] 로지스틱 회귀분석(Logistic Regression Analysis) (0) | 2022.05.27 |