В настоящее время я использую нейронную сеть, которая выводит один горячий закодированный вывод.
После оценки с отчетом о классификации я получаю эту ошибку:
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
, мне просто не уронить первый столбец?