Model Basics

R for Data Science by Wickham & Grolemund

Author

Sungkyun Cho

Published

April 24, 2025

Load packages
# numerical calculation & data frames
import numpy as np
import pandas as pd

# visualization
import matplotlib.pyplot as plt
import seaborn as sns
import seaborn.objects as so

# statistics
import statsmodels.api as sm

# pandas options
pd.set_option('mode.copy_on_write', True)  # pandas 2.0
pd.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 options
np.set_printoptions(precision = 2, suppress=True)  # suppress scientific notation

# For high resolution display
import matplotlib_inline
matplotlib_inline.backend_inline.set_matplotlib_formats("retina")

Introduction

Source: R for Data Science by Wickham & Grolemund

모델의 목표는 데이터 세트에 대한 간단한 저차원 요약을 제공하는 것입니다. 이상적으로, 모델은 진정한 ‘신호’(즉, 관심 있는 현상에 의해 생성된 패턴)를 포착하고 ‘노이즈’(즉, 관심 없는 임의의 변동)는 무시합니다. (번역 by DeepL)

The goal of a model is to provide a simple low-dimensional summary of a dataset. Ideally, the model will capture true “signals” (i.e. patterns generated by the phenomenon of interest), and ignore “noise” (i.e. random variation that you’re not interested in).

이상적으로, 모형(model)이 현상으로부터 노이즈가 제거된 진정한 신호를 잡아내 주기를 기대.
물리 법칙: 물리적 세계에 대한 모델

예를 들어, 캐럿과 가격의 진정한 관계를 모델로 표현

Linear model: \(Y = aX + b + \epsilon\),   \(\epsilon\): errors

  • \(price = a \cdot carat + b + \epsilon\)
  • 로그 변환 후 선형관계로 가정: \(log(price) = a \cdot log(carat) + b + \epsilon\)
    • \(\epsilon\): Gaussian 분포로 가정, 즉 \(\epsilon \sim N(0, \sigma^2)\)
  • \(E(Y|X = X_i) = a \cdot X_i + b\)   (\(E\): expectation, 기대값)
    • 즉, \(X = X_i\)에 대한 conditional mean이 선형함수로 결정됨을 가정

Errors은 노이즈?

  • Reducible error: 모형이 잡아내지 못한 신호; 영향을 미치지만 측정하지 않은 변수가 존재
  • Irreducible error:
    • 대표적으로 측정 오차 (measurement error): ex. 성별, 키, 온도, 강수량, 지능, 불쾌지수, 우울증, …
    • Random processes
      • 물리적 세계의 불확실성: stochastic vs. deterministic world
          vs.  
      • 예를 들어, 동전을 4번 던질 때 앞면의 갯수
        • H, H, T, H
        • H, T, T, H
        • T, T, H, H
  • 보통 Gaussian 분포를 이루거나 가정: ex. 측정 오차들, 동전 앞면의 개수들, 키, 몸무게, IQ, …
  • 그 외에 자연스럽게 나타난다고 가정할 수 있는 여러 분포들이 있음; Binomial, Poisson, Exponential, Weibull, Gamma, Beta, …
    • 가령, 환자/병의 특성(X)에 따른 퇴원까지 남은 시간의 경우
      \(E(Y|X = X_i) = a * X_i + \epsilon_i\),   \(\epsilon_i \sim \text{Exponential}(\lambda)\); \(f(t) = \lambda e^{-\lambda t}\)

불확실성(uncertainty)

  • 예측은 정확할 수 없으며, 이 불확실성이 error로 표현되며,
  • 확률의 개념으로 모형의 일부로 포함되어 예측에 대한 중요한 정보를 제공.

Gaussian/Normal distribution

  • 랜덤한 값들의 합/평균들이 나타내는 분포; 중심극한정리(Central Limit Theorem)
    • 측정 오차의 분포(error distribution)
    • 다양한 힘들의 상호작용으로 인한 분포
  • 분산이 유한한 분포 중에 정보 엔트로피가 최대(maximum entropy)인 분포
  • \(X \sim N(\mu, \sigma^2)\); density function \(\displaystyle f(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{1}{2}(\frac{x-\mu}{\sigma})^2}\)
  • \(X \sim N(0, 1)\); \(\displaystyle f(x) = \frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}x^2}\), (standard normal distribution)
1000 people, each 16 steps tossing a coin: 
 [[-1  1 -1 ... -1  1 -1]
 [ 1 -1 -1 ... -1  1  1]
 [-1  1 -1 ... -1  1 -1]
 ...
 [-1  1 -1 ... -1  1 -1]
 [-1  1 -1 ... -1  1 -1]
 [-1 -1  1 ... -1 -1 -1]]

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import norm

np.random.seed(0)
def plot_Gaussin(n=0, ax=None):
    N = 200
    num_people, num_rounds = N, n

    if n == 0:
        toss = np.zeros(N).reshape(N, -1)
    else:
        toss = np.random.choice([-1, 1], size=(num_people, num_rounds))
    toss_sum = toss.sum(axis=1)

    ax = ax or plt.gca()
    ax.set_title(f"{N} people, each tossing a fair coin {n} times")

    df = pd.DataFrame({"TossSum": toss_sum})
    df2 = df.value_counts().reset_index()
    x = df2["TossSum"].values.astype(int)
    y = df2["count"].values

    if n < 10:
        ax.bar(x, y, color="#1f77b4", alpha=.6, width=.8)
        ax.set_xlim(-10, 10)
        ax.set_xticks(x)
    else:
        ax.bar(x, y, color="#1f77b4", alpha=.6)
        ax.set_xticks(x)

    for i, v in enumerate(y):
        ax.text(x[i], v + 0.5, str(v), ha="center", color="r")

from ipywidgets import interact, fixed
interact(plot_Gaussin,  n=(0, 100), ax=fixed(None))

Model basics

우선, simulated 데이터셋으로 모형을 세우는 방식을 들여다보면서 본질적인 부분을 익히고자 함.
모델은 두 부분으로 나뉘는데

  1. A family of models를 정의: generic 패턴을 표현해 줄 수 있는 모델 클래스

    • 선형적인 관계라면 가령, 예측변수가 2개인 선형 모델인   \(y = \beta_0 + \beta_1 x_1 + \beta_2 x_2\)
    • 지수적 관계라면 가령,   \(y = \beta_0 + \beta_2 x^{\beta_1}\)
Important

\(\beta_0, \beta_1, \beta_2\)는 패턴을 잡아낼 수 있도록 변하는 파라미터(parameter); 통계에서는 모집단(population)에서 변수들의 관계를 의미
머신러닝에서는 parameters, coefficients, weights 등으로 혼용

  1. A fitted model을 생성: 데이터에 가장 가까운(적합한; optimal, fitted) 파라미터에 해당하는 특정 모델을 선택.
    “fit a model to data”

    • \(y = 3x+7\)
    • \(y = 9x^{1.6}\)

A fitted model은 a family of models 중에 데이터에 가장 가까운 모델임

  • 이는 소위 “best” model일 뿐
  • “good” model임을 뜻하지 않고, “true” model임을 뜻하는 것은 더더욱 아님

All models are wrong, but some are useful.
The goal of a model is not to uncover truth, but to discover a simple approximation that is still useful.

A simple model

Data: sim1.csv

sim1 = pd.read_csv("data/sim1.csv")
     x     y
0    1  4.20
1    1  7.51
2    1  2.13
..  ..   ...
27  10 24.97
28  10 23.35
29  10 21.98

[30 rows x 2 columns]

  • 패턴: 강한 선형 관계
  • 선형 모델 family/class인 \(y = \beta_0 + \beta_1 x\)을 세운 후
  • 무수히 많은 \(\beta_0, \beta_1\)의 값들 중 위 데이터에 가장 가까운 값을 찾음
  • 그 예로, 임의로 250개의 선형 모델을 그려보면,

이 선형모델 중 데이터에 가장 가까운 모델을 찾고자 하는데, 이를 위해서는 데이터와 모델과의 거리를 정의해야 함.

\(d =|~data - model~|\)

예) 모델과 데이터의 수직 거리(residuals)의 총체

Model 1.1: \(y = 1.5x+7\)의 경우, 이 모델이 예측하는 값들

array([ 8.5,  8.5,  8.5, 10. , 10. , 10. , 11.5, 11.5, 11.5, 13. , 13. ,
       13. , 14.5, 14.5, 14.5, 16. , 16. , 16. , 17.5, 17.5, 17.5, 19. ,
       19. , 19. , 20.5, 20.5, 20.5, 22. , 22. , 22. ])

이 때, 관측치(\(Y_i\))와 예측치(\(\hat{Y}_i\))의 차이, \(Y_i - \hat{Y}_i\)잔차(residuals) 또는 예측 오차(errors)라고 함

     x     y  pred  resid | e
0    1  4.20  8.50      -4.30
1    1  7.51  8.50      -0.99
2    1  2.13  8.50      -6.37
..  ..   ...   ...        ...
27  10 24.97 22.00       2.97
28  10 23.35 22.00       1.35
29  10 21.98 22.00      -0.02

[30 rows x 4 columns]

RMSE = \(\displaystyle\sqrt{\frac{1}{n} \sum_{i=1}^{n}{e^2}}\) = 2.67

MAE = \(\displaystyle\frac{1}{n} \sum_{i=1}^{n}|~e~|\) = 1.43

Model evaluation

Error functions

  • Root-mean-squared error: \(RMSE = \displaystyle\sqrt{\frac{1}{n} \sum_{i=1}^{n}{(y_i -\hat y_i)^2}}\)
  • Mean absolute error: \(MAE = \displaystyle\frac{1}{n} \sum_{i=1}^{n}{|~y_i -\hat y_i~|}\) : 극단값들에 덜 민감함

즉, 데이터셋 sim1과 model 1.1 과의 거리를 RMSE로 정의하면, \(d=|~sim1 -model1~| = 2.67\)

위의 250개의 모델에 대해 각각 거리를 구하면

       b0    b1  dist
0   21.79 -2.92 17.42
1   -2.83 -0.57 22.83
2   -6.39  2.16 10.26
..    ...   ...   ...
247  0.51  4.19 10.38
248 27.94 -0.84 11.59
249 27.93  2.45 25.99

[250 rows x 3 columns]

이 중 제일 좋은 모델(dist가 최소) 10개의 모델을 그리면,

250개의 모델 중 10개의 모델을 다음과 같은 \((\beta_0, \beta_1)\) 평면으로 살펴보면, 즉, model space에서 살펴보면

  • 오렌지 색은 위에서 구한 10 best models

Source: Introduction to Statistical Learning by James et al.

점차 촘촘한 간격으로 grid search를 하면서 거리를 최소로 하는 모델을 찾아가는 것이고, 실제로는 Newton-Raphson search를 통해 최소값을 구하는 알고리즘을 통해 구할 수 있음.

즉, 거리를 최소로 하는 \(\beta_0\), \(\beta_1\)를 찾으면,

from scipy.optimize import minimize
minimize(measure_distance, [0, 0], args=(sim1)).x
array([4.22, 2.05])

이렇게 squared error가 최소가 되도록 추정하는 것을 ordinary least squares(OLS) estimattion라고 함.
선형 회귀 모형의 경우, 실제로는 위에서 처럼 grid search를 하지 않고, closed-form solution을 통해 바로 구할 수 있음.

Maximum likelihood estimation

데이터가 발생된 것으로 가정하는 분포를 고려했을 때,
어떨때 주어진 데이터가 관측될 확률/가능도(likelihood)가 최대가 되겠는가로 접근하는 방식으로,
X, Y의 관계와 확률분포를 함께 고려함.

  • 선형관계라면, 즉 \(E(Y|X=x_i) = \beta_0 + \beta_1x_i\)   (\(E\): expected value, 기대값)
  • 분포가 Gaussian이라면, 즉 \(Y|(X=x_i) \sim N(\beta_0 + \beta_1x_i, \sigma^2)\)   (\(\sigma\): 표준편차)

Likelihood \(L = \displaystyle\prod_{i=1}^{n}{P_i}\)   (관측치들 독립일 때, product rule에 의해)
분포가 Gaussian이라면(평균: \(\mu\), 표준편차: \(\sigma\)), 즉 \(f(t) = \displaystyle\frac{1}{\sqrt{2\pi\sigma^2}}exp\left(-\frac{(t-\mu)^2}{2\sigma^2}\right)\)라면

\(L = \displaystyle\prod_{i=1}^{n}{f(y_i, x_i)} = \displaystyle\prod_{i=1}^{n}{\frac{1}{\sqrt{2\pi\sigma^2}}exp\left(-\frac{(y_i - (\beta_0 + \beta_1x_i))^2}{2\sigma^2}\right)}\)

이 때, 이 likelihood를 최대화하는 \(\beta_0, \beta_1, \sigma\)를 찾는 것이 목표이며,
이처럼 분포가 Gaussian라면, OLS estimation과 동일한 값을 얻음. (단, \(\sigma\)는 bias가 존재)
다른 분포를 가지더라도 동일하게 적용할 수 있음!

즉, likelihood의 관점에서 주어진 데이터에 가장 근접하도록(likelihood가 최대가 되는) “분포의 구조”를 얻는 과정임

여러 편의를 위해, log likelihood를 최대화함.

Log-likelihood

다음 두가지를 고려하면,
\(log(x \cdot y) = log(x) + log(y)\)
\(e^x \cdot e^y = e^{x+y}\)

\(log(L) = \displaystyle\sum_{i=1}^{n}{log\left(\frac{1}{\sqrt{2\pi\sigma^2}}exp\left(-\frac{(y_i - (\beta_0 + \beta_1x_i))^2}{2\sigma^2}\right)\right)} = \displaystyle\sum_{i=1}^{n}{-log(\sqrt{2\pi\sigma^2}) - \frac{(y_i - (\beta_0 + \beta_1x_i))^2}{2\sigma^2}}\)

두 번째 항이 앞서 정의한 squared error와 동일함

앞서와 마찬가지로 여러 \(\beta_0, \beta_1\)값을 대입해서 log likelihood를 최대화하는 값을 찾아보면,

create a grid for b0, b1
# create a grid for b0: (-20, 40), b1:(-5, 5)
np.random.seed(123)
b0 = np.linspace(-20, 40, 100)
b1 = np.linspace(-5, 5, 100)

# meshgrid
b0, b1 = np.meshgrid(b0, b1)

models = pd.DataFrame(dict(b0=b0.ravel(), b1=b1.ravel()))
models
         b0    b1
0    -20.00 -5.00
1    -19.39 -5.00
2    -18.79 -5.00
...     ...   ...
9997  38.79  5.00
9998  39.39  5.00
9999  40.00  5.00

[10000 rows x 2 columns]

표준편차(\(\sigma\))는 고정하고(2.2), - loglikelihood 값을 구해 정렬하면,
(참고: 마찬가지로 likelihood를 최대화하는 \(\sigma\)값을 찾을 수 있음)

calculate the likelihood
from scipy.stats import norm  # normal distribution

def likelihood(b, data):
    mu = b[0] + b[1] * data["x"]
    sigma = 2.2
    return -np.sum(np.log(norm.pdf(data["y"], mu, sigma)))

models["-log likelihood"] = models.apply(lambda x: likelihood(x, sim1), axis=1)
models.sort_values("-log likelihood")
         b0    b1  -log likelihood
7040   4.24  2.07            65.32
6941   4.85  1.97            65.53
7139   3.64  2.17            65.65
...     ...   ...              ...
406  -16.36 -4.60              inf
209  -14.55 -4.80              inf
0    -20.00 -5.00              inf

[10000 rows x 3 columns]

scipy의 minimize 함수를 이용해서 최소값을 구해보면,

from scipy.optimize import minimize
minimize(likelihood, [0, 0], args=(sim1)).x
array([4.22, 2.05])
from statsmodels.formula.api import ols

mod = ols('y ~ x', data=sim1).fit()
mod.summary()
OLS Regression Results
Dep. Variable: y R-squared: 0.885
Model: OLS Adj. R-squared: 0.880
Method: Least Squares F-statistic: 214.7
Date: Sat, 12 Apr 2025 Prob (F-statistic): 1.17e-14
Time: 18:33:25 Log-Likelihood: -65.226
No. Observations: 30 AIC: 134.5
Df Residuals: 28 BIC: 137.3
Df Model: 1
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Intercept 4.2208 0.869 4.858 0.000 2.441 6.001
x 2.0515 0.140 14.651 0.000 1.765 2.338
Omnibus: 0.125 Durbin-Watson: 2.254
Prob(Omnibus): 0.939 Jarque-Bera (JB): 0.333
Skew: 0.081 Prob(JB): 0.847
Kurtosis: 2.510 Cond. No. 13.7


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.


Maximum likelihood estimation은 다양한 분포의 데이터에 대해서도 적용할 수 있음.
예를 들어, 다음과 같은 전형적인 Gaussian이 아닌 분포에 대해서도 적용할 수 있음.
Non-constant variance(왼쪽), Poisson distribution(오른쪽)

Uncertainty

관찰된 데이터(표본, sample)로부터 모집단(population)에 대한 정보를 추론할 때, 불확실성이 존재함.
이는 새로운 데이터에 대한 예측의 불확실성 혹은 일반화(generalization)에 대한 문제와 동일함.

예를 들어, 과거 병원 기록으로 새로운 환자에 대한 진단을 내리는 경우

  1. 이 환자의 고유한 상태로부터 오는 불확실성: 측정된 부분(measured) + 측정되지 않은 부분(unmeasured)
  2. 과거 기록을 통한 진단의 정확성(true relationship)에 대한 불확실성

불확실성에 대한 종류

  • 파라미터 추정치에 대한 불확실성: confidence interval
    • 데이터가 많을 수록
    • X가 넓게 분포할 수록
  • 특정 추정값에 대한 불확실성
    • 평균값(\(E(Y|X_i)\))에 대한 불확실성: confidence interval
    • 예측값(\(f(X_i)\))에 대한 불확실성: prediciton interval

전통적으로는 분포에 대한 가정으로부터 이론적으로 불확실성을 추론했으나,
현대적인 접근으로 resampling 방식의 bootstrapping이나 sample을 traing/test set으로 나누는 cross-validation 등을 통해 시뮬레이션을 통해 불확실성을 추정할 수 있음

Bayesian 방식에서는 모집단의 분포에 대한 가정없이, 관찰된 데이터만으로 파라미터에 대한 분포(posterior predictive distribution)로 불확실성에 대해 추정하는 방식도 있음; 앞서 지구의 바다/육지의 비율에 대한 분포의 예측 참고

반대로, machine learning에서는 특정 action 혹은 decision-making을 하는 것이 중요한 경우가 많아, 불확실성에 대한 고려가 적은 경향이 있음; 가령, 불확실성이 크던 작던 간에, 실용적인 관점에서 구체적으로 가격을 예측하거나, 질병 여부를 예측하길 기대함. 어떤 질병에 걸렸을 확률이 0.8로 예측되는 경우라도 사실은 불확실성을 고려하면 그 확률은 가령 0.7 ~ 0.9 사이일 수 있음.

calculate confidence intervals
sim1_new = pd.DataFrame({"x": [0.5, 1.5, 4.5, 7.5, 10.5]})
mod = ols('y ~ x', data=sim1).fit()
predictions = mod.get_prediction(sim1_new).summary_frame(.1)

plt.fill_between(sim1_new["x"], predictions['obs_ci_lower'], predictions['obs_ci_upper'], alpha=.1, label='90% Prediction interval')
plt.fill_between(sim1_new["x"], predictions['mean_ci_lower'], predictions['mean_ci_upper'], alpha=.5, label='90% Confidence interval')
plt.scatter(sim1["x"], sim1["y"], label='Observed', marker='o', color='.6', s=12)  # Reduced point size
plt.scatter(sim1_new["x"], sim1_new["x"]*0, label='New data', marker='x', color='orangered', s=22)  # Reduced point size
plt.plot(sim1_new["x"], predictions['mean'], label='Regression line')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(frameon=False)
sns.despine()
plt.ylim(-0.5, 30)
plt.show()

x_new mean mean_se mean_ci_lower mean_ci_upper obs_ci_lower obs_ci_upper
0 0.50 5.25 0.81 3.87 6.62 1.26 9.24
1 1.50 7.30 0.69 6.13 8.47 3.37 11.22
2 4.50 13.45 0.43 12.73 14.18 9.64 17.27
3 7.50 19.61 0.49 18.77 20.44 15.77 23.45
4 10.50 25.76 0.81 24.39 27.14 21.77 29.75


아래는 bootstrapping을 통한 실제 표본을 재추출(resampling)하는 방식을 보여줌; 관찰된 표본을 모집단인듯 가정하고 표본을 재추출
전통적으로는 표본 분포(sampling distribution)에 대한 이론을 통해 closed form으로 얻을 수 있음.


Source: The Truthful Art by Albert Cairo.

Predictive Accuracy

전통적인 모형에서는

  • 샘플에 대해서 계산된 값은 실제보다 overestimate 되는 경향이 있으므로,
  • 이를 보정하는 방식으로 계산: adjusted, shrunken

현대적인 방식에서는

  • 샘플을 training/test set으로 나누어서, test set에 대한 예측값을 계산하고, 이를 통해 예측의 정확성을 평가함
  • 비슷하게, resampling 방식의 bootstrapping을 통해 해결

주로 사용되는 지표들

  • \(RMSE = \displaystyle\sqrt{{\frac{{1}}{{n}} \sum_{{i=1}}^{{n}}{{e^2}}}}\)
  • \(MAE = \displaystyle\frac{{1}}{{n}} \sum_{{i=1}}^{{n}}|~e~|\)
  • \(R^2 = 1 - \displaystyle\frac{\frac{1}{n} \sum_{i=1}^{n}{(e-0)^2}}{\frac{1}{n} \sum_{i=1}^{n}{(Y-\overline{Y})^2}} = 1 - \frac{V(e)}{V(Y)} = \frac{V(\widehat Y)}{V(Y)}\),   \(V(Y) = V(\widehat Y) + V(e)\)
    • 전통적으로 \(X\)\(Y\)를 얼마나 잘 “설명”해주는지에 대한 지표로서 \(R^2\)를 사용함
  • 정규분포에서 벗어난 경우, 분포를 고려한 log-likelihood를 기반으로 한 지표들: AIC, BIC, …
    • \(AIC = -2loglikelihood + 2k\),   \(k\): 모델의 자유도
    • \(BIC = -2loglikelihood + k \cdot log(n)\),   \(n\): 데이터의 수
calculate RMSE, MAE, R2
from statsmodels.tools.eval_measures import rmse, meanabs, aic, bic
ypred = mod.predict(sim1)
y = sim1["y"]
llf = mod.llf # log likelihood

print(f"RMSE = {rmse(y, ypred):.2f} \nMAE = {meanabs(y, ypred):.2f} \nR-squared = {mod.rsquared:.2f} \nAIC = {aic(llf, 30, 2):.2f} \nBIC = {bic(llf, 30, 2):.2f}")
RMSE = 2.13 
MAE = 1.71 
R-squared = 0.88 
AIC = 134.45 
BIC = 137.25

Summary

Important

sim1을 이용한 위의 예는 모든 모델에 적용될 수 있음

즉, \(y = f(x1, x2,...)\) 파라메트릭 클래스의 a family of models을 구성한 후

  1. 모델 파라미터(parameter)의 추정

    • 모델과 데이터와의 거리 \(d =|~data - model~|\)를 정의한 후
    • 거리 \(d\)가 최소가 되는 파라미터를 구하면, a family of models 중 best model을 만들 수 있음
      • 보통 squared error function을 사용함.
      • 이 squared error가 최소가 되도록 하는 것을 ordinary least squares(OLS) estimator라고 함
      • Error가 Gaussian 일때, 이 OLS는 적절한 parameter를 추정하게 됨.
    • 더 넓은 확률적 프레임워크인 likelihood의 관점에서 접근할 수 있음
      • 주어진 데이터가 관측될 가능도(likelihood)가 최대가 되는 파라이터와 분포를 찾는 방식
      • Error가 Gaussian 일때, OLS와 (거의) 동일한 결과를 얻음
      • Gaussian을 넘어 다양한 분포의 데이터에 적절히 대응 가능
  2. 파라미터 추정값의 불확실성(uncertainty)을 추정

    • 파라이터 추정값의 불확실성
    • 예측값의 불확실성
  3. 예측의 정확성(accuracy)을 평가

    • 예측값과 실제값의 차이를 나타내는 지표들: RMSE, MAE, R-squared, AIC, BIC
    • 전통적 접근: 표본에서 얻은 결과를 모집단에 대해 이론적으로 보정; 모집단에서는 정확도가 낮아질 것임.
    • 현대적 접근: 데이터를 training/test set으로 나누어서 test set으로 모형을 평가

새로운 클래스(형태)의 a family of models을 구성해서 위를 반복하면, 여러 다른 모델들을 비교할 수 있음