我正在尝试使用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个类别:
- 您的代码中可能某个地方出了问题。需要更多信息来确定具体出了什么问题。
希望这对您有帮助。