2016-11-17 25 views
1

sklearn cross_validation train_test_splitモジュールでpandasデータフレームを使用しています。IndexError:位置インデクサーが範囲外です。stratify sklearn test_train_split

d=pandas.DataFrame({'a':np.random.randn(300), 
        'c':np.array([el for el in np.ones(100)]+ 
           [el for el in np.zeros(200)])}) 
from sklearn import cross_validation 
(X,y)=(d['a'],d['c']) 

これは

X_train_and_cv, X_test,y_train_and_cv,y_test = sklearn.cross_validation.train_test_split(X,y,test_size=0.2,random_state=0) 
X_train, X_cv,y_train,y_cv = sklearn.cross_validation.train_test_split(X_train_and_cv,y_train_and_cv,test_size=0.2,random_state=0) 

はなぜこの仕事をして動作しますか?

X_train_and_cv, X_test,y_train_and_cv,y_test = sklearn.cross_validation.train_test_split(X,y,test_size=0.2,random_state=0,stratify=y) 
X_train, X_cv,y_train,y_cv = sklearn.cross_validation.train_test_split(X_train_and_cv,y_train_and_cv,test_size=0.2,random_state=0,stratify=y) 

in _is_valid_list_like(self, key, axis) 
    1536   l = len(ax) 
    1537   if len(arr) and (arr.max() >= l or arr.min() < -l): 
-> 1538    raise IndexError("positional indexers are out-of-bounds") 
    1539 
    1540   return True 

IndexError: positional indexers are out-of-bounds 

答えて

1

TL; DRは:train_test_splitへのあなたの2番目の呼び出しは、使用yよりstratifyのための異なる配列の長さを使用しています。 stratify=y_train_and_cvを使用してください。


まず、少しサイドノート:cross_validation(0.17.1ドキュメントhere)がまもなく廃止されます、あなたの代わりにmodel_selection.train_test_split (0.18.1)を使用する必要があります。

# Same as this in older versions: 
# from sklearn.cross_validation import train_test_split 
from sklearn.model_selection import train_test_split 

これは素晴らしいです:私は、次のものの長さを短くするtrain_test_split itselfをインポートします

X_train_and_cv, X_test,y_train_and_cv,y_test = train_test_split(X,y, 
                   test_size=0.2, 
                   random_state=0, 
                   stratify=y) 

これは罰金ではありませんがy=y_train_and_cv(LEN = 240)stratify=y(LEN = 300)

以来
X_train, X_cv,y_train,y_cv = train_test_split(X_train_and_cv, 
               y_train_and_cv, 
               test_size=0.2, 
               random_state=0, 
               stratify=y) 

でそれを置き換える:

X_train, X_cv,y_train,y_cv = train_test_split(X_train_and_cv, 
               y_train_and_cv, 
               test_size=0.2, 
               random_state=0, 
               stratify=y_train_and_cv) 
+0

うわー、私は、可変引数の代わりに文字列として 'y'を解釈していたことに気づきました - 例えば、stratify = 'yes' - そして第2引数で層別化配列を推測していたと仮定します。 。 – user86895

+0

ああ!それはstratify = Trueだったでしょう:) –

関連する問題