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.