Tutor | 29 octombrie 2018

Citirea dispoziției textului cu învățarea automată se numește analiza sentimentului și este unul dintre cele mai proeminente cazuri de utilizare în clasificarea textului. Acest lucru se încadrează în domeniul foarte activ de cercetare al procesării limbajului natural (NLP).

Alte cazuri obișnuite de utilizare a clasificării textului includ detectarea spamului, etichetarea automată a cererilor clienților și clasificarea textului în subiecte definite. Deci, cum poți face asta?

Selectați un set de date

Înainte de a începe, să aruncăm o privire asupra datelor pe care le avem. Mergeți mai departe și descărcați setul de date tradus în spaniolă din depozitul de învățare automată UCI.

Acest set de date include recenzii etichetate de la IMDb, Amazon și Yelp. Fiecare recenzie este marcată cu un scor de 0 pentru un sentiment negativ sau 1 pentru un sentiment pozitiv.

Extrageți folderul într-un folder de date și continuați și încărcați datele cu Pandas:

Rezultatul ar trebui să fie următorul:

Cu acest set de date, puteți instrui un model pentru a prezice sentimentul unei propoziții.

O modalitate prin care puteți face acest lucru este să numărați frecvența fiecărui cuvânt din fiecare propoziție și să legați acest număr la setul complet de cuvinte din setul de date. Aș începe prin a lua datele și a crea un vocabular cu toate cuvintele din toate propozițiile. Colecția de texte se numește corpus în PLN.

Vocabularul în acest caz este o listă de cuvinte care au apărut în textul nostru în care fiecare cuvânt are propriul index. Acest lucru vă permite să creați un vector pentru o propoziție. Apoi ați lua propoziția pe care doriți să o vectorizați și ați număra apariția ei în vocabular. Vectorul rezultat va fi vocabularul și un număr pentru fiecare cuvânt din vocabular.

Vectorul rezultat se mai numește și vector caracteristică. Într-un vector de caracteristici, fiecare dimensiune poate fi o caracteristică numerică sau categorică, cum ar fi înălțimea unei clădiri, prețul unui stoc sau, în cazul nostru, numărul unui cuvânt dintr-un vocabular. Acești vectori de caracteristici sunt o piesă crucială în știința datelor și învățarea automată, deoarece modelul pe care doriți să-l instruiți depinde de ei.

Vom ilustra acest lucru. Imaginați-vă că aveți următoarele două propoziții:

Puteți utiliza apoi CountVectorizer furnizat de biblioteca scikit-learn pentru a vectoriza propozițiile.

Luați cuvintele din fiecare propoziție și creați un vocabular cu toate cuvintele unice din propoziții. Acest vocabular poate fi folosit pentru a crea un vector al caracteristicilor numărului de cuvinte:

Acest vocabular servește și ca index pentru fiecare cuvânt. Acum, puteți lua fiecare propoziție și obține cuvintele care apar în conformitate cu vocabularul de mai sus. Vocabularul este format din cele cinci cuvinte din propozițiile noastre, fiecare reprezentând un cuvânt din vocabular. Când luați cele două propoziții de mai sus și le transformați cu CountVectorizer, veți obține un vector care reprezintă numărul fiecărui cuvânt din propoziție:

Acum, puteți vedea vectorii de caracteristici rezultați pentru fiecare propoziție pe baza vocabularului de mai sus. De exemplu, dacă vă uitați la primul element, puteți vedea că ambii vectori au un 1. Acest lucru înseamnă că ambele propoziții au o apariție a lui Ioan, care este primul în vocabular.

Acesta este considerat un model Bag of Words, care este un mod comun în PLN de a crea vectori din text. Fiecare document este reprezentat ca un vector. Acum puteți utiliza acești vectori ca vectori de caracteristici pentru un model de învățare automată. Acest lucru ne aduce la următoarea noastră parte, definind un model de bază.

Definirea unui model de bază

Când lucrați cu învățarea automată, un pas important este definirea unui model de bază. De obicei, acest lucru implică un model simplu, care este apoi utilizat ca o comparație cu modelele mai avansate pe care doriți să le testați. În acest caz, veți utiliza modelul de bază pentru al compara cu metode mai avansate care includ rețele neuronale (profunde).

În primul rând, veți împărți datele într-un set de instruire și teste care vă vor permite să evaluați precizia și să vedeți dacă modelul dvs. generalizează bine. Aceasta înseamnă dacă modelul poate funcționa bine cu date pe care nu le-ați văzut până acum. Acesta este un mod de a vedea dacă modelul se potrivește excesiv.

Suprapunerea este atunci când un model se antrenează prea bine asupra datelor de antrenament. Doriți să evitați suprasolicitarea, deoarece acest lucru ar însemna că modelul a memorat în cea mai mare parte doar datele de antrenament. Acest lucru ar explica o precizie ridicată cu datele de antrenament, dar o precizie redusă în datele de testare.

Începem prin a lua setul de date Yelp pe care îl extragem din setul nostru de date concatenat. De acolo, luăm frazele și etichetele. Valorile „.values” returnează o matrice NumPy în locul unui obiect pandas, care în acest context este mai ușor de citit:

Aici vom folosi din nou modelul Bag of Words de mai sus pentru a vectoriza propozițiile. Puteți utiliza CountVectorizer din nou pentru această sarcină. Deoarece este posibil să nu aveți datele de test disponibile în timpul antrenamentului, puteți construi vocabularul folosind doar datele de antrenament. Folosind acest vocabular, puteți crea vectori de caracteristici pentru fiecare propoziție din setul de formare și testare:

Rezultat

Puteți vedea că vectorii de caracteristici rezultați au 750 de probe, care este numărul de probe de antrenament pe care le avem după divizare pentru setul de antrenament. Fiecare eșantion are 1714 dimensiuni, care este dimensiunea vocabularului. De asemenea, se poate observa că obținem o matrice rară.

Acesta este un tip de date care este optimizat pentru tablouri cu doar câteva elemente diferite de zero, care ține doar evidența elementelor diferite de zero, reducând încărcarea memoriei.

CountVectorizer efectuează tokenizarea care separă propozițiile într-un set de jetoane așa cum s-a văzut mai devreme în vocabular. În plus, elimină punctuația și caracterele speciale și poate aplica alte preprocesări fiecărui cuvânt. Dacă doriți, puteți utiliza un tokenizer personalizat din biblioteca NLTK cu CountVectorizer sau puteți utiliza orice număr de personalizări pentru a îmbunătăți performanța modelului dvs.

Modelul de clasificare pe care îl vom folosi este regresia logistică, care este un model liniar simplu, dar puternic. Este o formă de regresie între 0 și 1 bazată pe vectorul caracteristicilor de intrare.

Prin specificarea unei valori limită (implicit, 0,5), modelul de regresie este utilizat pentru clasificare.

Puteți vedea că regresia logistică a atins un impresionant 78,8%, dar să vedem cum funcționează acest model în celelalte seturi de date pe care le avem. În acest script, efectuăm și evaluăm întregul proces pentru fiecare set de date pe care îl avem:

Rezultat

Grozav! Puteți vedea că acest model destul de simplu obține o precizie destul de bună. Ar fi interesant să vedem dacă putem depăși acest model. În partea următoare, vom face cunoștință cu rețelele neuronale (profunde) și cum să le aplicăm clasificării textului.

O introducere în rețelele neuronale profunde

Dacă sunteți deja familiarizat cu rețelele neuronale, nu ezitați să treceți la părțile legate de Keras. În această secțiune veți obține o prezentare generală a rețelelor neuronale și a funcționării lor interioare, iar mai târziu veți vedea cum să utilizați rețelele neuronale cu excelenta bibliotecă Keras.

Totul a început cu un celebru articol din 2012 al lui Geoffrey Hinton și al echipei sale, care a depășit toate modelele anterioare din celebra ImageNet Challenge.

Provocarea ar putea fi considerată Cupa Mondială de viziune computerizată, care constă în clasificarea unui set mare de imagini în funcție de etichetele date. Geoffrey Hinton și echipa sa au reușit să depășească modelele anterioare folosind o rețea neuronală convoluțională (CNN), pe care o vom acoperi și în acest tutorial.

De atunci, rețelele neuronale s-au mutat în diverse domenii, inclusiv clasificarea, regresia și chiar modelarea generativă. Câmpurile comune includ viziunea pe computer, recunoașterea vorbirii și procesarea limbajului natural (NLP).

Rețelele neuronale, sau uneori numite rețele neuronale artificiale (ANN), sunt rețele de calcul care au fost inspirate în mod vag de rețelele neuronale din creierul uman. Acestea constau din neuroni (numiți și noduri) care sunt conectați ca în graficul de mai jos.

care este

Începeți prin a avea un strat de neuroni de intrare în care vă hrăniți vectorii caracteristici și valorile curg într-un strat ascuns. La fiecare conexiune, transmiteți valoarea înainte, în timp ce valoarea este înmulțită cu o greutate și părtinire se adaugă la valoare. Acest lucru se întâmplă la fiecare conexiune și ajunge în cele din urmă la un strat de ieșire cu unul sau mai multe noduri de ieșire.

Dacă doriți să aveți o clasificare binară, puteți utiliza un singur nod, dar dacă aveți mai multe categorii, trebuie să utilizați mai multe noduri pentru fiecare categorie:

Puteți avea câte straturi ascunse doriți. De fapt, o rețea neuronală cu mai mult de un strat ascuns este considerată o rețea neuronală profundă.

S-ar putea să vă întrebați deja cum sunt calculate greutățile, iar aceasta este evident cea mai importantă parte a rețelelor neuronale, dar și cea mai grea. Algoritmul începe cu inițializarea ponderilor cu valori aleatorii și apoi sunt instruiți cu o metodă numită backpropagation.

Acest lucru se face folosind metode de optimizare, cum ar fi coborârea în gradient pentru a reduce eroarea dintre ieșirea calculată și cea dorită (numită și ieșirea țintă). Eroarea este determinată de o funcție de pierdere a cărei pierdere dorim să o reducem cu optimizatorul. Întregul proces este prea extins pentru a fi acoperit aici, deci îl puteți vedea mai detaliat căutând pe web.

Ce trebuie să știți este că există mai multe metode de optimizare pe care le puteți utiliza, dar cel mai utilizat optimizator în prezent se numește Adam https://arxiv.org/abs/1412.6980, care funcționează bine pe diferite probleme.

De asemenea, puteți utiliza diferite funcții de pierdere, dar în acest tutorial veți avea nevoie doar de funcția de pierdere a entropiei încrucișate sau mai concret de entropia încrucișată binară care este utilizată pentru probleme de clasificare binară. Asigurați-vă că experimentați diferitele metode și instrumente disponibile. Unii cercetători susțin chiar într-un articol recent că alegerea celor mai bune metode de performanță seamănă cu alchimia. Motivul este că multe metode nu sunt bine explicate și constau în multe ajustări și teste.

Vă prezentăm keras

Keras este un API de învățare profundă și rețele neuronale de François Chollet care poate rula pe Tensorflow (Google), Theano sau CNTK (Microsoft). Citând cartea lui François Chollet, Deep Learning with Python:

Keras este o bibliotecă la nivel de model, care oferă elemente de bază la nivel înalt pentru dezvoltarea modelelor de învățare profundă. Nu se ocupă de operațiuni la nivel scăzut, cum ar fi manipularea și diferențierea tensoarelor. În schimb, se bazează pe o bibliotecă de tensori specializată și bine optimizată pentru a face acest lucru, care funcționează ca motorul de fundal al lui Keras.

Este o modalitate excelentă de a începe experimentarea cu rețelele neuronale fără a fi nevoie să implementați fiecare strat și piesă pe cont propriu. De exemplu, Tensorflow este o bibliotecă excelentă de învățare automată, dar trebuie să implementați o mulțime de cod boilerplate pentru a avea un model care rulează.

Instalarea keras

Înainte de a instala Keras, veți avea nevoie de Tensorflow, Theano sau CNTK. În acest tutorial vom folosi Tensorflow, dar nu ezitați să utilizați cadrul care se potrivește cel mai bine nevoilor dvs. Keras poate fi instalat folosind PyPI cu următoarea comandă:

Puteți alege backend-ul pe care doriți să îl aveți deschizând fișierul de configurare Keras pe care îl puteți găsi aici:

Fișierul de configurare ar trebui să arate astfel:

Puteți schimba câmpul backend acolo la „theano”, „tensorflow” sau „cntk” în funcție de care ați instalat.

Primul său model Keras

Acum sunteți gata să experimentați cu Keras. Keras acceptă două tipuri principale de modele. Are API-ul modelului secvențial pe care îl veți vedea în utilizare în acest tutorial și API-ul funcțional care poate face întregul model secvențial, dar poate fi utilizat și pentru modelele avansate cu arhitecturi de rețea complexe.

Modelul secvențial este un teanc liniar de straturi, unde puteți utiliza marea varietate de straturi disponibile în Keras. Cel mai comun strat este stratul dens, care este stratul de rețea neuronală conectat dens cu toate greutățile și părtinirile cu care sunteți deja familiarizați.

Să vedem dacă putem aduce îmbunătățiri modelului nostru anterior de regresie logistică. Puteți utiliza tablourile X_train și X_test pe care le-ați creat în exemplul nostru anterior.

Înainte de a ne construi modelul, trebuie să cunoaștem dimensiunea de intrare a vectorilor noștri de caracteristici. Acest lucru se întâmplă numai în primul strat, deoarece straturile următoare pot deduce automat. Pentru a construi modelul secvențial, puteți adăuga straturi unul câte unul în următoarea ordine:

Înainte de a putea începe instruirea modelului, trebuie să configurați procesul de învățare. Acest lucru se face cu metoda .compile (). Această metodă specifică funcția de optimizare și de pierdere.

De asemenea, puteți adăuga o listă de valori care pot fi utilizate ulterior pentru evaluare, dar care nu influențează instruirea. În acest caz, dorim să folosim o entropie încrucișată binară și optimizatorul Adam pe care l-am menționat mai devreme. Keras include, de asemenea, o funcție utilă .summary () pentru a oferi o imagine de ansamblu asupra modelului și a numărului de parametri disponibili pentru instruire:

Rezultat

Este posibil să observați că avem 9935 de parametri pentru primul strat și alți 6 în următorul. De unde vin ei?

Avem 19870 dimensiuni pentru fiecare vector de caracteristică, iar apoi avem 5 noduri. Avem nevoie de greutăți pentru fiecare dimensiune a caracteristicii și fiecare nod reprezintă 1985 * 5 = 9930 parametri, iar apoi avem încă 5 dintr-o părtinire suplimentară pentru fiecare nod, care ne permite să obținem parametrii 9935.

La nodul final, avem încă 5 greutăți și o prejudecată, ceea ce ne dă 6 parametri.

Acum este momentul să începeți antrenamentul cu funcția .fit ().

Deoarece formarea rețelei neuronale este un proces iterativ, formarea nu se oprește odată ce se face o dată. Trebuie să specificați numărul de iterații pe care doriți să le instruiască modelul.

Aceste iterații sunt denumite în mod obișnuit epoci. Vrem să organizăm instruirea pentru 100 de epoci, astfel încât să putem vedea cum se schimbă acuratețea după fiecare epocă.

Un alt parametru pe care îl aveți pentru selecția dvs. este dimensiunea lotului. Mărimea lotului este responsabilă pentru numărul de eșantioane pe care dorim să le folosim într-o epocă, ceea ce înseamnă câte eșantioane sunt utilizate într-o trecere înainte/înapoi.

Acest lucru mărește viteza de calcul, deoarece este nevoie de mai puține ori pentru a rula, dar necesită și mai multă memorie, iar modelul se poate degrada cu dimensiuni de lot mai mari. Deoarece avem un mic grup de antrenament, putem lăsa acest lucru la o dimensiune redusă a lotului:

Acum puteți utiliza metoda .evaluate () pentru a măsura precizia modelului. Puteți face acest lucru atât pentru datele de antrenament, cât și pentru datele de testare. Ne așteptăm ca datele de instruire să fie mai precise decât datele de testare. Cu cât antrenezi mai mult o rețea neuronală, cu atât este mai probabil să începi să te îmbraci.

Rețineți că, dacă reluați metoda .fit (), veți începe cu greutățile calculate din antrenamentul anterior. Asigurați-vă că reconstruiți modelul înainte de a începe să îl antrenați din nou.

Acum, să evaluăm modelul de precizie:

Puteți vedea deja că modelul a fost supra-echipat, deoarece a atins o precizie de 100% pentru setul de antrenament. Dar acest lucru era de așteptat, deoarece numărul epocilor era destul de mare pentru acest model. Cu toate acestea, acuratețea suitei de testare a depășit deja regresia noastră logistică anterioară cu modelul „Bag of Words”, care este un pas important în ceea ce privește progresul nostru.

Pentru a vă face viața mai ușoară, puteți utiliza această mică funcție de ajutor pentru a vedea pierderea și acuratețea antrenamentului și a datelor de testare pe baza istoricului (istoric).

Acest apel, care se aplică automat fiecărui model Keras, înregistrează pierderile și valorile suplimentare care pot fi adăugate în metoda .fit (). În acest caz, ne interesează doar precizia. Această funcție de ajutor folosește biblioteca matplotlib:

Pentru a utiliza această funcție, trebuie doar să apelați plot_history ():

Puteți vedea că ne-am antrenat în exces modelul, deoarece setul de antrenament a atins o precizie de 100%.

O modalitate bună de a vedea când modelul începe să suprasolicite este atunci când pierderea datelor de validare începe să crească din nou. Acesta tinde să fie un punct bun pentru a opri modelul. Puteți vedea că acest lucru se întâmplă în jurul a 15-25 de epoci.

În acest caz, suita noastră de testare și validare este aceeași, deoarece avem o dimensiune mai mică a eșantionului. După cum am discutat mai devreme, rețelele neuronale (profunde) funcționează cel mai bine atunci când aveți un număr mare de eșantioane. În partea următoare, veți vedea un mod diferit de a reprezenta cuvintele ca vectori. Acesta este un mod foarte interesant și puternic de a lucra cu cuvinte în care veți vedea cum să reprezentați cuvintele ca vectori densi.