ch0nny_log

[빅데이터분석] R _ 64. 로지스틱 회귀분석 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 64. 로지스틱 회귀분석

chonny 2024. 7. 22. 16:41
 1. 단순회귀  -->     2. 다중회귀  -->    3. 회귀트리   -->    4. 로지스틱 회귀 (p326)
         ↓                       
공분산/분산-> 기울기     행렬 연산을 이용한 회귀계수

 

로지스틱회귀.pdf
2.32MB

 

로지스틱회귀2.pdf
1.32MB

 

 

 

출처: https://cafe.daum.net/oracleoracle/Sotv/707 

 

[로지스틱 회귀 이론 수업]

1. 로지스틱 회귀 이론 로지스틱회귀.pdf2.32MB로지스틱회귀2.pdf1.32MB시그모이드 함수와 로지스틱 회귀의 오차 함수(로그 손실 함수)는 긴밀한 관계를 가지고 있습니다.1. 시그모이드 함수의 출력

cafe.daum.net

 

 

+ 이상치와 노이즈에 취약함 

 

 

 

 

 

 

 

1.로그승산값

-> 베타 값을 구해야함

2. 시그모이드 함수 (확률 구하기)

3. 오차함수(정답과 확률을 넣어서 오차를 구함)

-> 오차가 작을 수록 좋음

 

4. 오차를 최소화 시키는 경사하강법을 구함

 

편미분 설명 그래프

# 필요한 패키지 설치 및 로드
install.packages("plotly")
library(plotly)

# 손실 함수 정의 (예시: 단순한 이차 함수)
loss_function <- function(beta0, beta1, beta2) {
  beta0^2 + beta1^2 + beta2^2
}

# 회귀 계수 범위 설정
beta0_range <- seq(-10, 10, length.out = 50)
beta1_range <- seq(-10, 10, length.out = 50)
beta2 <- 5 # 고정된 beta2 값

# 손실 함수 값 계산
z <- outer(beta0_range, beta1_range, function(x, y) loss_function(x, y, beta2))

# 3차원 그래프 생성
p <- plot_ly(x = ~beta0_range, y = ~beta1_range, z = ~z, type = 'surface')

# 그래프 표시
p

 

 


■ 실습

 

# R 내장 데이터셋 'mtcars'를 사용
data(mtcars)

# 데이터 확인
head(mtcars)

# 로지스틱 회귀 모델 생성
model <- glm(am ~ mpg + wt + hp, data = mtcars, family = binomial)

# 모델 요약
summary(model)

# 모델 계수 해석
coef(model)

# 예측값 계산
predicted_probabilities <- predict(model, type = "response")

# 예측값 확인
head(predicted_probabilities)

# 예측값을 바탕으로 실제 클래스를 예측
predicted_classes <- ifelse(predicted_probabilities > 0.5, 1, 0)

# 혼동 행렬(confusion matrix) 계산
table(Predicted = predicted_classes, Actual = mtcars$am)

# 모델 성능 평가 (정확도 계산)
accuracy <- mean(predicted_classes == mtcars$am)
accuracy

 

※ 데이터 & 코드 설명

- 32종의 자동차의 속성(자동차 연비와 성능관련 정보들)을 포함 

- 종속변수: am (변속기 형태= 0: automatic, 1: manual) 

- mpg (연비)  / wt(차량무게) / hp(마력) 

- 10개의 독립변수중 3개만 가지고 로지스틱 회귀모델을 생성하고 있음 ( 독립변수가 많으면 모델의 복잡도가 증가하므로 복잡도를 높이지 않으려고 처음부터 독립변수 갯수를 작게 넣음)

- family= binomial   --> 로지스틱 회귀모델을 사용하겠음 (옵션: gaussian, poisson, Gamma)

 

※ 독립변수 포함시켜서 모델 생성하는 방법?

- 처음부터 모든 독립변수를 다 넣고 모델을 만든다음 불필요한 변수를 빼는 방식

   --> 단계적 제거(backward elimination)

- 처음부터 조금씩 독립변수를 추가하면서 모델의 성능을 확인하며 추가하는 방식

   --> 단계적 추가(forward selection)

 

 

 

wt 변수만이 통계적으로 유의한 변수로 나옴

 

y=-15.72137053 +1.22930209*1  -6.95492382  *2  + 0.08389345 *3

 

예측확률이 0.5보다 크면 1, 아니면 0으로 데이터 생성

93% 의 정확도가 나옴 (성능을 올려야됨)

 

■ 모델의 성능 올리기

- knn의 k의 값을 지정하는 것과 같은 하이퍼 파라미터가 없음

- 독립변수의 갯수를 늘려서 성능을 높이는 방법을 사용해야됨

 

# 모델 성능 올리기
model2 <-  glm(am ~ mpg + wt + hp + cyl + drat + vs + gear +carb, 
               data=mtcars,  family = binomial)

# 모델 요약
summary(model2)

# 모델 계수 해석
coef(model2)

# 예측값 계산
predicted_probabilities2 <- predict(model2, type = "response")

# 예측값 확인
head(predicted_probabilities2)

# 예측값을 바탕으로 실제 클래스를 예측
predicted_classes2 <- ifelse(predicted_probabilities2 > 0.5, 1, 0)

# 혼동 행렬(confusion matrix) 계산
table(Predicted = predicted_classes2, Actual = mtcars$am)

# 모델 성능 평가 (정확도 계산)
accuracy2 <- mean(predicted_classes2 == mtcars$am)
accuracy2

-> 정확도가 100%로 출력됨

 

※ 로지스틱 회귀의 단점

1) 모델의 복잡도가 증가함

2) 이상치와 노이즈 데이터에 민감함

 

※ 소프트 벡터머신 or 랜덤포레스트 모델 (로지스틱 회귀의 단점을 극복하여 정확도를 올림)

 

문제 1. 독립변수를 딱 3개만 가지고 종속변수를 예측하는 모델을 생성하는데 랜덤 포레스트 모델로 생성해서 훈련데이터의 정확도를 예측하시오.
# 모델 생성
library(randomForest) 
set.seed(123)
model_rf <- randomForest( as.factor(am) ~ mpg + wt + hp, data=mtcars, ntree=?)

# 예측값 계산
result <- predict(model_rf, mtcars )

# 예측값 확인
head(result)

# 혼동 행렬(confusion matrix) 계산
table(Predicted = result, Actual = mtcars$am)

# 모델 성능 평가 (정확도 계산)
accuracy <- mean(result == mtcars$am)
accuracy​

-> 정확도 100%
문제2 binary 데이터를 훈련과 테스트를 나눠서 로지스틱 회귀 모델을 생성하시오.
binary.csv
0.01MB



- admit  종속변수(0: 불합격, 1: 합격) / gpa , rank  독립변수 
#구현 순서
#1. 데이터를 불러옵니다.
mydata <- read.csv("c:\\data\\binary.csv", header=T)
head(mydata)

#2. 훈련과 테스틀 8대 2로 나눕니다.
library(caret)
set.seed(123)
k <-  createDataPartition(mydata$admit, p=0.8, list=FALSE)
train_data <- mydata[  k  ,   ]
test_data <- mydata[ -k  ,    ] 
nrow(train_data)   # 320
nrow(test_data)    # 80

#3. 로지스틱 회귀 모델을 생성합니다.
model <- glm( admit ~  gpa + rank,  data= train_data, family=binomial)
summary(model)
coef(model)

#4. 모델을 평가합니다. 
## 훈련 데이터 예측
train_pred <- predict(model, train_data,type ='response')
train_pred_class <- ifelse(train_pred >0.5 ,1,0)
head(train_pred_class)

## 테스트 데이터 예측
test_pred <- predict(model, test_data, type ='response')
test_pred_class <- ifelse(test_pred > 0.5,1,0)
test_pred_class

## 정확도 확인
train_accuracy <- mean( train_pred_class == train_data$admit )
test_accuracy <-  mean( test_pred_class == test_data$admit) 

train_accuracy #0.728125
test_accuracy  #0.7125


★ 마지막 문제. 오전 수학문제의 로지스틱 회귀모델을 생성하고 가장 좋은 베타 0,1,2를 출력해서 로그 승산값(log odds) 함수식을 구현하시오.
# 데이터 생성
data <- data.frame(
  annual_income = c(40000, 50000, 45000, 60000, 30000, 70000),
  credit_score = c(650, 700, 600, 750, 550, 800),
  default = c(0, 0, 1, 0, 1, 0)
)
print(data)

# 로지스틱 회귀 모델 생성
model <- glm(default ~ annual_income + credit_score, data = data, family = binomial)
summary(model)

# 새로운 데이터 포인트 예측
new_data <- data.frame(annual_income = 48000, credit_score = 680)
prob <- predict(model, newdata = new_data, type = 'response')
prob


따라서 근사치 0