2017-07-20 77 views
1

我试图使用StratifiedKFold创建列车/测试/ val拆分,以用于非sklearn机器学习工作流程。所以,DataFrame需要拆分,然后保持这种状态。使用StratifiedKFold创建列车/测试/ val拆分

我试图做类似下面,使用.values因为我路过熊猫DataFrames:

skf = StratifiedKFold(n_splits=3, shuffle=False) 
skf.get_n_splits(X, y) 

for train_index, test_index, valid_index in skf.split(X.values, y.values): 
    print("TRAIN:", train_index, "TEST:", test_index, "VALID:", valid_index) 
    X_train, X_test, X_valid = X.values[train_index], X.values[test_index], X.values[valid_index] 
    y_train, y_test, y_valid = y.values[train_index], y.values[test_index], y.values[valid_index] 

这种失败:

ValueError: not enough values to unpack (expected 3, got 2). 

我经历了所有的sklearn读docs并运行示例代码,但没有更好地了解如何在sklearn交叉验证方案之外使用分层k次折叠分割。

编辑:

我也试过这样:

# Create train/test split 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, stratify=y) 

# Create validation split from train split 
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.05) 

这似乎工作,虽然我想像我这样做与分层搞乱。

+0

你的问题是什么呢?这种行为与你的期望有什么不同? –

+0

感谢您的回复@RyanStout,我的错误 - 更新了错误消息。 –

回答

2

StratifiedKFold只能用于将您的数据集分成两部分每一折。由于split()方法只会生成train_index和test_index的元组(请参阅https://github.com/scikit-learn/scikit-learn/blob/ab93d65/sklearn/model_selection/_split.py#L94),您会收到错误消息。

对于这种使用情况,你应该将数据先分成验证和休息,然后再次分裂成其他测试和培训喜欢这样:

X_rest, X_val, y_rest, y_val = train_test_split(X, y, test_size=0.2, train_size=0.8, stratify='column') 
X_train, X_test, y_train, y_test = train_test_split(X_rest, y_rest, test_size=0.25, train_size=0.75, stratify='column') 
+0

我不确定在这里使用'stratify ='column'',但是当我在我的数据上运行你的代码时,我得到:'TypeError:Singleton数组数组('column',dtype ='