-
R 기초 26 - 로지스틱 회귀분석(Logistic Regression), underfitting 과 overfitting, train / test split, ROC curveR 2022. 10. 27. 11:11
데이터를 두 개의 그룹으로 분류하는 문제에서 가장 기본적인 방법은 로지스틱 회귀분석이다.
왼쪽이 지금까지 배운 선형회귀로(직선)이다. 로지스틱 회귀분석은 오른 쪽 그래프처럼 곡선으로 표시하기 위해 사용한다.
underfitting 과 overfitting
- 왼쪽은 지나친 단순화로 인해 에러가 많이 발생해 underfitting이라 합니다.
- 오른쪽은 너무 정확하게 표현한 나머지 training data에 대한 정확도는 좋지만 실제 test에서는 에러가 날 수 있는 상황이라 overfitting이라 합니다.
모델은 과대적합(Overfitting)과 과소적합(Underfitting)이 발생하지 않도록 설계하는 것이 중요합니다.
출처: https://22-22.tistory.com/35 [used to deeplearn:티스토리]
Logistic 방법(전통적인 방법)
# Logistic Regression : 독립변수 x(연속형)와 종속변속 y(범주형)를 사용해 결과를 범주로 분류분석함 # 분석 결과가 베르누이(동전 앞면, 뒷면 두 가지의 확률) 확률분포(이항분보)를 따름 # 분석 최종결과값에 시그모이드 함수를 사용하여 0 ~ 1 사이의 실수화 한 후 0.5를 기준으로 0, 1로 분류 getwd() # 경로를 불러온다. setwd("C:/work/rsou/pro1") # 경로를 직접 입력 mydata <- read.csv("testdata/binary.csv") head(mydata,3) dim(mydata) # 400행 4열 unique(mydata$admit) # admit 값으로 무엇이 있는지 확인 0 1 summary(mydata) table(mydata$admit, mydata$rank) # 표 작성 함수 1번째 xtabs(formula = ~admit + rank, data = mydata) # 표 작성 함수 2번째 # train / test split (7 : 3 or 8: 2) set.seed(1) # 데이터를 랜덤하게 호출 idx <- sample(1:nrow(mydata), nrow(mydata) * 0.7) length(idx) # 400행 중에 70%인 280행만 호출 idx train <- mydata[idx, ] # 모델 학습용 dataset test <- mydata[-idx, ] # 모델 검정용 dataset, idx를 뺀 나머지 120 행 dim(train) # 280 4 dim(test) # 120 4 head(train, 5) head(test, 5) # 모델 작성 lgmodel <- glm(formula = admit ~ ., data = train, family = binomial(link = 'logit')) # binomial함수는 이항일 때만 들어온다. lgmodel anova(lgmodel) # 집단의 평균의 차이를 구한다. summary(lgmodel) # 분류 예측으로 모델 검정 pred <- predict(lgmodel, newdata = test, type = 'response') pred # 0.5 이상이면 합격!, 0.5 미만이면 불합격 head(ifelse(pred > 0.5, 1, 0), 10) head(test$admit, 10) # 모델의 분류 정확도 확인 result_pred <- ifelse(pred > 0.5, 1, 0) t <- table(result_pred, test$admit) t # 정확확률 확인 방법 3가지 (77 + 11) / nrow(test) # accuracy(분류 정확도) (t[1,1] + t[2,2]) / nrow(test) sum(diag(t)) / nrow(test) # 새로운 값으로 분류 newdata <- train[c(1:3), ] newdata <- edit(newdata) newdata new_pred <- predict(lgmodel, newdata = newdata, type = 'response') new_pred ifelse(new_pred > 0.5, '합격', '불합격')
train / test split으로 70%나 80%의 data를 학습시키고 30%나 20%를 검정용으로 사용한다. 앞서 말한 비율 정도로 주어도 된다. 100퍼센트를 주지 않는 이유는 train 데이터를 100% 학습시킨 후 test 데이터에 모델을 적용했을 때 성능이 생각보다 않 나오는 경우가 많기 때문이다.
물론 예측값과 실제값이 다를 확률도 있다.
ROC couve
ROC curve - 공돌이의 수학정리노트
angeloyeo.github.io
'R' 카테고리의 다른 글
R 기초 28 - Decision Tree(의사결정나무) (0) 2022.10.27 R 기초 27 - 로지스틱 회귀분석(Logistic Regression) 예제 (0) 2022.10.27 R 기초 25 - 단순/다중 선형회귀 모델 정리 (0) 2022.10.26 R 기초 24 - AIC 통계량, stepwise regression, backward(후진소거법), forward(전진선택법), both(단계적 방법), 회귀모델 체크 사항 (0) 2022.10.26 R 기초 23 - 다중회귀분석 (독립변수가 복수), 선형회귀분석의 기존 가정 충족 조건 검정 (0) 2022.10.26