我曾研究过分类问题,分层交叉验证是我发现的最有用和最简单的技术之一。在这种情况下,这意味着建立一个训练和验证集,它们具有相同比例的目标变量的类。
我想知道回归中是否存在这样的策略。一种简单的方法是将数据拆分为四分位数或十分位数,并确保各个四分位数和十分位数中的训练和验证实例的比例相同。
问题是:有没有标准的方法来做到这一点?如果是这样,sklearn中是否有实现?
我曾研究过分类问题,分层交叉验证是我发现的最有用和最简单的技术之一。在这种情况下,这意味着建立一个训练和验证集,它们具有相同比例的目标变量的类。
我想知道回归中是否存在这样的策略。一种简单的方法是将数据拆分为四分位数或十分位数,并确保各个四分位数和十分位数中的训练和验证实例的比例相同。
问题是:有没有标准的方法来做到这一点?如果是这样,sklearn中是否有实现?
我以前做过,但没有找到默认实现——StratifiedKFold和RepeatedStratifiedKFold仅记录在与类一起使用的情况下。
我最终这样做的方式并不像您对四分位数/十分位数的想法那样,而是使用直方图(它符合我的需求)。
NumPy 有一个很好的方法来做到这一点,有许多不同的公式来计算你可以使用的 bin 大小来匹配你的数据,即它是否是正态分布的。我不能发布整个方法代码,但这里是要点:
samples_per_bin, bins, = np.histogram(data, bins='doane') # Doane's method worked best for me
min_bin_size = samples_per_bin.min()
# compute the maximum batch size possible, using all samples from the bin with lowest population
n_bins = len(samples_per_bin)
max_batch = min_samples_single_bin * n_bins
然后,我将数据放入 Pandas DataFrame 并添加一列,指示每个数据点所在的 bin - 最后执行以下操作来执行每个 bin 的采样:
df.groupby('bin_name', group_keys=False).apply(
lambda x: x.sample(n_per_group, replace=True))
replace
显然,您可以通过更改参数来允许或不允许批量重复。如果您在强制分层时想要更大的批量大小,则可能有必要。这绝对是我的方法的一个限制,您可以按照您的建议通过使用四分位数等来克服它。