Strojno učenje s Spark MLlib

1. Pregled

U ovom ćemo uputstvu razumjeti kako iskoristiti Apache Spark MLlib za razvoj proizvoda za strojno učenje. S Sparkom MLlib razvit ćemo jednostavan proizvod za strojno učenje kako bismo demonstrirali temeljne koncepte.

2. Kratki priručnik za strojno učenje

Strojno učenje je dio šireg kišobrana poznatog kao umjetna inteligencija. Strojno učenje odnosi se na proučavanje statističkih modela za rješavanje određenih problema s uzorcima i zaključcima. Ovi se modeli „obučavaju“ za određeni problem pomoću podataka o treningu izvučenih iz problemskog prostora.

Vidjet ćemo što točno ta definicija podrazumijeva uzimajući na svom primjeru.

2.1. Kategorije strojnog učenja

Možemo široko kategorizirati strojno učenje na nadzirano i nenadzirano kategorije temeljene na pristupu. Postoje i druge kategorije, ali mi ćemo se zadržati na ove dvije:

  • Učenje pod nadzorom radi sa skupom podataka koji sadrži i ulaze i željeni izlaz - na primjer, skup podataka koji sadrži različite karakteristike nekretnine i očekivani prihod od najma. Nadzirano učenje dalje je podijeljeno u dvije široke potkategorije nazvane klasifikacija i regresija:
    • Algoritmi klasifikacije povezani su s kategorijskim rezultatima, poput toga je li neko svojstvo zauzeto ili nije
    • Algoritmi regresije povezani su s kontinuiranim izlaznim rasponom, poput vrijednosti svojstva
  • S druge strane, učenje bez nadzora radi sa skupom podataka koji imaju samo ulazne vrijednosti. Djeluje pokušavajući identificirati inherentnu strukturu ulaznih podataka. Primjerice, pronalaženje različitih vrsta potrošača putem skupa podataka o njihovom ponašanju u potrošnji.

2.2. Tijek rada strojnog učenja

Strojno učenje uistinu je interdisciplinarno područje proučavanja. Potrebno je poznavanje poslovnog područja, statistike, vjerojatnosti, linearne algebre i programiranja. Kako ovo očito može postati neodoljivo, najbolje je tome pristupiti uredno, ono što obično nazivamo tijekom strojnog učenja:

Kao što vidimo, svaki projekt strojnog učenja trebao bi započeti s jasno definiranom izjavom problema. Nakon toga trebao bi slijediti niz koraka koji se odnose na podatke koji potencijalno mogu odgovoriti na problem.

Tada obično odabiremo model koji gleda na prirodu problema. Nakon toga slijedi niz obuka i validacija modela, koja je poznata kao fino podešavanje modela. Na kraju, testiramo model na prethodno neviđenim podacima i ako je zadovoljavajući, implementiramo ga u proizvodnju.

3. Što je iskra MLlib?

Spark MLlib je modul na vrhu Spark Core koji pruža primitive za strojno učenje kao API-ji. Strojno učenje obično obrađuje veliku količinu podataka za obuku modela.

Osnovni računalni okvir tvrtke Spark velika je korist. Povrh svega, MLlib nudi većinu popularnih strojnog učenja i statističkih algoritama. To uvelike pojednostavljuje zadatak rada na velikom projektu strojnog učenja.

4. Strojno učenje s MLlibom

Sad imamo dovoljno konteksta o strojnom učenju i kako MLlib može pomoći u ovom pothvatu. Krenimo s našim osnovnim primjerom provedbe projekta strojnog učenja s Spark MLlib.

Ako se prisjetimo naše rasprave o tijeku rada strojnog učenja, trebali bismo započeti s izjavom problema, a zatim prijeći na podatke. Na našu sreću, odabrat ćemo "zdravi svijet" strojnog učenja, Iris Dataset. Ovo je multivarijantno označen skup podataka, koji se sastoji od duljine i širine čašica i latica različitih vrsta perunika.

To našem cilju daje cilj: možemo li predvidjeti vrstu perunika na temelju duljine i širine njenog sjemenskog lista i latice?

4.1. Postavljanje ovisnosti

Prvo, moramo definirati sljedeću ovisnost u Mavenu da povučemo relevantne knjižnice:

 org.apache.spark spark-mllib_2.11 2.4.3 pod uvjetom 

I moramo inicijalizirati SparkContext za rad sa Spark API-ima:

SparkConf conf = new SparkConf () .setAppName ("Main") .setMaster ("local [2]"); JavaSparkContext sc = novi JavaSparkContext (conf);

4.2. Učitavanje podataka

Prvo, trebali bismo preuzeti podatke koji su dostupni u obliku tekstualne datoteke u CSV formatu. Zatim ove podatke moramo učitati u Spark:

String dataFile = "podaci \ iris.data"; JavaRDD podaci = sc.textFile (dataFile);

Spark MLlib nudi nekoliko vrsta podataka, lokalnih i distribuiranih, za predstavljanje ulaznih podataka i odgovarajućih oznaka. Najjednostavniji od tipova podataka su Vektor:

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

Imajte na umu da smo ovdje uključili samo ulazne značajke, uglavnom za provođenje statističke analize.

Primjer treninga obično se sastoji od više ulaznih značajki i oznake, predstavljene razredom OznačenPoint:

Karta karte = novi HashMap (); map.put ("Iris-setosa", 0); map.put ("Iris-versicolor", 1); map.put ("Iris-djevica", 2); JavaRDD s oznakomData = 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 new LabeledPoint (map.get (parts [parts.length - 1]), Vectors.dense (v)); });

Naša izlazna oznaka u skupu podataka je tekstualna i označava vrstu perunika. Da bismo ovo pretočili u model strojnog učenja, moramo to pretvoriti u numeričke vrijednosti.

4.3. Istraživačka analiza podataka

Istraživačka analiza podataka uključuje analizu dostupnih podataka. Sada, Algoritmi strojnog učenja osjetljivi su na kvalitetu podataka, stoga kvalitetniji podaci imaju bolje izglede za postizanje željenog ishoda.

Tipični ciljevi analize uključuju uklanjanje anomalija i otkrivanje obrazaca. To se čak uključuje u kritične korake inženjeringa značajki kako bi se iz dostupnih podataka došlo do korisnih značajki.

Naš je skup podataka u ovom primjeru mali i dobro oblikovan. Stoga se ne moramo upuštati u puno analize podataka. Spark MLlib, međutim, opremljen je API-jevima koji pružaju prilično uvid.

Počnimo s nekoliko jednostavnih statističkih analiza:

Sažetak MultivariateStatisticSummary = Statistics.colStats (inputData.rdd ()); System.out.println ("Sažetak srednje vrijednosti:"); System.out.println (summary.mean ()); System.out.println ("Sažetak varijance:"); System.out.println (summary.variance ()); System.out.println ("Sažetak koji nije nula:"); System.out.println (summary.numNonzeros ());

Ovdje promatramo srednju vrijednost i varijance značajki koje imamo. Ovo je korisno u određivanju trebamo li izvršiti normalizaciju značajki. To je korisno imati sve značajke na sličnoj skali. Također bilježimo vrijednosti koje nisu nula, što može negativno utjecati na izvedbu modela.

Evo izlaza za naše ulazne podatke:

Sažetak Prosječno: [5.843333333333332,3.0540000000000003,3.7586666666666666,1,198666666666666668] Sažetak varijance: [0.6856935123042509,0.18800402684563744,3.113179418344516,0.5824143176733783] Sažetak Ne-nula.0: 150,0,1 -50.0, 150,0

Sljedeća važna metrika za analizu je korelacija između značajki u ulaznim podacima:

Matrica correlMatrix = Statistics.corr (inputData.rdd (), "pearson"); System.out.println ("Matrica korelacije:"); System.out.println (correlMatrix.toString ());

A visoka korelacija između bilo koje dvije značajke sugerira da ne dodaju nikakvu inkrementalnu vrijednost a jedan od njih može se ispustiti. Evo kako su povezane naše značajke:

Korelacijska matrica: 1,0 -0,10936924995064387 0,8717541573048727 0,8179536333691672 -0,10936924995064387 1,0 -0,4205160964011671 -0,3565440896138163 0,8717541573048727 -0,420516096401909669 0,6625061601709 0,6961601601601

4.4. Podjela podataka

Ako se prisjetimo naše rasprave o tijeku strojnog učenja, ona uključuje nekoliko ponavljanja obuke i provjere valjanosti, a nakon toga završno testiranje.

Da bi se to dogodilo, svoje podatke o treningu moramo podijeliti na setove za obuku, provjeru valjanosti i testove. Da bismo pojednostavili stvari, preskočit ćemo dio provjere valjanosti. Dakle, podijelimo naše podatke u setove za obuku i testiranje:

JavaRDD [] dijeli = parsedData.randomSplit (novi dvostruki [] {0,8, 0,2}, 11L); JavaRDD trainingData = dijeli se [0]; JavaRDD testData = dijeli se [1];

4.5. Trening modela

Dakle, došli smo do faze u kojoj smo analizirali i pripremili svoj skup podataka. Preostalo je samo ovo ubaciti u model i pokrenuti čaroliju! Pa, lakše reći nego učiniti. Moramo odabrati prikladan algoritam za naš problem - prisjetimo se različitih kategorija strojnog učenja o kojima smo ranije govorili.

Nije teško to razumjeti naš se problem uklapa u klasifikaciju unutar nadzirane kategorije. Sada postoji dosta algoritama dostupnih za upotrebu u ovoj kategoriji.

Najjednostavnija od njih je Logistička regresija (neka nas riječ regresija ne zbuni; ipak je to algoritam klasifikacije):

Model LogisticRegressionModel = novi LogisticRegressionWithLBFGS () .setNumClasses (3) .run (trainingData.rdd ());

Ovdje koristimo klasifikator s ograničenom memorijom BFGS koji se temelji na tri klase. Pojedinosti ovog algoritma izvan su dosega ovog vodiča, ali ovo je jedan od najčešće korištenih.

4.6. Procjena modela

Imajte na umu da trening modela uključuje višestruke ponavljanja, ali radi jednostavnosti ovdje smo upravo koristili jedan prolaz. Sad kad smo istrenirali svoj model, vrijeme je da to testiramo na testnom skupu podataka:

JavaPairRDD predictionAndLabels = testData .mapToPair (p -> novi Tuple2 (model.predict (p.features ()), p.label ())); Metrika MulticlassMetrics = nova MulticlassMetrics (predictionAndLabels.rdd ()); dvostruka točnost = metričke vrijednosti.tačnost (); System.out.println ("Točnost modela na test podacima:" + točnost);

E sad, kako mjerimo učinkovitost modela? Tamo su nekoliko mjernih podataka koje možemo koristiti, ali jedan od najjednostavnijih je Točnost. Jednostavno rečeno, točnost je omjer točnog broja predviđanja i ukupnog broja predviđanja. Evo što možemo postići jednim potezom našeg modela:

Točnost modela na podacima testa: 0,9310344827586207

Imajte na umu da će se ovo malo razlikovati od trčanja do trčanja zbog stohastičke prirode algoritma.

Međutim, točnost nije vrlo učinkovita metrika u nekim problemskim domenama. Ostalo sofisticiraniji metrički podaci su Precision and Recall (F1 Score), ROC Curve i Confusion Matrix.

4.7. Spremanje i učitavanje modela

Napokon, često trebamo spremiti obučeni model u datotečni sustav i učitati ga za predviđanje proizvodnih podataka. U Sparku je ovo trivijalno:

model.save (sc, "model \ logistička regresija"); LogisticRegressionModel sameModel = LogisticRegressionModel .load (sc, "model \ logistic-regression"); Vektor newData = Vectors.dense (novi dvostruki [] {1,1,1,1}); dvostruko predviđanje = istiModel.predict (newData); System.out.println ("Predviđanje modela na novim podacima =" + predviđanje);

Dakle, spremamo model u datotečni sustav i vraćamo ga natrag. Nakon učitavanja, model se odmah može koristiti za predviđanje rezultata na novim podacima. Evo uzorka predviđanja slučajnih novih podataka:

Predviđanje modela na novim podacima = 2,0

5. Dalje od primitivnog primjera

Iako primjer koji smo prošli obuhvaća tijek rada projekta strojnog učenja, on ostavlja puno suptilnih i važnih poanta. Iako ovdje nije moguće detaljno razgovarati o njima, zasigurno možemo proći kroz neke od važnih.

Spark MLlib kroz svoje API-je ima veliku podršku u svim tim područjima.

5.1. Odabir modela

Odabir modela često je jedan od složenih i kritičnih zadataka. Obuka modela uključuje proces i puno je bolje to učiniti na modelu za koji smo sigurniji da će dati željene rezultate.

Iako nam priroda problema može pomoći u prepoznavanju kategorije algoritma strojnog učenja iz koje možemo izabrati, to nije posao koji je u potpunosti završen. Unutar kategorije poput klasifikacije, kao što smo vidjeli ranije, često postoji mnogo mogućih različitih algoritama i njihovih varijacija.

Često najbolji način djelovanja je brza izrada prototipa na mnogo manjem skupu podataka. Biblioteka poput Spark MLlib znatno olakšava posao brzog izrade prototipa.

5.2. Ugađanje hiperparametara modela

Tipični model sastoji se od značajki, parametara i hiper-parametara. Značajke su ono što u model unosimo kao ulazne podatke. Parametri modela su varijable koje model uči tijekom procesa treninga. Ovisno o modelu, postoje određeni dodatni parametri koje moramo postaviti na temelju iskustva i iterativno ih prilagoditi. Oni se nazivaju hiper-parametri modela.

Na primjer, stopa učenja tipičan je hiper-parametar u algoritmima temeljenim na gradijentu-spustu. Stopa učenja kontrolira koliko se brzo parametri prilagođavaju tijekom ciklusa treninga. To mora biti prikladno postavljeno da bi model mogao učinkovito učiti razumnim tempom.

Iako možemo započeti s početnom vrijednošću takvih hiper-parametara na temelju iskustva, moramo izvršiti provjeru valjanosti i ručno ih podesiti iterativno.

5.3. Izvedba modela

Statistički model, iako je obučen, jest skloni prekomjernoj i nedovoljnoj opremi, što uzrokuje loše performanse modela. Underfitting se odnosi na slučaj kada model nedovoljno odabire opće detalje iz podataka. S druge strane, prekomjerno prilagođavanje događa se kada model počne pobirati buku i iz podataka.

Postoji nekoliko metoda za izbjegavanje problema nedovoljne opremljenosti i prekomjerne opreme, koje se često koriste u kombinaciji. Na primjer, za suzbijanje prekomjerne opremljenosti, najčešće korištene tehnike uključuju unakrsnu provjeru valjanosti i regularizaciju. Slično tome, za poboljšanje nedovoljne opremljenosti možemo povećati složenost modela i povećati vrijeme treninga.

Spark MLlib ima fantastičnu podršku za većinu ovih tehnika poput regularizacije i unakrsne provjere valjanosti. Zapravo, većina algoritama ima zadanu podršku za njih.

6. Spark MLlib u usporedbi

Iako je Spark MLlib prilično moćna knjižnica za projekte strojnog učenja, zasigurno nije jedina za posao. Postoji čitav niz biblioteka dostupnih na različitim programskim jezicima s različitom podrškom. Ovdje ćemo proći neke od popularnih.

6.1. Tenzor tok / Keras

Tensorflow je otvoreni izvor knjižnica za protok podataka i različito programiranje, široko korištena za aplikacije strojnog učenja. Zajedno sa svojom apstrakcijom na visokoj razini, Keras, to je alat izbora za strojno učenje. Oni su prvenstveno napisani na Pythonu i C ++, a prvenstveno se koriste u Pythonu. Za razliku od Spark MLlib, on nema poliglot.

6.2. Theano

Theano je još jedan otvoreni izvor zasnovan na Pythonu knjižnica za manipulaciju i vrednovanje matematičkih izraza - na primjer, izrazi temeljeni na matrici, koji se obično koriste u algoritmima strojnog učenja. Za razliku od Spark MLlib, Theano se opet prvenstveno koristi u Pythonu. Keras se, međutim, može koristiti zajedno s Theanoovom stražnjom stranom.

6.3. CNTK

Microsoftov kognitivni alat (CNTK) je okvir dubokog učenja napisan na jeziku C ++ koji opisuje računske korake putem usmjerenog grafa. Može se koristiti u programima Python i C ++, a prvenstveno se koristi u razvoju neuronskih mreža. Postoji Kerasov stražnji kraj zasnovan na CNTK-u dostupan za upotrebu koji pruža poznatu intuitivnu apstrakciju.

7. Zaključak

Da rezimiramo, u ovom smo tutorijalu prošli kroz osnove strojnog učenja, uključujući različite kategorije i tijek rada. Prošli smo kroz osnove Sparka MLliba kao biblioteke strojnog učenja koja nam je dostupna.

Nadalje, razvili smo jednostavnu aplikaciju strojnog učenja koja se temelji na dostupnom skupu podataka. Primijenili smo neke od najčešćih koraka u tijeku strojnog učenja u našem primjeru.

Također smo prošli neke napredne korake u tipičnom projektu strojnog učenja i kako Spark MLlib u tome može pomoći. Napokon smo vidjeli neke od alternativnih knjižnica strojnog učenja koje su nam dostupne za korištenje.

Kao i uvijek, kod se može pronaći na GitHub-u.