R:XGBoost和功能哈希。 MError持续增加

时间:2018-10-11 15:08:28

标签: r machine-learning classification xgboost multilabel-classification

我正在处理一个有500多个类的多分类问题。数据与餐厅菜单相关,我的目标是根据商品名称和所属类别对商品进行分类。我在R中使用FeatureHashing库来散列项目名称和类别字段。然后使用XGBoost作为我的模型。由于某种原因,尽管每次迭代迭代误差都会增加。数据集非常大...> 200万行。奇怪的是,当我使用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 :(得分:0)

这是正在发生的事情...

当训练像样本中一样的非常小的数据集时(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

在没有约束性超参数的情况下运行代码时,应该很好地拟合!