[英]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这样的东西会有所帮助),但在概念上很简单。
假设您创建一个虚拟数据集,其中自变量只是id
和class
。 此外,在此数据集中,删除重复的id
条目。
对于交叉验证,在虚拟数据集上运行分层交叉验证。 在每次迭代时:
找出为火车和测试选择的id
返回原始数据集,并根据需要将属于id
所有实例插入到训练集和测试集中。
这是因为:
如您所述,每个id
都与一个标签相关联。
由于我们运行分层CV,每个类都按比例表示。
由于每个id
仅出现在火车或测试集中(但不是两者),因此它也被标记。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.