我正在处理一个有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)
答案 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
。
在没有约束性超参数的情况下运行代码时,应该很好地拟合!