๐๋ค์ค ํ๊ท (Multiple Regression)
์ฌ๋ฌ ๊ฐ์ ํน์ฑ์ ์ฌ์ฉํ ์ ํ ํ๊ท
์๋๋ ์ ํ ํ๊ท์ ๋ํด ์์ฑํ ๊ธ์ ๋๋ค. ๐
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-2. ์ ํ ํ๊ท
์ฐ์ ๋ฐ์ดํฐ ์ค๋น ํ ํ๋ จ๊น์ง.. (03-1 ๋ด์ฉ ์ฐธ๊ณ ) [์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-1. k-์ต๊ทผ์ ์ด์ ํ๊ท ์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฅ์ ํ๊ท๋ก ๋๋ฉ๋๋ค. ์ด ๊ธ์ ํ๊ท์ ๋ํด ์์ฑํ์ต๋๋ค. ํ๊ท ์์์ ์ซ
avoc-o-d.tistory.com
์ ํ ํ๊ท์์๋ ๋์ด์ ๊ธธ์ด ๋ฐ์ดํฐ๋ง ๊ฐ์ง๊ณ ํ๋ จ์ ํ๊ธฐ ๋๋ฌธ์, ์ฌ์ ํ ๊ณผ์์ ํฉ ๋ฌธ์ ๊ฐ ๋จ์์ต๋๋ค.
๋์ด, ๋๊ป ๋ฑ ํน์ฑ์ ๋ง์ด ์ฌ์ฉํ์ฌ ํ๋ จํ๋ฉด ์ฑ๋ฅ์ด ์ข์์ง ๊ฒ์ผ๋ก ์๊ฐํฉ๋๋ค.
๐ํน์ฑ ๊ณตํ (Feature Engineering)
๊ธฐ์กด์ ํน์ฑ๋ผ๋ฆฌ ์กฐํฉํด์ ์๋ก์ด ํน์ฑ์ ๋ฝ์๋ด๋ (์ถ๊ฐ, ๋ฐ๊ฒฌ) ์์
* ๋จธ์ ๋ฌ๋์ ํน์ฑ ๊ณตํ์ ์ํฅ์ ๋ง์ด ๋ฐ๋ ํธ, ๋ฅ๋ฌ๋์ ๋ ๋ฐ๋ ํธ
ํ๋ค์ค๋ก ๋ฐ์ดํฐ ์ค๋น
๐ pandas ํ๋ค์ค : (๋ํ์ด ๋ฐฐ์ด ๊ฐ์) ๋ฐ์ดํฐ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ ๋ฐ์ดํฐํ๋ ์ : (ํ๋ค์ค์ ํต์ฌ ๊ฐ์ฒด) ๋ค์ฐจ์ ๋ฐฐ์ด
import pandas as pd
df = pd.read_csv("https://bit.ly/perch_csv_data") # csv ํ์ผ์ ํ๋ค์ค ๋ฐ์ดํฐํ๋ ์์ผ๋ก ์ฝ๊ธฐ
perch_full = df.to_numpy() # ๋ํ์ด ๋ฐฐ์ด๋ก ๋ณํ
๐๋ฆฌ๋ง์ธ๋ ! ํ์ ์ํ, ์ด์ ํน์ฑ
์ ๊ฐ์ ธ์๋์ง ํ์ธํ๊ฒ ์ต๋๋ค.
์ ๊ฐ์ ธ์์ก๋ค์~!
ํ๊น๊ฐ์ธ ๋์ด์ ๋ฌด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํด์ค ํ,
๊ฐ ์ ๋ ฅ๊ฐ๊ณผ ํ๊น๊ฐ์ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋๋์ด ์ค๋๋ค.
# http://bit.ly/perch_data
import numpy as np
perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0,
115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0,
150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0,
218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0,
556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0,
850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0,
1000.0])
from sklearn.model_selection import train_test_split
# perch_full, perch_weight ์ ํ๋ จ, ํ
์คํธ ์ธํธ๋ก ๋๋๊ธฐ
train_input, test_input, train_target, test_target = train_test_split(perch_full, perch_weight, random_state=42)
์ ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํด์ ์๋ก์ด ํน์ฑ์ ๋ง๋ค๊ฒ ์ต๋๋ค!
์ ํํ๊ท ๋์ฒ๋ผ ์ง์ ๋ง๋ค์ง ์๊ณ , ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๐์ฌ์ดํท๋ฐ์ ๋ณํ๊ธฐ (Transformer)
- ํน์ฑ์ ๋ง๋ค๊ฑฐ๋ ์ ์ฒ๋ฆฌํ๋ ํด๋์ค
- fit(), transform() ํจ์ ์ ๊ณต
๐์ฌ์ดํท๋ฐ์ PolynomialFeatures ํด๋์ค : ๋ณํ๊ธฐ
- ๊ฐ ํน์ฑ์ ์ ๊ณฑํ ํญ์ ์ถ๊ฐ, ํน์ฑ๋ผ๋ฆฌ ์๋ก ๊ณฑํ ํญ์ ์ถ๊ฐโจ
- fit() : ์๋กญ๊ฒ ๋ง๋ค ํน์ฑ ์กฐํฉ์ ์ฐพ์
- transform() : ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํ
* ๋ณํ๊ธฐ๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ๋ฐ ํ๊น์ด ํ์ํ์ง ์์.
โถ๏ธ ๋ชจ๋ธ ํด๋์ค์ ๋ค๋ฅด๊ฒ, ํ๋ จ ํ ๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ง ์ ๋ฌ
์ฐ์ ๋ณํ๊ธฐ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
๐ ํ๋ จ(fit)์ ํด์ผ, ๋ณํ(transform) ์ด ๊ฐ๋ฅํฉ๋๋ค.
from sklearn.preprocessing import PolynomialFeatures
# 2๊ฐ์ ํน์ฑ(์์) 2, 3 ์ผ๋ก ์ด๋ฃจ์ด์ง ์ํ ์ ์ฉํด๋ณด๊ธฐ
poly = PolynomialFeatures()
# 1(bias), 2, 3, 2**2, 2*3, 3**2
poly.fit([[2, 3]]) # ์๋กญ๊ฒ ๋ง๋ค ํน์ฑ ์กฐํฉ์ ์ฐพ์
print(poly.transform([[2, 3]])) # ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํ
2๊ฐ ๋ฐ์ ์๋ [2, 3] ์ํ์ด 6๊ฐ์ ์ํ๋ก ๋ณํ๋์์ต๋๋ค! ํน์ฑ์ด ๋ง์์ก์ด์~
๐ค ์๋ฌธ ? 1์ ์ด๋ป๊ฒ ๋ง๋ค์ด์ง ํน์ฑ์ผ๊น์?
๐ก ๋๋ต ! 1์ ์ ํ ๋ฐฉ์ ์์ ์ ํธ์ ์ํ ํน์ฑ์ ๋๋ค.
๐ค ์๋ฌธ ? ์ ์๋ ๊ฑธ๊น์?
๐ก ๋๋ต ! y = a*x + b*1 => [a, b] * [x, 1] ์ด๋ ๊ฒ ๋ฐฐ์ด๋ผ๋ฆฌ์ ์ฐ์ฐ์ ํ ์ ์๋๋ก ์ ํธ ํญ์ด ํ์ํฉ๋๋ค. (์ฌ์ดํท๋ฐ์ ์ ํ ๋ชจ๋ธ์ด ์๋์ผ๋ก ์ถ๊ฐํด์ฃผ๋ฏ๋ก [1, 2, 3]์ฒ๋ผ ํน์ฑ์ 1์ ๋ฐ๋ก ๋ฃ์ด์ค ํ์ ์์ต๋๋ค.)
๐ค ์๋ฌธ ? ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฑธ๊น?
๐ก ๋๋ต ! ์๋์. ์ด์ฐจํผ ์ฌ์ดํท๋ฐ ๋ชจ๋ธ์ด ์ ํธ ํญ์ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์ ํ์ ์์ต๋๋ค.
๐์ฌ์ดํท๋ฐ ๋ชจ๋ธ์ include_bias = False ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํด์ฃผ๋ฉด ํน์ฑ์ ์ถ๊ฐ๋ ์ ํธ ํญ์ ๋ฌด์ํฉ๋๋ค. (๊ธฐ๋ณธ๊ฐ True)
# (include_bias = False ์ ํธ์ ์ํ ํญ์ ๋ฌด์ํ๋ผ๋ ์๋ฏธ, ํ๊ธฐ ์ ํด๋ ์ฌ์ดํท๋ฐ ๋ชจ๋ธ์ ์๋์ผ๋ก ๋ฌด์ํจ)
poly = PolynomialFeatures(include_bias = False)
poly.fit([[2,3]])
print(poly.transform([[2, 3]]))
์ ํธ์ ์ํ ํญ์ด ์ ๊ฑฐ๋๊ณ ํน์ฑ์ ์ ๊ณฑ๊ณผ ํน์ฑ๋ผ๋ฆฌ ๊ณฑํ ํญ๋ง ์ถ๊ฐ๋์์ต๋๋ค! โจ
์ด์ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค!
๐ ์ฐ๋ฆฌ์ ํน์ฑ์ (๊ธธ์ด, ๋์ด, ๋๊ป) ์ ๋๋ค.
ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ๋ณํ๊ธฐ๋ก ๋ณํํ ๋ฐ์ดํฐ train_poly๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
poly = PolynomialFeatures(include_bias=False)
poly.fit(train_input)
train_poly= poly.transform(train_input) # train_input์ ๋ณํํ ๋ฐ์ดํฐ
์ ๋ณํ๋์๋์ง ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ํ์ธํด๋ณด๋ฉด, ์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ผ 9๊ฐ์ ํน์ฑ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
๐ PolynomialFeatures ์ get_feature_names_out()
๊ฐ๊ฐ ์ด๋ค ์ ๋ ฅ์ ์กฐํฉ์ผ๋ก ๋ง๋ค์ด์ก๋์ง ์๋ ค์ค
# 9๊ฐ์ ํน์ฑ์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ก๋์ง ํ์ธ
print(poly.get_feature_names_out())
- 'x0' : ์ฒซ ๋ฒ์งธ ํน์ฑ
- 'x1' : ๋ ๋ฒ์งธ ํน์ฑ
- ...
- 'x0^2' : ์ฒซ ๋ฒ์งธ ํน์ฑ์ ์ ๊ณฑ
- 'x0 x1' : ์ฒซ ๋ฒ์งธ ํน์ฑ๊ณผ ๋ ๋ฒ์งธ ํน์ฑ์ ๊ณฑ
- ...
๊ทธ๋ผ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ฒ ์ต๋๋ค.
๐ ํ๋ จ ์ธํธ์ ์ ์ฉํ๋ ๋ณํ๊ธฐ๋ก ํ ์คํธ ์ธํธ๋ฅผ ๋ณํํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
fit() ์ ๋ง๋ค ํน์ฑ์ ์กฐํฉ์ ์ค๋นํ๊ธฐ๋ง ํ๊ณ ๋ณ๋์ ํต๊ณ ๊ฐ์ ๊ตฌํ์ง ์์์, ํ ์คํธ ์ธํธ๋ฅผ ๋ฐ๋ก ๋ณํํด์ค๋ ๋๊ธด ํ๋๋ฐ
ํญ์ ํ๋ จ ์ธํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ ์ธํธ๋ฅผ ๋ณํํ๋ ์ต๊ด์ ๋ค์ด๋ ๊ฒ์ด ์ข๋ค๊ณ ํฉ๋๋ค..!
test_poly = poly.transform(test_input)
๋ค์ค ํ๊ท ๋ชจ๋ธ ํ๋ จํ๊ธฐ
๐ ๋ค์ค ํ๊ท ๋ชจ๋ธ์ ํ๋ จํ๋ ๊ฒ์ ์ ํ ํ๊ท ๋ชจ๋ธ์ ํ๋ จํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ฆ, ์ฌ๋ฌ ๊ฐ์ ํน์ฑ์ ์ฌ์ฉํ์ฌ ์ ํ ํ๊ท๋ฅผ ์ํํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ผ ํ๋ จ ํ, ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ์ ๋ํ ์ ์๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
# ํ๋ จ
lr.fit(train_poly, train_target)
"""
์ ์ ํ์ธ
lr.score(train_poly, train_target)
lr.score(test_poly, test_target)
"""
๊ณผ์์ ํฉ ๋ฌธ์ ๋ ํด๊ฒฐํ ๋ฏ ํฉ๋๋ค! ๐๐
๊ทธ๋ผ ํน์ฑ์ ๋ ์ถ๊ฐํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? 3, 4, 5 ... ์ ๊ณฑ ํญ์ ์ถ๊ฐํ๋ ๊ฒ์ด์ฃ !!
๊ทธ๋ผ, 5์ ๊ณฑ๊น์ง ํน์ฑ์ ๋ง๋ค๊ฒ ์ต๋๋ค.
๐PolynomialFeatures ์ ๋งค๊ฐ๋ณ์ degree : ๊ณ ์ฐจํญ์ ์ต๋ ์ฐจ์๋ฅผ ์ง์
# ํน์ฑ์ ๋ ๋ง์ด ์ถ๊ฐ
# 3์ ๊ณฑ, 4์ ๊ณฑ ํญ์ ๋ฃ์
# degree ๋ก ์ต๋ ์ฐจ์๋ฅผ ์ง์
poly = PolynomialFeatures(degree = 5, include_bias = False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
test_poly = poly.transform(test_input)
ํน์ฑ์ด 55๊ฐ์ฉ์ด๋ ๋ง๋ค์ด์ก์ต๋๋ค!
๊ทธ๋ผ ํ๋ จ์ ๋ค์ ํด๋ณด๊ฒ ์ต๋๋ค.
lr.fit(train_poly, train_target)
"""
์ ์ ํ์ธ
lr.score(train_poly, train_target)
lr.score(test_poly, test_target)
"""
๐ค ์๋ฌธ ? ์์ด๋ฆฌ ์ ์๊ฐ ์ฒ์ฐธํ ๊น์?
๐ก ๋๋ต ! ํน์ฑ์ ๊ฐ์๋ฅผ ํฌ๊ฒ ๋๋ฆฌ๋ฉด ์ ํ ๋ชจ๋ธ์ ์์ฃผ ๊ฐ๋ ฅํด์ง๋๋ค. ํ๋ จ ์ธํธ์ ๋ํด ๊ฑฐ์ ์๋ฒฝํ๊ฒ ํ์ตํ ์ ์์ต๋๋ค.
=> ์ฆ, ํ๋ จ ์ธํธ์ ๊ณผ๋ ์ ํฉ๋๋ฏ๋ก ํ ์คํธ ์ธํธ์์ ์ฒ์ฐธํ ๊ฒ์ ๋๋ค.
๐ก ํด๊ฒฐ ๋ฐฉ๋ฒ ! ๊ณผ๋ ์ ํฉ์ ์ค์ ๋๋ค. => ํน์ฑ์ ์ค์ ๋๋ค.
๐ ๊ท์
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ด ํ๋ จ ์ธํธ์ ๊ณผ๋์ ํฉ์ด ๋์ง ์๋๋ก ๊ณ์(ํน์ ๊ธฐ์ธ๊ธฐ, ๊ฐ์ค์น) ๊ฐ์ ์ํํ๋ ๊ฒ
* ์ ํ ํ๊ท ๋ชจ๋ธ์ ๊ฒฝ์ฐ, ํน์ฑ์ ๊ณฑํด์ง๋ ๊ณ์(ํน์ ๊ธฐ์ธ๊ธฐ, ๊ฐ์ค์น)์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ๋ง๋ฆ
1๊ฐ์ ํน์ฑ์ผ๋ก ํ๋ จํ ๋ชจ๋ธ ์์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค. ์๋์ ๊ฐ์ด ๊ณผ๋์ ํฉ๋ ๋ชจ๋ธ์ ๊ท์ ํ์ฌ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ค์๋๋ ๋ณดํธ์ ์ธ ํจํด์ ํ์ตํ๊ฒ ๋์์ต๋๋ค!
๊ทธ๋ผ 55๊ฐ์ ํน์ฑ์ผ๋ก ํ๋ จํ ์ ํ ํ๊ท ๋ชจ๋ธ์ ๊ณ์๋ฅผ ๊ท์ ํด์ ๊ณผ๋์ ํฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ์ต๋๋ค.
๐๋ฆฌ๋ง์ธ๋ ! ๊ท์ ์ ์ฉ ์ ์, ๊ผญ ํน์ฑ์ ์ค์ผ์ผ์ ์ ๊ทํ ํด์ค์๋ค! ์ค์ผ์ผ์ ๋ง์ถฐ์ฃผ์ง ์์ผ๋ฉด, ๊ณ์ ๊ฐ์ ํฌ๊ธฐ๊ฐ ์๋ก ๋ง์ด ๋ค๋ฅด๊ฒ ๋์ด ๊ณต์ ํ๊ฒ ์ ์ด๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ค ์๋ฌธ? ์ k-์ต๊ทผ์ ์ด์ ๋ถ๋ฅ๋ ์ ๊ทํ ํด์ฃผ๊ณ , LinearRegression ์ ์ ๊ทํ ์ ํด์ฃผ๊ณ ํ๋ จํ๋?
๐ก ๋๋ต ! k-์ต๊ทผ์ ์ด์์ ์ค์ผ์ผ์ด ๋ค๋ฅด๋ฉด, ํ์ชฝ ํน์ฑ์ผ๋ก ์ ๋ ค์๋ ๋ฐ์ดํฐ ์ค์์ ์ด์์ ์ฐพ๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ๋ ์ด์์ ๋ชป ์ฐพ์, ๊ทผ๋ฐ ์ฌ์ดํท๋ฐ ํน์ LinearRegression ๊ฐ์ ๊ฒฝ์ฐ๋ ํน์ฑ์ ์ค์ผ์ผ์ ์ํฅ์ ๋ฐ์ง ์์ ์๊ณ ๋ฆฌ์ฆ(์์น์ ์ผ๋ก ๊ณ์ฐ)์ผ๋ก ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ ์๊ด ์์
๐ค ์๋ฌธ? ๊ทธ๋ผ ๊ท์ ํ ๋?
๐ก ๋๋ต ! ๊ท์ ํ ๋์ ๊ผญ ์ ๊ทํ๋ฅผ ํด์ค์ผ ํฉ๋๋ค! ๊ท์ ๋ ๊ณ์(ํน์ ๊ธฐ์ธ๊ธฐ, ๊ฐ์ค์น) ๊ฐ์ ์๊ฒ ๋ง๋๋ ์ผ์ด๊ธฐ ๋๋ฌธ์ ํน์ฑ์ด ๋ค๋ฅด๋ฉด ๊ฐ๊ฐ ํน์ฑ์ ๊ณฑํด์ง๋ ๊ธฐ์ธ๊ธฐ๋ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๊ฐ์ด ๋์ค๊ฒ ๋ฉ๋๋ค. (๊ธฐ์ธ๊ธฐ๊ฐ ๋น์ทํด์ผ ๊ฐ ํน์ฑ์ ๋ํด ๊ณต์ ํ๊ฒ ์ ์ด๋๋๊น)
ํ๊ท ๊ณผ ํ์คํธ์ฐจ๋ฅผ ์ง์ ๊ตฌํ์ฌ ํน์ฑ์ ํ์ค์ ์๋ก ๋ฐ๊พธ์ง ์๊ณ ,, ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
๐์ฌ์ดํท๋ฐ์ StandardScaler ํด๋์ค
์ ๊ทํ ๋ณํ๊ธฐ, ๊ผญ ํ๋ จ ์ธํธ๋ก ํ์ตํ ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ ์ธํธ๋ ๋ณํํ๊ธฐ!
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_poly)
train_scaled = ss.transform(train_poly) # ํ๋ จ ์ธํธ ์ ๊ทํ
test_scaled = ss.transform(test_poly) # ํ
์คํธ ์ธํธ ์ ๊ทํ
๋ฐ์ดํฐ์ ์ ๊ทํ๋ ์ ์ฉํ์ผ๋, ์ด์ ๊ท์ ๋ฅผ ๊ฐํ์ฌ ํ๋ จํด๋ณด๊ฒ ์ต๋๋ค.
๐๋ฆฟ์ง์ ๋ผ์
์ ํ ํ๊ท ๋ชจ๋ธ์ ๊ท์ ๋ฅผ ์ถ๊ฐํ ๋ชจ๋ธ์ ๋ฆฟ์ง์ ๋ผ์๋ผ๊ณ ํฉ๋๋ค.
- ๋ ๋ค ๊ท์ ๋ฅผ ๊ฐํ์ฌ ๊ณ์์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๊ฑด ๊ฐ์ง๋ง, ๊ท์ ๋ฅผ ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฆ
- โจ ๊ท์ ์ ์์ ์์๋ก ์กฐ์ ๊ฐ๋ฅ : alpha ๋งค๊ฐ๋ณ์
- alpha ํฌ๋ฉด ๊ท์ ๊ฐ๋ ์ธ์ง (๊ณผ๋ ์ ํฉ ํด๊ฒฐ, ๊ณผ์ ์ ํฉ ์ ๋)
- alpha ์์ผ๋ฉด ๊ท์ ๊ฐ๋ ์ฝํด์ง (๊ณผ์ ์ ํฉ ํด๊ฒฐ, ๊ณผ๋ ์ ํฉ ์ ๋)
๐ธ ๋ฆฟ์ง : ๊ณ์๋ฅผ ์ ๊ณฑํ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ท์ ๋ฅผ ์ ์ฉ (L2 ๊ท์ )
๐ธ ๋ผ์ : ๊ณ์์ ์ ๋๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ท์ ๋ฅผ ์ ์ฉ (L1 ๊ท์ )
(๊ณ์๋ฅผ ์์ 0์ผ๋ก ๋ง๋ค ์๋ ์์ -> ๊ทธ๋ฐ๋ฐ๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฐ์ ์์ฑํ์ต๋๋ค. ๐)
๐ ๋ฆฟ์ง ํ๊ท
๐ ์ฌ์ดํท๋ฐ์ Ridge ํด๋์ค
๐๊ทธ๋ฅ ํ๋ จ
from sklearn.linear_model import Ridge
ridge = Ridge()
# ํ๋ จ
ridge.fit(train_scaled, train_target)
๊ณผ๋์ ํฉ ๋์ง ์๊ณ , ์ข์ ์ฑ๋ฅ์ ๋ ๋๋ค!
๊ทธ๋ผ, alpha ๊ฐ์ ์์๋ก ์ง์ ํ์ฌ ๋์ฑ ์ข์ ์ฑ๋ฅ์ ๋ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐alpha ๊ฐ ์ฐพ๊ธฐ
์ ์ ํ alpha ๊ฐ์ ์ฐพ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋, alpha ๊ฐ์ ๋ํ R²(๊ฒฐ์ ๊ฒ์) ๊ฐ์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๋ ๊ฒ์ ๋๋ค.
์ฆ, ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ์ ์ ์๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ์ง์ ์ด ์ต์ ์ alpha !
alpha ๊ฐ์ 0.001 ~ 100 10๋ฐฐ์ฉ ๋๋ ค ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
import matplotlib.pyplot as plt
train_score=[]
test_score=[]
# ์ํ 0.001~100 10์ฉ ๋๋ ค๊ฐ๋ฉฐ ๋ฆฟ์ง ํ๊ท ๋ชจ๋ธ ํ๋ จ
alpha_list = [0.001, 0.01, 0.1, 1, 10, 100]
for alpha in alpha_list :
#๋ฆฟ์ง ๋ชจ๋ธ ์์ฑ
ridge = Ridge(alpha=alpha)
# ํ๋ จ
ridge.fit(train_scaled, train_target)
# ํ๋ จ ์ ์์ ํ
์คํธ ์ ์ ์ ์ฅ
train_score.append(ridge.score(train_scaled, train_target))
test_score.append(ridge.score(test_scaled, test_target))
# ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
# 10 ๋ฐฐ์ฉ ๋๋ ธ๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ์ด ๋๋ฌด ์ด์ดํด์ ธ์, ๋๋ฆฌ์! => ๋ก๊ทธํจ์๋ก ๋ฐ๊ฟ ์ง์๋ก ํํ => 0.001 -> -3
plt.plot(np.log10(alpha_list), train_score)
plt.plot(np.log10(alpha_list), test_score)
plt.xlabel("alpha")
plt.ylabel("R^2")
plt.show()
๊ทธ๋ํ๋ก๋ถํฐ ๊ฐ์ฅ ์ ์ ํ alpha ๊ฐ์ -1์ ๋๋ค. ์ฆ, 10^(-1) = 0.1 ์ ๋๋ค!
alpha ๋ฅผ 0.1 ๋ก ํด์ ๋ค์ ํ๋ จ ํ๊ฒ ์ต๋๋ค.
๐์ ์ ํ alpha ๊ฐ์ผ๋ก ํ๋ จ
# 0.1 ์ผ ๋๊ฐ ๊ฐ์ฅ ์ฑ๋ฅ ๊ตฟ๐
ridge = Ridge(alpha = 0.1)
# ํ๋ จ
ridge.fit(train_scaled, train_target)
๊ตฟ๐๐
๐ ๋ผ์ ํ๊ท
๐ ์ฌ์ดํท๋ฐ์ Lasso ํด๋์ค
๐๊ทธ๋ฅ ํ๋ จ
from sklearn.linear_model import Lasso
lasso = Lasso()
# ํ๋ จ
lasso.fit(train_scaled, train_target)
์ ์ ์ข์ต๋๋ค. ๐
๐alpha ๊ฐ ์ฐพ๊ธฐ
import matplotlib.pyplot as plt
train_score=[]
test_score=[]
# ์ํ 0.001 ~ 100 10์ฉ ๋๋ ค๊ฐ๋ฉฐ ๋ผ์ ํ๊ท ๋ชจ๋ธ ํ๋ จ
alpha_list = [0.001, 0.01, 0.1, 1, 10, 100]
for alpha in alpha_list :
#๋ผ์ ๋ชจ๋ธ ์์ฑ
# max_iter=10000 : ๋ผ์ ๋ชจ๋ธ ํ๋ จ ์, ์ต์ ์ ๊ณ์๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ฐ๋ณต์ ์ธ ๊ณ์ฐ์ ์ํํ๋๋ฐ, ์ง์ ํ ๋ฐ๋ณต ํ์๊ฐ ๋ถ์กฑํ ๋ ๊ฒฝ๊ณ ๋ธ ์ด๋ฅผ ํด๊ฒฐ
lasso = Lasso(alpha=alpha, max_iter=10000)
# ํ๋ จ
lasso.fit(train_scaled, train_target)
# ํ๋ จ ์ ์์ ํ
์คํธ ์ ์ ์ ์ฅ
train_score.append(lasso.score(train_scaled, train_target))
test_score.append(lasso.score(test_scaled, test_target))
# ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
# 10 ๋ฐฐ์ฉ ๋๋ ธ๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ์ด ๋๋ฌด ์ด์ดํด์ ธ์, ๋๋ฆฌ์! => ๋ก๊ทธํจ์๋ก ๋ฐ๊ฟ ์ง์๋ก ํํ => 0.001 -> -3
plt.plot(np.log10(alpha_list), train_score)
plt.plot(np.log10(alpha_list), test_score)
plt.xlabel("alpha")
plt.ylabel("R^2")
plt.show()
๊ทธ๋ํ๋ก๋ถํฐ ๊ฐ์ฅ ์ ์ ํ alpha ๊ฐ์ 1์ ๋๋ค. ์ฆ, 10^(1) = 10 ์ ๋๋ค!
alpha ๋ฅผ 10 ์ผ๋ก ํด์ ๋ค์ ํ๋ จ ํ๊ฒ ์ต๋๋ค.
๐์ ์ ํ alpha ๊ฐ์ผ๋ก ํ๋ จ
# 10 ์ผ ๋๊ฐ ๊ฐ์ฅ ์ ํฉ!!
lasso = Lasso(alpha = 10)
# ํ๋ จ
lasso.fit(train_scaled, train_target)
์์ฃผ ์ข์ต๋๋ค~!
โจ ์์ฑ ์ดํด๋ณด๊ธฐ
๐ coef_ : ๊ณ์
# ๊ณ์๊ฐ 0์ธ ๋ฐฐ์ด์ ๊ฐ์ ๋ฐํ
print(np.sum(lasso.coef_ == 0))
๋ผ์๋ ๊ณ์๊ฐ 0์ด ๋ ์ ์๋ค๊ณ ํ์ต๋๋ค.
๊ทธ๋ผ 55๊ฐ ํน์ฑ ์ค ๋ช ๊ฐ์ฉ์ด๋ ๊ณ์๊ฐ 0์ด ๋์์์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
55๊ฐ ์ค์ 40๊ฐ์ฉ์ด๋ ๊ณ์๊ฐ 0์ด ๋์๋ค์! ์ฆ, ๋ผ์ ๋ชจ๋ธ์ด ์ฌ์ฉํ ํน์ฑ์ 55๊ฐ ์ค์ 15๊ฐ๋ฐ์ ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ํน์ง์ผ๋ก, ๋ผ์ ๋ชจ๋ธ์ ์ ์ฉํ ํน์ฑ์ ๊ณจ๋ผ๋ด๋ ์ฉ๋๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
'๐ป My Work > ๐ง AI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 04-2. ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ (1) (0) | 2022.12.09 |
---|---|
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 04-1. ๋ก์ง์คํฑ ํ๊ท (2) | 2022.12.08 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-2. ์ ํ ํ๊ท (0) | 2022.12.05 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-1. k-์ต๊ทผ์ ์ด์ ํ๊ท (0) | 2022.12.05 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 02-2. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ (2) | 2022.12.04 |