我很难理解scikit learn的逻辑回归中的class_weight参数是如何工作的
形势
我想用逻辑回归对一个非常不平衡的数据集进行二元分类。类别标记为0(阴性)和1(阳性),观察数据的比例约为19:1,大多数样本结果为阴性
第一次尝试:手动准备培训数据
我将数据分成不相交的集合进行训练和测试(大约80/20)。然后我用手随机抽取训练数据,得到不同于19:1比例的训练数据;从2:1到16:1
然后,我对这些不同的训练数据子集进行逻辑回归训练,并绘制召回率(=TP/(TP+FN))作为不同训练比例的函数。当然,召回是根据观察到的比例为19:1的不相交测试样本计算的。注意,尽管我在不同的训练数据上训练了不同的模型,但我在相同(不相交)的测试数据上计算了所有模型的召回率
结果正如预期的那样:在2:1的训练比例下,召回率约为60%,到16:1时,召回率下降得相当快。有几个比例为2:1->6:1,召回率在5%以上
第二次尝试:网格搜索
接下来,我想测试不同的正则化参数,因此我使用了GridSearchCV,并将C参数以及class_权重参数的几个值制作了一个网格。为了将负:正训练样本的n:m比例转换为class\u weight的字典语言,我认为我只需指定以下几个字典:
{0:0.67,1:0.33}#预期为2:1
{0:0.75,1:0.25}#预计3:1
{0:0.8,1:0.2}#预计4:1
我还包括了None和auto
这一次,结果完全出人意料。除了auto,我所有的召回结果都很小(<;0.05)。因此,我只能假设我对如何设置class\u权重的理解是错误的。有趣的是,class\u权重在网格搜索中,对于C的所有值,class\u权重的值约为59%,我猜它平衡到1:1
我的问题
-
如何正确使用
class_weight在训练数据中实现与实际提供数据的不同平衡?具体来说,我应该通过什么词典来使用负:正训练样本的n:m比例 -
如果您将各种
class_weight字典传递给GridSearchCV,在交叉验证期间,它是否会根据字典重新平衡训练折叠数据,但使用真实的给定样本比例来计算我在测试折叠上的评分函数?这是至关重要的,因为任何指标只有在来自观察比例的数据时才对我有用 -
就比例而言,
class_weight的auto值有什么作用?我阅读了文档,我假设“与频率成反比地平衡数据”只是意味着它是1:1。这是正确的吗?如果没有,有人能澄清一下吗
首先,光凭回忆是不好的。你可以简单地通过将所有东西分类为正面类来实现100%的召回率。
我通常建议使用AUC来选择参数,然后为您感兴趣的操作点(比如给定的精度级别)找到一个阈值
关于class\u-weight的工作原理:它用class\u-weight[i]而不是1来惩罚class[i]样本中的错误。因此,更高的班级权重意味着你想更加重视一个班级。从你所说的来看,0班的频率似乎是1班的19倍。因此您应该增加类1相对于类0的class_权重,比如{0.1,1.9}。
如果class\u权重的和不等于1,它将基本上更改正则化参数
有关class\u weight=“auto”的工作原理,您可以查看此讨论。
在开发版本中,您可以使用class\u weight=“balanced”,这更容易理解:它基本上意味着复制较小的类,直到您拥有与较大的类一样多的样本,但是以隐式方式