본문 바로가기
개발 일기/Pytorch

[Skorch] pytorch에 GirdSearchCV 적용하기

by URMOO 2023. 7. 6.
반응형

모 논문을 보다가 sklearn에 최적의 hyperparameter를 찾기위해 GridSearchCV를 사용한다는 것을 알게되었다. 
세상사람들 다 알고 있는데 나만 몰랐던 사실이었나보다...
무튼 그러다가 pytorch로 만든 DNN에도 적용할 수 있을까 싶어 chat GPT에 물어봤는데 뭐..
BaseEstimator를 상속받는wrapper class를 만들고 어쩌구저쩌구 해서 해봤는데
계속 오류가 나서 화나서 포기하려다가!!!!!!!!

skorch라는 라이브러리를 알게되었다. 

Skorch에 대해 chat GPT에 물어보니 아래와 같이 답변해줬다.

 Skorch는 Scikit-learn과 PyTorch를 연결해주는 도구로, Scikit-learn과 PyTorch의 강점을 결합하여 사용할 수 있도록 도와줍니다.
Skorch는 Scikit-learn과 PyTorch 사이의 호환성을 제공하여 Scikit-learn의 유연성과 PyTorch의 강력한 딥러닝 기능을 동시에 활용할 수 있습니다. Skorch를 사용하면 Scikit-learn과 동일한 인터페이스를 사용하여 모델을 정의하고 훈련시킬 수 있으며, PyTorch의 강력한 딥러닝 모델을 사용하여 복잡한 모델 구조를 구성할 수도 있습니다.

이전에는 batch_size나 learning rate, epochs들을 for문을 쓰던.. 뭘하던 복잡~~하게 최적 parameter를 찾았다면, 
skorch는 간단히 몇줄만 추가하면 손쉽게 모델을 돌릴 수 있다. 단점은 엄청 느리다는것...?

설치

설치는 아주 간편하다. 
설치를 위해 명령어를 처준다.이때 여러 라이브러리들이 설치되어있어야 하긴 하는데.. 관련 사항은 여기를 참고..

python -m pip install -U skorch

코드 예시

내가 짠 코드로 사용 예를 들어보자면..

1. 필요한 라이브러리들을 import 해준다. 

import torch
import torch.nn as nn
import torch.optim as optim
from skorch import NeuralNetClassifier

from sklearn.metrics import roc_auc_score
from sklearn.model_selection import GridSearchCV

2. 내가 만든 DNN 모델을 가져온다. (내껀 이진분류모델..!)

class DNN(nn.Module):
    def __init__(self, input_dim, output_dim=1):
        super(DNN, self).__init__()
        self.fc1 = nn.Linear(input_dim, input_dim * 2)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(input_dim * 2, output_dim)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.sigmoid(self.fc2(x))
       
        return x

3. 자신의 모델에 해당하는 NeuralNet 모델을 만들어준다.
나는 분류모델이었기 때문에 NeuralNetClassifier 얘로 해줬는데, transform이나 regression도 제공하는 것 같다...(?)

model = NeuralNetClassifier(DNN(X_train.shape[1]), 
				criterion=nn.BCELoss,
                            	optimizer=optim.Adam, 
                            	device=device,
                            	verbose=0)

이때 parameter들은 skorch에서 제공하는 가이드를 참고해준다. 
내가 넣은 것 이외에 batch_size나 epoch등은 GridSearchCV를 위해 따로 넣어줄 것이기 때문에 넣지 않는다.
verbose는 parameter별 로그가 나오는데, 0으로 넣어주면 출력되지 않는다. 

4. GridSearchCV params도 만들어준다. 이 때, key들은 가이드에 나와있는 이름으로 넣어줘야한다. 

param_grid = {'batch_size': [2, 16,32],'lr': [0.001, 0.01, 0.1],'max_epochs': [100,300,500]}

5. 이제 GirdSearchCV도 선언해서 fit으로 train데이터를 넣어주면 끝..!
이 때, 데이터들은 tensor로 변환해서 넣어줘야한다. 

scoring은 모델 최적화를 위해 계산하는 점수인 것 같고, cv는 몇개의 fold로 나눠서 train 할 것인가를 정하는 것이다. 
그냥 숫자를 넣어도 되고, 내가 알기론 kfold를 선언해서 넣어도 되는 것으로 알고있는데 아닐지도.. 
n_jobs는 프로세스 개수..!

gcv = GridSearchCV(model, param_grid=param_grid, scoring='roc_auc', cv=5, n_jobs=5)
gcv.fit(X_train, y_train)

6. 훈련을 했으면 테스트도 해야한다.
GridSearchCV가 찾은 최적의 hyperparameter로 예측한  predict, predict_proba의 두 값을 제공한다. 

gcv.best_estimator_.predict(X_test)

 


세상사람들 다 알고있던거 나만 몰랐던 느낌적인 느낌느낌
그래도 이제라도 알아서 다행인거지~~~
결과만 좀 빨리나오면 좋겠다..... 슈퍼컴퓨터 갖고싶다....

반응형

'개발 일기 > Pytorch' 카테고리의 다른 글

[Pytorch|ERROR] index out of range in self  (0) 2023.01.28

댓글