2015-08-06 9 views
0

Я использую пакет биокондуктора MLSeq на Ubuntu с R версии 3.1.2. Я пробовал работать через the example provided by the package, и это работает отлично. Тем не менее, я хочу использовать метод bagsvm для функции classify, поэтому в chunk 14, я изменил код изФункция каретки 'train' не подходит для мешков svm

svm <- classify(data = data.trainS4, method = "svm", normalize = "deseq", 
       deseqTransform = "vst", cv = 5, rpt = 3, ref = "T") 

в

bagsvm <- classify(data = data.trainS4, method = "bagsvm", normalize = "deseq", 
       deseqTransform = "vst", cv = 5, rpt = 3, ref = "T") 

который произвел ошибку:

Something is wrong; all the Accuracy metric values are missing: 
    Accuracy  Kappa 
Min. : NA Min. : NA 
1st Qu.: NA 1st Qu.: NA 
Median : NA Median : NA 
Mean :NaN Mean :NaN 
3rd Qu.: NA 3rd Qu.: NA 
Max. : NA Max. : NA 
NA's :1  NA's :1 
Error in train.default(counts, conditions, method = "bag", B = B, bagControl = bagControl(fit = svmBag$fit, : 
    Stopping 
In addition: There were 17 warnings (use warnings() to see them) 

Предупреждения:

Warning messages: 
1: executing %dopar% sequentially: no parallel backend registered 
2: In eval(expr, envir, enclos) : 
    model fit failed for Fold1.Rep1: vars=150 Error in fitter(btSamples[[iter]], x = x, y = y, ctrl = bagControl, v = vars, : 
    task 1 failed - "could not find function "lev"" 

предупреждение-затем повторяется 14 раз следует:

17: In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, ... : 
    There were missing values in resampled performance measures. 

traceback() производство

4: stop("Stopping") 
3: train.default(counts, conditions, method = "bag", B = B, bagControl = bagControl(fit = svmBag$fit, 
     predict = svmBag$pred, aggregate = svmBag$aggregate), trControl = ctrl, 
     ...) 
2: train(counts, conditions, method = "bag", B = B, bagControl = bagControl(fit = svmBag$fit, 
     predict = svmBag$pred, aggregate = svmBag$aggregate), trControl = ctrl, 
     ...) 
1: classify(data = data.trainS4, method = "bagsvm", normalize = "deseq", 
     deseqTransform = "vst", cv = 5, rpt = 3, ref = "T")

Я думал, что проблема может быть, что kernlab библиотеки, которую я думаю, MLSeq код использует Ждет» t загрузился, поэтому я попробовал

library(kernlab) 
bagsvm <- classify(data = data.trainS4, method = "bagsvm", normalize = "deseq", 
       deseqTransform = "vst", cv = 5, rpt = 3, ref = "T") 

который привел к той же ошибке, но th е предупреждения изменено на:

Warning messages: 
    1: In eval(expr, envir, enclos) : 
     model fit failed for Fold1.Rep1: vars=150 Error in fitter(btSamples[[iter]], x = x, y = y, ctrl = bagControl, v = vars, : 
     task 1 failed - "no applicable method for 'predict' applied to an object of class "c('ksvm', 'vm')""

повторяют 15 раз с последующим

16: In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, ... : 
    There were missing values in resampled performance measures. 

Я не считаю, что это проблема специфична для MLSeq как я попытался запустить функцию train, как

ctrl <- trainControl(method = "repeatedcv", number = 5, 
    repeats = 3) 
train <- train(counts, conditions, method = "bag", B = 100, 
      bagControl = bagControl(fit = svmBag$fit, predict = svmBag$pred, 
            aggregate = svmBag$aggregate), trControl = ctrl) 

где counts - это кадр данных с данными RNASeq, а conditions - фактор с классами, и я получил тот же результат s. Буду признателен за любую оказанную помощь.

ответ

0

Я пытался отладить свою проблему и, по-видимому, случайно нашел решение. Поскольку проблема, казалось, в функции прогнозирования, так что я сохранил функцию svmBag$pred как переменную predfunct, так что я мог видеть, где он не работал

predfunct<-function (object, x) 
{ 
if (is.character(lev(object))) { 
    out <- predict(object, as.matrix(x), type = "probabilities") 
    colnames(out) <- lev(object) 
    rownames(out) <- NULL 
    } 
    else out <- predict(object, as.matrix(x))[, 1] 
    out 
} 

и затем вызвать

train <- train(counts, conditions, method = "bag", B = 100, 
     bagControl = bagControl(fit = svmBag$fit, predict = predfunct, 
           aggregate = svmBag$aggregate), trControl = ctrl) 

, как и в прошлом код блока описания проблемы с predfunct заменяющий svmBag$pred. Как-то это фиксировало проблему, и все работает отлично. Если кто-нибудь может понять, почему это сработало, и желательно найти решение, которое не является таким kluge, я отвечу на ваш ответ.

1

Признаюсь, я не пытался воспроизвести все ваши шаги. Однако все, что вы пытаетесь сделать, это перейти от «SVM», который работает, к «пакетному ансамблю SVM». Я не уверен, если вы знаете entirely what that means, но тут в двух словах:

Вместо того, чтобы просто сделать 1 модель, используя все данные (обучения), вы:

  • делает несколько моделей
  • , где каждая модель использует случайно выбранное подмножество подготовки данных ("bagging")
  • и качество каждого из этих моделей подтверждены, видя, как он выполняет на неиспользованных частей обучение данные.

Потому что это так, и потому, что это единственное изменение, которое вы сделали, я подозреваю:

  • вы либо слишком мало данных, или слишком много записей, которые являются пустыми или NA, таким что любая из этих моделей mini-SVM в мешке не может быть завершена.

Похож на mini-SVM models are broken into sets of 100 samples, by default. (См. Параметр default B = 100 в классификации.) Если существует вероятность того, что, например, одна из этих подмодулей, имеющая только 100 наблюдений, будет иметь полностью пустую/NA, тогда модель мешков не сработает.


Как это исправить?

  • Во-первых, я хотел бы попробовать поднять до значения B к чему-то значительно больше, как, скажем, 1000. По тем же причинам, я бы проверить # пропущенных значений в любой из особенностей с чем-то вроде table(is.na(feature_oi))

  • Далее, если модель действительно работает с любыми исправлениями выше, я бы посмотрел, можно ли немного исправить данные, либо: (а) увидеть, можно ли каким-либо образом восстановить недостающие значения, или (б) если некоторые из наблюдений с отсутствующими значениями имеют такое низкое качество, что вы, возможно, захотите рассмотреть возможность полного удаления наблюдения.

  • Конечно, другое решение, если модель действительно работает с этими исправлениями, - это просто использовать ее с этими исправлениями. Сделайте B 1000 или что-то большое. Имейте в виду, что если это то, что вы пытались запустить на производстве, вы все еще строите что-то шаткие, которые могут иногда падать.

  • И, наконец, если исходные исправления не повлияли на работу модели, я не уверен в этой проблеме. Может быть, сама реализация bagsvm имеет ошибку. Надеюсь, кто-то, более знакомый с библиотекой, может услышать больше советов на этом фронте.

+0

Я попробовал ваше предложение, и в данных не было отсутствующих значений. Когда я попытался увеличить значение «B» до 1000, я получил те же ошибки, но предупреждения изменились на «In .local (x, ...): Variable (s)» constant. Невозможно масштабировать данные. «Я пробовал все это прямо в функции« train », как показано в последней строке кода выше, поэтому он не может быть специфичным для реализации' MLSeq' с помощью 'bagsvm'. – Barker

+0

В нем говорится, что «переменные константы» b/c у вас есть несколько уровней, которые представлены только один раз, к тому времени, когда вы разбиваете на 1000 групп. Если ни одно из предложений не работает, найдите другой набор данных, который, как вы знаете, будет чистым, и посмотрите, будет ли он работать для вас. –

+0

Все ошибки и предупреждения, которые я перечислял, взяты из набора данных, предоставленного создателями пакета 'MLSeq', а не мои данные. Есть ли другой источник данных, который вы рекомендуете, или лучший способ оценить данные как «чистые»? Однако я не думаю, что проблема заключается в данных. Если вы посмотрите на ответ, опубликованный ниже, я смог заставить эту функцию работать, сохраняя функцию «предсказать» для классификатора в другой переменной, но я не знаю, почему это исправлено. – Barker