# numerical calculation & data framesimport numpy as npimport pandas as pd# visualizationimport matplotlib.pyplot as pltimport seaborn as snsimport seaborn.objects as so# statisticsimport statsmodels.api as sm# pandas optionspd.set_option('mode.copy_on_write', True) # pandas 2.0pd.options.display.float_format ='{:.2f}'.format# pd.reset_option('display.float_format')pd.options.display.max_rows =7# max number of rows to display# NumPy optionsnp.set_printoptions(precision =2, suppress=True) # suppress scientific notation# For high resolution displayimport matplotlib_inlinematplotlib_inline.backend_inline.set_matplotlib_formats("retina")
모델을 관찰된 데이터에 fit(적합) 또는 train(훈련) 시켜, parameter(모수) 추정
전형적으로 (ordinary) least squares 방법을 사용
상대적으로 적은 수의 데이터로도 추정이 가능
해석을 통해 변수 간의 관계 추론 용이
\(f\)의 형태를 잘못 가정하면, 잘못된 결과를 낼 수 있음
Source: p.21, An Introduction to Statistical Learning with Applications in Python
비모수적(non-parametric) 접근
\(f\)의 형태를 가정하지 않음
보통, 예측의 정확성이 높도록, 즉 데이터와 최대한 가까운 매우 복잡한 형태의 \(\hat f\)를 추구
과적합(overfit)이 되지 않도록, 새로운 데이터에도 잘 일반화되도록 sweet spot을 찾아야 함
매우 많은 데이터가 요구됨
해석은 어려우나, \(f\)로부터 다양한 정보(information)을 추출하는 방법을 고안
모수가 없을 수도, 있을 수 있으나, 해석 가능한 모수라고 보기 어려움
Source: p.22, An Introduction to Statistical Learning with Applications in Python
The tradeoff between flexibility and interpretability
Source: p.22, An Introduction to Statistical Learning with Applications in Python
어떤 기준으로 이 tradeoff의 수준을 결정할 것인가?
해석에 중심을 두고, 변수 간의 관계를 추론하고자 하는 경우: 모형이 틀릴 위험이 존재 >> bias가 높아짐
예측의 정확성에 중심을 두는 경우: 과적합이 될 위험이 존재 >> variance가 높아짐
이 둘이 항상 대치되는 것은 아님; 단순한 모형이 새로운 데이터에서 더 나은 예측 정확도를 가질 수도 있음!
회귀(regression) vs. 분류(classification)
보통 \(Y\)가 연속형 변수인 경우, 회귀(regression) 문제로 다루고, \(Y\)가 범주형 변수인 경우, 분류(classification) 문제로 일컬어 짐.
회귀모형을 확장하여 확률(연속값)을 구한 후, 이를 이용해 분류문제를 다룰 수 있음; ex. logistic regression
예측 변수의 경우, 연속인지 범주형인지는 상관없음.
Decision Theory
Source: Deep Learning: Foundations and Concepts by Bishop, C. M. & Bishop, H
\(Y = f(X) + \epsilon\)
앞서 선형 회귀 모형에서 구한 것은, conditional probability \(p(Y|X)\)를 모델링 한 것이었음.
이 분포를 Gaussian:\(N(\mu, \sigma^2)\)으로 가정하고, 분포의 평균과 표준편차를 likelihood가 최대가 되도록 추정하는 간단한 모델로 축소했음; predictive distribution
분포 \(p(Y|X)\)를 통해 예측의 불확실성을 파악할 수 있음
만약, 주어진 \(X\)에서 대해 예측값 \(f(X)\)을 하나 결정하는데, 실제 true 값을 \(y\)라고 하면,
그 오차에 대해 발생되는 어떤 penalty 또는 cost를 정의; loss function
loss function을 통해 “최적”의 예측값에 대한 기준을 제공
\(f(x) = E(Y|X=x)\)로 예측하는 것이 많은 경우 적절하지만 일반적으로 그런 것은 아님
Loss/Cost Function
Loss function: \(L(y, f(x))\) \(y\): true value, \(f\): predicted value
이 loss를 최소화하는 것이 목표
True \(y\)를 모르기 때문에, 평균치인 expected loss를 최소화하는 것이 목표
즉, \(E(L) = \displaystyle \iint L(y, f(x))p(x, y) dx dy\)를 최소화하도록 예측값(\(f\))을 결정
각 \(x\)에 대해 \(\displaystyle \int L(y, f(x))p(y|x)dy\)를 최소화
예를 들어, 다이아몬드의 무게로 가격을 예측한다면: 1 carat 다이아몬드의 true price?
또는, 목소리(특정 frequency)로 성별을 예측한다면; 분류 문제의 경우 뒤에서 다룸
\(X: \{a, b, a, a, b, c\}\)
The mean of \(X=\displaystyle \frac{a + b + a + a + b + c}{6} = \frac{3*a}{6} + \frac{2*b}{6} + \frac{1*c}{6}=a*\frac{3}{6} + b*\frac{2}{6} + c*\frac{1}{6}\) \(~~~~~~~~~~~~~~~~~~~~~~~~~=a*p(X=a) + b*p(X=b) + c*(X=c)\): weighted average
연속값이라면, \(E(X)=\displaystyle \sum \Delta x * p(\Delta x) = \int x f(x) dx\), where \(f(x)\) is the probability density function \(p(\Delta x) = f(x)\Delta x\)
The Bias–Variance Trade-off
위의 논의는 특정 데이터셋에 의존할 수밖에 없는데, (참고: Bayesian의 경우 다른 접근)
데이터셋마다 다른 \(\hat f\)를 얻게 된다는 점을 감안했을 때, \(\hat f\)의 변동성을 살펴보면,
\(L_2\) loss의 경우,
\(\displaystyle h(x) := E(Y|X=x)\): optimal prediction of \(Y\) at any point \(x\) \(~~~~~~~~~ = \displaystyle \int y \cdot p(y|x)dy\)
보통의 경우, 0-1 loss를 사용. 즉, misclassified된 관측치에 대한 비율; misclassification error rate \(E(L) = \displaystyle \frac{1}{N} \sum_{i=1}^N I(y_i \neq \hat y_i)\) where \(I\) is the indicator function: 0 if \(y_i = \hat y_i\), 1 otherwise
잘못된 예측에 대한 비용이 다르다면, 이에 대응하는 expected loss를 기준으로 모델을 평가
from sklearn.model_selection import train_test_splitauto_train, auto_valid = train_test_split(auto, test_size=.5, random_state=0)
code
p = ( so.Plot(auto_train, x='horsepower', y='mpg') .add(so.Dots(color=".5")))p.show()for i inrange(1, 6): p.add(so.Line(), so.PolyFit(i)).label(title=f"M = {i}").show()
Left: Validation error estimates for a single split into training and validation data sets. Right: The validation method was repeated ten times, each time using a different random split of the observations into a training set and a validation set. This illustrates the variability in the estimated test MSE that results from this approach.
Source: p. 204, An Introduction to Statistical Learning with Applications in Python
교차검증의 예
k-fold cross-validation: 데이터셋을 k개의 서브셋으로 나누어, k번의 모형평가를 수행
leave-one-out cross-validation(LOOCV): k=n인 경우
거의 모든 데이터로부터 훈련
k-fold 작업에서 발생하는 무작위성이 없음
Shuffle-split cross-validation: 데이터셋을 무작위로 섞어서 k번의 모형평가를 수행
관찰된 데이터에 가장 적합한 모형을 찾는 것이 아니고, 일반화된 모형을 찾는 것이 목표임.
아래 그림에서 관찰된 데이터셋에 대한 예측 오류인 “test error”와 “true error”의 관계를 보여줌.
예를 들어, 아래의 3가지 형태의 true relationship에 대해,
Left: Data simulated from f, shown in black. Three estimates of f are shown: the linear regression line (orange curve), and two smoothing spline fits (blue and green curves). Right: Training MSE (grey curve), test MSE (red curve), and minimum possible test MSE over all methods (dashed line). Squares represent the training and test MSEs for the three fits shown in the left-hand panel.
Source: pp. 29-32, An Introduction to Statistical Learning with Applications in Python
Cross-validation의 test-error가 효과적으로 true error를 반영할 수 있는지를 살펴보면,
보통 실제 test error rate보다 낮게 나오나(즉, 더 적합하게) 최적의 flexibility의 위치는 유사함
참고로, 여기서 true error는 앞서 training/test set으로 나눈 그 test set을 의미하는 것이 아님!
Source: p. 208, An Introduction to Statistical Learning with Applications in Python
다음 절차를 통해, 어떤 클래스의 특정 모델을 선택 후 그 모델의 성능을 평가할 수 있음:
모델 클래스를 선택: 예. linear regression
데이터셋을 traing set과 test set으로 나눈 후,
training set으로 교차검증(sub-trainging & validation sets)을 통해 모델의 flexibility를 결정: 예. 다항식의 차수, tuning parameter 등
최적의 flexibility 또는 bias-variance trade off 수준를 결정
최적의 flexibility를 선택한 후, 전체 training set으로 fitting한 모델을 선택 후
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
from ISLP import load_datacarseats = load_data("Carseats")carseats.head(3)
Sales CompPrice Income Advertising Population Price ShelveLoc Age \
0 9.5000 138 73 11 276 120 Bad 42
1 11.2200 111 48 16 260 83 Good 65
2 10.0600 113 35 10 269 80 Medium 59
Education Urban US
0 17 Yes Yes
1 10 Yes Yes
2 12 Yes Yes
from sklearn.linear_model import LinearRegressionX = carseats[["Income", "Advertising", "Population", "Price", "Age"]]y = carseats["Sales"]# linear regressionlm_carseats = LinearRegression()lm_carseats.fit(X, y)
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.