일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 빅데이터분석
- Dense_Rank
- Intersect
- %in%
- 그래프 생성 문법
- 데이터분석가
- loop 문
- 회귀분석
- 불순도제거
- max
- 막대그래프
- count
- 순위출력
- Sum
- 데이터분석
- 회귀분석 알고리즘
- 정보획득량
- 팀스파르타
- difftime
- merge
- 여러 데이터 검색
- sqld
- 그래프시각화
- 빅데이터
- 단순회귀 분석
- sql
- if문 작성법
- 히스토그램 그리기
- 상관관계
- 총과 카드만들기
- Today
- Total
ch0nny_log
[빅데이터분석] R _ 64. 로지스틱 회귀분석 본문
1. 단순회귀 --> 2. 다중회귀 --> 3. 회귀트리 --> 4. 로지스틱 회귀 (p326)
↓ ↓
공분산/분산-> 기울기 행렬 연산을 이용한 회귀계수
출처: https://cafe.daum.net/oracleoracle/Sotv/707
+ 이상치와 노이즈에 취약함
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 데이터를 훈련과 테스트를 나눠서 로지스틱 회귀 모델을 생성하시오.
- 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
'빅데이터 분석(with 아이티윌) > R' 카테고리의 다른 글
[빅데이터분석] R _ 66. 신경망 (6) | 2024.07.24 |
---|---|
[빅데이터분석] R _ 65. 서포트 벡터 머신 (2) | 2024.07.23 |
[빅데이터분석] R _ 63. 회귀트리와 모델트리 (0) | 2024.07.18 |
[빅데이터분석] R _ 62. 훈련과 테스트를 분리한 다중 회귀 모델 (0) | 2024.07.18 |
[빅데이터분석] R _ 61. 다중 공선성 (0) | 2024.07.18 |