SVM-i ja kerneli SVM-i rakendamine Pythoni Scikit-Learniga

SVM-i ja kerneli SVM-i rakendamine Pythoni Scikit-Learniga

Sissejuhatus

See juhend on esimene osa kolmest tugivektori masinaid (SVM) käsitlevast juhendist. Selles sarjas käsitleme võltsitud pangatähtede kasutusjuhtu, õpime tundma lihtsaid SVM-i, seejärel SVM-i hüperparameetreid ja lõpuks õpime tundma kontseptsiooni, mida nimetatakse kerneli trikk ja uurige teist tüüpi SVM-e.

Kui soovite lugeda kõiki juhendeid või näha, millised teile kõige rohkem huvi pakuvad, on allpool igas juhendis käsitletud teemade tabel:

1. SVM-i ja kerneli SVM-i rakendamine Pythoni Scikit-Learniga

  • Kasutusjuht: unusta pangatähed
  • SVM-ide taust
  • Lihtne (lineaarne) SVM-mudel
    • Andmestiku kohta
    • Andmestiku importimine
    • Andmestiku uurimine
  • SVM-i juurutamine Scikit-Learniga
    • Andmete jagamine rongi/katsekomplektideks
    • Modelli koolitamine
    • Ennustuste tegemine
    • Mudeli hindamine
    • Tulemuste tõlgendamine

2. SVM-i hüperparameetrite mõistmine (tulekul!)

  • C hüperparameeter
  • Gamma hüperparameeter

3. Muude SVM-i maitsete rakendamine Pythoni Scikit-Learniga (tulekul!)

  • SVM-ide üldine idee (kokkuvõte)
  • Kernel (trikk) SVM
  • Mittelineaarse kerneli SVM-i juurutamine Scikit-Learniga
  • Teekide importimine
    • Andmestiku importimine
    • Andmete jagamine funktsioonideks (X) ja sihtmärgiks (y)
    • Andmete jagamine rongi/katsekomplektideks
    • Algoritmi treenimine
  • Polünoomtuum
    • Ennustuste tegemine
    • Algoritmi hindamine
  • Gaussi tuum
    • Ennustamine ja hindamine
  • Sigmoidne tuum
    • Ennustamine ja hindamine
  • Mittelineaarse tuuma jõudluse võrdlus

Kasutusjuht: võltsitud pangatähed

Mõnikord leiavad inimesed viisi, kuidas pangatähti võltsida. Kui keegi vaatab neid märkmeid ja kontrollib nende kehtivust, võib olla raske end petta lasta.

Aga mis juhtub siis, kui pole inimest, kes iga nooti vaataks? Kas on võimalik automaatselt teada saada, kas pangatähed on võltsitud või ehtsad?

Nendele küsimustele vastamiseks on palju viise. Üks vastus on pildistada iga saadud sedel, võrrelda selle pilti võltsitud sedeli kujutisega ja seejärel klassifitseerida see ehtsaks või võltsitud. Kui märkme kinnitamise ootamine võib olla tüütu või kriitiline, oleks huvitav ka seda võrrelda kiiresti.

Kuna pilte kasutatakse, saab neid tihendada, halltooniks taandada ja nende mõõtmised ekstraheerida või kvantifitseerida. Sel viisil võrreldaks piltide mõõtmisi, mitte iga pildi pikslit.

Siiani oleme leidnud viisi pangatähtede töötlemiseks ja võrdlemiseks, kuid kuidas need liigitatakse ehtsateks või võltsitud? Selle klassifikatsiooni tegemiseks saame kasutada masinõpet. On olemas klassifitseerimisalgoritm, mida nimetatakse Toetage vektormasinat, mida tuntakse peamiselt lühendatud kujul: SVM.

SVM-ide taust

SVM-id tutvustasid algselt 1968. aastal Vladmir Vapnik ja Alexey Chervonenkis. Sel ajal piirdus nende algoritm andmete klassifitseerimisega, mida oli võimalik eraldada vaid ühe sirgjoonega või andmetega, mis olid lineaarselt eraldatavad. Näeme, kuidas see eraldamine välja näeb:

SVM-i ja kerneli SVM-i juurutamine Pythoni Scikit-Learn PlatoBlockchain andmeanalüüsiga. Vertikaalne otsing. Ai.

Ülaltoodud pildil on meie keskel joon, millest mõned punktid jäävad sellest joonest vasakule ja teised paremale. Pange tähele, et mõlemad punktide rühmad on ideaalselt eraldatud, joone vahel või isegi selle lähedal pole punkte. Sarnaste punktide ja neid jagava joone vahel näib olevat veeris, seda veerist nimetatakse eraldusvaru. Eraldusvaru ülesanne on muuta ruum sarnaste punktide ja neid jagava joone vahel suuremaks. SVM teeb seda, kasutades mõnda punkti ja arvutab oma risti vektorid, et toetada joone veerise otsustamist. Need on tugivektorid mis on osa algoritmi nimest. Nendest saame hiljem täpsemalt aru. Ja sirge, mida me keskel näeme, leitakse meetoditega, mis maksimeerima see ruum joone ja punktide vahel või mis maksimeerib eraldusvaru. Need meetodid pärinevad valdkonnast Optimeerimise teooria.

Äsja vaadatud näites saab mõlemad punktide rühmad kergesti eraldada, kuna iga üksik punkt on oma sarnaste punktide lähedal ja kaks rühma on üksteisest kaugel.

Aga mis juhtub siis, kui andmeid ei ole võimalik ühe sirgjoonega eraldada? Kui on segased paigast ära punktid või kui on vaja kõverat?

Selle probleemi lahendamiseks viimistleti SVM-i hiljem 1990. aastatel, et saaks klassifitseerida ka andmeid, millel olid punktid, mis olid kaugel selle kesksest tendentsist, nagu kõrvalekalded, või keerukamad probleemid, millel oli rohkem kui kaks mõõdet ja mida ei olnud lineaarselt eraldatav. .

Huvitav on see, et alles viimastel aastatel on SVM-id laialdaselt kasutusele võetud, peamiselt tänu nende võimele saavutada mõnikord rohkem kui 90% õigetest vastustest või täpsus, raskete probleemide korral.

SVM-e rakendatakse teiste masinõppe algoritmidega võrreldes ainulaadsel viisil, kui need põhinevad statistilistel selgitustel selle kohta, mis on õppimine või Statistilise õppe teooria.

Selles artiklis näeme, millised on tugivektori masinate algoritmid, lühiteooria tugivektori masina taga ja nende rakendamine Pythoni Scikit-Learni teegis. Seejärel liigume teise SVM-i kontseptsiooni, tuntud kui Kerneli SVMvõi Kerneli trikkja rakendab seda ka Scikit-Learni abiga.

Lihtne (lineaarne) SVM-mudel

Andmestiku kohta

Sissejuhatuses toodud näite järgi kasutame andmekogumit, mis sisaldab tõeliste ja võltsitud pangatähtede kujutiste mõõtmisi.

Kahte nooti vaadates skannivad meie silmad neid tavaliselt vasakult paremale ja kontrollivad, kus võib olla sarnasusi või erinevusi. Otsime rohelist punkti ette tuleva musta punkti või illustratsiooni kohal olevat säravat märki. See tähendab, et on olemas järjekord, milles me märkmeid vaatame. Kui me teaksime, et on rohelisi ja musti täppe, aga mitte kui roheline täpp tuleb enne musta või kui must tuleb enne rohelist, oleks noote raskem eristada.

Meil on äsja kirjeldatud meetodiga sarnane meetod, mida saab rakendada pangatähtede piltide puhul. Üldiselt seisneb see meetod kujutise pikslite tõlkimises signaaliks, mille järel võetakse arvesse iga erineva signaali esinemise järjekorda pildil, muutes selle väikesteks laineteks või lainekesed. Pärast laineliste saamist on võimalik teada saada, millises järjekorras mõni signaal toimub enne teist, või aeg, kuid mitte täpselt, mis signaali. Selle teadmiseks tuleb saada pildi sagedused. Need saadakse meetodi abil, mis teeb iga signaali lagunemise, nn Fourier meetod.

Kui ajamõõde on saadud lainete abil ja sagedusmõõde Fourier meetodi abil, tehakse aja ja sageduse kattumine, et näha, kas neil mõlemal on sobivus. pöördumine analüüs. Konvolutsioon saavutab sobivuse, mis sobitab lained kujutise sagedustega, ja selgitab välja, millised sagedused on silmatorkavamad.

Seda meetodit, mis hõlmab laineliste, nende sageduste leidmist ja seejärel nende mõlema sobitamist, nimetatakse Lainete teisendus. Laineteisendusel on koefitsiendid ja neid koefitsiente kasutati andmekogumis olevate mõõtmiste saamiseks.

Andmestiku importimine

Pangatähtede andmestik, mida me selles jaotises kasutama hakkame, on sama, mida kasutati pangatähtede klassifitseerimise osas. otsustuspuu õpetus.

Märge: Saate andmestiku alla laadida siin.

Impordime andmed pandasse dataframe struktuuri ja vaadake selle esimest viit rida koos head() meetod.

Pange tähele, et andmed salvestatakse a txt (teksti) failivormingus, eraldatuna komadega ja see on ilma päiseta. Saame selle rekonstrueerida tabelina, lugedes seda kui a csv, täpsustades separator koma ja lisades veergude nimed koos names argument.

Järgime neid kolme sammu korraga ja seejärel vaatame esimest viit andmete rida:

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

Selle tulemuseks on:

	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

Märge: Samuti saate andmeid lokaalselt salvestada ja asendada data_link eest data_pathja edastage oma kohaliku faili tee.

Näeme, et meie andmekogumis on viis veergu, nimelt variance, skewness, curtosis, entropyja class. Viie rea esimesed neli veergu on täidetud selliste numbritega nagu 3.62160, 8.6661, -2.8073 või pidev väärtused ja viimane class veerus on esimesed viis rida täidetud nullidega või a diskreetne väärtus.

Kuna meie eesmärk on ennustada, kas pangatäht on autentne või mitte, saame seda teha kupüüri nelja atribuudi põhjal:

  • variance of Wavelet Transformeeritud pilt. Üldiselt on dispersioon pidev väärtus, mis mõõdab, kui palju andmepunktid on andmete keskmise väärtuse lähedal või kaugel. Kui punktid on lähemal andmete keskmisele väärtusele, on jaotus lähemal normaaljaotusele, mis tavaliselt tähendab, et selle väärtused on paremini jaotunud ja mõnevõrra lihtsam ennustada. Praeguses pildikontekstis on see laineteisendusest tulenevate koefitsientide dispersioon. Mida väiksem dispersioon, seda lähemal olid koefitsiendid tegeliku pildi tõlkimisele.

  • skewness of Wavelet Transformeeritud pilt. Viltus on pidev väärtus, mis näitab jaotuse asümmeetriat. Kui keskmisest vasakul on rohkem väärtusi, on jaotus selline negatiivselt kallutatud, kui keskmisest paremal on rohkem väärtusi, on jaotus selline positiivselt viltu, ja kui keskmine, moodus ja mediaan on samad, on jaotus sümmeetriline. Mida sümmeetrilisem on jaotus, seda lähemal on see normaaljaotusele, mille väärtused on ka paremini jaotunud. Praeguses kontekstis on see laineteisendusest tulenevate koefitsientide kalduvus. Mida sümmeetrilisem, seda lähedasemad on koefitsiendidvariance, skewness, curtosis, entropytegeliku pildi tõlkimiseks.

SVM-i ja kerneli SVM-i juurutamine Pythoni Scikit-Learn PlatoBlockchain andmeanalüüsiga. Vertikaalne otsing. Ai.

  • curtosis (või kurtosis) of Wavelet Transformed image. Kurtoos on pidev väärtus, mis kirjeldab sarnaselt kaldususega ka jaotuse kuju. Sõltuvalt kurtoosikoefitsiendist (k) võib jaotus – võrreldes normaaljaotusega olla enam-vähem tasane – või omada rohkem või vähem andmeid selle otstes või sabades. Kui jaotus on laiem ja lamedam, nimetatakse seda platykurtic; kui see on vähem laiali ja keskel rohkem kontsentreeritud, mesokurtik; ja kui jaotus on peaaegu täielikult koondunud keskele, nimetatakse seda leptokurtic. See on sama juhtum, mis varasemate dispersiooni ja kaldsuse juhtumite puhul, mida mesokurtilisem on jaotus, seda lähemal olid koefitsiendid tegeliku pildi tõlkimisele.

SVM-i ja kerneli SVM-i juurutamine Pythoni Scikit-Learn PlatoBlockchain andmeanalüüsiga. Vertikaalne otsing. Ai.

  • entropy pildist. Entroopia on ka pidev väärtus, see mõõdab tavaliselt juhuslikkust või häiret süsteemis. Pildi kontekstis mõõdab entroopia piksli ja selle naaberpikslite vahelist erinevust. Meie kontekstis on nii, et mida suurem on koefitsientide entroopia, seda suurem on kujutise teisendamisel kadu – ja mida väiksem on entroopia, seda väiksem on teabe kadu.

SVM-i ja kerneli SVM-i juurutamine Pythoni Scikit-Learn PlatoBlockchain andmeanalüüsiga. Vertikaalne otsing. Ai.

Viies muutuja oli class muutuja, millel on tõenäoliselt 0 ja 1 väärtused, mis näitavad, kas noot oli tõeline või võltsitud.

Pandade väärtustega saame kontrollida, kas viies veerg sisaldab nulle ja ühtesid unique() meetod:

bankdata['class'].unique()

Ülaltoodud meetod tagastab:

array([0, 1]) 

Ülaltoodud meetod tagastab massiivi 0 ja 1 väärtustega. See tähendab, et meie klassi ridades sisalduvad ainsad väärtused on nullid ja ühed. See on valmis kasutamiseks kui sihtmärk meie juhendatud õppes.

  • class pildist. See on täisarv, see on 0, kui pilt on võltsitud, ja 1, kui pilt on tõeline.

Kuna meil on veerg tõeliste ja unustatud piltide annotatsioonidega, tähendab see, et meie õppimise tüüp on selline kontrollitud.

Nõuanne: Lisateavet pangatähtede piltide laineteisenduste ja SVM-i kasutamise põhjuste kohta lisateabe saamiseks lugege autorite avaldatud artiklit.

Samuti saame näha, kui palju kirjeid või pilte meil on, vaadates andmete ridade arvu shape Vara:

bankdata.shape

See annab väljundi:

(1372, 5)

Ülaltoodud rida tähendab, et teisendatud pangatähtede kujutisi on 1,372 rida ja 5 veergu. Need on andmed, mida me analüüsime.

Oleme oma andmestiku importinud ja teinud mõned kontrollid. Nüüd saame oma andmeid uurida, et neid paremini mõista.

Andmestiku uurimine

Me just nägime, et klassiveerus on ainult nullid ja ühed, kuid saame ka teada, millises vahekorras need on – teisisõnu – kui nulle on rohkem kui ühtesid, ühtesid rohkem kui nulle või kui nullid on samad kui ühtede arv, mis tähendab, et nad on tasakaalustatud.

Proportsiooni teadasaamiseks saame lugeda andmetes kõik nulli ja ühe väärtused value_counts() meetod:

bankdata['class'].value_counts()

See annab väljundi:

0 762
1 610
Name: class, dtype: int64

Ülaltoodud tulemusest näeme, et seal on 762 nulli ja 610 ühte ehk 152 võrra rohkem nulli kui ühed. See tähendab, et meil on natuke rohkem võltsitud kui päris pilte ja kui see lahknevus oleks suurem, näiteks 5500 nulli ja 610 ühte, võib see meie tulemusi negatiivselt mõjutada. Kui proovime neid näiteid oma mudelis kasutada – mida rohkem näiteid on, tähendab see tavaliselt seda, et mida rohkem teavet peab mudel otsustama võltsitud või päris nootide vahel – kui päris nootide näiteid on vähe, on mudel kalduvus eksib neid ära tunda püüdes.

Teame juba, et võltsitud noote on veel 152, kuid kas saame olla kindlad, et need on mudelile õppimiseks piisavad näited? Teades, kui palju näiteid on õppimiseks vaja, on väga raske vastata, selle asemel võime proovida protsentuaalselt mõista, kui suur see klasside erinevus on.

Esimene samm on pandade kasutamine value_counts() meetodit, kuid nüüd vaatame protsenti, lisades argumendi normalize=True:

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

. normalize=True arvutab iga klassi andmete protsendi. Seni on võltsitud (0) ja tegelike andmete (1) protsent:

0 0.555394
1 0.444606
Name: class, dtype: float64

See tähendab, et ligikaudu (~) 56% meie andmekogumist on võltsitud ja 44% sellest on reaalne. See annab meile 56%-44% suhte, mis on sama, mis 12% erinevus. Seda peetakse statistiliselt väikeseks erinevuseks, kuna see on vaid veidi üle 10%, seega peetakse andmeid tasakaalustatuks. Kui 56:44 proportsiooni asemel oleks proportsioon 80:20 või 70:30, siis meie andmed loetaks tasakaalustamata ja meil oleks vaja teha tasakaalustamatuse ravi, kuid õnneks see nii ei ole.

Seda erinevust näeme ka visuaalselt, kui vaatame klassi või sihtmärgi jaotust Pandasse immutatud histogrammi abil, kasutades:

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

See joonistab histogrammi, kasutades andmeraami struktuuri otse koos matplotlib raamatukogu, mis on kulisside taga.

SVM-i ja kerneli SVM-i juurutamine Pythoni Scikit-Learn PlatoBlockchain andmeanalüüsiga. Vertikaalne otsing. Ai.

Histogrammi vaadates võime olla kindlad, et meie sihtväärtused on kas 0 või 1 ja andmed on tasakaalus.

See oli veeru analüüs, mida me püüdsime ennustada, aga kuidas on meie andmete teiste veergude analüüsimisega?

Saame vaadata statistilisi mõõtmisi rakendusega describe() andmeraami meetod. Saame ka kasutada .T transponeerimine – veergude ja ridade ümberpööramiseks, muutes väärtuste võrdlemise otsesemaks:

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

bankdata.describe().T

Selle tulemuseks on:

 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

Pange tähele, et kaldsuse ja kurtoosi veergude keskmised väärtused on standardhälbe väärtustest kaugel. See näitab, et need väärtused, mis on andmete kesksest tendentsist kaugemal või on suurema varieeruvusega.

Saame ka visuaalselt vaadata iga funktsiooni jaotust, joonistades iga funktsiooni histogrammi for-tsükli sisse. Lisaks jaotuse vaatamisele oleks huvitav vaadata, kuidas iga klassi punktid iga tunnuse osas eraldatakse. Selleks saame joonistada hajuvusdiagrammi, moodustades nende vahel tunnuste kombinatsiooni, ja määrata igale punktile erinevad värvid vastavalt selle klassile.

Alustame iga funktsiooni jaotusega ja joonistame iga andmeveeru, välja arvatud veeru, histogrammi class veerg. class veergu ei võeta arvesse selle asukoha alusel pangaandmete veergude massiivis. Valitakse kõik veerud, välja arvatud viimane, millel on columns[:-1]:

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

Pärast ülaltoodud koodi käivitamist näeme, et mõlemad skewness ja entropy andmete jaotused on negatiivselt kallutatud ja curtosis on positiivselt viltu. Kõik jaotused on sümmeetrilised ja variance on ainus normaallähedane jaotus.

Nüüd saame liikuda teise osa juurde ja joonistada iga muutuja hajuvusdiagrammi. Selleks saame valida ka kõik veerud peale klassi koos columns[:-1], kasutage Seaborni oma scatterplot() ja kaks silmust, et saada iga funktsiooni sidumise variatsioonid. Samuti võime välistada funktsiooni sidumise iseendaga, testides, kas esimene omadus võrdub teise funktsiooniga 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();

Pange tähele, et kõigil graafikutel on nii tegelikud kui ka võltsitud andmepunktid, mis ei ole üksteisest selgelt eraldatud, mis tähendab, et klasside superpositsioon on mingisugune. Kuna SVM-mudel kasutab klasside eraldamiseks joont, kas neid graafikutel olevaid rühmi saab eraldada ainult ühe reaga? Tundub ebatõenäoline. Nii näevad välja enamik tegelikke andmeid. Kõige lähemale eraldumisele saame jõuda kombinatsioonis skewness ja variancevõi entropy ja variance krundid. See on tõenäoliselt tingitud variance andmed, mille jaotuskuju on normaalsele lähemal.

Kuid kõigi nende graafikute järjestikune vaatamine võib olla veidi raske. Meil on võimalus vaadata kõiki jaotus- ja hajuvusgraafikuid koos, kasutades Seaborni graafikut pairplot().

Mõlemad eelmised for-tsüklid, mida me tegime, saab asendada ainult selle reaga:

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

Paarisplaani vaadates tundub, et tegelikult curtosis ja variance oleks lihtsaim funktsioonide kombinatsioon, nii et erinevad klassid võiks olla eraldatud joonega või lineaarselt eraldatavad.

Kui enamik andmeid pole kaugeltki lineaarselt eraldatavad, võime proovida neid eeltöödelda, vähendades nende mõõtmeid, ja normaliseerida ka väärtusi, et jaotust normaalväärtusele lähemale viia.

Sel juhul kasutame andmeid sellisel kujul, nagu need on, ilma täiendava eeltöötluseta ja hiljem saame minna sammu võrra tagasi, lisada andmete eeltöötlusele ja võrrelda tulemusi.

Nõuanne: Andmetega töötamisel läheb teave tavaliselt nende teisendamisel kaduma, sest me teeme ligikaudseid andmeid, selle asemel, et koguda rohkem andmeid. Algandmetega töötamine, kui see on võimalik, pakub enne muude eeltöötlusmeetodite proovimist lähteseisu. Seda teed järgides saab algandmeid kasutavat tulemust võrrelda teise tulemusega, mis kasutab andmete eeltöötlustehnikaid.

Märge: Tavaliselt on statistikas mudelite koostamisel tavaline järgida protseduuri, mis sõltub andmete liigist (diskreetne, pidev, kategooriline, numbriline), nende jaotusest ja mudeli eeldustest. Arvutiteaduses (CS) on rohkem ruumi katseteks, vigadeks ja uuteks iteratsioonideks. CS-is on tavaline, et võrdluseks on lähtejoon. Scikit-learnis on näidimudelite (või näivate hindajate) rakendus, mõned neist pole paremad kui mündi viskamine ja lihtsalt vastavad. jah (või 1) 50% ajast. Tulemuste võrdlemisel on huvitav kasutada tegeliku mudeli lähtealusena näivaid mudeleid. Eeldatakse, et tegelikud mudelitulemused on paremad kui juhuslikud oletused, vastasel juhul poleks masinõppemudeli kasutamine vajalik.

SVM-i juurutamine Scikit-Learniga

Enne SVM-i toimimise teooriaga põhjalikumat tutvumist saame andmete ja Scikit-Learni andmete põhjal luua oma esimese baasmudeli. Toetage vektorite klassifikaatorit or SVC klass.

Meie mudel võtab vastu lainekoefitsiendid ja proovib neid klassi alusel klassifitseerida. Selle protsessi esimene samm on koefitsientide eraldamine või Omadused klassist või sihtmärk. Pärast seda sammu on teine ​​samm andmete edasine jagamine komplektiks, mida kasutatakse mudeli õppimiseks või rongikomplekt ja veel üks, mida kasutatakse mudeli hindamisel või katsekomplekt.

Märge: Testi ja hindamise nomenklatuur võib veidi segadust tekitada, sest saate oma andmed jagada ka rongi-, hindamis- ja testikomplektide vahel. Sel moel oleks teil kahe komplekti asemel vahekomplekt, mida kasutada ja vaadata, kas teie mudeli jõudlus paraneb. See tähendab, et mudelit koolitatakse rongikomplektiga, täiustatakse hindamiskomplektiga ja saadakse testkomplektiga lõplik mõõdik.

Mõned inimesed ütlevad, et hindamine on see vahekomplekt, teised ütlevad, et testikomplekt on vahekomplekt ja hindamiskomplekt on lõplik komplekt. See on veel üks viis, kuidas proovida tagada, et mudel ei näe mingil viisil sama näidet või et mõni andmete leke ei juhtu ja mudeli üldistamine toimub viimase komplekti mõõdikute täiustamise teel. Kui soovite seda lähenemisviisi järgida, saate andmeid veel kord jagada, nagu selles kirjeldatud Scikit-Learni train_test_split() – koolitus-, testimis- ja valideerimiskomplektid juhend.

Andmete jagamine rongi/katsekomplektideks

Eelmisel seansil saime andmetest aru ja uurisime neid. Nüüd saame jagada oma andmed kaheks massiiviks – üks nelja funktsiooni jaoks ja teine ​​viienda ehk sihtfunktsiooni jaoks. Kuna tahame klassi ennustada sõltuvalt lainekoefitsientidest, siis meie y on class veerg ja meie X kas variance, skewness, curtosisja entropy veerud.

Sihtmärgi ja funktsioonide eraldamiseks saame omistada ainult class veerust kuni y, jättes selle hiljem andmeraamist välja, et omistada ülejäänud veerud X koos .drop() meetod:

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

Kui andmed on jagatud atribuutideks ja siltideks, saame need edasi jagada rongi- ja testikomplektideks. Seda saab teha käsitsi, kuid model_selection Scikit-Learni raamatukogu sisaldab train_test_split() meetod, mis võimaldab meil andmed juhuslikult rongi- ja katsekomplektideks jagada.

Selle kasutamiseks saame importida raamatukogu, helistada train_test_split() meetod, sisestage X ja y andmed ja defineerige a test_size argumendina edasi anda. Sel juhul määratleme selle järgmiselt 0.20– see tähendab, et 20% andmetest kasutatakse testimiseks ja ülejäänud 80% koolituseks.

See meetod võtab proove juhuslikult, järgides meie määratletud protsenti, kuid austab Xy paare, et proovivõtt ei segaks seost täielikult.

Kuna valimiprotsess on oma olemuselt juhuslik, on meetodi käitamisel alati erinevad tulemused. Samade või reprodutseeritavate tulemuste saamiseks saame defineerida konstandi nimega SEED väärtusega 42.

Selleks saate käivitada järgmise skripti:

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)

Pange tähele, et train_test_split() meetod juba tagastab X_train, X_test, y_train, y_test seab sellises järjekorras. Treenimiseks ja testimiseks eraldatud proovide arvu saame printida, hankides elemendi esimese (0) elemendi shape vara tagastatud korteež:

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

See näitab, et koolituseks on 1097 ja testimiseks 275 proovi.

Modelli koolitamine

Oleme jaganud andmed rongi- ja katsekomplektideks. Nüüd on aeg luua ja treenida rongi andmetel SVM-mudel. Selleks saame importida Scikit-Learni svm raamatukogu koos Toetage vektorite klassifikaatorit klass või SVC klass.

Pärast klassi importimist saame luua sellest eksemplari – kuna loome lihtsat SVM-mudelit, siis püüame oma andmeid lineaarselt eraldada, et saaksime joonistada andmete jagamiseks joone – mis on sama, mis lineaarne funktsioon – määratledes kernel='linear' argumendina klassifikaatori jaoks:

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

Sel viisil püüab klassifikaator leida lineaarset funktsiooni, mis eraldab meie andmed. Peale mudeli loomist treenime seda või sobima see koos rongi andmetega kasutab fit() meetod ja andmine X_train funktsioonid ja y_train sihtmärgid argumentidena.

Mudeli koolitamiseks saame käivitada järgmise koodi:

svc.fit(X_train, y_train)

Niisama modelli koolitatakse. Seni oleme andmetest aru saanud, need jaganud, loonud lihtsa SVM-mudeli ja sobitanud mudeli rongiandmetega.

Järgmine samm on mõista, kui hästi see sobivus meie andmeid kirjeldas. Teisisõnu, vastata, kas lineaarne SVM oli piisav valik.

Ennustuste tegemine

Üks viis vastata, kas mudelil õnnestus andmeid kirjeldada, on arvutada ja vaadata mõnda klassifikatsiooni meetrika.

Arvestades, et õpe on juhendatud, saame ennustada X_test ja võrrelda neid ennustustulemusi – mida võiksime nimetada y_pred – tegelikuga y_testvõi maatõde.

Mõnede andmete ennustamiseks mudeli oma predict() meetodit saab kasutada. See meetod saab testimisfunktsioonid, X_test, argumendina ja tagastab iga ennustuse, kas 0 või 1 X_test'i read.

Pärast ennustamist X_test andmed salvestatakse tulemused a y_pred muutuv. Seega on kõik lihtsa lineaarse SVM-mudeliga ennustatud klassid nüüd loendis y_pred muutuja.

See on ennustuskood:

y_pred = svc.predict(X_test)

Arvestades, et meil on ennustused olemas, saame neid nüüd tegelike tulemustega võrrelda.

Mudeli hindamine

Prognooside võrdlemiseks tegelike tulemustega on mitu võimalust ja need mõõdavad klassifikatsiooni erinevaid aspekte. Mõned enimkasutatavad klassifitseerimismõõdikud on järgmised:

  1. Segadusmaatriks: kui me peame teadma, kui palju proove saime õigesti või valesti iga klass. Väärtused, mis olid õiged ja õigesti ennustatud, nimetatakse tõelised positiivsed küljed, nimetatakse neid, mis olid positiivsed, kuid ei olnud positiivsed valepositiivsed. Sama nomenklatuur tõelised negatiivsed ja valenegatiivid kasutatakse negatiivsete väärtuste jaoks;

  2. Täpsus: kui meie eesmärk on mõista, milliseid õigeid ennustusväärtusi meie klassifikaator õigeks pidas. Täpsus jagab need tõelised positiivsed väärtused proovidega, mida ennustati positiivseteks;

$$
täpsus = frac{tekst{tõelised positiivsed}}{tekst{tõelised positiivsed} + tekst{valepositiivsed}}
$$

  1. Tagasikutsumine: arvutatakse tavaliselt koos täpsusega, et mõista, kui palju tõelisi positiivseid omadusi meie klassifikaator tuvastas. Tagasikutsumine arvutatakse, jagades tõelised positiivsed väärtused kõigega, mida oleks pidanud positiivseks ennustama.

$$
meenutamine = frac{tekst{tõelised positiivsed}}{tekst{tõelised positiivsed} + tekst{valedegatiivsed}}
$$

  1. F1 skoor: on tasakaalustatud või harmooniline keskmine täpsusest ja meeldejätmisest. Väikseim väärtus on 0 ja kõrgeim on 1. Millal f1-score on võrdne 1-ga, see tähendab, et kõik klassid olid õigesti ennustatud – seda on reaalsete andmetega väga raske saada (erandeid on peaaegu alati).

$$
tekst{f1-skoor} = 2* frac{tekst{täpsus} * tekst{taaskutsumine}}{tekst{täpsus} + tekst{taaskutsumine}}
$$

Oleme juba tuttavad segaduse maatriksi, täpsuse, tagasikutsumise ja F1 skoori mõõtmisega. Nende arvutamiseks saame importida Scikit-Learni metrics raamatukogu. See raamatukogu sisaldab classification_report ja confusion_matrix meetodite puhul tagastab klassifitseerimisaruande meetod täpsuse, tagasikutsumise ja f1 skoori. Mõlemad classification_report ja confusion_matrix saab hõlpsasti kasutada kõigi nende oluliste mõõdikute väärtuste leidmiseks.

Mõõdikute arvutamiseks impordime meetodid, kutsume need välja ja edastame argumentidena prognoositud klassifikatsioonid, y_test, ja klassifikatsioonisildid või y_true.

Segadusmaatriksi paremaks visualiseerimiseks võime selle joonistada Seaborn's heatmap koos kogusemärkustega ja klassifitseerimisaruande jaoks on kõige parem printida selle tulemus, nii et selle tulemused on vormindatud. See on järgmine kood:

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

See kuvab:

 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-i ja kerneli SVM-i juurutamine Pythoni Scikit-Learn PlatoBlockchain andmeanalüüsiga. Vertikaalne otsing. Ai.

Me teame, et klassifitseerimisaruandes on võltsitud rahatähtede või klassi 0.99 täpsus 0.99, tagasikutsumine 1 ja f0.99 skoor 0. Need mõõtmised saadi 148 proovi abil, nagu on näidatud tugiveerus. Vahepeal oli 1. klassi ehk pärisnootide puhul tulemus ühe ühiku võrra madalam, täpsus 0.98, meeldetuletus 0.98 ja sama f1 skoor. Seekord kasutati nende tulemuste saamiseks 127 pildimõõtmist.

Kui vaatame segadusmaatriksit, siis näeme ka, et 148-st klassi 0 proovist oli 146 õigesti klassifitseeritud ja valepositiivseid oli 2, samas kui 127 klassi 1 proovi puhul oli 2 valenegatiivset ja 125 tõelist positiivset.

Me võime lugeda klassifikatsiooniaruannet ja segadusmaatriksit, kuid mida need tähendavad?

Tulemuste tõlgendamine

Tähenduse väljaselgitamiseks vaatame kõiki mõõdikuid kombineeritult.

Peaaegu kõik 1. klassi proovid olid õigesti klassifitseeritud, tegelike pangatähtede tuvastamisel oli meie mudeli puhul 2 viga. See on sama, mis 0.98 ehk 98% tagasikutsumisest. Midagi sarnast võib öelda ka 0-klassi kohta, ainult 2 proovi klassifitseeriti valesti, samas kui 148 on tõelised negatiivsed, mis teeb kokku 99% täpsusega.

Peale nende tulemuste märgivad kõik teised 0.99, mis on peaaegu 1, mis on väga kõrge näitaja. Enamasti, kui nii kõrge mõõdik juhtub tegelike andmetega, võib see viidata mudelile, mis on andmetega üle kohandatud või ülekomplekteeritud.

Ülesobivuse korral võib mudel juba teadaolevate andmete ennustamisel hästi toimida, kuid kaotab võime üldistada uusi andmeid, mis on reaalse maailma stsenaariumide puhul oluline.

Kiire test, et teada saada, kas toimub liigne sobivus, on ka rongi andmetega. Kui mudel on rongi andmed mõnevõrra meelde jätnud, on mõõdikud väga lähedal 1-le või 100%. Pidage meeles, et rongi andmed on suuremad kui katseandmed – sel põhjusel – proovige neid vaadata proportsionaalselt, rohkem proove, rohkem vigu, välja arvatud juhul, kui tegemist on üleliigsusega.

Rongiandmetega ennustamiseks võime korrata seda, mida oleme katseandmete jaoks teinud, kuid nüüd 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))

See annab väljundi:

 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-i ja kerneli SVM-i juurutamine Pythoni Scikit-Learn PlatoBlockchain andmeanalüüsiga. Vertikaalne otsing. Ai.

On lihtne näha, et see näib olevat liigne, kui rongi mõõdikud on 99%, kui andmeid on neli korda rohkem. Mida saab selle stsenaariumi korral teha?

Ülesobivuse taastamiseks saame lisada rohkem rongivaatlusi, kasutada treeningmeetodit andmestiku erinevate osadega, nt. ristvalideerimineja muuta ka vaikeparameetreid, mis on juba enne treeningut, meie mudeli loomisel olemas või hüperparameetrid. Enamasti määrab Scikit-learn mõned parameetrid vaikimisi ja see võib juhtuda vaikselt, kui dokumentatsiooni lugemiseks pole palju aega pühendatud.

Saate vaadata selle juhendi teist osa (tulekul!), et näha, kuidas rakendada ristvalideerimist ja teostada hüperparameetrite häälestamist.

Järeldus

Selles artiklis uurisime lihtsat lineaarset kerneli SVM-i. Saime SVM-algoritmi taga oleva intuitsiooni, kasutasime tõelist andmestikku, uurisime andmeid ja nägime, kuidas neid andmeid saab kasutada koos SVM-iga, rakendades seda Pythoni Scikit-Learn teegiga.

Harjutamise jätkamiseks võite proovida kasutada muid reaalmaailma andmekogumeid, mis on saadaval sellistes kohtades nagu Kaagutama, UCI, Big Query avalikud andmestikud, ülikoolid ja valitsuse veebisaidid.

Samuti soovitaksin teil uurida SVM-mudeli tegelikku matemaatikat. Kuigi te ei pea seda SVM-algoritmi kasutamiseks ilmtingimata vajama, on siiski väga mugav teada, mis kulisside taga tegelikult toimub, samal ajal kui teie algoritm otsib otsustuspiire.

Ajatempel:

Veel alates Stackabus