ValueError: Метрики классификации не могут обрабатывать сочетание целей нескольких классов и индикаторов с несколькими метками - PullRequest
0 голосов
/ 07 июня 2019

У меня проблема классификации текстов с пометкой Multi class с 2000 разными метками. Выполнение классификации с использованием LSTM с перчаткой.

  1. Кодировщик меток целевой переменной
  2. слой LSTM с вложенным слоем
  3. Метрика ошибки - оценка F2

Целевая переменная LabelEncoded:

le = LabelEncoder()  
le.fit(y)
train_y = le.transform(y_train)
test_y = le.transform(y_test)

Сеть LSTM такая же, как и ниже, с вложенными перчатками

np.random.seed(seed)
K.clear_session()
model = Sequential()
model.add(Embedding(max_features, embed_dim, input_length = X_train.shape[1],
         weights=[embedding_matrix]))#,trainable=False
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(num_classes, activation='softmax'))
model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy')
print(model.summary())
Моя метрика ошибки - оценка Ф1. Я строю ниже функцию для метрики ошибки
class Metrics(Callback):
    def on_train_begin(self, logs={}):
        self.val_f1s = []
        self.val_recalls = []
        self.val_precisions = []

    def on_epoch_end(self, epoch, logs={}):
        val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()
        val_targ = self.validation_data[1]
        _val_f1 = f1_score(val_targ, val_predict)
        _val_recall = recall_score(val_targ, val_predict)
        _val_precision = precision_score(val_targ, val_predict)
        self.val_f1s.append(_val_f1)
        self.val_recalls.append(_val_recall)
        self.val_precisions.append(_val_precision)
        print("— val_f1: %f — val_precision: %f — val_recall %f" % (_val_f1, _val_precision, _val_recall))
        return

metrics = Metrics()

Модель подходит

model.fit(X_train, train_y, validation_data=(X_test, test_y),epochs=10, batch_size=64, callbacks=[metrics])

Ошибка ниже, после 1-й эпохи:

ValueError: Classification metrics can't handle a mix of multiclass and continuous-multioutput targets

Подскажите, пожалуйста, где я допустил ошибку в своем коде?

Я много пытался разрешить себя, но я не получил никакой подсказки. Можете ли вы помочь мне в этом

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

Ваша проблема вызвана наличием непрерывных значений в val_predict в этой строке кода

_val_f1 = f1_score(val_targ, val_predict)

Вы должны округлить свои прогнозы в val_predict перед вычислением f1_score.

Пример решения:

 _val_f1 = f1_score(val_targ,np.round(val_predict))

Хочу упомянуть: если вы хотите изменить порог функции округления (по умолчанию 0,5), вы можете добавлять или вычитать значения в [0,1]интервал:

>>> a = np.arange(0,1,0.1)
>>> print(a, abs(np.round(a-0.1)), sep='\n')
>>> print(a, abs(np.round(a+0.3)), sep='\n')

[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
array([0.  0.  0.  0.  0.  0.  1.  1.  1.  1.])

[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
array([0., 0., 0., 1., 1., 1., 1., 1., 1., 1.])

Надеюсь, это поможет!

0 голосов
/ 07 июня 2019

Оценка F1, отзыв и точность - это метрики для двоичной классификации, для использования которой в задаче с несколькими классами / метками, вам необходимо добавить параметр в вашу функцию f1_score, recall_score и precision_score.

Попробуйте с этим:

_val_f1 = f1_score(val_targ, val_predict, average='weighted')
_val_recall = recall_score(val_targ, val_predict, average='weighted')
_val_precision = precision_score(val_targ, val_predict, average='weighted')

Найти дополнительную информацию для среднего параметра здесь:
https://scikit -learn.org / стабильный / модули / полученные / sklearn.metrics.f1_score.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...