Oktató | 2018. október 29

A szöveg hangulatának gépi tanulással történő olvasását hangulatelemzésnek nevezzük, és ez a szövegosztályozás egyik legkiemelkedőbb használati esete. Ez a természetes nyelvfeldolgozás (NLP) nagyon aktív kutatási területére esik.

A szöveges osztályozás egyéb gyakori esetei közé tartozik a spamfelismerés, az ügyfélkérdések automatikus címkézése és a szöveg meghatározott témákba sorolása. Tehát hogyan teheti ezt meg?

Válasszon ki egy adatsort

Mielőtt elkezdenénk, vessünk egy pillantást a rendelkezésünkre álló adatokra. Folytassa, töltse le az UCI gépi tanulási adattárból spanyolra lefordított adatkészletet.

Ez az adatkészlet az IMDb, az Amazon és a Yelp címkézett véleményeit tartalmazza. Minden értékelést 0-val jelölnek negatív érzelmek vagy 1 pozitív pontszámot.

Bontsa ki a mappát egy adatmappába, és folytassa, és töltse be az adatokat a Pandas segítségével:

Az eredmény a következő legyen:

Ezzel az adatkészlettel modellt képezhet a mondat hangulatának előrejelzésére.

Ennek egyik módja az, hogy megszámolja az egyes mondatokban az egyes szavak gyakoriságát, és összekapcsolja ezt a számot az adatsor teljes szavakkal. Kezdeném azzal, hogy felveszem az adatokat, és létrehozom az összes mondatban szereplő összes szó szókincsét. A szöveggyűjteményt korpusznak nevezik a PLN-ben.

A szókincs ebben az esetben azoknak a szavaknak a felsorolása, amelyek megjelentek a szövegünkben, ahol minden szónak megvan a maga indexe. Ez lehetővé teszi vektor létrehozását egy mondathoz. Ezután felvenné a vektorizálni kívánt mondatot, és megszámolná annak előfordulását a szókincsben. A kapott vektor lesz a szókincs és a szókincs egyes szavainak száma.

Az így kapott vektort jellemzővektornak is nevezzük. Egy jellemzővektorban minden dimenzió lehet numerikus vagy kategorikus jellemző, például egy épület magassága, egy részvény ára vagy esetünkben egy szó száma a szókincsben. Ezek a jellemzővektorok döntő jelentőségűek az adattudományban és a gépi tanulásban, mivel a betanítani kívánt modell rajtuk múlik.

Ezt szemléltetni fogjuk. Képzelje el, hogy a következő két mondat van:

Ezután a mondatok vektorizálásához használhatja a Scikit-Learn könyvtár által biztosított CountVectorizer alkalmazást.

Vegye ki az egyes mondatokból a szavakat, és készítsen szókincset a mondatokban szereplő összes egyedi szóból. Ez a szókincs felhasználható a szószám-jellemzők vektorának létrehozására:

Ez a szókincs az egyes szavak indexeként is szolgál. Most megteheti az egyes mondatokat, és megszerezheti a fenti szókincsnek megfelelően megjelenő szavakat. A szókincs a mondatainkban szereplő öt szóból áll, amelyek mindegyike egy szót képvisel a szókincsben. Ha átveszi a fenti két mondatot, és átalakítja őket a CountVectorizer segítségével, akkor egy vektorot kap, amely a mondat egyes szavainak számát képviseli:

Most a fenti szókincs alapján láthatja az egyes mondatok eredményvektorait. Például, ha megnézzük az első elemet, láthatjuk, hogy mindkét vektornak van egy 1. Ez azt jelenti, hogy mindkét mondatban előfordul John, aki a szókincsben az első.

Ezt tekintjük Bag of Words modellnek, amely a PLN-ben elterjedt módszer vektorok létrehozására a szövegből. Minden dokumentum vektorként van ábrázolva. Ezeket a vektorokat funkcióvektorként használhatja a gépi tanulási modellhez. Ezzel eljutottunk a következő részünkhöz, meghatározva egy alapmodellt.

Alapmodell meghatározása

A gépi tanulással való munka során fontos lépés az alapmodell meghatározása. Ez általában egy egyszerű modellt tartalmaz, amelyet aztán összehasonlítanak a tesztelni kívánt fejlettebb modellekkel. Ebben az esetben az alapmodell segítségével összehasonlítja azt a fejlettebb módszerekkel, amelyek (mély) neurális hálózatokat tartalmaznak.

Először fel fogja osztani az adatokat egy képzési és tesztkészletre, amely lehetővé teszi, hogy értékelje a pontosságot, és megnézze, hogy a modellje általános-e. Ez azt jelenti, hogy a modell jól működik-e olyan adatokkal, amelyeket még nem látott. Ez az egyik módja annak, hogy meggyőződjünk arról, hogy a modell túlterhelt-e.

Túlterhelés az, amikor egy modell túl jól edzi az edzésadatokat. Kerülni szeretné a túlfeszítést, mivel ez azt jelentené, hogy a modell többnyire csak az edzés adatait jegyezte meg. Ez nagy pontosságot magyarázna az edzésadatokkal, de alacsony pontosságot a tesztadatokban.

Először a Yelp összefoglaló adatkészletét vesszük, amelyet az összefűzött adatkészletből nyerünk ki. Innen vesszük a kifejezéseket és a címkéket. Az ".values" értékek egy pandas objektum helyett egy NumPy tömböt adnak vissza, amely ebben az összefüggésben könnyebben olvasható:

Itt ismét a fenti szavak Bag modelljét használjuk a mondatok vektorizálásához. Ehhez a feladathoz újra használható a CountVectorizer. Mivel nem biztos, hogy a teszt során rendelkezésre állnak a tesztadatok, a szókincset csak az edzésadatok felhasználásával készítheti el. E szókincs használatával létrehozhatja a jellemző vektorokat az oktatási és tesztkészlet minden mondatához:

Eredmény

Láthatja, hogy a kapott jellemzővektoroknak 750 mintája van, ez az edzésminták száma, amely az edzéskészlet felosztása után van. Minden mintának 1714 dimenziója van, ami a szókincs nagysága. Látható továbbá, hogy ritka mátrixot kapunk.

Ez egy olyan adattípus, amely csak néhány nulla nulla elemet tartalmazó tömbökhöz optimalizált, amely csak a nulla elemektől ment nyomon, csökkentve a memória terhelését.

A CountVectorizer olyan tokenizálást hajt végre, amely a mondatokat a szókincsben korábban látható jelzőkészletre választja el. Ezenkívül eltávolítja az írásjeleket és a speciális karaktereket, és minden egyes szóhoz más előfeldolgozást is alkalmazhat. Ha szeretné, használhatja az NLTK könyvtár egyéni tokenizálóját a CountVectorizerrel, vagy tetszőleges számú testreszabást használhat a modell teljesítményének javításához.

Az osztályozási modell, amelyet használni fogunk, a logisztikai regresszió, amely egy egyszerű, de erőteljes lineáris modell. Ez a 0 és 1 közötti regresszió egyik formája a bemeneti jellemzők vektorán alapul.

A határérték megadásával (alapértelmezett, 0,5) a regressziós modellt használják a besoroláshoz.

Láthatja, hogy a logisztikai regresszió lenyűgöző 78,8% -ot ért el, de nézzük meg, hogyan működik ez a modell a többi rendelkezésünkre álló adathalmazban. Ebben a szkriptben elvégezzük és kiértékeljük az összes meglévő adatkészlet teljes folyamatát:

Eredmény

Nagy! Láthatja, hogy ez a meglehetősen egyszerű modell elég jó pontosságot ér el. Érdekes lenne megnézni, hogy sikerül-e legyőzni ezt a modellt. A következő részben megismerkedünk a (mély) neurális hálózatokkal és annak alkalmazásával a szöveges osztályozás során.

Bevezetés a mély ideghálózatokba

Ha már ismeri az ideghálózatokat, nyugodtan ugorjon a Kerashoz kapcsolódó részekre. Ebben a részben áttekintést kap az ideghálózatokról és azok belső működéséről, később pedig megismerheti az ideghálózatok használatát a kiváló Keras könyvtárral.

Az egész Geoffrey Hinton és csapata egy híres cikkével kezdődött 2012-ben, amely felülmúlta a híres ImageNet Challenge összes korábbi modelljét.

A kihívás a számítógépes látás világbajnokságának tekinthető, amely abból áll, hogy egy nagy képkészletet osztályoznak a megadott címkék szerint. Geoffrey Hintonnak és csapatának konvolúciós ideghálózatot (CNN) használva sikerült felülmúlnia a korábbi modelleket, amelyekre ebben az oktatóanyagban is kitérünk.

Azóta a neurális hálózatok különböző területekre költöztek, beleértve az osztályozást, a regressziót és még a generatív modellezést is. A közös területek közé tartozik a számítógépes látás, a beszédfelismerés és a természetes nyelv feldolgozása (NLP).

Az ideghálózatok, vagy néha mesterséges ideghálózatok (ANN), számítási hálózatok, amelyeket lazán inspiráltak az emberi agy ideghálózatai. Neuronokból (más néven csomópontokból) állnak, amelyek az alábbi ábrán látható módon kapcsolódnak egymáshoz.

forráskód

Először egy bemeneti idegsejt réteggel rendelkezik, ahová táplálja a jellemző vektorait, és az értékek egy rejtett rétegbe áramlanak. Minden kapcsolaton előre táplálja az értéket, miközben az értéket megszorozza egy súlyral, és az előfeszítés hozzáadódik az értékhez. Ez minden kapcsolaton megtörténik, és végül egy vagy több kimeneti csomópontot elér egy kimeneti réteghez.

Ha bináris besorolást szeretne kapni, használhat egy csomópontot, de ha több kategóriája van, akkor mindegyik kategóriához több csomópontot kell használnia:

Annyi rejtett réteg lehet, amennyit csak akar. Valójában egy több rejtett réteget tartalmazó neurális hálózat mély neurális hálózatnak tekinthető.

Lehet, hogy már arra kíváncsi, hogyan számítják ki a súlyokat, és ez nyilvánvalóan a neurális hálózatok legfontosabb része, de a legnehezebb is. Az algoritmus a súlyok véletlenszerű értékekkel történő inicializálásával kezdődik, majd a backpropagation nevű módszerrel képzik ki őket.

Ez optimalizálási módszerekkel, például gradiens süllyedéssel történik, hogy csökkentse a hibát a számított és a kívánt kimenet között (más néven cél kimenetet). A hibát egy veszteségfüggvény határozza meg, amelynek veszteségét minimalizálni akarjuk az optimalizálóval. A teljes folyamat túl kiterjedt ahhoz, hogy ide kiterjedjen, így az interneten keresve részletesebben is megtekintheti.

Amit tudnia kell, hogy számos optimalizálási módszer használható, de a jelenleg leggyakrabban használt optimalizáló neve Adam https://arxiv.org/abs/1412.6980, amely jól teljesít a különféle problémáknál.

Különböző veszteségfüggvényeket is használhat, de ebben az oktatóanyagban csak a kereszt entrópia veszteség függvényre, pontosabban a bináris osztályozási problémákhoz használt bináris kereszt entrópiára lesz szüksége. Feltétlenül kísérletezzen a rendelkezésre álló különféle módszerekkel és eszközökkel. Egyes kutatók egy friss cikkben még azt állítják, hogy a legjobb teljesítménymódszerek kiválasztása hasonlít az alkímia. Ennek oka az, hogy sok módszer nincs jól megmagyarázva, és sok kiigazításból és tesztből áll.

Bemutatjuk a kerákat

A Keras egy François Chollet által készített mély tanulási és neurális hálózatok API, amely a Tensorflow (Google), a Theano vagy a CNTK (Microsoft) tetején fut. François Chollet: Mély tanulás a Pythonnal című könyvét idézem:

A Keras egy modell szintű könyvtár, amely magas szintű építőelemeket kínál a mély tanulási modellek kifejlesztéséhez. Nem kezeli az alacsony szintű műveleteket, például a feszítő manipulálását és differenciálását. Ehelyett erre egy speciális és jól optimalizált tenzorkönyvtárra támaszkodik, amely úgy működik, mint a Keras háttérmotorja.

Ez egy nagyszerű módja annak, hogy elkezdhessünk kísérleteket a neurális hálózatokkal anélkül, hogy minden réteget és darabot önállóan kellene végrehajtanunk. Például a Tensorflow egy nagyszerű gépi tanulási könyvtár, de sok kazán kódot kell implementálnia ahhoz, hogy egy modell futhasson.

Kerák telepítése

A Keras telepítése előtt szüksége lesz a Tensorflow-ra, a Theanóra vagy a CNTK-ra. A Tensorflow alkalmazást ebben az oktatóanyagban fogjuk használni, de nyugodtan használja azt a keretrendszert, amely a legjobban megfelel az Ön igényeinek. A Keras a PyPI használatával telepíthető a következő paranccsal:

Kiválaszthatja a kívánt háttérprogramot a Keras konfigurációs fájl megnyitásával, amelyet itt talál:

A konfigurációs fájlnak így kell kinéznie:

Az ott lévő háttérmezőt megváltoztathatja "theano", "tensorflow" vagy "cntk" értékre attól függően, hogy melyiket telepítette.

Első Keras modellje

Most készen áll arra, hogy kísérletezzen Kerasszal. A Keras két fő modelltípust támogat. Rendelkezik a szekvenciális modell API-val, amelyet ebben az oktatóanyagban használni fog, és a Functional API-t, amely képes elvégezni az összes szekvenciális modellt, de használható összetett hálózati architektúrával rendelkező haladó modellekhez is.

A szekvenciális modell egy lineáris rétegréteg, ahol a Kerasban elérhető sokféle réteget felhasználhatja. A leggyakoribb réteg a Sűrű réteg, amely a sűrűn összekapcsolt ideghálózati réteg az összes olyan tömeggel és torzítással, amelyet már ismer.

Nézzük meg, hogy tudunk-e javítani az előző logisztikai regressziós modellen. Használhatja az előző példánkban létrehozott X_train és X_test tömböket.

A modell felépítése előtt meg kell ismernünk jellemzővektoraink bemeneti dimenzióját. Ez csak az első rétegben történik, mivel a következő rétegek automatikusan következtetni tudnak. A szekvenciális modell felépítéséhez rétegeket adhat hozzá egyesével a következő sorrendben:

A modell edzésének megkezdése előtt be kell állítania a tanulási folyamatot. Ez a .compile () metódussal történik. Ez a módszer meghatározza az optimalizáló és a veszteség funkciót.

Hozzáadhat egy listát azokról a mutatókról, amelyek később felhasználhatók az értékeléshez, de nem befolyásolják a képzést. Ebben az esetben bináris kereszt-entrópiát és az előbb említett Adam optimalizálót szeretnénk használni. A Keras egy praktikus .summary () függvényt is tartalmaz, amely áttekintést nyújt a modellről és az edzéshez rendelkezésre álló paraméterek számáról:

Eredmény

Észreveheti, hogy 9935 paraméterünk van az első réteghez, és további 6 a következőhöz. Honnan jöttetek?

19870 dimenzióval rendelkezünk minden jellemzővektorhoz, és akkor 5 csomópontunk van. Súlyokra van szükségünk a jellemző minden dimenziójához, és minden csomópont 1985 * 5 = 9930 paramétert képvisel, majd további 5 előfeszítéssel rendelkezünk minden csomópont számára, amely lehetővé teszi számunkra a 9935 paraméterek megszerzését.

A végső csomópontnál van még 5 súlyunk és egy előfeszítésünk, amely 6 paramétert ad meg.

Itt az ideje elkezdeni a képzést a .fit () függvénnyel.

Mivel a neurális hálózati tréning iteratív folyamat, a tréning nem áll le egyszeri elvégzése után. Meg kell adnia az iterációk számát, amelyet a modell képezni kíván.

Ezeket az ismétléseket általában korszakoknak nevezik. 100 korszakon át szeretnénk lefuttatni a képzést, hogy láthassuk, hogyan változik a pontosság az egyes korszakok után.

A választás másik paramétere a kötegelt méret. A tételméret felelős az egy korszakban használni kívánt minták számáért, ami azt jelenti, hogy hány mintát használnak fel egy előre/hátra menetben.

Ez megnöveli a számítás sebességét, mivel kevesebb időbe telik a futtatása, de több memóriára is szükség van, és a modell nagyobb tételméretekkel romolhat. Mivel van egy kis edzőmedencénk, ezt alacsony sarzsmérettel hagyhatjuk:

Most az .evaluate () metódussal mérheti a modell pontosságát. Ezt mind az edzésadatok, mind a tesztadatok esetében megteheti. Arra számítunk, hogy az edzés adatai pontosabbak lesznek, mint a teszt adatai. Minél többet edz egy ideghálózatot, annál valószínűbb, hogy elkezd túlszerelni.

Vegye figyelembe, hogy ha újra futtatja a .fit () metódust, akkor az az előző edzésből számított súlyokkal kezdődik. Ügyeljen arra, hogy újból felépítse a modellt, mielőtt újra elkezdené edzeni.

Most értékeljük a precíziós modellt:

Már látja, hogy a modellt túlfeszítették, mivel elérte az edzéskészlet 100% -os pontosságát. De ez várható volt, mivel a korszakok száma meglehetősen nagy volt ehhez a modellhez. A tesztcsomag pontossága azonban már meghaladta a „Bag of Words” modellel korábbi logisztikai regressziónkat, ami további nagy lépés a fejlődésünk szempontjából.

Az életed megkönnyítése érdekében használhatja ezt a kis segítő funkciót az edzés és a tesztadatok elvesztésének és pontosságának megtekintésére az előzmények (előzmények) alapján.

Ez a hívás, amelyet automatikusan alkalmaznak az egyes Keras modellek, rögzíti a veszteséget és az esetleges további mutatókat, amelyek hozzáadhatók a .fit () metódushoz. Ebben az esetben csak a precizitás érdekel minket. Ez a segítő függvény a matplotlib könyvtárat használja:

A funkció használatához hívja meg a plot_history () parancsot:

Láthatja, hogy túlképeztük a modellünket, mivel az edzéskészlet elérte a 100% -os pontosságot.

Jó módja annak, hogy a modell mikor kezd túlterhelni, amikor az érvényesítési adatok vesztesége ismét növekszik. Ez általában jó pont a modell leállításához. Láthatja, hogy ez 15-25 korszak körül történik.

Ebben az esetben a teszt- és validációs csomagunk megegyezik, mivel kisebb mintamérettel rendelkezünk. Amint arról korábban beszámoltunk, a (mély) ideghálózatok akkor működnek a legjobban, ha nagy számú minta van. A következő részben megismerheti a szavak vektorként való ábrázolásának más módját. Ez egy nagyon izgalmas és hatékony módszer a szavakkal való munkavégzésre, amelyek során megtudhatja, hogyan ábrázolják a szavakat sűrű vektorokként.