reference: https://rafalab.github.io/dsbook/

1 복습 step1

이분형 outcome에 대해서는 민감도, 특이도, 정확도, F_1 값을 통해 모델을 개발하고, 연속형 outcome에 대해서는 RMSE를 이용한다. caret package의 confusionMatrix를 이용하면 쉽다. https://jinhaslab.wixsite.com/jinhaslab/

2 조건부 확률 및 기대값

2.1 conditional probabilities

X1가 어떤 특정한 값 (x1)일때, \(\mathbf{Y}=k\)일 확률을 \(p_k(X)\) 라고하면, \[\mbox{Pr}(Y=k \mid X_1 = x_1,\dots,X_p=x_p), \, \mbox{for}\,k=1,\dots,K\] 라고 볼수 있고 이때 \(p_k(\mathbf{X})\)를 최대 값으로 할 수 있는 모델을 찾는 과정이다. 즉, \[\hat{Y}=\max_k\hat{p}_k(\mathbf{x})\] ## conditional expectatons 이분형 자료에서 \(P_r(Y=1|X=x)\)mean(Y==TRUE) or mean(Y==1)라는 R code로 나타내 진다.

hat_Y<-c(1, 1, 1, 0, 0, 0, 0, 0)
hat_Y==1
## [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
mean(hat_Y==1)
## [1] 0.375

\(\hat{Y}\) 가 1일 확률은 0.375입니다.

3 예제 (2와 7 구별하기)

여기까지의 내용을 실습해 보자. 실습 주제는 숫자 2와 7을 구별해 보는 것이다.

library(tidyverse)
library(dslabs)
data("mnist_27")

2와 7을 구별하기 위한 요소를 상상해 보자. 이를 feature라고 하고 우선 2가지 요소가 있다고 보자. 예를 들어 256*256 모눈종이 위에 검게 칠해진 부분에 대한 패턴을 2개 찾았다고 하자, x_1, x_2이다.

mnist_27$train %>% ggplot(aes(x_1, x_2, color=y))+geom_point()+theme_bw()

2와 7에 따라 어떤 특정한 규칙이 존재 해 보인다.

7을 예측하는 모델을 x_1, x_2를 이용해 만들어보자. linear regression model을 상상해보자. \[p(x_1, x_2) = \mbox{Pr}(Y=1 \mid X_1=x_1 , X_2 = x_2) = \beta_0 + \beta_1 x_1 + \beta_2 x_2\]

이것을 R code로 나타내면,

fit <-mnist_27$train %>%
  mutate(y=ifelse(y==7, 1, 0)) %>%
  lm(y ~ x_1 +x_2, data=.)

fit 모델을 이용해서 prediction, \(\hat{Y}\) 를 구하고, 둘의 일치 확률을 구해보자.

library(caret)
p_hat <-predict(fit, newdata=mnist_27$test) # test 데이터를 통한 fit model 적용
y_hat <-factor(ifelse(p_hat >0.5, 7, 2))
confusionMatrix(y_hat, mnist_27$test$y)$overall
##       Accuracy          Kappa  AccuracyLower  AccuracyUpper   AccuracyNull 
##   7.500000e-01   4.975884e-01   6.840372e-01   8.083928e-01   5.300000e-01 
## AccuracyPValue  McnemarPValue 
##   1.265765e-10   8.875371e-01

정확도가 75%가 나왔다. 이것은 간단한 연습이고 실제 확률 값은 mnist_27$true_p에 이미 저장해 놓았다. 이를 그림으로 나타내보면서 상상해 보자.

mnist_27$true_p %>% ggplot(aes(x_1, x_2, z = p, fill = p)) +
  geom_raster() +
  scale_fill_gradientn(colors=c("#F8766D", "white", "#00BFC4")) +
  stat_contour(breaks=c(0.5), color="black")

이제 많이 왔다. 다음 부터는 몇가지 방법론을 응용해서 Accuracy를 증가 시켜보자.