我如何构建自己的评估指标,以最大限度地减少使用XGBoost的高度不平衡类的测试错误?

问题描述 投票:1回答:1

我收集了有关在发布管道中发布产品所需时间的数据。到目前为止,95%的数据耗时<400分钟[异常值= 0]。然后5%的数据在[700,40000]分钟[离群值= 1]之间。我想使用xgboost构建一个分类器,它可以预测一个事件是否会成为“异常值”。问题是,异常值非常罕见,我有大约200个数据点,它们是异常值,3200个数据点不是。

目前,在没有调整的情况下,我的模型可以预测98%的[离群值= 0]个案和67%的[异常值= 1]。对我来说重要的是模型在检测[outlier = 0]时表现不佳,因为95%的数据都在这个集合中,但我想看看我是否仍然可以调整模型来提高检测性能[outlier = 1]。

所以我有两个变量:

      ratio_wrong_0 = len(predicted_wrong_0) / len(true_0)
      ratio_wrong_1 = len(predicted_wrong_1) / len(true_1)

所以我想保持ratio_wrong_0低于5%并同时最小化ratio_wrong_1。任何人都知道如何在调整我的参数期间构建这样的评估指标?

python machine-learning classification xgboost
1个回答
1
投票

首先,如果你按原样保留数据集,你很可能总是倾向于预测[outlier = 1]类,因为如果未知,预测[outlier = 0]会更好地表现性能,你似乎了解。

你可以做一些简单的事情:

  • 在过度代表类的抽样中:如果你有200 [异常值= 1],你可以随机取200-ish [outlier = 0]。但是,似乎数据的数量太少。它很容易实现,所以你可能想尝试一下。
  • 欠代表类的过度采样:完全相反,您基本上从[outliers = 1]复制/粘贴数据以获得大致相同的出现次数。

这些方法通常被认为是等效的,但在您的情况下,我认为过采样会导致过度拟合。由于两个类都没有相同范围的可能值,并且在[700,4000]的范围内,200个数据点不足以进行适当的泛化。

现在要进入更高级的东西,你可以尝试跳鞋。有关此技术的更多详细信息,请参阅Georges Dupret和Masato Koda撰写的Bootstrap re-sampling for unbalanced data in supervised learning方法。这可以工作,你可以使用sklearn.utils.resample。我发现this tutorial相当不错。

Bootstrapping是一种重采样方法,您可以使用多个平衡数据集进行训练。但是你必须要小心过度拟合。

关于使用的指标,您希望使用AUROC,ROC或Precision / Recall。你可以读一个不错的article on what metrics to use for unbalanced datasets

最后,你可以使用Penalize Algorithms,它本质上使得最少代表classe(这里[outlier = 1])的错误更加昂贵。它有时用于医疗应用,在这种情况下,您宁愿让患者被诊断为生病而不是相反。

这个great article that sums it all up是必读的。

© www.soinside.com 2019 - 2024. All rights reserved.