AI·빅데이터 융합 경영학 Study Note

***[ML수업] 7주차 실습2: OOF(Out-Of-Fold) Ensemble 본문

AI·ML

***[ML수업] 7주차 실습2: OOF(Out-Of-Fold) Ensemble

SubjectOwner 2023. 11. 21. 15:52

loan_train.csv
0.13MB

 

 

이거 !!! 이 틀 그대로 기말에 나올거같음!!! 준비 꼭 해두기!!!

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 ####
생략