3

私は、scikit-learnラッパーでKerasを使用しています。特に、ハイパーパラメータの最適化にはGridSearchCVを使用したいと考えています。ValueError:マルチラベルインジケータとバイナリの混合を扱うことができません

これはマルチクラスの問題です。つまり、ターゲット変数は、n個のクラスのセットで1つのラベルのみを選択できます。たとえば、ターゲット変数は 'Class1'、 'C​​lass2' ... 'Classn'です。

# self._arch creates my model 
nn = KerasClassifier(build_fn=self._arch, verbose=0) 
clf = GridSearchCV(
    nn, 
    param_grid={ ... }, 
    # I use f1 score macro averaged 
    scoring='f1_macro', 
    n_jobs=-1) 

# self.fX is the data matrix 
# self.fy_enc is the target variable encoded with one-hot format 
clf.fit(self.fX.values, self.fy_enc.values) 

問題は、スコアは、クロスバリデーションの間に計算されたときに、何らかの理由で予測が(バイナリラベルに崩壊しつつターゲット変数のみを有する場合、検証サンプルに対する真のラベルが、ワンホット符号化される、ということです2つのクラス)。例えば、これは、スタックトレースの最後の部分は次のとおりです。

........................................................................... 
/Users/fbrundu/.pyenv/versions/3.6.0/lib/python3.6/site-packages/sklearn/metrics/classification.py in _check_targets(y_true=array([[ 0., 1.], 
     [ 0., 1.], 
     [ 0... 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.]]), y_pred=array([1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1,...0, 1, 0, 0, 1, 0, 0, 0, 
     0, 0, 0, 0, 1, 1])) 
    77  if y_type == set(["binary", "multiclass"]): 
    78   y_type = set(["multiclass"]) 
    79 
    80  if len(y_type) > 1: 
    81   raise ValueError("Can't handle mix of {0} and {1}" 
---> 82       "".format(type_true, type_pred)) 
     type_true = 'multilabel-indicator' 
     type_pred = 'binary' 
    83 
    84  # We can't have more than one value on y_type => The set is no more needed 
    85  y_type = y_type.pop() 
    86 

ValueError: Can't handle mix of multilabel-indicator and binary 

私はワンホットエンコーディングの予測をお返しするKeras/sklearnを指示することができますどのように?

+1

値をエンコードせずに直接 'fy'を使うとどうなりますか?マルチクラスでは問題ではありません。ターゲットのワンホットエンコーディングは複数ラベルの問題でのみ必要ですIMHO –

答えて

2

Vivekのコメントに続いて、元の(ホットコード化されていない)ターゲット配列を使用しました。the comments to this issueのように、sparse_categorical_crossentropyという損失を(私のKerasモデルでコードを参照して)設定しました。

arch.compile(
    optimizer='sgd', 
    loss='sparse_categorical_crossentropy', 
    metrics=['accuracy']) 
+0

問題を解決した場合は、回答を受け入れて質問を閉じてください –

+0

@VivekKumar SOのルールを知っていれば、以前の回答を受け入れることはできません2日後に質問が尋ねられます。 – gc5

+0

はい、申し訳ありません。私のバグ –

関連する問題