由于准确率和召回率往往不能兼顾,所以在数据分析的过程中,尤其实际业务中需要兼顾某一方。例如在违规文件封禁场景,为了减少审核人力的成本,需要一些能够自动封禁的模型,这些模型对精确率要求比较高,有可能需要达到99%甚至以上的精确率。所以总结了两种提升召回率的方法:
(1)切分数据集:在一个比较大数据集中,由于可能存在无法正确分类的异常点可能会导致精确率无法达标,我想到的一个办法是将大的数据集进行切分(可以采用基尼系数的方式达到最优切分点),这样在更小的数据集中基尼不纯度也更低,更利于提高精确率。这里如果在每个子数据集中引入一个分类模型,效果会更好。
这种方式的一个问题是字数据集的数据量太少的话,每个模型可能会发生过拟合,所以采用这种方式的前提是要保证切分的子数据集个数不能太多,每个数据集的数量不能太少。
(2)调整阈值,这个恐怕是业务上最常用的方式了,也就是把模型的识别分数调高,以牺牲召回率为代价尽量提升精确率,如果是一般的规则,可能就是把某个特征的阈值调高(或调低)。如果是用机器学习的话,也有可以输出具体预测值的函数。
传统的机器学习模型(sklearn)中,分类模型内置的cutoff阈值为0.5,调用predict函数的时候这个值是没法改变的,模型直接输出的是0 或者 1 的预测结果值。其实另外还有一个predict_proba函数,可以输出每一类的具体预测概率值,这样就可以通过if条件将cutoff值进行调整,已达到提升精确率或者扩大召回率的要求。
#引入模型
RF_new_model_online=joblib.load("RF_new.m")`
#查看测试集数据
x_test = x_test.head(5)
#predict_proba进行预测并返回具体概率值
result = RF_new_model_online.predict_proba(x_test)`
结果展示
测试集数据(11个特征,归一化后)
预测结果(两列分别是预测结果为0类和1类的概率)
ps: 个人感觉将两种方式结合使用感觉效果更好