상세 컨텐츠

본문 제목

[개미의 걸음 scikit-learn 4차시] 의사결정트리 실습(with iris)

Python

by IT개미 데이터 2021. 2. 4. 07:07

본문

728x90

들어가기전...

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))

 

 

 

 

728x90

관련글 더보기

댓글 영역