μ ν νκ· (Linear Regression) λ 무μμΈκ°?
νκ·λ xκ°μ λμνλ yκ°κ³Ό κ°μ₯ κ°κΉμ΄ κ°(y hat)λ₯Ό μΆλ ₯νλ ν¨μλ₯Ό μ°Ύλ κ³Όμ μ΄λ€. μ¬κΈ°μμ μ¬μ©νλ ν¨μκ° μ ν ν¨μλΌλ©΄ μ ννκ·λΌκ³ λ³Ό μ μλ€.
μ ννκ·λ₯Ό μ¬μ©νλ μ΄μ λ κ·Έ λ¨μν¨μ μλ€. κ° νΌμ³μ κ³μμ λͺ©ννλ λ³μ μ¬μ΄μ κ΄κ³λ₯Ό λ³΄λ€ λ μ§κ΄μ μΌλ‘ ννν μ μκΈ° λλ¬Έμ΄λ€.
μ ν νκ·μ μ’ λ₯
- λ¨μ μ ν νκ·
νΌμ³(x)κ° νλλΏμΈ λͺ¨λΈμ΄κ³ λͺ©ν λ³μμ νΌμ³κ° κ°μ μ’ννλ©΄μ λνλλ μ§μ ννμ΄λ€. λ¨μ μ ν νκ·λ μ ν μ¬μμ λΆν©νλ€.
- λ€μ€ μ ν νκ·
νΌμ³(x)κ° μ¬λ¬ κ°μΈ λͺ¨λΈλ‘ λ€μ°¨μ 곡κ°μμ μ‘΄μ¬νλ μ§μ μ ννλ‘ ννλλ€. λ§μ°¬κ°μ§λ‘ μ ν μ¬μμ λΆν©νλ€.
- λ€ν νκ· (Polynomial)
νΌμ³λ 1κ°λΏμ΄μ§λ§ λ€νμμ ννλ‘ λνλλ―λ‘ κ³‘μ μ ννλ‘ ννλλ€. λ€ν νκ·μ κ²½μ° μ§μκ° λμ΄λ λλ§λ€ κΈκ²©ν 볡μ‘ν΄μ§λ―λ‘ νκ· λͺ¨λΈμμ μ€λ²νΌν (overfitting, κ³Όμ ν©)μ΄ λ°μν κ°λ₯μ±μ΄ λμμ§λ€.
λΉμ©ν¨μ
λ¨Έμ λ¬λμμλ μ£Όμ΄μ§ λ°μ΄ν°λ₯Ό λͺ¨λΈμ ν¬μ ν¨μΌλ‘μ¨ λͺ¨λΈμ μ ν©νκ² λ§λλ νμ΅κ³Όμ μ κ±°μΉλ€. μ΄λ μ λλ‘ μ ν©μ΄ λλ €λ©΄ λͺ¨λΈμ μμΈ‘κ°κ³Ό μ€μ κ°μ μ€μ¬μΌ νλ€. λͺ¨λΈμ μμΈ‘κ°κ³Ό μ€μ κ°μ μ°¨μ΄λ₯Ό λΉκ΅νλ ν¨μλ₯Ό λΉμ©(cost) ν¨μλΌκ³ λΆλ₯Έλ€. λΉμ©ν¨μλ λͺ¨λΈμ νΉμ±μ λ§κ² μ€μ°¨λ₯Ό μΈ‘μ νλ μν μ νλ©°, λ³΄ν΅ λΉμ©ν¨μ κ°μ΄ μμμλ‘ μ€μ°¨κ° μμΌλ©° λͺ¨λΈμ΄ μ νμ΅λμλ€λ κ²μ μλ―Ένλ€.
λ€μκ³Ό κ°μ λΉμ©ν¨μλ₯Ό μ¬μ©ν μ μλ€.
λ¨μ μ ν νκ· κ΅¬ν
sklearn (μΈμ΄ν·λ°) μ μ΄μ©νλ€. λͺ¨λΈ μ½λλ₯Ό ꡬνν λ λ€μκ³Ό κ°μ λͺ¨λμ μ¬μ©νμλ€.
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import r2_score, mean_squared_error
νμ΅, κ²μ¦ λ°μ΄ν°λ₯Ό λΆλ¦¬νμ¬μΌ νλ―λ‘ λ€μκ³Ό κ°μ ν¨μλ₯Ό μ΄μ©νλ€.
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 156)
x, yλ λ°μ΄ν°μμ λΆλ¬μ¨ κ°κ°μ x, y κ°λ€μ΄λ€.
test_sizeλ κ²μ¦ λ°μ΄ν°λ‘ λΆλ¦¬ν λ°μ΄ν°μ λΉμ¨μ μ§μ ν΄μ€λ€. random_stateλ μ무 μ«μλ μ λλ€.
λ°μ΄ν°μ λ€λ‘ νμ΅μ νλ €λ©΄ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μΉλ€.
lr = LinearRegression(fit_intercept = True)
lr.fit(X_train, y_train)
fit_interceptλ₯Ό Trueλ‘ μ€μ νμ¬ λ¨μ μ ν νκ· λͺ¨λΈμ b0κ°λ ν¬ν¨μν¨λ€.
μ΄ν lr.fitμ ν΅ν΄ νμ΅μν¨λ€.
lr.coef_ # bκ°λ€μ array
lr.coef_[0] # b1 κ°μ μ κ·Ό
lr.intercept_ # b0 κ° (μ νΈ)μ μ κ·Ό
λͺ¨λΈμμ coef_λ₯Ό μ΄μ©νλ©΄ bκ°λ€μ arrayλ₯Ό ꡬν μ μκ³ , indexλ₯Ό μ§μ νμ¬ κ°κ°μ μ κ·Όν μ μμΌλ©°, intercept_λ μ νΈ, μ¦ b0 κ°μ μλ €μ£Όλ λ©μλλ€.
y_train_pred = lr.predict(X_train)
y_test_pred = lr.predict(X_test)
train_r2 = r2_score(y_train, y_train_pred)
test_r2 = r2_score(y_test, y_test_pred)
lr.score(X_test, y_test)
predict λ©μλλ₯Ό μ΄μ©νμ¬ κ²°κ³Όλ₯Ό νμΈνλ€.
r2_scoreμμ νλΌλ―Έν°λ μ€μ yκ°κ³Ό λͺ¨λΈμ΄ λμΆν y hat κ°μ λ°λλ€. r2_scoreκ° λ°ννλ κ°μ΄ ν΄μλ‘ μ μμΈ‘νμλ€λ λ»μ΄λ€.
lr.scoreμ κ°μ λ°©λ²μΌλ‘λ test κ²°κ³Όλ₯Ό νμΈν μ μλ€.
λ€ν νκ· κ΅¬ν - 2nd order Polynomial Regression
quad = PolynomialFeatures(degree = 2)
X_quad = quad.fit_transform(x)
quadratic regressionμ 2μ°¨ λ€ν νκ·λ₯Ό μλ―Ένλ€.
PolynomialFeaturesλ νλΌλ―Έν°λ₯Ό degreeλ‘ λ°λλ°, μ¬κΈ°μ λ£μ΄μ£Όλ μ«μμ λ°λΌμ λ€ννκ·μ μ°¨μκ° κ²°μ λλ€.
X_train, X_test, y_train, y_test = train_test_split(X_quad, y, random_state = 156)
plr = LinearRegression()
plr.fit(X_train, y_train)
y_train_pred = plr.predict(X_train)
y_test_pred = plr.predict(X_test)
plr.score(X_test, y_test)
train_test_splitμ ν΅ν΄ νμ΅, κ²μ¦λ°μ΄ν°λ₯Ό λΆλ¦¬νκ³ λ°μ΄ν°λ₯Ό λͺ¨λΈμ νμ΅μν¨λ€. λ€μμΌλ‘ λͺ¨λΈμ΄ μΌλ§λ μ ν©νμ§ νκ°ν μ μλ€.
λ§μ½ 3μ°¨, 4μ°¨ λ±μ λ€ννκ·λ₯Ό ν΄λ³΄κ³ μΆλ€λ©΄ μμμ degreeκ°λ§ λ³κ²½μν€κ³ λλ¨Έμ§ κ³Όμ μ λκ°μ΄ νλ©΄ λλ€.