본문 바로가기
파이썬/머신러닝-지도학습

파이썬 머신러닝 지도학습 - Decision Tree(결정 트리) (분류, 회귀)

by 큰고양2 2023. 9. 16.

Decision Tree

특정 변수에 대한 의사결정 규칙을 트리 형태로 계속 분류하는 모델

정보 이득이 큰 순서대로 트리를 분류함

 

Root Node(뿌리 마디): 전체 자료를 갖는 시작하는 마디

Child Node(자식 마디): 마디 하나로부터 분리된 2개 이상의 마디

Parent Node(부모 마디): 주어진 마디의 상위 마디

Terminal Node(끝 마디): 자식 마디가 없는 마디(=Leaf Node)

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

Branch(가지): 연결되어 있는 2개 이상의 마디 집합

Depth(깊이): 뿌리 마디로부터 끝 마디까지 연결된 마디 개수(위 그림의 경우 4)

 

전체 샘플 623개를 sex_male <= 0.5를 기준으로 나눔

각각 396개, 227개로 분류

가장 많은 데이터 = die

gini 불순도 = 0.46

 

분류의 경우  마지막 노드의 최빈값을 예측값으로 결정

회귀의 경우 마지막 노드의 샘플의 평균을 예측값으로 결정

 

 

따로 파라미터를 지정하지 않으면, 과적합이 될 수 있음

 

모델링

#분류
from sklearn.tree import DecisionTreeClassifier
#회귀
from sklearn.tree import DecisionTreeRegressor

코드로 임포트 한 다음

#분류
model = import DecisionTreeClassifier(criterion = , splitter= , max_depth= ,min_samples_split= , min_samples_leaf = , max_features , random_tate = )
#회귀
model = DecisionTreeRegressor(criterion = , splitter= , max_depth= ,min_samples_split= , min_samples_leaf = , max_features , random_tate = )

로 모델을 선언한다

각각 파라미터는

  1. criterion: 분할 품질을 측정하는 기능을 지정  ,  "mse"(평균 제곱 오차), "friedman_mse"(Friedman의 평균 제곱 오차), "mae"(평균 절대 오차), 기본값= "mse"
  2. splitter: 각 노드에서 분할을 선택하는 데 사용되는 전략을 지정 , "best"(최적 분할), "random"(최적 또는 무작위 분할),기본값= "best"
  3. max_depth: 트리의 최대 깊이를 지정 (기본값 = None)
  4. min_samples_split: 노드를 분할하기 위해 필요한 최소 샘플 수를 지정 (기본값=2)
  5. min_samples_leaf: 리프 노드에 필요한 최소 샘플 수를 지정 (기본값 =1)
  6. max_features : 각각의 분기점에서 고려해야 할 feature들의 수 (기본값=None).
  7. random_state : 난수 발생 시드

이다 만약 기본 설정을 그대로 쓸 생각이라면 그냥 함수명()으로 선언해도 된다

학습 및 예측

model.fit(x_train, y_train)

fit매소드로 학습을 시킬 수 있다

이후

y_pred = model.predict(x_test)

코드를 사용하여 완성된 모델에 x_test를 넣어 예측값을 생성 할 수 있다

 

평가

from sklearn.metrics import *

코드로 평가 함수들을 임포트 한 다음

https://bigcat5312.tistory.com/77

 

머신러닝 지도학습 - 회귀와 분류, 분석도구

회귀(Regression) 이미 결과값이 있는 데이터를 사용하여 연관성을 찾아 연속적인 숫자를 예측해 내는 것 ex) 집값 분석도구 평가도구 LinearRegression KNeighborsRegressor DecisionTreeRegressor RandomForestRegressor XG

bigcat5312.tistory.com

게시글을 참고하여 원하는 평가함수(y_test , y_pred)를 사용해 평가 할 수 있다

 

 

시각화

트리

# 시각화 모듈
from sklearn.tree import export_graphviz
from IPython.display import Image

# 이미지 파일
export_graphviz(model,                                 # 모델 이름
                out_file='tree.dot',                   # 파일 이름
                feature_names=x.columns,               # Feature 이름
                class_names=['die', 'survived'],       # Target Class 이름 **타겟이 알파벳이면 무조건 알파벳순
                rounded=True,                          # 둥근 테두리
                precision=2,                           # 불순도 소숫점 자리수
                filled=True)                           # 박스 내부 채우기


# 변환
!dot tree.dot -Tpng -otree.png -Gdpi=300

# 이미지 파일 표시
Image(filename='tree.png')

변수 중요도

시각화

plt.figure(figsize=(6, 8))
plt.barh(list(x), model.feature_importances_)
plt.ylabel('Features')
plt.xlabel('Importances')
plt.show()

정렬해서 보기

df = pd.DataFrame()
df['feature'] = list(x)
df['importance'] = model.feature_importances_
df.sort_values(by = 'importance', ascending= True, inplace=True)

plt.barh(y= 'feature', width = 'importance', data = df)
plt.show()

 

 

그냥 확인하기

print(model.feature_importances_)