使用 LightGBM 进行多类分类
Multiclass Classification with LightGBM
我正在尝试在 Python 中使用 LightGBM 为多 class Class 化问题(3 Classes)建模 classifier .我使用了以下参数。
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
中的每个列表代表 class 概率,我使用 np.argmax()
找到了这样的 classes..
predictions = []
for x in preds:
predictions.append(np.argmax(x))
在分析预测时,我发现我的预测只包含 2 classes - 0 和 1。Class 2 是训练集中第二大 class,但它在预测中无处可寻。在评估结果时,它给出了大约 78%
的准确性。
那么,为什么我的模型没有预测 class 2 个案例?我使用的参数有什么问题吗?
这不是解释模型做出的预测的正确方法吗?我应该对参数进行任何更改吗??
解决方法是:
best_preds_svm = [np.argmax(line) for line in preds]
然后你可以打印出最合理结果的class。
从您提供的输出来看,预测似乎没有任何错误。
模型根据您提供的第一个输出产生三个概率 [7.93856847e-06 9.99989550e-01 2.51164967e-06] class 2 的概率更高,所以我可以'在这里看不到问题。
Class0是第一个class,class1其实是class2是第二个class,2是第三个class.所以我想没什么问题。
尝试通过交换 classes 0 和 2 进行故障排除,然后重新运行 训练和预测过程。
如果新预测仅包含 classes 1 和 2(最有可能给定您提供的数据):
- 分类器可能还没有学会第三个class;也许它的功能与较大的 class 的功能重叠,并且 classifier 默认为较大的 class 以最小化 objective 功能。尝试提供平衡的训练集(每个 class 的样本数量相同)并重试。
如果新预测确实包含所有 3 个 classes:
- 您的代码某处出错了。需要更多信息才能确定到底出了什么问题。
希望对您有所帮助。
import pandas as pd
pd.DataFrame(preds).apply(lambda x: np.argmax(x), axis=1)
我正在尝试在 Python 中使用 LightGBM 为多 class Class 化问题(3 Classes)建模 classifier .我使用了以下参数。
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
中的每个列表代表 class 概率,我使用 np.argmax()
找到了这样的 classes..
predictions = []
for x in preds:
predictions.append(np.argmax(x))
在分析预测时,我发现我的预测只包含 2 classes - 0 和 1。Class 2 是训练集中第二大 class,但它在预测中无处可寻。在评估结果时,它给出了大约 78%
的准确性。
那么,为什么我的模型没有预测 class 2 个案例?我使用的参数有什么问题吗?
这不是解释模型做出的预测的正确方法吗?我应该对参数进行任何更改吗??
解决方法是:
best_preds_svm = [np.argmax(line) for line in preds]
然后你可以打印出最合理结果的class。
从您提供的输出来看,预测似乎没有任何错误。
模型根据您提供的第一个输出产生三个概率 [7.93856847e-06 9.99989550e-01 2.51164967e-06] class 2 的概率更高,所以我可以'在这里看不到问题。
Class0是第一个class,class1其实是class2是第二个class,2是第三个class.所以我想没什么问题。
尝试通过交换 classes 0 和 2 进行故障排除,然后重新运行 训练和预测过程。
如果新预测仅包含 classes 1 和 2(最有可能给定您提供的数据):
- 分类器可能还没有学会第三个class;也许它的功能与较大的 class 的功能重叠,并且 classifier 默认为较大的 class 以最小化 objective 功能。尝试提供平衡的训练集(每个 class 的样本数量相同)并重试。
如果新预测确实包含所有 3 个 classes:
- 您的代码某处出错了。需要更多信息才能确定到底出了什么问题。
希望对您有所帮助。
import pandas as pd
pd.DataFrame(preds).apply(lambda x: np.argmax(x), axis=1)