6. Decision Tree¶
머신러닝 알고리즘 중 1 : 분류, 회귀, 다중출력도 가능
랜덤 포레스트의 기본 구성 요소
6.1 결정 트리 학습과 시각화¶
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
#붓꽃 데이터셋 불러오기
iris = load_iris()
#길이와 너비 데이터 사용
X = iris.data[:,2:]
y=iris.target
tree_clf = DecisionTreeClassifier(max_depth = 2)
tree_clf.fit(X,y)
DecisionTreeClassifier(max_depth=2)
from sklearn.tree import export_graphviz
f = open("C:/Users/82109/Desktop/decision_tree.dot", 'w')
#"decision.dot" 파일로 저장
export_graphviz(
tree_clf,
out_file=f,
feature_names = iris.feature_names[2:],
class_names=iris.target_names,
rounded=True,
filled = True
)
#결정 트리 시각화
import graphviz
with open("C:/Users/82109/Desktop/decision_tree.dot") as f:
dot_graph = f.read()
dot = graphviz.Source(dot_graph)
dot.format = 'png'
dot.render(filename='iris_tree', directory = 'C:/Users/82109/Desktop', cleanup=True)
dot
6.2 예측하기¶
root node -> leaf node의 분기마다 판단하면서 내려간다.
(+) 데이터 전처리가 필요하지 않음
- gini 속성 : impurity 측정 $G_i$
화이트박스 모델 : 직관적이고 결정 방식을 이해하기 쉬운 모델
블랙박스 모델 : 왜 그런 예측을 하는지 파악하기 어려움
6.3 클래스 확률 추정¶
# Q. 길이가 5, 너비가 1.5인 꽃잎이 클래스 k에 속할 확률은?
tree_clf.predict_proba([[5,1.5]])
array([[0. , 0.90740741, 0.09259259]])
# Q. 길이가 5, 너비가 1.5인 꽃잎이 속하는 클래스는?
tree_clf.predict([[5,1.5]])
array([1])
6.4 CART 훈련 알고리즘¶
결정 트리 훈련 -> CART classification and regression tree
step 1.¶
가장 순수한 서브셋으로 나눌 수 있는 짝을 찾아 훈련 세트를 두 개의 subset으로 나눈다.
ex) 특성 $k$, 임곗값 $t_k$
- 비용함수 : $J(k, t_k) = \frac{m_left}{m}G_left + \frac{m_right}{m}G_right$
$G^{left/right}$ : 왼/오 subset의 불순도
$m^{left/right}$ : 왼/오 subset의 샘플 수
step 2. 서브셋을 나누는 과정을 반복¶
- 중지 조건을 만나면 중지한다.
ex) 최대 깊이, 불순도를 줄일 수 없음, 매개변수 등
greedy algorithm¶
6.5 계산 복잡도¶
decision tree의 계산 복잡도 : $O(log_2(m))$
6.6 지니 불순도 / 엔트로피¶
- DecisionClassifier의 criterion="gini"로 설정되어있음
이때, criterion="entryopy"로 수정하면, 엔트로피 사용 가능
엔트로피 : 원래 분자의 무질서함을 측정하는 열역학 개념, 머신러닝에서는 불순도 측정을 위해 사용됨.
- $H_i = -Σ_kp_{i,k}log_2(p_{i,k})$
6.7 규제 매개변수¶
Decision Tree는 과대적합에 취약함
- 제약사항이 없고, 파라미터 수가 결정되지 않는 비파라미터 모델이기 때문이다.
DecisionTreeClassifier의 제한하는 매개변수
max_depth
min_samples_split
min_samples_leaf
min_weight_fraction_leaf
max_leaf_nodes
max_features
6.8 회귀¶
from sklearn.tree import DecisionTreeRegressor
tree_reg = DecisionTreeRegressor(max_depth=2)
tree_reg.fit(X,y)
DecisionTreeRegressor(max_depth=2)
from sklearn.tree import export_graphviz
f = open("C:/Users/82109/Desktop/graph graphname.dot", 'w')
#"decision.dot" 파일로 저장
export_graphviz(
tree_clf,
out_file=f,
feature_names = iris.feature_names[2:],
class_names=iris.target_names,
rounded=True,
filled = True
)
#결정 트리 시각화
import graphviz
with open("C:/Users/82109/Desktop/graph graphname.dot") as f:
dot_graph = f.read()
dot = graphviz.Source(dot_graph)
dot.format = 'png'
dot.render(filename='regression', directory = 'C:/Users/82109/Desktop', cleanup=True)
dot
classification tree와의 차이점
클래스를 예측하지 않고, 값을 예측함
- CART 비용함수
$J(k,t_k) = \frac{m_{left}}{m}MSE_{left}+ \frac{m_{right}}{m}MSE_{right}$
$MSE_{node} = Σ_{node}(ŷ_{node} - y^{(i)})^2 $
$ŷ_{node} = \frac{1}{m_{node}}Σ_{node}y^{(i)}$
6.9 불안정성¶
PCA 기법 사용 가능함
Q3. 결정 트리가 과대적합되었다면 max_depth를 줄이는 게 좋을까?¶
A3. ㅇㅇ¶
Q4. 과소적합되었다면, 입력 특성의 스케일을 조정하는 게 좋을까?¶
A4. ㄴㄴ¶
Q5. 백만개에 한 시간이면, 천만개에는 몇 시간 걸릴까?¶
A5. 계산복잡도 참고하기 ! $O(log_2(m))$¶
$h_1 = 7a * log_2(10)$
$h_2 = 8a * log_2(10) = 60 / 7 * 8 = 68$ 분
Q7. moons 데이터셋에 결정 트리를 훈련시키고 튜닝시켜보자.¶
a. make_moons(n_samples=1000, noise=0.4)로 데이터셋 생성
b. train_test_split()으로 훈련세트 / 테스트 세트로 나누자.
c. DecisionTreeClassifier의 최적의 매개변수를 찾기 위해 교차검증과 함께 그리드 탐색을 수행합니다. (GridSearchCV 사용, max_leaf_nodes 시도)
성능 측정
from sklearn.datasets import make_moons
dataset = make_moons(n_samples=1000, noise = 0.4)
data = dataset[:1]
target = dataset[1:]
data
#X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, train_size=0.8, random_state=34)
(array([[ 0.96571523, 0.24877367], [-0.47796501, 0.59287649], [ 1.44861282, -0.54774763], ..., [ 1.85352014, 0.39890303], [ 1.09571462, -0.61903691], [-0.11740333, 0.87563098]]),)
target
(array([0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0], dtype=int64),)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.33, shuffle=False, random_state=42)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-14-d86f6be1910a> in <module> 1 from sklearn.model_selection import train_test_split 2 ----> 3 X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.33, shuffle=False, random_state=42) 4 5 ~\anaconda3\lib\site-packages\sklearn\model_selection\_split.py in train_test_split(test_size, train_size, random_state, shuffle, stratify, *arrays) 2173 2174 n_samples = _num_samples(arrays[0]) -> 2175 n_train, n_test = _validate_shuffle_split(n_samples, test_size, train_size, 2176 default_test_size=0.25) 2177 ~\anaconda3\lib\site-packages\sklearn\model_selection\_split.py in _validate_shuffle_split(n_samples, test_size, train_size, default_test_size) 1855 1856 if n_train == 0: -> 1857 raise ValueError( 1858 'With n_samples={}, test_size={} and train_size={}, the ' 1859 'resulting train set will be empty. Adjust any of the ' ValueError: With n_samples=1, test_size=0.33 and train_size=None, the resulting train set will be empty. Adjust any of the aforementioned parameters.
'Data Science > AI' 카테고리의 다른 글
What is Git and GitHub? | 깃, 깃허브 이용법 (0) | 2021.08.29 |
---|---|
[8.9] 공동세션 분석 리뷰 (0) | 2021.08.10 |
[머신러닝] 핸즈온 머신러닝 5장 주피터 노트북 파일 (0) | 2021.07.31 |
[발표 자료] 핸즈온 머신 러닝 4장 - 모델 훈련 (0) | 2021.07.24 |
[데이터 시각화] Tableau 기본 차트 이용법 - 막대, 라인, 파이, 도넛, 맵, 대시보드 등 (0) | 2021.07.23 |