【问题标题】:XGBoostError: value 0 for Parameter num_class should be greater equal to 1XGBoostError:参数 num_class 的值 0 应大于等于 1
【发布时间】:2020-06-06 00:01:36
【问题描述】:

我正在尝试比较两个不同的功能集,以将客户分为高价值、中价值和低价值。这是我使用的代码:

ltv_xgb_model = xgb.XGBClassifier(max_depth=5, learning_rate=0.1,objective='multi:softmax',n_jobs=-1).fit(X_train, y_train)        

第一个数据集在训练数据中有 11 个客户,在测试数据中有 2 个客户。尽管客户数量有限,但分类器能够为其中一个特征集实现 50% 的精度。

第二个数据集在训练数据中有 14 个客户,在测试数据中有 2 个客户。虽然我们有更大的训练集,但分类器抛出了一个错误:

XGBoostError: 参数 num_class 的值 0 应该大于等于 1

论坛上之前的帖子提到过.fit() 方法会自动设置num_class 参数。见这里:XGBClassifier num_class is invalid。因此,问题似乎是由其他原因引起的。

有人知道问题出在哪里吗?任何帮助表示赞赏!

【问题讨论】:

    标签: python xgboost xgbclassifier


    【解决方案1】:

    原因是因为 XGBoost 会根据您提供的训练数据推断类数。对于multi:softmax,最小类数应为 3(如果您有 2 个类,则应使用二元分类目标)。所以这里的问题很可能是,在您的数据集中,您只有 2 个或更少的唯一值作为目标。

    通常,数据集的 11 和 14 个元素非常小。我强烈建议不要以这种规模训练 ML 模型。如果你想用很少的训练样本真正检查你的模型有多好,你应该做完整的留一交叉验证(即在没有一个例子的情况下以同样的方式训练一个模型,并在那个例子上测试得到的模型) .如果结果对您来说看起来不错(但很可能不会) - 那么您可以在完整数据集上训练模型并使用该模型。

    【讨论】:

    • 非常感谢您的回答。我确实有三个班。尽管如此,将目标更改为binary:logistic 还是有效的。可能训练数据的大小是如此之小,以至于某些类没有在其中得到它们的表示。我也会尝试留一法交叉验证。
    • 不客气。除了接受之外,请考虑对答案进行投票。
    猜你喜欢
    • 2017-02-28
    • 2019-12-23
    • 2018-01-26
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多