[AIB] Bias, Variance, R-Square, Multiple Regression, Evaluation Metrics
๐ก ํธํฅ (Bias)
The inability for a machine learning method (like linear regression) to capture the true relationship.
(์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ผ์ก์ง ๋ชปํ๋ ์ ๋)
Because the Straight line can't be curved like 'true' relationship.
↔ Squiggly line (๊ตฌ๋ถ๊ตฌ๋ถํ ์ ) did a great job fitting the training set, but it did a terrible job fitting the testing set.
(= Overfitting, ๊ณผ์ ํฉ)
๐ก ๋ถ์ฐ (Variance)
The difference in fits between data sets. (๋ฐ์ดํฐ ์ธํธ ๊ฐ์ ์ ํฉ๋ ์ฐจ์ด)
์์ธก๊ฐ๋ค๊ณผ ๊ด์ธก๊ฐ์ด ๋์ฒด๋ก ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ผ๋ฉด ๊ฒฐ๊ณผ์ ํธํฅ์ด ๋๋ค๊ณ ๋งํ๊ณ ,
์์ธก๊ฐ๋ค์ด ๋์ฒด๋ก ๋ฉ๋ฆฌ ํฉ์ด์ ธ ์์ผ๋ฉด ๋ถ์ฐ์ด ๋๋ค๊ณ ๋งํ๋ค.
cf.
Three commonly used method for finding the sweep spot(์ด์์ ์ธ ๊ท ํ) between simple and complicated models are Regularization, Boosting and Bagging.
๋จ์ํ ๋ชจ๋ธ๊ณผ ๋ณต์กํ ๋ชจ๋ธ ์ฌ์ด์ ์ด์์ ์ธ ๊ท ํ์ ์ฐพ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ = ์ ๊ทํ, ๋ถ์คํ , ๋ฐฐ๊น
โจ How to calculate R-Square Using Regression Analysis
(๊ด์ธก์น - ํ๊ท ) distance ์ (์์ธก์น - ํ๊ท ) distance ๋น๊ตํ๊ธฐ
→ R square ๊ฐ์ด 1์ ๊ฐ๊น์์ง์๋ก ๊ด์ธก์น์ ์์ธก์น๊ฐ ์ ์ฌํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
โจ Standard Error of the Estimate
y = ์ค์ y๊ฐ
^(y) = ์์ธกํ y๊ฐ
n = ์์ธก๊ฐ ๊ฐ์
๐ก ํ๊ท๋ชจ๋ธ์ ํ๊ฐํ๋ ํ๊ฐ์งํ๋ค (evaluation metrics)
- MSE (Mean Squared Error)
- MAE (Mean Absolute Error)
- RMSE (Root Mean Squared Error)
- R-squared
- SSE (Sum of Squares Error, ๊ด์ธก์น์ ์์ธก์น ์ฐจ์ด)
- SSR (Sum of Squares due to Regression, ์์ธก์น์ ํ๊ท ์ฐจ์ด)
- SST (Sum of Squares Total, ๊ด์ธก์น์ ํ๊ท ์ฐจ์ด) = SSE + SSR
# mean_sqaure_error, mean_absolute_error, rmse, r-squared error ํ์ธํ๊ธฐ
import pandas as pd
from IPython.display import display
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
rmse = mse ** 0.5
r2 = r2_score(y_test, y_pred)
display(pd.DataFrame([['MSE', mse],['MAE', mae],['RMSE', rmse],['R2', r2]], columns=['Metric', 'Score']))
reference.
https://partrita.github.io/posts/regression-error/
ํ๊ท์ ์ค๋ฅ ์งํ ์์๋ณด๊ธฐ
์ ํ ํ๊ท์ ์ค๋ฅ ์งํ๋ฅผ ์์๋ฅผ ํตํด ์์๋ด ๋๋ค
partrita.github.io
๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋๋์ด์ผ ํ ๊น?
๋ฐ์ดํฐ๋ฅผ ๋ฌด์์๋ก ์ ํํด ๋๋๋ ๋ฐฉ๋ฒ์ด ์ผ๋ฐ์ ์ด์ง๋ง, ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๊ณผ๊ฑฐ์์ ๋ฏธ๋๋ฅผ ์์ธกํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ ๋ฌด์์๋ก ๋ฐ์ดํฐ๋ฅผ ์์ผ๋ฉด ์ ๋ ์๋๋ค. ์ด๋๋ ํ๋ จ ๋ฐ์ดํฐ๋ณด๋ค ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ๋ฏธ๋์ ๊ฒ์ด์ด์ผ ํ๋ค.
# ๋ฐ์ดํฐ๋ฅผ ๋ฌด์์๋ก ๋๋๋ ๋ฐฉ๋ฒ
# 1
train = df.sample(frac=0.75, random_state=1) # frac : ๋ฐํํ ํญ๋ชฉ์ ๋น์จ
test = df.drop(train.index)
# 2
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, train_size=0.75, random_state=1)
๐ก ๋จ์์ ํํ๊ท๋ชจ๋ธ ์์
import pandas as pd
df = pd.read_csv('https://ds-lecture-data.s3.ap-northeast-2.amazonaws.com/house-prices/house_prices_train.csv')
# ๊ธฐ์ค๋ชจ๋ธ ๋ง๋ค๊ธฐ
# ํ๊ฒ์ธ SalePrice ์ ํ๊ท ์ ๊ธฐ์ค๋ชจ๋ธ๋ก ์ฌ์ฉ
# label ์ ์
target = 'SalePrice'
y_train = train[target]
y_test = test[target]
predict = y_train.mean()
>>> 180327.24200913243
# ๊ธฐ์ค๋ชจ๋ธ๋ก ํ๋ จ ์๋ฌ (MAE) ๊ณ์ฐ
from sklearn.metrics import mean_absolute_error
y_pred = [predict] * len(y_train)
mae = mean_absolute_error(y_train, y_pred)
>>> 57775.57
# GrLivArea (์ง์์ํ๋ฉด์ , sqft)์ SalePrice๋ฅผ ์ฌ์ฉ, scatterplot์ ๊ทธ๋ฆฌ๊ณ OLS ๋ผ์ธ์ ๊ทธ๋ ค๋ณด์
import seaborn as sns
sns.regplot(x=train['GrLivArea'], y=train['SalePrice']).set_title('Housing Prices')
cf.
seaborn.regplot()
: scatter plot๊ณผ line plot์ ํจ๊ป ๋ณผ ์ ์๋ ์๊ฐํ ๋ฐฉ๋ฒ
from sklearn.linear_model import LinearRegression
model = LinearRegression()
features = ['GrLivArea']
X_train = train[features]
X_test = test[features]
# ๋ชจ๋ธ fit
model.fit(X_train, y_train)
y_pred = model.predict(X_train)
mae = mean_absolute_error(y_train, y_pred)
print(f'ํ๋ จ ์๋ฌ: {mae:.2f}')
>>> ํ๋ จ ์๋ฌ: 38327.78
# ํ
์คํธ ๋ฐ์ดํฐ์ ์ ์ฉ
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print(f'ํ
์คํธ ์๋ฌ: {mae:.2f}')
>>> ํ
์คํธ ์๋ฌ: 35476.63
๐ก ๋ค์ค์ ํํ๊ท๋ชจ๋ธ ์์ (ํน์ฑ 2๊ฐ ์ด์)
features = ['GrLivArea', 'OverallQual']
target = 'SalePrice'
X_train = train[features]
X_test = test[features]
# ๋ชจ๋ธ fit
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_train, y_pred)
print(f'ํ๋ จ ์๋ฌ: {mae:.2f}')
>>> ํ๋ จ ์๋ฌ: 29129.58
# ํ
์คํธ ๋ฐ์ดํฐ์ ์ ์ฉ
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print(f'ํ
์คํธ ์๋ฌ: {mae:.2f}')
>>> ํ
์คํธ ์๋ฌ: 27598.31
๊ณผ์ ํฉ(Overfitting)๊ณผ ๊ณผ์์ ํฉ(Underfitting)
์ผ๋ฐํ (Generalization)
ํ ์คํธ ๋ฐ์ดํฐ์์ ๋ง๋ค์ด๋ด๋ ์ค์ฐจ๋ฅผ ์ผ๋ฐํ ์ค์ฐจ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํ๋ จ ๋ฐ์ดํฐ์์์ ๊ฐ์ด ํ ์คํธ ๋ฐ์ดํฐ์์๋ ์ข์ ์ฑ๋ฅ์ ๋ด๋ ๋ชจ๋ธ์ ์ผ๋ฐํ๊ฐ ์ ๋ ๋ชจ๋ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ชจ๋ธ์ด ๋๋ฌด ํ๋ จ ๋ฐ์ดํฐ์ ๊ณผํ๊ฒ ํ์ต(๊ณผ์ ํฉ)์ ํ์ง ์๋๋ก ํ๋ ๋ง์ ์ผ๋ฐํ ๋ฐฉ๋ฒ๋ค์ด ์๋ค.
๊ณผ์ ํฉ (Overfitting)
๊ณผ์ ํฉ์ ๋ชจ๋ธ์ด ํ๋ จ ๋ฐ์ดํฐ์๋ง ํน์ํ ์ฑ์ง์ ๊ณผํ๊ฒ ํ์ตํด ์ผ๋ฐํ๋ฅผ ๋ชปํด ๊ฒฐ๊ตญ ํ ์คํธ ๋ฐ์ดํฐ์์ ์ค์ฐจ๊ฐ ์ปค์ง๋ ํ์์ ๋งํ๋ค.
๊ณผ์์ ํฉ (Underfitting)
๊ณผ์์ ํฉ์ ํ๋ จ ๋ฐ์ดํฐ์ ๊ณผ์ ํฉ๋ ๋ชปํ๊ณ ์ผ๋ฐํ ์ฑ์ง๋ ํ์ตํ์ง ๋ชปํด, ํ๋ จ/ํ ์คํธ ๋ฐ์ดํฐ ๋ชจ๋์์ ์ค์ฐจ๊ฐ ํฌ๊ฒ ๋์ค๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
๋ถ์ฐ/ํธํฅ ํธ๋ ์ด๋์คํ
๊ณผ์ ํฉ, ๊ณผ์์ ํฉ์ ์ค์ฐจ์ ํธํฅ(Bias)๊ณผ ๋ถ์ฐ(Variance) ๊ฐ๋ ๊ณผ ๊ด๊ณ๊ฐ ์๋ค.
๋ถ์ฐ์ด ๋์ ๊ฒฝ์ฐ๋, ๋ชจ๋ธ์ด ํ์ต ๋ฐ์ดํฐ์ ๋ ธ์ด์ฆ์ ๋ฏผ๊ฐํ๊ฒ ์ ํฉํ์ฌ ํ ์คํธ ๋ฐ์ดํฐ์์ ์ผ๋ฐํ๋ฅผ ์ ๋ชปํ๋ ๊ฒฝ์ฐ, ์ฆ ๊ณผ์ ํฉ ์ํ์ด๋ค.
ํธํฅ์ด ๋์ ๊ฒฝ์ฐ๋, ๋ชจ๋ธ์ด ํ์ต ๋ฐ์ดํฐ์์ ํน์ฑ๊ณผ ํ์ผ ๋ณ์์ ๊ด๊ณ๋ฅผ ์ ํ์ ํ์ง ๋ชปํด ๊ณผ์์ ํฉ ์ํ์ด๋ค.