본문 바로가기

Computer Science/파이썬라이브러리&sklearn&keras

ML&DL_sklearn공부(1) << Decision Tree

sklearn공부(1)-Decision Tree

Decision Tree 만들기.

import sklearn
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split # 학습과 테스트 set을 나눠주는 역할
from sklearn.tree import DecisionTreeClassifier

data = load_breast_cancer()

X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, random_state = 42)
# 여기서 random_state = 42는 random seed를 준 것임.

model = DecisionTreeClassifier(criterion='entropy')
model
  • entropy 란 무질서도를 측정하는 값.

  • 나눴을 때 무질서랑 순수도가 가장 낮아지는 split pointer 를 고를 수 있도록 학습

  • 예) 2.45로도 해보고 3.1로도 해보니 2.45로 나눴을 때 무질서가 가장 낮아져서 그 값을 골라준다.

  • Decision Tree

  • 엔트로피의 손실함수
    Loss(p(y = 1)) = -y \log p(y=1) - (1-y)log(1-p(y=1))

  • gini 함수

  • max_depth

    • 너무 깊게 파면 overfitting 발생
  • min samples leaf

    • 이거 이하로 leaf를 안 만들어줄거다.

      print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

여기서 data는 무슨 type일까?

  • Bunch type

    • dictionary 와 유사한 형식을 지닌 구조체

      print(data.keys())

      => dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']`

Model 학습, 예측

import numpy as np

model.fit(X_train, y_train)
y_pred = model.predict(X_test) # 예측한 y 값.
  • 모델이 잘 학습되었는지 확인하기.
(y_pred == y_test).mean()
model.score(X_test, y_test)
tree = model.tree\_ # 모델의 학습 내용은 모두 tree\_에 저장되어 있습니다.

graphviz로 decision tree 확인하기.

import graphviz
from sklearn.tree import export_graphviz, plot_tree

plot_tree(model)
dot_data = export_graphviz(model, out_file='tree.dot', 
                     feature_names = data.feature_names,  
                     class_names = data.target_names,  
                     filled = True, rounded = True,  
                     special_characters = True)  

with open("tree.dot") as f:
    dot_graph = f.read()
dot = graphviz.Source(dot_graph); dot.format='png'
dot.render(filename='tree')
  • text로 확인하기

    from sklearn.tree import export_text
    treetext = export_text(model, decimals = 4,
                         feature_names = list(data.feature_names))
    print(treetext)

sklearn.preprocessing의 StandardScaler

  • min/max scaler(0~1값으로)(이미지 처리)
    • X => X' : X' = (X-X.min()) / (X.max() - X.min())
  • StandardScaler데이터들의 단위를 맞춰주자.
    • X => X' : X' = (X - X.mean()) / X.std()
  • RobustScaler(이상치에 의해서 데이터 분포값이 왜곡될 수도)
    • X => X' : (X-X.median()) / IQR(X)
from sklearn.preprocessing import StandardScaler

print(X_train[:1])
scaler = StandardScaler()
X_tr_scaled = scaler.fit_transform(X_train) # fit_transform: 학습과 변환을 한번에 수행해주는 역할
print(X_tr_scaled[:1])