我收集了有关在发布管道中发布产品所需时间的数据。到目前为止,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。任何人都知道如何在调整我的参数期间构建这样的评估指标?
首先,如果你按原样保留数据集,你很可能总是倾向于预测[outlier = 1]类,因为如果未知,预测[outlier = 0]会更好地表现性能,你似乎了解。
你可以做一些简单的事情:
这些方法通常被认为是等效的,但在您的情况下,我认为过采样会导致过度拟合。由于两个类都没有相同范围的可能值,并且在[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])的错误更加昂贵。它有时用于医疗应用,在这种情况下,您宁愿让患者被诊断为生病而不是相反。