Я використовую SVM для прогнозу діабету. Для цього я використовую набір даних BRFSS . Набір даних має розміри і перекошений. Відсоток s у цільовій змінній становить тоді як s складають решта .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);
Я бігав з (навчання = і тест = ) зразків, оскільки це швидше в моєму ноутбуці. Матриця плутанини для тестових даних ( зразків), які я отримую, є досить поганою.
true
pred N Y
N 262 38
Y 0 0
Мені потрібно покращити своє передбачення для Y
класу. Насправді мені потрібно бути максимально точним, Y
навіть якщо я погано виступаю N
. Будь-які пропозиції щодо підвищення точності класифікації були б вдячні.