[개미의 걸음 scikit-learn 4차시] 의사결정트리 실습(with iris)
들어가기전...
2021/02/01 - [Python] - [개미의 걸음 scikit-learn 1차시] 사이킷런의 이해
2021/02/02 - [Python] - [개미의 걸음 scikit-learn 2차시] Classification(분류)의 이해
2021/02/03 - [Python] - [개미의 걸음 scikit-learn 3차시] Classification① 의사결정트리(Decision Tree)의 이해
사이킷런에서의 의사결정트리
분류를 위한 클래스인 DecisionTreeClassifier와 회귀를 위한 클래스인 DecisionTreeRegressor
- DecisionTreeClassifier와 DecisionTreeRegressor는 동일한 파라미터 사용
파라미터 명 | 설명 |
min_samples_split | 노드를 분할하기 위한 최소한의 샘플 데이터 수로 과적합 제어 용도로 사용 기본값[디폴트] : 2 작게 설정할 수록 분할되는 노드수가 많아져 과적합 가능성 증가 ex> 1로 설정할 경우, 분할되는 노드수가 많아져서 과적합 가능성 증가 |
min_samples_leaf | leaf가 되기 위한 최소한의 샘플 데이터 수로 과적합 제어 용도로 사용 [min_samples_split과 유사] 비대칭적 데이터의 경우 특정 클래스의 데이터가 극도로 작을 수 있으므로 이경우에는 작게 설정 |
max_features | 최적의 분할을 위해 고려할 최대 feature 개수 기본값[디폴트] : None으로 데이터 세트의 모든 feature를 사용해 분할 수행 int형으로 지정하면 대상 feature의 개수를 의미 float형으로 지정하면 전체 피처 중 대상 feature의 퍼센트를 의미 'None'은 전체 feature 선정 'sqrt'는 전체 feature의 제곱근만큼 선정 'auto'는 sqrt와 동일 'log'는 전체 feature 중 log2(전체 feature 개수)만큼 선정 |
max_depth | 트리의 최대 깊이를 규정 기본값[디폴트] : None으로 완벽하게 클래스 결정 값이 될때까지 깊이를 계속 키우며 분할하거나 노드가 가지는 데이터 개수가 min_samples_split보다 작아질 때까지 계속 깊이를 증가시킴 깊이가 깊어지면 min_samples_split 설정대로 최대 분할하여 과적합 가능성 증가[적절한 값으로 제어] |
max_leaf_nodes | 말단 노드[leaf]의 최대 개수 |
# min_samples_split의 이해
ex> min_samples_split=41인 경우, 41개 이상의 샘플만 split한다는 의미!

# min_sample_leaf의 이해
ex> min_samples_leaf=37인 경우, 생성될 노드들의 샘플 수가 모두 37개 이상이어야만 split한다는 의미!

# max_depth의 이해
ex> max depth=3인 경우, depth가 3일 때까지만 split한다는 의미!

# max_leaf_nodes의 이해
ex> max_leaf_nodes=4인 경우, leaf node들이 4가 될 때까지만 split한다는 의미!

선형회귀분석
필요한 모듈 import
## pandas 모듈
import pandas as pd
## iris 데이터 모듈
from sklearn.datasets import load_iris
## train과 test set 구분 모듈
from sklearn.model_selection import train_test_split
## 데이터 표준화 모듈
from sklearn.preprocessing import StandardScaler
## 의사결정트리 모델
from sklearn.tree import DecisionTreeClassifier
## 정확도 예측 모듈(연속적인 데이터에서 사용 안함)
from sklearn.metrics import accuracy_score
## 의사결정트리 시각화
from sklearn.tree import export_graphviz
import graphviz
[graphviz 설치하기 ↓]
2021/02/04 - [Python] - [개미의 걸음 scikit-learn 오류해결] graphviz 설치 및 오류 해결(with jupyter notebook)
아이리스 데이터 불러오기
iris = lad_iris()
데이터 셋 train/test 구분하기
## train, test 데이터를 각각 8:2로 구분
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=1)
## 데이터 표준화
sc = StandardScaler()
sc.fit(x_train)
x_train_std = sc.transform(x_train)
x_test_std = sc.transform(x_test)
- test_size는 0~1사이의 값을 가지며 전체 데이터(1)에서 test 데이터의 비중을 의미
→ 기본값[default 값] : 0.25 - random_state는 숫자를 임의로 생성할 때 재현가능하도록 난수의 초기값을 입력 [난수 생성기]
→ 기본값은 numpy.random에서 제공하는 random number generator가 사용됨
→ random_state에 지정하는 정수값에 따라 분석 결과가 다르게 나옴
→ 생략할 경우, 실행할 때마다 다른 결과가 나옴 [test/train 데이터가 계속 달라지므로]
→ 값을 지정할 경우, 여러번 다시 실행하여도 동일한 결과가 나옴
→ 쉽게 말해서 재현 가능하도록 고정되는 숫자를 지정하는 것!!!
ex> random_state=3 : 3개의 숫자는 무조건 고정
3개를 뽑으면 항상 같은 수가 나오지만 5개를 뽑으면 3개만 같고 2개를 계속 변화
Decision Tree model 만들기
tree_model = DecisionTreeClassifier(random_state=100)
tree_model.fit(x_train_std, y_train)
시각화하기
## graphviz가 읽어들여 그래프 형태로 시각화할 수 있는 출력 파일 생성
export_graphviz(tree_model, out_file='tree.dot', class_names=iris.target_names, feature_names=iris.feature_names, impurity=True, filled=True)
## 저장된 tree.dot파일을 사용해 시각화하기
with open("tree.dot")as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
[format 오류가 발생하는 경우 ↓]
2021/02/04 - [Python] - [개미의 걸음 scikit-learn 오류해결] graphviz 설치 및 오류 해결(with jupyter notebook)
예측 데이터 만들기
y_pred = linear_model.predict(x_test_std)
정확도/정밀도/재현율 구하기
## 정확도/정밀도/재현율 구하는 함수 만들기(여러 번 사용할 때 용이)
def get_clf_eval(y_test, y_pred):
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test,y_pred, average='macro')
recall = recall_score(y_test,y_pred,average='macro')
print('정확도 : {0:.4f}, 정밀도 : {1:.4f}, 재현율 : {2:.4f}'.format(accuracy, precision, recall))
## 값 출력하기
print(get_clf_eval(y_test, y_pred))