하고 싶은 건 하면 되지

[R] 사후 확률(Posterior Probability) 계산 본문

Data Science/Statistics

[R] 사후 확률(Posterior Probability) 계산

우주선 주인장 2023. 9. 30. 22:53

ISLR 5.4 Exercises 5번 문제를 풀다가 마주친 개념이다.

 

문제

Obtain a prediction of default status for each individual in the validation set by computing the posterior probability of default for that individual, and classifying the individual to the default category if the posterior probability is greater than 0.5.

validation set의 각 개인에 대한 default 사후 확률을 계산하고 사후 확률이 0.5보다 큰 경우 해당 개인을 default 카테고리로 분류하여 default 상태 예측을 구한다.

 

validation set 를 앞 문제에서 만들었기 때문에 모델을 이용해서 default 확률을 구하란 소리인 거 같은데

정확하게 사후 확률의 개념이 무엇인지 궁금해졌다.

 

 

사후 확률이란?

사후 확률은 베이즈 정리와 관련이 있다.

https://seeve.medium.com/machine-learning-bayes-theorem-2f48c33d51e5

 

Posterior

관측 값(B)이 주어졌을 때, 구하고자 하는 대상(A)이 나올 확률
- 사전 정보와 관측된 데이터를 모두 고려하여 어떤 사건 또는 상황이 발생할 확률

- 로지스틱 회귀 모델을 사용하면 각 개인의 사후 확률은 초기 사전 확률(ex. default할 초기 추정 확률)을 데이터(ex. income, balance)를 사용하여 업데이트한 확률

 

Likelihood

구하고자 하는 대상(A)이 정해졌다고 가정할 때, 주어진 대상(B)이 나올 확률

 

Prior

구하고자 하는 대상(A) 자체에 대한 확률
- 어떤 사건 또는 상황이 발생할 가능성에 대한 초기 믿음

 

(참고: https://aimaster.tistory.com/79)

 


대충 정리해보자면..

베이즈 정리 공식에 대해서는 자세히 이해하기 어렵지만

정리하면 이 문제에서 '사후 확률'을 언급하는 이유는

학습된 모델을 이용해서 default 확률을 예측하기 때문에 '사후 확률'이라고 부른다고 볼 수 있을 것 같다.

 

R 에서 사후 확률을 예측하는 방법은?

probs <- predict(fit.glm, newdata = Default[-train, ], type = 'response')
pred.glm <- rep('No', length(probs))
pred.glm[probs > 0.5] <- 'Yes'

predict 를 쓰면 예측을 할 수 있다.

  • predict(fit.glm, newdata = Default[-train, ], type = 'response')
    - fit.glm 모델을 사용한다.
    - 데이터는 Default에서 train 을 제외한 데이터를 사용했다. (validation set 을 사용하기 위함)
    - type 은 response 로 예측 결과를 확률로 반환하라는 뜻이다. 대부분 확률을 쓰지만 다른 옵션을 쓸 수도 있다.
       ㄴ link: 선형 예측 값(링크 함수의 결과)을 반환한다. 로지스틱 회귀의 경우 logit 값이 반환된다.
       ㄴ terms: 예측에 사용도니 각 설명 변수의 값과 모델의 계수를 반환한다.
       ㄴ class: 분류 문제에서 사용하며 이진 분류일 때 클래스 레이블(Yes 혹은 No)을 반환한다.
       ㄴ raw: 예측 결과를 모델이 내부적으로 사용하는 형식으로 반환한다. 일반적으로 이 형식은 사용자에게 직접적인 의미가 없다.
  • pred.glm <- rep('No', length(probs))
    - rep() 함수는 주어진 값을 반복하여 벡터를 생성하라는 뜻이다.
       ㄴ 여기서는 probs 의 길이, 원소의 개수를 구하고, 그만큼 No 를 반복하라는 뜻이다.
       ㄴ 문제에 따라서 0.5 가 넘는 경우에만 Yes 를 설정하기 위해 디폴트로 No 를 넣어주는 작업이다.
  • pred.glm[probs > 0.5] <- 'Yes'
    - probs 가 0.5 초과인 경우에 Yes 를 채워넣어준다.