당뇨병을 예측하기 위해 SVM을 사용하고 있습니다. 이 목적으로 BRFSS 데이터 세트를 사용하고 있습니다. 데이터 세트의 크기는 이며 비뚤어집니다. 목표 변수에서 s 의 비율 은 이고 s는 나머지 구성합니다 .11 % 89 %Y
N
데이터 세트에서 독립 변수 15
중 하나만 사용 136
하고 있습니다. 데이터 세트를 줄이는 이유 중 하나는 NA
s를 포함하는 행 이 생략 될 때 더 많은 학습 샘플을 갖기위한 것 입니다.
이 15
변수는 랜덤 트리, 로지스틱 회귀와 같은 통계적 방법을 실행하고 결과 모델에서 어떤 변수가 중요한지 알아 낸 후에 선택되었습니다. 예를 들어 로지스틱 회귀 분석을 실행 한 후 p-value
가장 중요한 변수를 정렬하는 데 사용 했습니다.
변수 선택 방법이 올바른가요? 어떤 제안이라도 대단히 환영합니다.
다음은 내 R
구현입니다.
library(e1071) # Support Vector Machines
#--------------------------------------------------------------------
# read brfss file (huge 135 MB file)
#--------------------------------------------------------------------
y <- read.csv("http://www.hofroe.net/stat579/brfss%2009/brfss-2009-clean.csv")
indicator <- c("DIABETE2", "GENHLTH", "PERSDOC2", "SEX", "FLUSHOT3", "PNEUVAC3",
"X_RFHYPE5", "X_RFCHOL", "RACE2", "X_SMOKER3", "X_AGE_G", "X_BMI4CAT",
"X_INCOMG", "X_RFDRHV3", "X_RFDRHV3", "X_STATE");
target <- "DIABETE2";
diabetes <- y[, indicator];
#--------------------------------------------------------------------
# recode DIABETE2
#--------------------------------------------------------------------
x <- diabetes$DIABETE2;
x[x > 1] <- 'N';
x[x != 'N'] <- 'Y';
diabetes$DIABETE2 <- x;
rm(x);
#--------------------------------------------------------------------
# remove NA
#--------------------------------------------------------------------
x <- na.omit(diabetes);
diabetes <- x;
rm(x);
#--------------------------------------------------------------------
# reproducible research
#--------------------------------------------------------------------
set.seed(1612);
nsamples <- 1000;
sample.diabetes <- diabetes[sample(nrow(diabetes), nsamples), ];
#--------------------------------------------------------------------
# split the dataset into training and test
#--------------------------------------------------------------------
ratio <- 0.7;
train.samples <- ratio*nsamples;
train.rows <- c(sample(nrow(sample.diabetes), trunc(train.samples)));
train.set <- sample.diabetes[train.rows, ];
test.set <- sample.diabetes[-train.rows, ];
train.result <- train.set[ , which(names(train.set) == target)];
test.result <- test.set[ , which(names(test.set) == target)];
#--------------------------------------------------------------------
# SVM
#--------------------------------------------------------------------
formula <- as.formula(factor(DIABETE2) ~ . );
svm.tune <- tune.svm(formula, data = train.set,
gamma = 10^(-3:0), cost = 10^(-1:1));
svm.model <- svm(formula, data = train.set,
kernel = "linear",
gamma = svm.tune$best.parameters$gamma,
cost = svm.tune$best.parameters$cost);
#--------------------------------------------------------------------
# Confusion matrix
#--------------------------------------------------------------------
train.pred <- predict(svm.model, train.set);
test.pred <- predict(svm.model, test.set);
svm.table <- table(pred = test.pred, true = test.result);
print(svm.table);
나는 함께 도망 (교육 = 700 및 테스트 = 300 더 빨리 내 노트북에 있기 때문에) 샘플. 내가 얻는 테스트 데이터 ( 300 샘플)에 대한 혼란 매트릭스 는 상당히 나쁘다.700
true
pred N Y
N 262 38
Y 0 0
Y
수업에 대한 예측을 향상시켜야합니다 . 사실, Y
나는 성능이 좋지 않더라도 가능한 한 정확해야합니다 N
. 분류의 정확성을 향상시키기위한 제안은 크게 감사하겠습니다.
Y
모든 입력을 예측 합니다. 이것은 의 시간 이 정확하다는 것을 의미합니다 .