使用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进行了标签编码。我在运行cv并使用early_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))

在分析预测结果时,我发现我的预测仅包含两个类别 – 0和1。类别2在训练集中是第二大类,但在预测中却完全没有出现.. 在评估结果时,准确率约为78%

那么,为什么我的模型在任何情况下都没有预测出类别2呢?我的参数设置是否有问题?

这不是解释模型预测结果的正确方法吗?我是否需要对参数进行任何修改?


回答:

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

如果新的预测结果仅包含类别1和2(根据您提供的数据,这很可能发生):

  • 分类器可能没有学会第三个类;或许它的特征与某个较大的类的特征重叠,分类器为了最小化目标函数而默认选择较大的类。尝试提供一个平衡的训练集(每个类别的样本数量相同)并重新尝试。

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

  • 您的代码中可能某个地方出了问题。需要更多信息来确定具体出了什么问题。

希望这对您有帮助。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注