728x90

KNN

k가 3이라면 내 주변에 있는 A라는 집단의 포인트가 2개, B집단의 포인트가 1개가 있다면, A집단이 많으므로 해당 포인트는 A집단으로 분류가 됩니다. 만일 k가 10개 인데 B집단 포인트가 A보다 더 많다면 해당포인트는 B집단으로 분류가 됩니다. 이 내용을 R에서 어떻게 구현할지 실습을 했습니다. 실습 때 사용한 패키지는 caret입니다.

#dependencies = TRUE? : 다른 패키지와 연결이 되도록 하는 명령어(의존성이 있다) 
install.packages('caret', dependencies = TRUE)

##데이터 불러오기
library(caret)
rawdata <- read.csv(file='wine.csv', header=TRUE)
rawdata$Class <- as.factor(rawdata$Class) #Class를 숫자로 인식하지 않도록 factor를 이용
str(rawdata)
View(rawdata)

##데이터분할
analdata <- rawdata
set.seed(2020) #분할시 같은 랜덤이 나오게끔 설정
#sample(x,y): x중에 y만큼 뽑겠다
datatoal <- sort(sample(nrow(analdata),nrow(analdata)*0.7))
train <- rawdata[datatoal,]
test <- rawdata[-datatoal,] #-붙여서 0.7에 뽑힌게 아닌! 데이터를 가져온다

train_x <- train[,1:13]
train_y <- train[,14]

test_x <- test[,1:13]
test_y <- test[,14]

#모형학습
ctrl <- trainControl(method='repeatedcv', number=10,repeats = 5) #number: K-fold의 K(데이터를 10개로 나눈다, 반복횟수 5회
customGrid <- expand.grid(k=1:10) #knn은 1~10까지 보겠다(최 근전 1개 부터 10개까지)
knnFit <- train(Class~., #.은 모든 피쳐를 사용
          data=train,
          method='knn',
          trControl=ctrl, #traincontrol
          preProcess=c("center","scale"), #전처리는 표준화로 실행
          tuneGrid=customGrid,
          metric="Accuracy")
knnFit #출력물의 k은 Knn의 K이다

가장 높은 정확도를 보인 k=5라는 결과가 나왔습니다. 이 모델을 가지고 예측을 진행합니다

#예측하기
pred_test <- predict(knnFit, newdata=test)
confusionMatrix(pred_test, test$Class)

Confusion 매트릭스를 보면 틀린 포인트가 총 3개로 정확도 94%로 계산되었습니다. 

 

 

Logitstic

선혀회귀 방식을 분류에 적용한 알고리즘입니다. 간략하게 적어보자면, 선형은 구불거리지 않고 쭉 펼처진 직선 모양을 가집니다. 로지스틱은 직선의 형태가 아니라 시그모이드 형태를 적용합니다. 선형회귀는 만일 집값을 예측할때, A 집값 1억6천만원 과 같은 구체적인 값이 나옵니다. 반면 시그모이드를 취하면 확률이 나옵니다. 보통 0.5 기준으로 0과1로 치환하여 분류를 하게 되기 때문에 분류모형으로 사용될수 있습니다.

#데이터 불러오기
library(caret)
rawdata <- read.csv(file='heart.csv', header = TRUE)
str(rawdata)

#타켓 클래스 범주화
rawdata$target <- as.factor(rawdata$target)
unique(rawdata$target)

#연속형 독립변수의 표준화
rawdata$age <- scale(rawdata$age)
rawdata$trestbps <- scale(rawdata$trestbps)
rawdata$chol <- scale(rawdata$chol)
rawdata$thalach <- scale(rawdata$thalach)
rawdata$oldpeak <- scale(rawdata$oldpeak)
rawdata$slope <- scale(rawdata$slope)

#범주형 독립변수 as.factor : 명복변수를 factor로 만든다
newdata <- rawdata
factorVar <- c('sex','cp','fbs','restecg','exang','ca','thal')
newdata[,factorVar] = lapply(newdata[,factorVar],factor)

#데이터 분리
set.seed(2020)
datatotal <-  sort(sample(nrow(newdata),size=nrow(newdata)*0.7))
train <- newdata[datatotal,]
test <-  newdata[-datatoal,]

train_x <- train[,1:12]
train_y <- train[,13]

test_x <- test[,1:12]
test_y <- test[,13]

#모델설정
ctrl <- trainControl(method='repeatedcv',repeats = 5)
logitFit <- train(target~.,
                  data=train,
                  method="LogitBoost",
                  trControl=ctrl,
                  metric="Accuracy")
logitFit #21번 반복 학습 할때 가장 좋다. 즉 21번

#예측
pred_test <- predict(logitFit,newdata=test)

모델 결과
예측 결과

728x90

+ Recent posts