No Story, No Ecstasy

[ADP 실기 with R] 5. 분류 분석 (1) : Logistic Regression, Decision Tree, Naive Bayesian, kNN, SVM, LDA 본문

Data Science Series

[ADP 실기 with R] 5. 분류 분석 (1) : Logistic Regression, Decision Tree, Naive Bayesian, kNN, SVM, LDA

heave_17 2020. 12. 12. 17:18

https://images.app.goo.gl/AcCyCczc9nsKbEB66

 

1. Logistic Regression (로지스틱 회귀분석)

  - 종속 변수가 범주형(category, factor)인 (주로 binomial인) 경우에 적용되는 로지스틱 함수를 활용한 기법

  - 종속 변수의 각 레벨이 속할 확률을 추정하여, 기준치에 따라 분류한다.

  - 최대 우도 추정법을 활용하여 모델의 계수를 추정한다.

  - 종속 변수의 레벨이 3개 이상인 경우에는 Multinomial Logistic Regression을 적용하면 된다.

    - 링크 1: datasciencebeginners.com/2018/12/20/multinomial-logistic-regression-using-r/

 

Multinomial Logistic Regression Using R | Data Science Beginners

Multinomial regression is an extension of binomial logistic regression. The algorithm allows us to predict a categorical dependent variable which has more than two levels. Like any other regression model, the multinomial output can be predicted using one o

datasciencebeginners.com

    - 링크 2: stats.idre.ucla.edu/r/dae/multinomial-logistic-regression/

 

Multinomial Logistic Regression | R Data Analysis Examples

 

stats.idre.ucla.edu

  - R 코드 예제

# 0. 별도의 package import 필요 없음

# 1. logistic model 생성
##  - binomial and quasi families: the response can also be specified as a factor (when the first level denotes failure and all others success)
##  - other families: gaussian, poisson, inverse.gaussian, gamma
glm.model = glm(y~1, train_data, family="binomial") 

# 2. step 함수를 활용하여 최적(최소 AIC를 만족하는) 방정식 결정
##  - direction = both, forward, backward 중 선택 (forward, both는 lower부터 시작 / backward는 upper부터 시작)
step.model = step(glm.model,
		  scope = list(lower =~ 1,
          		       upper =~ x1 + x2 + ... + xn),
                  direction = "both")

# 3. 최적 방정식과 test_data를 활용하여 모델 평가
##  - type = response (gives numerical result between 0 and 1), class (gives labelling result)
### - 관련 링크: https://stackoverflow.com/questions/23085096/type-parameter-of-the-predict-function
glm.predict = predict(step.model, test_data, type = "response")

# 4. 분류 결과 라벨링
glm.predict = as.data.frame(glm.predict)
glm.predict$class = ifelse(glm.predict$glm.predict <= 0.5, 0, 1)
glm.predict$class = as.factor(glm.predict$class)

 

2. Decision Tree (의사결정나무)

  - 독립 변수의 값에 따라 분기를 태워가며 최적의 분류 모델을 찾는 기법

  - 성장(growing), 가지치기(pruning)를 통해 모델을 생성한다.

    - 분리 기준: 카이제곱 통계량, 지니, 엔트로피 / 분산분석 F 통계량, 분산 감소량

    - 의사결정 알고리즘: CART (범주형: 지니 / 연속형: 분산 감소량), C4.5/5.0 (엔트로피), CHAID (카이제곱 통계량)

    - 정지 기준: maxdepth, minsplit 등

  - R 코드 예제

# 0. 필요 package import
library(rpart) # CART 알고리즘 활용
library(rpart.plot)

# 1. 모델 생성
##  - method: class(분류에 활용), anova, poisson, exp
dt.model = rpart(y~.,
   	  	 method = "class", 
                 train_data,
                 control = rpart.control(maxdepth = 5, minsplit = 15)
                 )

# 2. dt model plotting (https://www.rdocumentation.org/packages/rpart.plot/versions/3.0.9/topics/prp)
prp(dt.model, type = 4, extra = 2)

# 3. pruning을 위한 최적 cp 찾기
##  cp (cost-complexity parameter): 오류가 적으면서 단순한(terminal node 수가 적은) 모델일수록 작음
##  관련 링크: https://stats.stackexchange.com/a/300310
plotcp(dt.model)
opt = which.min(dt.model$cptable[,"xerror"])
opt_cp = dt.model$cptable[opt, "CP"]
pruned.model = prune(dt.model, cp = opt_cp)

# 4. 완성된 모델로 예측
##  - class type으로 예측하기 때문에 factor형 변환 작업이 필요 없음
dt.predict = predict(pruned.model, test_data, type="class")

 

3. Naive Bayesian Classification (나이브 베이지안)

  - (두 확률 변수의 사전 확률과 사후 확률 사이의 관계를 나타내는) 베이즈 정리가 기본이 됨

  - 사후확률 추정을 통해 데이터가 각 클래스에 속할 확률을 구하는 기법

    - 사전확률(prior), 우도(likelihood), 관찰값(evidence)을 활용해 사후확률(posterior)을 구한다.

  - 텍스트 분류, 토픽 모델링 등에 주로 활용된다.

  - R 코드 예제

# 0. 필요 package import
library(e1071)

# 1. 모델 생성
nb.model = naiveBayes(y~., train_data, laplace=0)

# 2. 완성된 모델로 예측
nb.predict = predict(nb.model, test_data, type="class")

 

4. kNN (K-NN, K-Nearest Neighbor)

  - 데이터의 클래스를 해당 데이터와 가장 가까운 k개 데이터들의 클래스로 결정하는 기법

  - train_data만 있으면 된다. (train data를 기반으로 분류를 수행하기 때문에 모델링이 필요 없다.)

    - 거리 척도: 유클리디안(L2), 맨하탄(L1)

    - k 조건: (1) 홀수 (동률이 나오면 안 됨), (2) 일반적으로 훈련데이터 개수의 제곱근으로 설정

  - R 코드 예제

# 0. 필요 package import
library(class)

# 1. 
results = numeric()

for (k_ in c(3:20)) {
	if (k_ %% 2 == 0) next
	knn.predict = knn(train_data, test_data, y, k = k_)
    knn.table = table(knn.predict$credit.rating)
    results[k_-2] = (knn.table[1,1] + knn.table[2,2])/sum(knn.table)
}
opt_k = which_min(results) + 2

knn.predict = knn(train_data, test_data, y, k = opt_k)

 

5. SVM (Support Vector Machine)

  - 데이터가 사상(분포)된 공간에서 데이터를 가장 큰 폭으로 분류하는 경계선을 찾는 기법

  - 공간에서 Margin을 최대화하는 Decision hyperline을 찾아 분류 및 회귀를 수행한다.

    - Decision hyperline: 데이터를 나누는(분류하는) 초평면

    - Support vector: 초평면에 가장 가까운 데이터들

    - Margin: 초평면과 서포트 벡터 간 거리

  - R 코드 예제

# 0. 필요 package import
library(e1071)

# 1. SVM 모델 생성
##  - kernel: Used in training and predicting (linear, polynomial, radial basis, sigmoid)
##  - cost: Cost of constraints violation (‘C’-constant of the regularization term in the Lagrange formulation)
##  - scale: A logical vector indicating the variables to be scaled.
svm.model = svm(y ~ ., train_data, kernel = "linear", cost = 1, scale = F)

# 2. 최적 파라미터 찾기 (튜닝)
tuned.model = tune(svm.model, x, y, kernel="linear",
	   	   ranges = list(cost = 10^(-1:2),
                   		 gamma = c(0.5, 1, 2)))
                   
# 3. 예측하기
svm.predict = predict(tuned.model, test_data)

 

6. LDA (Linear Discriminant Analysis, 선형 판별 분석)

  - 종속 변수의 class를 가장 잘 분류할 수 있는 독립 변수들의 선형 결합을 찾는 기법

  - R 코드 예제

# 0. 필요 package import
library(e1071)

# 1. LDA 모델 생성
lda.model = lda(y ~ x1 + x2 + ... + xn, train_data)
                   
# 2. 예측하기
lda.predict = predict(lda.model, test_data)