일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 최적화
- 쿠버네티스
- ADP 실기
- 리액트
- 클러스터링
- frontend
- 심층신경망
- LDA
- 타입스크립트
- 대감집
- bigquery
- do it
- python
- 파이썬
- 대감집 체험기
- Kubernetes
- Machine Learning
- 캐글
- DBSCAN
- React
- 구글
- 차원 축소
- TooBigToInnovate
- r
- 프론트엔드
- 빅쿼리
- ADP
- docker
- 머신러닝
- Kaggle
- Today
- Total
No Story, No Ecstasy
[ADP 실기 with R] 5. 분류 분석 (1) : Logistic Regression, Decision Tree, Naive Bayesian, kNN, SVM, LDA 본문
[ADP 실기 with R] 5. 분류 분석 (1) : Logistic Regression, Decision Tree, Naive Bayesian, kNN, SVM, LDA
heave_17 2020. 12. 12. 17:18
1. Logistic Regression (로지스틱 회귀분석)
- 종속 변수가 범주형(category, factor)인 (주로 binomial인) 경우에 적용되는 로지스틱 함수를 활용한 기법
- 종속 변수의 각 레벨이 속할 확률을 추정하여, 기준치에 따라 분류한다.
- 최대 우도 추정법을 활용하여 모델의 계수를 추정한다.
- 종속 변수의 레벨이 3개 이상인 경우에는 Multinomial Logistic Regression을 적용하면 된다.
- 링크 1: datasciencebeginners.com/2018/12/20/multinomial-logistic-regression-using-r/
- 링크 2: stats.idre.ucla.edu/r/dae/multinomial-logistic-regression/
- 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)