Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learnom

Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learnom

Predstavitev

Ta vodnik je prvi del treh vodnikov o podpornih vektorskih strojih (SVM). V tej seriji bomo delali na primeru uporabe ponarejenih bankovcev, se učili o preprostih SVM, nato o hiperparametrih SVM in na koncu spoznali koncept, imenovan jedrni trik in raziščite druge vrste SVM-jev.

Če želite prebrati vse vodnike ali videti, kateri vas najbolj zanimajo, je spodaj 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

2. Razumevanje hiperparametrov SVM (prihaja kmalu!)

  • Hiperparameter C
  • Hiperparameter gama

3. Implementacija drugih različic SVM s Pythonovim Scikit-Learnom (prihaja kmalu!)

  • Splošna ideja SVM-jev (povzetek)
  • Jedro (trik) SVM
  • Implementacija nelinearnega jedra SVM s Scikit-Learn
  • Uvoz knjižnic
    • Uvoz niza podatkov
    • Razdelitev podatkov na značilnosti (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

Primer uporabe: Ponarejeni bankovci

Včasih ljudje najdejo način za ponarejanje bankovcev. Če obstaja oseba, ki si te bankovce ogleduje in preverja njihovo veljavnost, bi jo bilo težko prevarati.

Toda kaj se zgodi, ko ni osebe, ki bi pogledala vsak bankovec? Ali obstaja način, da samodejno ugotovimo, ali so bankovci ponarejeni ali pravi?

Obstaja veliko načinov za odgovor na ta vprašanja. Eden od odgovorov je, da fotografirate vsak prejeti bankovec, primerjate njegovo sliko s podobo ponarejenega bankovca in ga nato razvrstite med pravega ali ponarejenega. Ko bi bilo morda dolgočasno ali kritično čakati na preverjanje beležke, bi bilo zanimivo narediti to primerjavo hitro.

Ker se uporabljajo slike, jih je mogoče stisniti, zmanjšati na sive odtenke in njihove meritve ekstrahirati ali kvantizirati. Na ta način bi bila primerjava med meritvami slik, namesto posameznih slikovnih pik.

Doslej smo našli način za obdelavo in primerjavo bankovcev, toda kako jih bomo razvrstili na prave ali ponarejene? Za to klasifikacijo lahko uporabimo strojno učenje. Obstaja algoritem za razvrščanje, imenovan Podporni vektorski stroj, znan predvsem po svoji skrajšani obliki: svm.

Ozadje SVM-jev

SVM sta prvič predstavila leta 1968 Vladmir Vapnik in Alexey Chervonenkis. Takrat je bil njihov algoritem omejen na klasifikacijo podatkov, ki jih je mogoče ločiti samo z eno ravno črto, ali podatkov, ki so linearno ločljiva. Vidimo lahko, kako bi ta ločitev izgledala:

Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Na zgornji sliki imamo na sredini črto, na kateri so nekatere točke levo, druge pa desno od te črte. Upoštevajte, da sta obe skupini točk popolnoma ločeni, ni točk vmes ali celo blizu premice. Zdi se, da obstaja rob med podobnimi točkami in črto, ki jih deli, ta rob se imenuje ločilni rob. Funkcija ločilnega roba je povečati prostor med podobnimi točkami in črto, ki jih ločuje. SVM to naredi tako, da uporabi nekaj točk in izračuna svoje pravokotne vektorje, da podpre odločitev za rob črte. To so podporni vektorji ki so del imena algoritma. Več o njih bomo razumeli kasneje. In ravno črto, ki jo vidimo na sredini, najdemo z metodami, ki maksimiranje tisti prostor med črto in točkami ali ki maksimirajo ločilni rob. Te metode izvirajo s področja Teorija optimizacije.

V primeru, ki smo ga pravkar videli, lahko obe skupini točk enostavno ločimo, saj je vsaka posamezna točka blizu skupaj s svojimi podobnimi točkami, obe skupini pa sta daleč druga od druge.

Toda kaj se zgodi, če ni načina za ločitev podatkov z eno ravno črto? Če so neurejene točke ali če je potrebna krivulja?

Da bi rešili to težavo, je bil SVM pozneje izpopolnjen v devetdesetih letih prejšnjega stoletja, da bi lahko tudi razvrstil podatke, ki so imeli točke, ki so bile daleč od njegove osrednje težnje, kot so izstopajoči ali bolj zapleteni problemi, ki so imeli več kot dve dimenziji in niso bili linearno ločljivi. .

Nenavadno je, da so šele v zadnjih letih SVM postali široko sprejeti, predvsem zaradi svoje sposobnosti, da včasih dosežejo več kot 90 % pravilnih odgovorov oz. natančnost, za težke težave.

SVM-ji so implementirani na edinstven način v primerjavi z drugimi algoritmi strojnega učenja, ko temeljijo na statističnih razlagah, kaj je učenje, ali na Statistična teorija učenja.

V tem članku bomo videli, kaj so algoritmi podpornih vektorskih strojev, kratko teorijo za podpornimi vektorskimi stroji in njihovo implementacijo v Pythonovo knjižnico Scikit-Learn. Nato se bomo pomaknili k drugemu konceptu SVM, znanemu kot Jedro SVMali Trik jedra, izvajal pa ga bo tudi s pomočjo Scikit-Learn.

Preprost (linearni) model SVM

O naboru podatkov

Po uvodnem primeru bomo uporabili nabor podatkov, ki vsebuje meritve pravih in ponarejenih slik bankovcev.

Ko gledamo dva bankovca, ju naše oči običajno pregledajo od leve proti desni in preverijo, kje bi lahko bile podobnosti ali razlike. Iščemo črno piko pred zeleno piko ali svetlečo oznako nad ilustracijo. To pomeni, da obstaja vrstni red, v katerem gledamo zapiske. Če bi vedeli, da obstajajo zelene in črne pike, vendar ne, če je zelena pika pred črno ali če je črna pred zeleno, bi bilo težje razlikovati med notami.

Obstaja podobna metoda, kot smo jo pravkar opisali, ki jo je mogoče uporabiti za slike bankovcev. Na splošno je ta metoda sestavljena iz prevajanja pikslov slike v signal, nato pa se upošteva vrstni red, v katerem se vsak drug signal zgodi na sliki, tako da se le-ta pretvori v majhne valove ali valovi. Po pridobitvi valovnih valov obstaja način, kako ugotoviti vrstni red, v katerem se neki signal zgodi pred drugim, ali čas, vendar ne točno kakšen signal. Da bi to vedeli, je treba pridobiti frekvence slike. Pridobijo se z metodo, ki naredi razgradnjo vsakega signala, imenovano Fourierjeva metoda.

Ko je časovna razsežnost pridobljena z valovnicami in frekvenčna razsežnost s Fourierjevo metodo, se naredi superpozicija časa in frekvence, da se vidi, kdaj se obe ujemata, to je zvijanje analizo. Konvolucija pridobi prileganje, ki ujema valovnice s frekvencami slike in ugotovi, katere frekvence so bolj izrazite.

Ta metoda, ki vključuje iskanje valčkov, njihovih frekvenc in nato prileganje obeh, se imenuje Valovita transformacija. Valovna transformacija ima koeficiente in ti koeficienti so bili uporabljeni za pridobitev meritev, ki jih imamo v naboru podatkov.

Uvažanje nabora podatkov

Nabor podatkov o bankovcih, ki ga bomo uporabili v tem razdelku, je enak tistemu, ki je bil uporabljen v razdelku za klasifikacijo vadnica o odločitvenem drevesu.

Opomba: Nabor podatkov lahko prenesete tukaj.

Uvozimo podatke v pando dataframe strukturo in si oglejte prvih pet vrstic z head() metoda.

Upoštevajte, da so podatki shranjeni v a txt (besedilni) format datoteke, ločen z vejicami in je brez glave. Lahko ga rekonstruiramo kot tabelo, če ga beremo kot a csv, ki določa separator kot vejico in dodajanje imen stolpcev z names prepir.

Sledimo tem trem korakom hkrati in si nato oglejmo prvih pet vrstic podatkov:

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

Rezultat tega je:

	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

Opomba: Podatke lahko tudi shranite lokalno in jih zamenjate data_link za data_path, in posredujte pot do svoje lokalne datoteke.

Vidimo lahko, da je v našem naboru podatkov pet stolpcev, in sicer variance, skewness, curtosis, entropyin class. V petih vrsticah so prvi štirje stolpci zapolnjeni s številkami, kot so 3.62160, 8.6661, -2.8073 oz. neprekinjeno vrednosti in zadnje class ima prvih pet vrstic izpolnjenih z 0 ali a Diskretna vrednost.

Ker je naš cilj predvideti, ali je bankovec banke pristen ali ne, lahko to storimo na podlagi štirih lastnosti bankovca:

  • variance Wavelet transformirane slike. Na splošno je varianca zvezna vrednost, ki meri, koliko so podatkovne točke blizu ali daleč od povprečne vrednosti podatkov. Če so točke bližje povprečni vrednosti podatkov, je porazdelitev bližje normalni porazdelitvi, kar običajno pomeni, da so njene vrednosti bolje porazdeljene in jih je nekoliko lažje predvideti. V trenutnem kontekstu slike je to varianca koeficientov, ki izhajajo iz valovite transformacije. Manjša ko je varianca, bližje so bili koeficienti prevodu dejanske slike.

  • skewness Wavelet transformirane slike. Asimetrija je zvezna vrednost, ki kaže na asimetrijo porazdelitve. Če je levo od povprečja več vrednosti, je porazdelitev enaka negativno poševno, če je desno od sredine več vrednosti, je porazdelitev enaka pozitivno izkrivljeno, in če so povprečje, način in mediana enaki, je porazdelitev enaka simetrična. Bolj kot je porazdelitev simetrična, bližje je normalni porazdelitvi, njene vrednosti pa so tudi bolje porazdeljene. V tem kontekstu je to asimetrija koeficientov, ki izhajajo iz valovne transformacije. Bolj ko je simetričen, bližje so koeficientivariance, skewness, curtosis, entropypri prevajanju dejanske slike.

Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

  • curtosis (ali kurtosis) Wavelet transformirane slike. Kurtoza je zvezna vrednost, ki tako kot asimetrija opisuje tudi obliko porazdelitve. Odvisno od koeficienta kurtoze (k) je lahko porazdelitev – če jo primerjamo z normalno porazdelitvijo bolj ali manj ravna – ali ima več ali manj podatkov na skrajnih ali repih. Ko je porazdelitev bolj razširjena in položna, se imenuje platykurtic; ko je manj razpršen in bolj koncentriran na sredini, mesokurtic; in ko je porazdelitev skoraj v celoti koncentrirana na sredini, se imenuje leptokurtic. To je isti primer kot predhodni primeri variance in asimetrije, bolj kot je mezokurtična porazdelitev, bližje so bili koeficienti prevodu dejanske slike.

Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

  • entropy slike. Entropija je tudi stalna vrednost, običajno meri naključnost ali nered v sistemu. V kontekstu slike entropija meri razliko med pikslom in sosednjimi piksli. Za naš kontekst velja, da več kot imajo koeficienti entropije, večja je izguba pri transformaciji slike – in manjša kot je entropija, manjša je izguba informacij.

Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Peta spremenljivka je bila class spremenljivka, ki ima verjetno vrednosti 0 in 1, ki povesta, ali je bankovec pravi ali ponarejen.

Lahko preverimo, ali peti stolpec vsebuje ničle in enice s Pandas' unique() metoda:

bankdata['class'].unique()

Zgornja metoda vrne:

array([0, 1]) 

Zgornja metoda vrne matriko z vrednostmi 0 in 1. To pomeni, da so edine vrednosti, ki jih vsebujejo naše vrstice razreda, ničle in enice. Pripravljen je za uporabo kot ciljna pri našem nadzorovanem učenju.

  • class slike. To je celoštevilska vrednost, je 0, ko je slika ponarejena, in 1, če je slika resnična.

Ker imamo stolpec z opombami pravih in pozabljenih slik, to pomeni, da je naš tip učenja nadzorovano.

Nasvet: če želite izvedeti več o razlogih za Wavelet Transform na slikah bankovcev in uporabi SVM, preberite objavljen članek avtorjev.

Prav tako lahko vidimo, koliko zapisov ali slik imamo, če pogledamo število vrstic v podatkih prek shape lastnost:

bankdata.shape

To ustvari:

(1372, 5)

Zgornja vrstica pomeni, da je 1,372 vrstic transformiranih slik bankovcev in 5 stolpcev. To so podatki, ki jih bomo analizirali.

Uvozili smo naš nabor podatkov in opravili nekaj preverjanj. Zdaj lahko raziščemo svoje podatke, da jih bolje razumemo.

Raziskovanje nabora podatkov

Pravkar smo videli, da so v stolpcu razreda samo ničle in enice, lahko pa tudi vemo, v kakšnem razmerju so – z drugimi besedami – če je več ničel kot enic, več enic kot ničle ali če so števila ničle je enako številu enic, kar pomeni, da so uravnotežen.

Da bi poznali delež, lahko preštejemo vsako od vrednosti nič in ena v podatkih value_counts() metoda:

bankdata['class'].value_counts()

To ustvari:

0 762
1 610
Name: class, dtype: int64

V zgornjem rezultatu lahko vidimo, da je 762 ničel in 610 enic oziroma 152 ničel več kot enic. To pomeni, da smo malo več ponaredili tiste prave slike, in če bi bilo to odstopanje večje, na primer 5500 ničel in 610 enic, bi to lahko negativno vplivalo na naše rezultate. Ko poskušamo uporabiti te primere v našem modelu – več primerov je, običajno pomeni, da več informacij bo imel model, da se odloči med ponarejenimi ali pravimi bankovci – če je primerov pravih bankovcev malo, je model nagnjen k se motijo, ko jih poskušajo prepoznati.

Vemo že, da obstaja še 152 ponarejenih bankovcev, toda ali smo lahko prepričani, da je to dovolj primerov, da se jih model nauči? Vedeti, koliko primerov je potrebnih za učenje, je zelo težko odgovoriti, namesto tega lahko poskušamo razumeti, v odstotkih, kolikšna je razlika med razredi.

Prvi korak je uporaba pand value_counts() znova, zdaj pa poglejmo odstotek z vključitvijo argumenta normalize=True:

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

O normalize=True izračuna odstotek podatkov za vsak razred. Do sedaj je odstotek ponarejenih (0) in resničnih podatkov (1):

0 0.555394
1 0.444606
Name: class, dtype: float64

To pomeni, da je približno (~) 56 % našega nabora podatkov ponarejenih in 44 % resničnih. To nam daje razmerje med 56 % in 44 %, kar je enako 12 % razliki. To statistično velja za majhno razliko, saj je le malo nad 10 %, zato velja, da so podatki uravnoteženi. Če bi namesto razmerja 56:44 obstajalo razmerje 80:20 ali 70:30, bi se naši podatki šteli za neuravnotežene in bi morali narediti nekaj zdravljenja neravnovesja, a na srečo temu ni tako.

To razliko lahko vidimo tudi vizualno, tako da si ogledamo porazdelitev razreda ali cilja s histogramom, prežetim s Pando, z uporabo:

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

To izriše histogram z neposredno uporabo strukture podatkovnega okvira v kombinaciji z matplotlib knjižnica, ki je v zakulisju.

Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Če pogledamo histogram, smo lahko prepričani, da so naše ciljne vrednosti 0 ali 1 in da so podatki uravnoteženi.

To je bila analiza stolpca, ki smo ga poskušali predvideti, kaj pa analiza drugih stolpcev naših podatkov?

Statistične meritve si lahko ogledamo z describe() metoda podatkovnega okvira. Lahko tudi uporabimo .T transponiranja – za obračanje stolpcev in vrstic, zaradi česar je bolj neposredno primerjati vrednosti:

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!

bankdata.describe().T

Rezultat tega je:

 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

Upoštevajte, da imajo stolpci asimetrije in curtosis srednje vrednosti, ki so daleč od vrednosti standardnega odklona, ​​kar pomeni, da so vrednosti, ki so dlje od osrednje tendence podatkov, ali imajo večjo variabilnost.

Prav tako lahko vizualno pokukamo v porazdelitev vsake funkcije, tako da izrišemo histogram vsake funkcije znotraj zanke for. Poleg pogleda na porazdelitev bi bilo zanimivo pogledati, kako so točke vsakega razreda ločene glede na vsako značilnost. Da bi to naredili, lahko narišemo razpršeno grafično kombinacijo funkcij med njimi in vsaki točki dodelimo različne barve glede na njen razred.

Začnimo s porazdelitvijo vsake funkcije in narišite histogram vsakega podatkovnega stolpca, razen stolpca class stolpec. The class stolpec ne bo upoštevan glede na položaj v matriki stolpcev bančnih podatkov. Izbrani bodo vsi stolpci razen zadnjega z columns[:-1]:

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

Po zagonu zgornje kode lahko vidimo, da oboje skewness in entropy porazdelitve podatkov so negativno poševne in curtosis je pozitivno nagnjen. Vse porazdelitve so simetrične in variance je edina porazdelitev, ki je blizu normalni.

Zdaj lahko preidemo na drugi del in narišemo diagram razpršitve vsake spremenljivke. Če želite to narediti, lahko izberemo tudi vse stolpce razen razreda, s columns[:-1], uporabite Seaborn's scatterplot() in dve zanki for, da dobite različice združevanja za vsako od funkcij. Prav tako lahko izključimo združevanje funkcije s samo seboj, tako da preizkusimo, ali je prva značilnost enaka drugi z 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();

Upoštevajte, da imajo vsi grafi resnične in ponarejene podatkovne točke, ki niso jasno ločene druga od druge, kar pomeni, da obstaja nekakšna superpozicija razredov. Ker model SVM uporablja črto za ločevanje med razredi, ali je mogoče katero koli od teh skupin v grafih ločiti samo z eno črto? Zdi se malo verjetno. Tako je videti večina resničnih podatkov. Najbližje ločitvi lahko pridemo v kombinaciji skewness in varianceali entropy in variance parcele. To je verjetno posledica variance podatki, ki imajo obliko porazdelitve, ki je bližje normalni.

Toda gledanje vseh teh grafov v zaporedju je lahko nekoliko težko. Imamo alternativo, da skupaj pogledamo vse distribucijske in razpršene grafe z uporabo Seabornovega pairplot().

Obe prejšnji zanki for, ki smo jih naredili, lahko nadomestimo samo s to vrstico:

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

Če pogledamo zaplet v paru, se zdi, da pravzaprav curtosis in variance bi bila najlažja kombinacija funkcij, tako da bi lahko različne razrede ločili s črto, oz linearno ločljiva.

Če večina podatkov še zdaleč ni linearno ločljiva, jih lahko poskusimo vnaprej obdelati, tako da zmanjšamo njihove dimenzije, in tudi normaliziramo njihove vrednosti, da poskusimo distribucijo približati normalni.

V tem primeru uporabimo podatke takšne, kot so, brez nadaljnje predobdelave, pozneje pa se lahko vrnemo en korak nazaj, dodamo predobdelavo podatkov in primerjamo rezultate.

Nasvet: Pri delu s podatki se informacije običajno izgubijo pri transformaciji, saj delamo približke, namesto da bi zbrali več podatkov. Delo najprej z začetnimi podatki, kakršni so, če je mogoče, ponudi izhodišče pred poskusom drugih tehnik predprocesiranja. Ko sledite tej poti, lahko začetni rezultat, ki uporablja neobdelane podatke, primerjate z drugim rezultatom, ki uporablja tehnike predprocesiranja podatkov.

Opomba: Običajno je v statistiki pri gradnji modelov običajno slediti postopku, ki je odvisen od vrste podatkov (diskretni, zvezni, kategorični, numerični), njihove porazdelitve in predpostavk modela. Medtem ko je v računalništvu (CS) več prostora za poskuse, napake in nove ponovitve. V CS je običajno imeti osnovo za primerjavo. V Scikit-learn obstaja implementacija navideznih modelov (ali navideznih ocenjevalcev), nekateri niso boljši od metanja kovanca in samo odgovora ja (ali 1) 50 % časa. Zanimivo je uporabiti navidezne modele kot osnovo za dejanski model pri primerjavi rezultatov. Pričakuje se, da so dejanski rezultati modela boljši od naključnega ugibanja, sicer uporaba modela strojnega učenja ne bi bila potrebna.

Implementacija SVM s Scikit-Learn

Preden se podrobneje posvetimo teoriji delovanja SVM, lahko s podatki zgradimo svoj prvi osnovni model in Scikit-Learn Podporni vektorski klasifikator or SVC razred.

Naš model bo prejel valovne koeficiente in jih poskušal razvrstiti glede na razred. Prvi korak v tem procesu je ločitev koeficientov oz lastnosti iz razreda oz ciljna. Po tem koraku je drugi korak nadaljnja razdelitev podatkov v niz, ki bo uporabljen za učenje modela oz. vlakovni komplet in drugo, ki bo uporabljena za vrednotenje modela oz testni set.

Opomba: Nomenklatura testa in ocenjevanja je lahko nekoliko zmedena, saj lahko svoje podatke razdelite tudi med nize za usposabljanje, ocenjevanje in teste. Na ta način bi namesto dveh nizov imeli vmesni niz, ki bi ga lahko samo uporabili in preverili, ali se zmogljivost vašega modela izboljšuje. To pomeni, da bi se model uril z nizom vlakov, izboljšal z nizom za vrednotenje in pridobil končno metriko s testnim nizom.

Nekateri pravijo, da je vrednotenje tisti vmesni niz, drugi bodo rekli, da je testni niz vmesni niz in da je ocenjevalni niz končni niz. To je še en način, kako zagotoviti, da model na noben način ne vidi istega primera ali da nekakšen uhajanje podatkov se ne zgodi in da obstaja posplošitev modela z izboljšanjem zadnje nastavljene metrike. Če želite slediti temu pristopu, lahko podatke še enkrat razdelite, kot je opisano v tem Scikit-Learn's train_test_split() – nizi za usposabljanje, testiranje in validacijo vodnik.

Razdelitev podatkov v sklope vlakov/testov

V prejšnji seji smo razumeli in raziskali podatke. Zdaj lahko svoje podatke razdelimo v dve matriki – eno za štiri funkcije in drugo za peto ali ciljno funkcijo. Ker želimo napovedati razred glede na valovne koeficiente, naš y bo class stolpec in naš X bo variance, skewness, curtosisin entropy stolpcev.

Če želite ločiti cilj in lastnosti, lahko pripišemo le class stolpec do y, ki ga pozneje spusti iz podatkovnega okvira, da mu pripiše preostale stolpce X z .drop() metoda:

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

Ko so podatki razdeljeni na atribute in oznake, jih lahko nadalje razdelimo na nize za usposabljanje in teste. To bi lahko naredili ročno, vendar model_selection knjižnica Scikit-Learn vsebuje train_test_split() metoda, ki nam omogoča naključno razdelitev podatkov v nize vlakov in testov.

Za uporabo lahko uvozimo knjižnico, pokličemo train_test_split() metoda, podati v X in y podatke in definirajte a test_size prenesti kot argument. V tem primeru ga bomo definirali kot 0.20– to pomeni, da bo 20 % podatkov uporabljenih za testiranje, ostalih 80 % pa za usposabljanje.

Ta metoda naključno jemlje vzorce ob upoštevanju odstotka, ki smo ga določili, vendar upošteva pare Xy, da vzorčenje ne bi popolnoma pomešalo razmerja.

Ker je postopek vzorčenja sam po sebi naključen, bomo pri izvajanju metode vedno imeli različne rezultate. Da bi lahko imeli enake rezultate ali ponovljive rezultate, lahko definiramo konstanto, imenovano SEED, z vrednostjo 42.

Za to lahko izvedete naslednji skript:

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)

Opazite, da train_test_split() metoda že vrne X_train, X_test, y_train, y_test nizov v tem vrstnem redu. Natisnemo lahko število vzorcev, ločenih za vlak in test, tako da dobimo prvi (0) element shape vrnjena vrvica lastnosti:

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.')

To kaže, da je 1097 vzorcev za usposabljanje in 275 za testiranje.

Izobraževanje modela

Podatke smo razdelili na nize vlakov in teste. Zdaj je čas, da ustvarite in usposobite model SVM na podatkih vlaka. Da bi to naredili, lahko uvozimo Scikit-Learn svm knjižnica skupaj z Podporni vektorski klasifikator razreda, oz SVC razred.

Po uvozu razreda lahko ustvarimo njegov primerek – ker ustvarjamo preprost model SVM, poskušamo naše podatke linearno ločiti, tako da lahko narišemo črto za razdelitev naših podatkov – kar je enako kot pri uporabi linearna funkcija – z definiranjem kernel='linear' kot argument za klasifikator:

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

Na ta način bo klasifikator poskušal najti linearno funkcijo, ki ločuje naše podatke. Po izdelavi modela ga usposobimo, oz fit s podatki o vlaku, ki uporablja fit() metoda in dajanje X_train lastnosti in y_train tarče kot argumenti.

Za usposabljanje modela lahko izvedemo naslednjo kodo:

svc.fit(X_train, y_train)

Kar tako je model izurjen. Doslej smo razumeli podatke, jih razdelili, ustvarili preprost model SVM in prilagodili model podatkom o vlaku.

Naslednji korak je razumeti, kako dobro je to prileganje uspelo opisati naše podatke. Z drugimi besedami, odgovoriti, ali je bil linearni SVM ustrezna izbira.

Izdelava napovedi

Način za odgovor, ali je modelu uspelo opisati podatke, je izračun in ogled neke klasifikacije meritve.

Glede na to, da je učenje nadzorovano, lahko s X_test in primerjati te rezultate napovedi – ki bi jih lahko imenovali y_pred – z dejanskim y_testali zemeljska resnica.

Za predvidevanje nekaterih podatkov, modelov predict() metodo je mogoče uporabiti. Ta metoda prejme testne lastnosti, X_test, kot argument in vrne napoved, bodisi 0 ali 1, za vsakega od X_test's vrstice.

Po napovedi, X_test podatkov, se rezultati shranijo v a y_pred spremenljivka. Tako je vsak od razredov, predvidenih s preprostim linearnim modelom SVM, zdaj v y_pred spremenljivka.

To je napovedna koda:

y_pred = svc.predict(X_test)

Glede na to, da imamo napovedi, jih lahko sedaj primerjamo z dejanskimi rezultati.

Ocenjevanje modela

Obstaja več načinov za primerjavo napovedi z dejanskimi rezultati in merijo različne vidike klasifikacije. Nekatere najpogosteje uporabljene klasifikacijske metrike so:

  1. Matrica zmede: ko moramo vedeti, za koliko vzorcev smo dobili pravilne ali napačne vsak razred. Pokličemo vrednosti, ki so bile pravilne in pravilno napovedane resnično pozitivni, se imenujejo tiste, ki so bile napovedane kot pozitivne, vendar niso bile pozitivne lažno pozitivno. Ista nomenklatura prave negative in lažno negativnih uporablja se za negativne vrednosti;

  2. Precision: ko je naš cilj razumeti, katere pravilne vrednosti napovedi je naš klasifikator štel za pravilne. Natančnost bo te prave pozitivne vrednosti delila z vzorci, ki so bili predvideni kot pozitivni;

$$
natančnost = frac{besedilo{resnični pozitivni}}{besedilo{resnični pozitivni} + besedilo{lažni pozitivni}}
$$

  1. Recall: običajno izračunano skupaj z natančnostjo, da bi razumeli, koliko resničnih pozitivnih rezultatov je identificiral naš klasifikator. Odpoklic se izračuna tako, da se resnični pozitivni učinki delijo s čimer koli, kar bi bilo predvideno kot pozitivno.

$$
odpoklic = frac{besedilo{resnični pozitivni}}{besedilo{resnični pozitivni} + besedilo{lažni negativni}}
$$

  1. Ocena F1: je uravnotežena oz harmonično srednjo vrednost natančnosti in odpoklica. Najnižja vrednost je 0, najvišja pa 1. Kdaj f1-score je enako 1, pomeni, da so bili vsi razredi pravilno predvideni – to je zelo težko doseči rezultat z resničnimi podatki (izjeme skoraj vedno obstajajo).

$$
besedilo{f1-rezultat} = 2* frac{besedilo{natančnost} * besedilo{priklic}}{besedilo{natančnost} + besedilo{priklic}}
$$

Seznanili smo se že z matriko zmede, natančnostjo, odpoklicem in merili F1. Da jih izračunamo, lahko uvozimo Scikit-Learn's metrics knjižnica. Ta knjižnica vsebuje classification_report in confusion_matrix metode, metoda klasifikacijskega poročila vrne natančnost, priklic in oceno f1. Oboje classification_report in confusion_matrix lahko zlahka uporabite za iskanje vrednosti za vse tiste pomembne meritve.

Za izračun metrik uvozimo metode, jih pokličemo in kot argumente posredujemo predvidene klasifikacije, y_test, in klasifikacijske oznake oz y_true.

Za boljšo vizualizacijo matrike zmede lahko narišemo v Seabornovem heatmap skupaj s količinskimi opombami, za poročilo o razvrščanju pa je najbolje natisniti njegov izid, tako da so njegovi rezultati oblikovani. To je naslednja koda:

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

To prikaže:

 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

Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

V poročilu o razvrstitvi vemo, da je natančnost 0.99, odpoklic 0.99 in ocena f1 0.99 za ponarejene bankovce ali razred 0. Te meritve so bile pridobljene z uporabo 148 vzorcev, kot je prikazano v podpornem stolpcu. Medtem je bil rezultat za razred 1 ali prave note eno enoto nižji, 0.98 natančnosti, 0.98 priklica in enak rezultat f1. Tokrat je bilo za pridobitev teh rezultatov uporabljenih 127 slikovnih meritev.

Če pogledamo matriko zmede, lahko vidimo tudi, da je bilo od 148 vzorcev razreda 0 146 pravilno razvrščenih in sta bila 2 lažno pozitivna, medtem ko sta bila pri 127 vzorcih razreda 1 2 lažno negativna in 125 resnično pozitivnih.

Lahko preberemo poročilo o razvrstitvi in ​​matriko zmede, toda kaj pomenita?

Interpretacija rezultatov

Da bi ugotovili pomen, si oglejmo vse meritve skupaj.

Skoraj vsi vzorci za razred 1 so bili pravilno razvrščeni, za naš model sta bili 2 napaki pri identifikaciji dejanskih bankovcev. To je enako kot 0.98 ali 98 % odpoklica. Nekaj ​​podobnega lahko rečemo za razred 0, samo 2 vzorca sta bila razvrščena nepravilno, medtem ko je 148 pravih negativov, kar skupaj predstavlja natančnost 99 %.

Poleg teh rezultatov vsi ostali označujejo 0.99, kar je skoraj 1, kar je zelo visoka metrika. Večino časa, ko se tako visoka metrika zgodi s podatki iz resničnega življenja, to morda kaže na model, ki je preveč prilagojen podatkom, ali preopremljen.

Kadar pride do preobremenitve, lahko model dobro deluje pri napovedovanju podatkov, ki so že znani, vendar izgubi zmožnost posploševanja na nove podatke, kar je pomembno v scenarijih resničnega sveta.

Hitri test, da ugotovite, ali prihaja do prekoračitve, je tudi s podatki o vlaku. Če si je model nekoliko zapomnil podatke o vlaku, bodo metrike zelo blizu 1 ali 100 %. Ne pozabite, da so podatki o vlaku večji od testnih podatkov – iz tega razloga – poskusite nanje gledati sorazmerno, več vzorcev, več možnosti za napake, razen če je prišlo do pretiravanja.

Za napovedovanje s podatki o vlaku lahko ponovimo, kar smo naredili za testne podatke, vendar zdaj s 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))

To ustvari:

 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

Implementacija SVM in Kernel SVM s Pythonovim Scikit-Learn PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Zlahka je opaziti, da se zdi, da je preveliko prileganje, ko so meritve vlaka 99-odstotne, če imate 4-krat več podatkov. Kaj je mogoče storiti v tem scenariju?

Če želite povrniti overfit, lahko dodamo več opazovanj vlaka, uporabimo metodo usposabljanja z različnimi deli nabora podatkov, kot je npr. navzkrižno preverjanje, prav tako spremenimo privzete parametre, ki že obstajajo pred treningom, pri izdelavi našega modela oz hiperparametrov. Večino časa Scikit-learn nastavi nekatere parametre kot privzete in to se lahko zgodi tiho, če ni veliko časa namenjenega branju dokumentacije.

Lahko preverite drugi del tega vodnika (prihaja kmalu!), da vidite, kako implementirati navzkrižno preverjanje in izvesti nastavitev hiperparametrov.

zaključek

V tem članku smo preučevali preprosto linearno jedro SVM. Dobili smo intuicijo za algoritmom SVM, uporabili pravi nabor podatkov, raziskali podatke in videli, kako je mogoče te podatke uporabiti skupaj s SVM, tako da jih implementiramo s Pythonovo knjižnico Scikit-Learn.

Če želite nadaljevati z vadbo, lahko poskusite z drugimi nabori podatkov iz resničnega sveta, ki so na voljo na mestih, kot je Kaggle, ICU, Javni nabori podatkov Big Query, univerze in vladna spletna mesta.

Predlagam tudi, da raziščete dejansko matematiko, ki stoji za modelom SVM. Čeprav ga ne boste nujno potrebovali za uporabo algoritma SVM, je vseeno zelo priročno vedeti, kaj se dejansko dogaja v ozadju, medtem ko vaš algoritem išče meje odločanja.

Časovni žig:

Več od Stackabuse