2016-10-04 54 views
2

我在scikit-learn的train_test_split()函數中的stratify參數有問題。這與隨機出現在我的數據同樣的問題一個虛擬的例子:一個返回sklearn的train_test_split中的「Stratify」參數無法正常工作?

from sklearn.model_selection import train_test_split 
a = [1, 0, 0, 0, 0, 0, 0, 1] 
train_test_split(a, stratify=a, random_state=42) 

[[1, 0, 0, 0, 0, 1], [0, 0]] 

難道不應該選擇「1」也測試子集?從我如何期望train_test_split()stratify工作應該返回類似:

[[1, 0, 0, 0, 0, 0], [0, 1]] 

出現這種情況與random_state一些值,同時與其他價值是否能夠正常工作;但每次我不得不分析數據時,我都無法搜索它的「正確」價值。

我有python 2.7和scikit-learn 0.18。

+0

如果您嘗試使用'stratify = np.unique(a)',該怎麼辦? – MMF

+0

不幸的是,它不起作用,因爲傳遞給'stratify'的列表必須與要拆分的列表長度相同。 – Hantaa

+0

在文檔中沒有地方聲明即使在一個非常小的子集中也會有所有的類。如果您將唯一的1添加到您的列表中,那麼您將在測試分組中獲得1級。我認爲它應該和你的火車組合中的第一類一樣。例如,如果您刪除'stratify',那麼您將得到列表的尾部,而不是使用混洗類的列表。 – sergzach

回答

2

8個月前提問這個問題,但我想答案可能仍然有助於未來的讀者。

當使用stratify參數時,train_test_split實際上依賴於StratifiedShuffleSplit函數來進行拆分。正如您在documentation中看到的,StratifiedShuffleSplit確實旨在按照您的預期保留每個類別的樣本百分比來進行拆分。

問題是,在您的示例中,25%(8個樣本中的2個)是1,但樣本量不夠大,您無法看到該比例反映在測試集中。您有兩種選擇:

答:增加測試集的大小,選項test_size默認爲0.25,比如說0.5。在這種情況下,我們對樣品的一半將成爲你的測試集,你會看到他們的25%(即1/4)是1

>>> a = [1, 0, 0, 0, 0, 0, 0, 1] 
>>> train_test_split(a, stratify=a, random_state=42, test_size=0.5) 
[[1, 0, 0, 0], [0, 0, 1, 0]] 

B.保持test_size爲默認值並增加你的設置a的大小,使其25%的樣本達到至少4個元素。包含16個樣本或更多的a將爲您做到這一點。

>>> a = [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1] 
>>> train_test_split(a, stratify=a, random_state=42) 
[[0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0]] 

希望有所幫助。

相關問題