
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_sizeparameter가 없음.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는 다음을 참고:
[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은 학습을 조기 종료할지 판단하는 기준임.
tol이None이 아니면,- scikit-learn은 일정 epoch 동안 loss 또는 score가 충분히 개선되지 않는 경우 학습을 멈춤.
| parameter | 의미 |
max_iter |
training set 전체 반복 횟수의 최대값 |
tol |
수렴 기준 허용 오차 |
tol=None으로 설정하면 조기 종료 기준을 사용하지 않고 max_iter만큼 반복함.
6-6. warm_start
warm_start는 fit()을 다시 호출할 때 이전 학습 결과를 초기값으로 재사용할지 결정하는 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_sizeparameter가 없음.
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
'ML' 카테고리의 다른 글
| Multi-Head "Masked/Cross" Attention - Transformer Decoder (1) | 2026.04.18 |
|---|---|
| Ex: Linear Regression 연습 (0) | 2026.04.11 |
| 튜토리얼: Gemini CLI + MCP + Context7 + VS Code Companion (작성중) (0) | 2026.04.11 |
| torch.nn.Module의 상태(state)-Parameter and Buffer (0) | 2026.04.09 |
| pytorch-torchinfo 란 (0) | 2026.04.09 |