Saya menggunakan SVM untuk memprediksi diabetes. Saya menggunakan set data BRFSS untuk tujuan ini. Kumpulan data memiliki dimensi dan miring. Persentase s dalam variabel target adalah sedangkan s merupakan sisa 89 \% .Y
N
Saya hanya menggunakan 15
dari 136
variabel independen dari set data. Salah satu alasan untuk mengurangi kumpulan data adalah untuk memiliki lebih banyak sampel pelatihan saat baris yang mengandung NA
s dihilangkan.
15
Variabel - variabel ini dipilih setelah menjalankan metode statistik seperti pohon acak, regresi logistik dan mencari tahu variabel mana yang signifikan dari model yang dihasilkan. Sebagai contoh, setelah menjalankan regresi logistik kami menggunakan p-value
untuk memesan variabel yang paling signifikan.
Apakah metode saya melakukan pemilihan variabel sudah benar? Setiap saran sangat disambut.
Berikut ini adalah R
implementasi saya .
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);
Saya berlari dengan (pelatihan = dan menguji = ) sampel karena lebih cepat di laptop saya. Matriks kebingungan untuk data uji ( sampel) yang saya dapatkan cukup buruk.
true
pred N Y
N 262 38
Y 0 0
Saya perlu meningkatkan prediksi saya untuk Y
kelas. Bahkan, saya harus seakurat mungkin dengan Y
bahkan jika saya berkinerja buruk dengan N
. Setiap saran untuk meningkatkan akurasi klasifikasi akan sangat dihargai.
Y
input apa pun. Ini berarti itu akan benar dari waktu.