ML Study_์ ํํ๊ท
by Holly Yoon
๐ก ์ ํํ๊ท ๋ชจ๋ธ ์ฐ์ต
- ์ค๋ช : ์ ํํ๊ท ๋ชจ๋ธ์ ๊ตฌ์ถํ์ฌ ํต๊ณ์ ์ผ๋ก ํด์
- ์์ธก : ์๋ก์ด ์
๋ ฅ ๋ฐ์ดํฐ(X) → ๋ฏธ๋ ๋ฐ์๋ณ์ ๊ฐ(Y) ์์ธก ๋ฐ ํ๊ฐ
ํ๊ท๋ชจ๋ธ์ ๊ฒ์ (์ฐธ๊ณ ์๋ฃ)
- why? ์์ฑ๋ ๋ชจ๋ธ์ด ์ ํํ๊ท์ ๊ธฐ๋ณธ ๊ฐ์ ์ ๋ฐ๋ฅด๋์ง ์๋์ง๋ ์ฒดํฌํด์ผํ๋ค. ๊ฐ์ ์ ๋ฐ๋ฅด์ง ์๋๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ท์ ๋ผ์๋ง์ถ ๊ฒฐ๊ณผ๊ฐ์ ์๋ง์ง์ฐฝ์ฐ. (ํ๋ฅ ์ค์ฐจ๋? ํ๋ฅ ์ค์ฐจ(์์ฐจ) = ํ๊ฒ๊ฐ - ์์ธก๊ฐ)
- ํ๋ฅ ์ค์ฐจ์ ์ ๊ท์ฑ ํ์ธ (์ค์ฐจ๋ ์ ๊ท๋ถํฌ๋ฅผ ๋ฐ๋ฅธ๋ค๋ ๊ฐ์ )
- ํ๋ฅ ์ค์ฐจ์ ๋ฑ๋ถ์ฐ์ฑ ํ์ธ (์ค์ฐจ์ ๋ชจ๋ ๋ถ์ฐ์ด ๋์ผํ๋ค๋ ๊ฐ์ )
- ๋ ๋ฆฝ์ฑ (์์ธก๊ฐ~์์ฐจ ๋ ๋ฆฝ์ฑ, ๋ ๋ฆฝ๋ณ์~์์ฐจ ๋ ๋ฆฝ์ฑ, ์์ฐจ์ ์๊ธฐ ์๊ด์ฑ)
- ์ค๋ช
- ๊ฒฐ์ ๊ณ์ (R-squared) : ๋ชจํ์ ์ฑ๋ฅ ํ๊ฐ
- coef(ghlrnlrPtn)
- P-value๊ฐ 0.05(์ ์์์ค)์ดํ์ผ ๋ ๋ณ์๊ฐ ์ ์๋ฏธํจ
kaggle์ ์ฒ์ ๋ ธํธ๋ถ ์์ฑํด๋ดค๋ค >MLstudy_W3
๐ก ์ฑ <ํผ์ ๊ณต๋ถํ๋ ๋จธ์ ๋ฌ๋+๋ฅ๋ฌ๋ ์ฑ >
- ์ง๋ํ์ต์ ์๊ณ ๋ฆฌ์ฆ : ๋ถ๋ฅ์ ํ๊ท
- ํ๊ท๋ ํด๋์ค ์ค ํ๋๋ก ๋ถ๋ฅํ๋ ๊ฒ์ด ์๋๋ผ ์์์ ์ด๋ค ์ซ์๋ฅผ ์์ธกํ๋ ๋ฌธ์
1. K-์ต๊ทผ์ ์ด์ ํ๊ท
- ๊ฒฐ์ ๊ณ์ : ๋ถ๋ฅ์ ๊ฒฝ์ฐ, ํ ์คํธ์ ์ํ์ ์ ํํ๊ฒ ๋ถ๋ฅํ ๊ฐ์์ ๋น์จ์ ์ ํ๋๋ก ์ธก์ ํ๋ค. ํ๊ท์์ ์ ํํ ์ซ์๋ฅผ ๋งํ๋ค๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๊ฒฐ์ ๊ณ์๋ฅผ ํ์ฉํ์ฌ ํ๊ฐํ๋ค.
knr = KNeighborsRegressor()
knr.fit(train_input, train_target)
print(knr.score(test_input, test_target))
- mean_absolute_error : ์ฌ์ดํท๋ฐ์์ ์ ๊ณตํ๋ ํ๊ฐ์งํ. ํ๊น๊ณผ ์์ธก์ ์ ๋๊ฐ ์ค์ฐจ๋ฅผ ํ๊ท ํ์ฌ ๋ฐํํ๋ค. (*์์ธก์ด ํ๊ท ์ ์ผ๋ก ํ๊น๊ณผ ์ผ๋ง๋ ์ฐจ์ด๊ฐ ๋๋์ง)
from sklearn.metrics import mean_absolute_error
test_prediction = knr.predict(test_input)
mae = mean_absolute_error(test_target, test_prediction)
print(mae)
- ๊ณผ๋์ ํฉ vs ๊ณผ์์ ํฉ : ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ์ ์ ์๋ฅผ ๋น๊ตํ์ ๋, ํ๋ จ ์ธํธ์์ ๋๋ฌด ๋์ผ๋ฉด ๊ณผ๋์ ํฉ, ๊ทธ ๋ฐ๋๊ฑฐ๋ ๋ชจ๋ ์ ์๊ฐ ๋ฎ์ผ๋ฉด ๊ณผ์์ ํฉ. ๊ณผ์์ ํฉ์ด ๋ฐ์ํ๋ ์ด์ ๋, ํ๋ จ/ํ
์คํธ ์ธํธ์ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ์๊ธฐ ๋๋ฌธ์ ์ผ์ด๋๋ค.
- ๊ณผ๋์ ํฉ → ๋ชจ๋ธ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค์ด์ผ, k๊ฐ ๋๋ฆฌ๊ธฐ
- ๊ณผ์์ ํฉ → ๋ชจ๋ธ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค์ด์ผ, k๊ฐ ์ค์ด๊ธฐ
- k-์ต๊ทผ์ ์ด์ ๊ฐ์ ์กฐ์ : ํ๋ จ ์ธํธ๋ณด๋ค ํ ์คํธ ์ ์๊ฐ ๋์ผ๋ ๊ณผ์์ ํฉ์ด ๋ฐ์ํ์ ๋๋, ๋ชจ๋ธ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๋ฉด ๋๋ค. ํ๋ จ ์ธํธ์ ๋ ์ ๋ง๊ฒ ๋ง๋ค๋ฉด ํ ์คํธ ์ธํธ์ ์ ์๋ ์กฐ๊ธ ๋ฎ์์ง๋ค.
knr.n_neighbors=3
knr.fit(train_input, train_tareg)
print(knr.score(train_input, train_target)
2. ์ ํํ๊ท
- k-์ต๊ทผ์ ์ด์ ํ๊ท์ ํ๊ณ : ์๋ก์ด ์ํ์ด ํ๋ จ ์ธํธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์๋ฑํ ๊ฐ์ ์์ธกํ๋ค.
import matplotlib.pyplot as plt
distance, indexes = knr.kneighbors([[50]])
plt.scatter(train_input, train_target)
#์ด์๋ง ๊ตฌํ๊ธฐ
plt.scatter(train_input[indexes],train_target[indexes], marker='D')
#50cm ๋์ด ๋ฐ์ดํฐ
plt.scatter(50, 1033, marker='^')
plt.show()
๊ธธ์ด๊ฐ ์ปค์ง์๋ก ๋์ด์ ๋ฌด๊ฒ๋ ์ฆ๊ฐํ์ง๋ง, 50cm๋์ด๋ 45cm ๊ทผ๋ฐฉ์ด๋ผ k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ์ํ ๋ฌด๊ฒ๋ฅผ ํ๊ท ์ ์ ๊ณตํจ
- ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฃผ๊ธฐ์ ์ผ๋ก ํ๋ จํด์ผ ํ๋ค. ์๊ฐ๊ณผ ํ๊ฒฝ์ด ๋ณํํ๋ฉด์ ๋ฐ์ดํฐ๋ ๋ฐ๋๊ธฐ ๋๋ฌธ์ ์๋ก์ด ํ๋ จ ๋ฐ์ดํฐ๋ก ๋ฐ๋ณต ํ๋ จ์ ์งํํด์ผ ํ๋ค.
- ์ฌ์ดํท๋ฐ์ LinearRegressionํด๋์ค, fit() score() predict()๋ฉ์๋
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_input, train_target)
print(lr.predit([[50]]))
>>[1241.83]
print(lr.coef_, lr.intercept_) #๊ณ์(๊ฐ์ค์น)์ y์ ํธ
>>[39.17] -709.01
plt.scatter(train_input, train_target)
plt.plot([15,50], [15*lr.coef_ + lr.intercept_, 50*lr.coef_ + lr.intercept_])
plt.scatter(50, 1241.8, marker='^')
plt.show()
- ๋คํญํ๊ท : ์ต์ ์ ์ง์ ์ด ์๋๋ผ ์ต์ ์ ๊ณก์ ์ ์ฐพ์! column_stack()์ ํ์ฉํ์ฌ ๊ธธ์ด๋ฅผ ์ ๊ณฑํ ํญ์ ์ถ๊ฐํด์ฃผ์ด์ผ ํฉ๋๋ค.
train_poly = np.column_stack((train_input**2, train_input))
test_poly = np.column_stack((test_input**2, test_input))
lr=LinearRegression()
lr.fit(train_poly, train_target)
print(lr.coef_, lr.intercept_)
>>[ 1.01433211 -21.55792498] 116.0502107827827
#๊ตฌ๊ฐ๋ณ ์ง์ ๊ทธ๋ฆฌ๊ธฐ ์ํ ์ ์ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
point=np.arange(15,50)
#ํ๋ จ ์ธํธ์ ์ฐ์ ๋
plt.scatter(train_input, train_target)
#2์ฐจ ๋ฐฉ์ ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
plt.plot(point, 1.01*point**2-21.6*point+116.05)
#50cm ๋์ด ๋ฐ์ดํฐ
plt.scatter([50], [1574], marker='^')
plt.show()
3. ๋ค์ค ํ๊ท
- ์ฌ๋ฌ๊ฐ์ ํน์ฑ์ ์ฌ์ฉํ ์ ํ ํ๊ท๋ฅผ ๋ค์คํ๊ท๋ผ๊ณ ํฉ๋๋ค.
- ํน์ฑ ๊ณตํ(feature engineering) : ๊ธฐ์กด์ ํน์ฑ์ ์ฌ์ฉํ์ฌ ์๋ก์ด ํน์ฑ์ ๋ฝ์๋ด๋ ์์ (๋์ด์ ๋ฌด๊ฒ๋ฅผ ์์ธกํ๊ธฐ ์ํด ๋์ด์ ๊ธธ์ดx๋์ด์ ๋์ด๋ผ๋ ์๋ก์ด ํน์ฑ์ ๋ง๋ค ์ ์์)
- ๋ฐ์ดํฐ ์ค๋น : ํ๋ค์ค → dataframe → numpy ๋ฐฐ์ด๋ก ๋ณํ
import pandas as pd
df=pd.read_csv('<https://bit.ly/perch_csv>')
perch_full=df.to_numpy()
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
train_input, test_input, train_target, test_target = train_test_split(perch_full, perch_weight, random_state=42)
- ์ฌ์ดํท๋ฐ์ ๋ณํ๊ธฐ
- fit() : ์๋กญ๊ฒ ๋ง๋ค ํน์ฑ ์กฐํฉ์ ์ฐพ์ต๋๋ค.
- transform() : ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํํฉ๋๋ค.
from sklearn.preprocessing import PolynomialFeatures
poly=PolynomialFeatures(include_bias=False)
poly.fit([[2,3]])
print(poly.transform([[2,3]]))
>> [[2.3.4.6.9.]]
#๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ดํท๋ฐ์ ๊ฐ ํน์ฑ์ ์ ๊ณฑํญ, ํน์ฑ๋ผ๋ฆฌ ๊ณฑํ ํญ์ ์ถ๊ฐํ๋ค
poly=PolynomialFeatures(include_bias=False)
poly.fit(train_input)
train_poly=poly.transform(train_input)
print(train_poly.shape)
>> (42,9)
- get_feature_names() : ์ด๋ค ์ ๋ ฅ์ ์กฐํฉ์ผ๋ก ๋ง๋ค์ด์ก๋์ง ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
poly.get_feature_names()
test_poly.poly.transform(test_input)
- ๋ค์ค ํ๊ท ๋ชจ๋ธ๋ก ํ๋ จํ๊ธฐ
from sklearn.linear_model import LinearRegression
lr=LinearRegression()
lr.fit(train_poly, train_target)
- ํน์ฑ ์ถ๊ฐํ๊ธฐ : PolynomialFeatures ํด๋์ค์ degree ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด์ ๊ณ ์ฐจํญ์ ์ต๋ ์ฐจ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. → ํน์ฑ ๊ฐ์๊ฐ ๋๋ฌด ํฌ๋ฉด, ํ๋ จ ์ธํธ์ ๋๋ฌด ๊ณผ๋์ ํฉ๋ ์ ์์ต๋๋ค.
poly=PolynomialFeatures(degree=5, include_
- ๊ท์ (regularization) : ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ด ํ๋ จ ์ธํธ๋ฅผ ๋๋ฌด ๊ณผ๋ํ๊ฒ ํ์ตํ์ง ๋ชปํ๋๋ก ํผ๋ฐฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
159์ชฝ๋ถํฐ ๊ณต๋ถ ์์ํ์๋๋ก ํ์์ค.
- ๋ฆฟ์ง ํ๊ท
- ๋ผ์ ํ๊ท
'ML' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ตฐ์ง๋ถ์ ๊ณต๋ถ (0) | 2023.03.09 |
---|
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Log by Holly
Holly Yoon