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

时间:2019-03-05 08:03:39

标签: python machine-learning classification xgboost

我收集了有关产品在发布管道中发布需要多长时间的数据。到目前为止,有95%的数据花费了不到400分钟的时间[异常值= 0]。然后,5%的数据在[700,40 000]分钟之间[异常值= 1]。我想使用xgboost构建一个分类器,该分类器可以预测事件是否为“异常值”。事实是,异常值非常罕见,我有大约200个数据点是异常值,而3200个数据点不是异常值。

当前,无需调整,我的模型就可以预测98%的[异常值= 0]案例和67%的[异常值= 1]案例。对我来说,重要的是,该模型在检测[离群值= 0]时不会表现较差,因为95%的数据都在此集中,但是我想看看我是否仍可以调整模型以提高检测在[离群值= 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最小化。任何人都知道如何在调整参数期间构造这样的评估指标?

1 个答案:

答案 0 :(得分:1)

首先,如果按原样保留数据集,则最有可能总是会低估[离群值= 1]类,因为在未知情况下,预测[离群值= 0]的性能更好,你似乎明白了。

您可以执行一些简单的操作:

  • 在过度代表类的抽样中: 假设您有200个[离群值= 1],则可以随机抽取200 ish [离群值= 0]。但是,看来数据量太少了。不过,它很容易实现,因此您可以尝试一下。

  • 以下代表类的过度采样: 恰好相反,您基本上从[异常值= 1]复制/粘贴数据以得到大致相同的出现次数。

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

现在要进入更高级的知识,您可以尝试自举。有关此技术的更多详细信息,请参见Georges Dupret和Masato Koda的Bootstrap re-sampling for unbalanced data in supervised learning,以获取该方法。这可能有效,并且您可以为此使用sklearn.utils.resample。我发现this tutorial很好。

引导程序是一种重采样方法,因此您可以使用多个平衡数据集进行训练。不过,您必须注意过度拟合。

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

最后,您可以使用“罚分算法”,从本质上讲,这使得最少表示类的错误(此处为[outlier = 1])的代价更高。它有时用于医疗应用,您宁愿让患者被误诊为生病而不是相反。

great article that sums it all up是必读内容。