모형비교 :: 통계 - mindscale
Skip to content

모형비교

과대적합

만약에 주사위를 10번 던져서 1이 5번 나왔다고 했을 때, 이 주사위에서 1이 나올 확률은 50%라고 할 수 있을까요? 좀 지나치게 과도한 주장이라는 생각이 들죠? 아마 다음 번에도 10번 던져서 1이 5번 나올 거라고 장담하기는 어려울 겁니다. 이런 식으로 특정한 표본에 지나치게 맞춰서 추정을 하는 것을 과대적합(overfitting)이라고 합니다. 우리가 잘 아는 표현 중에 "성급한 일반화"와 비슷한 뜻입니다.

회귀분석에서 우리가 사용하는 최소제곱법은 과대적합이 생기기 쉽습니다. 왜냐하면 표본에서 잔차를 최소화하기 때문입니다. 만약 우리가 분석에 아무 관련이 없는 변수를 추가한다고 해봅시다. 최소제곱법의 특성상 잔차는 줄어들면 들었지 절대로 늘어날 수는 없습니다. 적합도 지수인 R제곱도 항상 늘어나게 됩니다.

이것이 무슨 뜻이냐하면, 종속변수와 전혀 관련이 없는 독립변수를 추가해도 R제곱이 좋아지는 것처럼 보인다는 것입니다. 그러면 온갖 쓸데 없는 변수들을 추가하게 되고, 따라서 과대적합은 더 심해지게 됩니다. 결과적으로 예측력은 더 떨어지게 됩니다.

무작위적으로 만든 데이터라도 독립변수만 많으면 R제곱이 100%에 가깝게 됩니다. 그거는 다 과적합의 의한 일종의 허상인 거죠.

존재하지 않는 거에서 억지로 패턴을 찾으니까 생겨나는 허상이고 실제로 우리가 그걸 가지고 예측을 하면은 하나도 안 맞게 됩니다.

Question

회귀분석에서 독립변수가 많을 수록 R제곱은 어떻게 됩니까?

  • 높아진다
  • 낮아진다

모형 선택

회귀분석에서 우리는 다양한 모형을 만들 수 있습니다. 이런 여러 가지 모형 중에 어떤 모형을 고를 것인가? 이것이 모형 선택(model selection) 문제입니다.

우리에게 무수히 많은 데이터가 있다면 그냥 R제곱이 가장 좋은 모형을 고르면 됩니다. 왜냐하면 표본의 크기가 커지면, 점점 모집단에 가까워지기 때문에 과대적합 문제가 없습니다.

데이터가 좀 적당히 많다고 하면 교차 검증(cross validation)을 시도해볼 수 있습니다.

데이터가 적다면 여러 가지 지표를 사용해봅니다. 이런 지표에는 수정 R제곱, AIC, BIC 등이 있습니다.

수정 R제곱(adjusted R-squared)은 말 그대로 R제곱을 수정한 것입니다. 따라서 높을 수록 좋은 지표입니다.

$$ 1 - \frac{(1-R^2)(N-1)}{N-p-1} $$

  • $N$: 표본의 크기
  • $p$: 독립변수의 개수

위의 식에서 다른 값이 다 똑같다고 할 때, 독립변수의 개수 $p$가 커지면 전체 값은 작아집니다.

Question

모형을 수정R제곱으로 비교할 때, 어떤 모형이 더 데이터를 잘 설명하는 모형입니까?

  • 수정 R제곱이 높은 모형
  • 수정 R제곱이 낮은 모형

AIC(Akaike Information Criterion)BIC(Bayesian Information Criterion)은 잔차제곱합을 수정한 지표입니다. 이 두 가지는 낮을 수록 좋습니다.

대체로 수정R제곱보다 AIC, AIC보다 BIC가 더 엄격한 지표입니다. 즉, 과대적합을 막는다는 목적에서 보면 BIC가 가장 좋은 지표라고 할 수 있습니다. 반대로 보면 BIC는 과소적합(underfitting)을 초래할 수 도 있습니다. 데이터가 충분히 많고, 실제 데이터 패턴이 좀 복잡할 것이라고 가정할 수 있으면 AIC를 쓰는 것이 더 나을 수 있습니다. 수록 줄어들지는 않고 무조건 증가하는 추세 - 설명력이 떨어지는 변수를 추가해도 결정 계수는 증가하게 됨 - 따라서 결정 계수가 높은 모형을 고른다면 변수가 많이 들어간 모형을 고르게 되는 잘못된 판단을 할 수도 있음

Question

모형을 AIC로 비교할 때, 어떤 모형이 더 데이터를 잘 설명하는 모형입니까?

  • AIC가 높은 모형
  • AIC가 낮은 모형

Question

모형을 BIC로 비교할 때, 어떤 모형이 더 데이터를 잘 설명하는 모형입니까?

  • BIC가 높은 모형
  • BIC가 낮은 모형

Question

독립변수의 개수가 다른 모형들을 비교할 때 사용할 수 없는 적합도지수는?

  • R제곱
  • 수정 R제곱
  • AIC
  • BIC

Python에서는 회귀분석 결과에 수정 R제곱, AIC, BIC를 모두 제공합니다.

R에서는 회귀분석 결과에 수정 R제곱만 보여줍니다. AIC, BIC는 별도로 계산합니다.

AIC(m)
BIC(m)

Question

중고차 데이터에서 다음 두 모형을 비교해보세요.

모형 1: price ~ mileage + year + model + my_car_damage

모형 2: price ~ mileage + year + model + my_car_damage + other_car_damage

적합도 지수를 사용하여 비교할 때 어떤 모형이 더 낫다고 할 수 있습니까?

  • 모형 1
  • 모형 2
  • 결론 내릴 수 없다

Question

cement.xlsx를 다운받아 열어보세요.

변수 y는 시멘트가 굳을 때 발생하는 열을 나타냅니다. 변수 x1, x2, x3, x4는 시멘트의 특정 성분의 비율을 나타냅니다.

모형 1 y ~ x1 + x2 + x3 + x4로 다중회귀분석을 해보세요. 이때 수정 R제곱은 얼마입니까?

  • 0.982
  • 0.974

모형 1에서 x3을 제거한 모형 2 y ~ x1 + x2 + x4로 다중회귀분석을 해보세요. 이때 수정 R제곱은 얼마입니까?

  • 0.982
  • 0.976

수정 R제곱으로 비교하면 모형 1과 모형 2 중에 어느 쪽이 데이터에 더 잘 맞는 모형이라고 할 수 있습니까?

  • 모형 1
  • 모형 2

AIC로 비교하면 모형 1과 모형 2 중에 어느 쪽이 데이터에 더 잘 맞는 모형이라고 할 수 있습니까?

  • 모형 1
  • 모형 2

BIC로 비교하면 모형 1과 모형 2 중에 어느 쪽이 데이터에 더 잘 맞는 모형이라고 할 수 있습니까?

  • 모형 1
  • 모형 2

Question

bloodpress.xlsx를 다운받아 열어보세요.

변수 BP는 혈압을 나타냅니다. 변수 Age는 나이, Weight는 체중입니다.

모형 1 BP ~ Weight로 회귀분석을 해보세요. 이때 수정 R제곱은 얼마입니까?

  • 0.903
  • 0.897

모형 1에서 Age을 추가한 모형 2 BP ~ Weight + Age로 다중회귀분석을 해보세요. 이때 수정 R제곱은 얼마입니까?

  • 0.991
  • 0.99

수정 R제곱으로 비교하면 모형 1과 모형 2 중에 어느 쪽이 데이터에 더 잘 맞는 모형이라고 할 수 있습니까?

  • 모형 1
  • 모형 2

AIC로 비교하면 모형 1과 모형 2 중에 어느 쪽이 데이터에 더 잘 맞는 모형이라고 할 수 있습니까?

  • 모형 1
  • 모형 2

BIC로 비교하면 모형 1과 모형 2 중에 어느 쪽이 데이터에 더 잘 맞는 모형이라고 할 수 있습니까?

  • 모형 1
  • 모형 2

교차 검증

방금 모델을 선택할 때 지표를 이용해서 선택을 하는 방법을 알아보는데요. 이런 방법들은 전부 하나같이 이론적으로 보정을 하는 방법입니다. 문제는 이론이라는 것은 일정한 가정을 하는 것이기 때문에 우리가 뭐가 맞느냐라고 하면 대답하기 어려운 문제가 생겨요. 데이터가 충분히 많으면 교차검증이라는 방법을 쓸 수 있는데 교차검증은 어떻게 하냐면 데이터를 여러 번 나눠놓는 겁니다. 우리가 지금 하려고 하는 것은 예측을 잘 하려고 하는 거니까 미래의 데이터가 있어야 하는데 미래의 데이터는 말 그대로 미래나 나오는 거잖아요. 현재 가진 데이터를 반으로 잘라요. 그래서 가진 데이터 중에 한 쪽은 과거의 역할을 하게 하고 한 쪽은 미래의 역할을 하게 한 다음에 이것만 분석을 하는 겁니다. 그리고 한 쪽의 분석 결과를 다른 쪽에 적용해서 만약에 예측이 잘 된다면 우리가 분석을 잘 한 거죠. 만약에 예측이 잘 안 된다면 우리가 분석을 잘못한 거죠. 그래서 이런 식으로 교차검증하는 게 사실 데이터가 많을 때는 제일 좋은 방법입니다. 왜냐하면 실제로 예측을 해보는 거죠.

교차검증은 데이터를 쪼개는 방법에 따라 여러 가지로 나뉩니다.

LOOCV(Leave-one-out cross-validation)는 크기가 $N$인 표본에서 1개만 뺀 나머지 $N-1$개로 분석을 합니다. 그리고 빼둔 나머지 1개를 예측을 해봅니다. 이렇게 $N$번 반복하는 방법입니다. 데이터가 많아지면 분석을 너무 많이 돌려야 하는 단점이 있습니다.

k-fold 교차검증은 표본을 $k$ 개의 같은 크기의 세트로 나눠서 하는 방법입니다. 예를 들어 $k = 3$이면, 데이터를 A, B, C 세 세트로 나눕니다. 그러면 A, B를 합쳐서 분석하고 C를 예측해보고, B와 C를 합쳐서 분석하고 A를 예측하고 마지막으로 C와 A를 합쳐서 분석하고 B를 예측해봅니다.

holdout은 간단하게 데이터를 분석 세트와 테스트 세트로 나눕니다. 분석 세트로 분석을 하고, 테스트 세트로 예측을 해봅니다.

from sklearn.model_selection import train_test_split
train_df, test_df = train_test_split(  #  분할
df,               # 원자료
test_size=0.2,    # 테스트 데이터의 비율(0.2 = 20%)
random_state=42)  # 난수 생성의 seed를을 고정(동일한 분할을 위해)

m = ols(price ~ year, train_df).fit()  # 분석

y_pred = m.predict(test_df)  # 예측

from sklearn.metrics import mean_squared_error
mean_squared_error (test_df.price, y_ pred)  # 잔차 분산

R에서는 회귀분석 결과에 수정 R제곱만 보여줍니다. AIC, BIC는 별도로 계산합니다.

set.seed(42) # 난수 생성의 seed를을 고정(동일한 분할을 위해)
n = nrow(df) # 데이터의 행수
idx = sample(1:n, size=n*0.8)  # 80%를 무작위 선택
train_df = df[idx,]   # 선택된 80%를 분석용으로
test_df = df[-idx,]   # 나머지 20%를 테스트용으로

m = lm(price ~ year, train_df)  # 분석
y_pred = predict(test_df)  # 예측

mean((test_df$price - y_pred)^2)  # 잔차분산 계산