У меня есть большой набор данных, состоящий из факторных переменных, числовых переменных и целевого столбца. Я пытаюсь правильно загрузить xgboost с целью создания xgb.Matrix и обучения модель.Подготовка данных с NA для разреженной матрицы и XGBOOST
Я запутался в правильной обработке, чтобы получить мою фреймворк в объект xgb.DMatrix. В частности, у меня есть NA как в числовых переменных, так и в числовых переменных, и я хочу сделать sparse.model.matrix из моего фреймворка данных перед созданием xgb.Matrix. Правильное обращение с НС действительно меня перепутало.
У меня есть следующий образец данных df
, состоящий из одной двоичной категориальной переменной, двух непрерывных переменных и цели. категорический переменная и одна непрерывная переменная Nas
'data.frame': 10 obs. of 4 variables:
$ v1 : Factor w/ 2 levels "0","1": 1 2 2 1 NA 2 1 1 NA 2
$ v2 : num 3.2 5.4 8.3 NA 7.1 8.2 9.4 NA 9.9 4.2
$ v3 : num 22.1 44.1 57 64.2 33.1 56.9 71.2 33.9 89.3 97.2
$ target: Factor w/ 2 levels "0","1": 1 1 2 2 1 1 1 2 1 1
v1 v2 v3 target
1 0 3.2 22.1 0
2 1 5.4 44.1 0
3 1 8.3 57.0 1
4 0 NA 64.2 1
5 <NA> 7.1 33.1 0
6 1 8.2 56.9 0
7 0 9.4 71.2 0
8 0 NA 33.9 1
9 <NA> 9.9 89.3 0
10 1 4.2 97.2 0
sparse.model.matrix
из matrix
библиотеки не будет принимать Nas. Он устраняет строки (которых я не хочу). Так что нужно изменить Nas к цифровой замены как -999
, если я использую простую команду:
df[is.na(df)] = -999
он заменяет только Nas в числовых столбцах:
v1 v2 v3 target
1 0 3.2 22.1 0
2 1 5.4 44.1 0
3 1 8.3 57.0 1
4 0 -999.0 64.2 1
5 <NA> 7.1 33.1 0
6 1 8.2 56.9 0
7 0 9.4 71.2 0
8 0 -999.0 33.9 1
9 <NA> 9.9 89.3 0
10 1 4.2 97.2 0
Поэтому я сначала (думаю, я) должен изменить переменные факторов на числовые, а затем сделать замену. Делать это я получаю:
v1 v2 v3 target
1 1 3.2 22.1 0
2 2 5.4 44.1 0
3 2 8.3 57.0 1
4 1 -999.0 64.2 1
5 -999 7.1 33.1 0
6 2 8.2 56.9 0
7 1 9.4 71.2 0
8 1 -999.0 33.9 1
9 -999 9.9 89.3 0
10 2 4.2 97.2 0
но преобразование переменного фактора обратно к фактору (я думаю, что это необходимо так xgboost позже знает его фактор) я получаю три уровня:
data.frame': 10 obs. of 4 variables:
$ v1 : Factor w/ 3 levels "-999","1","2": 2 3 3 2 1 3 2 2 1 3
$ v2 : num 3.2 5.4 8.3 -999 7.1 8.2 9.4 -999 9.9 4.2
$ v3 : num 22.1 44.1 57 64.2 33.1 56.9 71.2 33.9 89.3 97.2
$ target: Factor w/ 2 levels "0","1": 1 1 2 2 1 1 1 2 1 1
I В конечном итоге не уверен, что создание sparse.model.matrix и в конечном итоге объект xgb.matrix будет иметь смысл, потому что v1 появляется испорченным.
Чтобы сделать дела более запутанными, xgb.Dmatrix()
имеет аргумент missing
, что я могу использовать, чтобы определить числовые значения (-999), которые представляют собой Nas. Но это может использоваться только для плотной матрицы. Если бы я представил плотную матрицу, я бы получил , и это не понадобилось бы. Однако в разреженной матрице , где у меня есть -999s, я не могу ее использовать.
Надеюсь, я не пропущу что-то легкое. Был через xgboost.pdf экстенсивно и посмотрел на Google.
Пожалуйста, помогите. Заранее спасибо.
Почему вы хотите сделать разреженную матрицу, если у вас есть только три предиктора? Во-вторых, 'xgboost' принимает только числовые функции. – mtoto
1. В моем реальном наборе данных имеется 185 предсказателей и 70000 наблюдений. 2. xgboost принимает категориальные переменные (я думаю) при изменении на числовую форму (0,1), как это сделал Ive. – Windstorm1981
Вы можете просто использовать 'options (na.action = 'na.pass'); sm <-sparse.model.matrix (target ~., df) ', затем загрузите его в' xgboost'. Редкая матрица будет содержать не пропущенные значения в любом случае для ваших фиктивных переменных. Для непрерывных варов изучается недостающее (по умолчанию) направление. – mtoto