WedX - журнал о программировании и компьютерных науках

Проблема классификации текста

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

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

Здесь представлены токенизированные и подготовленные данные.

Вот сценарий: Gist

Образец модели, который я использовал

    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 с метками классов, но это не помогло


  • Привет, Ярослав, в чем именно твоя проблема? Я запустил ваш код, и вы уже получаете приличную точность проверки / обучения 82-84%. Ваши кривые потерь имеют смысл, поскольку мы видим, что сеть переобладает обучающим набором, в то время как мы видим обычную чашеобразную кривую проверки. Чтобы ваша сеть работала лучше, вы всегда можете углубить ее (больше слоев), расширить ее (больше единиц на скрытый слой) и / или добавить больше функций нелинейной активации, чтобы ваши слои могли отображать более широкий диапазон значений. В качестве примера я изменил активацию 2-го слоя на сигмовидный и увидел, что точность увеличилась на 2-3%. 09.05.2019
  • @SachinRaghavendran Точность высока, но если вы посмотрите на результаты прогноза, вы увидите, что все записи относятся к одному классу. Я думаю, это потому, что в наборе данных гораздо больше образцов с меткой «0». Я пытался настроить количество слоев и параметров, но результат предсказания всегда находится в районе одного числа с очень небольшим отклонением. Это выводится с вашими изменениями: [[0,421591] [0,395864] [0,395864] [0,421591] [0,395864] [0,395864] ...] И это метки поездов: [0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 ...] К сожалению, в этом нет смысла, хотя это данные поезда 10.05.2019
  • вы сказали, что вывод будет [[0,421591] [0,395864] [0,395864] [0,421591] [0,395864] [0,395864] ...]; этого следовало ожидать с сигмовидным слоем. Функция активации сигмоида сведет все выходные значения прямого прохода к диапазону от 0 до 1 (вот почему вы видите ерунду). Теперь, когда метки генерируются, если результат ниже 0,5, тогда модель будет классифицироваться как 0, а указанные выше 0,5 будут классифицированы как 1 (на основе моего взгляда на исходный код, это обрабатывается в model.evaluate). 11.05.2019
  • Кроме того, я считаю, что причина, по которой вы изначально получали так много повторяющихся значений, связана с размером вашей сети. По-видимому, каждая из точек данных имеет примерно 20 000 функций (довольно большое пространство функций); размер вашей сети слишком мал, и, следовательно, возможное пространство выходных значений, которые могут быть сопоставлены, меньше. Я провел некоторое тестирование с некоторыми более крупными скрытыми слоями единиц (и увеличил количество слоев) и смог увидеть, что значения прогнозов действительно различаются: [0,519], [0,41], [0,37] ... (они будут отображаться в двоичные значения на основе приведенного выше комментария) 11.05.2019
  • Также понятно, что производительность вашей сети варьируется, потому что количество имеющихся у вас функций примерно в 50 раз превышает размер вашего обучения (обычно вам нужна меньшая доля). Имейте в виду, что обучение в течение слишком большого количества эпох (например, более 10) для такого небольшого набора данных для обучения и тестирования, чтобы увидеть улучшения в потерях, не является хорошей практикой, поскольку вы можете серьезно переобучиться и, вероятно, является признаком того, что ваша сеть должна быть шире / глубже. . 11.05.2019
  • Спасибо за советы. Я знал о сигмовидном слое, но другие были полезны. Вы можете объединить их в качестве ответа, и я приму 11.05.2019
  • Очень признателен, Ярослав. Рад, что это помогло тебе. 12.05.2019

Ответы:


1

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

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

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

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

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

Подробнее о тренировках, тестах, val split

11.05.2019
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]