什么成本函数和惩罚适用于不平衡的数据集?

数据挖掘 机器学习 分类 深度学习 scikit-学习 逻辑回归
2021-09-15 12:07:06

对于不平衡的数据集,选择 L1 还是 L2 正则化更好?

是否有更适合不平衡数据集的成本函数来提高模型分数(log_loss特别是)?

3个回答

如果您有一个不平衡的数据集,您通常希望一开始就使其平衡,因为这会人为地影响您的分数。

现在,您想要测量精度和召回率,因为它们可以更好地捕捉不平衡的数据集偏差。

L1 或 L2 在平衡或不平衡的数据集中表现不会特别好,您要做的是调用弹性网络(这是两者的组合)并对每个正则化器的系数进行交叉验证。

此外,进行网格搜索非常奇怪,您最好只使用交叉验证并查看哪些参数效果更好。

他们甚至有ElasticNetCV,它为你做这部分

所以你问在不同损失下类别不平衡如何影响分类器性能? 你可以做一个数值实验。

我通过逻辑回归进行二元分类。然而,直觉扩展到更广泛的模型类别,特别是神经网络。我通过交叉验证的 ROC AUC 来衡量性能,因为它对类不平衡不敏感。我使用交叉验证的内部循环来找到每个数据集上 L1 和 L2 正则化的最佳惩罚。

from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression, LogisticRegressionCV
import matplotlib.pyplot as plt

cvs_no_reg = []
cvs_lasso = []
cvs_ridge = []
imb = [0.5, 0.4, 0.3, 0.2, 0.1, 0.05, 0.02, 0.01, 0.005, 0.002, 0.001]
Cs = [1e-5, 3e-5, 1e-4, 3e-4, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1]
for w in imb:
    X, y = make_classification(random_state=1, weights=[w, 1-w], n_samples=10000)
    cvs_no_reg.append(cross_val_score(LogisticRegression(C=1e10), X, y, scoring='roc_auc').mean())
    cvs_ridge.append(cross_val_score(LogisticRegressionCV(Cs=Cs, penalty='l2'), X, y, scoring='roc_auc').mean())
    cvs_lasso.append(cross_val_score(LogisticRegressionCV(Cs=Cs, solver='liblinear', penalty='l1'), X, y, scoring='roc_auc').mean())

plt.plot(imb, cvs_no_reg)
plt.plot(imb, cvs_ridge)
plt.plot(imb, cvs_lasso)
plt.xscale('log')
plt.xlabel('fraction of the rare class')
plt.ylabel('cross-validated ROC AUC')
plt.legend(['no penalty', 'ridge', 'lasso'])
plt.title('Sensitivity to imbalance under different penalties')
plt.show()

在此处输入图像描述

您可以看到,在高度不平衡的情况下(图片左侧),L1 正则化比 L2 表现更好,并且都比没有正则化好。

但如果不平衡不那么严重(最小的类份额为 0.03 或更高),所有 3 个模型的表现都一样好。

至于第二个问题,什么是不平衡数据集的好的损失函数,我会回答log loss 已经足够好了它的有用特性是它不会使您的模型将稀有类的概率变为零,即使它非常非常罕见。

如果您有不平衡的数据,首先我建议您尝试拥有真实数据。我的意思是,如果您没有平衡数据,请不要手动复制您的数据。您永远不应该更改数据的分布。尽管您似乎减少了 Bayse 错误,但您的分类器在您指定的应用程序中表现不佳。对于不平衡的数据,我有两个建议:

  • 使用类权重来改进您的成本函数。对于稀有类,使用比优势类大得多的值。
  • 使用F1分数来评估你的分类器

对于一组不平衡的数据,最好选择 L1 或 L2 正则化

这些用于处理过度拟合问题。首先你必须学习训练数据来解决高偏差问题。后者在日常任务中更为常见。它们适用于不平衡的数据集,但考虑到首先您必须处理高偏差问题,学习数据,然后处理高方差问题,避免过度拟合。