классификация документов с использованием кераса - иерархическая последовательность цифр - PullRequest
0 голосов
/ 19 декабря 2018

В настоящее время я подхожу к проблеме классификации в следующей ситуации:

Метки всегда имеют длину 5 цифр, например:

99923 this is sample document one
56743 this is sample document two
...

, где первая единичная цифра обозначает определеннуюкатегория, каждая следующая цифра для подкатегории и так далее.

В настоящее время я использую Keras со следующими настройками:

model = Sequential()
model.add(Dense(512, input_shape=(vocab_size,)))
model.add(Activation('relu'))
model.add(Dropout(0.3))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.3))
model.add(Dense(num_labels))
model.add(Activation('softmax'))
model.summary()
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

Поскольку мои тренировочные данные ограничены (всего около 80 тыс. Выборок), я решил использовать только первую цифру для оценкиОсновная категория и я получили довольно хорошие результаты с точностью ~ 90% без какой-либо предварительной обработки, которую еще предстоит сделать.

5 - this is sample of maincategory 5
9 - this is sample of maincategory 9
...

Теперь я хотел подойти к уровню дальше и использовать две цифры, чтобы предсказать основнуюкатегория и первая подкатегория.Это привело меня к проблеме, заключающейся в том, что зачастую нет ни одного образца, например, для комбинации «12».

51 - this is sample of maincategory 51
95 - this is sample of maincategory 95
...

Я сказал Keras использовать этикетки только по крайней мере с одним образцом (зная, что это дерьмо) и набрал около 40 этикеток с общей точностью 85%, что кажется довольно хорошим, учитывая тот факт, что я потерял много образцов.

У меня вопрос :

Можно ли сделать такой прогноз более простым / эффективным?Если бы я позволил моей "двузначной" модели предсказать невидимую выборку из категории, которая не была обучена, я столкнулся бы с проблемой подбора выборки в неправильную категорию ...

Могу ли ярешить эту проблему прогнозирования с помощью Keras?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Если каждый уровень ваших меток взаимосвязан (или даже имеет высокую зависимость), то следующий подход может помочь улучшить вашу модель.

Добавление выходных данных классификатора первого уровня в качестве входных данных для классификатора следующего уровня.

Это помогает вашей модели использовать прогноз на уровне более высокого уровня для классификации более низкого уровня.

0 голосов
/ 19 декабря 2018

Ну, как я уже упоминал в разделе комментариев, одна мысль, которая приходит мне в голову, состоит в том, чтобы использовать слой softmax для каждого уровня категории в иерархии.Например, для трех категориальных уровней у нас есть три слоя классификатора:

from keras.models import Model

inp = Input(shape=(vocab_size,))
x = Dense(512, activation='relu', input_shape=(vocab_size,))(inp)
x = Dropout(0.3))(x)
x = Dense(128, activation='relu'))(x)

cat_1 = Dense(num_labels_cat1, activation='softmax')(x)
cat_2 = Dense(num_labels_cat2, activation='softmax')(x)
cat_3 = Dense(num_labels_cat3, activation='softmax')(x)

model = Model(inp, [cat_1, cat_2, cat_3])

Как будто информация обо всех категориальных уровнях закодирована на выходе последнего неклассифицирующего слоя.Таким образом, передача его специализированным слоям классификатора позволяет модели извлекать информацию о соответствующем категориальном уровне.

Обратите внимание, что это может иметь или не иметь хорошую производительность.Вы должны экспериментировать, чтобы узнать.Тем не менее, есть еще возможности для совершенствования.Например, вы можете использовать слой Embedding и включить в модель слои Conv1D или LSTM.

Если вы не знакомы с Функциональным API-интерфейсом Keras, вы можете прочитать официальное руководство .

...