Улучшение SVM классификации диабета

10

Я использую SVM для прогнозирования диабета. Я использую набор данных BRFSS для этой цели. Набор данных имеет размеры и искажен. Процент s в целевой переменной составляет тогда как s составляют оставшиеся .432607×136Y11%N89%

Я использую только 15из 136независимых переменных из набора данных. Одна из причин сокращения набора данных состояла в том, чтобы иметь больше обучающих выборок, когда строки, содержащие NAs, опущены.

Эти 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);

Я пробежал с (обучение = и тест = ) выборок, так как это быстрее на моем ноутбуке. Матрица путаницы для тестовых данных ( образцов) я получаю довольно плохо.1000700300300

    true
pred   N   Y
   N 262  38
   Y   0   0

Мне нужно улучшить свой прогноз для Yкласса. На самом деле, мне нужно быть максимально точным, Yдаже если я плохо выступаю N. Будем весьма благодарны за любые предложения по улучшению точности классификации.

Ананд
источник
Я думаю, что ваш SVM не работает вообще, но не знаю почему! также может быть лучше нормализовать ваши данные ...
user4581
Да, это в основном предсказывает Yлюбой вклад. Это означает, что это будет правильно времени.  90%
Ананд
Нормализация данных - это лучшая вещь для начала. Начните с этого. Вы также можете попробовать поискать нелинейное ядро, возможно, должно показать лучший результат. (Это зависит от вашего предвидения, может быть достаточно нормализации)
404Dreamer_ML
Вы также можете попробовать kernlabвместо e1071- он выполняет нормализацию автоматически и имеет некоторую эвристику, облегчающую загрузку первой модели.

Ответы:

9

У меня есть 4 предложения:

  1. Как вы выбираете переменные для включения в вашу модель? Возможно, вам не хватает некоторых ключевых показателей из большого набора данных.
  2. Почти все используемые вами показатели (например, пол, курящий и т. Д.) Следует рассматривать как факторы. Неверно относиться к этим переменным как к числовым, что, вероятно, способствует возникновению ошибки в вашей модели.
  3. Почему вы используете SVM? Вы пробовали какие-нибудь более простые методы, такие как линейный дискриминантный анализ или даже линейная регрессия? Возможно, простой подход к большему набору данных даст лучший результат.
  4. Попробуйте пакет карет . Это поможет вам перекрестно проверить точность модели, распараллелит, что позволит вам работать быстрее, и позволит легко исследовать различные типы моделей.

Вот пример кода для каретки:

library(caret)

#Parallize
library(doSMP)
w <- startWorkers()
registerDoSMP(w)

#Build model
X <- train.set[,-1]
Y <- factor(train.set[,1],levels=c('N','Y'))
model <- train(X,Y,method='lda')

#Evaluate model on test set
print(model)
predY <- predict(model,test.set[,-1])
confusionMatrix(predY,test.set[,1])
stopWorkers(w)

Эта модель LDA превосходит ваши SVM, а я даже не исправил ваши факторы. Я уверен, что если вы перекодируете Sex, Smoker и т. Д. В качестве факторов, вы получите лучшие результаты.

Zach
источник
Я получаю следующую ошибку task 1 failed - "could not find function "predictionFunction"". Я знаю, что это не форум, но если у вас есть какие-либо комментарии, пожалуйста, дайте мне знать.
Ананд
1
@Anand: откройте новый сеанс R от имени администратора (или запустите sudo R в mac / linux). Выполнить update.packages.Когда это закончится, закройте R и снова откройте обычный (не администраторский) сеанс. Запустите ваш код, за исключением разделов «SVM» и «Матрица смешения». Тогда запустите мой код. Если вы по-прежнему получаете сообщение об ошибке, пожалуйста, опубликуйте строку, которая вернула ошибку, вместе с точной ошибкой.
Зак
1
@Anand: Кроме того, убедитесь, что вы используете последнюю версию R (2.14) и используете последнюю версию Caret. Вы можете обновить каретку, запустив install.packages('caret')снова.
Зак
@ Ананд: Отлично! Вы можете использовать разные методы для этой trainфункции, такие как nb(наивный байес), glm(логистическая регрессия) svmLinearи svmRadial. Svm's займет много времени, чтобы соответствовать.
Зак
3

Если вы используете линейное ядро, то, возможно, выбор объектов является плохой идеей и что регуляризация может предотвратить перестройку более эффективно, чем выбор функций. Обратите внимание, что границы производительности, которые приблизительно реализует SVM, не зависят от измерения пространства объектов, которое было одним из преимуществ SVM.

Дикран Сумчатый
источник
2

У меня недавно была эта проблема, и я нашел несколько вещей, которые помогают. Сначала попробуйте наивную байесовскую модель (пакет klaR), которая иногда дает лучшие результаты, когда класс меньшинства в задаче классификации крошечный. Кроме того, если вы решите придерживаться SVM, вы можете попробовать передискретизировать класс меньшинства. По сути, вы захотите включить больше примеров класса меньшинства или создать синтетически случаи для класса меньшинства.

Этот документ: http: //www.it.iitb.ac.in/~kamlesh/Page/Reports/highlySkewed.pdf

Были некоторые обсуждения и примеры этих методов, реализованных в Weka, но также возможно их применение в R.

Дэн
источник
Спасибо за полезные комментарии. Позвольте мне попробовать ваши предложения.
Ананд
1

В дополнение к тому, что уже было упомянуто, вы исправляете свою лучшую модель для использования линейного ядра. Вы должны предсказать, используя лучшую модель, которая была настроена, включая то же самое ядро, которое использовалось / было найдено на вашем этапе настройки (я предполагаю, что это RBF, так как вы настраиваете гамму).

benbo
источник