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.kernlab
lugar de hacerloe1071
: se normaliza automáticamente y tiene algunas heurísticas que facilitan el arranque del primer modelo.Respuestas:
Tengo 4 sugerencias:
Aquí hay un código de ejemplo para caret:
Este modelo LDA supera tu SVM, y ni siquiera solucioné tus factores. Estoy seguro de que si recodifica Sexo, Fumador, etc. como factores, obtendrá mejores resultados.
fuente
task 1 failed - "could not find function "predictionFunction""
. Sé que este no es un foro, pero si tiene algún comentario, hágamelo saber.update.packages.
Cuando termine, cierre R y vuelva a abrir una sesión normal (no administrativa). Ejecute su código, excepto las secciones "SVM" y "Matriz de confusión". Entonces ejecuta mi código. Si aún recibe un error, publique la línea que devolvió un error, junto con el error exacto.install.packages('caret')
nuevamente.train
función, comonb
(bayes ingenuos),glm
(regresión logística)svmLinear
ysvmRadial
. Los svm tardarán mucho en adaptarse.Si está utilizando un núcleo lineal, entonces es posible que la selección de características sea una mala idea, y que la regularización pueda evitar un ajuste excesivo más eficaz que la selección de características. Tenga en cuenta que los límites de rendimiento que el SVM implementa aproximadamente son independientes de la dimensión del espacio de características, que era uno de los puntos de venta del SVM.
fuente
Recientemente tuve este problema y encontré un par de cosas que ayudan. Primero, pruebe un modelo Naive Bayes (paquete klaR) que a veces le da mejores resultados cuando la clase minoritaria en un problema de clasificación es pequeña. Además, si elige quedarse con un SVM, puede intentar sobremuestrear la clase minoritaria. Esencialmente, querrás incluir más ejemplos de la clase minoritaria o crear casos sintéticos para la clase minoritaria
Este documento: http: //www.it.iitb.ac.in/~kamlesh/Page/Reports/highlySkewed.pdf
Tiene algunas discusiones y ejemplos de estas técnicas implementadas en Weka, pero también es posible implicarlas en R.
fuente
Además de lo que ya se ha mencionado, está arreglando su mejor modelo para usar un núcleo lineal. Debe predecir el uso del mejor modelo que se ajustó, incluido el mismo núcleo que se usó / encontró en su etapa de ajuste (que supongo que es RBF ya que está ajustando gamma).
fuente