AI·빅데이터 융합 경영학 Study Note
***[ML수업] 7주차 실습2: OOF(Out-Of-Fold) Ensemble 본문
이거 !!! 이 틀 그대로 기말에 나올거같음!!! 준비 꼭 해두기!!!
import pandas as pd
import numpy as np
loan_data = pd.read_csv('loan_train.csv')
y = loan_data['Personal Loan']
X = loan_data.drop(['ID', 'ZIP Code', 'Personal Loan'], axis=1)
# Kaggle에서 아래와 같이 학습데이터(X_train, y_train)와 평가데이터(X_test)를 나누어서 제공했다고 가정하자.
# 즉, y_test는 제공하지 않기 때문에 우리는 X_test에 대한 정답을 모른다.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
##### Feature Engineering ####
생략함. 필요하면 직접 짜셍ㅅ!!
왠지 기말로 나올거같으니 미리 짜둬야겠다..
##### Model Building #####- *Hyperparameter Optimization*
( 하이퍼파라미터를 Optuna 라이브러리를 사용해 최적화하는 과정 )
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
#주석은 나중에 다른 모델로 쉽게 변경할 수 있도록 준비한 부분
model = KNeighborsClassifier()
#model = DecisionTreeClassifier()
#model = LogisticRegression()
#model = SVC()
# Kaggle Competition에서는 일반적으로 학습 데이터를 다시 나누지 않고 학습데이터 전체를 사용하여 model tuning을 한다.
import optuna
from sklearn.model_selection import cross_val_score
# 조절할 하이퍼 파라미터와 그 범위를 지정하는 함수 정의
def objective(trial):
#knn_n_neighbors: 이웃 수를 1에서 10까지 시도
knn_n_neighbors = trial.suggest_int('n_neighbors', 1, 10, step=1)
#knn_weights: 이웃의 가중치를 uniform(모든 이웃 동일) 또는 distance(거리 가중치)로 선택할 수 있습니다.
knn_weights = trial.suggest_categorical('weights', ['uniform','distance'])
classifier_obj = KNeighborsClassifier(
n_neighbors = knn_n_neighbors,
weights = knn_weights,
)
score = cross_val_score(classifier_obj, X_train, y_train, scoring='roc_auc', cv=5)
accuracy = score.mean()
return accuracy
# 최적화 실행
#optuna.create_study를 통해 TPE 샘플러(Tree-structured Parzen Estimator)를 사용하여 최적화 스터디를 생성합니다.
study = optuna.create_study(sampler=optuna.samplers.TPESampler(seed=0), direction="maximize")
study.optimize(objective, n_trials=18)
#최적화 결과 보기
print("Best score:", study.best_value)
print("Best parameters:", study.best_params)
##### Model Building #####- *OOF Prediction*
# Kaggle에서는 특정모형의 과대적합을 줄이기 위해 OOF(Out-Of-Fold) Prediction을 자주 사용한다.
from sklearn.model_selection import cross_validate
from sklearn.metrics import roc_auc_score
models = cross_validate(KNeighborsClassifier(**study.best_params), # 최적화된 hyperparameter 사용
X_train, y_train, cv=4, scoring='roc_auc',
return_estimator=True)
oof_pred = np.array([m.predict_proba(X_test)[:,1] for m in models['estimator']]).mean(axis=0)
# OOF와 일반적인 방식(sklearn 권장 방식)의 성능 비교
model = KNeighborsClassifier(**study.best_params)
model.fit(X_train, y_train)
roc_auc_score(y_test, oof_pred), roc_auc_score(y_test, model.predict_proba(X_test)[:,1])
#(0.6749962619617226, 0.6510915071770335)
# 결론: OOF가 더 좋다.
##### Model Ensemble ####
생략
'AI·ML' 카테고리의 다른 글
[ML수업] 8주차 실습2: feature engineering- Categorical Feature Transformation (범주형) (0) | 2023.11.21 |
---|---|
[ML수업] 8주차 실습0: feature engineering-들어가기 (0) | 2023.11.21 |
[ML수업] 7주차 실습1: Ensemble Learning (Similarity between models, Voting ensemble, Averaging predictions, stacking) (0) | 2023.11.21 |
[ML수업] 7주차 이론: ensemble(앙상블) (0) | 2023.11.21 |
[ML수업] 6주차 이론: measuring model performance(모형평가) (0) | 2023.11.21 |