如何评价xgboost分类模型稳定性
How to evaluate the xgboost classification model stability
我有:
- Python xgboost分类模型
- 自 2018 年初以来的每周数据集(分类基础)。每个数据集大约有 10 万行和 70 列(特征)。
- 通过 xgboost 模型(使用逻辑回归)对数据集的每周预测结果,格式为:
- date of modelling
- items
- test_auc_mean for each item (in percentage).
自 2018 年 1 月以来,总共有大约 100 个数据集和 100 个 prediction_results。
为了评估模型,我使用以下指标:
-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 在 .94 和 .96 之间)
问题是某些特定项目的预测可变性非常高(今天一个项目是积极的,明天一个项目是消极的,后天 - 再次积极)
我想评估模型的稳定性。换句话说,我想知道它生成了多少具有可变结果的项目。最后,我想确保该模型将产生波动最小的稳定结果。
你有什么想法如何做到这一点?
这正是交叉验证的目标。既然你已经做到了,你只能评价你的评价指标的标准差,你也已经做到了...
您可以尝试一些新指标,如精度、召回率、f1 分数或 fn 分数,以不同方式衡量成功和失败,但看起来您几乎没有解决方案。您依赖于您在此处输入的数据:s
您可以花一些时间训练人口分布,并尝试确定人口的哪一部分随时间波动。
您也可以尝试预测概率而不是分类来评估模型是否远高于其阈值。
最后两个解决方案更像是副解决方案。 :(
格温达尔,谢谢你。
您会指定您提到的 2 种方法吗?
1)如何训练人口分布?通过 K-Clustering 或其他无监督学习方法?
2)例如I predicted_proba(1 个特定项目的图表 - 在附件中)。我如何评估模型是否远高于其阈值?通过比较 predicted_proba 每个项目与其真实标签(例如 predict_proba = 0.5 和标签 = 1)?
我有:
- Python xgboost分类模型
- 自 2018 年初以来的每周数据集(分类基础)。每个数据集大约有 10 万行和 70 列(特征)。
- 通过 xgboost 模型(使用逻辑回归)对数据集的每周预测结果,格式为:
- date of modelling
- items
- test_auc_mean for each item (in percentage).
自 2018 年 1 月以来,总共有大约 100 个数据集和 100 个 prediction_results。
为了评估模型,我使用以下指标:
-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 在 .94 和 .96 之间) 问题是某些特定项目的预测可变性非常高(今天一个项目是积极的,明天一个项目是消极的,后天 - 再次积极)
我想评估模型的稳定性。换句话说,我想知道它生成了多少具有可变结果的项目。最后,我想确保该模型将产生波动最小的稳定结果。 你有什么想法如何做到这一点?
这正是交叉验证的目标。既然你已经做到了,你只能评价你的评价指标的标准差,你也已经做到了...
您可以尝试一些新指标,如精度、召回率、f1 分数或 fn 分数,以不同方式衡量成功和失败,但看起来您几乎没有解决方案。您依赖于您在此处输入的数据:s
您可以花一些时间训练人口分布,并尝试确定人口的哪一部分随时间波动。
您也可以尝试预测概率而不是分类来评估模型是否远高于其阈值。
最后两个解决方案更像是副解决方案。 :(