scikit-learn中的class_weight参数如何工作?
scikit-learn中的class_weight参数如何工作?
我对scikit-learn的逻辑回归中的class_weight参数的操作方式感到非常困惑。
情况
我想使用逻辑回归对一个非常不平衡的数据集进行二元分类。类别标签为0(负面)和1(正面),观察到的数据比例大约为19:1,其中大多数样本的结果为负面。
第一次尝试:手动准备训练数据
我将已有的数据分成了训练集和测试集(大约80/20)。然后,我手动随机抽样训练数据,以获得不同比例的训练数据,从2:1到16:1。
然后,我对这些不同的训练数据子集进行了逻辑回归训练,并绘制了在不同训练比例下的召回率(= TP /(TP + FN))的图表。当然,召回率是计算在具有观察到的19:1比例的不相交的测试样本上的。注意,尽管我在不同的训练数据上训练了不同的模型,但我在相同的(不相交的)测试数据上计算了召回率。
结果如预期:在2:1的训练比例下,召回率约为60%,当训练比例达到16:1时,召回率迅速下降。在2:1到6:1之间有几个比例,召回率相当高于5%。
第二次尝试:网格搜索
接下来,我想测试不同的正则化参数,所以我使用了GridSearchCV,并制作了一个包含多个C参数值和class_weight参数的网格。为了将我负面:正面训练样本的n:m比例转化为class_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_weight值都是如此。因此,我只能假设我的class_weight字典的设置理解是错误的。有趣的是,grid search中class_weight值为'auto'时,对于所有的C值都约为59%,我猜测它是平衡为1:1的?
我的问题
- 如何正确使用class_weight来实现与实际给定的训练数据不同的平衡?具体而言,我应该向class_weight传递什么字典以使用负面:正面训练样本的n:m比例?
- 如果将不同的class_weight字典传递给GridSearchCV,在交叉验证期间,它是否会根据字典重新平衡训练折叠数据,但在测试折叠上使用真实给定的样本比例计算我的评分函数?这很重要,因为任何指标对我来说只有在来自观察到的比例的数据上才有用。
- class_weight参数的auto值在比例方面是什么意思?我阅读了文档,并且我认为“按照其频率的倒数平衡数据”意味着它使其变为1:1。这是正确的吗?如果不是,有人可以解释一下吗?