Gépi tanulás a Spark MLlib segítségével

1. Áttekintés

Ebben az oktatóanyagban megértjük, hogyan lehet az Apache Spark MLlibet felhasználni a gépi tanulási termékek fejlesztéséhez. A Spark MLlib segítségével kifejlesztünk egy egyszerű gépi tanulási terméket, amely bemutatja az alapvető koncepciókat.

2. A gépi tanulás rövid bemutatása

A gépi tanulás az a mesterséges intelligencia néven ismert szélesebb esernyő része. A gépi tanulás a statisztikai modellek tanulmányozása konkrét problémák megoldására mintákkal és következtetésekkel. Ezeket a modelleket a problématerületből levont képzési adatok segítségével „képzik” az adott problémára.

Meglátjuk, hogy ez a meghatározás pontosan mit tartalmaz, ahogy példánkat vesszük.

2.1. Gépi tanulási kategóriák

Nagyjából tudjuk kategorizálja a gépi tanulást felügyelt és felügyelet nélküli kategóriába kategóriák a megközelítés alapján. Vannak más kategóriák is, de tartjuk magunkat ehhez a kettőhöz:

  • Felügyelt tanulás olyan adatkészlettel működik, amely tartalmazza mind a bemeneteket, mind a kívánt kimenetet - például egy adatsor, amely az ingatlan különféle jellemzőit és a várható bérleti jövedelmet tartalmazza. A felügyelt tanulás további két nagy alkategóriára oszlik, az úgynevezett osztályozás és regresszió:
    • Az osztályozási algoritmusok a kategorikus kimenethez kapcsolódnak, például ahhoz, hogy egy tulajdonság foglalt-e vagy sem
    • A regressziós algoritmusok folyamatos kimeneti tartományhoz kapcsolódnak, például egy tulajdonság értékéhez
  • A felügyelet nélküli tanulás viszont olyan adatkészlettel működik, amelynek csak bemeneti értékei vannak. Úgy működik, hogy megpróbálja azonosítani a bemeneti adatokban rejlő struktúrát. Például különböző típusú fogyasztók megtalálása fogyasztási magatartásuk adatállományán keresztül.

2.2. Gépi tanulási munkafolyamat

A gépi tanulás valóban interdiszciplináris tanulmányi terület. Megköveteli az üzleti terület, a statisztikák, a valószínűség, a lineáris algebra és a programozás ismeretét. Mivel ez egyértelműen elsöprő lehet, a legjobb, ha ezt rendezett módon közelítjük meg, amit általában gépi tanulási munkafolyamatnak hívunk:

Mint láthatjuk, minden gépi tanulási projektnek világosan meghatározott problémamegállapítással kell kezdődnie. Ezt egy sor olyan lépéssel kell követnie, amelyek az adatokkal kapcsolatosak, amelyek potenciálisan megválaszolhatják a problémát.

Ezután tipikusan kiválasztunk egy modellt, amely a probléma természetét vizsgálja. Ezt követi a modellképzés és -ellenőrzés sorozata, amely a modell finomhangolása néven ismert. Végül teszteljük a modellt korábban nem látott adatokon, és kielégítő módon telepítjük a gyártásba.

3. Mi a szikra MLlib?

Spark MLlib az egy modul a Spark Core tetején, amely gépi tanulási primitíveket biztosít mint API-k. A gépi tanulás általában nagy mennyiségű adattal foglalkozik a modellképzéshez.

A Spark alap számítási keretrendszere óriási előny. Ezen felül az MLlib biztosítja a népszerű gépi tanulási és statisztikai algoritmusok nagy részét. Ez nagymértékben leegyszerűsíti egy nagyszabású gépi tanulási projekten végzett munkát.

4. Gépi tanulás az MLlib segítségével

Most már elég kontextusunk van a gépi tanulásról és arról, hogy az MLlib hogyan segíthet ebben a törekvésben. Kezdjük a gépi tanulási projekt megvalósításának alapvető példájával a Spark MLlib segítségével.

Ha a gépi tanulási munkafolyamatról folytatott beszélgetésünkből felidézzük, akkor egy problémamegállapítással kell kezdenünk, majd át kell térnünk az adatokra. Szerencsénkre a gépi tanulás „szia világát” választjuk, Iris Dataset. Ez egy többváltozós címkével ellátott adatkészlet, amely az írisz különböző fajainak és szirmainak a hosszát és szélességét tartalmazza.

Ez a problémánk célkitűzését adja: megjósolhatjuk-e az írisz fajtáját a csészealja és szirma hossza és szélessége alapján??

4.1. A függőségek beállítása

Először meg kell határoznunk a következő függőséget Mavenben a megfelelő könyvtárak kiválasztásához:

 org.apache.spark spark-mllib_2.11 2.4.3 biztosított 

És inicializálnunk kell a SparkContext-et, hogy működjön együtt a Spark API-kkal:

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

4.2. Az adatok betöltése

Először is le kell töltenünk az adatokat, amelyek szöveges fájlként CSV formátumban érhetők el. Ezután be kell töltenünk ezeket az adatokat a Sparkba:

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

A Spark MLlib számos adattípust kínál, mind helyi, mind elosztott módon, a bemeneti adatok és a megfelelő címkék ábrázolására. Az adattípusok közül a legegyszerűbb Vektor:

JavaRDD inputData = data .map (vonal -> {Karakterlánc [] részek = vonal.split (","); kettős [] v = új kettős [részek.hossz - 1]; for (int i = 0; i <alkatrészek .hossz - 1; i ++) {v [i] = Dupla.parseDupla (részek [i]);} visszatérési vektorok.sűrű (v);});

Ne feledje, hogy itt csak a bemeneti jellemzőket vettük fel, főleg a statisztikai elemzés elvégzéséhez.

A képzési példa általában több bemeneti jellemzőből és egy címkéből áll, amelyet az osztály képvisel LabeledPoint:

Térképtérkép = új 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 <alkatrészek .length - 1; i ++) {v [i] = Double.parseDouble (parts [i]);} adja vissza az új LabeledPoint-ot (map.get (parts [parts.length - 1]), Vectors.dense (v)); });

Az adatkészletben található kimeneti címkénk szöveges, az Iris faját jelöli. Ahhoz, hogy ezt betápláljuk egy gépi tanulási modellbe, ezt számszerű értékekké kell átalakítanunk.

4.3. Feltáró adatok elemzése

A feltáró adatelemzés magában foglalja a rendelkezésre álló adatok elemzését. Most, a gépi tanulási algoritmusok érzékenyek az adatminőségre, ezért a jobb minőségű adatok jobb kilátásokkal szolgálnak a kívánt eredmény elérésére.

A tipikus elemzési célok közé tartozik az anomáliák eltávolítása és a minták detektálása. Ez még a funkciótervezés kritikus lépéseibe is belefér, hogy a rendelkezésre álló adatokból hasznos funkciókat érjen el.

Adatkészletünk ebben a példában kicsi és jól formázott. Ezért nincs szükségünk sok adatelemzésre. A Spark MLlib azonban API-val van felszerelve, hogy meglehetősen betekintést nyújtson.

Kezdjük néhány egyszerű statisztikai elemzéssel:

MultivariateStatisticalSummary összefoglaló = Statistics.colStats (inputData.rdd ()); System.out.println ("Összegzés jelentése:"); System.out.println (összefoglaló.mean ()); System.out.println ("Összefoglaló variancia:"); System.out.println (összefoglaló.varancia ()); System.out.println ("Összegzés nem nulla:"); System.out.println (summary.numNonzeros ());

Itt figyeljük meg a jellemzőink átlagát és szórását. Ez hasznos annak eldöntésében, hogy végre kell-e hajtani a funkciók normalizálását. Ez az hasznos, ha minden funkció hasonló méretű. Megjegyezzük a nem nulla értékeket is, amelyek hátrányosan befolyásolhatják a modell teljesítményét.

Itt van a bemeneti adatok kimenete:

Összegzési átlag: [5.843333333333332,3.054000000000000003,3.7586666666666666,1.1986666666666668] Összegzés variancia: [0.6856935123042509,0.18800402684563744,3.113179418344516,0.58241431767337.0] 15050

Egy másik fontos elemzendő mutató a korreláció a bemeneti adatok jellemzői között:

Matrix correlMatrix = Statistics.corr (inputData.rdd (), "pearson"); System.out.println ("Korrelációs mátrix:"); System.out.println (correlMatrix.toString ());

A a két tulajdonság közötti magas összefüggés azt sugallja, hogy nem adnak hozzá növekményes értéket és egyiküket el lehet dobni. A szolgáltatásaink így állnak összefüggésben:

Korrelációs mátrix: 1.0 -0.10936924995064387 0.8717541573048727 0.8179536333691672 -0.10936924995064387 1.0 -0.4205160964011671 -0.3565440896138163 0.8717541573048727 -0.4205160901

4.4. Az adatok felosztása

Ha felidézzük a gépi tanulási munkafolyamatról szóló beszélgetésünket, akkor a modellképzés és az érvényesítés többszörös ismétlését vonja maga után, majd végső tesztelést végez.

Hogy ez megtörténjen, fel kell osztanunk edzési adatainkat képzési, validációs és tesztkészletekre. A dolgok egyszerűsége érdekében kihagyjuk az ellenőrzési részt. Tehát osszuk szét adatainkat képzési és tesztkészletekre:

JavaRDD [] splits = parsedData.randomSplit (új dupla [] {0,8, 0,2}, 11L); JavaRDD trainingData = hasít [0]; JavaRDD testData = hasít [1];

4.5. Modellképzés

Tehát eljutottunk egy olyan szakaszba, ahol elemeztük és elkészítettük az adatkészletünket. Már csak az kell, hogy ezt betáplálja egy modellbe, és elindítsa a varázslatot! Nos, könnyebb mondani, mint megtenni. Meg kell választanunk megfelelő algoritmust a problémánkra - idézzük fel a gépi tanulás különböző kategóriáit, amelyekről korábban beszéltünk.

Ezt nem nehéz megérteni problémánk a felügyelt kategórián belüli osztályozásba illeszkedik. Most jó néhány algoritmus használható ezen kategória alatt.

Közülük a legegyszerűbb a logisztikai regresszió (a regresszió szó ne tévesszen meg minket; végül is osztályozási algoritmus):

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

Itt háromosztályú korlátozott memóriájú BFGS alapú osztályozót használunk. Ennek az algoritmusnak a részletei túlmutatnak az oktatóanyag keretein, de ez az egyik legszélesebb körben használt.

4.6. Modellértékelés

Ne feledje, hogy a modellképzés többszörös iterációt tartalmaz, de az egyszerűség kedvéért itt csak egy menetet használtunk. Most, hogy betanítottuk a modellünket, itt az ideje tesztelni ezt a tesztadatkészleten:

JavaPairRDD predictionAndLabels = testData .mapToPair (p -> új Tuple2 (model.predict (p.features ()), p.label ())); MulticlassMetrics metrika = új MulticlassMetrics (predictionAndLabels.rdd ()); kettős pontosság = mutatók.pontosság (); System.out.println ("Modell pontossága a vizsgálati adatokon:" + pontosság);

Most hogyan mérjük a modell hatékonyságát? Vannak több mérőszám, amelyet felhasználhatunk, de az egyik legegyszerűbb a Pontosság. Egyszerűen fogalmazva, a pontosság a jóslatok helyes számának és az előrejelzések teljes számának aránya. Íme, mit érhetünk el modellünk egyetlen futtatásával:

Modell pontossága a tesztadatokon: 0,9310344827586207

Vegye figyelembe, hogy ez az egyes futtatások között kissé eltér az algoritmus sztochasztikus jellege miatt.

A pontosság azonban nem túl hatékony mutató néhány problémás területen. Egyéb kifinomultabb mérőszámok a Precision and Recall (F1 Score), a ROC Curve és a Confusion Matrix.

4.7. A modell mentése és betöltése

Végül gyakran el kell mentenünk a betanított modellt a fájlrendszerbe, és be kell töltenünk a termelési adatok előrejelzése céljából. Ez a Sparkban triviális:

model.save (sc, "modell \ logisztikai-regresszió"); LogisticRegressionModel sameModel = LogisticRegressionModel .load (sc, "modell \ logisztikai-regresszió"); Vektor newData = Vektorok.sűrű (új kettős [] {1,1,1,1}); kettős előrejelzés = sameModel.predict (newData); System.out.println ("Model Prediction on New Data =" + predikció);

Tehát mentjük a modellt a fájlrendszerbe, és visszatöltjük. Betöltés után a modell azonnal felhasználható az új adatok kimenetének előrejelzésére. Itt egy minta előrejelzés véletlenszerű új adatokról:

Modelljóslás új adatokra = 2.0

5. A primitív példán túl

Noha az általunk átélt példa nagyjából lefedi a gépi tanulási projekt munkafolyamatát, sok finom és fontos pontot hagy maga után. Bár itt nem lehet részletesen megvitatni őket, mindenképpen áttekinthetünk néhány fontosat.

A Spark MLlib API-jai révén széleskörű támogatást nyújt ezeken a területeken.

5.1. Modell kiválasztása

A modellválasztás gyakran az egyik összetett és kritikus feladat. A modell kiképzése részt vesz egy folyamatban, és sokkal jobb, ha olyan modellen hajtjuk végre, amelyben bízunk benne, hogy a kívánt eredményt érjük el.

Bár a probléma jellege segíthet abban, hogy azonosítsuk a gépi tanulási algoritmus kategóriáját, amelyből választhatunk, ez még nem teljes munka. Az olyan kategóriákon belül, mint a besorolás, amint azt korábban láttuk, gyakran sokféle algoritmus és variáció közül lehet választani.

Gyakran a legjobb megoldás a gyors prototípus-készítés sokkal kisebb adathalmazon. A Spark MLlib-hez hasonló könyvtár sokkal könnyebbé teszi a gyors prototípus-készítést.

5.2. Modell hiperparaméter hangolás

Egy tipikus modell jellemzőkből, paraméterekből és hiperparaméterekből áll. A jellemzők azok, amelyeket bemeneti adatokként táplálunk be a modellbe. A modellparaméterek olyan változók, amelyeket a modell megtanul a képzési folyamat során. A modelltől függően vannak további paraméterek, amelyeket a tapasztalatok alapján kell beállítanunk, és iteratívan ki kell igazítanunk. Ezeket modell hiperparamétereknek nevezzük.

Például a tanulási arány tipikus hiperparaméter a gradiens-ereszkedésen alapuló algoritmusokban. A tanulási sebesség szabályozza, hogy a paraméterek milyen gyorsan állíthatók be az edzésciklusok alatt. Ezt megfelelően kell beállítani ahhoz, hogy a modell ésszerű ütemben hatékonyan tanulhasson.

Bár a tapasztalatok alapján kiindulhatunk egy ilyen hiperparaméter kezdeti értékével, el kell végeznünk a modell validálását, és kézzel kell őket iteratívan beállítani.

5.3. Modell teljesítmény

Statisztikai modell, noha képzett, az hajlamos a túlterhelésre és az illesztésre, mindkettő gyenge modellteljesítményt okoz. Az alulteljesítés arra az esetre vonatkozik, amikor a modell nem választja ki kellő mértékben az adatok általános adatait. Másrészt a túlillesztés akkor történik, amikor a modell elkezdi felvenni a zajokat az adatokból is.

Az alul- és túlillesztés problémáinak elkerülésére számos módszer létezik, amelyeket gyakran kombinálva alkalmaznak. Például, a túlillesztés leküzdésére a leggyakrabban alkalmazott technikák közé tartozik a keresztellenőrzés és a szabályozás. Hasonlóképpen, az alulteljesítés javítása érdekében növelhetjük a modell komplexitását és növelhetjük a képzési időt.

A Spark MLlib fantasztikus támogatást nyújt a legtöbb ilyen technikához, például a szabályozáshoz és a keresztellenőrzéshez. Valójában az algoritmusok többsége alapértelmezetten támogatja őket.

6. Spark MLlib összehasonlításban

Míg a Spark MLlib meglehetősen hatékony könyvtár a gépi tanulási projektek számára, biztosan nem ez az egyetlen a munkához. Elég sok könyvtár áll rendelkezésre különböző programozási nyelveken, változó támogatással. Itt átnézünk néhány népszerűt.

6.1. Tensorflow / Keras

A Tensorflow egy nyílt forráskódú könyvtár az adatfolyamhoz és a differenciálható programozáshoz, széles körben használják a gépi tanulási alkalmazásokhoz. Magas szintű absztrakciójával, a Keras-szal együtt a gépi tanulás egyik választott eszköze. Elsősorban Pythonban és C ++ nyelven vannak írva, és elsősorban Pythonban használják. A Spark MLlib-től eltérően nem rendelkezik poliglot jelenléttel.

6.2. Theano

A Theano egy másik Python-alapú nyílt forráskódú könyvtár a matematikai kifejezések manipulálására és értékelésére - például mátrixalapú kifejezések, amelyeket gyakran használnak a gépi tanulási algoritmusokban. A Spark MLlib-től eltérően a Theanót ismét elsősorban a Pythonban használják. A Keras azonban egy Theano háttal együtt használható.

6.3. CNTK

A Microsoft Cognitive Toolkit (CNTK) a C ++ nyelven írt mély tanulási keretrendszer, amely irányított grafikonon keresztül írja le a számítási lépéseket. Használható mind a Python, mind a C ++ programokban, és elsősorban neurális hálózatok fejlesztésében alkalmazzák. Használható a CNTK-n alapuló Keras háttér, amely az ismerős, intuitív absztrakciót biztosítja.

7. Következtetés

Összegezve: ebben az oktatóanyagban végigvizsgáltuk a gépi tanulás alapjait, beleértve a különböző kategóriákat és a munkafolyamatokat. Végigvizsgáltuk a Spark MLlib, mint a rendelkezésünkre álló gépi tanulási könyvtár alapjait.

Továbbá kifejlesztettünk egy egyszerű gépi tanulási alkalmazást a rendelkezésre álló adatkészlet alapján. Példánkban a gépi tanulás munkafolyamatának néhány leggyakoribb lépését hajtottuk végre.

Végigvittük néhány tipikus gépi tanulási projekt haladó lépéseit és azt, hogy a Spark MLlib hogyan tud ezekben segíteni. Végül láttunk néhány alternatív gépi tanulási könyvtárat, amelyek a rendelkezésünkre állnak.

Mint mindig, a kód megtalálható a GitHubon.