xgboost错误 - 当我的标签已经是数字时,标签必须在[0,1]中,我需要的结果是数字不在0,1

时间:2017-08-26 09:15:57

标签: r label regression data-science xgboost

我使用xgboost来表示回归问题,但我得到的错误是关于响应变量,即输出销售,它在课堂上最初是数字但是因为我使用xgboost它显示错误但是我只想要以数字形式输出< / p>

labels <- train$Item_Outlet_Sales# train label
ts_label <- test$Item_Outlet_Sales  # test label

# converted into matrix ( one hot encoding )
new_tr <- model.matrix(~.+0,data = train[,-c("Item_Outlet_Sales"),with=F])
new_ts <- model.matrix(~.+0,data = test[,-c("Item_Outlet_Sales"),with=F])

## checking class
class(labels)
[1] "numeric"

我在test中创建了标签或响应变量  test$Item_Outlet_Sales <- NA

class(test$Item_Outlet_Sales)
[1] "logical"

# coverting `ts_label` into numeric as it initially is logical
ts_label <- as.numeric(ts_label)-1
class(ts_label)
[1] "numeric"

现在

 dtrain1 <- xgb.DMatrix(data = new_tr,label = labels) 
 dtest1 <- xgb.DMatrix(data = new_ts,label= ts_label)

 xgbmodel1 = xgb.train(data=dtrain1, nround=150, max_depth=5, eta=0.1,  subsample=0.9, 
                       objective="reg:logistic", booster="gbtree", eval_metric="rmse")

错误 -

Error in xgb.iter.update(bst$handle, dtrain, iteration - 1, obj) : 
  [14:08:41] amalgamation/../src/objective/regression_obj.cc:108: 
  label must be in [0,1] for logistic regression

我用过这个:

xgbmodel1 = xgb.train(data=dtrain1, nround=150, max_depth=5, eta=0.1,  subsample=0.9, 
                      objective="reg:linear", booster="gbtree", eval_metric="rmse")

我得到的响应变量的所有值都等于-1,而我的rmse得分是无限的......

请告诉我如何在这种情况下有效实施xgboost,即使是默认条件,也不会出现错误。

我在这个数据集中有4个分类变量。

这是火车数据集的子集

当然,r&lt; - train [1:3,]

r

Item_Identifier Item_Fat_Content Item_Type Item_MRP Outlet_Identifier 1:FDA15低脂乳制品249.8092 OUT049 2:DRC01常规软饮料48.2692 OUT018 3:FDN15低脂肪肉141.6180 OUT049    Outlet_Establishment_Year Outlet_Location_Type Outlet_Type Item_Outlet_Sales 1:1999 Tier 1 Supermarket Type1 3735.1380 2:2009 Tier 3 Supermarket Type2 443.4228 3:1999 Tier 1 Supermarket Type1 2097.2700    Item_Weight Item_Visibility Outlet_Size 1:9.30 0.01604730 2 2:5.92 0.01927822 2 3:17.50 0.01676007 2

1 个答案:

答案 0 :(得分:3)

我在这里看到两个问题:

  1. 算法要求标签为0或1。相反,您的代码将它们设置为值0或-1。更正您定义ts_label变量的行,如下所示:

    ts_label <- as.numeric(ts_label)
    
  2. 您有二进制目标和分类预测变量。你为什么要做逻辑回归?我认为“二元:逻辑”可能是一个更好的目标。 “reg:linear”毫无意义,你的损失函数应该基于准确性而不是rmse。