我正在尝试使用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
运行eartly_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是训练集中的第2大类,但在预测中无处可寻。在评估结果时给出了78%
准确度。
那么,为什么我的模型没有为任何一个案例预测第2类。我使用的参数有什么不对吗?
这不是模型进行解释预测的正确方法吗?我应该对参数进行任何更改。??
答案 0 :(得分:2)
尝试通过交换0和2类进行故障排除,并重新运行训练和预测过程。
如果新预测仅包含第1类和第2类(最有可能是您提供的数据):
如果新预测确实包含所有3个类:
希望这有帮助。
答案 1 :(得分:0)
从您提供的输出中,预测中似乎没有任何错误。
该模型在您显示时产生三个概率,并且仅从您提供的第一个输出中产生[7.93856847e-06 9.99989550e-01 2.51164967e-06]第2类具有更高的概率,因此我无法看到问题这里。
Class 0是第一个类,class 1实际上是class 2的第二个类,2是第三个类。所以我猜没有错。
答案 2 :(得分:-1)
解决方案是:
best_preds_svm = [np.argmax(line) for line in preds]
然后你可以打印出最合理的课程。
答案 3 :(得分:-2)
import pandas as pd
pd.DataFrame(preds).apply(lambda x: np.argmax(x), axis=1)