Я использую 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
. Будем весьма благодарны за любые предложения по улучшению точности классификации.
Y
любой вклад. Это означает, что это будет правильно времени.kernlab
вместоe1071
- он выполняет нормализацию автоматически и имеет некоторую эвристику, облегчающую загрузку первой модели.Ответы:
У меня есть 4 предложения:
Вот пример кода для каретки:
Эта модель LDA превосходит ваши SVM, а я даже не исправил ваши факторы. Я уверен, что если вы перекодируете Sex, Smoker и т. Д. В качестве факторов, вы получите лучшие результаты.
источник
task 1 failed - "could not find function "predictionFunction""
. Я знаю, что это не форум, но если у вас есть какие-либо комментарии, пожалуйста, дайте мне знать.update.packages.
Когда это закончится, закройте R и снова откройте обычный (не администраторский) сеанс. Запустите ваш код, за исключением разделов «SVM» и «Матрица смешения». Тогда запустите мой код. Если вы по-прежнему получаете сообщение об ошибке, пожалуйста, опубликуйте строку, которая вернула ошибку, вместе с точной ошибкой.install.packages('caret')
снова.train
функции, такие какnb
(наивный байес),glm
(логистическая регрессия)svmLinear
иsvmRadial
. Svm's займет много времени, чтобы соответствовать.Если вы используете линейное ядро, то, возможно, выбор объектов является плохой идеей и что регуляризация может предотвратить перестройку более эффективно, чем выбор функций. Обратите внимание, что границы производительности, которые приблизительно реализует SVM, не зависят от измерения пространства объектов, которое было одним из преимуществ SVM.
источник
У меня недавно была эта проблема, и я нашел несколько вещей, которые помогают. Сначала попробуйте наивную байесовскую модель (пакет klaR), которая иногда дает лучшие результаты, когда класс меньшинства в задаче классификации крошечный. Кроме того, если вы решите придерживаться SVM, вы можете попробовать передискретизировать класс меньшинства. По сути, вы захотите включить больше примеров класса меньшинства или создать синтетически случаи для класса меньшинства.
Этот документ: http: //www.it.iitb.ac.in/~kamlesh/Page/Reports/highlySkewed.pdf
Были некоторые обсуждения и примеры этих методов, реализованных в Weka, но также возможно их применение в R.
источник
В дополнение к тому, что уже было упомянуто, вы исправляете свою лучшую модель для использования линейного ядра. Вы должны предсказать, используя лучшую модель, которая была настроена, включая то же самое ядро, которое использовалось / было найдено на вашем этапе настройки (я предполагаю, что это RBF, так как вы настраиваете гамму).
источник