Estoy usando SVM para predecir la diabetes. Estoy usando el conjunto de datos BRFSS para este propósito. El conjunto de datos tiene las dimensiones de y está sesgado. El porcentaje de s en la variable objetivo es mientras que los s constituyen el restante .Y
N
Estoy utilizando solamente 15
de 136
variables independientes del conjunto de datos. Una de las razones para reducir el conjunto de datos fue tener más muestras de entrenamiento cuando NA
se omiten las filas que contienen s.
Estas 15
variables se seleccionaron después de ejecutar métodos estadísticos como árboles aleatorios, regresión logística y descubrir qué variables son significativas a partir de los modelos resultantes. Por ejemplo, después de ejecutar la regresión logística, solíamos p-value
ordenar las variables más significativas.
¿Es correcto mi método de selección de variables? Cualquier sugerencia es muy bienvenida.
La siguiente es mi R
implementación.
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);
Corrí con (entrenamiento = y prueba = ) muestras ya que es más rápido en mi computadora portátil. La matriz de confusión para los datos de prueba ( muestras) que obtengo es bastante mala.
true
pred N Y
N 262 38
Y 0 0
Necesito mejorar mi predicción para la Y
clase. De hecho, necesito ser lo más preciso posible Y
incluso si me desempeño mal N
. Cualquier sugerencia para mejorar la precisión de la clasificación sería muy apreciada.
Y
cualquier entrada. Esto significa que será correcto del tiempo.