Strojové učenie so Spark MLlib

1. Prehľad

V tomto tutoriáli pochopíme, ako využiť Apache Spark MLlib na vývoj produktov strojového učenia. Vyvinieme jednoduchý produkt strojového učenia so Spark MLlib, aby sme demonštrovali základné koncepty.

2. Stručný základ pre strojové učenie

Strojové učenie je súčasť širšieho dáždniku známeho ako umelá inteligencia. Strojové učenie sa týka štúdium štatistických modelov na riešenie konkrétnych problémov so vzormi a závermi. Tieto modely sú „vyškolené“ pre konkrétny problém pomocou tréningových údajov získaných z priestoru problému.

Uvidíme, čo presne táto definícia obnáša, keď si vezmeme náš príklad.

2.1. Kategórie strojového učenia

Môžeme široko kategorizovať strojové učenie na pod dohľadom a bez dozoru kategórie založené na prístupe. Existujú aj ďalšie kategórie, ale ponecháme si tieto dve:

  • Učenie pod dohľadom pracuje so súborom údajov, ktorý obsahuje vstupy aj požadovaný výstup - napríklad súbor údajov obsahujúci rôzne charakteristiky nehnuteľnosti a očakávaný príjem z prenájmu. Vyučované predmety sa ďalej delia na dve široké podkategórie, ktoré sa nazývajú klasifikácia a regresia:
    • Klasifikačné algoritmy súvisia s kategorickým výstupom, napríklad s tým, či je vlastnosť obsadená alebo nie
    • Regresné algoritmy súvisia s kontinuálnym výstupným rozsahom, napríklad s hodnotou vlastnosti
  • Na druhej strane učenie bez dozoru pracuje so súborom údajov, ktoré majú iba vstupné hodnoty. Funguje to tak, že sa pokúšate identifikovať inherentnú štruktúru vstupných údajov. Napríklad hľadanie rôznych typov spotrebiteľov prostredníctvom súboru údajov o ich spotrebiteľskom správaní.

2.2. Pracovný tok strojového učenia

Strojové učenie je skutočne interdisciplinárnou oblasťou štúdia. Vyžaduje znalosti obchodnej oblasti, štatistiky, pravdepodobnosti, lineárnej algebry a programovania. Pretože to môže byť jednoznačne ohromujúce, najlepšie je k tomu pristupovať usporiadane, čo zvyčajne nazývame pracovný tok strojového učenia:

Ako vidíme, každý projekt strojového učenia by sa mal začínať jasne definovaným vyhlásením problému. Potom by mala nasledovať séria krokov týkajúcich sa údajov, ktoré môžu potenciálne vyriešiť problém.

Potom zvyčajne vyberieme model, ktorý sa zameriava na podstatu problému. Nasleduje séria školení a overovania modelov, ktorá sa označuje ako jemné dolaďovanie modelov. Nakoniec model otestujeme na predtým nevidených dátach a nasadíme ho do výroby, ak je uspokojivý.

3. Čo je Spark MLlib?

Spark MLlib je modul nad Spark Core, ktorý poskytuje primitíva strojového učenia ako API. Strojové učenie sa zvyčajne zaoberá veľkým objemom údajov na trénovanie modelu.

Rámec základného výpočtového systému od spoločnosti Spark je obrovskou výhodou. Okrem toho poskytuje MLlib väčšinu populárnych algoritmov strojového učenia a štatistických algoritmov. To výrazne zjednodušuje prácu na rozsiahlom projekte strojového učenia.

4. Strojové učenie s MLlib

Teraz máme dostatok kontextu o strojovom učení a o tom, ako môže MLlib v tomto úsilí pomôcť. Začnime s našim základným príkladom implementácie projektu strojového učenia pomocou programu Spark MLlib.

Ak si spomenieme z našej diskusie o pracovnom postupe strojového učenia, mali by sme začať s vyhlásením o probléme a potom prejsť k údajom. Našťastie pre nás zvolíme „ahoj svet“ strojového učenia, Iris Dataset. Toto je mnohorozmerný označený súbor údajov, ktorý sa skladá z dĺžky a šírky sepálov a okvetných lístkov rôznych druhov kosatca.

To dáva nášmu cieľu problému: môžeme predpovedať druh kosatca z dĺžky a šírky jeho sepalu a okvetného lístka?

4.1. Nastavenie závislostí

Najskôr musíme definovať nasledujúcu závislosť v Mavene, aby sme stiahli príslušné knižnice:

 org.apache.spark spark-mllib_2.11 2.4.3 poskytované 

A potrebujeme inicializovať SparkContext pre prácu so Spark API:

SparkConf conf = nový SparkConf () .setAppName ("hlavný") .setMaster ("miestny [2]"); JavaSparkContext sc = nový JavaSparkContext (conf);

4.2. Načítavajú sa údaje

Najskôr by sme si mali stiahnuť údaje, ktoré sú k dispozícii ako textový súbor vo formáte CSV. Potom musíme tieto dáta načítať do Sparku:

Reťazec dataFile = "data \ iris.data"; JavaRDD data = sc.textFile (dataFile);

Spark MLlib ponúka niekoľko dátových typov, lokálnych aj distribuovaných, ktoré reprezentujú vstupné údaje a zodpovedajúce štítky. Najjednoduchšie z dátových typov sú Vektor:

JavaRDD inputData = data .map (line -> {String [] parts = line.split (","); double [] v = new double [parts.length - 1]; for (int i = 0; i <parts .length - 1; i ++) {v [i] = Double.parseDouble (parts [i]);} return Vectors.dense (v);});

Upozorňujeme, že sme sem zahrnuli iba vstupné funkcie, väčšinou na vykonávanie štatistických analýz.

Príklad výcviku zvyčajne pozostáva z viacerých vstupných funkcií a štítku predstavovaného triedou LabeledPoint:

Mapová mapa = nová HashMap (); map.put ("Iris-setosa", 0); map.put ("Iris-versicolor", 1); map.put ("Iris-virginica", 2); JavaRDD labeledData = data .map (line -> {String [] parts = line.split (","); double [] v = new double [parts.length - 1]; for (int i = 0; i <parts .length - 1; i ++) {v [i] = Double.parseDouble (parts [i]);} vrátiť nový LabeledPoint (map.get (parts [parts.length - 1]), Vectors.dense (v)); });

Náš výstupný štítok v množine údajov je textový, čo znamená druh Iris. Aby sme to vložili do modelu strojového učenia, musíme to previesť na číselné hodnoty.

4.3. Prieskumná analýza údajov

Prieskumná analýza údajov zahrnuje analýzu dostupných údajov. Teraz, Algoritmy strojového učenia sú citlivé na kvalitu údajov, a teda kvalitnejšie údaje majú lepšie vyhliadky na dosiahnutie požadovaného výsledku.

Medzi typické ciele analýzy patrí odstránenie anomálií a detekcia vzorcov. Toto sa dokonca napája na kritické kroky inžinierstva funkcií, aby sa z dostupných údajov dosiahli užitočné funkcie.

Náš súbor údajov je v tomto príklade malý a dobre tvarovaný. Preto si nemusíme dopriať veľa dátových analýz. Spark MLlib je však vybavený rozhraniami API, aby ponúkol dosť informácií.

Začnime jednoduchou štatistickou analýzou:

Zhrnutie MultivariateStatisticalSummary = Statistics.colStats (inputData.rdd ()); System.out.println ("Súhrnný priemer:"); System.out.println (summary.mean ()); System.out.println ("Súhrnná odchýlka:"); System.out.println (summary.variance ()); System.out.println ("Súhrn nenulový:"); System.out.println (summary.numNonzeros ());

Tu sledujeme priemer a rozptyl funkcií, ktoré máme. To je užitočné pri určovaní, či je potrebné vykonať normalizáciu funkcií. Je to užitočné mať všetky funkcie v podobnom rozsahu. Berieme tiež na vedomie nenulové hodnoty, ktoré môžu nepriaznivo ovplyvniť výkon modelu.

Tu je výstup pre naše vstupné údaje:

Priemerný súhrn: [5,843333333333332,3,0540000000000003,3,7586666666666666,1,1986666666666668] Súhrnný rozptyl: [0,6856935123042509,0,18800402684563744,3,113179418344516,0,5824143176733783] Súhrn nenulový: [150,0] 1,0

Ďalšou dôležitou metrikou na analýzu je korelácia medzi vlastnosťami vstupných údajov:

Matrix correlMatrix = Statistics.corr (inputData.rdd (), "pearson"); System.out.println ("Korelačná matica:"); System.out.println (correlMatrix.toString ());

A vysoká korelácia medzi ľubovoľnými dvoma vlastnosťami naznačuje, že nepridávajú žiadnu prírastkovú hodnotu a jeden z nich môže spadnúť. Takto súvisia naše funkcie:

Korelačná matica: 1,0 -0,10936924995064387 0,8717541573048727 0,8179536333691672 -0,10936924995064387 1,0 -0,4205160964011671 -0,3565440896138163 0,8717541573048727 -0,4205160964011701 1,018

4.4. Rozdelenie údajov

Ak si spomenieme na našu diskusiu o pracovnom postupe strojového učenia, zahŕňa to niekoľko iterácií školenia a validácie modelu s následným finálnym testovaním.

Aby sa to stalo, musíme rozdeliť naše tréningové údaje na tréningové, validačné a testovacie sady. Kvôli zjednodušeniu preskočíme overovaciu časť. Poďme teda rozdeliť naše údaje do tréningových a testovacích súborov:

JavaRDD [] splits = parsedData.randomSplit (nový double [] {0,8, 0,2}, 11L); JavaRDD trainingData = rozdelí [0]; JavaRDD testData = rozdelí [1];

4.5. Model Training

Dosiahli sme teda štádium, keď sme analyzovali a pripravili náš súbor údajov. Zostáva len nakŕmiť to do modelu a začať kúzlo! No, ľahšie sa to povie, ako urobí. Musíme zvoliť vhodný algoritmus pre náš problém - spomenúť si na rôzne kategórie strojového učenia, o ktorých sme hovorili už skôr.

Nie je ťažké tomu porozumieť náš problém zapadá do klasifikácie v rámci kontrolovanej kategórie. V tejto kategórii je teraz k dispozícii pomerne veľa algoritmov.

Najjednoduchšou z nich je logistická regresia (slovo regresia nás nenechajte zmiasť; jedná sa koniec koncov o klasifikačný algoritmus):

LogisticRegressionModel model = new LogisticRegressionWithLBFGS () .setNumClasses (3) .run (trainingData.rdd ());

Tu používame trojtriedny klasifikátor založený na BFGS s obmedzenou pamäťou. Podrobnosti o tomto algoritme presahujú rámec tohto tutoriálu, ale toto je jeden z najbežnejšie používaných.

4.6. Vyhodnotenie modelu

Pamätajte, že modelové školenie zahŕňa viac iterácií, ale pre zjednodušenie sme tu použili iba jeden prechod. Teraz, keď sme trénovali náš model, je čas otestovať to na množine údajov o teste:

JavaPairRDD predictionAndLabels = testData .mapToPair (p -> nový Tuple2 (model.predict (p.features ()), p.label ())); Metriky MulticlassMetrics = nové MulticlassMetrics (predictionAndLabels.rdd ()); dvojitá presnosť = metrics.accuracy (); System.out.println ("Presnosť modelu pri testovacích dátach:" + presnosť);

Ako teraz zmeriame účinnosť modelu? Existujú niekoľko metrík, ktoré môžeme použiť, ale jednou z najjednoduchších je Presnosť. Jednoducho povedané, presnosť je pomer správneho počtu predpovedí a celkového počtu predpovedí. Tu je to, čo môžeme dosiahnuť v jednom cykle nášho modelu:

Presnosť modelu na testovacích dátach: 0,9310344827586207

Upozorňujeme, že sa to bude mierne líšiť od cyklu k cyklu kvôli stochastickej povahe algoritmu.

V niektorých problémových doménach však presnosť nie je veľmi efektívna metrika. Iné sofistikovanejšie metriky sú Precision and Recall (F1 Score), ROC Curve a Confusion Matrix.

4.7. Uloženie a načítanie modelu

Nakoniec potrebujeme trénovaný model často uložiť do súborového systému a načítať ho na účely predikcie produkčných údajov. Toto je v aplikácii Spark triviálne:

model.save (sc, "model \ logistická regresia"); LogisticRegressionModel sameModel = LogisticRegressionModel .load (sc, "model \ logistic-regression"); Vektor newData = Vectors.dense (nové dvojité [] {1,1,1,1}); dvojitá predpoveď = sameModel.predict (newData); System.out.println ("Predikcia modelu pre nové dáta =" + predpoveď);

Model teda ukladáme do súborového systému a načítame späť. Po načítaní je možné model ihneď použiť na predikciu výstupu nových údajov. Tu je ukážka predikcie náhodných nových údajov:

Predikcia modelu na nových dátach = 2.0

5. Za primitívnym príkladom

Aj keď príklad, ktorý sme si prešli, pokrýva pracovný tok projektu strojového učenia široko, zanecháva veľa jemných a dôležitých bodov. Aj keď tu nie je možné podrobne o nich diskutovať, určite si môžeme prejsť niektoré z dôležitých.

Spark MLlib má prostredníctvom svojich API rozsiahlu podporu vo všetkých týchto oblastiach.

5.1. Výber modelu

Výber modelu je často jednou z komplexných a kritických úloh. Výcvik modelu je zapojený proces a je oveľa lepšie ho robiť na modeli, pri ktorom sme si istí, že prinesie požadované výsledky.

Aj keď povaha problému nám môže pomôcť identifikovať kategóriu algoritmu strojového učenia, z ktorej si môžeme vybrať, nie je to práca úplne hotová. Ako sme už videli, v rámci kategórie ako klasifikácia často existuje veľa rôznych algoritmov a ich variácií, z ktorých si môžete vybrať.

Často najlepším postupom je rýchle prototypovanie na oveľa menšej množine údajov. Knižnica ako Spark MLlib výrazne uľahčuje prácu s rýchlymi prototypmi.

5.2. Modelové ladenie hyperparametrov

Typický model sa skladá z funkcií, parametrov a hyperparametrov. Funkcie sú to, čo do modelu vkladáme ako vstupné údaje. Parametre modelu sú premenné, ktoré sa model učí počas tréningového procesu. V závislosti od modelu existujú určité ďalšie parametre, ktoré musíme nastaviť na základe skúseností a iteratívne ich upraviť. Nazývajú sa modelové hyperparametre.

Napríklad rýchlosť učenia je typickým hyperparametrom v algoritmoch založených na gradiente a klesaní. Rýchlosť učenia riadi, ako sa rýchle parametre upravujú počas tréningových cyklov. Toto musí byť trefne nastavené tak, aby sa model učil efektívne a v primeranom tempe.

Aj keď môžeme začať s počiatočnou hodnotou takýchto hyperparametrov na základe skúseností, musíme vykonať validáciu modelu a manuálne ich iteračne vyladiť.

5.3. Výkon modelu

Štatistický model, hoci je trénovaný, je náchylné na nadmerné vybavenie a nedostatočné vybavenie, čo spôsobuje zlý výkon modelu. Nedostatočné vybavenie sa vzťahuje na prípad, keď model dostatočne nevyberie všeobecné podrobnosti z údajov. Na druhej strane k preplneniu dôjde, keď model začne zachytávať šum aj z údajov.

Existuje niekoľko metód, ako sa vyhnúť problémom s vybavením a nadmerným vybavením, ktoré sa často používajú v kombinácii. Napríklad na potlačenie nadmerného vybavenia sú najpoužívanejšie techniky krížová validácia a regularizácia. Podobne, aby sme zlepšili nedostatočné vybavenie, môžeme zvýšiť zložitosť modelu a predĺžiť čas na tréning.

Spark MLlib má fantastickú podporu pre väčšinu z týchto techník, ako je regularizácia a krížová validácia. Väčšina algoritmov má v skutočnosti predvolenú podporu.

6. Spark MLlib v porovnaní

Aj keď je Spark MLlib celkom výkonná knižnica pre projekty strojového učenia, určite nie je jediná na túto prácu. Existuje pomerne veľa knižníc dostupných v rôznych programovacích jazykoch s rôznou podporou. Prejdeme si tu niektoré z populárnych.

6.1. Tensorflow / Keras

Tensorflow je open-source knižnica pre tok dát a diferencovateľné programovanie, široko používaná pre aplikácie strojového učenia. Spolu s jeho vysokoúrovňovou abstrakciou, Keras, je nástrojom voľby pre strojové učenie. Primárne sú napísané v jazykoch Python a C ++ a primárne sa používajú v jazyku Python. Na rozdiel od Spark MLlib nemá prítomnosť polyglotov.

6.2. Theano

Theano je ďalší open-source založený na Pythone knižnica na manipuláciu a vyhodnocovanie matematických výrazov - napríklad výrazy založené na matici, ktoré sa bežne používajú v algoritmoch strojového učenia. Na rozdiel od Spark MLlib sa Theano opäť primárne používa v Pythone. Keras sa však dá použiť spolu s koncovým zariadením Theano.

6.3. CNTK

Microsoft Cognitive Toolkit (CNTK) je a rámec hlbokého učenia napísaný v C ++, ktorý popisuje výpočtové kroky prostredníctvom smerovaného grafu. Môže byť použitý v programoch Python aj C ++ a primárne sa používa pri vývoji neurónových sietí. K dispozícii je back-end Keras založený na CNTK, ktorý poskytuje známu intuitívnu abstrakciu.

7. Záver

Ak to zhrnieme, v tomto tutoriáli sme prešli základmi strojového učenia vrátane rôznych kategórií a pracovných postupov. Prešli sme si základy Spark MLlib ako knižnice strojového učenia, ktorá je nám k dispozícii.

Ďalej sme vyvinuli jednoduchú aplikáciu strojového učenia založenú na dostupnej množine údajov. V našom príklade sme implementovali niektoré z najbežnejších krokov v pracovnom postupe strojového učenia.

Tiež sme prešli niektorými pokročilými krokmi v typickom projekte strojového učenia a tým, ako im v tom môže pomôcť Spark MLlib. Nakoniec sme videli niektoré z alternatívnych knižníc strojového učenia, ktoré máme k dispozícii na použitie.

Ako vždy, kód nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found