본문 바로가기
Data-driven Methodology/DS (Data Science)

[Data Science] 의사결정 트리 (Decision Tree) (3)

by goatlab 2022. 9. 27.
728x90
반응형
SMALL

트리 가지치기 (Tree Pruning)

 

의사결정 트리의 마지막 노드의 개수를 지정하여 트리의 깊이를 조정하는 방법이다. 클래스의 마지막 노드인 잎 노드 (leaf node)의 개수를 개발자가 직접 결정한다. 1개로 이루어진 잎 노드가 많을 경우 과대적합되어 있는 상태에서 잎 노드의 개수와 관계 없이 해당 가지에 불확실성이 너무 높을 경우 의사결정 트리의 성능에 문제를 줄 수 있다.

 

사전 가지치기 (pre-pruning) 처음 트리를 만들 때 트리의 깊이나 마지막 노드의 최소 개수 등을 사전에 결정하여 입력한다.
  • 데이터 분석가가 하이퍼 파라미터로 모든 값을 입력해야 하는 점이 어려움이 있다.
  • 계산 효율이 좋고 작은 데이터셋에서도 쉽게 작동한다.
  • 사용자가 중요한 속성 값을 놓치거나 과소적합 문제 발생할 수 있다.
사후 가지치기 (post-pruning) 트리를 먼저 생성한 후 실험적으로 하이퍼 파라미터를 조정한다.
  • 하나의 지표를 정해두고 실험적으로 다양한 하이퍼 파라미터로 조정하며 최적의 값을 찾는다.
  • ‘최종 노드의 개수’, ‘트리의 깊이’, 또는 ‘선택되는 속성의 개수’ 등을 하이퍼 파라미터로 보고 조정하며 성능을 비교한다.

 

연속형 데이터를 나누는 기준

 

  • 모든 데이터를 기준점으로 하여 데이터를 나누기 : 너무 많은 기준점이 생겨 과대적합 문제가 발생하거나 분류의 정확도가 떨어진다.
  • 통계적 수치로 중위값이나 4분위 수를 기준점으로 나누기 : 25%씩 데이터를 나눠서 분류 기준을 변경한다. 과소적합 문제가 발생하여 분류의 성능을 떨어뜨릴 수 있다.
  • 가장 많이 쓰는 방법으로, Y 클래스의 값을 기준으로 해당 값이 변할 때를 기준점으로 삼아 분기한다.

 

회귀 트리 (Regression Tree)

 

https://ko.wikipedia.org/wiki/%EA%B2%B0%EC%A0%95_%ED%8A%B8%EB%A6%AC_%ED%95%99%EC%8A%B5%EB%B2%95

 

Y 데이터의 값이 연속형일 때의 의사결정 트리 생성 방법이다.

 

• Y 값의 각 속성별 분산이 얼마나 작은지를 측정한다.

• 최종 결과 노드에서는 결과 노드들의 Y 평균값으로 최종 예상치를 반환한다.

Y 값의 각 속성별 분산이 얼마나 작은지를 측정

 

속성별 분산 구하기 위해 각 클래스 값들의 분산을 구하고 해당 클래스가 가진 데이터 개수의 비율만큼 곱한다.

 

 

Graphviz

 

https://graphviz.org/

 

Graphviz는 DOT 언어 스크립트로 지정된 그래프 그리기를 위해 AT&T 랩스 리서치가 시작한 오픈 소스 도구 패키지이다. 응용 소프트웨어가 도구를 사용할 수 있도록 라이브러리 또한 제공한다. Graphviz는 이클립스 퍼블릭 라이선스에 의해 허가된 자유 소프트웨어이다. https://graphviz.org/download/에서 os에 맞게 다운로드하고 conda install을 진행한다.

 

conda install python-graphviz

 

example

 

UTI_test.csv
0.00MB
UTI_train.csv
0.00MB

120명 요로 감염 의심 환자의 진단 케이스

  • 속성 : id, temperature (체온), nausea (오심 동반 여부), Lumbar_pain (요통 동반 여부 ), Urine_pushing (배뇨를 위한 푸 싱 필요 여부 ), Micturition_pain (배뇨통 여부), Burning_urethra (요도 작열감 여부), Class (최종 진단)
  • Class : B (방광염), R (신염), C (상하부 병발 감염), N (미진단)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

train = pd.read_csv('./UTI_train.csv')
train.head(5)

test = pd.read_csv('./UTI_test.csv')
test.head(5)

train.drop('id', axis = 1, inplace = True)
train.head(3)

test.drop('id', axis = 1, inplace = True)
test.head(3)

train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99
Data columns (total 7 columns):
 #   Column            Non-Null Count  Dtype  
---  ------            --------------  -----  
 0   Temperature       100 non-null    float64
 1   nausea            100 non-null    int64  
 2   Lumbar_pain       100 non-null    int64  
 3   Urine_pushing     100 non-null    int64  
 4   Micturition_pain  100 non-null    int64  
 5   Burning_urethra   100 non-null    int64  
 6   Class             100 non-null    object 
dtypes: float64(1), int64(5), object(1)
memory usage: 5.6+ KB
train.columns.values
array(['Temperature', 'nausea', 'Lumbar_pain', 'Urine_pushing',
       'Micturition_pain', 'Burning_urethra', 'Class'], dtype=object)
features = ['Temperature', 'nausea', 'Lumbar_pain', 'Urine_pushing', 'Micturition_pain', 'Burning_urethra']
X_train = train[features]
y_train = train[["Class"]]
X_test = test[features]
y_test = test[["Class"]]

DT1 = DecisionTreeClassifier(random_state=42)
DT1.fit(X_train, y_train)
from sklearn.tree import export_graphviz

export_graphviz(DT1, out_file="tree.dot",
                class_names="CLASS",\
                feature_names = features, impurity=True, filled=True)
import graphviz

with open("C:\\Users\\admin\\jupyter\\tree.dot") as f:
    dot_graph = f.read()
    
graphviz.Source(dot_graph)

DT2 = DecisionTreeClassifier(criterion="entropy",random_state=42)
DT2.fit(X_train, y_train)
with open("tree.dot") as f:
    dot_graph = f.read()
    
graphviz.Source(dot_graph)

pred = DT1.predict(X_test)
accuracy = accuracy_score(y_test , pred)
print('DT1 예측 정확도: ', accuracy)

pred = DT2.predict(X_test)
accuracy = accuracy_score(y_test , pred)
print('DT2 예측 정확도: ', accuracy)
DT1 예측 정확도:  0.95
DT2 예측 정확도:  1.0
728x90
반응형
LIST