如何实现任意数量的分类变量的分层K折叠分裂?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现任意数量的分类变量的分层K折叠分裂?相关的知识,希望对你有一定的参考价值。
我有一个表格的数据框,df:
cat_var_1 cat_var_2 num_var_1
0 Orange Monkey 34
1 Banana Cat 56
2 Orange Dog 22
3 Banana Monkey 6
..
假设数据集中cat_var_1的可能值具有比率 - ['Orange':0.6,'Banana':0.4]并且cat_var_2的可能值具有比率['Monkey':0.2,'Cat':0.7,'Dog ':0.1]。
如何将数据拆分为训练集,测试集和验证集(60:20:20分割),以保持分类变量的比例?实际上,这些变量可以是任意数量,而不仅仅是两个。而且,显然,在实践中可能永远不会达到确切的比例,但我们希望它尽可能接近。
我已经从这里描述的sklearn中查看了StratifiedKFold方法:how to split a dataset into training and validation set keeping ratio between classes?但这仅限于仅根据一个分类变量进行评估。
此外,如果您能提供所实现解决方案的复杂性,我将不胜感激。
答案
你可以将df.cat_var_1+ "_" + df.cat_var_2
传递给y
的StratifiedShuffleSplit.split()
参数:
但这是一个使用DataFrame.groupby
的方法:
import pandas as pd
import numpy as np
nrows = 10000
p1 = {'Orange': 0.6, 'Banana': 0.4}
p2 = {'Monkey': 0.2, 'Cat': 0.7, 'Dog': 0.1}
c1 = [key for key, val in p1.items() for i in range(int(nrows * val))]
c2 = [key for key, val in p2.items() for i in range(int(nrows * val))]
random.shuffle(c1)
random.shuffle(c2)
df = pd.DataFrame({"c1":c1, "c2":c2, "val":np.random.randint(0, 100, nrows)})
index = []
for key, idx in df.groupby(["c1", "c2"]).groups.items():
arr = idx.values.copy()
np.random.shuffle(arr)
p1 = int(0.6 * len(arr))
p2 = int(0.8 * len(arr))
index.append(np.split(arr, [p1, p2]))
idx_train, idx_test, idx_validate = list(map(np.concatenate, zip(*index)))
以上是关于如何实现任意数量的分类变量的分层K折叠分裂?的主要内容,如果未能解决你的问题,请参考以下文章