71 R로 서포트 벡터 머신 모델 만들기 - p.357
- iris 품종을 분류하는 서포트벡터 머신 모델 만들기
#1. 데이터 로드
#2. 결측치 확인
#3. 정규화 진행
#4. 훈련데이터와 테스트 데이터 분리
#5. 모델 생성
#6. 모델 훈련
#7. 모델 예측
#8. 모델 성능 개선
#1. 데이터 로드
iris <- read.csv("c:\\data\\iris2.csv", stringsAsFactors = T)
head(iris)
str(iris)
#2. 결측치 확인
colSums(is.na(iris))
#3. 정규화 진행
normalize <- function(x){ return( (x-min(x)) / (max(x) - min(x)) )}
iris_norm <- as.data.frame(lapply(iris[,-5], normalize))
summary(iris_norm)
iris_scaled <- cbind(iris_norm, Species = iris[,5]) # label 5번 컬럼
head(iris_scaled)
#4. 훈련데이터와 테스트 데이터 분리
library(caret)
set.seed(1)
k <- createDataPartition(iris_scaled$Species, p = 0.9, list = F)
train_data <- iris_scaled[k,]
test_data <- iris_scaled[-k,]
nrow(train_data) #135
nrow(test_data) #15
#5. 모델 생성
library(e1071)
#6. 모델 훈련
set.seed(1)
svm_model <- svm(Species ~., data = train_data, kernel = "linear")
# kernel 옵션 : 선형(linear), 비선형(polynomial)
#7. 모델 예측
result <- predict(svm_model, test_data[,-5])
#8. 모델 평가
sum(result == test_data[,5]) / length(test_data[,5]) #0.9333333
#9. 모델 개선
set.seed(1)
svm_model2 <- svm(Species ~., data = train_data, kernel = "polynomial", gamma = 10, C= 10)
result2 <- predict(svm_model2, test_data[,-5])
sum(result2 == test_data[,5]) / length(test_data[,5]) #0.8666667 > 0.9333333(gamma, C 조정값)
kernel 옵션으로 선형으로 할 지 비선형으로 할 지 정해줄 수 있음.
kernel 옵션 : default(radial), 선형(linear), 비선형(polynomial)
#9. 모델 개선
set.seed(1)
svm_model2 <- svm(Species ~ .,data=train_data, kernel = 'radial')
result2 <- predict(svm_model2, test_data[,-5])
sum(result2==test_data[,5]) / length(test_data[,5]) # 1
svm 모델 생성 시, kernel = 'radial'(default)로 하면 100%정확도 나옴.
문제360. 책359페이지에 나오는 kernlab 패키지를 설치하고 ksvm 함수로 서포트 벡터 머신 모델을 만들고 정확도를 확인하시오.
# kernlab 패키지로 서포트벡터머신 모델 생성
install.packages("kernlab")
library(kernlab)
svm_model3 <- ksvm(Species ~., data = train_data, kernel = "vanilladot")
result3 <- predict(svm_model3, test_data[,-5])
sum(result3 == test_data[,5]) / length(test_data[,5]) #0.9333333
책 363페이지를 참고하여 kernel = 'rbfdot'를 사용해서 모델 다시 생성
svm_model4 <- ksvm(Species ~., data = train_data, kernel = "rbfdot")
result4 <- predict(svm_model4, test_data[,-5])
sum(result4 == test_data[,5]) / length(test_data[,5]) #1
> iris데이터에 가장 좋은 커널은 e1071 svm모델의 raidal과 kernlab ksvm모델의 rbfdot
ㅇ유방암 데이터의 양성과 악성종양 분류를 서포트 벡터 머신으로 만들기
#1. 데이터 로드
#2. 결측치 확인
#3. 정규화 진행
#4. 훈련 데이터, 테스트 데이터 분리
#5. 모델 생성
#6. 모델 훈련
#7. 모델 예측
#8. 모델 평가
#1. 데이터 로드
wisc <- read.csv("c:\\data\\wisc_bc_data.csv", stringsAsFactors = TRUE)
head(wisc) #label = diagnosis
nrow(wisc) #569
ncol(wisc) #32
#2. 결측치 확인
colSums(is.na(wisc))
#3. 정규화 진행
normalize <- function(x){ return( (x-min(x)) / (max(x) - min(x)) )}
wisc_norm <-as.data.frame(lapply(wisc[,c(-1,-2)], normalize))
wisc_scaled <- cbind(diagnosis = wisc$diagnosis, wisc_norm) #label 1번
ncol(wisc_scaled) #31
head(wisc_scaled)
#4. 훈련 데이터, 테스트 데이터 분리
library(caret)
set.seed(1)
k <- createDataPartition(wisc_scaled$diagnosis, p = 0.9, list = F)
train_data <- wisc_scaled[k, ]
test_data <- wisc_scaled[-k, ]
nrow(train_data) #513
nrow(test_data) #56
#5. 모델 생성/훈련/예측/평가
########################## e1071-svm
library(e1071)
set.seed(1)
wisc_svm_model <- svm(diagnosis ~., data = train_data, kernel = 'radial')
result_svm <- predict(wisc_svm_model, test_data[,-1])
sum(result_svm == test_data[,1]) / length(test_data[,1]) #0.9642857
table(result_svm, test_data[,1]) #library(glodels)로 이원교차표 확인해볼것
# FN값 1개 출력
문제361. (오늘의 마지막 문제) 책 363페이지에 나오는 ksvm 함수를 이용해서 유방암의 양성과 악성 분류하는 서포트 벡터 머신 모델을 R로 생성하시오.
########################## kernlab - ksvm
library(kernlab)
# kernel = "vanilladot"
set.seed(1)
wisc_ksvm_model <- ksvm(diagnosis ~ ., data = train_data, kernel = "vanilladot")
result_ksvm <- predict(wisc_ksvm_model, test_data[,-1])
sum(result_ksvm == test_data[,1]) / length(test_data[,1]) #0.9642857
table(result_ksvm, test_data[,1]) # FN값 1개 출력
# kernel = "rbfdot"
set.seed(1)
wisc_ksvm_model2 <- ksvm(diagnosis ~., data = train_data, kernel = "rbfdot")
result_ksvm2 <- predict(wisc_ksvm_model2, test_data[,-1])
sum(result_ksvm2 == test_data[,1]) / length(test_data[,1]) #0.9642857
table(result_ksvm2, test_data[,1]) # FN값 1개 출력
반응형
'Study > class note' 카테고리의 다른 글
머신러닝 / 연관규칙 이론, R 로 연관규칙 모델 구현하기 (0) | 2022.02.24 |
---|---|
머신러닝 / 파이썬으로 서포트 벡터 머신 모델 만들기 (0) | 2022.02.24 |
머신러닝 / 서포트 벡터 머신 이론(로지스틱 회귀) (0) | 2022.02.23 |
머신러닝 / R 로 신경망 모델 만들기(분류), 파이썬으로 신경망 모델 만들기(분류) (0) | 2022.02.22 |
머신러닝 / 하이퍼 파라미터 최적화(grid search), 파생변수 추가 (0) | 2022.02.22 |