Decision Trees


Tree Based Model


1. Cardinality

Q . Cardinality의 뜻은?
A . 특정 데이터 집합의 유니크( Unique )한 값의 개수이다. 범주형 데이터에서 많은 범주를 가지는 카테고리 특성들이 있는지 확인한다.

train.describe(exclude='number').T.sort_values(by='unique')

2. Pipeline

Q . Pipeline이란?
A . 데이터 사전 처리 및 분류의 모든 단계를 포함하는 단일 개체를 만든다.

  • 여러 ML 모델을 같은 전처리 프로세스에 연결시킬 수 있다.
  • 그리드서치(grid search)를 통해 여러 하이퍼파라미터를 쉽게 연결할 수 있다.
from sklearn.pipeline import make_pipeline

pipe = make_pipeline(
    OneHotEncoder(), 
    SimpleImputer(), 
    StandardScaler(), 
    LogisticRegression(n_jobs=-1)
)
pipe.fit(X_train, y_train)

print('검증세트 정확도', pipe.score(X_val, y_val))

y_pred = pipe.predict(X_test)
  • named_steps : 유사 딕셔너리 객체(dictionary-like object)로 파이프라인 내 과정에 접근 가능하도록 한다.
import matplotlib.pyplot as plt

model_lr = pipe.named_steps['logisticregression']
enc = pipe.named_steps['onehotencoder']
encoded_columns = enc.transform(X_val).columns
coefficients = pd.Series(model_lr.coef_[0], encoded_columns)
plt.figure(figsize=(10,30))
coefficients.sort_values().plot.barh();

3. Decision Tree

Q . Decision Tree( 결정트리 )란 ?
A . 스무고개를 하는 것과 같이 특성들의 수치를 가지고 질문을 통해 정답 클래스를 찾아가는 과정이다.

  • 결정트리(의사결정나무) 모델은 특성들을 기준으로 샘플을 분류해 나가는데 그 형태가 나무의 가지가 뻗어나가는 모습과 비슷해서 결정트리라는 이름을 가지고 있다.

  • 질문이나 말단의 정답을 노드( node ), 노드를 연결하는 선을 엣지( edge )라고 한다.
  • 각 노드( node )는 뿌리( root ), 중간( internal ), 말단( external, leaf, terminal ) 노드로 나뉠 수 있다.

3.1 Decision Tree의 장점

  • 결정트리는 분류와 회귀문제 모두 적용 가능
  • 결정트리는 데이터를 분할해 가는 알고리즘이다.
  • 분류 과정은 새로운 데이터가 특정 말단 노드에 속한다는 정보를 확인한 뒤 말단노드의 빈도가 가장 높은 범주로 데이터를 분류한다.
  • 결정트리는 분류과정을 트리구조로 직관적으로 확인이 가능한 장점이 있다.

3.2 Decision Tree 학습 알고리즘

  • 결정트리의 비용함수를 정의하고 그것을 최소화 하도록 분할하는 것이 트리모델 학습 알고리즘이다.
  • 비용함수 중에서 주로 지니불순도( Gini Impurity or Gini index )와 엔트로피( Entropy )가 자주 쓰인다.

* 지니불순도( Gini Impurity or Gini Index ) :

IG(p)=i=1Jpi(1pi)=1i=1Jpi2{\displaystyle {I}_{G}(p)=\sum _{i=1}^{J}p_{i}(1-p_{i})=1-\sum _{i=1}^{J}{p_{i}}^{2}}

* 엔트로피( Entropy ) :

H(T)=IE(p1,p2,...,pJ)=i=1Jpilog2pi{\displaystyle \mathrm {H} (T)=\operatorname {I} _{E}\left(p_{1},p_{2},...,p_{J}\right)=-\sum _{i=1}^{J}{p_{i}\log _{2}p_{i}}}

Q . 불순도( Impurity )란?
A . 여러 범주가 섞여 있는 정도를 말한다.
ex)
1. A : B = 45% : 55%
2. A : B = 80% : 20%
라고 했을 때, 2번이 불순도가 더 낮다.

불순도가 낮은경우 지니불순도나 엔트로피는 낮은값을 가지게 됩니다. 결국 노드를 분할하는 시점에서 가장 비용함수를 줄이는 분할특성과 분할지점을 찾아 내는 프로세스가 필요하다.

분할에 사용할 특성이나 분할지점( 값 )은 타겟변수를 가장 잘 구별해 주는( 불순도의 감소가 최대가 되는, 정보획득이 가장 큰 )것을 선택한다.

정보획득( Information Gain )은 특정한 특성을 사용해 분할했을 때 엔트로피의 감소량을 뜻한다.

  • IG(T,a)=H(T)H(Ta)={\displaystyle IG(T,a)=\mathrm {H} {(T)}-\mathrm {H} {(T|a)}} = 분할전 노드 불순도 - 분할 후 자식노드 들의 불순도

from sklearn.tree import DecisionTreeClassifier

pipe = make_pipeline(
    OneHotEncoder(use_cat_names=True),  
    SimpleImputer(),
    DecisionTreeClassifier(random_state=1, criterion='entropy')
)

pipe.fit(X_train, y_train)
print('훈련 정확도: ', pipe.score(X_train, y_train))
print('검증 정확도: ', pipe.score(X_val, y_val))
  • 만들어진 트리 확인하기
# graphviz 설치방법: conda install -c conda-forge python-graphviz
import graphviz
from sklearn.tree import export_graphviz

model_dt = pipe.named_steps['decisiontreeclassifier']
enc = pipe.named_steps['onehotencoder']
encoded_columns = enc.transform(X_val).columns

dot_data = export_graphviz(model_dt
                          , max_depth=3
                          , feature_names=encoded_columns
                          , class_names=['no', 'yes']
                          , filled=True
                          , proportion=True)


display(graphviz.Source(dot_data))

Q . 표준화 과정은 필요없는 이유는 ?
A . 스케일에 구애받지 않기에 표준화를 하는건 의미가 없다.

Q . 트리모델이 과접합이 되기 쉬울까?
A . 복잡한 트리는 과적합 가능성을 높이기 때문에 복잡도를 낮추어 일반화를 유도한다.

  • 과적합을 줄여주는 하이퍼파라미터
    • min_samples_split
    • min_samples_leaf : 말단 노드에 최소한 존재해야 하는 샘플들의 수를 정해준다.
    • max_depth

3.3 특성중요도

  • 선형모델에서는 회귀 계수( coefficient ), 트리모델에서는 특성중요도( feature importance )
  • Feature importance는 항상 양의 값을 가진다.
  • 이 값을 통해 특성이 얼마나 일찍 그리고 자주 분기에 사용되는지 결정된다.
# decisiontreeclassifier의 step에 접근한다.
model_dt = pipe.named_steps['decisiontreeclassifier']

# importances를 시각화
importances = pd.Series(model_dt.feature_importances_, encoded_columns)
plt.figure(figsize=(10,30))
importances.sort_values().plot.barh();
  • 결정트리모델은 선형모델과 달리 비선형, 비단조(non-monotonic), 특성상호작용(feature interactions) 특징을 가지고 있는 데이터 분석에 용의합니다

Q . 특성상호작용( feature interaction )이란?
A . 특성상호작용은 특성들끼리 서로 상호작용을 하는 경우를 말한다. 회귀분석에서는 서로 상호작용이 높은 특성들이 있으면 개별 계수를 해석하는데 어려움이 있고 학습이 올바르게 되지 않을 수 있다. 하지만, 트리모델은 이런 상호작용을 자동으로 걸러내는 특징이 있다.



👉 과정 한눈에 보기

profile
기록하지 않으면 기록되지 않는다.

0개의 댓글