Вопрос: Проблема улучшения модели GBM (повышения градиента) и генерирования nan с использованием функции gbm в r. train.fraction правильно установлено на <1 - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь проверить различные параметры в функции gbm of R, чтобы делать прогнозы с моими данными. У меня есть огромная таблица из 79866 строк и 1586 столбцов, где столбцы представляют собой подсчеты мотивов в ДНК, а строки указывают различные области / положения в ДНК и организме, к которому относятся эти подсчеты. Существует только 3 организма, но счет разделен по позициям (пик).

данные выглядят так:

chrII: 11889760_11890077 червь 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 ...

Поскольку у меня проблемы с память, которую я пока не знаю, как решить (из-за размера таблицы), поэтому я использую подмножество данных:

motifs.table.sub<-motifs.table[1:1000, 1:1000]

set.seed(123)
motifs_split.sub <- initial_split(motifs.table.sub, prop = .7)
motifs_train.sub <- training(motifs_split.sub)

Я создаю таблицу с различными параметрами для проверки

hyper_grid <- expand.grid( 
  shrinkage = c(.01, .1, .3), 
  interaction.depth = c(1, 3, 5),
  n.minobsinnode = c(5, 10, 15), 
  bag.fraction = c(.65, .8, 1),
  optimal_trees = 0,
  min_RMSE = 0)

Затем я рандомизирую обучающие данные:

random_index.sub <- sample(1:nrow(motifs_train.sub), nrow(motifs_train.sub))
random_motifs_train.sub <- motifs_train.sub[random_index.sub, ]

проверяем различные параметры с 1000 деревьев

for(i in 1:nrow(hyper_grid)) {#
  set.seed(123)
  gbm.tune <- gbm(
    formula = organism ~ .,
    distribution = "gaussian", #default
    data = random_motifs_train.sub,
    n.trees = 1000,
    interaction.depth = hyper_grid$interaction.depth[i],
    shrinkage = hyper_grid$shrinkage[i],
    n.minobsinnode = hyper_grid$n.minobsinnode[i],
    bag.fraction = hyper_grid$bag.fraction[i],
    train.fraction = 0.70,
    n.cores = NULL,
    verbose = V)
  print(head(gbm.tune$valid.error))}

Проблема в том, что модель никогда не улучшается:

Iter TrainDeviance ValidDeviance StepSize Improve

1 нан нан 0,0100 нан

2 нан нан 0,0100 нан

3 нан нан 0,0100 нан

4 нан нан 0,0100 нан

5 нан нан 0,0100 нан

6 нан нан 0,0100 нан

7 нан нан 0,0100 нан

8 нан нан 0,0100 нан

9 нан нан 0,0100 нан

10 нан нан 0,0100 нан

И значения типа valid.error не рассчитываются, они остаются как «NA». Я попытался изменить размер подмножества данных, и то же самое происходит со всеми параметрами, которые я тестирую. Моя таблица данных огромна, и в ней много нулей, я убираю мотивы с низким количеством, но не думаю, что это помогло бы, поскольку только 127 мотивов из 1586 имеют менее 10 отсчетов.

очевидно TrainDeviance равно nan, если train.fraction не равен <1: <a href="https://stackoverflow.com/questions/23530165/gradient-boosting-using-gbm-in-r-with-distribution-bernoulli"> Градиентное усиление с использованием gbm в R с распределением = "bernoulli"

Но не в моем случае, я установил train.fraction на 0,7

Есть идеи, что я делаю не так?

спасибо!

PS: я следую этому уроку: http://uc-r.github.io/gbm_regression

...