GridSearchCV란?
이름 그대로 격자(grid)를 만들어 모든 가능한 조합을 탐색하는 방법이다.
layer, neuron, epoch, batch 등 여러 경우의 수를 조합하여 최적의 방법을 찾아내도록 도와준다.
해당 라이브러리는 scikit-learn에 있는 도구이다.
시나리오 : 데이터를 기반으로 고객이 은행을 이탈하는지에 대한 여부를 판단해야 한다.
1. 관련 라이브러리 import (sklearn, pandas, tensorflow 등등)
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler, LabelEncoder, OneHotEncoder
from sklearn.pipeline import Pipeline
from scikeras.wrappers import KerasClassifier
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import EarlyStopping
import pickle
2. 엑셀 파일을 불러와서 불필요한 행을 제거한다.
이후 Gender는 LabelEncoder를 통해 0(male), 1(female) 로 변환한다.
Geography는 3개의 지역이 존재하는데 OneHotEncoder를 통해 0 또는 1로 나타낸다. [[1,0,0],[0,1,0],... ] 이런 식으로 변환될 것이다.
마지막으로 standardScaler를 활용하여 훈련 데이터, 테스트용 데이터를 생성한다.
data=pd.read_csv('Churn_Modelling.csv')
data = data.drop(['RowNumber', 'CustomerId', 'Surname'], axis=1)
label_encoder_gender = LabelEncoder()
data['Gender'] = label_encoder_gender.fit_transform(data['Gender'])
onehot_encoder_geo = OneHotEncoder(handle_unknown='ignore')
geo_encoded = onehot_encoder_geo.fit_transform(data[['Geography']]).toarray()
geo_encoded_df = pd.DataFrame(geo_encoded, columns=onehot_encoder_geo.get_feature_names_out(['Geography']))
data = pd.concat([data.drop('Geography', axis=1), geo_encoded_df], axis=1)
X = data.drop('Exited', axis=1)
y = data['Exited']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Save encoders and scaler for later use
with open('label_encoder_gender.pkl', 'wb') as file:
pickle.dump(label_encoder_gender, file)
with open('onehot_encoder_geo.pkl', 'wb') as file:
pickle.dump(onehot_encoder_geo, file)
with open('scaler.pkl', 'wb') as file:
pickle.dump(scaler, file)
3. 모델을 생성하는 함수를 정의한다.
여기서 뉴런 개수와 레이어 개수는 변수로 할당하여 여러 경우의 수를 테스트하도록 한다.
## Define a function to create the model and try different parameters(KerasClassifier)
def create_model(neurons=32,layers=1):
model=Sequential()
model.add(Dense(neurons,activation='relu',input_shape=(X_train.shape[1],)))
for _ in range(layers-1):
model.add(Dense(neurons,activation='relu'))
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer='adam',loss="binary_crossentropy",metrics=['accuracy'])
return model
4. KerasClassifier를 사용해서 모델을 생성한다.
keras로 만든 모델을 scikit-learn 라이브러리가 이해할 수 있는 형태로 포장해주는 어댑터 역할을 한다.
GridSearchCV는 scikit-learn 라이브러리이기 때문에 KerasClassifier가 필요하다.
## Create a Keras classifier
# model=KerasClassifier(layers=1,neurons=32,build_fn=create_model,verbose=1)
model=KerasClassifier(model=create_model, verbose=0)
5. 파라미터를 정의하고 GridSearchCV에 넣어줌으로써 여러 경우의 수를 훈련해볼 수 있다.
# Define the grid search parameters
param_grid = {
'model__neurons': [16, 32, 64, 128],
'model__layers': [1, 2],
'epochs': [50, 100],
'batch_size': [10]
}
# Perform grid search
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=3,verbose=1)
grid_result = grid.fit(X_train, y_train)
# Print the best parameters
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
결과 :
Best: 0.858249 using {'batch_size': 10, 'epochs': 50, 'model__layers': 1, 'model__neurons': 128}
최대 85% 정도의 정확도를 보였으며, 에포크(실행 횟수) 50번 / 레이어 1개 / 뉴런 128개 일 경우 가장 뛰어난 성능을 얻을 수 있었다.
'AI LLM' 카테고리의 다른 글
| RNN의 문제점과 LSTM RNN의 동작 방식 (0) | 2025.06.19 |
|---|---|
| Cbow, skipgram (0) | 2025.06.07 |
| Word Embedding, Word2Vec (0) | 2025.06.07 |
| [NLP - 벡터 변환 알고리즘] TF-IDF (0) | 2025.05.25 |
| [NLP - 벡터 변환 알고리즘] Bag of Words, N-Gram (0) | 2025.05.22 |