๊ฒฝ์ฌ ํ๊ฐ๋ฒ(Gradient Descent)์ ์์ค ํจ์(Loss Function)์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ตฌํ์ฌ, ๊ธฐ์ธ๊ธฐ๊ฐ ๋ฎ์ ์ชฝ์ผ๋ก ๊ณ์ ์ด๋์์ผ ๊ทน์๊ฐ(์ต์ ์ ํ๋ผ๋ฏธํฐ)์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
LinearRegression: ์ ๊ท ๋ฐฉ์ ์(OLS)์ ์ฌ์ฉํด ํ ๋ฒ์ ํด๋ฅผ ๊ตฌํจ (๋ฐ์ดํฐ๊ฐ ์์ ๋ ์ ๋ฆฌ)SGDRegressor: ๊ธฐ์ธ๊ธฐ๋ฅผ ๋ฐ๋ผ ์กฐ๊ธ์ฉ ์ด๋ํ๋ฉฐ ํด๋ฅผ ๊ตฌํจ (๋ฐ์ดํฐ๊ฐ ๋งค์ฐ ํด ๋, ์ ์ง์ ํ์ต์ด ํ์ํ ๋ ์ ๋ฆฌ)import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from sklearn.linear_model import SGDRegressor # SGD ๋ชจ๋ธ ์ํฌํธ
# ์๊ฐํ ํฐํธ ์ค์
matplotlib.rcParams['font.family']='Malgun Gothic'
matplotlib.rcParams['axes.unicode_minus'] = False
# ๋ฐ์ดํฐ ๋ก๋
carDF = pd.read_csv('data/cars.csv', index_col='Unnamed: 0')
# ๋
๋ฆฝ๋ณ์(X)์ ์ข
์๋ณ์(y) ์ค์
x = carDF.iloc[:, :-1]
y = carDF.iloc[:, [-1]]
# Tip: SGDRegressor์์ y๋ ๋ณดํต 1์ฐจ์ ๋ฐฐ์ด(Series or ravel)์ ๊ถ์ฅํ์ง๋ง,
# ๋ฐ์ดํฐํ๋ ์ ํํ๋ ํ์ฉ๋จ. (warning์ด ๋ฐ ์ ์์)
SGD๋ ๋ฐ๋ณต ํ์ต์ ํ๋ฏ๋ก ์ด๋ป๊ฒ ํ์ต๋๋์ง ๊ณผ์ ์ ์ง์ผ๋ณด๋ ๊ฒ์ด ์ค์ํ๋ค.
verbose=1: ํ์ต ๊ณผ์ (๋ก๊ทธ)์ ์ถ๋ ฅํฉ๋๋ค.n_iter_no_change=100: 100๋ฒ ๋ฐ๋ณตํ๋ ๋์ ์ฑ๋ฅ ํฅ์์ด ์์ผ๋ฉด ํ์ต์ ์กฐ๊ธฐ ์ข
๋ฃ(Early Stopping)model = SGDRegressor(verbose=1, n_iter_no_change=100)
model.fit(x, y)
# --- ์คํ ๊ฒฐ๊ณผ ๋ก๊ทธ (์์) ---
# -- Epoch 1
# Norm: 3.82, NNZs: 1, Bias: 0.389145, T: 50, Avg. loss: 622.827902
# Total training time: 0.00 seconds.
# ...
# -- Epoch 170
# Norm: 3.85, NNZs: 1, Bias: -12.900648, T: 8500, Avg. loss: 156.947071
# Convergence after 170 epochs took 0.00 seconds
Avg. loss(ํ๊ท ์ค์ฐจ)๊ฐ ์ ์ ์ค์ด๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
# ํ์ต๋ ๊ธฐ์ธ๊ธฐ์ ์ ํธ
print("๊ธฐ์ธ๊ธฐ(w):", model.coef_)
print("์ ํธ(b):", model.intercept_)
# ๊ธฐ์ธ๊ธฐ(w): [3.84672995]
# ์ ํธ(b): [-12.90064768]
# ์๊ฐํ
pred = model.predict(x)
plt.scatter(x, y, label='์ค์ ๊ฐ')
plt.plot(x, pred, 'r--', label='SGD ์์ธก์ ')
plt.legend()
plt.show()

๊ฐ๋ ์ ๋ฆฌ
ํ๊ท ๋ชจ๋ธ์ด ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ์ ์ค๋ช ํ๊ณ ์๋์ง๋ฅผ 0 ~ 1 ์ฌ์ด์ ์ซ์๋ก ๋ํ๋.
- 1์ ๊ฐ๊น์ธ์๋ก: ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ฅผ ์๋ฒฝํ๊ฒ ์ค๋ช ํจ (์ข์)
- 0์ ๊ฐ๊น์ธ์๋ก: ๋ชจ๋ธ์ด ๋ฐ์ดํฐ์ ํ๊ท ์ ๋๋ฐ์ ์ค๋ช ๋ชปํจ (๋์จ)
- ๋ณดํต 0.5 ์ด์์ด๋ฉด ์๋ฏธ๊ฐ ์๋ค๊ณ ํ๋จํ๋ฉฐ, 0.7~0.8 ์ด์์ด๋ฉด ๊ฝค ๋์ ์ฑ๋ฅ์ผ๋ก ๋ณธ๋ค.

1. SST (Total Sum of Squares, ์ด ์ ๊ณฑํฉ):
2. SSE (Sum of Squared Errors, ์ค์ฐจ ์ ๊ณฑํฉ):
3. SSR (Sum of Squares due to Regression, ํ๊ท ์ ๊ณฑํฉ):
์ต์ข ๊ณต์
์์) ์ง๊ฐ ์์ธก
from sklearn.metrics import r2_score
# r2_score(y_true, y_pred)
# ์ฃผ์: y๋ 1์ฐจ์ ๋ฐฐ์ด ํํ์ฌ์ผ ์ ํํฉ๋๋ค. y๊ฐ 2์ฐจ์์ด๋ฉด ๊ฒฝ๊ณ ๊ฐ ๋ฐ ์ ์์.
score = r2_score(y, pred)
print(f"๊ฒฐ์ ๊ณ์: {score}")
# model.score(X, y)
model_score = model.score(x, y)
print(f"๋ชจ๋ธ ์ ์: {model_score}")
# ์ถ๋ ฅ ์์
# 0.6334328883976291
ํด์: ์ด ๋ชจ๋ธ์ ์๋์ฐจ ์๋์ ๋ฐ๋ฅธ ์ ๋๊ฑฐ๋ฆฌ ๋ณ๋์ ์ฝ 63.3%๋ฅผ ์ค๋ช ํ๊ณ ์๋ค.