Як навести лад у поштовій скриньці за допомогою нейронної мережі

скриньці

У нашому блозі ми багато пишемо про створення email-розсилок та роботу з електронною поштою. Ми вже обговорили складності боротьби зі спамом, майбутнє email, питання захисту поштового листування, а також техніки роботи з email, які застосовують керівники великих ІТ-компаній.

У сучасному світі люди отримують безліч листів, і на повне зростання постає проблема з їхньою класифікацією та впорядкуванням поштової скриньки. Інженер із США Андрій Куренков у своєму блозі розповів про те, як вирішив це завдання за допомогою нейронної мережі. Ми вирішили висвітлити хід цього проекту та представляємо вам першу частину оповідання.

Код проекту доступний тут.

Куренков пише, що один із його улюблених міні-проектів, EmailFiler, з'явився завдяки завданню на курсі «Введення в машинне навчання» у Технологічному Інституті Джорджії. Завдання полягало в тому, щоб взяти якийсь набір даних, застосувати до нього ряд контрольованих алгоритмів, що навчаються, і проаналізувати результати. Суть у тому, що за бажанням можна було використати власні дані. Розробник так і вчинив - експортував дані свого gmail для дослідження можливостей машинного навчання у вирішенні задачі сортування електронної пошти.

навести

Категорії (папки) та кількість листів у кожній з них на момент старту проекту

Будь-хто, хто вивчав обробку природних мов, відразу запропонує один простий підхід – використання моделі Bag of Words (Багато слів). Це один із найпростіших алгоритмів класифікації текстів – знайти N загальних слів для всіх текстів та скласти таблицю бінарних ознак для кожного слова (ознака дорівнює 1, якщо заданий текст містить слово, та 0 – якщо не містить).

Наскільки добре всепрацювало? Непогано, але хотілося більшого. Куренков каже, що тоді захоплювався фреймворком для машинного навчання Orange ML на Python, і, як і було за завданням, протестував кілька алгоритмів на своєму наборі даних. Виділялися два алгоритми – найкраще показали себе дерева прийняття рішень, а найгірше – нейронні мережі:

поштовій

Так з невеликим набором даних впоралися дерева прийняття рішень

скриньці

А так - нейронні мережі

Спроба номер два

Через кілька років Куренков вирішив ще раз спробувати вирішити завдання — хоч сам проект в університеті вже давно здали, хотілося покращити результати.

Цього разу інженер вирішив як один з основних інструментів застосувати Keras, тому що він написаний на Python і також непогано ладнає з пакетами NumPy, pandas і scikit-learn і підтримується бібліотекою Theano.

Отже, перше, що спадає на думку: випробувати цей приклад на власних даних - подивитися, чи покращить роботу Keras. На щастя, зберігся старий код для парсингу поштової скриньки, а Keras має зручний клас Tokenizer для отримання ознак тексту. Тому можна легко створити набір даних у такому ж форматі, як і в прикладі, та отримати нову інформацію про поточну кількість електронних листів:

Вісім тисяч листів ніяк не назвеш великим набором даних, але все ж таки цього достатньо для того, щоб трохи позайматися серйозним машинним навчанням. Після переведення даних у потрібний формат залишається лише подивитися, чи працює навчання нейронної мережі цих даних. Приклад із використанням Keras дає легко зробити таке:

85% точності! Це набагато вище за жалюгідні 65% старої нейронної мережі. Чудово.

Старий код робив загалом наступне – визначав найчастішезустрічаються слова, створював бінарну матрицю ознак і навчав нейронну мережу з одним прихованим шаром. Можливо, все через новий нейрон «relu», dropout-регуляризацію та використання методів оптимізації, відмінних від стохастичного градієнтного спуску? Оскільки ознаки, знайдені за старими даними, бінарні та представлені у вигляді матриці, їх дуже легко перетворити на набір даних для навчання цієї нейронної мережі. Отже, ось результати:

Приклад, який використовує Keras, просто відбирає 1000 слів, що найбільш часто зустрічаються, у велику матрицю без додаткового фільтрування і передає її нейронної мережі. Якщо не обмежувати відбір ознак, їх можуть бути обрані більш підходящі, що збільшує загальну точність роботи алгоритму.

Причина або в цьому або в наявності помилок у коді: його зміна з метою зробити процес відбору ознак менш обмежує призводить до підвищення точності лише до 70%. У будь-якому разі інженер з'ясував, що можна було покращити свій старий результат із використанням сучасної бібліотеки машинного навчання.

Тепер виникало нове питання – чи можна досягти ще вищої точності?