R: XGBoost и хеширование функций.MError продолжает расти - PullRequest
0 голосов
/ 11 октября 2018

Я работаю над проблемой мультиклассификации с более чем 500 классами.Данные относятся к меню ресторана, и моя цель состоит в том, чтобы классифицировать элемент на основе имени элемента и категории, к которой он принадлежит.Я использую библиотеку FeatureHashing в R для хэширования полей имени элемента и категории.Затем используя XGBoost в качестве моей модели.По какой-то причине ошибка поезда увеличивается с каждой итерацией.Набор данных очень большой ...> 2 миллиона строк.Странно то, что когда я работал в Azure ML и выполнял хэширование объектов того же типа и использовал модель случайного леса, я смог достичь точности обучения на уровне около 80%.Я не уверен, что я делаю неправильно.Вот пример кода

## libraries
library(tidyverse)
library(FeatureHashing)
library(xgboost)

## sample data
df <- data.frame(
      item_name=c('jose cuervo', 'chicken with shrimp', 'lasagna',
            'oreos', 'chicken marsala', 'beef stew'),
      category=c('adult beverage', 'chicken dish', 'pasta',
         'dessert', 'chicken dish', 'soup'),
       target=c(0, 1, 2, 3, 1, 4)
)

## hashing function
f <- ~ category + split(item_name, delim=" ")

## hash features
hashed.mat <- hashed.model.matrix(f, df, hash.size=2^6)

## define some model parameters
num.class <- df$target %>% unique() %>% length()
target <- df$target

## xgboost paramters
xgb.params <- list(booster='gbtree',
                   objective='multi:softmax',
                   num_class=num.class,
                   eta=0.3,
                   gamma=0,
                   max_depth=6,
                   min_child_weight=1,
                   subsample=1,
                   colsample_bytree=1)

## fit model
xgb.fit <- xgboost(hashed.mat, target, params=xgb.params, nrounds=10,
               verbose=1, print_every_n = 1)

here is what the error is doing

1 Ответ

0 голосов
/ 16 октября 2018

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

Когда вы тренируете очень маленький набор данных, как вы в выборке (6 строк)

Параметр min_child_weight=1 предотвращает расщепление - так что у вас нет обучения модели.

установите min_child_weight=0, затем обучите ...

вы должны увидеть это (это ваши данные и ваш код сmin_child_weight=0) ...

> xgb.fit <- xgboost(hashed.mat, target, params=xgb.params, nrounds=12,
+                    verbose=1, print_every_n = 1)
[1] train-merror:0.000000 
[2] train-merror:0.000000 
[3] train-merror:0.000000 
[4] train-merror:0.000000 
[5] train-merror:0.000000 
[6] train-merror:0.000000 
[7] train-merror:0.000000 
[8] train-merror:0.000000 
[9] train-merror:0.000000 
[10]    train-merror:0.000000 
[11]    train-merror:0.000000 
[12]    train-merror:0.000000 

Чтобы наблюдать, что произошло, сделайте это, это показывает вам обучение:

> xgb.model.dt.tree(model = xgb.fit)
     Tree Node   ID Feature         Split  Yes   No Missing     Quality     Cover
  1:    0    0  0-0       5 -9.536743e-07  0-1  0-2     0-1  0.85576522 1.9200001
  2:    0    1  0-1    Leaf            NA <NA> <NA>    <NA> -0.03846154 1.6000001
  3:    0    2  0-2    Leaf            NA <NA> <NA>    <NA>  0.06060606 0.3200000
  4:    1    0  1-0       4 -9.536743e-07  1-1  1-2     1-1  1.62249923 1.9200001
  5:    1    1  1-1    Leaf            NA <NA> <NA>    <NA> -0.03508772 1.2800001
 ---                                                                             
176:   58    1 58-1    Leaf            NA <NA> <NA>    <NA> -0.03234537 1.2372975
177:   58    2 58-2    Leaf            NA <NA> <NA>    <NA>  0.04115688 0.4767628
178:   59    0 59-0      10 -9.536743e-07 59-1 59-2    59-1  0.47927150 1.7140603
179:   59    1 59-1    Leaf            NA <NA> <NA>    <NA> -0.03234537 1.2372975
180:   59    2 59-2    Leaf            NA <NA> <NA>    <NA>  0.04115688 0.4767628

.

Когда вы запускаете код без ограничивающего гиперпараметра, следует красиво переопределить!

...