web-dev-qa-db-ja.com

ValueError:n_splits = 10は各クラスのメンバーの数より大きくすることはできません

次のコードを実行しようとしています:

_from sklearn.model_selection import StratifiedKFold 
X = ["hey", "join now", "hello", "join today", "join us now", "not today", "join this trial", " hey hey", " no", "hola", "bye", "join today", "no","join join"]
y = ["n", "r", "n", "r", "r", "n", "n", "n", "n", "r", "n", "n", "n", "r"]

skf = StratifiedKFold(n_splits=10)

for train, test in skf.split(X,y):  
    print("%s %s" % (train,test))
_

しかし、次のエラーが発生します。

_ValueError: n_splits=10 cannot be greater than the number of members in each class.
_

私はここを見てきました scikit-learnエラー:yで最も人口の少ないクラスにはメンバーが1つしかない ですが、コードのどこに問題があるのか​​本当にわかりません。

私のリストはどちらも14 print(len(X))print(len(y))の長さです。

私の混乱の一部は、membersが何として定義されているか、およびこのコンテキストでのclassが何であるかがわからないことです。

質問:エラーを修正するにはどうすればよいですか?会員とは?クラスとは? (このコンテキストでは)

7
SFC

階層化とは、各折り目の各クラスの比率を維持することです。したがって、元のデータセットに60%、20%、20%の比率で3つのクラスがある場合、層別化は各比率でその比率を維持しようとします。

あなたの場合、

X = ["hey", "join now", "hello", "join today", "join us now", "not today",
     "join this trial", " hey hey", " no", "hola", "bye", "join today", 
     "no","join join"]
y = ["n", "r", "n", "r", "r", "n", "n", "n", "n", "y", "n", "n", "n", "y"]

合計14のサンプル(メンバー)が分布しています。

class    number of members         percentage
 'n'        9                        64
 'r'        3                        22
 'y'        2                        14

したがって、StratiifiedKFoldは、各フォールドでその比率を維持しようとします。これで、10分割(n_splits)が指定されました。つまり、これは、1つのフォールドで、クラス 'y'が比率を維持するために、少なくとも2/10 = 0.2メンバーを意味します。ただし、1未満のメンバー(サンプル)を指定することはできないため、そこでエラーがスローされます。

n_splits=10の代わりにn_splits=2を設定した場合、 'y'のメンバー数は2/2 = 1になるため、機能します。n_splits = 10が機能するためには正しくは、クラスごとに少なくとも10個のサンプルが必要です。

11
Vivek Kumar