Implementacija drugih različic SVM s Pythonovim Scikit-Learn

Implementacija drugih različic SVM s Pythonovim Scikit-Learn

Predstavitev

Ta vodnik je tretji in zadnji del treh vodnikov o podpornih vektorskih strojih (SVM). V tem priročniku se bomo še naprej ukvarjali s primerom uporabe ponarejenih bankovcev, na kratko povzeli splošno idejo za SVM-ji, razumeli, kaj je trik jedra, in implementirali različne vrste nelinearnih jeder s Scikit-Learn.

V celotni seriji vodnikov SVM boste poleg učenja o drugih vrstah SVM izvedeli tudi o preprostih SVM, vnaprej določenih parametrih SVM, hiperparametrih C in Gamma ter o tem, kako jih je mogoče prilagoditi z iskanjem po mreži in navzkrižnim preverjanjem.

Če želite prebrati prejšnje vodnike, si lahko ogledate prva dva vodnika ali pa vidite, katere teme vas najbolj zanimajo. Spodaj je tabela tem, obravnavanih v vsakem vodniku:

  1. Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learnom
  • Primer uporabe: pozabite na bankovce
  • Ozadje SVM-jev
  • Preprost (linearni) model SVM
    • O naboru podatkov
    • Uvažanje nabora podatkov
    • Raziskovanje nabora podatkov
  • Implementacija SVM s Scikit-Learn
    • Razdelitev podatkov v sklope vlakov/testov
    • Izobraževanje modela
    • Izdelava napovedi
    • Ocenjevanje modela
    • Interpretacija rezultatov
  1. Razumevanje hiperparametrov SVM
  • Hiperparameter C
  • Hiperparameter gama

3. Implementacija drugih različic SVM s Pythonovim Scikit-Learnom

  • Splošna ideja SVM-jev (povzetek)
  • Jedro (trik) SVM
  • Implementacija nelinearnega jedrnega SVM s Scikit-Learn
  • Uvoz knjižnic
    • Uvažanje nabora podatkov
    • Razdelitev podatkov na funkcije (X) in cilj (y)
    • Razdelitev podatkov v sklope vlakov/testov
    • Usposabljanje algoritma
  • Polinomsko jedro
    • Izdelava napovedi
    • Ocenjevanje algoritma
  • Gaussovo jedro
    • Napovedovanje in vrednotenje
  • Sigmoidno jedro
    • Napovedovanje in vrednotenje
  • Primerjava zmogljivosti nelinearnega jedra

Spomnimo se, kaj sploh je SVM, preden vidimo nekaj zanimivih različic jedra SVM.

Splošna ideja SVM-jev

V primeru linearno ločljivih podatkov v dveh dimenzijah (kot je prikazano na sliki 1) bi bil tipičen pristop algoritma strojnega učenja poskus najti mejo, ki deli podatke na tak način, da je napaka napačne klasifikacije čim manjša. Če pozorno pogledate sliko 1, opazite, da lahko obstaja več meja (neskončno), ki pravilno razdelijo podatkovne točke. Dve črtkani črti in polna črta sta veljavni klasifikaciji podatkov.

Meje več odločitev

Slika 1: Meje več odločitev

Ko SVM izbere meja odločitve, izbere mejo, ki poveča razdaljo med njim in najbližjimi podatkovnimi točkami razredov. Vemo že, da so najbližje podatkovne točke podporni vektorji in da je razdaljo mogoče parametrizirati z obema C in gamma hiperparametri.

Pri izračunu te odločitvene meje algoritem izbere, koliko točk naj upošteva in kako daleč lahko seže marža – to konfigurira problem maksimiranja marže. Pri reševanju tega problema maksimiranja marže SVM uporablja podporne vektorje (kot je prikazano na sliki 2) in poskuša ugotoviti, katere so optimalne vrednosti, ki ohranjajo večjo razdaljo roba, hkrati pa pravilno razvrsti več točk glede na funkcijo, ki se uporablja za ločite podatke.

Odločitvena meja s podpornimi vektorji

Slika 2: Odločitvena meja s podpornimi vektorji

Zato se SVM razlikuje od drugih klasifikacijskih algoritmov, ko ne najde samo odločitvene meje, ampak na koncu najde optimalno odločitveno mejo.

V ozadju iskanja podpornih vektorjev, izračunavanja razlike med odločitveno mejo in podpornimi vektorji ter maksimiranja te rezerve je zapletena matematika, ki izhaja iz statistike in računalniških metod. Tokrat se ne bomo spuščali v podrobnosti o tem, kako se matematika odvija.

Vedno je pomembno, da se potopite globlje in se prepričate, da algoritmi strojnega učenja niso nekakšen skrivnostni urok, čeprav vam nepoznavanje vsake matematične podrobnosti v tem trenutku ni in vam ne bo preprečilo, da bi lahko izvedli algoritem in dobili rezultate.

Nasvet: zdaj, ko smo naredili povzetek algoritemskega procesa, je jasno, da bo razdalja med podatkovnimi točkami vplivala na mejo odločitve, ki jo izbere SVM, zaradi tega, skaliranje podatkov je običajno potreben pri uporabi klasifikatorja SVM. Poskusite uporabiti Metoda Standard Scaler podjetja Scikit-learn za pripravo podatkov, nato pa znova zaženite kode, da vidite, ali je razlika v rezultatih.

Jedro (trik) SVM

V prejšnjem razdelku smo se spomnili in organizirali splošno idejo SVM – videli smo, kako jo je mogoče uporabiti za iskanje optimalne odločitvene meje za linearno ločljive podatke. Vendar pa v primeru nelinearno ločljivih podatkov, kot je prikazan na sliki 3, že vemo, da ravne črte ni mogoče uporabiti kot mejo odločitve.

Nelinearno ločljivi podatki

Slika 3: Nelinearno ločljivi podatki

Namesto tega lahko uporabimo spremenjeno različico SVM, o kateri smo razpravljali na začetku, imenovano Kernel SVM.

V bistvu bo jedro SVM projiciralo nelinearno ločljive podatke nižjih dimenzij v njihovo ustrezno obliko v višjih dimenzijah. To je trik, saj se pri projiciranju nelinearno ločljivih podatkov v višjih dimenzijah oblika podatkov spremeni tako, da postanejo ločljivi. Če na primer razmišljamo o treh dimenzijah, bi lahko bile podatkovne točke iz vsakega razreda na koncu dodeljene drugi dimenziji, zaradi česar bi bila ločljiva. Eden od načinov za povečanje dimenzij podatkov je lahko njihovo potenciranje. Spet je v to vpletena zapletena matematika, vendar vam ni treba skrbeti, če želite uporabljati SVM. Namesto tega lahko uporabimo Pythonovo knjižnico Scikit-Learn za implementacijo in uporabo nelinearnih jeder na enak način, kot smo uporabili linearna.

Implementacija nelinearnega jedrnega SVM s Scikit-Learn

V tem razdelku bomo uporabili isti nabor podatkov za predvidevanje, ali je bankovec pravi ali ponarejen glede na štiri značilnosti, ki jih že poznamo.

Videli boste, da so ostali koraki tipični koraki strojnega učenja in potrebujejo zelo malo razlage, dokler ne dosežemo dela, kjer urimo naše nelinearne SVM-je jedra.

Uvoz knjižnic

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

Uvažanje nabora podatkov

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)

Razdelitev podatkov na funkcije (X) in cilj (y)

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

Razdelitev podatkov v sklope vlakov/testov

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

Usposabljanje algoritma

Za usposabljanje jedra SVM bomo uporabili isto SVC razreda Scikit-Learn's svm knjižnica. Razlika je v vrednosti za parameter jedra SVC razred.

V primeru preprostega SVM smo kot vrednost za parameter jedra uporabili »linearno«. Vendar, kot smo že omenili, lahko za jedro SVM uporabimo Gaussova, polinomska, sigmoidna ali izračunljiva jedra. Implementirali bomo polinomska, Gaussova in sigmoidna jedra ter pogledali njihove končne metrike, da vidimo, katera ustreza našim razredom z višjo metriko.

1. Polinomsko jedro

V algebri je polinom izraz oblike:

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

Ta ima spremenljivke, kot npr a in b, konstante, v našem primeru, 9 in koeficienti (konstante, ki jih spremljajo spremenljivke), kot npr 2 in 4. 3 se šteje za stopnjo polinoma.

Obstajajo vrste podatkov, ki jih je mogoče najbolje opisati z uporabo polinomske funkcije. Tukaj bo jedro preslikalo naše podatke v polinom, za katerega bomo izbrali stopnjo. Višja kot je stopnja, bolj se bo funkcija poskušala približati podatkom, zato je meja odločitve bolj prilagodljiva (in bolj nagnjena k prekomernemu prilagajanju) – nižja kot je stopnja, najmanj prilagodljiva.

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!

Torej, za izvajanje polinomsko jedro, poleg izbire poly jedro, bomo posredovali tudi vrednost za degree parameter parametra SVC razred. Spodaj je koda:

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

Izdelava napovedi

Zdaj, ko smo usposobili algoritem, je naslednji korak napovedovanje testnih podatkov.

Kot smo storili prej, lahko za to izvedemo naslednji skript:

y_pred_poly = svclassifier.predict(X_test)

Ocenjevanje algoritma

Kot običajno je zadnji korak vrednotenje polinomskega jedra. Ker smo nekajkrat ponovili kodo za poročilo o klasifikaciji in matriko zmede, jo pretvorimo v funkcijo, ki display_results po prejemu ustreznih y_test, y_pred in naslov Seabornove matrike zmede z 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))

Zdaj lahko pokličemo funkcijo in pogledamo rezultate, dobljene s polinomskim jedrom:

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

Izhod je videti takole:

 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.

Zdaj lahko ponovimo iste korake za Gaussova in sigmoidna jedra.

2. Gaussovo jedro

Za uporabo gaussovega jedra moramo samo podati 'rbf' kot vrednost za kernel parameter razreda SVC:

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

Pri nadaljnjem raziskovanju tega jedra lahko uporabite tudi iskanje po mreži, da ga kombinirate z različnimi C in gamma vrednosti.

Napovedovanje in vrednotenje

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)

Izhod Gaussovega jedra SVM izgleda takole:

 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. Sigmoidno jedro

Nazadnje uporabimo sigmoidno jedro za implementacijo Kernel SVM. Oglejte si naslednji scenarij:

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

Če želite uporabiti jedro sigmoid, morate podati 'sigmoid' kot vrednost za kernel parameter parametra SVC razred.

Napovedovanje in vrednotenje

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)

Izhod jedra SVM z jedrom Sigmoid izgleda takole:

 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.

Primerjava zmogljivosti nelinearnega jedra

Če na kratko primerjamo zmogljivost različnih tipov nelinearnih jeder, se morda zdi, da ima sigmoidno jedro najnižjo metriko, torej najslabšo zmogljivost.

Med Gaussovim in polinomskim jedrom lahko vidimo, da je Gaussovo jedro doseglo popolno 100-odstotno stopnjo napovedi – kar je običajno sumljivo in lahko kaže na preobremenitev, medtem ko je polinomsko jedro napačno razvrstilo 68 primerkov razreda 1.

Zato ni trdnega in hitrega pravila o tem, katero jedro deluje najbolje v vsakem scenariju ali v našem trenutnem scenariju brez nadaljnjega iskanja hiperparametrov, razumevanja vsake oblike funkcije, raziskovanja podatkov in primerjave rezultatov usposabljanja in testiranja, da bi ugotovili, ali algoritem posplošuje.

Gre za testiranje vseh jeder in izbiro tistega s kombinacijo parametrov in pripravo podatkov, ki daje pričakovane rezultate glede na kontekst vašega projekta.

Going Further – ročni projekt od konca do konca

Ali zaradi vaše radovedne narave želite iti dlje? Priporočamo, da si ogledate naše Vodeni projekt: »Praktično napovedovanje cen nepremičnin – strojno učenje v Pythonu«.

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

V tem vodenem projektu – naučili se boste, kako zgraditi zmogljive tradicionalne modele strojnega učenja in modele globokega učenja, uporabiti Ensemble Learning in učiti meta-učence za napovedovanje cen stanovanj iz vreče modelov Scikit-Learn in Keras.

Z uporabo Kerasa, API-ja za globoko učenje, zgrajenega na Tensorflowu, bomo eksperimentirali z arhitekturami, zgradili skupino zloženih modelov in usposobili meta-učenec nevronsko mrežo (model ravni 1), da ugotovimo ceno hiše.

Globoko učenje je neverjetno – a preden se zatečete k njemu, je priporočljivo poskusiti težavo rešiti tudi s preprostejšimi tehnikami, kot je npr. plitko učenje algoritmi. Naša osnovna uspešnost bo temeljila na a Naključna gozdna regresija algoritem. Poleg tega – raziskali bomo ustvarjanje sklopov modelov prek Scikit-Learn s tehnikami, kot je npr. vrečanje v vreče in glasovanje.

To je projekt od konca do konca in kot pri vseh projektih strojnega učenja bomo tudi mi začeli z – s Raziskovalne analize podatkov, sledi Predobdelava podatkov in končno Plitvo gradnje in Modeli globokega učenja da ustrezajo podatkom, ki smo jih predhodno raziskali in očistili.

zaključek

V tem članku smo naredili kratek povzetek SVM-jev, preučili trik jedra in implementirali različne okuse nelinearnih SVM-jev.

Predlagam, da implementirate vsako jedro in nadaljujete. Raziščete lahko matematiko, uporabljeno za ustvarjanje vsakega od različnih jeder, zakaj so bila ustvarjena in razlike glede njihovih hiperparametrov. Na ta način boste spoznali tehnike in vrsto jedra, ki je najbolje uporabiti glede na kontekst in razpoložljive podatke.

Jasno razumevanje delovanja posameznega jedra in kdaj jih uporabiti vam bo zagotovo pomagalo na vaši poti. Sporočite nam, kako napreduje in veselo kodiranje!

Časovni žig:

Več od Stackabuse