scikit-learn 中的分层训练/验证/测试拆分
Posted
技术标签:
【中文标题】scikit-learn 中的分层训练/验证/测试拆分【英文标题】:Stratified Train/Validation/Test-split in scikit-learn 【发布时间】:2017-04-11 06:43:27 【问题描述】:这里已经描述了如何通过 train_test_split (Stratified Train/Test-split in scikit-learn) 在 scikit 中进行分层训练/测试拆分,以及如何通过 np.split (How to split data into 3 sets (train, validation and test)?) 进行随机训练/验证/测试拆分的描述。但是如何进行分层训练/验证/测试拆分。
对于进行分层(在类标签上)训练/验证/测试拆分,想到的最接近的近似值如下,但我怀疑有更好的方法可以通过一个函数调用或更准确的方式实现这一点:
假设我们要进行 60/20/20 训练/验证/测试拆分,那么我目前的方法是首先进行 60/40 分层拆分,然后对前 40 个进行 50/50 分层拆分最终得到 60/20/20 的分层拆分。
from sklearn.cross_validation import train_test_split
SEED = 2000
x_train, x_validation_and_test, y_train, y_validation_and_test = train_test_split(x, y, test_size=.4, random_state=SEED)
x_validation, x_test, y_validation, y_test = train_test_split(x_validation_and_test, y_validation_and_test, test_size=.5, random_state=SEED)
如果我的方法正确和/或您有更好的方法,请回来。
谢谢
【问题讨论】:
同样的问题,你确认这是否是他们正确的做法吗? @AritzBi 我没有得到任何人的确认,但似乎有效。然而,最终我最终采用了一种不同的方法,即我只是进行分层训练/测试拆分,然后为了验证,我依赖于训练集中的分层 k 折交叉验证。签出:scikit-learn.org/stable/modules/generated/… 好的,非常感谢!!! 这正是我所做的!太糟糕了,sklearn 没有内置的方法来做到这一点。 【参考方案1】:是的,这正是我的做法——运行train_test_split()
两次。将第一个视为拆分您的训练集,然后该训练集可能被划分为不同的折叠或保留。
事实上,如果您最终使用包含内置交叉验证的 scikit 模型来测试您的模型,您甚至可能不必再次显式运行 train_test_split()
。如果您使用(非常方便!)model_selection.cross_val_score
函数,则相同。
【讨论】:
【参考方案2】:解决方案是只使用两次 StratifiedShuffleSplit,如下所示:
from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=1, test_size=0.4, random_state=42)
for train_index, test_valid_index in split.split(df, df.target):
train_set = df.iloc[train_index]
test_valid_set = df.iloc[test_valid_index]
split2 = StratifiedShuffleSplit(n_splits=1, test_size=0.5, random_state=42)
for test_index, valid_index in split2.split(test_valid_set, test_valid_set.target):
test_set = test_valid_set.iloc[test_index]
valid_set = test_valid_set.iloc[valid_index]
【讨论】:
但这并不能回答以下问题:按照解释的方法是一种好方法吗?以上是关于scikit-learn 中的分层训练/验证/测试拆分的主要内容,如果未能解决你的问题,请参考以下文章