Случайный лес xgboost с разреженными матричными данными и полиномиальным Y
Я не уверен, если xgboost
Многие полезные функции могут быть объединены так, как мне нужно (?), но я пытаюсь запустить случайный лес с разреженными предикторами данных для зависимой от нескольких классов переменной.
я знаю это xgboost
может сделать любую 1 из этих вещей:
- Случайный лес через тонкую настройку
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")
- Полиномиальные (мультиклассовые) модели зависимых переменных через
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, вы теряете строки в ваших тренировочных данных, это большая проблема, и ее необходимо решить
Удачи!