SVM és kernel SVM megvalósítása a Python Scikit-Learn segítségével

SVM és kernel SVM megvalósítása a Python Scikit-Learn segítségével

Bevezetés

Ez az útmutató a támogatási vektorgépekkel (SVM) kapcsolatos három útmutató első része. Ebben a sorozatban egy hamisított bankjegy használati esetet dolgozunk fel, megismerjük az egyszerű SVM-et, majd az SVM hiperparamétereket, és végül megismerjük az úgynevezett kernel trükk és fedezze fel más típusú SVM-eket.

Ha el szeretné olvasni az összes útmutatót, vagy meg szeretné tekinteni, melyik érdekli a leginkább, az alábbiakban az egyes útmutatókban tárgyalt témák táblázata található:

1. Az SVM és a kernel SVM megvalósítása a Python Scikit-Learn segítségével

  • Használati eset: felejtse el a bankjegyeket
  • Az SVM-ek háttere
  • Egyszerű (lineáris) SVM modell
    • Az adatkészletről
    • Az adatkészlet importálása
    • Az adatkészlet feltárása
  • Az SVM megvalósítása a Scikit-Learn segítségével
    • Adatok felosztása vonat/tesztkészletekre
    • A modell képzése
    • Jóslatok készítése
    • A modell értékelése
    • Eredmények értelmezése

2. Az SVM hiperparaméterek megértése (hamarosan!)

  • A C hiperparaméter
  • Gamma hiperparaméter

3. Más SVM-változatok megvalósítása a Python Scikit-Learn segítségével (hamarosan!)

  • Az SVM-ek általános ötlete (összefoglaló)
  • Kernel (trükk) SVM
  • Nemlineáris kernel SVM megvalósítása a Scikit-Learn segítségével
  • Könyvtárak importálása
    • Az adatkészlet importálása
    • Az adatok felosztása jellemzőkre (X) és célpontokra (y)
    • Adatok felosztása vonat/tesztkészletekre
    • Az algoritmus betanítása
  • Polinom kernel
    • Jóslatok készítése
    • Az algoritmus kiértékelése
  • Gauss kernel
    • Előrejelzés és értékelés
  • Szigmoid kernel
    • Előrejelzés és értékelés
  • A nemlineáris kernelteljesítmények összehasonlítása

Használati eset: hamisított bankjegyek

Néha az emberek megtalálják a módját a bankjegyek hamisításának. Ha valaki megnézi ezeket a feljegyzéseket, és ellenőrzi azok érvényességét, nehéz lehet megtéveszteni őket.

De mi történik akkor, ha nincs ember, aki megnézze az egyes hangjegyeket? Van mód annak automatikus megállapítására, hogy a bankjegyek hamisak vagy valódiak?

Sokféleképpen lehet válaszolni ezekre a kérdésekre. Az egyik válasz az, hogy minden kapott jegyzetet lefényképeznek, összehasonlítják a képét egy hamisított jegyzet képével, majd minősítik valódinak vagy hamisítottnak. Ha egyszer unalmas vagy kritikus lehet a jegyzet érvényesítéséig várni, akkor is érdekes lenne gyorsan elvégezni az összehasonlítást.

Mivel a képek használatban vannak, tömöríthetők, szürkeárnyalatossá redukálhatók, és méréseik kivonhatók vagy kvantálhatók. Ily módon az összehasonlítás a képek mérései között történik, az egyes képek pixelei helyett.

Eddig megtaláltuk a módját a bankjegyek feldolgozásának és összehasonlításának, de hogyan sorolják majd be őket valódira vagy hamisításra? A gépi tanulást használhatjuk az osztályozáshoz. Van egy osztályozási algoritmus, az úgynevezett Támogatja a vektoros gépetfőként a rövidített alakjáról ismert: Svm.

Az SVM-ek háttere

Az SVM-eket eredetileg 1968-ban vezette be Vladmir Vapnik és Alexey Chervonenkis. Akkoriban az algoritmusuk az adatok osztályozására korlátozódott, amelyeket egyetlen egyenes vonallal el lehetett választani, vagy amelyek lineárisan elválasztható. Láthatjuk, hogyan fog kinézni az elválasztás:

SVM és kernel SVM megvalósítása a Python Scikit-Learn PlatoBlockchain adatintelligenciájával. Függőleges keresés. Ai.

A fenti képen van egy vonal a közepén, amelyhez egyes pontok balra, mások pedig jobbra találhatók. Figyeljük meg, hogy mindkét pontcsoport tökéletesen el van választva, nincsenek pontok az egyenes között, vagy akár annak közelében sem. Úgy tűnik, hogy a hasonló pontok és az őket elválasztó egyenes között margó van, ezt a margót hívják elválasztó margó. Az elválasztó margó feladata, hogy a hasonló pontok és az őket elválasztó vonal közötti teret nagyobbá tegye. Az SVM ezt néhány pont felhasználásával teszi, és kiszámítja a merőleges vektorait, hogy alátámassza a vonal margójára vonatkozó döntést. Ezek azok támogatási vektorok amelyek az algoritmus nevének részét képezik. Később többet megtudunk róluk. Az egyenes vonalat pedig, amit a közepén látunk, olyan módszerekkel találjuk meg, amelyek maximális az a térköz az egyenes és a pontok között, vagy amelyek maximalizálják az elválasztási határt. Ezek a módszerek a területről származnak Optimalizációs elmélet.

Az imént látott példában mindkét pontcsoport könnyen elválasztható, mivel minden egyes pont közel van egymáshoz hasonló pontjaihoz, és a két csoport távol van egymástól.

De mi történik, ha nincs mód az adatok egyetlen egyenes vonallal történő elkülönítésére? Ha vannak rendetlen, nem helyén pontok, vagy ha görbére van szükség?

A probléma megoldása érdekében az SVM-et később finomították az 1990-es években, hogy képes legyen osztályozni azokat az adatokat is, amelyeknek olyan pontjai vannak, amelyek távol állnak a központi tendenciától, például kiugró értékek, vagy összetettebb problémák, amelyek kettőnél több dimenzióval rendelkeznek, és nem voltak lineárisan elválaszthatók. .

Érdekesség, hogy az SVM-ek csak az utóbbi években váltak széles körben elterjedtté, főként annak köszönhetően, hogy néha több mint 90%-ban a helyes válaszokat, ill. pontosság, nehéz problémákra.

Az SVM-ek más gépi tanulási algoritmusokhoz képest egyedülálló módon valósulnak meg, miután statisztikai magyarázatokon alapulnak, hogy mi a tanulás, vagy Statisztikai tanulási elmélet.

Ebben a cikkben meglátjuk, mik a Support Vector Machines algoritmusai, a támogatási vektorgépek mögött meghúzódó rövid elméletet és azok megvalósítását a Python Scikit-Learn könyvtárában. Ezután áttérünk egy másik SVM-koncepcióra, az úgynevezett Kernel SVMvagy Kernel trükk, és a Scikit-Learn segítségével meg is valósítja.

Egyszerű (lineáris) SVM modell

Az adatkészletről

A bevezetőben megadott példát követve egy olyan adatkészletet fogunk használni, amely valódi és hamisított bankjegyképek mérését tartalmazza.

Amikor két hangjegyet nézünk, szemünk általában balról jobbra pásztázza őket, és megvizsgálja, hol lehetnek hasonlóságok vagy eltérések. Keressünk egy fekete pontot a zöld pont előtt, vagy egy fényes jelet, amely az illusztráció felett van. Ez azt jelenti, hogy van egy sorrend, amelyben a jegyzeteket nézzük. Ha tudnánk, hogy vannak zöldek és fekete pontok, de nem, ha a zöld pont a fekete előtt jön, vagy ha a fekete a zöld előtt, akkor nehezebb lenne megkülönböztetni a hangjegyeket.

Létezik az imént leírtakhoz hasonló módszer, amely a bankjegyképekre is alkalmazható. Általánosságban ez a módszer abból áll, hogy a kép képpontjait jellé alakítják, majd figyelembe veszik, hogy az egyes jelek milyen sorrendben fordulnak elő a képen, kis hullámokká alakítva, ill. hullámok. A waveletek megszerzése után mód van arra, hogy megtudjuk, hogy egy jel milyen sorrendben történik a másik előtt, vagy a idő, de nem pontosan milyen jelet. Ennek megismeréséhez meg kell szerezni a kép frekvenciáit. Ezeket egy olyan módszerrel kapják, amely az egyes jelek bontását végzi, ún Fourier módszer.

Miután megkaptuk az idődimenziót a waveletekkel, a frekvencia dimenziót pedig a Fourier-módszerrel, az idő és a frekvencia egymásra épülése megtörténik, hogy lássuk, mikor egyezik a kettő, ez a tekeredés elemzés. A konvolúció olyan illeszkedést kap, amely a hullámokat a kép frekvenciáihoz illeszti, és megállapítja, hogy mely frekvenciák a szembetűnőbbek.

Ezt a módszert, amely magában foglalja a hullámok, azok frekvenciájának megtalálását, majd mindkettő illesztését, az úgynevezett Wavelet transzformáció. A wavelet transzformációnak vannak együtthatói, és ezeket az együtthatókat használtuk az adathalmazban található mérések előállításához.

Az adatkészlet importálása

A bankjegyek adatkészlete, amelyet ebben a részben használni fogunk, ugyanaz, mint a döntési fa oktatóanyag.

Jegyzet: Letöltheti az adatkészletet itt.

Importáljuk az adatokat egy pandába dataframe szerkezetét, és nézze meg annak első öt sorát a head() módszer.

Figyelje meg, hogy az adatok a txt (szöveg) fájlformátum, vesszővel elválasztva, és fejléc nélkül van. Táblázatként rekonstruálhatjuk úgy, hogy a csv, megadva a separator vesszőként, és az oszlopneveket a names érv.

Kövesse ezt a három lépést egyszerre, majd nézze meg az adatok első öt sorát:

import pandas as pd data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()

Ennek eredményeként:

	variance skewness curtosis entropy class
0 3.62160 8.6661 -2.8073 -0.44699 0
1 4.54590 8.1674 -2.4586 -1.46210 0
2 3.86600 -2.6383 1.9242 0.10645 0
3 3.45660 9.5228 -4.0112 -3.59440 0
4 0.32924 -4.4552 4.5718 -0.98880 0

Jegyzet: Az adatokat helyben is mentheti és helyettesítheti data_link mert data_path, és adja meg a helyi fájl elérési útját.

Láthatjuk, hogy az adatkészletünkben öt oszlop van, nevezetesen variance, skewness, curtosis, entropyés class. Az öt sorban az első négy oszlop olyan számokkal van kitöltve, mint például 3.62160, 8.6661, -2.8073 vagy folyamatos értékeket, és az utolsót class oszlop első öt sora 0-val vagy a-val van kitöltve diszkrét értéket.

Mivel célunk az, hogy megjósoljuk, hogy egy bankjegy hiteles-e vagy sem, ezt a bankjegy négy attribútuma alapján tehetjük meg:

  • variance of Wavelet Átalakított kép. Általában a variancia egy folytonos érték, amely azt méri, hogy az adatpontok mennyire vannak közel vagy távol az adatok átlagos értékéhez. Ha a pontok közelebb vannak az adat átlagértékéhez, akkor az eloszlás közelebb áll a normál eloszláshoz, ami általában azt jelenti, hogy értékei jobban eloszlanak, és valamivel könnyebben megjósolhatók. A jelenlegi képkörnyezetben ez a wavelet transzformációból származó együtthatók szórása. Minél kisebb a szórás, annál közelebb álltak az együtthatók a tényleges kép fordításához.

  • skewness of Wavelet Átalakított kép. A ferdeség egy folytonos érték, amely egy eloszlás aszimmetriáját jelzi. Ha több érték van az átlagtól balra, akkor az eloszlás a következő negatívan ferde, ha az átlagtól jobbra több érték van, az eloszlás az pozitívan ferde, és ha az átlag, a módusz és a medián megegyezik, akkor az eloszlás az szimmetrikus. Minél szimmetrikusabb egy eloszlás, annál közelebb van a normál eloszláshoz, és értékei is jobban eloszlanak. Jelen kontextusban ez a wavelet transzformációból származó együtthatók ferdesége. Minél szimmetrikusabb, annál közelebb vannak az együtthatókvariance, skewness, curtosis, entropyújra lefordítani a tényleges képet.

SVM és kernel SVM megvalósítása a Python Scikit-Learn PlatoBlockchain adatintelligenciájával. Függőleges keresés. Ai.

  • curtosis (vagy kurtosis) of Wavelet Transformed image. A kurtosis egy folytonos érték, amely a ferdeséghez hasonlóan egy eloszlás alakját is leírja. A kurtózis együttható (k) függvényében egy eloszlás – a normál eloszláshoz képest többé-kevésbé lapos is lehet – vagy több-kevesebb adattal rendelkezik a végpontjaiban vagy a farkában. Amikor az eloszlás szétterültebb és laposabb, akkor ún platykurtic; amikor kevésbé terült el és jobban koncentrálódik a közepén, mezokurtikus; és amikor az eloszlás szinte teljesen középre összpontosul, akkor ún leptokurtic. Ez ugyanaz, mint a variancia és ferdeség korábbi esetei, minél mezokurtikusabb az eloszlás, annál közelebb álltak az együtthatók a tényleges kép fordításához.

SVM és kernel SVM megvalósítása a Python Scikit-Learn PlatoBlockchain adatintelligenciájával. Függőleges keresés. Ai.

  • entropy kép. Az entrópia is folytonos érték, általában a rendszer véletlenszerűségét vagy rendezetlenségét méri. Egy kép kontextusában az entrópia a pixel és a szomszédos pixelek közötti különbséget méri. A mi kontextusunk szerint minél nagyobb az együtthatók entrópiája, annál nagyobb veszteség volt a kép átalakítása során – és minél kisebb az entrópia, annál kisebb az információveszteség.

SVM és kernel SVM megvalósítása a Python Scikit-Learn PlatoBlockchain adatintelligenciájával. Függőleges keresés. Ai.

Az ötödik változó a class változó, amely valószínűleg 0 és 1 értékkel rendelkezik, amelyek azt jelzik, hogy a hang valódi vagy hamisított volt-e.

Pandáival ellenőrizhetjük, hogy az ötödik oszlop nullákat és egyeseket tartalmaz-e unique() eljárás:

bankdata['class'].unique()

A fenti metódus a következőket adja vissza:

array([0, 1]) 

A fenti metódus egy 0 és 1 értékű tömböt ad vissza. Ez azt jelenti, hogy az osztálysorainkban csak nullák és egyesek találhatók. Használatra készen áll cél felügyelt tanulásunkban.

  • class kép. Ez egy egész szám, 0, ha a kép hamis, és 1, ha a kép valódi.

Mivel van egy oszlopunk a valós és felejtett képek annotációival, ez azt jelenti, hogy a tanulási típusunk az felügyelt.

Útmutatás: Ha többet szeretne megtudni a bankjegyképek Wavelet-transzformációja mögött meghúzódó érvelésről és az SVM használatáról, olvassa el a szerzők publikációját.

Azt is láthatjuk, hogy hány rekordunk vagy képünk van, ha megnézzük az adatok sorainak számát a shape ingatlan:

bankdata.shape

Ez a következő kimenetet adja:

(1372, 5)

A fenti sor azt jelenti, hogy 1,372 sornyi átalakított bankjegykép és 5 oszlop van. Ezeket az adatokat elemezzük.

Importáltuk az adatkészletünket, és elvégeztünk néhány ellenőrzést. Most megvizsgálhatjuk adatainkat, hogy jobban megértsük azokat.

Az adatkészlet feltárása

Most láttuk, hogy az osztályoszlopban csak nullák és egyesek vannak, de azt is tudhatjuk, hogy ezek milyen arányban vannak – vagyis ha több a nulla, mint az egyes, több az egyes, mint a nulla, vagy ha a a nullák azonosak az egyesek számával, vagyis azok kiegyensúlyozott.

Az arány ismeretéhez megszámolhatjuk az adatok nulla és egy értékét value_counts() eljárás:

bankdata['class'].value_counts()

Ez a következő kimenetet adja:

0 762
1 610
Name: class, dtype: int64

A fenti eredményben azt láthatjuk, hogy 762 nulla és 610 egyes van, vagyis 152-vel több nulla, mint egyes. Ez azt jelenti, hogy egy kicsit több hamisított képünk van, mint a valódi, és ha ez az eltérés nagyobb lenne, például 5500 nulla és 610 egyes, az negatívan befolyásolhatja az eredményeinket. Ha ezeket a példákat próbáljuk felhasználni a modellünkben – minél több példa van, az általában azt jelenti, hogy minél több információval kell a modellnek döntenie a hamis vagy valódi hangjegyek között –, ha kevés a valódi hangjegypélda, a modell hajlamos tévednek, amikor megpróbálják felismerni őket.

Azt már tudjuk, hogy van még 152 hamisított hangjegy, de biztosak lehetünk benne, hogy ezek elég példák ahhoz, hogy a modell megtanulja? Azt, hogy hány példa kell a tanuláshoz, nagyon nehéz megválaszolni, ehelyett megpróbálhatjuk százalékosan megérteni, mekkora ez a különbség az osztályok között.

Az első lépés a pandák használata value_counts() módszert, de most lássuk a százalékos arányt az argumentum hozzáadásával normalize=True:

bankdata['class'].value_counts(normalize=True)

A normalize=True osztályonként kiszámítja az adatok százalékos arányát. Eddig a hamisított (0) és a valós adatok (1) százalékos aránya:

0 0.555394
1 0.444606
Name: class, dtype: float64

Ez azt jelenti, hogy az adatkészletünk körülbelül (~) 56%-a hamis, és 44%-a valós. Így 56%-44%-os arányt kapunk, ami megegyezik a 12%-os eltéréssel. Ez statisztikailag csekély eltérésnek számít, mert alig haladja meg a 10%-ot, így az adatok kiegyensúlyozottnak tekinthetők. Ha az 56:44-es arány helyett 80:20 vagy 70:30 arány lenne, akkor adataink kiegyensúlyozatlannak minősülnének, és kiegyensúlyozatlansági kezelést kellene végeznünk, de szerencsére ez nem így van.

Ezt a különbséget vizuálisan is láthatjuk, ha megnézzük az osztály vagy a célpont eloszlását egy Pandákkal átitatott hisztogrammal, a következő használatával:

bankdata['class'].plot.hist();

Ez egy hisztogramot ábrázol közvetlenül az adatkeret szerkezetének felhasználásával, kombinálva a matplotlib könyvtár, amely a színfalak mögött van.

SVM és kernel SVM megvalósítása a Python Scikit-Learn PlatoBlockchain adatintelligenciájával. Függőleges keresés. Ai.

A hisztogramot megnézve biztosak lehetünk abban, hogy célértékeink 0 vagy 1, és az adatok kiegyensúlyozottak.

Ez annak az oszlopnak az elemzése volt, amelyet megpróbáltunk megjósolni, de mi van az adataink többi oszlopának elemzésével?

A statisztikai méréseket a describe() dataframe módszer. Használhatjuk is .T transzponálás – az oszlopok és sorok megfordítása, így közvetlenebbé válik az értékek összehasonlítása:

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!

bankdata.describe().T

Ennek eredményeként:

 count mean std min 25% 50% 75% max
variance 1372.0 0.433735 2.842763 -7.0421 -1.773000 0.49618 2.821475 6.8248
skewness 1372.0 1.922353 5.869047 -13.7731 -1.708200 2.31965 6.814625 12.9516
curtosis 1372.0 1.397627 4.310030 -5.2861 -1.574975 0.61663 3.179250 17.9274
entropy 1372.0 -1.191657 2.101013 -8.5482 -2.413450 -0.58665 0.394810 2.4495
class 1372.0 0.444606 0.497103 0.0000 0.000000 0.00000 1.000000 1.0000

Figyeljük meg, hogy a ferdeség és curtosis oszlopok átlagértékei messze vannak a szórási értékektől, ez azt jelzi, hogy azok az értékek, amelyek távolabb vannak az adatok központi tendenciájától, vagy nagyobb a variabilitása.

Vizuálisan is megtekinthetjük az egyes jellemzők eloszlását, ha az egyes jellemzők hisztogramját egy for cikluson belül ábrázoljuk. Az eloszláson kívül érdekes lenne megnézni, hogyan különülnek el az egyes osztályok pontjai az egyes jellemzők tekintetében. Ehhez ábrázolhatunk egy szóródási diagramot, amelyek között a jellemzők kombinációját alkotjuk, és minden ponthoz különböző színeket rendelhetünk osztályuk szerint.

Kezdjük az egyes jellemzők eloszlásával, és ábrázoljuk minden adatoszlop hisztogramját, kivéve a class oszlop. A class oszlopot nem veszi figyelembe a bankadat oszlopok tömbben elfoglalt pozíciója. Minden oszlop ki lesz jelölve, kivéve az utolsót columns[:-1]:

import matplotlib.pyplot as plt for col in bankdata.columns[:-1]: plt.title(col) bankdata[col].plot.hist() plt.show();

A fenti kód futtatása után láthatjuk, hogy mindkettő skewness és a entropy az adateloszlások negatívan torzulnak és curtosis pozitívan ferde. Minden eloszlás szimmetrikus, és variance az egyetlen eloszlás, amely közel áll a normálhoz.

Most továbbléphetünk a második részre, és megrajzolhatjuk az egyes változók szórásdiagramját. Ehhez az osztály kivételével minden oszlopot kijelölhetünk, -val columns[:-1], használja a Seabornt scatterplot() és kettő for loop, hogy megkapjuk az egyes jellemzők párosítási variációit. Kizárhatjuk egy jellemző párosítását önmagával is, ha megvizsgáljuk, hogy az első jellemző megegyezik-e a másodikkal if statement.

import seaborn as sns for feature_1 in bankdata.columns[:-1]: for feature_2 in bankdata.columns[:-1]: if feature_1 != feature_2: print(feature_1, feature_2) sns.scatterplot(x=feature_1, y=feature_2, data=bankdata, hue='class') plt.show();

Figyeljük meg, hogy minden gráfnak van valós és hamisított adatpontja is, amelyek nincsenek egyértelműen elválasztva egymástól, ez azt jelenti, hogy az osztályok valamilyen szuperpozíciója létezik. Mivel az SVM-modell egy vonalat használ az osztályok közötti elválasztásra, el lehet-e választani a gráfok bármelyik csoportját egyetlen vonal használatával? Valószínűtlen. Így néz ki a legtöbb valós adat. Az elválasztáshoz a legközelebb a kombinációban juthatunk skewness és a variancevagy entropy és a variance telkek. Ez valószínűleg annak köszönhető variance olyan adatok, amelyek eloszlási alakja közelebb áll a normálhoz.

De ezeket a grafikonokat egymás után nézni kicsit nehéz lehet. Alternatívaként megtekinthetjük az összes eloszlási és szórványgrafikont a Seaborn-féle használatával pairplot().

Mindkét előző for ciklust csak ezzel a sorral helyettesíthetjük:

sns.pairplot(bankdata, hue='class');

A párrajzot nézve úgy tűnik, hogy valójában curtosis és a variance a funkciók legegyszerűbb kombinációja lenne, így a különböző osztályokat vonallal, ill lineárisan elválasztható.

Ha a legtöbb adat távolról sem lineárisan elválasztható, akkor megpróbálhatjuk előfeldolgozni, méreteinek csökkentésével, illetve normalizálni az értékeket, hogy az eloszlást a normálishoz közelítsük.

Ebben az esetben használjuk fel az adatokat úgy, ahogy vannak, további előfeldolgozás nélkül, majd később egy lépéssel visszaléphetünk, kiegészítve az adat-előfeldolgozással, és összehasonlíthatjuk az eredményeket.

Útmutatás: Az adatokkal való munka során az adatok átalakítása során általában elvesznek az információk, mert nem több adatot gyűjtünk, hanem közelítéseket készítünk. A kezdeti adatokkal való munka, ha lehetséges, kiindulópontot kínál más előfeldolgozási technikák kipróbálása előtt. Ha ezt az utat követi, a nyers adatokat használó kezdeti eredmény összehasonlítható egy másik eredménnyel, amely előfeldolgozási technikákat használ az adatokon.

Jegyzet: Általában a Statisztikában a modellek felépítésekor az adatfajtától (diszkrét, folytonos, kategoriális, numerikus), eloszlásától és a modell feltevéseitől függő eljárást követnek. Míg a számítástechnikában (CS) több hely áll rendelkezésre a próbálkozásokra, a hibákra és az új iterációkra. A CS-ben gyakori, hogy van egy alapvonal, amellyel összehasonlítható. A Scikit-learnben létezik álmodellek (vagy álbecslő) megvalósítása, amelyek közül néhány nem jobb, mint egy érme feldobása, és csak válaszol Igen (vagy 1) az esetek 50%-ában. Érdekes, hogy az eredmények összehasonlításakor álmodelleket használunk a tényleges modell alapjaként. Várhatóan a tényleges modelleredmények jobbak, mint a véletlenszerű találgatások, különben nem lenne szükség gépi tanulási modellre.

Az SVM megvalósítása a Scikit-Learn segítségével

Mielőtt jobban belemerülnénk az SVM működésének elméletébe, megépíthetjük az első alapmodellünket az adatokból és a Scikit-Learn modelljéből. Támogatja a vektoros osztályozót or SVC osztály.

Modellünk megkapja a wavelet együtthatókat, és megpróbálja osztályozni őket az osztály alapján. Ennek a folyamatnak az első lépése az együtthatók szétválasztása ill jellemzők osztályból ill cél. Ezt követően a második lépés az adatok további felosztása egy halmazra, amelyet a modell tanulására, ill. vonat készlet és egy másik, amelyet a modell értékeléséhez használnak majd, ill tesztkészlet.

Jegyzet: A teszt és kiértékelés nómenklatúrája kissé zavaró lehet, mert az adatait feloszthatja a vonatozás, az értékelés és a tesztkészletek között is. Ily módon a két készlet helyett egy közvetítő készletet kaphat, amelyet csak használhat, és megnézheti, hogy a modell teljesítménye javul-e. Ez azt jelenti, hogy a modellt betanítják a vonatkészlettel, javítják az értékelőkészlettel, és megkapják a végső mérőszámot a tesztkészlettel.

Vannak, akik azt mondják, hogy az értékelés a közvetítő halmaz, mások azt mondják, hogy a tesztkészlet a közvetítő halmaz, és az értékelési halmaz a végső halmaz. Ez egy másik módja annak garantálására, hogy a modell semmilyen módon nem látja ugyanazt a példát, vagy hogy valamilyen adatszivárgás nem történik meg, és van egy modelláltalánosítás az utolsó beállított metrikák javításával. Ha ezt a megközelítést szeretné követni, az itt leírtak szerint még egyszer tovább oszthatja az adatokat Scikit-Learn train_test_split() – Képzési, tesztelési és érvényesítési készletek útmutató.

Adatok felosztása vonat/tesztkészletekre

Az előző ülésen megértettük és feltártuk az adatokat. Most már két tömbre oszthatjuk adatainkat – az egyiket a négy, a másikat pedig az ötödik, vagyis céljellemzőhöz. Mivel a wavelet-együtthatók függvényében szeretnénk megjósolni az osztályt, a mi y lesz a class rovat és a mi X lesz a variance, skewness, curtosisés entropy oszlopok.

A cél és a jellemzők elkülönítéséhez csak a class oszlop a y, később kidobja az adatkeretből, hogy a fennmaradó oszlopokat hozzárendelje X val vel .drop() eljárás:

y = bankdata['class']
X = bankdata.drop('class', axis=1) 

Miután az adatokat attribútumokra és címkékre osztottuk, tovább oszthatjuk vonat- és tesztkészletekre. Ezt kézzel is meg lehet tenni, de a model_selection A Scikit-Learn könyvtára tartalmazza a train_test_split() módszer, amely lehetővé teszi az adatok véletlenszerű felosztását vonat- és teszthalmazokra.

Használatához importálhatjuk a könyvtárat, hívjuk a train_test_split() módszer, be X és a y adatokat, és határozza meg a test_size átadni érvként. Ebben az esetben a következőképpen határozzuk meg 0.20– ez azt jelenti, hogy az adatok 20%-a tesztelésre, a másik 80%-a pedig edzésre kerül felhasználásra.

Ez a módszer véletlenszerűen vesz mintákat az általunk meghatározott százalékos aránynak megfelelően, de tiszteletben tartja az Xy párokat, nehogy a mintavétel teljesen összekeverje a kapcsolatot.

Mivel a mintavételi folyamat eredendően véletlenszerű, a módszer futtatásakor mindig eltérő eredményeket kapunk. Ahhoz, hogy ugyanazokat vagy reprodukálható eredményeket kaphassunk, definiálhatunk egy SEED nevű állandót, amelynek értéke 42.

Ehhez a következő szkriptet hajthatja végre:

from sklearn.model_selection import train_test_split SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

Figyeljük meg, hogy a train_test_split() metódus már visszaadja a X_train, X_test, y_train, y_test ebben a sorrendben állítja be. Kinyomtathatjuk a vonatozáshoz és a teszthez elkülönített minták számát, ha megkapjuk az első (0) elemét shape tulajdon visszaadott sora:

xtrain_samples = X_train.shape[0]
xtest_samples = X_test.shape[0] print(f'There are {xtrain_samples} samples for training and {xtest_samples} samples for testing.')

Ez azt mutatja, hogy 1097 minta van képzésre és 275 tesztelésre.

A modell képzése

Az adatokat vonat- és teszthalmazokra osztottuk. Itt az ideje egy SVM modell létrehozásának és betanításának a vonatadatokon. Ehhez importálhatjuk a Scikit-Learn-t svm könyvtárral együtt a Támogatja a vektoros osztályozót osztály, ill SVC osztály.

Az osztály importálása után létrehozhatunk belőle egy példányt – mivel egy egyszerű SVM modellt hozunk létre, az adatainkat igyekszünk lineárisan szétválasztani, így vonalat húzhatunk az adataink felosztására –, ami ugyanaz, mint egy lineáris függvény – meghatározásával kernel='linear' érvként az osztályozó mellett:

from sklearn.svm import SVC
svc = SVC(kernel='linear')

Így az osztályozó megpróbál olyan lineáris függvényt találni, amely elválasztja adatainkat. A modell elkészítése után képezzük, ill megfelelő azt a vonatadatokkal, a fit() módszerrel és megadva a X_train jellemzők és y_train célokat érvként.

A modell betanításához a következő kódot hajthatjuk végre:

svc.fit(X_train, y_train)

Csak így van kiképezve a modell. Eddig megértettük az adatokat, felosztottuk, létrehoztunk egy egyszerű SVM-modellt, és a modellt a vonatadatokhoz illesztettük.

A következő lépés annak megértése, hogy ez az illeszkedés mennyire sikerült leírni adatainkat. Más szóval, megválaszolni, hogy a lineáris SVM megfelelő választás-e.

Jóslatok készítése

Egy módja annak, hogy megválaszoljuk, hogy a modellnek sikerült-e leírnia az adatokat, ha kiszámítjuk és megnézzük valamilyen osztályozást mutatók.

Tekintettel arra, hogy a tanulás felügyelt, előrejelzéseket készíthetünk X_test és hasonlítsa össze ezeket az előrejelzési eredményeket – amit nevezhetünk is y_pred – a ténylegesvel y_testvagy földi igazság.

Az adatok egy részének előrejelzéséhez a modellé predict() módszert lehet alkalmazni. Ez a módszer megkapja a teszt jellemzőit, X_test, argumentumként, és 0 vagy 1 jóslatot ad vissza mindegyikre X_testsoraiban.

Miután megjósolta a X_test adatokat, az eredményeket a y_pred változó. Tehát az egyszerű lineáris SVM-modellel megjósolt osztályok mindegyike most a y_pred változót.

Ez az előrejelzési kód:

y_pred = svc.predict(X_test)

Tekintettel arra, hogy rendelkezünk előrejelzésekkel, most összehasonlíthatjuk azokat a tényleges eredményekkel.

A modell értékelése

Számos módja van az előrejelzések és a tényleges eredmények összehasonlításának, és az osztályozás különböző szempontjait mérik. Néhány leggyakrabban használt osztályozási mérőszám:

  1. Zavart mátrix: amikor tudnunk kell, mennyi mintát vettünk helyesen vagy rosszul minden osztály. A helyes és helyesen megjósolt értékeket hívjuk igazi pozitívumok, azokat, amelyeket pozitívnak jósoltak, de nem voltak pozitívak, nevezzük hamis pozitív. Ugyanaz a nómenklatúra igaz negatívumok és a hamis negatívok negatív értékekhez használják;

  2. Pontosság: amikor az a célunk, hogy megértsük, milyen helyes előrejelzési értékeket tartott helyesnek az osztályozónk. A pontosság elosztja a valódi pozitív értékeket a pozitívnak jósolt mintákkal;

$$
pontosság = töredék{szöveg{igaz pozitívumok}}{szöveg{igaz pozitívumok} + szöveg{hamis pozitívumok}}
$$

  1. visszahívás: általában pontossággal együtt számítják ki, hogy megértsük, hány valódi pozitívumot azonosított az osztályozónk. A visszahívást úgy számítják ki, hogy a valódi pozitívumot elosztják bármivel, amit pozitívnak kellett volna megjósolni.

$$
visszahívás = töredék{szöveg{igaz pozitívumok}}{szöveg{igaz pozitívumok} + szöveg{hamis negatívok}}
$$

  1. F1 pontszám: a kiegyensúlyozott ill harmonikus átlag pontosság és felidézés. A legalacsonyabb érték 0, a legmagasabb pedig 1. Amikor f1-score egyenlő 1-gyel, ez azt jelenti, hogy az összes osztályt helyesen jelezték előre – ezt nagyon nehéz valós adatokkal megszerezni (kivételek szinte mindig vannak).

$$
text{f1-score} = 2* frac{text{precision} * text{recall}}{text{precision} + text{recall}}
$$

Ismerkedtünk már a zavarmátrix, a precizitás, a visszahívás és az F1-es pontszám méréseivel. Kiszámításához importálhatjuk a Scikit-Learn-t metrics könyvtár. Ez a könyvtár tartalmazza a classification_report és a confusion_matrix metódusok esetén az osztályozási jelentés módszere a pontosságot, a visszahívást és az f1 pontszámot adja vissza. Mindkét classification_report és a confusion_matrix könnyen használható az összes fontos mérőszám értékeinek megkeresésére.

A metrikák kiszámításához importáljuk a metódusokat, meghívjuk őket és argumentumként adjuk át az előre jelzett osztályozásokat, y_test, és az osztályozási címkék, vagy y_true.

A zűrzavaros mátrix jobb megjelenítéséhez Seaborn-ban ábrázolhatjuk heatmap mennyiségi megjegyzésekkel együtt, és az osztályozási jelentéshez a legjobb kinyomtatni annak eredményét, így az eredményei formázva vannak. Ez a következő kód:

from sklearn.metrics import classification_report, confusion_matrix cm = confusion_matrix(y_test,y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Confusion matrix of linear SVM') print(classification_report(y_test,y_pred))

Ez a következőket jeleníti meg:

 precision recall f1-score support 0 0.99 0.99 0.99 148 1 0.98 0.98 0.98 127 accuracy 0.99 275 macro avg 0.99 0.99 0.99 275
weighted avg 0.99 0.99 0.99 275

SVM és kernel SVM megvalósítása a Python Scikit-Learn PlatoBlockchain adatintelligenciájával. Függőleges keresés. Ai.

Az osztályozási jelentésben tudjuk, hogy a hamisított bankjegyekre 0.99-es pontosság, 0.99-es visszahívási és 1-es f0.99-pontszám található, vagy a 0. osztály. Ezeket a méréseket 148 minta felhasználásával végeztük, amint az a támasztóoszlopon látható. Mindeközben az 1. osztályú, vagyis a valódi hangjegyeknél az eredmény egy egységgel alacsonyabb volt, 0.98 pontosság, 0.98 visszahívás, és ugyanaz az f1 pontszám. Ezúttal 127 képmérést használtunk az eredmények megszerzéséhez.

Ha megnézzük a zavaros mátrixot, azt is láthatjuk, hogy 148 0. osztályú mintából 146 volt helyesen besorolva, és 2 hamis pozitív volt, míg 127 1. osztályú mintánál 2 hamis negatív és 125 igaz pozitív volt.

Elolvashatjuk az osztályozási jelentést és a zavaros mátrixot, de mit jelentenek ezek?

Eredmények értelmezése

A jelentés megértéséhez nézzük meg az összes mérőszámot kombinálva.

Az 1. osztályba tartozó minták szinte mindegyike helyesen került besorolásra, a tényleges bankjegyek azonosításakor a modellünkhöz 2 hiba volt. Ez ugyanaz, mint a 0.98 vagy 98%-os visszahívás. Valami hasonló mondható el a 0-s osztályról is, mindössze 2 mintát soroltak be rosszul, míg 148 valódi negatív, ami 99%-os pontosságot jelent.

Ezen eredmények mellett az összes többi 0.99-et jelöl, ami majdnem 1, ami nagyon magas mutató. Legtöbbször, amikor ilyen magas mutató fordul elő valós adatokkal, ez azt jelezheti, hogy a modell túl van igazítva az adatokhoz, vagy túl felszerelt.

Túlillesztés esetén a modell jól működhet a már ismert adatok előrejelzésekor, de elveszíti az új adatokra való általánosítás képességét, ami fontos a valós világban.

A vonatadatokkal is egy gyorsteszt, amellyel kiderítheti, hogy történik-e túlillesztés. Ha a modell valamelyest memorizálta a vonatadatokat, a mutatók nagyon közel állnak az 1-hez vagy a 100%-hoz. Ne feledje, hogy a vonatadatok nagyobbak, mint a tesztadatok – ezért – próbálja meg arányosan nézni, több minta, nagyobb a hibalehetőség, hacsak nem történt túlillesztés.

A vonatadatokkal való előrejelzéshez megismételhetjük azt, amit a tesztadatokkal tettünk, de most a X_train:

y_pred_train = svc.predict(X_train) cm_train = confusion_matrix(y_train,y_pred_train)
sns.heatmap(cm_train, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with train data') print(classification_report(y_train,y_pred_train))

Ez a következő kimenetet adja:

 precision recall f1-score support 0 0.99 0.99 0.99 614 1 0.98 0.99 0.99 483 accuracy 0.99 1097 macro avg 0.99 0.99 0.99 1097
weighted avg 0.99 0.99 0.99 1097

SVM és kernel SVM megvalósítása a Python Scikit-Learn PlatoBlockchain adatintelligenciájával. Függőleges keresés. Ai.

Könnyen belátható, hogy túlillesztésről van szó, miután a vonat mutatói 99%-osak, ha négyszer több adat van. Mit lehet tenni ebben a forgatókönyvben?

A túlillesztés visszaállításához hozzáadhatunk további vonatmegfigyeléseket, alkalmazhatunk edzésmódszert az adatkészlet különböző részeivel, mint pl. keresztellenőrzés, valamint a már edzés előtt meglévő alapértelmezett paramétereket is módosítsuk a modellünk elkészítésekor, ill hiperparaméterek. A Scikit-learn legtöbbször alapértelmezettként állít be néhány paramétert, és ez csendben megtörténhet, ha nincs sok idő a dokumentáció elolvasására.

Megnézheti ennek az útmutatónak a második részét (hamarosan!).

Következtetés

Ebben a cikkben az egyszerű lineáris kernel SVM-et tanulmányoztuk. Megismertük az SVM-algoritmus mögött meghúzódó intuíciót, valódi adatkészletet használtunk, feltártuk az adatokat, és megnéztük, hogyan lehet ezeket az adatokat az SVM-mel együtt használni, ha implementáljuk a Python Scikit-Learn könyvtárával.

Ha folytatni szeretné a gyakorlást, próbálkozzon más valós adatkészletekkel, amelyek olyan helyeken érhetők el, mint pl Kaggle, ICU, Big Query nyilvános adatkészletek, egyetemek és kormányzati webhelyek.

Azt is javaslom, hogy vizsgálja meg az SVM modell mögötti tényleges matematikát. Bár nem feltétlenül lesz rá szükség az SVM algoritmus használatához, mégis nagyon hasznos tudni, hogy valójában mi történik a színfalak mögött, miközben az algoritmus döntési határokat keres.

Időbélyeg:

Még több Stackabus