如何通过倾斜的课程提高 F1 分数?

机器算法验证 分类 偏度 奥克 精确召回
2022-03-28 03:57:48

我有一个大约 40K 样本的数据集,其中 39.6K 样本属于目标类 0,400 个样本属于类 1。

我尝试了几种分类算法,没有过多的微调,只是为了了解基线性能如何。他们都得到了大约 99% 的准确度分数,这正是 0 类样本与总样本之间的比率。人工欠采样只是将准确度分数降低到与新数据集相同的比率,因此在这方面没有任何改进。

F1 分数真的很差,因为我遇到了可怕的 II 类错误:基本上,算法只是猜测所有内容都属于 0 类。对于我尝试过的一些模型,它实际上预测所有内容都属于 0 类:误报是0(因为没有预测到正样本)和假阴性确实很多(因为预测实际的正样本是负的)。AUC-ROC 约为 50%(糟糕),并且对模型进行加权以考虑类的偏度并没有带来任何改善。

我尝试做一些特征工程(在一些无监督聚类之上集成监督分类),但几乎没有运气。

您对如何解决此类问题/如何诊断阻止预测器准确的潜在问题有任何建议吗?或者我应该以此证明,鉴于我的数据集,属于第 1 类只是随机的(所以我应该收集更多特征)?

旁注:我想从另一边拿它,即。异常检测,但我不确定这是否是正确的方法。

2个回答

我处理过的大多数分类问题本质上都是相似的,所以大类不平衡是很常见的。

目前尚不清楚您是否使用训练验证集来构建和微调模型。交叉折叠验证通常是首选,因为它可以提供更可靠的模型性能估计。

F1 分数是一个很好的分类性能指标,我发现它比 AUC-ROC 指标更重要。最好使用与您要解决的实际问题相匹配的性能度量。

如果无法访问数据集,我无法给出确切的指示;所以我建议几个方向来解决这个问题并帮助提高 F1 分数:

  1. 使用更好的功能,有时领域专家(特定于您要解决的问题)可以提供相关的指导,从而带来显着的改进。

  2. 使用更好的分类算法和更好的超参数。

  3. 对少数类进行过采样,和/或对多数类进行欠采样以减少类不平衡。

  4. 对少数类使用更高的权重,尽管我发现过度抽样比使用权重更有效。

  5. 选择一个最佳截止值,将算法输出的连续值类概率转换为类标签。这与良好的 AUC 指标一样重要,但经常被忽视。不过需要注意的是:用户应通过评估相关权衡来指导截止值的选择。

下面的 Python 代码片段演示了上采样,通过替换数据帧中数量较少的类(又名少数类)的实例进行采样来解决类不平衡问题,

import pandas as pd

# df is a data frame with FRAUD as the target column with classes 0 and 1.  
# There are more instances of class 0 than class 1 in the data frame df.  

# Separate majority and minority classes
df_majority = df.loc[df.FRAUD == 0].copy()
df_minority = df.loc[df.FRAUD == 1].copy()

# Upsample minority class
df_minority_upsampled = resample(df_minority,
                             replace=True,  # sample with replacement
                             n_samples=498551,  # to match majority class
                             random_state=123)  # reproducible results

# Combine majority class with upsampled minority class
df_upsampled = pd.concat([df_majority, df_minority_upsampled])

# Display new class counts
print(df_upsampled.FRAUD.value_counts())