Inflearn Community Q&A
혹시 사이킷런에서 이런게 될까요?
Written on
·
642
0
크게 두가지의 질문이 있습니다.
1. 서비스화 질문
2. 학습한 데이터 저장/로드 질문
3. 추가 학습에 대한 질문
1. 사이킷런을 서비스화를 한다고 하였을 때 파이썬 모듈로 서비스로 올려서 학습까지 진행한뒤에 웹서비스같은 걸 띄워서 피쳐들을 파라미터를 받는 형식으로 해서 예측 결과를 리턴하도록 서비스를 구성해야 하나요? 일반 현업이나 많이 쓰이는 방법이 궁금해서 질문 드립니다.
2. 만약 서비스를 하다가 서비스를 재실행해야 되는 문제나 여러가지 문제가 생길경우 학습한 데이터를 서비스를 올릴때 다시 학습을 진행해야 하나요? 아니면 학습한 메모리 데이터를 따로 저장하는 기능이 있어 다시 실행할 때 다시 로드 후 바로 서비스화 할 수 있나요?
3. 현재 학습한 학습기에다가 추가로 어떠한 데이터들을 추가적으로 학습을 시키고 싶을경우 이 피쳐들을 다시 이전 피쳐들과 합쳐서 다시 학습을 시키는 방법밖에 없을까요? 예를 들어 이전 학습기는 어제까지 데이터를 학습해서 서비스를 하고 하루뒤에 오늘 데이터를 추가해서 학습해야 하는 상황에서 좋은 방법이 있을까요?
이런 기술들이 현업에서 사용될 니즈가 있는 기술인데 생각하다 궁급해서 질문 남김니다!!
Answer 1
1
안녕하십니까,
1. 보통은 백엔드에서 학습을 한 뒤 이것을 Serialize 하여 파일로 저장합니다. 그리고 이 파일을 서비스 단에 올린 뒤 메모리에 load하여 서비스 합니다. serialization와 메모리 load는 보통 python의 pickle 객체를 활용하는 데 이를 위해 sklearn은 joblib를 지원합니다.
from sklearn.externals import joblib
clf = XGBClassifier()
clf.fit(....)
# 아래는 xgboost_model.pkl 로 classifier 모델을 pickle로 저장합니다.
filename = 'xgboost_model.pkl'
joblib.dump(clf, filename)
# 아래는 pickle 파일을 classifier 모델로 메모리 로딩합니다.
clf = joblib.load(filename)
clf.predict(....)
서비스 단에서는 최초에 pickle 파일을 학습된 classifier 를 메모리로 로드 한 뒤에 predict() 메소드를 호출합니다. 이 predict()메소드의 인자로 피처들을 파라미터로 받은 뒤 predict() 결과를 반환하는 형식으로 서비스 합니다.
2. 보통은 backend나 서비스 단에 학습 모델을 pickle 파일 형태로 저장하기 때문에 문제가 생기는 경우 서버를 내리거나 관련 프로세스를 죽이고 다시 파일을 로드하면 됩니다.
3. 추가되는 데이터가 feature를 추가하는 것이면 재학습 시켜야 합니다. 추가되는 데이터가 row 일 경우에는 incremental learning이 가능할 것 같습니다만, 저 역시 incremental learning 경험은 없습니다. 보통은 incremental learning 보다는 저녁에 batch로 재 학습을 시키는 방법을 사용하고 있습니다. incremental learning에 대한 자료는 아래를 참조 부탁드립니다.
https://scikit-learn.org/0.15/modules/scaling_strategies.html
좋은 질문 감사합니다.





