• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

ML 모델 배포 질문

23.06.08 23:41 작성 조회수 684

0

안녕하세요. 강의를 통해 많은 도움 받고 있습니다.

강의 수강 중에 질문이 있습니다!

 

  1. 모델 학습할 때 학습 데이터를 전처리 과정(라벨 인코딩, 스케일링 등) 과 하이퍼 파라미터 튜닝을 거쳐 모델을 생성하는데요. 이 후 실제 서비스에 사용(웹 서비스에 rest api로 제공) 할 때, 실제 input 값으로 들어오는 값들을 이용해서 예측을 한다고 이해했습니다.
    이 때 실제 input 데이터는 데이터 전처리가 진행이 안되어서 문자열 데이터도 들어오고, 스케일링 작업이 진행이 안된 데이터일 텐데 이 때 모델 api 호출 전 코드 레벨에서 전처리 과정을 해줘야 하는 걸까요?
    
    질문 드리는 이유는 사이킷런 라이브러리를 통한 전처리를 진행해서 모델을 생성했고, 해당 모델을 rest api로 제공 하고 싶습니다.
    그리고 해당 api를 spring boot 웹 어플리케이션에서 호출하여 사용하고자 하는데
    이때 실제 input 값들을 spring boot 코드에서 동일하게 데이터 전처리를 하여 전달하는게 어색해 보여서요.
    실무에서는 어떻게 서비스 하는지 궁금합니다.

  2. LightGBM 을 베이지안 최적화를 통해 하이퍼 파라미터를 찾을 때, n_estimators=100 으로 축소하여 최적의 하이퍼 파라미터를 찾고 나서, 최종적으로 n_estimators=400으로 최적의 하이퍼 파라미터와 함께 모델을 학습한 예제를 봤습니다.
    n_estimators=100 을 통해 찾은 최적의 하이퍼 파라미터가 n_estimators=400으로 증가시켰을 때도 동일하게 최적의 하이퍼 파라미터라서 이렇게 보여주신걸까요?

 

감사합니다.

답변 2

·

답변을 작성해보세요.

1

안녕하십니까,

  1. spring boot에서 전처리 작업은 어려워 보입니다. LabelEncoding이나 Scaling등의 작업은 학습 시 사용된 Encoder나 Scaler를 적용해 줘야 하기 때문입니다.

    Spring boot에서는 REST API를 호출할 때 인자로 사용자에게 입력 받은 값을 그대로 넣거나 최소한의 가공만 수행하고, REST API를 구축한 쪽에서(즉 파이썬쪽에서) 해당 입력값을 받아서 전처리를 한 뒤에 모델 predict 결과를 반환해 주는 것이 좋습니다.

     

  2. n_estimators=100 을 통해 찾은 최적의 하이퍼 파라미터가 n_estimators=400으로 증가시켰을 때와 동일한 최적의 하이퍼 파라미터 일 수 없습니다. 그럼에도 이렇게 적용한 이유는 n_estimators가 커지면 최적화를 하는데 너무 오랜 시간이 걸리기 때문이며, n_estimators가 어느 정도 (적정) 횟수 이상 일 때 찾은 최적 하이퍼 파라미터에 기반한 모델 성능은 전반적으로 높은 성능을 가지게 때문입니다.

    그래서 n_estimators가 상대적으로 작은 상태에서 최적화 한 뒤 n_estimators를 늘리면, 조금 덜 정확한 최적화 하이퍼파라미터를 도출하더라도 최적화 시간을 줄여 주기 때문입니다.

     

    물론 Kaggle과 같은 Competition에서는 조금의 성능 차이라도 순위가 크게 바뀔 수 있기 때문에 아주 작은 모델 성능이라도 높이기 위해서 n_estimators 역시 높게 한 상태에서 최적화를 할 필요가 있지만, 굳이 하이퍼 파라미터 최적화 개념 실습을 위해서 그렇게 까지 할 필요는 없으며, 실무에서도 대용량의 데이터 세트를 학습 시킬 때 n_estimators를 너무 높게 설정하면 최적화 시간이 오래 걸리기 때문에 이런 기법을 소개 시켜드린 것입니다.

     

    감사합니다.

     

0

zcx6263님의 프로필

zcx6263

질문자

2023.06.09

안녕하세요. 자세한 답변 너무 감사합니다!

 

1번 답변 주신 부분에서 한가지 궁금한게 있습니다.

spring boot에서 전처리 작업은 어렵다고 이해를 했고, 결국 모델을 학습 전 전처리 했던 것처럼

실제 데이터를 전처리 후 모델 predict를 통해 예측한다. 로 이해 했습니다.

 

위 내용만 들었을 때, 어떻게 작업을 해야 할지..조금 감이 안 잡히는데요.

(생성한 모델에 input 값을 넣어 주기 위한 별도의 api(전처리 과정을 해주기 위한)를 생성해야 할지..)

혹시 참고할만한 링크나 키워드가 있을까요?

 

아래는 개략적인 Pseudo 코드 입니다.

먼저 LabelEncoder등을 학습 데이터를 전처리한뒤 모델을 학습 완료했다고 가정하겠습니다. 학습 완료된 model을 pickle 형태로 저장합니다. 그리고 학습 시 사용한 LabelEncoder도 pickle로 저장합니다.

저장된 파일명은 모델의 경우 model.pkl, LabelEncoder의 경우 label_encoder.pkl로 하겠습니다.

그리고 spring에서는 파이썬 서버에 다시 REST API 호출 하는데 Fast API로 구축된 서버로 가정하겠습니다. 먼저 pickle로 저장된 모델과 LabelEncoder를 FastAPI 기동시 생성합니다.

from fastapi import FastAPI

import pickle

import pandas as pd

app = FastAPI()

model = pickle.load("model.pkl")

label_encoder = pickle.load("label_encoder.pkl")

""" 아래는 REST API로 호출되는 Fast API 함수 입니다. 인자로 Query String 등의 inference할 feature_data를 입력 받습니다. """

@app.get("/inference/{feature_data}")

async def predict_item(feature_data: str):

""" feature_data를 numpy array나 DataFrame으로 변경하십시요 """

df = pd.DataFrame(.....)

df['encoded_column'] = label_encoder.transform(df['old_column']

""" 전처리 완료된 데이터로 model에 predict() 하십시요 """

prediction = model.predict(df)

return {"prediction": prediction}