Случайный лес xgboost с разреженными матричными данными и полиномиальным Y

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

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

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")

  • Полиномиальные (мультиклассовые) модели зависимых переменных через 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

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

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

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

1 ответ

Решение

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

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

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-вектора и заполнение недостающих меток. (это плохо)

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

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

вынос:

Ни один из предыдущих примеров этой работы не будет хорошо тренироваться

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

Удачи!

Другие вопросы по тегам