2016-09-28 6 views
3

У меня есть большой набор данных, состоящий из факторных переменных, числовых переменных и целевого столбца. Я пытаюсь правильно загрузить 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.

Пожалуйста, помогите. Заранее спасибо.

+0

Почему вы хотите сделать разреженную матрицу, если у вас есть только три предиктора? Во-вторых, 'xgboost' принимает только числовые функции. – mtoto

+1

1. В моем реальном наборе данных имеется 185 предсказателей и 70000 наблюдений. 2. xgboost принимает категориальные переменные (я думаю) при изменении на числовую форму (0,1), как это сделал Ive. – Windstorm1981

+2

Вы можете просто использовать 'options (na.action = 'na.pass'); sm <-sparse.model.matrix (target ~., df) ', затем загрузите его в' xgboost'. Редкая матрица будет содержать не пропущенные значения в любом случае для ваших фиктивных переменных. Для непрерывных варов изучается недостающее (по умолчанию) направление. – mtoto

ответ

0

options(na.action='na.pass') Как упомянуто @mtoto, это лучший способ справиться с этой проблемой. Он будет следить за тем, чтобы вы не потеряли данные при построении матрицы модели.

В частности, реализация XGBoost; в случае НС, проверьте увеличение коэффициента усиления при выполнении расщепления при выращивании дерева. Так, например, если разделение без учета NA определяется как переменная var1 (диапазон [0,1]) значение 0,5, то оно рассчитывает коэффициент усиления, учитывая, что var1 NA равны < 0,5 и> 0,5.В любом направлении разделения он получает больший выигрыш, он связывает NAs с этим разделенным направлением. Таким образом, у NA теперь есть диапазон [0,0.5] или [0.5,1], но не присвоено ему фактическое значение (то есть вменено). См. (Автор оригинала tqchen comment от 12 августа 2014 года).

Если вы являетесь imputing -99xxx, тогда вы ограничиваете способность алгоритма изучать правильный диапазон NA (условно для меток).