如何评估xgboost分类模型的稳定性
Posted
技术标签:
【中文标题】如何评估xgboost分类模型的稳定性【英文标题】:How to evaluate the xgboost classification model stability 【发布时间】:2020-02-05 21:20:35 【问题描述】:我有:
-
Python xgboost 分类模型
自 2018 年初以来的每周数据集(分类基础)。每个数据集大约有 10 万行和 70 列(特征)。
通过 xgboost 模型(使用逻辑回归)对数据集的每周预测结果,格式为:
- date of modelling
- items
- test_auc_mean for each item (in percentage).
自 2018 年 1 月以来,总共有大约 100 个数据集和 100 个预测结果。
为了评估模型,我使用以下指标:
-auc
-混淆矩阵
-准确度
param =
'num_parallel_tree':num_parallel_tree,
'subsample':subsample,
'colsample_bytree':colsample_bytree,
'objective':objective,
'learning_rate':learning_rate,
'eval_metric':eval_metric,
'max_depth':max_depth,
'scale_pos_weight':scale_pos_weight,
'min_child_weight':min_child_weight,
'nthread':nthread,
'seed':seed
bst_cv = xgb.cv(
param,
dtrain,
num_boost_round=n_estimators,
nfold = nfold,
early_stopping_rounds=early_stopping_rounds,
verbose_eval=verbose,
stratified = stratified
)
test_auc_mean = bst_cv['test-auc-mean']
best_iteration = test_auc_mean[test_auc_mean == max(test_auc_mean)].index[0]
bst = xgb.train(param,
dtrain,
num_boost_round = best_iteration)
best_train_auc_mean = bst_cv['train-auc-mean'][best_iteration]
best_train_auc_mean_std = bst_cv['train-auc-std'][best_iteration]
best_test_auc_mean = bst_cv['test-auc-mean'][best_iteration]
best_test_auc_mean_std = bst_cv['test-auc-std'][best_iteration]
print('''XGB CV model report
Best train-auc-mean % (std: %)
Best test-auc-mean % (std: %)'''.format(round(best_train_auc_mean * 100, 2),
round(best_train_auc_mean_std * 100, 2),
round(best_test_auc_mean * 100, 2),
round(best_test_auc_mean_std * 100, 2)))
y_pred = bst.predict(dtest)
tn, fp, fn, tp = confusion_matrix(y_test, y_pred>0.9).ravel()
print('''
| neg | pos |
__________________
true_| | |
false| | |
__________________
'''.format(tn, tp, fn, fp))
predict_accuracy_on_test_set = (tn + tp)/(tn + fp + fn + tp)
print('Test Accuracy: %'.format(round(predict_accuracy_on_test_set * 100, 2)))
该模型为我提供了一般情况(通常,auc 介于 0.94 和 0.96 之间) 问题是某些特定项目的预测可变性非常高(今天一个项目是正面的,明天一个项目是负面的,后天 - 又是正面的)
我想评估模型的稳定性。换句话说,我想知道它生成了多少具有可变结果的项目。最后,我想确保该模型将产生稳定的结果,波动最小。 你有一些想法如何做到这一点?
【问题讨论】:
【参考方案1】:这正是交叉验证的目标。既然你已经这样做了,你只能评估你的评估指标的标准差,你也已经这样做了......
您可以尝试一些新指标,例如精确度、召回率、f1 分数或 fn 分数,以不同方式衡量成功和失败,但看起来您几乎没有解决方案。您在这里取决于您的数据输入:s
您可以花一些时间来训练人口分布,并尝试确定人口的哪一部分随时间波动。
您还可以尝试预测概率而不是分类来评估模型是否远高于其阈值。
最后两个解决方案更像是侧面解决方案。 :(
【讨论】:
格温达尔,谢谢。如果数据集的大小很大(10 万行),其他指标会有所帮助吗?我认为,即使我使用交叉验证,每次折叠也会占用数千行,并且会出现水平波动。可能有一些方法可以逐个测量项目的可变性,然后计算不符合要求的百分比。另一个问题是:我应该对稳定性提出什么要求:可能是意外峰值的数量,或者变化的强度,或者变化的频率......【参考方案2】:格温达尔,谢谢。 您能否指定您提到的两种方法。 1)如何训练人口分布?通过 K-Clustering 或其他无监督学习方法? 2) 例如我 predict_proba (1 个特定项目的图表 - 在附件中)。我如何评估模型是否远高于其阈值?通过比较每个项目的 predict_proba 与它的真实标签(例如 predict_proba = 0.5 和 label = 1)?
【讨论】:
第一种方法:人口分布更多的是关于统计分析而不是机器学习。您可以评估初始数据集中的每个特征分布。如果某些分布显示某个特征的一些低表示值,您可以假设(这可能不是事实)这些低表示值可以在您的下一个测试集中。如果这些低代表值再次发生,您的模型将在性能上有一些变化。否则,如果分布很均匀,您甚至可以假设您的模型将保持其性能:) 第二种方法:对于二元分类,没有任何参数调整,阈值确实在0.5。我不确定多类,如果它只是类中最好的一个。如果是这样,您基本上可以区分第一个概率(预测的实际类)和第二个概率。如果 diff 非常小,您有机会在下一次预测中预测类别会发生变化:) 评论您的图表:您当前显示当前预测类别的概率对吗? (你应该有每个目标类的概率)如果它是正确的,你确定这个类每次都被预测(每次最好的概率)?您可以为每个项目计算标准,这意味着,对于每个项目,您可以获得一个 KPI,显示您想要的概率波动,对吗? :) 您可以对获奖类和第二类之间的差异进行相同的计算。通过这两个指标,您确实可以评估模型的一致性。 第二种方法:分类模型的predict_proba方法返回模型的“置信度”返回一个类。它为每个输出类返回一个数组。获奖和第二,是 predict_proba 结果数组中的第一和第二“信心”。 关于图表的评论:CV 不支持每个项目的预测/概率预测。因此,您可以通过 cv 结果分析全局指标的 STD(均在 sklearn 中提供)。然后,对于您当前的模型,您可以随着时间的推移分析第一类的预测概率的标准(由概率排名的第一类,授予分类)以及第一和第二之间的差异。跨度>以上是关于如何评估xgboost分类模型的稳定性的主要内容,如果未能解决你的问题,请参考以下文章
R语言构建文本分类模型:文本数据预处理构建词袋模型(bag of words)构建xgboost文本分类模型xgboost模型预测推理并使用混淆矩阵评估模型可视化模型预测的概率分布
R语言构建xgboost模型并评估模型(测试集训练集每一轮):误分类率指标(misclassification rate)logloss
R语言构建文本分类模型:文本数据预处理构建词袋模型(bag of words)构建xgboost文本分类模型基于自定义函数构建xgboost文本分类模型
新方法基于支持向量机综合分类模型和关键样本集的电力系统暂态稳定评估
R语言螺旋线型线性不可分数据xgboost分类:使用xgboost模型来解决螺旋数据的分类问题可视化模型预测的结果添加超平面区域渲染并与原始数据标签进行对比分析