Проблема классификации текста - PullRequest
0 голосов
/ 09 мая 2019

Я новичок в ML и пытаюсь классифицировать текст на две категории.Мой набор данных сделан с помощью Tokenizer из медицинских текстов, он несбалансирован и содержит 572 записи для обучения и 471. Для тестирования.

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

Вот токенизированные и подготовленные данные

Вот сценарий: Суть

Пример модели, которую я использовал

    sequential_model = keras.Sequential([
        layers.Dense(15, activation='tanh',input_dim=vocab_size),
        layers.BatchNormalization(),
        layers.Dense(8, activation='relu'),
        layers.BatchNormalization(),
        layers.Dense(1, activation='sigmoid')
    ])

    sequential_model.summary()
    sequential_model.compile(optimizer='adam',
                             loss='binary_crossentropy',
                             metrics=['acc'])

    train_history = sequential_model.fit(train_data,
                                         train_labels,
                                         epochs=15,
                                         batch_size=16,
                                         validation_data=(test_data, test_labels),
                                         class_weight={1: 1, 0: 0.2},
                                         verbose=1)

К сожалению, я не могу поделиться наборами данных.Также я устал использовать keras.utils.to_categorical с метками классов, но это не помогло

1 Ответ

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

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

Чтобы ваша сеть работала лучше, вы всегда можете углубить ее (больше слоев), расширить ее (больше единиц на скрытый слой) и / или добавить дополнительные функции нелинейной активации для своих слоев, чтобы иметь возможность отображать их наболее широкий диапазон значений.

Кроме того, я полагаю, что причина, по которой вы изначально получили так много повторяющихся значений, связана с размером вашей сети.По-видимому, каждая из точек данных имеет примерно 20 000 объектов (довольно большое пространство объектов);размер вашей сети слишком мал, и возможное пространство выходных значений, которые могут быть сопоставлены, следовательно, меньше.Я провел некоторое тестирование с несколькими большими скрытыми единичными слоями (и увеличил количество слоев) и смог увидеть, что значения прогноза действительно варьируются: [0,519], [0,41], [0,37] ...

Понятно также, что производительность вашей сети варьируется, потому что количество функций, которыми вы обладаете, примерно в 50 раз превышает размер вашего обучения (обычно вы хотели бы меньшую долю).Имейте в виду, что обучение для слишком большого количества эпох (например, более 10) для такого небольшого обучения и тестового набора данных, чтобы увидеть улучшения в потерях, не является хорошей практикой, поскольку вы можете серьезно переоценить и, вероятно, признак того, что ваша сеть должна быть шире / глубже.

Все эти факторы, такие как размер слоя, размер скрытой единицы и четное количество эпох, могут рассматриваться как гиперпараметры.Другими словами, удерживайте некоторый процент ваших данных обучения как часть вашего разделения проверки, проходите один за другим через каждую категорию факторов и оптимизируйте, чтобы получить самую высокую точность проверки.Чтобы быть справедливым, ваш тренировочный набор не слишком высок, но я считаю, что вы должны выдержать 10-20% обучения в качестве своего рода набора для проверки правильности этих гиперпараметров, учитывая, что у вас есть такое большое количество функций на точку данных,В конце этого процесса вы сможете определить свою истинную точность теста.Вот как я бы оптимизировал, чтобы получить максимальную производительность этой сети.Надеюсь это поможет.

Подробнее об обучении, тестировании, расщеплении валов

...