2016-10-04 4 views
2

train_test_split() scikit-learnの機能のうち、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」を選択するべきではないでしょうか。私はstratifytrain_test_split()が動作することを期待する方法から、それはのようなものを返す必要があります。他の値と、それが正しく動作しながら、これは、random_stateのいくつかの値で発生

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

を。データを分析する必要があるたびに「正しい」値を検索することはできません。

私はpython 2.7とscikit-learn 0.18を持っています。

+0

'stratify = np.unique(a)'を試してみたらどうなりますか? – MMF

+0

残念ながら、 'stratify'に渡されたリストは、分割されるリストと同じ長さでなければならないので、うまくいきません。 – Hantaa

+0

非常に小さなサブセットでもすべてのクラスが存在すると宣言されているドキュメントの場所はありません。リストに唯一1を追加すると、テスト分割でクラス1が取得されます。私はそれがあなたの列車の分割と同じクラス1の部分であるべきだと思います。たとえば、 'stratify'を削除すると、シャッフルされたクラスを持つリストではなく、リストの末尾が表示されます。 – sergzach

答えて

2

この質問は8か月前に聞かれましたが、私はまだ回答が将来読者を助けるかもしれないと思います。

stratifyパラメータを使用する場合、train_test_splitは、実際には、分割を行うStratifiedShuffleSplit関数に依存しています。 documentationに示されているように、StratifiedShuffleSplitは、期待どおりに各クラスのサンプルのパーセンテージを保存することによって分割を行うことを目指しています。

問題は、25%(2サンプル中8サンプル)が1秒ですが、この割合がテストセットに反映されるのを見るにはサンプルサイズが十分ではありません。

A.は0.25デフォルトは、0.5を言うためのオプションtest_size、とテストセットのサイズを大きく:あなたはここに2つのオプションがあります。この場合、あなたのサンプルの半分があなたのテストセットになり、あなたは(すなわち、1〜4で)それらの25%はB.がデフォルト値にtest_sizeしてください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]] 

ていることがわかりますあなたのセットのサイズを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]] 

希望するものがあります。

関連する問題