Ich benutze SVM, um Diabetes vorherzusagen. Ich verwende den BRFSS- Datensatz für diesen Zweck. Der Datensatz hat die Abmessungen und ist verzerrt. Der Prozentsatz von s in der Zielvariablen beträgt während die s die verbleibenden .11 % 89 %Y
N
Ich verwende nur 15
aus 136
unabhängigen Variablen aus dem Datensatz. Einer der Gründe für die Reduzierung des Datensatzes bestand darin, mehr Trainingsmuster zu haben, wenn Zeilen mit NA
s weggelassen wurden.
Diese 15
Variablen wurden ausgewählt, nachdem statistische Methoden wie Zufallsbäume, logistische Regression ausgeführt und herausgefunden wurden, welche Variablen aus den resultierenden Modellen signifikant sind. Nach dem Ausführen der logistischen Regression haben wir beispielsweise p-value
die wichtigsten Variablen sortiert.
Ist meine Methode zur Variablenauswahl korrekt? Anregungen zu ist sehr willkommen.
Das Folgende ist meine R
Implementierung.
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);
Ich lief mit (Training = und Test = ) Proben, da es in meinem Laptop schneller ist. Die Verwirrungsmatrix für die Testdaten ( Proben), die ich bekomme, ist ziemlich schlecht.700 300 300
true
pred N Y
N 262 38
Y 0 0
Ich muss meine Vorhersage für die Y
Klasse verbessern . Tatsächlich muss ich so genau wie möglich sein, Y
auch wenn ich schlecht abschneide N
. Vorschläge zur Verbesserung der Genauigkeit der Klassifizierung sind sehr willkommen.
Y
jede Eingabe voraus . Dies bedeutet, dass es in der korrekt ist .