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

Más SVM-ízek 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ó harmadik és egyben utolsó része. Ebben az útmutatóban továbbra is a hamisított bankjegyhasználati esetekkel fogunk dolgozni, röviden összefoglaljuk az SVM-ek mögött rejlő általános gondolatot, megértjük, mi a kerneltrükk, és különböző típusú nemlineáris kerneleket implementálunk a Scikit-Learn segítségével.

Az SVM-útmutatók teljes sorozatában a más típusú SVM-ek megismerése mellett az egyszerű SVM-ről, az SVM előre definiált paramétereiről, a C és Gamma hiperparaméterekről, valamint arról, hogyan hangolhatók rácskereséssel és keresztellenőrzéssel.

Ha el szeretné olvasni a korábbi útmutatókat, akkor vessen egy pillantást az első két útmutatóra, vagy nézze meg, mely témák érdeklik leginkább. Az alábbiakban az egyes útmutatókban tárgyalt témák táblázata található:

  1. SVM és 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
  1. Az SVM hiperparaméterek megértése
  • 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

  • Az SVM-ek általános ötlete (összefoglaló)
  • Kernel (trükk) SVM
  • Nem-lineá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
    • 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

Emlékezzünk vissza, miről is szól az SVM, mielőtt néhány érdekes SVM kernelvariációt látnánk.

Az SVM-ek általános ötlete

Lineárisan elválasztható, kétdimenziós adatok esetén (ahogyan az 1. ábrán látható) a tipikus gépi tanulási algoritmusos megközelítés az lenne, ha megpróbálunk olyan határt találni, amely úgy osztja el az adatokat, hogy a téves osztályozási hiba minimális legyen. Ha alaposan megnézi az 1. ábrát, vegye észre, hogy több (végtelen) határvonal is helyesen osztja fel az adatpontokat. A két szaggatott vonal, valamint a folytonos vonal mind érvényes besorolása az adatoknak.

Több döntési határ

1. ábra: Több döntési határ

Amikor az SVM a döntési határ, olyan határvonalat választ, amely maximalizálja a távolságot önmaga és az osztályok legközelebbi adatpontjai között. Azt már tudjuk, hogy a legközelebbi adatpontok a támaszvektorok, és a távolság mindkettővel paraméterezhető C és a gamma hiperparaméterek.

A döntési határ kiszámításakor az algoritmus kiválasztja, hogy hány pontot vegyen figyelembe, és meddig mehet el a margó – ez egy margómaximalizálási problémát konfigurál. A margómaximalizálási probléma megoldása során az SVM a támogatási vektorokat használja (ahogyan a 2. ábrán látható), és megpróbálja kitalálni, hogy melyek azok az optimális értékek, amelyek nagyobb margótávolságot tartanak fenn, miközben több pontot helyesen osztályoz a felhasznált függvény szerint. különítse el az adatokat.

Döntési határ támogatási vektorokkal

2. ábra: Döntési határ támogatási vektorokkal

Ez az oka annak, hogy az SVM különbözik a többi osztályozási algoritmustól, miután nem csupán döntési határt talál, hanem végül megtalálja az optimális döntési határt.

A támaszvektorok megtalálása, a döntési határ és a támogatási vektorok közötti mozgástér kiszámítása, valamint a határ maximalizálása mögött a statisztikákból és számítási módszerekből származó összetett matematika áll. Ezúttal nem megyünk bele a matematika játékának részleteibe.

Mindig fontos, hogy mélyebbre merüljünk, és megbizonyosodjunk arról, hogy a gépi tanulási algoritmusok nem valamiféle titokzatos varázslat, bár az, hogy jelenleg nem ismerünk minden matematikai részletet, nem akadályozta és nem is fogja megakadályozni az algoritmus végrehajtásában és az eredmények elérésében.

Útmutatás: Most, hogy összefoglaltuk az algoritmikus folyamatot, egyértelmű, hogy az adatpontok közötti távolság befolyásolja az SVM által választott döntési határt, ezért az adatok méretezését általában szükséges SVM osztályozó használatakor. Próbáld meg használni Scikit-learn Standard Scaler módszere az adatok előkészítéséhez, majd futtassa újra a kódokat, hogy megnézze, van-e különbség az eredmények között.

Kernel (trükk) SVM

Az előző részben megemlékeztünk és rendszereztük az SVM általános gondolatát – megnéztük, hogyan lehet ennek segítségével megtalálni az optimális döntési határt a lineárisan elkülöníthető adatokhoz. A 3. ábrán látható, nem lineárisan elkülöníthető adatok esetében azonban már tudjuk, hogy döntési határként egyenes nem használható.

Nem lineárisan elválasztható adatok

3. ábra: Nemlineárisan elválasztható adatok

Inkább használhatjuk az SVM módosított változatát, amelyről az elején beszéltünk, Kernel SVM néven.

A kernel SVM alapvetően az alacsonyabb dimenziók nem lineárisan elválasztható adatait a megfelelő formájukra vetíti magasabb dimenziókban. Ez egy trükk, mert a nem lineárisan elválasztható adatok magasabb dimenziókban történő vetítésekor az adat alakja úgy változik, hogy elkülöníthetővé válik. Például, ha 3 dimenzióra gondolunk, az egyes osztályokból származó adatpontok egy másik dimenzióba kerülhetnek, ami elválaszthatóvá teszi őket. Az adatdimenziók növelésének egyik módja a hatványozás. Itt is összetett matematikáról van szó, de az SVM használatához nem kell emiatt aggódnia. Inkább a Python Scikit-Learn könyvtárát használhatjuk a nemlineáris kernelek megvalósítására és használatára, ugyanúgy, mint a lineárist.

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

Ebben a részben ugyanazt az adatkészletet fogjuk használni annak előrejelzésére, hogy egy bankjegy valódi vagy hamisított-e a már ismert négy jellemző szerint.

Látni fogja, hogy a többi lépés tipikus gépi tanulási lépés, és nagyon kevés magyarázatot igényel, amíg el nem érjük azt a részt, ahol a nemlineáris kernel SVM-einket betanítjuk.

Könyvtárak importálása

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split

Az adatkészlet importálása

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()mes)

Adatok felosztása jellemzőkre (X) és célpontokra (y)

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

Adatok felosztása vonat/tesztkészletekre

SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

Az algoritmus betanítása

A kernel SVM betanításához ugyanezt fogjuk használni SVC osztály a Scikit-Learn's svm könyvtár. A különbség a kernelparaméter értékében rejlik SVC osztály.

Az egyszerű SVM esetében a „linear”-t használtuk a kernelparaméter értékeként. Azonban, mint korábban említettük, a kernel SVM-hez használhatunk Gauss-, polinom-, szigmoid- vagy kiszámítható kernelt. Polinomiális, Gauss- és szigmoid kerneleket fogunk megvalósítani, és megvizsgáljuk a végső mérőszámait, hogy megtudjuk, melyik illik a magasabb mérőszámmal rendelkező osztályainkba.

1. Polinom kernel

Az algebrában a polinom a következő alak kifejezése:

$$
2a*b^3 + 4a – 9
$$

Ennek vannak változói, mint pl a és a b, konstansok, példánkban, 9 és együtthatók (változókkal kísért állandók), mint pl 2 és a 4 Az 3 a polinom fokának tekintjük.

Vannak olyan típusú adatok, amelyeket polinomiális függvény használatával lehet a legjobban leírni, itt a kernel az, hogy leképezi az adatainkat egy polinomra, aminek a fokát kiválasztjuk. Minél magasabb a fokozat, annál inkább próbál a függvény közelebb kerülni az adatokhoz, így a döntési határ rugalmasabb (és hajlamosabb a túlillesztésre) – minél alacsonyabb a fok, annál kevésbé rugalmas.

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!

Tehát a megvalósításhoz a polinom kernel, amellett, hogy kiválasztja a poly kernel, akkor is átadunk egy értéket a degree paramétere SVC osztály. Alul a kód:

from sklearn.svm import SVC
svc_poly = SVC(kernel='poly', degree=8)
svc_poly.fit(X_train, y_train)

Jóslatok készítése

Most, miután betanítottuk az algoritmust, a következő lépés a tesztadatok előrejelzése.

Ahogy korábban is tettük, a következő szkriptet hajthatjuk végre ehhez:

y_pred_poly = svclassifier.predict(X_test)

Az algoritmus kiértékelése

Szokás szerint az utolsó lépés a polinomiális kernel kiértékelése. Mivel néhányszor megismételtük az osztályozási jelentés és az összetévesztési mátrix kódját, alakítsuk át egy olyan funkcióvá, amely display_results miután megkapta a megfelelőket y_test, y_pred és címe a Seaborn-féle zavaros mátrixnak cm_title:

def display_results(y_test, y_pred, cm_title): cm = confusion_matrix(y_test,y_pred) sns.heatmap(cm, annot=True, fmt='d').set_title(cm_title) print(classification_report(y_test,y_pred))

Most meghívhatjuk a függvényt, és megnézhetjük a polinom kernellel kapott eredményeket:

cm_title_poly = "Confusion matrix with polynomial kernel"
display_results(y_test, y_pred_poly, cm_title_poly)

A kimenet így néz ki:

 precision recall f1-score support 0 0.69 1.00 0.81 148 1 1.00 0.46 0.63 127 accuracy 0.75 275 macro avg 0.84 0.73 0.72 275
weighted avg 0.83 0.75 0.73 275

Implementing Other SVM Flavors with Python's Scikit-Learn PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Most megismételhetjük ugyanazokat a lépéseket a Gauss- és szigmoid kerneleknél.

2. Gauss kernel

A gauss kernel használatához csak az 'rbf' értéket kell megadnunk a kernel az SVC osztály paramétere:

svc_gaussian = SVC(kernel='rbf', degree=8)
svc_gaussian.fit(X_train, y_train)

Ha tovább vizsgálja ezt a kernelt, használhatja a grid keresést is, hogy kombinálja a különböző C és a gamma értékeket.

Előrejelzés és értékelés

y_pred_gaussian = svc_gaussian.predict(X_test)
cm_title_gaussian = "Confusion matrix with Gaussian kernel"
display_results(y_test, y_pred_gaussian, cm_title_gaussian)

A Gauss-kernel SVM kimenete így néz ki:

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

Implementing Other SVM Flavors with Python's Scikit-Learn PlatoBlockchain Data Intelligence. Vertical Search. Ai.

3. Szigmoid kernel

Végül használjunk szigmoid kernelt a kernel SVM megvalósításához. Vessen egy pillantást a következő szkriptre:

svc_sigmoid = SVC(kernel='sigmoid')
svc_sigmoid.fit(X_train, y_train)

A sigmoid kernel használatához meg kell adnia a 'sigmoid' értéket a kernel paramétere SVC osztály.

Előrejelzés és értékelés

y_pred_sigmoid = svc_sigmoid.predict(X_test)
cm_title_sigmoid = "Confusion matrix with Sigmoid kernel"
display_results(y_test, y_pred_sigmoid, cm_title_sigmoid)

A Sigmoid kernellel rendelkező Kernel SVM kimenete így néz ki:

 precision recall f1-score support 0 0.67 0.71 0.69 148 1 0.64 0.59 0.61 127 accuracy 0.65 275 macro avg 0.65 0.65 0.65 275
weighted avg 0.65 0.65 0.65 275

Implementing Other SVM Flavors with Python's Scikit-Learn PlatoBlockchain Data Intelligence. Vertical Search. Ai.

A nemlineáris kernelteljesítmények összehasonlítása

Ha röviden összehasonlítjuk a különböző típusú nemlineáris kernelek teljesítményét, úgy tűnhet, hogy a szigmoid kernel rendelkezik a legalacsonyabb mérőszámokkal, tehát a legrosszabb teljesítménnyel.

A Gauss- és polinomiális kernelek közül azt láthatjuk, hogy a Gauss-kernel tökéletes 100%-os előrejelzési arányt ért el – ami általában gyanús és túlillesztésre utalhat, míg a polinomiális kernel az 68. osztály 1 példányát minősítette rosszul.

Ezért nincs szigorú szabály arra vonatkozóan, hogy melyik kernel teljesít a legjobban minden forgatókönyvben vagy a jelenlegi forgatókönyvünkben anélkül, hogy további hiperparaméterek után kellene keresni, megérteni az egyes függvényalakzatokat, feltárni az adatokat, valamint összehasonlítani a vonat- és teszteredményeket, hogy megnézzük, vajon az algoritmus általánosít.

Az egész az összes kernel teszteléséről szól, és a paraméterek és az adat-előkészítés kombinációjával kiválasztja azt, amely a projekt kontextusának megfelelően a várt eredményeket adja.

Tovább haladva – Kézi, végpontokig tartó projekt

Érdeklődő természete arra készteti, hogy tovább menjen? Javasoljuk, hogy tekintse meg nálunk Irányított projekt: „Hands-On House Price Prediction – gépi tanulás Pythonban”.

Implementing Other SVM Flavors with Python's Scikit-Learn PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Ebben az irányított projektben megtudhatja, hogyan építhet hatékony hagyományos gépi tanulási modelleket, valamint mély tanulási modelleket, hogyan használhatja az Ensemble Learning-et és képezheti a metatanulókat a lakásárak előrejelzésére a Scikit-Learn és Keras modellekből.

A Keras, a Tensorflow-ra épülő mélytanulási API használatával architektúrákkal kísérletezzünk, halmozott modellek együttesét építjük fel, és megtanítunk egy meta-tanuló neurális hálózat (1. szintű modell) egy ház árának meghatározásához.

A mélyreható tanulás csodálatos – de mielőtt hozzáfognánk, tanácsos megpróbálni egyszerűbb technikákkal is megoldani a problémát, mint pl. sekély tanulás algoritmusok. Alapteljesítményünk a Véletlenszerű erdei regresszió algoritmus. Ezen kívül – megvizsgáljuk a modellegyüttesek létrehozását a Scikit-Learn segítségével olyan technikák segítségével, mint pl zsákolás és a szavazás.

Ez egy teljes körű projekt, és mint minden gépi tanulási projekt, mi is azzal kezdjük, hogy – azzal Feltáró adatelemzés, Ezt követi Adat előfeldolgozása és végül Sekély épület és a Mély tanulási modellek hogy illeszkedjenek a korábban feltárt és megtisztított adatokhoz.

Következtetés

Ebben a cikkben rövid összefoglalót készítettünk az SVM-ekről, tanulmányoztuk a kerneltrükköt, és különféle nemlineáris SVM-eket implementáltunk.

Azt javaslom, hogy minden kernelt implementáljon, és folytassa tovább. Felfedezheti a különböző kernelek létrehozásához használt matematikát, a létrehozásuk okait és a hiperparamétereik közötti különbségeket. Ily módon megismerheti a technikákat és azt, hogy a kontextustól és a rendelkezésre álló adatoktól függően milyen típusú kernelt a legjobb alkalmazni.

Az egyes kernelek működésének és használatának pontos megértése minden bizonnyal segít az utazásban. Tudassa velünk, hogyan halad a fejlődés, és boldog kódolást!

Időbélyeg:

Még több Stackabus