繁体   English   中英

Scikit-Learn中的分层标记K-fold交叉验证

[英]Stratified Labeled K-Fold Cross-Validation In Scikit-Learn

我正在尝试将数据集的实例分类为两个类中的一个,a或b。 B是少数类,只占数据集的8%。 为所有实例分配一个id,指示哪个主题生成了数据。 因为每个主题生成多个实例,所以id在数据集中频繁重复。

下表只是一个例子,真实表有大约100,000个实例。 每个主题id在表中有大约100个实例。 每个主题都与一个类完全相关,你可以在下面看到“拉里”。

    * field  * field  *   id   *  class  
*******************************************
 0  *   _    *   _    *  bob   *    a
 1  *   _    *   _    *  susan *    a
 2  *   _    *   _    *  susan *    a
 3  *   _    *   _    *  bob   *    a
 4  *   _    *   _    *  larry *    b
 5  *   _    *   _    *  greg  *    a
 6  *   _    *   _    *  larry *    b
 7  *   _    *   _    *  bob   *    a
 8  *   _    *   _    *  susan *    a
 9  *   _    *   _    *  susan *    a
 10 *   _    *   _    *  bob   *    a
 11 *   _    *   _    *  greg  *    a
 ...   ...      ...      ...       ...

我想使用交叉验证来调整模型,并且必须对数据集进行分层,以便每个折叠包含一些少数类的例子,b。 问题是我有第二个约束,相同的id必须永远不会出现在两个不同的折叠中,因为这会泄漏有关主题的信息。

我正在使用python的scikit-learn库。 我需要一种结合LabelKFold的方法,它确保标签(id)不会在折叠之间分割,而StratifiedKFold则确保每个折叠都具有相似的类别比例。 如何使用scikit-learn完成上述操作? 如果无法在sklearn中拆分两个约束,那么如何手动或与其他python库有效地分割数据集?

以下在索引方面有点棘手(如果你使用像Pandas这样的东西会有所帮助),但在概念上很简单。

假设您创建一个虚拟数据集,其中自变量只是idclass 此外,在此数据集中,删除重复的id条目。

对于交叉验证,在虚拟数据集上运行分层交叉验证。 在每次迭代时:

  1. 找出为火车和测试选择的id

  2. 返回原始数据集,并根据需要将属于id所有实例插入到训练集和测试集中。

这是因为:

  1. 如您所述,每个id都与一个标签相关联。

  2. 由于我们运行分层CV,每个类都按比例表示。

  3. 由于每个id仅出现在火车或测试集中(但不是两者),因此它也被标记。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM