2017-07-20 66 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 ='