본문 바로가기
목차
ML

[ML] linear_model.SGDRegressor

by ds31x 2026. 4. 28.
728x90
반응형

SGDRegressor 익히기:

SGDRegressor
SGD(Stochastic Gradient Descent)를 이용하여
linear regression 계열 모델을 학습하는 scikit-learn estimator
임.

예측식(prediction function)은 기본적으로 다음과 같음.

$$
\hat{y} = \mathbf{x}^{\top}\mathbf{w} + b
$$

 

즉, SGDRegressor는 non-linear model이 아님.

  • 모델 구조는 linear model이고,
  • 이를 학습하는 optimizer가 SGD 계열 알고리즘인 것임.

https://dsaint31.tistory.com/960

 

Linear Regression (Summary)

0. Linear Regression 분류Linear Regression ├── 1. Error model 기준 │ ├── OLS 계열 │ │ ├── X: fixed or error-free │ │ ├── y: noise 있음 │ │ └── $\text{Var}(\varepsilon) = \sigma^2\mathbf{I}$│ │ │ ├

dsaint31.tistory.com


1. SGDRegressor의 핵심 이해

SGDRegressor는 다음 조합으로 이해하는 것이 가장 정확함.

구성 요소 의미
Model linear regression model
Prediction $\hat{y} = \mathbf{x}^{\top}\mathbf{w} + b$
Loss squared error, Huber, epsilon-insensitive 등
Penalty $L_2$, $L_1$, Elastic Net
Optimizer SGD

 

즉, SGDRegressor는 다음과 같은 estimator임.

linear model + loss function + penalty + SGD optimizer

 

따라서 SGDRegressor는 OLS처럼 "closed-form solution을 한 번에 구하는 방식(Analystic Approach)"아님.


parameter를 반복적으로 update하면서 loss를 줄이는 iterative optimization 방식임.

https://dsaint31.me/mkdocs_site/ML/ch09/op_summary/#optimizers

 

BME

AdaGrad Adam GD Gradient Momentum NAG Nadam RMSprop Stochastic Gradient Descent Optimizers Optimizer는 주어진 손실 함수(loss function)를 최소화하기 위해 모델의 parameters를 어떤 규칙에 따라 업데이트할지를 정의하는 알

dsaint31.me


2. SGD란?

SGD(Stochastic Gradient Descent)는

  • 매 iteration마다 무작위로 선택한 단일 샘플의 gradient를 이용하여
  • 파라미터를 갱신하는 1차 최적화 알고리즘(first-order optimizer)

 

보다 자세한 건 다음을 참고: https://dsaint31.tistory.com/633

 

[ML] Gradient Descent Method: 경사하강법

Gradient Descent Method (경사하강법) : 1. 정의 및 수식Steepest Gradient Descent Method로도 불리는Gradient Descent Method(경사하강법)는 여러 Optimization 방법 중 가장 많이 사용되는 방법들 중 하나임.training set $X$

dsaint31.tistory.com

 

Gradient Descent 계열은

한 번 parameter를 update할 때 data 얼마나 사용하는지에 따라 구분됨.

방식 한 번 update에 사용하는 data 특징
Batch GD 전체 training set 안정적이지만 느림
Mini-batch GD 일부 sample 묶음 안정성과 속도의 절충
SGD sample 1개 빠르지만 update가 noisy함

 

전체 objective function이 다음과 같다고 하자.

$$
J(\mathbf{w}) = \frac{1}{m}\sum_{i=1}^{m} L_i(\mathbf{w})
$$

Batch GD는 전체 training set의 gradient를 계산하여 parameter를 update함.

$$
\nabla J(\mathbf{w}) = \frac{1}{m}\sum_{i=1}^{m}\nabla L_i(\mathbf{w})
$$

반면 SGD는 각 update에서 sample 하나의 loss gradient를 사용함.

$$
\nabla L_i(\mathbf{w})
$$

따라서 SGD의 update는 다음처럼 이해할 수 있음.

$$
\mathbf{w} \leftarrow \mathbf{w} - \eta \nabla L_i(\mathbf{w})
$$

  • 여기서 $\eta$는 learning rate임.

즉, SGD는

  • 전체 data를 보고 한 번 update하는 것이 아니라,
  • sample 하나를 보고 parameter를 조금씩 update하는 방식임.

이 때문에 SGD는 다음 특성을 가짐.

  • update가 빠름
  • 큰 size의 data에 적합함 (Batch GD는 너무 느려짐)
  • 하지만 update 방향이 noisy함
  • feature scaling에 민감함
  • learning rate 설정에 영향을 많이 받음

3. SGDRegressor의 fit() 동작

기본 사용 예는 다음과 같음.

from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

model = make_pipeline(
    StandardScaler(),
    SGDRegressor(
        loss="squared_error",
        penalty="l2",
        alpha=0.0001,
        max_iter=1000,
        tol=1e-3,
        random_state=42
    )
)

model.fit(X_train, y_train)

SGDRegressor.fit()은 내부적으로 training sample을 순회하면서 parameter를 반복 update함.

 

중요한 점은 다음임.

  • SGDRegressor에는 batch_size parameter가 없음.
  • fit()에서 사용자가 Batch GD, Mini-batch GD, SGD를 직접 선택하지 않음.
  • 이름 그대로 SGD 계열 방식으로 동작함.
  • max_iter는 training set 전체를 몇 번 반복할지에 가까운 값임.
  • shuffle=True이면 epoch마다 sample 순서를 섞음.

즉, 다음과 같은 parameter는 존재하지 않음.

batch_size=32
optimizer="batch_gd"
optimizer="mini_batch_gd"

 

SGDRegressor.fit()
사용자가 batch size를 지정하는
mini-batch 학습 API가 아니라,
scikit-learn 내부 구현에 따라
SGD 방식으로 sample을 순회하며
parameter를 update하는 API임.


4. Mini-batch GD처럼 사용하고 싶은 경우

SGDRegressor에는 batch_size parameter가 없으므로, mini-batch GD를 명시적으로 선택할 수 없음.

 

단, partial_fit()을 사용자가 batch 단위로 반복 호출 하면 mini-batch 학습과 비슷한 형태를 만들 수 있음.

from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.utils import shuffle

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)

model = SGDRegressor(
    loss="squared_error",
    penalty="l2",
    alpha=0.0001,
    learning_rate="invscaling",
    eta0=0.01,
    max_iter=1,
    tol=None,
    random_state=42
)

batch_size = 32
n_epochs = 10

for epoch in range(n_epochs):
    X_epoch, y_epoch = shuffle(X_scaled, y_train, random_state=epoch)

    for start in range(0, len(X_epoch), batch_size):
        end = start + batch_size

        X_batch = X_epoch[start:end]
        y_batch = y_epoch[start:end]

        model.partial_fit(X_batch, y_batch)

이 코드는 다음 구조를 가짐.

  • 전체 data를 epoch마다 shuffle
  • batch_size 단위로 data를 나눔
  • 각 batch마다 partial_fit() 호출
  • 여러 번 반복하여 점진적으로 parameter update

다만 여기서 주의할 점은

  • partial_fit()에 batch를 넣는다고 해서
  • scikit-learn이 deep learning framework처럼
  • 명시적인 mini-batch gradient descent API를 제공하는 것은 아님.

더 정확히는 다음과 같음.

partial_fit()
“주어진 data chunk를 이용해
현재 model을 이어서 한 번 더 학습시키는
incremental learning API”임.

 

즉, partial_fit()의 핵심 목적은

  • mini-batch optimizer 선택이 아니라
  • incremental learning임.

5. fit()partial_fit()의 차이

fit()partial_fit()의 차이는 매우 중요함.

구분 fit() partial_fit()
목적 model을 처음부터 학습 기존 model을 이어서 점진적으로 학습
호출 방식 보통 한 번 호출 여러 번 반복 호출 가능
data 사용 전체 training set을 전달하는 경우가 일반적 data chunk 또는 mini-batch 단위 전달 가능
model 상태 기존 학습 상태를 새로 초기화하는 성격 기존 coefficient를 유지하며 추가 update
online learning 부적합 적합
batch size 제어 직접 제어 불가 사용자가 chunk 크기를 정해 반복 호출 가능

 

예를 들어 다음 코드는 일반적인 전체 학습임.

model.fit(X_train, y_train)

 

반면 다음 코드는 data를 나누어 순차적으로 학습하는 방식임.

model.partial_fit(X_batch_1, y_batch_1)
model.partial_fit(X_batch_2, y_batch_2)
model.partial_fit(X_batch_3, y_batch_3)

 

즉, partial_fit()은 다음 상황에서 유용함.

  • data가 너무 커서 한 번에 메모리에 올리기 어려운 경우
  • streaming data를 순차적으로 학습해야 하는 경우
  • online learning이 필요한 경우
  • 사용자가 data chunk 단위로 학습 흐름을 제어하고 싶은 경우

정리하면 다음과 같음.

fit()
전체 학습을
scikit-learn에 맡기는 방식이고,
partial_fit()
사용자가 data를 나누어
model을 점진적(incremental)으로 update하는 방식임.


6. 주요 parameter

6-1. loss

loss는 residual을 어떻게 벌점화할지 결정함.

loss 의미
"squared_error" 일반적인 linear regression의 squared error
"huber" outlier에 상대적으로 robust한 Huber loss
"epsilon_insensitive" 일정 오차 이하는 무시하는 SVR 유사 loss
"squared_epsilon_insensitive" epsilon 바깥 오차를 제곱으로 벌점화

 

예:

SGDRegressor(loss="squared_error")
SGDRegressor(loss="huber", epsilon=0.1)
SGDRegressor(loss="epsilon_insensitive", epsilon=0.1)

 

squared_error를 사용하면 일반적인 linear regression objective에 가까움.

 

huber loss는 다음을 참고:

https://dsaint31.tistory.com/865#2-2.%20%EB%8C%80%ED%91%9C%EC%A0%81%EC%9D%B8%20%24%5Crho()%24%20%ED%95%A8%EC%88%98%3A%20Huber%20Function%20and%20Tukey%20Function-1-3

 

[Math] Maximum Likelihood Estimator: M-Estimator

1. M-Estimator란M- Estimator는 Noise 에 Rubust 한 Statistical Estimator(통계적추정방법) 의 하나로서,Maximum Likelihood Estimatro (MLE)를 일반화한 방법임.이는 모델 parameter $\boldsymbol{\theta}$를 추정하기 위해residual $\

dsaint31.tistory.com


6-2. penalty

penalty는 regularization 방식을 결정함.

penalty 의미
"l2" Ridge regression 계열
"l1" Lasso regression 계열
"elasticnet" Ridge + Lasso 혼합
None regularization 사용 안 함

 

예:

SGDRegressor(penalty="l2")
SGDRegressor(penalty="l1")
SGDRegressor(penalty="elasticnet", l1_ratio=0.5)

6-3. alpha

alpha는 regularization strength임.

SGDRegressor(alpha=0.0001)

해석은 다음과 같음.

  • alpha가 클수록 regularization이 강해짐
  • coefficient가 더 작아지는 방향으로 학습됨
  • 너무 크면 underfitting 가능
  • 너무 작으면 overfitting 가능

6-4. learning_rate, eta0

SGD는 parameter를 반복 update하므로 learning rate 설정이 매우 중요함.

SGDRegressor(
    learning_rate="invscaling",
    eta0=0.01
)
parameter 의미
learning_rate learning rate schedule
eta0 초기 learning rate
power_t invscaling에서 learning rate 감소율
  • learning rate eta0가 너무 크면 발산할 수 있고,
  • 반대로 너무 작으면 수렴이 매우 느려질 수 있음.

learning_rate는

  • 단일 learning rate 값을 의미하는 것이 아니라,
  • update가 진행되면서 learning rate $\eta$를 어떻게 조정할지 결정하는 schedule 임
learning rate desc.
"constant" $\eta=\eta_0$ 상수 learning rate
"optimal" $\eta=\frac{1}{\alpha(t+t_0)}$ $t_0$는 "optimal" schedule에서
내부적으로 hueristic으로 정함.
eta_0의 영향이 없으나 alpha의 영향을 받음.
"invscaling" $\eta=\frac{\eta_0}{t^{\text{power_t}}}$ 내부 counter $t$가 증가시 learning rate 감소
power_t가 클수록 learning rate가 빠르게 감소 (기본 0.25)
참고로 이 경우 eta_0=0.01임.
$t$는 sample하나를 처리한 횟수, 즉 update횟수임.
"adaptive" 초기엔 $\eta=\eta_0$
개선이 없으면 $\eta \leftarrow \frac{\eta}{5}$
성능개선이 없을 경우
learning rate 김소함.

6-5. max_iter, tol

SGDRegressor(
    max_iter=1000,
    tol=1e-3
)

SGDRegressor에서 max_iter는 epoch 수, 즉 training set 전체를 최대 몇 번 반복해서 볼 것인지 를 의미함.

  • 예를 들어 training sample이 $m=1000개$이고 max_iter=5이면, 최대 5 epoch 동안 학습함.
  • 즉, 전체 sample 기준으로는 최대 약 5000개의 sample을 순차적으로 보며 update할 수 있음.
  • 단, 실제 update 횟수는 내부 구현, shuffle 여부, 조기 종료 여부에 따라 달라질 수 있음.

tol은 학습을 조기 종료할지 판단하는 기준임.

  • tolNone이 아니면,
  • scikit-learn은 일정 epoch 동안 loss 또는 score가 충분히 개선되지 않는 경우 학습을 멈춤.
parameter 의미
max_iter training set 전체 반복 횟수의 최대값
tol 수렴 기준 허용 오차

tol=None으로 설정하면 조기 종료 기준을 사용하지 않고 max_iter만큼 반복함.


6-6. warm_start

warm_startfit()을 다시 호출할 때 이전 학습 결과를 초기값으로 재사용할지 결정하는 parameter임.

 

partial_fit()과 비슷하게 이전 학습 결과를 활용한다는 공통점이 있지만, 목적과 동작 방식은 다름.

 

warm_start=True는 기존 coefficient를 완전히 버리지 않고, 다음 fit()의 초기값으로 사용함.

model = SGDRegressor(warm_start=True)

model.fit(X_train, y_train)
model.fit(X_train, y_train)

 

반면 partial_fit()은 기존 model 상태(scheduler)를 유지한 채, 새로 들어온 data chunk를 이용해 추가 update를 수행하는 메서드임.

model = SGDRegressor()

model.partial_fit(X_batch_1, y_batch_1)
model.partial_fit(X_batch_2, y_batch_2)
model.partial_fit(X_batch_3, y_batch_3)

특히 SGDRegressor에서는 learning rate 관련 내부 counter의 동작이 다름.

  • fit()을 다시 호출하면 내부 sample counter가 reset됨.
    • 따라서 warm_start=True로 이전 coefficient를 초기값으로 재사용하더라도,
    • learning rate schedule은 새 fit() 호출 기준으로 다시 시작됨.
  • partial_fit()은 기존 model 상태를 이어서 update하므로 sample counter가 계속 누적됨.

반면 partial_fit()은 기존 model 상태를 이어서 update하므로 sample counter가 계속 누적됨.

구분 warm_start=True partial_fit()
목적 이전 해를 초기값으로 재사용 기존 model을 이어서 점진적으로 학습
사용 메서드 fit() partial_fit()
적합한 상황 같은 문제를 다시 빠르게 최적화 streaming data, out-of-core learning
data chunk 처리 주 목적 아님 주 목적
기존 coefficient 다음 fit()의 초기값으로 사용 그대로 유지하며 추가 update
learning rate counter fit() 호출 시 reset 계속 누적
online learning 부적합 적합

warm_start
재학습시 초기값 재사용 옵션이고,
partial_fit()
incremental learning을 위한 추가 학습 메서드임.


7. OLS, Ridge, Lasso, ElasticNet과의 관계

SGDRegressor는 설정에 따라 기존 linear regression 계열 모델과 비슷한 objective를 SGD로 풀 수 있음.

설정 유사한 모델
loss="squared_error", penalty=None OLS
loss="squared_error", penalty="l2" Ridge
loss="squared_error", penalty="l1" Lasso
loss="squared_error", penalty="elasticnet" ElasticNet

 

예:

# OLS 유사
SGDRegressor(
    loss="squared_error",
    penalty=None
)

# Ridge 유사
SGDRegressor(
    loss="squared_error",
    penalty="l2",
    alpha=0.0001
)

# Lasso 유사
SGDRegressor(
    loss="squared_error",
    penalty="l1",
    alpha=0.0001
)

# ElasticNet 유사
SGDRegressor(
    loss="squared_error",
    penalty="elasticnet",
    alpha=0.0001,
    l1_ratio=0.5
)

 

단, 이들이 LinearRegression, Ridge, Lasso, ElasticNet과 완전히 같은 결과를 내는 것은 아님.

 

이유는 다음과 같음.

  • optimizer가 다름
  • convergence tolerance가 다름
  • learning rate 영향을 받음
  • feature scaling 영향을 크게 받음
  • SGD는 sample 순서와 random state의 영향이 큰 편임.

즉, SGDRegressor

  • 동일한 objective를
  • 정확히 닫힌 형태로 푸는 estimator가 아니라,
  • SGD로 근사적으로 최적화하는 estimator임.

8. 학습된 coefficient 확인

SGDRegressor는 linear model이므로 학습 후 coefficient를 확인할 수 있음.

sgd = model.named_steps["sgdregressor"]

print(sgd.coef_)
print(sgd.intercept_)

 

feature name과 함께 보고 싶으면 다음처럼 작성할 수 있음.

import pandas as pd

sgd = model.named_steps["sgdregressor"]

coef_table = pd.Series(
    sgd.coef_,
    index=X_train.columns
).sort_values(key=abs, ascending=False)

print(coef_table)

 

coef_의 절댓값은 feature importance처럼 참고할 수 있음.

 

단, 중요한 조건이 있음.

coefficient 크기를
RandomForest 등의
feature importance처럼 비교하려면
반드시, feature scaling이 필요 함.

feature마다 scale이 다르면 coefficient 크기 비교가 왜곡되기 때문임.


9. Non-linear regression이 필요한 경우

SGDRegressor 자체는 linear model임.

  • SGDRegressor에 어떤 parameter를 준다고 해서
  • 모델이 직접 non-linear model로 바뀌지는 않음.

Directed method기반의 LinearRegressor 와 마찬가지로,
SGDRegressor도 Non-linear 관계를 반영하려면 input feature를 변환해야 함.

 

예를 들어 PolynomialFeatures를 함께 쓰면 원래 입력 $\mathbf{x}$ 기준으로는 non-linear regression처럼 동작할 수 있음.

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import SGDRegressor

model = make_pipeline(
    PolynomialFeatures(degree=2, include_bias=False),
    StandardScaler(),
    SGDRegressor(
        loss="squared_error",
        penalty="l2",
        random_state=42
    )
)

model.fit(X_train, y_train)

 

이 경우 transformed feature space에서는 여전히 linear model임.

하지만 원래 입력 기준으로는 다음과 같은 항이 포함될 수 있음.

$$
\hat{y} = w_1x_1 + w_2x_2 + w_3x_1^2 +w_4x_1x_2+w_5x_2^2+b
$$

즉,

SGDRegressor 자체는 linear model 임.
하지만, feature transform을 추가하면
원래 입력 공간에서는 non-linear model처럼 사용할 수 있음.


10. 언제 SGDRegressor를 쓰는가?

SGDRegressor는 다음 상황에서 유리함.

상황 이유
sample 수가 매우 많음 전체 행렬 연산 없이 반복 update 가능
sparse data sparse matrix에 적합
online learning 필요 partial_fit() 사용 가능
data가 계속 들어옴 incremental update 가능
빠른 baseline 필요 큰 data에서 빠르게 근사해를 구할 수 있음

 

반대로 다음 상황에서는 다른 estimator가 더 적합할 수 있음.

상황 더 적합한 선택
작은 dense data LinearRegression, Ridge
안정적인 Ridge 해 Ridge
안정적인 Lasso 해 Lasso
solver를 명시적으로 선택하고 싶음 Ridge
복잡한 non-linear 관계 tree model, kernel model, neural network

11. 요약

SGDRegressor는 다음처럼 이해하면 됨.

SGDRegressor
linear regression 계열 objective를
Stochastic Gradient Desecent 방식으로
반복 최적화(iterative optimization)하는 estimator임.

 

다음을 기억할 것:

  • SGDRegressor는 linear model임.
    • 예측식은 $\hat{y} = \mathbf{x}^{\top}\mathbf{w} + b$ 형태임.
  • SGD는 기본적으로 sample 하나의 gradient를 이용해 parameter를 update하는 방식임.
    • SGDRegressor.fit()에는 batch_size parameter가 없음.
  • fit()은 전체 학습 과정을 estimator에 맡기는 방식임.
    • partial_fit()은 data chunk를 이용해 기존 model을 이어서 update하는 incremental learning API임.
    • partial_fit()을 batch 단위로 반복 호출하면 mini-batch 학습과 유사한 구조를 만들 수 있음.
  • loss를 바꾸면 Huber regression, epsilon-insensitive regression 등으로 사용할 수 있음.
  • penalty를 바꾸면 Ridge, Lasso, ElasticNet 유사 objective를 SGD로 풀 수 있음.
  • feature scaling이 매우 중요함.
  • 큰 data, sparse data, online learning에 적합함.
  • 참고로, 작은 data에서는 LinearRegression, Ridge, Lasso, ElasticNet이 더 안정적일 수 있음.

같이보면 좋은 자료들

 

https://dsaint31.me/mkdocs_site/ML/ch01/ch01_41/?h=regr#1-linear-regression

 

BME

bagging boosting ensemble machine learning random forest regression scikit-learn support vector machine [ML] Classic Regressor (Summary) DeepLearning 계열을 제외한 Regressor 모델들을 간단하게 정리함. ​ 분류 Instance Based Algorithm Mod

dsaint31.me

https://dsaint31.tistory.com/960

 

Linear Regression (Summary)

0. Linear Regression 분류Linear Regression ├── 1. Error model 기준 │ ├── OLS 계열 │ │ ├── X: fixed or error-free │ │ ├── y: noise 있음 │ │ └── $\text{Var}(\varepsilon) = \sigma^2\mathbf{I}$│ │ │ ├

dsaint31.tistory.com

https://dsaint31.tistory.com/633

 

[ML] Gradient Descent Method: 경사하강법

Gradient Descent Method (경사하강법) : 1. 정의 및 수식Steepest Gradient Descent Method로도 불리는Gradient Descent Method(경사하강법)는 여러 Optimization 방법 중 가장 많이 사용되는 방법들 중 하나임.training set $X$

dsaint31.tistory.com

 

728x90