240604 Today I Learn
๋ค์ค์ ํํ๊ท
๐ก ๋ค์ค ์ ํํ๊ท(Multiple Linear Regression)
์ค๋ช ๋ณ์(๋ ๋ฆฝ๋ณ์)๊ฐ ๋ ๊ฐ ์ด์์ธ ํ๊ท ๋ถ์
๋ค์ค์ ํ ํ๊ท ์ค์ต
๐โ๏ธ ๋จธ์ ์ด๋ ๋ฐ์ดํฐ ์ ํํ๊ท๋ฅผ ํ๋ จ ์์ผฐ์ง๋ง ์ฑ๋ฅ์ด ๋ณ๋ก ์ข์ง ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๊ทธ๋์ ์ฑ๋ณ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ด์ก์ต๋๋ค.
1. ์ฑ๋ณ๋ฐ์ดํฐ๋ ๋ฌธ์ํ์ด์ฌ์ ์ซ์๋ก ํํํด์ค์ผ ํฉ๋๋ค.
# 1. male(1), female(0)์ผ๋ก ๋ณํํ๊ธฐ
def encode_gender(series):
if series == 'Female':
return 0
else:
return 1
# apply๋ฅผ ํ์ฉํด sex ์ปฌ๋ผ์ ๋ชจ๋ ํ์ encode_gender๋ฅผ ์ ์ฉํฉ๋๋ค.
# ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ 'sex_enc'๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ ์ ์ฅํฉ๋๋ค.
tips['sex_enc'] = tips['sex'].apply(encode_gender)
2. ์ ํฉํ๊ธฐ/ ํ๊ท์ ๊ตฌํ๊ธฐ
# ๋ชจ๋ธ ๋ผ๋(?) ๋ถ๋ฌ์ค๊ธฐ
model_lr3 = LinearRegression()
# ํ๊ท์ ๊ตฌํ๊ธฐ
# x1 = total_bill, x2 = sex_enc, y = tip
w1 = model_lr3.coef_[0][0]
w2 = model_lr3.coef_[0][1]
w0 = model_lr3.intercept_[0]
print(f'y = {w1:.2f}x1 + {w2:.2f}x2 + {w0:.2f}') ##y = 0.11x1 + -0.03x2 + 0.93
# ๋ชจ๋ธ ํผํ
model_lr3.fit(X=tips[['total_bill','sex_enc']], y=tips[['tip']])
3. ๋จ์์ ํํ๊ท๋ชจ๋ธ(model_lr2) vs. ๋ค์ค์ ํํ๊ท๋ชจ๋ธ(model_lr3)
- mse์ r-squared ๋ชจ๋ multi-linear regression์์ ์กฐ๊ธ ๋ ์์์ก์ผ๋ ๊ทธ ํฌ๊ธฐ๊ฐ ํฌ์ง ์๋ค. (๋๋ค ์ฉ ์ข์ ๋ชจ๋ธ์.. ์๋๋ค..)
# ์ฒซ๋ฒ์งธ ๋ชจ๋ธ (x : total bill, y = tip)
y_pred_tip = model_lr.predict(tips[['total_bill']])
mse_model1 = mean_squared_error(tips['tip'], y_pred_tip)
r2_model1 = r2_score(tips['tip'], y_pred_tip)
# ๋๋ฒ์งธ ๋ชจ๋ธ (x1 : total bill, x2 : sex_enc, y = tip)
y_pred_tip2 = model_lr3.predict(tips[['total_bill','sex_enc']])
mse_model2 = mean_squared_error(tips[['tip']], y_pred_tip2)
r2_model2 = r2_score(tips[['tip']], y_pred_tip2)
# ํ์ธํ๊ธฐ
df = pd.DataFrame({'model' : ['simple linear','multi linear'],
'mse' : [mse_model1, mse_model2],
'r_squared': [r2_model1, r2_model2]})
df
- ์ค์ ๋ก ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด, ๋ ๋ชจ๋ธ์ ๊ฑฐ์ ์ฐจ์ต๊ฐ ์๊ฒ ๋ณด์ธ๋ค.
sns.scatterplot(data=tips, x='total_bill', y = 'tip', alpha = 0.7, color = 'pink')
plt.title('Tip Distribution by Total Bill')
# ํ๊ท์ ์ถ๊ฐํ๊ธฐ model_lr2
sns.lineplot(data=tips, x = 'total_bill', y = 'pred2', color = 'green', alpha = 0.8)
# ํ๊ท์ ์ถ๊ฐํ๊ธฐ model_lr3
sns.lineplot(data=tips, x = 'total_bill', y = 'pred3', color = 'red', alpha = 0.7)
์ ํํ๊ท ์ ๋ฆฌ
์ ํํ๊ท์ ๊ฐ์
- ์ ํ์ฑ (Linearity): ์ข ์ ๋ณ์(Y)์ ๋ ๋ฆฝ ๋ณ์(X) ๊ฐ์ ์ ํ ๊ด๊ณ๊ฐ ์กด์ฌํด์ผ ํจ
- ๋ฑ๋ถ์ฐ์ฑ (Homoscedasticity): ์ค์ฐจ์ ๋ถ์ฐ์ด ๋ชจ๋ ์์ค์ ๋ ๋ฆฝ ๋ณ์์ ๋ํด ์ผ์ ํด์ผ ํฉ๋๋ค. ์ฆ, ์ค์ฐจ๊ฐ ํน์ ํจํด์ ๋ณด์ฌ์๋ ์ ๋๋ฉฐ, ๋ ๋ฆฝ ๋ณ์์ ๊ฐ์ ์๊ด์์ด ์ผ์ ํด์ผ ํฉ๋๋ค.
- ์ ๊ท์ฑ (Normality): ์ค์ฐจ ํญ์ ์ ๊ท ๋ถํฌ๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
- ๋ ๋ฆฝ์ฑ (Independence): X๋ณ์๋ ์๋ก ๋ ๋ฆฝ์ ์ด์ด์ผ ํฉ๋๋ค.
๐จ ๋ค์ค๊ณต์ ์ฑ(Multicolinearity)๋ฌธ์
๋ณ์๊ฐ ๋ง์์ง๋ฉด ์๋ก ์ฐ๊ด์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ํ๊ท๋ถ์์์ ๋ ๋ฆฝ๋ณ์(X)๊ฐ์ ๊ฐํ ์๊ด๊ด๊ณ๊ฐ ๋ํ๋๋ ๊ฒ์ ๋ค์ค๊ณต์ ์ฑ ๋ฌธ์ ๋ผ๊ณ ํ๋ค. ์๋ฅผ ๋ค๋ฉด Weight, Height๋ฅผ ๊ฐ์ง๊ณ ๋ค๋ฅธ Y(์ด๋ฅผ ํ ๋ฉด ๋ฐ์ฌ์ด์ฆ)๋ฅผ ์์ธกํ๋ค๋ฉด Weight, Height๊ฐ ์ฐ๊ด์๋ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๋ค์ค๊ณต์ ์ฑ ๋ฌธ์ ๊ฐ ๋ํ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ค์ ๋๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํ ์ ์๋ค.
(1) ์๋ก ์๊ด๊ด๊ณ๊ฐ ๋์ ๋ณ์ ์ค ํ๋๋ง ์ ํํ๋ค.
(2) ๋ ๋ณ์๋ฅผ ๋์์ ์ค๋ช ํ๋ ์ฐจ์์ถ์(Principle Component Analysis, PCA) ์คํํ์ฌ ๋ณ์ 1๊ฐ๋ก ์ถ์ํ๋ค.
์ ํํ๊ท ์ ๋ฆฌ
์ฅ์ | ๋จ์ |
|
|