楼主: 时光永痕
806 0

[数据挖掘新闻] 如何在机器学习中使用班级加权来改善班级失衡 [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)三级

25%

威望
0
论坛币
26 个
通用积分
49.7565
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
316 小时
注册时间
2020-7-21
最后登录
2024-4-19

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如何在机器学习中使用班级加权来改善班级失衡
了解类权重优化的工作原理以及如何使用sklearn在逻辑回归或任何其他算法中实现相同
了解班级权重如何在不使用任何抽样方法的情况下帮助克服班级失衡数据问题
介绍
机器学习中的分类问题是我们提供了一些输入(独立变量),并且我们必须预测离散目标。离散值的分布很有可能会非常不同。由于每个类别的这种差异,算法倾向于偏向当前的多数值,并且在少数值上表现不佳。
班级频率的这种差异会影响模型的整体可预测性。
在这些问题上获得良好的准确性不是很困难,但并非总是要获得良好的成绩。我们需要检查这些模型的性能是否具有商业意义或价值。这就是为什么必须了解您的问题陈述和数据,以便您可以使用正确的度量标准并使用合适的方法对其进行优化的原因。
目录
什么是阶级失衡?
为什么应对阶级失衡至关重要?
什么是班级权重?
Logistic回归中的类权重
Python实现
简单逻辑回归
加权逻辑回归(“平衡”)
加权逻辑回归(人工权重)
进一步提高分数的技巧
什么是阶级失衡?
类不平衡是机器学习分类问题中出现的问题。它仅表明目标类别的频率高度不平衡,即与存在的其他类别相比,其中一个类别的发生率很高。换句话说,目标中存在多数群体偏见或偏见。假设我们考虑一个二进制分类,其中多数目标类有10000行,而少数目标类只有100行。在这种情况下,该比率为100:1,即,每100个多数阶级中,只有一个少数种族。这个问题就是我们所说的阶级失衡。我们可以找到此类数据的一些常规领域包括欺诈检测,客户流失预测,医疗诊断,电子邮件分类等。
我们将研究医学领域的数据集,以正确理解班级失衡。在这里,我们必须根据给定的属性(独立变量)预测一个人是否会患有中风。为了跳过数据的清理和预处理,我们使用的是数据的清理版本。
在下图中,您可以看到目标变量的分布。
这里,
0:表示患者没有中风。
1:表示患者患有中风。
从分布中可以看出,只有2%的患者患有中风。因此,这是经典的班级失衡问题。
为什么应对阶级失衡至关重要?
到目前为止,我们已经有了关于阶级失衡的直觉。但是,为什么有必要克服这一问题,并且在使用此类数据进行建模时会产生什么问题呢?
大多数机器学习算法都假设数据在类中均匀分布。在班级失衡问题的情况下,广泛存在的问题是该算法将更偏向于预测多数班级(在我们的案例中没有心搏)。该算法将没有足够的数据来学习少数族裔(心搏)中存在的模式。
让我们以一个真实的例子来更好地理解这一点。
考虑一下您已经从家乡搬到了新城市,并且过去一个月一直住在这里。当涉及到您的家乡时,您会非常熟悉所有位置,例如您的家,路线,基本商店,旅游景点等,因为您整个童年都在这里度过。但是,谈到新城市时,您对每个位置的确切位置并不会有太多的想法,走错路线并迷路的机会非常高。在这里,您的家乡是您的多数阶层,而新城市是您的少数阶层。
同样,这种情况发生在班级失衡中。该模型具有关于多数类的足够信息,但是关于您的少数类的信息不足。这就是少数族裔分类错误率很高的原因。
注意:要检查模型的性能,我们将使用f1得分作为度量标准,而不是准确性。
原因是,如果我们创建一个愚蠢的模型,即使将每个新的训练数据都预测为0(无心搏),那么由于模型偏向多数阶级,我们将获得非常高的准确性。在这里,该模型非常准确,但对我们的问题陈述毫无价值。这就是为什么我们将f1分数用作评估指标的原因。F1分数不过是精确度和查全率的调和平均值。但是,评估指标是根据业务问题和我们要减少的错误类型选择的。但是,f1分数是班级不平衡问题的首选指标。
这是f1分数的公式:
f1分数= 2 *(精度*召回率)/(精度+召回率)
让我们通过在我们的心搏数据上基于目标变量的模式训练模型并确认我们获得的分数来确认这一点:
模式模型的精度为:0.9819508448540707
模式模型的f1得分是:0.0
在此,模式模型对测试数据的准确性为0.98,这是一个极好的分数。但另一方面,f1得分为零,这表明该模型在少数群体上的表现不佳。我们可以通过查看混淆矩阵来确认这一点。
模式模型预测每个患者为0(无心搏)。根据该模型,无论患者有什么症状,他/她都不会中风。使用此模型是否有意义?
既然我们已经了解了什么是类不平衡以及它如何困扰我们的模型性能,我们将把重点转移到什么是类权重以及类权重如何帮助改善模型性能上。
什么是班级权重?
大多数机器学习算法对于有偏见的类数据不是很有用。但是,我们可以修改当前的训练算法以考虑类的偏斜分布。这可以通过对多数和少数派赋予不同的权重来实现。权重的差异将在培训阶段影响班级的分类。整个目的是通过设置较高的类别权重并同时减少多数类别的权重来惩罚少数群体的错误分类。
为了更清楚一点,我们将恢复之前考虑的城市示例。
请以这种方式考虑一下,您在新城市度过的最后一个月,而不是在需要时出门,而是花了整整一个月的时间探索这座城市。您花了更多时间了解整个月的城市路线和地点。给与更多的研究时间可以帮助您更好地了解新城市,并且迷失的机会也会减少。这正是班级权重的工作方式。在训练过程中,我们在算法的成本函数中赋予了少数群体以更多的权重,从而可以给少数群体以更高的代价,并且算法可以专注于减少少数群体的误差。
注意:有一个阈值,您应分别为少数派和多数派增加或减少班级的权重。如果您给少数派类别赋予非常高的类别权重,则该算法很可能会偏向少数派类别,并且会增加多数派类别中的错误。
大多数sklearn分类器建模库,甚至某些基于Boosting的库,例如LightGBM和catboost,都具有内置参数“ class_weight”,这可以按照我们到目前为止所学的方法帮助我们优化少数群体的得分。
默认情况下,class_weight = None的值,即两个类的权重均相等。除此之外,我们可以将其设置为“平衡”,也可以传递包含两个类的手动权重的字典。
当class_weights ='balanced'时,模型会自动将类别权重分配为与其各自的频率成反比。
更精确地说,计算公式为:
wj = n_samples /(n_classes * n_samplesj)
这里,
wj是每个类别的权重(j表示类别)
n_samplesis数据集中样本或行的总数
n_classes是目标中唯一类的总数
n_samplesjis相应类的总行数
对于我们的中风示例:
n_samples = 43400,n_classes = 2(0&1),n_sample0 = 42617,n_samples1 = 783
0级重量:
w0 = 43400 /(2 * 42617)= 0.509
第1类的权重:
w1 = 43400 /(2 * 783)= 27.713
我希望这样可以使事情变得更清楚:class_weight ='balanced'如何帮助我们为少数群体提供更高的权重,为多数群体提供更低的权重。
尽管在大多数情况下将值传递为“平衡”会带来良好的结果,但有时对于极端的阶级失衡,我们可以尝试手动加权。稍后,我们将看到如何在Python中为类权重找到最佳值。
Logistic回归中的类权重
我们可以通过在算法的成本函数中添加不同的类别权重来修改每种机器学习算法,但是在这里,我们将重点关注逻辑回归。
对于逻辑回归,我们将对数损失用作成本函数。我们不使用均方误差作为逻辑回归的成本函数,因为我们使用S形曲线作为预测函数,而不是拟合直线。对S形函数求平方将导致非凸曲线,因此成本函数将具有很多局部最小值,并且使用梯度下降收敛到全局最小值非常困难。但是对数损失形成一个凸函数,并且我们只有一个最小值要收敛。
日志丢失的公式:
这里,
N是值的数量
yi是目标类别的实际值
yi是目标类别的预测概率
让我们形成一个伪表,它使用对数损失公式来包含实际的预测,预测的概率和计算的成本:
在此表中,我们有10个观测值,其中0类来自9个观测值,1类来自1个观测值。在下一列中,我们具有每个观测值的预测概率。最后,使用对数损失公式,我们要承担成本损失。
将权重添加到成本函数后,修改后的对数损失函数为:
这里,
w0是0类的权重
w1是第1类的类权重
现在,我们将添加权重,看看它将对成本损失产生什么影响。
对于权重的值,我们将使用class_weights ='balanced'公式。
w0 = 10 /(2 * 1)= 5
w1 = 10 /(2 * 9)= 0.55
计算表中第一个值的成本:
费用=-(5(0 * log(0.32)+ 0.55(1-0)* log(1-0.32))
=-(0 + 0.55 * log(.68))
=-(0.55 *(-0.385))
= 0.211
同样,我们可以计算每个观察值的加权成本,更新后的表为:
通过该表,我们可以确认对大多数类别的成本函数应用较小的权重,从而导致较小的误差值,进而减少对模型系数的更新。对于少数类,将更大的权重值应用于成本函数会导致较大的误差计算,进而导致模型系数的更新更多。这样,我们可以改变模型的偏差,从而也可以减少少数群体的错误。
结论:
较小的权重导致较小的损失和对模型系数的较小更新
较大的权重会导致较大的损失,并且会大大增加模型系数
用Python实现
在这里,我们将使用相同的心搏数据进行预测。首先,我们将训练一个简单的逻辑回归,然后将class_weights设置为“平衡”来实现加权逻辑回归。最后,我们将尝试使用网格搜索找到班级权重的最佳值。我们尝试优化的指标将是f1得分。
1.简单的Logistic回归:
在这里,我们使用sklearn库训练模型,并使用默认的逻辑回归。默认情况下,该算法将为两个类赋予相等的权重。
测试数据的f1-分数:0.0
对于简单的逻辑回归模型,我们得到的f1得分为0。查看混乱矩阵,我们可以确认我们的模型正在预测每个观察结果,因为它们不会发生中风。该模型没有比我们先前创建的模式模型更好。让我们尝试为少数群体增加一些权重,看看是否有帮助。
2. Logistic回归(class_weight ='balanced'):
我们已经将class_weight参数添加到我们的逻辑回归算法中,并且我们传递的值是'balanced'。
测试数据的f1-得分:0.10098851188885921
通过将单个类别权重参数添加到逻辑回归函数,我们将f1得分提高了10%。我们可以在混淆矩阵中看到,即使对0类(无心搏)的错误分类有所增加,该模型也可以很好地捕获1类(心搏)。
我们是否可以仅通过改变班级权重来进一步改善指标?
3. Logistic回归(手动班级权重):
最后,我们尝试使用网格搜索找到具有最高分数的最佳权重。我们将搜索介于0到1之间的权重。想法是,如果将n作为少数类的权重,则多数类将得到1-n的权重。
在这里,权重的数量不是很大,但是多数和少数族裔之间的权重比例会很高。
例:
w1 = 0.95
w0 = 1 – 0.95 = 0.05
w1:w0 = 19:1
因此,少数族裔的权重将比多数族裔的权重高19倍。
通过该图,我们可以看到少数族裔的最高值在约0.93级体重时达到峰值。
使用网格搜索,我们得到了最好的班级权重,即班级0(多数派)为0.06467,班级1(少数派)为1:0.93532。
现在我们有了使用分层交叉验证和网格搜索的最佳分类权重,我们将看到测试数据的性能。
测试数据的f1得分:0.1579371474617244
通过手动更改权重值,我们可以将f1得分进一步提高大约6%。混淆矩阵还表明,从先前的模型中,我们能够更好地预测类0,但要以对类1的错误分类为代价。这全都取决于业务问题或要减少的错误类型。在这里,我们的重点是提高f1得分,而我们只需调整班级权重即可做到。
进一步提高得分的技巧
特征工程:为简单起见,我们仅使用给定的自变量。您可以尝试通过组合功能,基于描述性统计的功能等来创建新功能,例如基于频率,基于交互的功能。
调整阈值:默认情况下,所有算法的阈值为0.5。您可以尝试使用不同的阈值,也可以使用网格搜索或随机搜索找到最佳值
使用高级算法:在此解释中,我们仅使用了逻辑回归。您可以尝试其他高级装袋和提升算法。最后还可以尝试堆叠或混合多种算法
尾注
我希望本文能使您对类权重如何帮助处理类不平衡问题以及在python中实现的难易程度有个好主意。
尽管我们已经讨论了类权重仅适用于逻辑回归的方法,但是对于其他所有算法,其思想仍然相同。每种算法使用的只是成本函数的变化,以最小化误差并优化少数类的结果。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:机器学习 logistic回归 logistic Balanced Boosting

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 14:14