使用 LightGBM 进行多类分类

新手上路,请多包涵

我正在尝试在 Python 中使用 LightGBM 为多类分类问题(3 类)建模分类器。我使用了以下参数。

 params = {'task': 'train',
    'boosting_type': 'gbdt',
    'objective': 'multiclass',
    'num_class':3,
    'metric': 'multi_logloss',
    'learning_rate': 0.002296,
    'max_depth': 7,
    'num_leaves': 17,
    'feature_fraction': 0.4,
    'bagging_fraction': 0.6,
    'bagging_freq': 17}

数据集的所有分类特征都是用 LabelEncoder 编码的标签。我在运行 cveartly_stopping 后训练了模型,如下所示。

 lgb_cv = lgbm.cv(params, d_train, num_boost_round=10000, nfold=3, shuffle=True, stratified=True, verbose_eval=20, early_stopping_rounds=100)

nround = lgb_cv['multi_logloss-mean'].index(np.min(lgb_cv['multi_logloss-mean']))
print(nround)

model = lgbm.train(params, d_train, num_boost_round=nround)

训练后,我用这样的模型做了预测,

 preds = model.predict(test)
print(preds)

我得到了一个嵌套数组作为这样的输出。

 [[  7.93856847e-06   9.99989550e-01   2.51164967e-06]
 [  7.26332978e-01   1.65316511e-05   2.73650491e-01]
 [  7.28564308e-01   8.36756769e-06   2.71427325e-01]
 ...,
 [  7.26892634e-01   1.26915179e-05   2.73094674e-01]
 [  5.93217601e-01   2.07172044e-04   4.06575227e-01]
 [  5.91722491e-05   9.99883828e-01   5.69994435e-05]]

因为 preds 中的每个列表代表我使用的类概率 np.argmax() 来找到这样的类..

 predictions = []

for x in preds:
    predictions.append(np.argmax(x))

在分析预测时,我发现我的预测仅包含 2 个类 - 0 和 1。第 2 类是训练集中第二大类,但在预测中无处可寻。在评估结果时它给出了 78% 准确性。

那么,为什么我的模型没有预测任何案例的第 2 类。?我使用的参数有什么问题吗?

这不是对模型进行解释预测的正确方法吗?我应该对参数进行任何更改吗??

原文由 Sreeram TP 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

通过交换 0 类和 2 类并重新运行训练和预测过程来尝试排除故障。

如果新预测仅包含第 1 类和第 2 类(很可能给定您提供的数据):

  • 分类器可能没有学过第三类;也许它的特征与较大类的特征重叠,并且分类器默认为较大类以最小化目标函数。尝试提供平衡的训练集(每个班级的样本数量相同)并重试。

如果新预测确实包含所有 3 个类别:

  • 您的代码某处出错了。需要更多信息来确定到底出了什么问题。

希望这可以帮助。

原文由 kwypston 发布,翻译遵循 CC BY-SA 4.0 许可协议

从您提供的输出来看,预测似乎没有错。

如您所示,该模型会产生三个概率,并且仅根据您提供的第一个输出 [ 7.93856847e-06 9.99989550e-01 2.51164967e-06] ,第 2 类的概率更高,所以我看不到这里的问题。

0级就是一级,1级其实就是2级二级,2级就是三级。所以我想没什么不对的。

原文由 amany 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题