作者|PROCRASTINATOR 编译|VK 来源|Analytics Vidhya
概述
了解类权重优化是如何工作的,以及如何在logistic回归或任何其他算法中使用sklearn实现相同的方法
了解如何在不使用任何采样方法的情况下,通过修改类权重可以克服类不平衡数据的问题
介绍
机器学习中的分类问题是我们给出了一些输入(独立变量),并且我们必须预测一个离散目标。离散值的分布极有可能是非常不同的。由于每个类的差异,算法往往偏向于现有的大多数值,而对少数值的处理效果不好。
类频率的这种差异影响模型的整体可预测性。
在这些问题上获得良好的准确度并不难,但并不意味着模型是良好的。我们需要检查这些模型的性能是否具有任何商业意义或有任何价值。这就是为什么理解问题和数据是非常必要的,这样你就可以使用正确的度量并使用适当的方法优化它。
目录
什么是类别失衡?
为什么要处理类别不平衡?
什么是类别权重?
logistic回归中的类权重
Python实现
- 简单logistic回归
- 加权logistic回归('平衡')
- 加权logistic回归(手动权重)
进一步提高分数的技巧
什么是类别失衡?
类不平衡是机器学习分类问题中出现的一个问题。它只说明目标类的频率高度不平衡,即其中一个类的频率与现有的其他类相比非常高。换句话说,对目标中的大多数类存在偏见。
假设我们考虑一个二分类,其中大多数目标类有10000个,而少数目标类只有100个。在这种情况下,比率为100:1,即每100个多数类,就只有一个少数类。这个问题就是我们所说的类别失衡。我们可以找到这些数据的一般领域有欺诈检测、流失预测、医疗诊断、电子邮件分类等。
我们将在医学领域中处理一个数据集,以正确理解类不平衡。在这里,我们必须根据给定的属性(独立变量)来预测一个人是否会患上心脏病。为了跳过数据的清理和预处理,我们使用的是数据的已清理版本。
在下面的图像中,你可以看到目标变量的分布。
#绘制目标的条形图
plt.figure(figsize=(10,6))
g = sns.barplot(data['stroke'], data['stroke'], palette='Set1', estimator=lambda x: len(x) / len(data) )
#图的统计
for p in g.patches:
width, height = p.get_width(), p.get_height()
x, y = p.get_xy()
g.text(x+width/2,
y+height,
'{:.0%}'.format(height),
horizontalalignment='center',fontsize=15)
#设置标签
plt.xlabel('Heart Stroke', fontsize=14)
plt.ylabel('Precentage', fontsize=14)
plt.title('Percentage of patients will/will not have heart stroke', fontsize=16)
在这里,
0:表示患者没有心脏病。
1: 表示病人患了心脏病。
从分布上可以看出,只有2%的患者患有心脏病。所以,这是一个经典的类别失衡问题。
为什么要处理类别不平衡?
到目前为止,我们已经对类别失衡有了直觉。但是为什么需要克服这个问题,在使用这些数据建模时会产生什么问题?
大多数机器学习算法都假定数据在类中分布均匀。在类不平衡问题中,广泛的问题是算法将更偏向于预测大多数类别(在我们的情况下没有心脏病)。该算法没有足够的数据来学习少数类(心脏病)中的模式。
让我们以一个现实生活的例子来更好地理解这一点。
假设你已经从你的家乡搬到了一个新的城市,你在这里住了一个月。当你来到你的家乡,你会非常熟悉所有的地方,如你的家,路线,重要的商店,旅游景点等等,因为你在那里度过了你的整个童年。
但是