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
'Data Diary' 카테고리의 다른 글
2021-06-22(R 데이터 분석_6(랜덤포레스트)& 태양열예측25) (2) | 2021.06.22 |
---|---|
2021-06-21(R 데이터 분석_5(나이브베이즈)& 태양열예측24) (0) | 2021.06.21 |
2021-06-16(R 데이터 분석_3(머신러닝_개요)& 태양열 예측23) (0) | 2021.06.16 |
2021-06-15(R 데이터 분석_3(가설검정)) (0) | 2021.06.15 |
2021-06-14(R 데이터 분석_2(시각화,전처리 기본기) & 태양열 예측22) (0) | 2021.06.14 |