"Train_test_split" yönteminden "stratify" parametresi (scikit Learn)


94

train_test_splitScikit Learn paketinden kullanmaya çalışıyorum ama parametrelerle sorun yaşıyorum stratify. Bundan sonra kod:

from sklearn import cross_validation, datasets 

X = iris.data[:,:2]
y = iris.target

cross_validation.train_test_split(X,y,stratify=y)

Ancak, şu sorunu almaya devam ediyorum:

raise TypeError("Invalid parameters passed: %s" % str(options))
TypeError: Invalid parameters passed: {'stratify': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])}

Birinin neler olduğu hakkında bir fikri var mı? Fonksiyon belgeleri aşağıdadır.

[...]

stratify : dizi benzeri veya Yok (varsayılan Yoktur)

Hiçbiri değilse, veriler, bunu labels dizisi olarak kullanarak katmanlara ayrılmış bir şekilde bölünür.

0.17 sürümündeki yenilik: katmanlı bölme

[...]


Hayır, hepsi çözüldü.
Daneel Olivaw

Yanıtlar:


58

Scikit-Learn size sadece "tabakalaşma" argümanını tanımadığını söylüyor, yanlış kullandığınızı değil. Bunun nedeni, parametrenin, alıntı yaptığınız belgelerde belirtildiği gibi 0.17 sürümüne eklenmiş olmasıdır.

Yani Scikit-Learn'ü güncellemeniz yeterlidir.


Scikit-learn 0.21.2 sürümüne sahip olmama rağmen aynı hatayı alıyorum. scikit-learn 0.21.2 py37h2a6a0b8_0 conda-forge
Kareem Jeiroudi

326

Bu stratifyparametre, üretilen numunedeki değerlerin oranının, parametreye sağlanan değerlerin oranıyla aynı olması için bir bölme yapar stratify.

Örneğin, değişken ydeğerleri olan ikili bir kategorik değişkense 0ve 1sıfırların% 25'i ve birlerin% 75'i stratify=yvarsa, rasgele bölümünüzün% 25 0ve% 75'e sahip olmasını sağlayacaktır 1.


117
Bu, soruyu gerçekten cevaplamaz, ancak nasıl çalıştığını anlamak için çok yararlıdır. Çok teşekkürler.
Reed Jessen 18

6
Hala anlamakta zorlanıyorum, bu tabakalaşmanın neden gerekli olduğunu: Eğer verilerde sınıf dengesizliği varsa, verilerin rastgele bölünmesi sırasında ortalama olarak korunmaz mıydı?
Holger Brandl

14
@HolgerBrandl ortalama olarak korunacaktır; tabakalaşma ile kesinlikle korunacaktır.
Yonatan

7
@HolgerBrandl çok küçük veya çok dengesiz veri kümeleri ile, rastgele bölünmenin bölmelerden birinden bir sınıfı tamamen ortadan kaldırması oldukça olasıdır.
cddt

1
@HolgerBrandl Güzel soru! Belki önce bunu ekleyebiliriz, kullanarak eğitim ve test setine ayrılmanız gerekir stratify. İkinci olarak, dengesizliği düzeltmek için sonunda eğitim setinde yüksek hızda örnekleme veya yetersiz örnekleme çalıştırmanız gerekir. Çoğu Sklearn sınıflandırıcı, dengelemek için ayarlayabileceğiniz sınıf ağırlığı adı verilen bir parametreye sahiptir. Son olarak, dengesiz veri kümesi için doğruluktan daha uygun bir ölçüt de alabilirsiniz. F1 veya ROC altındaki alanı deneyin.
Claude COULOMBE

62

Google aracılığıyla buraya gelen gelecekteki benliğim için:

train_test_splitşimdi model_selectioniçeride, dolayısıyla:

from sklearn.model_selection import train_test_split

# given:
# features: xs
# ground truth: ys

x_train, x_test, y_train, y_test = train_test_split(xs, ys,
                                                    test_size=0.33,
                                                    random_state=0,
                                                    stratify=ys)

onu kullanmanın yolu. Yeniden random_stateüretilebilirlik için ayarlanması arzu edilir.


Cevap bu olmalı :) Teşekkürler
SwimBikeRun

15

Bu bağlamda, tabakalaşma, train_test_split yönteminin, girdi veri kümesiyle aynı oranlarda sınıf etiketlerine sahip eğitim ve test alt kümelerini döndürdüğü anlamına gelir.


3

Bu kodu çalıştırmayı deneyin, "sadece çalışıyor":

from sklearn import cross_validation, datasets 

iris = datasets.load_iris()

X = iris.data[:,:2]
y = iris.target

x_train, x_test, y_train, y_test = cross_validation.train_test_split(X,y,train_size=.8, stratify=y)

y_test

array([0, 0, 0, 0, 2, 2, 1, 0, 1, 2, 2, 0, 0, 1, 0, 1, 1, 2, 1, 2, 0, 2, 2,
       1, 2, 1, 1, 0, 2, 1])

@ user5767535 Gördüğünüz gibi sklearn'0.17' sürümüne sahip Ubuntu makinemde çalışıyor, Python 3,5 için Anaconda dağıtımı. Kodu doğru girerseniz ve yazılımınızı güncellerseniz yalnızca bir kez daha kontrol etmenizi önerebilirim.
Sergey Bushmanov

2
@ user5767535 BTW, "0.17 sürümündeki yeni: katmanlı bölme", ​​güncellemelerinizi güncellemeniz gerektiğinden neredeyse emin olmamı sağlıyor sklearn...
Sergey Bushmanov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.