Правильный способ оценки модели классификации ('UndefinedMetricWarning:') - PullRequest
0 голосов
/ 21 мая 2019

В настоящее время я использую нейронную сеть, которая выводит один горячий закодированный вывод.

После оценки с отчетом о классификации я получаю эту ошибку:

UndefinedMetricWarning: Recall and F-score are ill-defined and being set 
to 0.0 in samples with no true labels.

Когда во время фазы train-test-split было получено горячее кодирование моего вывода, мне пришлось отбросить один из столбцов, чтобы избежать фиктивной ловушки для переменных. В результате некоторые из предсказаний моей нейронной сети [0, 0, 0, 0], сигнализируют, что она относится к пятой категории. Я считаю, что это является причиной UndefinedMetricWarning:.

Есть ли решение для этого? Или я должен в первую очередь избегать классификационных отчетов, и есть ли лучший способ оценить эти виды нейронных сетей? Я довольно плохо знаком с машинным обучением и нейронными сетями, пожалуйста, прости мое невежество. Спасибо за помощь !!


Редактировать # 1:

Вот моя сеть:

from keras.models import Sequential
from keras.layers import Dense

classifier = Sequential()
classifier.add(Dense(units = 10000,
                     input_shape = (30183,),
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 4583,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              ) 
classifier.add(Dense(units = 1150,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )    
classifier.add(Dense(units = 292,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 77,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 23,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 7,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 4,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'softmax'
                    )
              )

classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

Выше моя сеть. После обучения сети я предсказываю значения и конвертирую их в метки классов, используя:

from sklearn.preprocessing import LabelBinarizer

labels = np.argmax(predictions, axis = -1)
lb = LabelBinarizer()
labeled_predictions = lb.fit_transform(labels)

При вызове классификационного отчета, сравнивающего y_test и labeled_predctions, я получаю сообщение об ошибке.

** В качестве примечания для любого любопытного я экспериментирую с обработкой естественного языка и нейронными сетями. Причина, по которой входной вектор моей сети настолько велик, состоит в том, что он принимает векторизованный текст как часть своих входных данных.


Редактировать # 2:

Я преобразовал прогнозы в кадр данных и удалил дубликаты как для набора тестов, так и для прогнозов, получая этот результат:

y_test.drop_duplicates()

      javascript  python    r   sql
 738           0       0    0     0
4678           1       0    0     0
6666           0       0    0     1
5089           0       1    0     0
6472           0       0    1     0

predictions_df.drop_duplicates()


     javascript python  r   sql
738           1      0  0     0
6666          0      0  0     1
5089          0      1  0     0
3444          0      0  1     0

Итак, по сути, все происходит из-за того, что softmax преобразуется в двоичный, предсказания никогда не приведут к [0,0,0,0]. Когда одна горячая кодировка y_test, мне просто не уронить первый столбец?

1 Ответ

1 голос
/ 21 мая 2019

Да, я бы сказал, что вы не должны опускать первый столбец.Потому что сейчас вы получаете softmax, а затем берете нейрон с наибольшим значением в качестве метки (метки = np.argmax (прогнозы, ось = -1)).При таком подходе вы никогда не сможете получить вектор результата [0,0,0,0].Так что вместо этого просто создайте однообразный вектор с позициями для всех 5 классов.Ваша проблема со sklearn должна исчезнуть, так как вы получите образцы с истинными метками для вашего 5-го класса.

Я также не уверен, является ли фиктивная переменная ловушка проблемой для нейронных сетей.Я никогда не слышал об этом раньше, и короткий поиск Google ученый не нашел никаких результатов.Также во всех ресурсах, которые я видел до сих пор о нейронных сетях, я никогда не видел этой проблемы.Поэтому я предполагаю (но на самом деле это всего лишь предположение), что это не проблема, с которой вы сталкиваетесь при обучении нейронных сетей.Этот вывод также обусловлен тем фактом, что большинство NN используют softmax в конце.

...