Ошибка xgboost в r studio ("" данные "имеют класс" символ "и длину ...")

У меня возникают трудности с подгонкой моих данных к модели классификатора xgboost. Когда я запускаю это:

classifier = xgboost(data = as.matrix(training_set[c(4:15, 17:18,20:28)]), 
  label = training_set$posted_ind, nrounds = 10)

R Studio сообщает мне:

Error in xgb.DMatrix(data, label = label, missing = missing) : 
'data' has class 'character' and length 1472000.
'data' accepts either a numeric matrix or a single filename. 

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

xgboost принимает ввод только в формате данных xgb.DMatrix, но не в матричном формате.
user2974951 14.09.2018 08:15
3
1
5 104
2

Ответы 2

Убедитесь, что в вашем "training_set" нет столбцов, которые являются факторами. Если вы закодировали категориальные переменные как числовые, но отобрали их как факторы, вы получите эту ошибку.

В этом и заключается моя проблема. Но нет никакого эффективного способа избавиться от этого.

Charlotte Deng 05.07.2020 00:42

Я столкнулся с той же проблемой и нашел полное решение. Вы должны использовать:

sparse_matrix <- sparse.model.matrix(label_y ~ ., data = df)[,-1]
X_train_dmat = xgb.DMatrix(sparse_matrix, label = df$label)

Это преобразует категориальные данные в фиктивные переменные. Существует несколько методов кодирования, например, горячее кодирование является распространенным подходом. Выше приведено фиктивное контрастное кодирование, которое популярно, потому что оно обеспечивает кодирование «полного ранга» (также см. Это сообщение в блоге Макса Куна).

Цель состоит в том, чтобы преобразовать каждое значение каждой категориальной характеристики в двоичную функцию {0, 1}.

Например, столбец Treatment будет заменен двумя столбцами, TreatmentPlacebo и TreatmentTreated. Каждый из них будет бинарным. Следовательно, наблюдение, которое имеет значение Placebo в столбце Treatment до преобразования, будет иметь после преобразования значение 1 в новом столбце TreatmentPlacebo и значение 0 в новом столбце TreatmentTreated. Столбец TreatmentPlacebo исчезнет во время кодирования контраста, так как он будет поглощен общим постоянным столбцом пересечения.

Источник: https://cran.r-project.org/web/packages/xgboost/vignettes/discoverYourData.html#conversion-from-categorical-to-numeric-variables

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