2016-04-24 126 views
0

我的數據有一個名爲pid的列,並且不應在列車測試拆分之間泄漏具有相同pid的記錄。我具有2層層疊模型 -使用自定義摺疊進行嵌套交叉驗證

  • 內部層通過交VAL-預測火車上的數據
  • 我然後建立在原始列車數據的外部模型構建一個內部預測矢量+內部預測矢量
  • 我然後在測試數據

該過程應重複X5評估性能。

我能想到的最佳方式是在外部圖層中將pid % 25pid % 5在內部圖層中分開。

該代碼出來很麻煩,不是pythonic。有沒有更好的方法來做到這一點?我是否錯過了sklearn/python的一些簡潔而清晰的用法,或者我的設計中是否存在一些基本缺陷?

N = 5 

for external_fold in range(N): 

    ex_test = [x for x in range(N**2) if external_fold*N <= x % (N**2) < (external_fold+1)*N] 
    ex_train = [x for x in range(N**2) if x not in ex_test] 
    ex_train_index = X[(X.pid % N**2).isin(ex_train)].index 
    ex_test_index = X[(X.pid % N**2).isin(ex_test)].index 
    ... 
    for internal_fold in range(N): 
     in_train_index = X[(X.pid % N)!=internal_fold].index 
     in_test_index = X[(X.pid % N)==internal_fold].index 
     # build a vector of internal model predictions 

    # build external model and assess performance 
+0

使用['skelan.cross_validation.KFold'](http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html#sklearn.cross_validation.KFold)而不是嘗試構建您的自己的解決方案可能是更好的方法。 – ChrisP

回答

1

你有兩個需求是最近纔在Scikit,學習討論,並應包括在未來發布的版本:

與相關樣本交叉驗證策略保持在一起

新的CV splitter classes現在包括LabelKFoldLabelShuffleSplit這兩個都旨在處理你考慮的情況下,你應該考慮與pid相同的元素應該在相同的測試部分。

嵌套交叉驗證

交叉驗證迭代器API已經被重新設計,以更好地支持嵌套的交叉驗證。您不再需要將數據相關參數傳遞給交叉驗證策略構造函數。因此,在GridSearchCV之內嵌入GridSearchCV(每個都有自己的cv參數)應符合您的需求。

請注意,這個API仍然非常新鮮並且可以隨時更改。