본문 바로가기
2023 빅리더 프로젝트 인턴십/ML

[ML] day4 지도학습 - 의사결정나무(Decision Tree)

by 혜o_n 2023. 7. 20.

 의사결정나무 개념

* 의사결정나무

하나의 테스트에 대해 예/ 아니오로 구분

노드의 수가 작을수록 좋음

장점 : 수학을 잘 몰라도 ok => 쉬움

단점 : 트레이닝 데이터에 대한 정확도는 100%지만, 실제 테스트 데이터에 대한 정확도가 낮음 => 오버피팅

    ===> 단점을 보완하기 위해 나온 알고리즘 : 랜덤 포레스트

 

테스트 선정 순서 : 성능 좋은 테스트부터 우선 선정

- 실제 스코어링 방법

    - 노드 별 엔트로피 측정

    - 엔트로피 : 무질서 정도를 나타내는 측도 => 낮을수록 좋음

    - 노드별 엔트로피를 측정 후 테스트 전체 퀄리티 측정

 

* 엔트로피

엔트로피는 낮을수록 좋다!!

 

* 피처가 연속형일 경우 : 모든 점이 테스트 후보 => 평균값으로 추정

                ==> 평균보다 작으면 '아니오', 크면 '예'

 

* 실습

import pandas as pd
df = pd.read_csv('../data/wine_data.csv') 

features = ['Alcohol', 'Malic', 'Ash', 'Alcalinity', 'Magesium', 'Phenols',
       'Flavanoids', 'Nonflavanoids', 'Proanthocyanins', 'Color', 'Hue',
       'Dilution', 'Proline']

X = df[features]
y = df['class']

# 트레이닝/테스트 데이터 분할
from sklearn.model_selection import train_test_split
X_tn, X_te, y_tn, y_te = train_test_split(X, y, random_state=0)

# 데이터 표준화
from sklearn.preprocessing import StandardScaler
std_scale = StandardScaler()
std_scale.fit(X_tn)
X_tn_std = std_scale.transform(X_tn)
X_te_std = std_scale.transform(X_te)
# 의사결정나무 실습
from sklearn import tree
clf_tree = tree.DecisionTreeClassifier(random_state=0)
clf_tree.fit(X_tn_std, y_tn)

- 의사결정 나무 알고리즘은 sklearn.treeDecisionTreeClassification

# 예측
pred_tree = clf_tree.predict(X_te_std)
print(pred_tree)

## 결과값 ###
: [0 2 1 0 1 1 0 2 1 1 2 2 0 1 2 1 0 0 2 0 1 0 1 1 1 1 1 1 1 2 0 0 1 0 0 0 2
 1 1 2 1 0 1 1 1]
 
 # 정확도 
from sklearn.metrics import accuracy_score
accuracy_t = accuracy_score(y_te, pred_tree)
print("accuracy:", accuracy_t)

# 정밀도 
from sklearn.metrics import precision_score
precision_t = precision_score(y_te, pred_tree, average='macro')
print("precision:", precision_t)

# 리콜 
from sklearn.metrics import recall_score
recall_t = recall_score(y_te, pred_tree, average='macro')
print("recall:", recall_t)

# F1 스코어
from sklearn.metrics import f1_score
f1_t = f1_score(y_te, pred_tree, average='macro')
print("f1:", f1_t)

## 결과값 ###
accuracy: 0.9333333333333333
precision: 0.9326599326599326
recall: 0.9424603174603176
f1: 0.9349141206870346
# confusion matrix 실습
from sklearn.metrics import confusion_matrix
conf_matrix_t = confusion_matrix(y_te, pred_tree)
print(conf_matrix_t)

### 결과값 ###
[[14  2  0]
 [ 0 20  1]
 [ 0  0  8]]
 # 분류 레포트 확인
from sklearn.metrics import classification_report
class_report_t = classification_report(y_te, pred_tree)
print(class_report_t)

### 결과값 ###
              precision    recall  f1-score   support

           0       1.00      0.88      0.93        16
           1       0.91      0.95      0.93        21
           2       0.89      1.00      0.94         8

    accuracy                           0.93        45
   macro avg       0.93      0.94      0.93        45
weighted avg       0.94      0.93      0.93        45

댓글