2013-12-20 110 views
6

如何在scikit-learn中爲交叉驗證生成隨機摺疊?假設我們有一個類的20個樣本,另一個80個,我們需要生成N個訓練集和測試集,每個訓練集的大小爲30,在每個訓練集的約束下,我們有第一級的50%和第二級的50%。scikit-learn交叉驗證不平衡數據欠採樣

我發現這個討論(https://github.com/scikit-learn/scikit-learn/issues/1362),但我不明白如何得到摺疊。理想情況下,我認爲我需要這樣的功能:

cfolds = np.cross_validation.imaginaryfunction(
[list(itertools.repeat(1,20)), list(itertools.repeat(2,80))], 
n_iter=100, test_size=0.70) 

我錯過了什麼?

+0

爲什麼不使用'random.sample()'? – Skyler

+0

出於同樣的原因,我們擁有所有其他的cross_validation功能! – adrin

+2

您可以定義自己的交叉驗證生成器:它應該是一個帶有返回N的'__len__'和產生'N'對列表'(train_indices,test_indices)'的'__iter__'的對象。 –

回答

1

有做交叉驗證與scikit欠沒有直接的方法,但有兩種解決方法:

1.

使用StratifiedCrossValidation以獲得與每個摺疊鏡像數據的分撥配送交叉驗證,那麼您可以通過class_weight param來實現分類器中的不平衡減少,該參數可以採用auto以及欠採樣/過採樣類與其數量成反比,或者可以傳遞具有明確權重的字典。

2.

自己寫的交叉驗證程序,該程序應該非常直截了當使用pandas

0

StratifiedCV是一個不錯的選擇,但你可以把它簡單:在與1類數據

  1. 運行隨機抽樣(你需要選擇15/20樣本)
  2. 同爲2級(15/80)
  3. 重複100次或需要多少。

就是這樣。快速和可行!