IE가 어른이 되기까지

[Machine Learning] 의사결정나무 (CART) Scikit Learn으로 구현하기 본문

ML/Python

[Machine Learning] 의사결정나무 (CART) Scikit Learn으로 구현하기

기모랑의 초코 2023. 1. 12. 12:28

 

이 글에서는 머신러닝의 지도학습 중

예측을 하는 데에 쓰이는 '의사결정나무'라는

알고리즘 코드 구현 방법에 대해 알아보겠습니다.

 

 


 

 

Regression Tree

 

 

https://piscesue0317.tistory.com/41
 

[Machine Learning] 의사결정나무 (지도학습 / 예측)

변수들로 기준을 만들고 이것을 통하여 샘플을 분류하고, 분류된 집단의 성질을 통하여 주정하는 모형을 '의사결정나무'라고 합니다. 우리는 이 의사결정나무를 통해 데이터를 분류 혹은 예측

piscesue0317.tistory.com

 

먼저, 위 글은 의사결정나무 중

회귀나무 알고리즘에 대한 이론을 설명하고 있습니다.

 

 

 


 

 

 

https://piscesue0317.tistory.com/31
 

[Machine Learning] Scikit - Learn을 이용한 데이터 분석 (지도학습 / 예측)

Machine Learning (머신러닝) 이란 기계가 스스로 학습하는 것을 의미합니다. 특히 사람이 지정해준 규칙이나 모델을 스스로 학습하게 됩니다. https://piscesue0317.tistory.com/27 [Data Science] 지도학습과 비지

piscesue0317.tistory.com

 

 

또한, 위 글은 본 알고리즘 모델링을

하기 이전의 과정입니다.

 

해당 과정을 수행하여야 앞으로 진행되는

모델링이 가능합니다.

 

 

 


 

 

 

Scikit - Learn에서는 모델 선택과 훈련을 시킬 때

fit (학습)과 predict (적용) 의 순서를 따릅니다.

 

 

 

 

모델 선택

 

from sklearn.tree import DecisionTreeRegressor # 모델 선택

model_tree = DecisionTreeRegressor(random_state = 1)

 

sklearn.tree 모듈에서 

DecisionTreeRegressor (회귀나무)

을 호출합니다.

 

 

최적의 하이퍼파라미터 탐색 및 학습

 

from sklearn.model_selection import GridSearchCV

# 최적화할 하이퍼파라미터 구간 설정

param_grid = {
    'max_depth': [None, 6, 9, 12],
    'min_samples_split': [0.01, 0.05, 0.1],
    'max_features': ['auto', 'sqrt'],
}

 

의사결정나무의 경우,

최적의 하이퍼파라미터 탐색이 필요합니다.

 

이때, sklean.model_selection 모듈에 있는

GridSearchCV라는 함수를 불러옵니다.

 

 

우리가 찾고자 하는 것은

의사결정나무의 깊이, 분할 수, 분할에 사용할 변수의 수입니다.

 

리스트 안에 들어 있는 것은최적화할 하이퍼파라미터의 구간을 설정한 것입니다.

 

 

* 하이퍼파라미터 : 모델링 시 사용자가 직접 지정해주어야 하는 옵션

* GridSearch : 모든 조합들을 다 test 해보겠다는 의미

 

 

 

# 최적 하이퍼파라미터 탐색

grid_search = GridSearchCV(estimator = model_tree, 
                           param_grid = param_grid, 
                           cv = 5, # 5 fold cross validation = 5 X 5 로 쪼개서 train, test 진행
                                   # 5 fold CV 면 첫번째가 test, 두번째부터 다섯번째가 train          
                           scoring = 'neg_mean_squared_error',   # 가장 최적의 하이퍼파라미터를 MSE로 찾기, MSE는 작을수록 좋은건데 -를 붙이면 클수록 좋다는 의미
                           refit = True, # 최적 하이퍼파라미터로 재학습
                           n_jobs = -1 # -1 = 컴퓨터의 모든 코어를 사용한다는 의미
                          )


# 모델 학습

grid_search.fit(X_train_pretained, y_train) 

best_model = grid_search.best_estimator_  # 탐색된 최적 파라미터로 학습된 모델 
print(f'best_parameter: {grid_search.best_params_}') # 탐색된 최적 파라미터
print(f'best_score: {- grid_search.best_score_}') # 탐색된 최적 파라미터로 학습된 결과

 

 

MSE가 가장 큰 최적의 하이퍼파라미터를 탐색한 후,

재학습을 시킵니다.

 

.fit( ) 함수를 통해 모델을 학습시키고

최적의 모델을 'best_model'이라는 변수에 저장합니다.

 

그러면 우리는 최적의 하이퍼파라미터와

그의 스코어를 알 수 있습니다.

 

 

 

 

모델 적용 및 성능평가

 

from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_absolute_percentage_error

# 평가 데이터에 대한 전처리
X_test_prepared = full_pipeline.transform(X_test)  

# 평가 데이터에 대한 예측
y_test_hat = best_model.predict(X_test_prepared)

# 평가 데이터에 대한 평가
mse_linear = mean_squared_error(y_test, y_test_hat, squared=True) # mean squared error
rmse_linear = mean_squared_error(y_test, y_test_hat, squared=False) # root mean squared error
mae_linear = mean_absolute_error(y_test, y_test_hat) # mean absolute error
mape_linear = mean_absolute_percentage_error(y_test, y_test_hat) # mean absolute error

print(f'mse_linear:{mse_linear}')
print(f'rmse_linear:{rmse_linear}')
print(f'mae_linear:{mae_linear}')
print(f'mape_linear:{mape_linear}')

 

평가 데이터도 훈련 데이터와 같은 방식으로

전처리를 해준 후, '.predict( )' 함수를 통해 예측을 진행합니다.

 

마지막으로 다양한 성능지표를 통해

모델을 평가하면 됩니다.

 

 

 

 


 

 

 

 

Classification Tree

 

 

https://piscesue0317.tistory.com/42
 

[Machine Learning] 의사결정나무 (지도학습 / 분류)

오른쪽 그림과 같이 변수들로 기준을 만들고 이것을 통하여 샘플을 분류하고, 분류된 집단의 성질을 통하여 주정하는 모형을 '의사결정나무'라고 합니다. 우리는 이 의사결정나무를 통해 데이

piscesue0317.tistory.com

 

 

먼저, 위 글은 의사결정나무 중

분류나무 알고리즘에 대한 이론을 설명하고 있습니다.

 

 

 


 

 

 

https://piscesue0317.tistory.com/32
 

[Machine Learning] Scikit - Learn을 이용한 데이터 분석 (지도학습 / 분류)

Machine Learning (머신러닝) 이란 기계가 스스로 학습하는 것을 의미합니다. 특히 사람이 지정해준 규칙이나 모델을 스스로 학습하게 됩니다. https://piscesue0317.tistory.com/27 [Data Science] 지도학습과 비지

piscesue0317.tistory.com

 

 

 

또한, 위 글은 본 알고리즘 모델링을

하기 이전의 과정입니다.

 

해당 과정을 수행하여야 앞으로 진행되는

모델링이 가능합니다.

 

 

 


 

 

 

Scikit - Learn에서는 모델 선택과 훈련을 시킬 때

fit (학습)과 predict (적용) 의 순서를 따릅니다.

 

 

 

 

모델 선택

 

from sklearn.tree import DecisionTreeClassifier # 모델 선택

model_tree = DecisionTreeClassifier(random_state = 1)

 

sklearn.tree 모듈에서 

DecisionTreeClassifier을 호출합니다.

 

 

최적의 하이퍼파라미터 탐색 및 학습

 

from sklearn.model_selection import GridSearchCV

# 최적화할 하이퍼파라미터 구간 설정

param_grid = {
    'criterion':['gini','entropy'], 
    'max_depth':[None,2,3,4,5,6], 
    'max_leaf_nodes':[None,2,3,4,5,6,7], 
    'min_samples_split':[2,3,4,5,6], 
    'min_samples_leaf':[1,2,3], 
    'max_features':[None,'sqrt','log2',3,4,5]
    }

 

의사결정나무의 경우,

최적의 하이퍼파라미터 탐색이 필요합니다.

 

이때, sklean.model_selection 모듈에 있는

GridSearchCV라는 함수를 불러옵니다.

 

 

우리가 찾고자 하는 것은

의사결정나무의 깊이, 노드 수,

분할 수, 분할에 사용할 변수의 수입니다.

 

리스트 안에 들어 있는 것은최적화할 하이퍼파라미터의 구간을 설정한 것입니다.

 

 

* 하이퍼파라미터 : 모델링 시 사용자가 직접 지정해주어야 하는 옵션

* GridSearch : 모든 조합들을 다 test 해보겠다는 의미

 

 

 

# 최적 하이퍼파라미터 탐색 

grid_search = GridSearchCV(estimator = model_tree, 
                           param_grid = param_grid, 
                           cv = 5, 
                           scoring = 'accuracy', # 정확도를 기반으로 하이퍼파라미터 탐색
                           refit=True  # 최적 하이퍼파라미터로 재학습
                          )

grid_search.fit(X_train_pretained, y_train)

best_model = grid_search.best_estimator_  # 탐색된 최적 파라미터로 학습된 모델 
print(f'best_parameter: {grid_search.best_params_}') # 탐색된 최적 파라미터
print(f'best_score: {- grid_search.best_score_}') # 탐색된 최적 파라미터로 학습된 결과

 

정확도가 가장 큰 최적의 하이퍼파라미터를 탐색한 후,

재학습을 시킵니다.

 

.fit( ) 함수를 통해 모델을 학습시키고

최적의 모델을 'best_model'이라는 변수에 저장합니다.

 

그러면 우리는 최적의 하이퍼파라미터와

그의 스코어를 알 수 있습니다.

 

 

 

 

모델 적용 및 성능평가

 

# 전처리와 모델을 포함한 파이프라인 설정
full_pipeline_with_model = Pipeline([
        ("preparation", full_pipeline),
        ("best", best_model)
    ])

# 전처리와 모델을 포함한 파이프라인 학습
full_pipeline_with_model.fit(X_train, y_train)

# 전처리와 모델을 포함한 파이프라인으로 학습된 최적 모델
my_model = full_pipeline_with_model

# 모델 저장
import joblib
joblib.dump(my_model, "my_model.pkl") # dump = 왕창 저장시켜버리는 것

# 모델 호출
my_model_loaded = joblib.load("my_model.pkl")

# 호출된 모델로 평가 데이터 예측 
y_test_hat = my_model_loaded.predict(X_test)

# 평가 데이터에 대한 평가
mse_linear = mean_squared_error(y_test, y_test_hat, squared=True) # mean squared error
rmse_linear = mean_squared_error(y_test, y_test_hat, squared=False) # root mean squared error
mae_linear = mean_absolute_error(y_test, y_test_hat) # mean absolute error
mape_linear = mean_absolute_percentage_error(y_test, y_test_hat) # mean absolute error

print(f'mse_linear:{mse_linear}')
print(f'rmse_linear:{rmse_linear}')
print(f'mae_linear:{mae_linear}')

 

평가 데이터도 훈련 데이터와 같은 방식으로

전처리를 해준 후, '.predict( )' 함수를 통해 예측을 진행합니다.

 

마지막으로 다양한 성능지표를 통해

모델을 평가하면 됩니다.

 

 

 

 

Comments