Вихователь | 29 жовтня 2018 р
Читання настрою тексту за допомогою машинного навчання називається аналізом настроїв, і це один з найвидатніших випадків використання в класифікації тексту. Це потрапляє в дуже активну галузь досліджень обробки природних мов (NLP).
Інші поширені випадки використання класифікації тексту включають виявлення спаму, автоматичне позначення запитів клієнтів та категоризацію тексту за визначеними темами. То як ти можеш це зробити?
Виберіть набір даних
Перш ніж розпочати, давайте подивимось на наявні у нас дані. Завантажте набір даних, перекладений на іспанську мову, зі сховища машинного навчання UCI.
Цей набір даних містить теговані відгуки від IMDb, Amazon та Yelp. Кожен відгук оцінюється оцінкою 0 за негативні настрої або 1 за позитивні.
Вийміть папку в папку даних і завантажте дані за допомогою Pandas:
Результат повинен бути таким:
За допомогою цього набору даних ви можете навчити модель прогнозувати почуття вироку.
Один із способів зробити це - підрахувати частоту кожного слова в кожному реченні та пов’язати цей рахунок із повним набором слів у наборі даних. Я б почав із того, що взяв дані та створив словниковий запас усіх слів у всіх реченнях. Збірник текстів називається корпусом у злотих.
Словниковий запас у цьому випадку - це список слів, що з’явилися в нашому тексті, де кожне слово має свій власний покажчик. Це дозволяє створити вектор для речення. Тоді ви взяли б речення, яке хочете векторизувати, і підрахували його появу у словниковому запасі. Отриманий вектор буде словниковим запасом і підрахунком кожного слова у словниковому запасі.
Отриманий вектор також називають вектором ознак. У векторі ознак кожен вимір може бути числовим або категоріальним ознакою, наприклад, висотою будівлі, ціною запасу або, в нашому випадку, кількістю слів у словниковому запасі. Ці вектори функцій є найважливішим елементом в галузі науки про дані та машинного навчання, оскільки модель, яку ви хочете навчити, залежить від них.
Ми збираємося це проілюструвати. Уявіть, що у вас є такі два речення:
Потім ви можете використовувати CountVectorizer, що надається бібліотекою scikit-learn, для векторизації речень.
Візьміть слова з кожного речення та створіть словник усіх унікальних слів у реченнях. Цей словник можна використовувати для створення вектора характеристик підрахунку слів:
Цей словник також служить покажчиком для кожного слова. Тепер ви можете взяти кожне речення і отримати слова, що з’являються відповідно до словника вище. Словник складається з п’яти слів у наших реченнях, кожне з яких представляє слово в словниковому запасі. Коли ви берете два речення вище і перетворюєте їх за допомогою CountVectorizer, ви отримаєте вектор, що представляє кількість кожного слова в реченні:
Тепер ви можете бачити результуючі вектори функцій для кожного речення на основі наведеного вище словника. Наприклад, якщо ви подивитесь на перший елемент, ви зможете побачити, що обидва вектори мають 1. Це означає, що в обох реченнях зустрічається Джон, який є першим у словниковому запасі.
Це вважається моделлю сумки слів, що є загальним способом у PLN створювати вектори з тексту. Кожен документ представлений у вигляді вектора. Тепер ви можете використовувати ці вектори як вектори функцій для моделі машинного навчання. Це підводить нас до нашої наступної частини, визначення базової моделі.
Визначення базової моделі
При роботі з машинним навчанням важливим етапом є визначення базової моделі. Зазвичай це передбачає просту модель, яка потім використовується як порівняння з більш досконалими моделями, які ви хочете протестувати. У цьому випадку ви будете використовувати базову модель, щоб порівняти її з більш досконалими методами, що включають (глибокі) нейронні мережі.
По-перше, ви поділите дані на набір тренувань та тестів, які дозволять вам оцінити точність і побачити, чи добре ваша модель узагальнює. Це означає, якщо модель може добре працювати з даними, яких ви раніше не бачили. Це один із способів перевірити, чи модель не переобладнана.
Перенапруження - це коли модель занадто добре тренується на даних тренувань. Ви хочете уникнути переобладнання, оскільки це означало б, що модель переважно запам’ятовувала лише дані навчання. Це пояснювало б високу точність даних навчання, але низьку точність даних тесту.
Ми починаємо з того, що беремо набір даних Yelp, який ми витягуємо з нашого об’єднаного набору даних. Звідти ми беремо фрази та мітки. Значення ".values" повертають масив NumPy замість об'єкта pandas, який у цьому контексті легше читати:
Тут ми знову використовуватимемо модель «Мішок слів» вище, щоб векторизувати речення. Для цього завдання ви можете знову використати CountVectorizer. Оскільки під час навчання у вас можуть бути недоступні дані тестів, ви можете створити словниковий запас, використовуючи лише дані навчання. Використовуючи цей словник, ви можете створити вектори функцій для кожного речення в навчальному та тестовому наборах:
Результат
Ви можете бачити, що отримані вектори характеристик мають 750 зразків, тобто кількість навчальних зразків, які ми маємо після поділу для навчального набору. Кожна вибірка має 1714 вимірів, тобто розмір словникового запасу. Крім того, видно, що ми отримуємо розріджену матрицю.
Це тип даних, який оптимізований для масивів лише з кількома ненульовими елементами, який відстежує лише ненульові елементи, зменшуючи навантаження на пам’ять.
CountVectorizer виконує токенізацію, яка розділяє речення на набір лексем, як це бачилося раніше у словниковому запасі. Крім того, він видаляє розділові знаки та спеціальні символи та може застосовувати інші попередні обробки до кожного слова. Якщо ви хочете, ви можете використовувати спеціальний токенізатор з бібліотеки NLTK з CountVectorizer або використовувати будь-яку кількість налаштувань для покращення продуктивності вашої моделі.
Класифікаційна модель, яку ми будемо використовувати, - це логістична регресія, яка є простою, але потужною лінійною моделлю. Це форма регресії від 0 до 1 на основі вектора вхідних характеристик.
Вказуючи граничне значення (за замовчуванням 0,5), для класифікації використовується регресійна модель.
Ви можете бачити, що логістична регресія досягла вражаючих 78,8%, але давайте подивимось, як ця модель працює в інших наборах даних, які ми маємо. У цьому сценарії ми виконуємо та оцінюємо весь процес для кожного набору даних, який ми маємо:
Результат
Чудово! Ви бачите, що ця досить проста модель досягає досить хорошої точності. Було б цікаво подивитися, чи зможемо ми подолати цю модель. У наступній частині ми познайомимось із (глибокими) нейронними мережами та як застосувати їх до класифікації тексту.
Вступ до глибоких нейронних мереж
Якщо ви вже знайомі з нейронними мережами, сміливо переходьте до відповідних частин Keras. У цьому розділі ви отримаєте огляд нейронних мереж та їх внутрішньої роботи, а пізніше ви побачите, як використовувати нейронні мережі з чудовою бібліотекою Кераса.
Все почалося з відомої статті у 2012 році Джеффрі Хінтона та його команди, яка перевершила всі попередні моделі у знаменитому виклику ImageNet.
Проблемою можна вважати Кубок світу з комп'ютерного зору, який полягає у класифікації великого набору зображень за даними мітками. Джеффрі Хінтону та його команді вдалося перевершити попередні моделі, використовуючи згорткову нейронну мережу (CNN), про яку ми також розповімо у цьому посібнику.
З тих пір нейронні мережі перейшли в різні галузі, включаючи класифікацію, регресію та навіть генеративне моделювання. Загальні поля включають комп'ютерний зір, розпізнавання мови та обробку природної мови (NLP).
Нейронні мережі, або їх іноді називають штучними нейронними мережами (ANN), - це обчислювальні мережі, які надихалися нейронними мережами в мозку людини. Вони складаються з нейронів (їх також називають вузлами), які з’єднані, як на малюнку нижче.
Ви починаєте з того, що маєте шар вхідних нейронів, куди ви подаєте свої вектори об’єктів, а значення перетікають у прихований шар. На кожному підключенні ви подаєте значення вперед, тоді як значення множиться на вагу і до значення додається упередження. Це відбувається при кожному підключенні і зрештою досягає вихідного рівня з одним або кількома вихідними вузлами.
Якщо ви хочете мати двійкову класифікацію, ви можете використовувати один вузол, але якщо у вас кілька категорій, ви повинні використовувати кілька вузлів для кожної категорії:
Ви можете мати скільки завгодно прихованих шарів. Насправді нейронна мережа з декількома прихованими шарами вважається глибокою нейронною мережею.
Можливо, вам уже цікаво, як розраховуються ваги, і це, очевидно, найважливіша частина нейронних мереж, але і найскладніша. Алгоритм починається з ініціалізації ваг випадковими значеннями, а потім вони навчаються методом, званим зворотним розповсюдженням.
Це робиться за допомогою методів оптимізації, таких як градієнтний спуск, щоб зменшити похибку між розрахунковим та бажаним результатом (також званий цільовим результатом). Помилка визначається функцією втрат, втрату якої ми хочемо мінімізувати за допомогою оптимізатора. Весь процес занадто обширний, щоб охопити тут, тому ви можете побачити його більш детально, здійснивши пошук в Інтернеті.
Потрібно знати, що існує кілька методів оптимізації, якими ви можете скористатися, але найбільш вживаний в даний час оптимізатор називається Адам https://arxiv.org/abs/1412.6980, який добре працює з різними проблемами.
Ви також можете використовувати різні функції втрат, але в цьому посібнику вам знадобиться лише функція перехресної ентропії втрати або, точніше, двійкова поперечна ентропія, яка використовується для двійкових задач класифікації. Обов’язково експериментуйте з різними доступними методами та інструментами. Деякі дослідники навіть стверджують у нещодавній статті, що вибір найкращих методів роботи нагадує алхімію. Причина в тому, що багато методів недостатньо добре пояснені і складаються з багатьох коригувань та тестів.
Представляємо кери
Keras - це API глибокого навчання та нейронних мереж Франсуа Шолле, який може працювати на вершинах Tensorflow (Google), Theano або CNTK (Microsoft). Процитувавши книгу Франсуа Шолле «Глибоке навчання з Python»:
Keras - це бібліотека модельного рівня, що забезпечує будівельні блоки високого рівня для розробки моделей глибокого навчання. Він не обробляє операції низького рівня, такі як маніпуляції натягувачами та диференціація. Натомість для цього він покладається на спеціалізовану та добре оптимізовану тензорну бібліотеку, яка працює як фоновий механізм Кераса.
Це чудовий спосіб почати експериментувати з нейронними мережами без необхідності самостійно реалізовувати кожен шар та фрагмент. Наприклад, Tensorflow - чудова бібліотека машинного навчання, але для того, щоб модель працювала, вам доведеться впровадити багато типового коду.
Встановлення керасів
Перш ніж встановлювати Keras, вам знадобиться Tensorflow, Theano або CNTK. У цьому підручнику ми будемо використовувати Tensorflow, але сміливо використовуйте той фреймворк, який найкраще відповідає вашим потребам. Keras можна встановити за допомогою PyPI за допомогою наступної команди:
Ви можете вибрати бекенд, який ви хочете мати, відкривши файл конфігурації Keras, який ви можете знайти тут:
Файл конфігурації повинен виглядати так:
Ви можете змінити там серверне поле на "theano", "tensorflow" або "cntk", залежно від того, яке ви встановили.
Його перша модель Кераса
Тепер ви готові експериментувати з Керасом. Keras підтримує два основних типи моделей. У ньому є API послідовних моделей, який ви побачите у використанні в цьому посібнику, та функціональний API, який може виконувати всю послідовну модель, але також може використовуватися для вдосконалених моделей із складною архітектурою мережі.
Послідовна модель - це лінійний набір шарів, де ви можете використовувати найрізноманітніші шари, доступні в Keras. Найпоширенішим шаром є щільний шар, який є вашим щільно пов’язаним нейронним мережевим шаром з усіма вагами та зміщеннями, які ви вже знайомі.
Давайте подивимось, чи зможемо ми вдосконалити попередню модель логістичної регресії. Ви можете використовувати масиви X_train та X_test, які ви створили в нашому попередньому прикладі.
Перш ніж будувати нашу модель, нам потрібно знати вхідний вимір наших векторів характеристик. Це відбувається лише в першому шарі, оскільки наступні шари можуть робити висновки автоматично. Щоб побудувати послідовну модель, можна додавати шари по одному в такому порядку:
Перш ніж розпочати навчання моделі, необхідно налаштувати процес навчання. Це робиться за допомогою методу .compile (). Цей метод визначає оптимізатор і функцію втрат.
Крім того, ви можете додати список метрик, які згодом можуть бути використані для оцінки, але не впливають на навчання. У цьому випадку ми хочемо використовувати двійкову перехресну ентропію та оптимізатор Адама, про які ми згадали раніше. Keras також включає зручну функцію .summary (), яка забезпечує огляд моделі та кількості параметрів, доступних для навчання:
Результат
Ви можете помітити, що ми маємо 9935 параметрів для першого шару та ще 6 для наступного. Звідки вони беруться?
Ми маємо 19870 вимірів для кожного вектора ознак, а потім маємо 5 вузлів. Нам потрібні ваги для кожного виміру об’єкта, і кожен вузол представляє 1985 * 5 = 9930 параметрів, а потім ми маємо ще 5 додаткових ухилів для кожного вузла, що дозволяє отримати параметри 9935.
На кінцевому вузлі ми маємо ще 5 вагових коефіцієнтів та ухил, що дає нам 6 параметрів.
Зараз саме час розпочати тренування за допомогою функції .fit ().
Оскільки навчання нейронних мереж - це ітераційний процес, навчання не припиняється, коли воно проводиться один раз. Ви повинні вказати кількість ітерацій, які ви хочете навчити моделі.
Ці ітерації зазвичай називають епохами. Ми хочемо проводити навчання протягом 100 епох, щоб ми могли бачити, як змінюється точність після кожної епохи.
Іншим параметром, який ви маєте на вибір, є розмір партії. Розмір партії відповідає за кількість зразків, які ми хочемо використовувати за одну епоху, що означає, скільки зразків використовується за один прохід вперед/назад.
Це збільшує швидкість обчислення, оскільки для запуску потрібно менше разів, але також потрібно більше пам'яті, і модель може погіршуватися при більших розмірах партії. Оскільки у нас є невеликий навчальний фонд, ми можемо залишити це за низького розміру партії:
Тепер ви можете використовувати метод .evaluate () для вимірювання точності моделі. Це можна зробити як для навчальних даних, так і для даних тестів. Ми очікуємо, що дані навчання будуть точнішими, ніж дані тесту. Чим більше ви тренуєте нейронну мережу, тим більша ймовірність того, що вона почне зайвим чином займатися.
Зверніть увагу, що якщо ви повторите метод .fit (), ви почнете з розрахункових ваг з попереднього тренування. Не забудьте відновити модель, перш ніж знову починати її тренувати.
Тепер давайте оцінимо точну модель:
Ви вже бачите, що модель була переобладнана, оскільки вона досягла 100% точності для навчального набору. Але цього очікували, оскільки кількість епох було досить великим для цієї моделі. Однак точність тестового набору вже перевищила попередню логістичну регресію з моделлю «Мішок слів», що є подальшим великим кроком з точки зору нашого прогресу.
Щоб полегшити своє життя, ви можете скористатися цією маленькою допоміжною функцією для перегляду втрат і точності ваших навчальних та тестових даних на основі історії (історії).
Цей виклик, який автоматично застосовується до кожної моделі Кераса, реєструє втрати та додаткові показники, які можна додати в методі .fit (). У цьому випадку нас цікавить лише точність. Ця допоміжна функція використовує бібліотеку matplotlib:
Щоб скористатися цією функцією, просто зателефонуйте plot_history ():
Ви бачите, що ми перетренували нашу модель, оскільки навчальний набір досяг 100% точності.
Хорошим способом побачити, коли модель починає перевантажуватись, є те, коли втрата даних перевірки знову починає збільшуватися. Це, як правило, хороший момент для зупинки моделі. Ви бачите, що це відбувається приблизно в 15-25 епох.
У цьому випадку наш пакет тестування та перевірки є однаковим, оскільки ми маємо менший обсяг вибірки. Як ми вже згадували раніше, (глибокі) нейронні мережі найкраще працюють, коли у вас велика кількість зразків. У наступній частині ви побачите інший спосіб представити слова як вектори. Це дуже захоплюючий і потужний спосіб роботи зі словами, в якому ви побачите, як зобразити слова як щільні вектори.