Учител | 29 октомври 2018 г.

Четенето на настроението на текста с машинно обучение се нарича анализ на чувствата и е един от най-известните случаи на употреба при класификацията на текста. Това попада в много активната изследователска област на обработка на естествен език (NLP).

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

Изберете набор от данни

Преди да започнем, нека да разгледаме данните, с които разполагаме. Продължете и изтеглете набора от данни, преведен на испански от хранилището за машинно обучение на UCI.

Този набор от данни включва маркирани отзиви от IMDb, Amazon и Yelp. Всяка рецензия се отбелязва с оценка 0 за отрицателно настроение или 1 за положително настроение.

Извлечете папката в папка с данни и продължете и заредете данните с Pandas:

Резултатът трябва да бъде следният:

С този набор от данни можете да обучите модел, който да предсказва настроението на изречение.

Един от начините да направите това е да преброите честотата на всяка дума във всяко изречение и да свържете този брой с пълния набор от думи в набора от данни. Бих започнал с вземане на данните и създаване на речник на всички думи във всички изречения. Колекцията от текстове се нарича корпус в PLN.

Речникът в този случай е списък с думи, появили се в нашия текст, където всяка дума има свой собствен индекс. Това ви позволява да създадете вектор за изречение. След това ще вземете изречението, което искате да векторизирате, и ще преброите появата му в речника. Полученият вектор ще бъде лексиката и броят на всяка дума в речника.

Полученият вектор се нарича още вектор на характеристиките. Във вектор на характеристика всяко измерение може да бъде числова или категорична характеристика, като например височината на сградата, цената на запас или, в нашия случай, броят на думите в речника. Тези функционални вектори са решаваща част в науката за данни и машинното обучение, тъй като моделът, който искате да обучите, зависи от тях.

Ще илюстрираме това. Представете си, че имате следните две изречения:

След това можете да използвате CountVectorizer, предоставен от библиотеката scikit-learn, за да векторизирате изречения.

Вземете думите от всяко изречение и създайте речник на всички уникални думи в изреченията. Този речник може да се използва за създаване на вектор от характеристики на броя на думите:

Този речник служи и като индекс за всяка дума. Сега можете да вземете всяко изречение и да получите думите, които се появяват според речника по-горе. Речникът се състои от петте думи в нашите изречения, като всяка от тях представлява дума в речника. Когато вземете двете изречения по-горе и ги трансформирате с CountVectorizer, ще получите вектор, представляващ броя на всяка дума в изречението:

Сега можете да видите получените вектори на характеристиките за всяко изречение въз основа на речника по-горе. Например, ако погледнете първия елемент, можете да видите, че и двата вектора имат 1. Това означава, че и двете изречения имат поява на Джон, който е първи в речника.

Това се счита за модел Bag of Words, което е често срещан начин в PLN за създаване на вектори от текст. Всеки документ е представен като вектор. Вече можете да използвате тези вектори като вектори на функции за модел на машинно обучение. Това ни води до следващата ни част, дефинираща базов модел.

Определяне на базов модел

Когато работите с машинно обучение, важна стъпка е дефинирането на базовия модел. Обикновено това включва прост модел, който след това се използва като сравнение с по-напредналите модели, които искате да тествате. В този случай ще използвате базовия модел, за да го сравните с по-напредналите методи, които включват (дълбоки) невронни мрежи.

Първо, ще разделите данните на набор от обучения и тестове, които ще ви позволят да оцените точността и да видите дали вашият модел обобщава добре. Това означава, ако моделът може да работи добре с данни, които не сте виждали преди. Това е един от начините да видите дали моделът е прекалено подходящ.

Пренастройването е, когато моделът тренира твърде добре по данните за обучение. Искате да избегнете прекаленото монтиране, тъй като това би означавало, че моделът запаметява предимно само данните за обучение. Това би обяснило висока точност на данните за обучение, но ниска точност в данните от теста.

Започваме с вземането на набора от данни Yelp, който извличаме от нашия обединен набор от данни. Оттам вземаме фразите и етикетите. Стойностите ".values" връщат масив NumPy вместо обект на панди, който в този контекст е по-лесен за четене:

Тук отново ще използваме модела Bag of Words по-горе, за да векторизираме изреченията. Можете отново да използвате CountVectorizer за тази задача. Тъй като може да не разполагате с тестови данни по време на обучение, можете да изградите речника, като използвате само данните за обучението. Използвайки този речник, можете да създадете вектори на функции за всяко изречение в набора за обучение и тестване:

Резултат

Можете да видите, че получените вектори на характеристиките имат 750 проби, което е броят на обучителните проби, които имаме след разделяне за набора за обучение. Всяка извадка има 1714 измерения, което е размерът на речника. Освен това може да се види, че получаваме оскъдна матрица.

Това е тип данни, който е оптимизиран за масиви само с няколко ненулеви елемента, който следи само ненулеви елементи, намалявайки натоварването на паметта.

CountVectorizer извършва токенизация, която разделя изреченията в набор от символи, както се вижда по-рано в речника. Освен това премахва пунктуацията и специалните символи и може да приложи друга предварителна обработка към всяка дума. Ако искате, можете да използвате персонализиран токенизатор от библиотеката NLTK с CountVectorizer или да използвате произволен брой персонализации, за да подобрите производителността на вашия модел.

Класификационният модел, който ще използваме, е логистична регресия, която е прост, но мощен линеен модел. Това е форма на регресия между 0 и 1 въз основа на вектора на входните характеристики.

Чрез задаване на гранична стойност (по подразбиране, 0,5), регресионният модел се използва за класификация.

Можете да видите, че логистичната регресия е достигнала впечатляващите 78,8%, но нека видим как работи този модел в другите набори от данни, които имаме. В този скрипт изпълняваме и оценяваме целия процес за всеки набор от данни, който имаме:

Резултат

Страхотен! Можете да видите, че този доста прост модел постига доста добра точност. Би било интересно да видим дали можем да преодолеем този модел. В следващата част ще се запознаем с (дълбоки) невронни мрежи и как да ги приложим за класификация на текста.

Въведение в дълбоките невронни мрежи

Ако вече сте запознати с невронните мрежи, не се колебайте да преминете към частите, свързани с Keras. В този раздел ще получите преглед на невронните мрежи и тяхната вътрешна работа, а по-късно ще видите как да използвате невронни мрежи с отличната библиотека на Keras.

Всичко започна с известна статия през 2012 г. от Джефри Хинтън и неговия екип, която надмина всички предишни модели в известния ImageNet Challenge.

Предизвикателството може да се счита за Световната купа по компютърно зрение, която се състои в класифициране на голям набор от изображения според дадените етикети. Джефри Хинтън и неговият екип успяха да надминат предишните модели, използвайки конволюционна невронна мрежа (CNN), което също ще разгледаме в този урок.

Оттогава невронните мрежи са се преместили в различни области, включително класификация, регресия и дори генеративно моделиране. Общите полета включват компютърно зрение, разпознаване на реч и обработка на естествен език (NLP).

Невронните мрежи, или понякога наричани изкуствени невронни мрежи (ANN), са изчислителни мрежи, които са вдъхновени от невронните мрежи в човешкия мозък. Те се състоят от неврони (наричани още възли), които са свързани, както е показано на графиката по-долу.

всяка дума

Започвате със слой от входни неврони, където подавате вашите вектори на характеристиките и стойностите се вливат в скрит слой. При всяка връзка подавате стойността напред, докато стойността се умножава по тежест и към стойността се добавя изкривяване. Това се случва при всяка връзка и в крайна сметка достига изходен слой с един или повече изходни възли.

Ако искате да имате двоична класификация, можете да използвате един възел, но ако имате няколко категории, трябва да използвате множество възли за всяка категория:

Можете да имате колкото искате скрити слоеве. Всъщност невронна мрежа с повече от един скрит слой се счита за дълбока невронна мрежа.

Може би вече се чудите как се изчисляват теглата и това очевидно е най-важната част от невронните мрежи, но и най-трудната част. Алгоритъмът започва с инициализиране на тежестите с произволни стойности и след това те се обучават с метод, наречен обратно разпространение.

Това се прави с помощта на методи за оптимизация като градиентно спускане, за да се намали грешката между изчисления и желания изход (наричан още целеви изход). Грешката се определя от функция за загуба, чиято загуба искаме да намалим с оптимизатора. Целият процес е твърде обширен, за да обхване тук, така че можете да го видите по-подробно чрез търсене в мрежата.

Това, което трябва да знаете, е, че има няколко метода за оптимизация, които можете да използвате, но най-използваният в момента оптимизатор се нарича Адам https://arxiv.org/abs/1412.6980, който се представя добре при различни проблеми.

Можете също да използвате различни функции за загуби, но в този урок ще ви е необходима само функцията за кръстосана загуба на ентропия или по-точно двоичната кръстосана ентропия, която се използва за проблеми с бинарната класификация. Не забравяйте да експериментирате с различните налични методи и инструменти. Някои изследователи дори твърдят в скорошна статия, че изборът на най-добрите методи за изпълнение прилича на алхимия. Причината е, че много методи не са добре обяснени и се състоят от много корекции и тестове.

Представяме ви кери

Keras е API за дълбоко обучение и невронни мрежи от François Chollet, който може да работи на върха на Tensorflow (Google), Theano или CNTK (Microsoft). Цитирайки книгата на Франсоа Чолет „Дълбоко обучение с Python:

Keras е библиотека на ниво модел, предоставяща градивни елементи на високо ниво за разработване на модели за дълбоко обучение. Той не се справя с операции на ниско ниво като манипулиране и диференциране на обтегача. Вместо това разчита на специализирана и добре оптимизирана тензорна библиотека, която работи като фоновия двигател на Keras.

Това е чудесен начин да започнете да експериментирате с невронни мрежи, без да се налага да прилагате всеки слой и парче сами. Например, Tensorflow е чудесна библиотека за машинно обучение, но трябва да внедрите много шаблонни кодове, за да се изпълнява модел.

Инсталиране на keras

Преди да инсталирате Keras, ще ви трябва Tensorflow, Theano или CNTK. В този урок ще използваме Tensorflow, но не се колебайте да използвате която и да е рамка, която най-добре отговаря на вашите нужди. Keras може да се инсталира с помощта на PyPI със следната команда:

Можете да изберете бекенда, който искате да имате, като отворите конфигурационния файл на Keras, който можете да намерите тук:

Конфигурационният файл трябва да изглежда така:

Можете да промените бекенд полето там на „theano“, „tensorflow“ или „cntk“ в зависимост от това кое сте инсталирали.

Първият му модел на Keras

Сега сте готови да експериментирате с Keras. 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% точност за тренировъчния комплект. Но това се очакваше, тъй като броят на епохите беше доста голям за този модел. Точността на тестовия пакет обаче вече е надхвърлила предишната ни логистична регресия с модела „Торба с думи“, което е по-нататъшна голяма стъпка по отношение на нашия напредък.

За да улесните живота си, можете да използвате тази малка помощна функция, за да видите загубата и точността на вашите данни за обучение и тестове въз основа на историята (история).

Това повикване, което се прилага автоматично към всеки модел на Keras, записва загубата и всички допълнителни показатели, които могат да бъдат добавени в метода .fit (). В този случай се интересуваме само от прецизност. Тази помощна функция използва библиотеката matplotlib:

За да използвате тази функция, просто извикайте plot_history ():

Виждате, че сме преучили нашия модел, тъй като комплектът за обучение достигна 100% точност.

Добър начин да видите кога моделът започва да преуморява е, когато загубата на данни за проверка започне да нараства отново. Това обикновено е добра точка за спиране на модела. Можете да видите, че това се случва около 15-25 епохи.

В този случай нашият пакет за тестване и валидиране е един и същ, тъй като имаме по-малък размер на извадката. Както разгледахме по-рано, (дълбоките) невронни мрежи работят най-добре, когато имате голям брой проби. В следващата част ще видите различен начин за представяне на думите като вектори. Това е много вълнуващ и мощен начин за работа с думи, в който ще видите как да представите думите като плътни вектори.