Python - sklearn - fit, partial_fit

1 분 소요

2-line summary

  • .fit은 여러 weight fitting을 max_iter까지 수행하는 경우를 말하고, .partial_fit은 딱 1번의 iteration만을 진행하는 것을 말한다.
  • 따라서, 만약 ‘converge’하지 않는다는 조건 하에서, parameter max_iter를 10으로 설정하고, .fit을 수행하는 경우와, .partial_fit을 10번 수행하는 경우는 결과가 비슷하다.

Intro

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

sklearn - fitting vs. partial_fitting

  • 네 일단은 기본적인 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,)

Fitting

  • 다음 코드에서는 모델 SGDRegressor에 대해서, max_iter=10를 설정하였습니다. 즉, 컨버지하지 않는다면 10번 weight를 업데이트하겠다는 이야기죠.
sgd_reg_model_fit = SGDRegressor(
    random_state=0,
    verbose=0,
    max_iter=10,
)
print(f"== First  fitting")
sgd_reg_model_fit.fit(X, Y)
print(f"---- Coefficient: {sgd_reg_model_fit.coef_}")
print("---"*20)
== First  fitting
---- Coefficient: [0.81407501]

partial-Fitting

  • 다음 코드에서는 모델 SGDRegressor에 대해서, .fit가 아닌 .partial_fit을 실행합니다.
  • 결과를 보시면 이전과 weight 값이 매우 비슷하죠. 완전히 똑같지는 않네요. 뭐 세부적인 설정값이 조금 다른가 봅니다.
sgd_reg_model_partial_fit = SGDRegressor(
    random_state=0,
    verbose=0,
    max_iter=1,
    warm_start=True
)
print(f"== Second fitting")
for iteration_i in range(0, 5):
    sgd_reg_model_partial_fit.partial_fit(X, Y)
print(f"---- Coefficient: {sgd_reg_model_partial_fit.coef_}")
== Second fitting
---- Coefficient: [0.81001236]

wrap-up

  • 물론, .partial_fit를 사용하지 않고, 그냥 warmstart를 True로 설정하여, 이전의 weight를 기억하도록 한 다음 .fit을 사용하는 것 또한 방법이죠.

댓글남기기