2015-12-20 2 views
2

Я не уверен, что многие приятные функции xgboost можно комбинировать так, как мне нужно (?), Но то, что я пытаюсь сделать, - запустить Случайный лес с разреженными предсказателями данных для переменной, зависящей от нескольких классов.xgboost Случайный лес с разреженными матричными данными и многочленом Y

Я знаю, что xgboost может сделать любой 1 из этих вещей:

  • Random Forest с помощью тонкой настройки параметров: xgboost

bst <- xgboost(data = train$data, label = train$label, max.depth = 4, num_parallel_tree = 1000, subsample = 0.5, colsample_bytree =0.5, nround = 1, objective = "binary:logistic")

bst <- xgboost(data = sparse_matrix, label = output_vector, max.depth = 4, eta = 1, nthread = 2, nround = 10,objective = "binary:logistic")

  • Multinomial (мультиклассируют) зависимые переменные модели через multi:softmax или multi:softprob

xgboost(data = data, label = multinomial_vector, max.depth = 4, eta = 1, nthread = 2, nround = 10,objective = "multi:softmax")

Однако, я бегу в ошибку относительно несоответствующего длины, когда я пытаюсь сделать все они сразу:

sparse_matrix  <- sparse.model.matrix(TripType~.-1, data = train) 
Y     <- train$TripType 
bst    <- xgboost(data = sparse_matrix, label = Y, max.depth = 4, num_parallel_tree = 100, subsample = 0.5, colsample_bytree =0.5, nround = 1, objective = "multi:softmax") 
Error in xgb.setinfo(dmat, names(p), p[[1]]) : 
    The length of labels must equal to the number of rows in the input data 
length(Y) 
[1] 647054 
length(sparse_matrix) 
[1] 66210988200 
nrow(sparse_matrix) 
[1] 642925 

Ошибка длины я получаю сравниваю длину моего одного зависимого вектора мульти-класса (назовет его п) к длине разреженного индекса матрицы, который я считаю, является J * п для j предикторов.

Конкретный вариант использования здесь - конкурс Kaggle.com Walmart (данные общедоступны, но очень большие по умолчанию - около 650 000 строк и несколько тысяч функций кандидата). Я запускал многомодовые модели RF на нем через H2O, но похоже, что многие другие люди используют xgboost, поэтому я задаюсь вопросом, возможно ли это.

Если это невозможно, то мне интересно, можно ли/следовало бы оценить каждый уровень зависимой переменной отдельно и попытаться прийти к результатам?

ответ

4

Вот что происходит:

Когда вы сделаете это:

sparse_matrix <- sparse.model.matrix(TripType~.-1, data = train)

вы теряете строки из данных

sparse.model.matrix не может иметь дело с NA-х по умолчанию, когда он видит один, он бросает ряд

как он существует ровно 4129 строк, содержащих NA в исходных данных.

Это разница между этими двумя числами:

length(Y) 
[1] 647054 

nrow(sparse_matrix) 
[1] 642925 

Причина это работает на предыдущих примерах следующим образом

В биномиальной случае:

его рециркуляции Y и заканчивая отсутствующими ярлыками. (Это BAD)

В случайном лесном случае:

(я думаю), это потому, что я случайный лес никогда не использует предсказания из предыдущих деревьев, так что эта ошибка будет невидимым. (Это BAD)

Вынос:

Ни в одном из предыдущих примеров, которые работают обучат хорошо

sparse.model.matrix капли NA-х вы теряете строки в данных учебных, это большая проблема и потребности подлежащее рассмотрению

Удачи!

Смежные вопросы