【问题标题】:How to achieve stratified K fold splitting for arbitrary number of categorical variables?如何为任意数量的分类变量实现分层 K 折拆分?
【发布时间】:2018-08-05 21:22:16
【问题描述】:

我有一个表单的数据框,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 , '狗': 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 传递给split() 的参数Y

标签: python pandas numpy machine-learning scikit-learn


【解决方案1】:

您可以将df.cat_var_1+ "_" + df.cat_var_2 传递给StratifiedShuffleSplit.split() 的参数y

但是这里有一个使用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)))

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2011-10-02
    相关资源
    最近更新 更多