의사 결정 트리는 우연 이벤트 결과, 리소스 비용 및 유틸리티 를 포함하여 트리와 같은 의사 결정 모델 과 가능한 결과 를 사용 하는 의사 결정 지원 도구입니다 . 조건부 제어문만 포함 하는 알고리즘 을 표시하는 한 가지 방법 입니다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('mushroom.csv')
data.shape
data.info()
data.head()
X = data.loc[:, 'cap-shape':]
y = data['poisonous']
data.describe()
- 인코딩 : 머신러닝 모델이 문자로 학습이 안된다 > 숫자 데이터로 바꿔준다!
- 라벨 인코딩 : 단순 수치로 매핑함 > 순서사 있는 데이터라면 괜찮다!
- 원-핫 인코딩 : 0, 1 만을 이용하여 데이터 표현
- 분류하고자 하는 범주만큼 자릿수(특성 수)를 만들고 해당하는 데이터는 1, 나머지는 0으로 표현하는 방법!
- 범주형 데이터를 표현하는 가장 많이 쓰이는 방법!
X_one_hot = pd.get_dummies(X)
확인
X_one_hot
💻 출력
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_one_hot,
y,
test_size=0.3)
X_train.shape, y_train.shape
X_test.shape, y_test.shape
from sklearn.tree import DecisionTreeClassifier
tree_model = DecisionTreeClassifier()
tree_model.fit(X_train,y_train)
tree_model.score(X_train, y_train)
tree_model.score(X_test, y_test)
일반화 : 훈련데이터에 적당히 학습이 되서 평가데이터를 잘 맞추는 형상
과대적합 : 훈련데이터에 과대적합, 평가데이터에도 과대적합
!pip install graphviz
from sklearn.tree import export_graphviz
export_graphviz(tree_model, out_file='tree.dot',
class_names=['p','e'],
feature_names=X_one_hot.columns,
impurity=False, # 불순도를 그림에 표현 할 것인가?
filled=True)
import os
os.environ["PATH"]+=os.pathsep+'C:/Program Files/Graphviz/bin/'
import graphviz
with open('tree.dot', encoding='UTF8') as f:
dot_graph = f.read()
display(graphviz.Source(dot_graph))
💻 출력
from subprocess import check_call
check_call(['dot','-Tpng','tree.dot','-o','tree.png'])
max_depth=None => 질문을 끝까지 계속 던짐.
tree_model2 = DecisionTreeClassifier(max_depth = 3)
tree_model2.fit(X_train, y_train)
export_graphviz(tree_model2, out_file='tree2.dot',
class_names=['p','e'],
feature_names=X_one_hot.columns,
impurity=False,
filled=True)
check_call(['dot','-Tpng','tree2.dot','-o','tree2.png'])
Decision Tree가 생각하는 특성별 중요도
전체 특성의 중료도를 보여줌(117개)
0 ~ 1 까지 숫자로 표현
0 = 중요하지 않다, 사용하지 않았다.
전체의 합이 1
✍ 입력
fi = tree_model2.feature_importances_
학습 / 예측시에 시간이 오래걸리면
중요하지 않은 컬럼 삭제 > 성능저하, 속도향상
df = pd.DataFrame(fi, index= X_one_hot.columns)
df.sort_values(by = 0, ascending= False)
💻 출력
✍ 입력
from sklearn.model_selection import cross_val_score
# 사용할 모델, 문제데이터, 정답데이터, 데이터 분할 수(cv)
score = cross_val_score(tree_model2, X_train, y_train, cv=5)
score
서로 다른 5개의 데이터로 판단한 결과의 평균
새로운 데이터가 들어왔을때 대략적으로 보여줄 성능
score함수 대신 교차검증을 사용해서 확인하는게 더 정확함
✍ 입력
score.mean()
💻 출력