데이터로그😎

2. Decision Tree 본문

머신러닝/지도 학습

2. Decision Tree

지연v'_'v 2023. 9. 4. 13:53
  • 회귀, 분류에 모두 사용 가능
  • ‘정보 균일도’ 라는 룰을 기반으로 하고 있어 알고리즘이 직관적임.
정보균일도 측정 지표 정의
정보이득지수
  • 1-엔트로피 지수(혼잡도, 서로 다른값많으면 엔트로피 높음)
  • 결정트리는 정보이득지수가 높은 속성을 기준으로 분할
  • 정보이득지수↑ 데이터 균일도 ↑
지니계수
  • 불평등지수
  • 0 가장 평등 → 1 불평등
  • 결정트리는 지니계수가 낮은 속성을 기준으로 분할
  • 지니계수↓ 데이터 균일도↑

 

  • Decision Tree Classification의 파라미터
    • min_samples_split
      • 노드를 분할하기 위해 필요한 최소한의 샘플 수
      • min_samples_split=2로 설정하면 노드를 분할하려면 적어도 2개의 샘플이 있어야 함
      • 값을 늘리면 트리의 깊이가 줄어들고 모델이 더 간단해지며, 과적합을 줄일 수 있음
      • 작은 값은 더 복잡한 트리를 생성할 수 있
    • max_depth
      • 결정 트리의 최대 깊이를 제한
      • 모델의 복잡성을 제어하고 과적합을 방지할 수 있음
    • min_samples_leaf
      • 리프 노드(마지막 노드)에 필요한 최소한의 샘플 수
      • 리프 노드의 샘플 수가 이 값보다 작으면 더 이상 분할하지 않음
      • 결정 트리의 리프 노드의 크기를 제한하고 과적합을 방지할 수 있
    • max_features
      • 각 노드에서 분할을 고려할 때 고려할 최대 특성(변수)의 수
      • 이 값을 조절하여 모델이 무작위성을 가지도록 할 수 있음
      • 모델의 다양성을 높일 수 있고 과적합을 줄일 수 있음

데이터 로드

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris_data = load_iris()

X_train, X_test, y_train, y_test = train_test_split(
  iris_data.data,
  iris_data.target,
  test_size=0.2,
  random_state=11
)

 

결정트리 학습(fit)

from sklearn.tree import DecisionTreeClassifier

dt_clf = DecisionTreeClassifier()
dt_clf.fit(X_train,y_train)

 

결정트리 시각화 (Graphviz)

from sklearn.tree import export_graphviz

export_graphviz(
        dt_clf,
        out_file = 'tree11.dot',
        class_names= iris_data.target_names,
        feature_names = iris_data.feature_names,
        impurity= True,
        filled= True)
import graphviz

with open('tree11.dot') as f:
    dot_graph = f.read()

graphviz.Source(dot_graph)

 

 

예측(predict) & 모델 평가 (accuracy 확인)

from sklearn.metrics import accuracy_score

train_pred = dt_clf.predict(X_train)
test_pred = dt_clf.predict(X_test)

print('훈련 세트에 대한 점수: {:.3f}'.format(accuracy_score(y_train, train_pred)))
print('테스트 세트에 대한 점수: {:.3f}'.format(accuracy_score(y_test, test_pred)))

>>결과:

훈련 세트에 대한 점수: 1.000   
#----> 과적합!!!!! max_depth통해 과적합 해결
# fit을 X_train, y_train으로 했는데,,, 당연한거 아닐까..?
테스트 세트에 대한 점수: 0.933

 

max_depth 이용한 질문의 깊이 제어 (과적합 해결)

dt_clf_depth_2 = DecisionTreeClassifier(max_depth=2).fit(X_train,y_train)


train_pred = dt_clf_depth_2.predict(X_train) # 알고 있는 데이터에 대한 예측
test_pred  = dt_clf_depth_2.predict(X_test)  # 새로 보는 데이터에 대한 예측

print("훈련 세트에 대한 점수 : {:.3f}".format(accuracy_score(y_train, train_pred)))
print("테스트 세트에 대한 점수 : {:.3f}".format(accuracy_score(y_test, test_pred)))

>> 결과:
훈련 세트에 대한 점수 : 0.967
테스트 세트에 대한 점수 : 0.867

 

각 피처 중요도 확인

dt_clf.feature_importances_
>>>array([0.02500521, 0.        , 0.55490281, 0.42009198])
##    sepal_length  sepal width    petal length  petal width

 

피처 중요도 시각화

import seaborn as sns
import numpy as np
%matplotlib inline

print("feature importances:\n{0}".format(np.round(dt_clf.feature_importances_,3)))

for name, value, in zip(iris_data.feature_names, dt_clf.feature_importances_):
    print(name, value)
    
sns.barplot(x=dt_clf.feature_importances_, y=iris_data.feature_names)

'머신러닝 > 지도 학습' 카테고리의 다른 글

4-1. Voting  (0) 2023.09.04
4. Ensemble (앙상블)  (0) 2023.09.04
3. Logistic Regression  (0) 2023.09.04
0. 분류(Classification)  (0) 2023.09.04
1. 분류의 평가지표  (0) 2023.09.04