Python - sklearn - warm_start.

1 분 소요

2-line summary

  • sklearn에서 model의 warm_start의 default는 False임. 이는 .fit을 실행할 때, 이전에 업데이트된 weight(coefficient)를 초기화하고 다시 fitting한다는 것을 의미한다.
  • 만약 warm_start를 True로 설정하고 진행한다면, .fit을 실행할 때 이전의 weight를 기억하고 그대로 이어서 업데이트되는 것을 말한다.

Intro

  • 일반적인 머신러닝 모델 구축은 그냥 fit - predict가 다죠. 네, 데이터를 전달하고 학습시키고, 예측합니다. 그리고 sklearn의 대부분의 모델들의 메소드도 이렇게 정리되어 있구요.
  • 다만, 저처럼 컴퓨터의 메모리가 형편없다거나, 하는 경우에는 데이터를 나누어서 학습하는 것이 필요합니다. 한번에 다 넘기면 컴퓨터가 뭔가 느려터지게 되거든요. 따라서, 필요에 따라서 데이터를 나누어 학습하는 것이 필요하다는 이야기죠.네, 텐서플로우를 공부해보신 분은 빠르게 이해하실 텐데, mini-batch로 학습하는 것을 말합니다.

sklearn - fitting with warmstart=False

  • 네 일단은 기본적인 sklearn 모델에 대해서 적용해보겠습니다. 보통 다음과 같은 형태로 코드를 작성해서 사용하죠.
  • 아래 코드에서는 SGDRegressor이라고하는, Stochastic Gradient Decent를 사용해서 linear model에 대해 coefficient를 업데이트하는 모델을 사용하였고, X, Y를 임의로 만들어주었습니다.
  • 그리고, max_iter는 10으로 매우 작게 세팅했죠. 이 아이는 epoch과 동일한데, weight(coefficient)를 업데이트하는 작업을 10번만 하겠다는 말이 되죠. 물론, 이 값만으로는 절대로 converge하지 않습니다만, 우리는 그냥 weight가 어떻게 달라지는지만 볼 꺼니까요.
import numpy as np
from sklearn.linear_model import SGDRegressor

np.random.seed(0)

# X, Y
X = np.linspace(-1, 1, num=50).reshape(-1, 1)
Y = (X*3.3 + 5.6).reshape(50,)

# Define Model
sgd_reg_model = SGDRegressor(
    random_state=0,
    verbose=0,
    max_iter=10,
)
  • 그리고, 위에서 정의한 모델에 대해서 fitting을 해줍니다.
  • 아래 코드에서 보시면, fitting을 두번 해준 것을 알수 있죠. 네 이렇게 하면 한번에 iteration 10번씩 총 20번 해주는 것이 아닐까요?
print(f"== First  fitting")
sgd_reg_model.fit(X, Y)
print(f"---- Coefficient: {sgd_reg_model.coef_}")

print(f"== Second fitting")
sgd_reg_model.fit(X, Y)
print(f"---- Coefficient: {sgd_reg_model.coef_}")
  • 안타깝게도 그렇지 않습니다. 아래 결과를 보시면, 첫번째 fitting과 두번째 fitting 때의 coefficient가 같은 것을 알 수 있죠.
== First  fitting
---- Coefficient: [1.26229792]
== Second fitting
---- Coefficient: [1.26229792]
  • 이는 SGDRegressor를 선언해줄 때, 이 아이의 parameter인 warm_startFalse로 되어 있기 때문이죠. warm_start를 한국말로 번역한다면 “따뜻한 시작”정도가 되겠죠. 즉, 이 값이 True이면, 이전에 학습했던 것을 기억한다는 이야기이고, False이면 이 전에 학습했던 것을 기억하지 않는다는 말이 됩니다.
  • 따라서, 아래 코드와 같이 warm_startTrue로 바꾸고 진행하면, 첫번째 fitting할 때와 두번째 fitting할 때의 coefficient가 달라지는 것을 알 수 있죠.
sgd_reg_model = SGDRegressor(
    random_state=0,
    verbose=0,
    max_iter=10,
    warm_start=True
)
print(f"== First  fitting")
sgd_reg_model.fit(X, Y)
print(f"---- Coefficient: {sgd_reg_model.coef_}")

print(f"== Second fitting")
sgd_reg_model.fit(X, Y)
print(f"---- Coefficient: {sgd_reg_model.coef_}")
== First  fitting
---- Coefficient: [1.26229792]
== Second fitting
---- Coefficient: [2.04389939]

reference

댓글남기기