본문 바로가기

Python

Python - 의사결정나무(Decision Tree)

의사결정나무(Decision Tree)

- 의사결정나무는 분류함수를 의사결정 규칙으로 이뤄진 나무 모양으로 그리는 방법이다.

- 회귀와 분류 모두 사용될 수 있다.

- 의사결정나무 구성요소

뿌리마디(root node) : 시작되는 마디로 전체 자료를 포함

자식마디(child node) : 하나의 마디로부터 분리되어 나간 2개 이상의 마디들

부모마디(parent node) : 주어진 마디의 상위마디

끝마디(terminal node) : 자식마디가 없는 마디

중간마디(internal node) : 부모마디와 자식마디가 모두 있는 마디

가지(branch) : 뿌리마디로부터 끝마디까지 연결된 마디들

깊이(depth) : 뿌리마디부터 끝마디까지의 중간마디들의 수 

의사결정나무의 활용

1. 세분화

데이터를 비슷한 특성을 갖는 몇 개의 그룹으로 분할해 그룹별 특성을 발견

2. 분류

여러 예측 변수들에 근거해 관측 개체의 목표변수 범주르 몇 개의 등급으로 분류하고자 하는 경우

3. 예측

자료에서 규칙을 찾아내고 이를 이용해 미래의 사건을 예측하고자 하는 경우

4. 차원축소 및 변수선택

매우 많은 수의 예측 변수 중에서 목표 변ㅅ에 큰 영향을 미치는 변수들을 골라내고자 하는 경우

5. 교호작용효과의 파악

여러 개의 예측변수들을 결합해 목표변수에 작용하는 규칙을 파악하고자 하는 경우

 

- 의사결정나무의 장점 

1. 결과 설명이 쉽다.

2. 대용량 데이터에서도 빠르게 만들 수 있다.

3. 비정상 잡음 데이터에 대해서도 민감함이 없이 분류할 수 있다.

4. 한 변수와 상관이 높은 다른 불필요한 변수가 있어도 크게 영향을 받지 않는다.

5. 설명변수나 목표변수에 수치형변수와 범주형변수를 모두 사용 가능하다.

6. 모형 분류 정확도가높다.

 

- 의사결정나무의 단점

1. 새로운 자료에 대한 과대적합이 발생할 가능성이 높다.

2. 분류 경계선 부근의 자료값에 대해서 오차가 크다.

3. 설명 변수 간의 중요도를 판단하기 쉽지 않다. 

 

- 의사결정나무의 분리규칙

1. 이산형 목표변수

- 카이제곱 통계량 p값 : p값이 가장 작은 예측변수와 그 때의 최적 분리에 의해서 자식마디를 형성

ㄴ ((실제도수-기대도수)의 제곱/기대도수)

- 지니 지수 : 지니 지수를 감소시켜주는 예측변수와 그 때의 최적 분리에 의해서 자식마디를 형성

ㄴ 노드의 불순도를 나타내는 값이다. 

ㄴ 지니 지수의 값이 클수록 이질적이며, 순수도가 낮다고 볼 수 있다.

- 엔트로피 지수 : 엔트로피 지수가 가장 작은 예측 변수와 이 때의 최적 분리에 의해 자식마디를 형성 

ㄴ 열역학에서 쓰는 개념으로 무질서 정도에 대한 측도이다.

ㄴ 엔트로피 지수의 값이 클수록 순수도가 낮다고 볼 수 있다.

 

2. 연속형 목표변수

- 분산 분석에서 F 통계량 : p값이 가장 작은 예측 변수와 그 때의 최적 분리에 의해서 자식마디를 형성

- 분산의 감소량 : 분산의 감소량을 최대화 하는 기준의 최적 분리에 의해서 자식마디를 형성 

-

 

'''
    Decision Tree (의사결정나무)
    분기점(node) : 분석되는 설명 변수의 위치 
    UCI 데이터 : 암세포 진단 데이터 
    
'''
# 기본 라이브러리 불러오기
from sklearn import metrics
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
import pandas as pd
import numpy as np

'''
id : ID번호
clump : 덩어리 두께
cell_size : 암세포크기
cell_shape : 암세포모양
adhension : 한계
epithlial : 상피세포 크기
bare_nuclei : 베어 핵
chromatin : 염색질
normal_nucleoli : 정상세포
mitoses : 유사분열
class : 2(양성), 4(악성)
'''

# Breast Cancer 데이터셋 가져오기 (출처:UCI ML repository)
uci_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data'
df = pd.read_csv(uci_path, header=None)
df.columns=['id','clump','cell_size','cell_shape','adhension','epithlial','bare_nuclei','chromatin','normal_nucleoli','mitoses','class']
df.head()
df["class"].value_counts()
df["bare_nuclei"].unique()
df.info()


# bare_nuclei 가 obejct로 되어 있는 이유는 '?' 데이터가 존재하기 때문이다.
# 1. ? 데이터 값을 결측값으로 치환하기
# 2. nan이 속한 데이터의 행을 삭제하기
# 3. bare_nuclei 자료형을 int64로 변경
#1
df["bare_nuclei"].replace('?',np.nan,inplace=True)
#2
df.dropna(subset=["bare_nuclei"],axis=0,inplace=True)
#3
df["bare_nuclei"] = df["bare_nuclei"].astype("int")
df.info()
df.describe(include='all')

# 데이터셋 구분 - 훈련용 (train data) / 검증용 (test data)
# 속성 변수
X = df[['id','clump','cell_size','cell_shape','adhension','epithlial','bare_nuclei','chromatin','normal_nucleoli','mitoses']]
# 예측 변수 
Y = df['class']
# 속성 변수를 정규화
X = preprocessing.StandardScaler().fit(X).transform(X)
# 데이터 셋 분리
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3,random_state=10)


print("훈련데이터 갯수",X_train.shape)
print("훈련데이터 갯수",X_test.shape)


# Desicion Tree 분류 모형 - sklearn 사용
# criterion='entropy'
# 불순도 : 분류가 안되어 섞여 있는 상태 
# max_depth : 트리 단계 
tree_model = tree.DecisionTreeClassifier(criterion='entropy',max_depth=5)
tree_model.fit(X_train,y_train)
y_hat = tree_model.predict(X_test)
print(y_hat[0:10])
print(y_test.values[0:10])

tree_matrix = metrics.confusion_matrix(y_test,y_hat)
print(tree_matrix)
tree_report = metrics.classification_report(y_test, y_hat)
print(tree_report)


'''
의사결정트리 : 학습 데이터에 따라서 생성되는 데이터가 달라지므로 일반화하기 어렵다.
              데이터에 따라서 성능, 변동 폭이 크다. 
              => 단점 보안을 위한 알고리즘 : Random Forest(랜덤포레스트)
'''

'Python' 카테고리의 다른 글

Python - 시계열분석(TimeSeries)  (0) 2021.07.21
Python - 군집분석  (0) 2021.07.20
Python - SVM(서포트 벡터 머신)  (0) 2021.07.16
Python - KNN(K-Nearest-Neighbors)  (0) 2021.07.16
Python - 회귀분석(Regression)  (0) 2021.07.15