分层训练/验证/测试 - 分裂在scikit-learn

时间:2016-11-27 12:49:20

标签: python scikit-learn train-test-split

这里已经描述了如何通过train_test_split(Stratified Train/Test-split in scikit-learn)在scikit中进行分层训练/测试分割以及如何通过np.split进行随机训练/验证/测试分裂的描述({{3 }})。但是如何进行分层训练/验证/测试分裂呢。

对于进行分层(在类别标签上)训练/验证/测试分割而想到的最接近的近似值如下,但我怀疑有一种更好的方法可以在一个函数调用或一个函数调用中实现更准确的方式:

假设我们想要进行60/20/20列车/验证/测试拆分,那么我目前的方法是首先进行60/40分层拆分,然后对其进行50/50 stratifeid拆分前40,最终得到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)

如果我的方法是正确的和/或你有更好的方法,请回来。

谢谢

2 个答案:

答案 0 :(得分:0)

是的,这正是我的操作方式-两次运行train_test_split()。首先想到的是拆分您的训练集,然后将该训练集 分成不同的折线或约束线。

实际上,如果最终使用包含内置交叉验证的scikit模型测试模型,则甚至不必再次显式运行train_test_split()。如果您使用(非常方便!)model_selection.cross_val_score函数,也是如此。

答案 1 :(得分:0)

解决方案是仅使用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]