Я построил последовательную модель керас с 35000 входных выборок и 20 предикторов, распределение выходных классов тестовых данных:

  • Класс_0 = 5,6%
  • Класс_1 = 7,7%
  • Класс_2 = 35,6%
  • Класс_3 = 45,7%
  • Класс_4 = 5,4%

После преобразования выходных данных в матрицу двоичного класса с использованием (np_utils.to_categorical) точность обучения составляет около 54%, когда я делаю подбор модели с тестовыми данными (15000 выборок), все прогнозы (100%) оказываются для одного и того же класса, который class_3 "самый высокий показатель в результатах обучения", что является причиной этого смещения и отсутствия единого прогноза для других классов? как сделать модель чувствительной для прогнозирования меньшего числа классов и повысить точность, особенно если совпадение данных обучения низкое, например, 1-3%.

model = Sequential()
model.add(Dense(40, input_dim=20,  activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10,  activation='relu'))
model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

model.fit(X, Y, epochs=500,  verbose=1)
7
Ray 3 Апр 2017 в 00:30

2 ответа

Лучший ответ

Самый простой способ восстановить баланс вашей потери - это:

  1. Определите диктант class_weights:

    class_weights_dict = {0: 1.0 / 0_class_freq, 1: 1.0 / 1_class_freq, ... }
    

    Где i_class_freq - частота класса i-th.

  2. Измените вашу функцию fit на:

    model.fit(X, Y, epochs=500,  verbose=1, class_weight=class_weights_dict)
    

Определенная выше модель должна быть эквивалентна вашей модели с байесовскими весовыми классами.

3
Marcin Możejko 3 Апр 2017 в 21:03

Один из способов решения этой проблемы - избыточная выборка из представленных примеров классов. то есть, если у вас есть два класса A (66,6%) и B (33,3%), то вы выбираете B дважды по сравнению с A. Чтобы сделать его еще более простым, вы можете изменить свой набор данных, дублируя B один раз и делая набор данных примерно таким же, как A + 2 * B .

Или вы можете изменить функцию потерь так, чтобы она давала больший вес при неправильной классификации недопредставленных классов.

1
vikasreddy 3 Апр 2017 в 06:38