SVM:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learnin avulla

SVM:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learnin avulla

esittely

Tämä opas on ensimmäinen osa kolmesta Support Vector Machines (SVM) -oppaasta. Tässä sarjassa käsittelemme väärennetyn seteleiden käyttötapausta, opimme yksinkertaisista SVM:istä, sitten SVM-hyperparametreistä ja lopuksi opimme käsitteen nimeltä ytimen temppu ja tutkia muita SVM-tyyppejä.

Jos haluat lukea kaikki oppaat tai nähdä, mitkä niistä kiinnostavat sinua eniten, alla on taulukko kunkin oppaan käsittelemistä aiheista:

1. SVM:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learnin avulla

  • Käyttötapaus: unohda setelit
  • SVM:iden tausta
  • Yksinkertainen (lineaarinen) SVM-malli
    • Tietoja tietojoukosta
    • Tietojoukon tuonti
    • Tietojoukon tutkiminen
  • SVM:n käyttöönotto Scikit-Learnin avulla
    • Tietojen jakaminen juna-/testisarjoihin
    • Mallin kouluttaminen
    • Ennusteiden tekeminen
    • Mallin arviointi
    • Tulokset

2. SVM-hyperparametrien ymmärtäminen (tulossa pian!)

  • C-hyperparametri
  • Gamma-hyperparametri

3. Muiden SVM-makujen käyttöönotto Pythonin Scikit-Learnin avulla (tulossa pian!)

  • SVM:ien yleinen idea (yhteenveto)
  • Ydin (temppu) SVM
  • Epälineaarisen ytimen SVM:n käyttöönotto Scikit-Learnin avulla
  • Tuodaan kirjastoja
    • Tietojoukon tuominen
    • Tietojen jakaminen ominaisuuksiin (X) ja kohteeseen (y)
    • Tietojen jakaminen juna-/testisarjoihin
    • Algoritmin koulutus
  • Polynominen ydin
    • Ennusteiden tekeminen
    • Algoritmin arviointi
  • Gaussin ydin
    • Ennustus ja arviointi
  • Sigmoid-ydin
    • Ennustus ja arviointi
  • Ei-lineaarisen ytimen suorituskyvyn vertailu

Käyttötapa: väärennetyt setelit

Joskus ihmiset löytävät tavan väärentää seteleitä. Jos joku katsoo näitä muistiinpanoja ja varmistaa niiden pätevyyden, heidän voi olla vaikea pettää häntä.

Mutta mitä tapahtuu, kun jokaista nuottia ei ole katsomassa? Onko olemassa tapaa automaattisesti tietää, ovatko setelit väärennettyjä vai aitoja?

On monia tapoja vastata näihin kysymyksiin. Yksi vastaus on valokuvata jokainen vastaanotettu seteli, verrata sen kuvaa väärennetyn setelin kuvaan ja luokitella se sitten oikeaksi tai väärennetyksi. Kun muistiinpanon vahvistuksen odottaminen saattaa olla työlästä tai kriittistä, olisi myös mielenkiintoista tehdä vertailu nopeasti.

Koska kuvia käytetään, niitä voidaan tiivistää, pienentää harmaasävyiksi ja niiden mittaukset poimia tai kvantisoida. Tällä tavalla vertailu tapahtuisi kuvien mittausten välillä kunkin kuvan pikselin sijaan.

Toistaiseksi olemme löytäneet tavan käsitellä ja vertailla seteleitä, mutta miten ne luokitellaan oikeiksi tai väärennetyiksi? Voimme käyttää koneoppimista luokitteluun. On olemassa luokittelualgoritmi nimeltä Tuki Vector Machine, joka tunnetaan pääasiassa lyhenteestä: svm.

SVM:iden tausta

Vladmir Vapnik ja Alexey Chervonenkis esittelivät SVM:t alun perin vuonna 1968. Tuolloin heidän algoritminsa rajoittui tietojen luokitteluun, joka voitiin erottaa vain yhdellä suoralla viivalla, tai dataan, joka oli lineaarisesti erotettavissa. Voimme nähdä, miltä erotus näyttäisi:

SVM:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learn PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

Yllä olevassa kuvassa meillä on keskellä viiva, jonka kohdalla jotkut pisteet ovat sen vasemmalla ja toiset oikealla puolella. Huomaa, että molemmat pisteryhmät ovat täydellisesti erotettuja, pisteitä ei ole viivan välissä tai edes lähellä sitä. Samankaltaisten pisteiden ja ne jakavan suoran välillä näyttää olevan marginaali, jota kutsutaan marginaaliksi erotusmarginaali. Erotusmarginaalin tehtävänä on suurentaa samanlaisten pisteiden ja ne jakavan viivan välistä tilaa. SVM tekee sen käyttämällä joitain pisteitä ja laskee sen kohtisuorat vektorit tukemaan päätöstä viivan marginaalista. Ne ovat tukivektorit jotka ovat osa algoritmin nimeä. Ymmärrämme niistä lisää myöhemmin. Ja suora, jonka näemme keskellä, löydetään menetelmillä, jotka maksimoida viivan ja pisteiden välinen tila, tai joka maksimoi erotusmarginaalin. Nämä menetelmät ovat peräisin alalta Optimointiteoria.

Juuri näkemässämme esimerkissä molemmat pisteryhmät voidaan erottaa helposti, koska kukin yksittäinen piste on lähellä toisiaan samankaltaisten pisteidensä kanssa ja nämä kaksi ryhmää ovat kaukana toisistaan.

Mutta mitä tapahtuu, jos tietoja ei voida erottaa yhdellä suoralla viivalla? Jos on sotkuisia epäpaikallisia pisteitä tai jos tarvitaan käyrä?

Tämän ongelman ratkaisemiseksi SVM:ää jalostettiin myöhemmin 1990-luvulla, jotta se pystyi luokittelemaan myös tietoja, joissa oli pisteitä, jotka olivat kaukana sen keskeisestä suuntauksesta, kuten poikkeavia arvoja, tai monimutkaisempia ongelmia, joilla oli enemmän kuin kaksi ulottuvuutta ja joita ei voitu erottaa lineaarisesti. .

Ihmeellistä on, että vasta viime vuosina SVM:t ovat yleistyneet, mikä johtuu pääasiassa niiden kyvystä saada joskus yli 90 % oikeista vastauksista tai tarkkuus, vaikeisiin ongelmiin.

SVM:t toteutetaan ainutlaatuisella tavalla verrattuna muihin koneoppimisalgoritmeihin, kun ne perustuvat tilastollisiin selityksiin siitä, mitä oppiminen on, tai Tilastollisen oppimisen teoria.

Tässä artikkelissa näemme, mitä Support Vector Machines -algoritmit ovat, lyhyt teoria tukivektorikoneen takana ja niiden toteutus Pythonin Scikit-Learn-kirjastossa. Siirrymme sitten kohti toista SVM-konseptia, joka tunnetaan nimellä Ytimen SVMtai Ytimen temppu, ja toteuttaa sen myös Scikit-Learnin avulla.

Yksinkertainen (lineaarinen) SVM-malli

Tietoja tietojoukosta

Johdannossa annetun esimerkin mukaisesti käytämme tietojoukkoa, jossa on mittauksia todellisista ja väärennettyjen seteleiden kuvista.

Kun katsomme kahta nuottia, silmämme yleensä skannaavat niitä vasemmalta oikealle ja tarkistavat, missä saattaa olla yhtäläisyyksiä tai eroja. Etsimme mustaa pistettä ennen vihreää pistettä tai kiiltävää merkkiä, joka on kuvan yläpuolella. Tämä tarkoittaa, että on olemassa järjestys, jossa tarkastelemme muistiinpanoja. Jos tietäisimme, että on vihreitä ja mustia pisteitä, mutta emme jos vihreä piste tulee ennen mustaa tai jos musta tulisi ennen vihreää, nuottien erottaminen olisi vaikeampaa.

On olemassa samanlainen menetelmä kuin mitä juuri kuvaimme, ja sitä voidaan soveltaa seteleiden kuviin. Yleisesti ottaen tämä menetelmä koostuu siitä, että kuvan pikselit muunnetaan signaaliksi, minkä jälkeen otetaan huomioon järjestys, jossa kukin eri signaali tapahtuu kuvassa muuntamalla se pieniksi aalloksi, tai aallokkeita. Kun aallot on saatu, on tapa tietää järjestys, jossa jokin signaali tapahtuu ennen toista, tai aika, mutta ei tarkalleen mikä signaali. Tämän ymmärtämiseksi kuvan taajuudet on hankittava. Ne saadaan menetelmällä, joka hajottaa jokaisen signaalin, ns Fourier-menetelmä.

Kun aikaulottuvuus on saatu aalloilla ja taajuusulottuvuus Fourier-menetelmällä, tehdään ajan ja taajuuden päällekkäisyys, jotta nähdään, milloin molemmilla on täsmäys. poimu analyysi. Konvoluutio saa sovituksen, joka sovittaa aallot kuvan taajuuksiin ja selvittää, mitkä taajuudet ovat näkyvämpiä.

Tätä menetelmää, jossa etsitään aallot, niiden taajuudet ja sitten sovitetaan molemmat, kutsutaan Wavelet-muunnos. Aallokemuunnoksella on kertoimet, ja niitä käytettiin aineistossa olevien mittausten saamiseksi.

Tietojoukon tuonti

Seteleiden tietojoukko, jota aiomme käyttää tässä osiossa, on sama, jota käytettiin päätöspuun opetusohjelma.

Huomautus: Voit ladata tietojoukon tätä.

Tuodaan tiedot pandoille dataframe rakennetta ja katso sen viisi ensimmäistä riviä head() menetelmällä.

Huomaa, että tiedot on tallennettu a txt (teksti)tiedostomuodossa pilkuilla erotettuna, ja se on ilman otsikkoa. Voimme rekonstruoida sen taulukoksi lukemalla sen a csv, jossa määritellään separator pilkuksi ja lisäämällä sarakkeiden nimet names Perustelu.

Noudatetaan näitä kolmea vaihetta kerralla ja katsotaan sitten tietojen viittä ensimmäistä riviä:

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

Tämä johtaa:

	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

Huomautus: Voit myös tallentaa tiedot paikallisesti ja korvata data_link varten data_path, ja välitä polku paikalliseen tiedostoon.

Näemme, että tietojoukossamme on viisi saraketta, nimittäin variance, skewness, curtosis, entropyja class. Viiden rivin neljä ensimmäistä saraketta on täytetty numeroilla, kuten 3.62160, 8.6661, -2.8073 tai jatkuva arvot ja viimeinen class sarakkeen viisi ensimmäistä riviä on täytetty nollalla tai a erillinen arvoa.

Koska tavoitteenamme on ennustaa, onko seteli aito vai ei, voimme tehdä sen setelin neljän ominaisuuden perusteella:

  • variance of Wavelet Transformed image. Yleensä varianssi on jatkuva arvo, joka mittaa kuinka paljon datapisteet ovat lähellä tai kaukana datan keskiarvosta. Jos pisteet ovat lähempänä aineiston keskiarvoa, on jakauma lähempänä normaalijakaumaa, mikä yleensä tarkoittaa, että sen arvot ovat paremmin jakautuneet ja jonkin verran helpompi ennustaa. Nykyisessä kuvakontekstissa tämä on aallokemuunnoksen tuloksena olevien kertoimien varianssi. Mitä pienempi varianssi, sitä lähempänä kertoimet olivat todellisen kuvan kääntämistä.

  • skewness of Wavelet Transformed image. Vino on jatkuva arvo, joka ilmaisee jakauman epäsymmetriaa. Jos keskiarvon vasemmalla puolella on enemmän arvoja, jakauma on negatiivisesti vinossa, jos keskiarvon oikealla puolella on enemmän arvoja, jakauma on positiivisesti vinossa, ja jos keskiarvo, tila ja mediaani ovat samat, jakauma on symmetrinen. Mitä symmetrisempi jakauma on, sitä lähempänä normaalijakaumaa se on ja sen arvot ovat myös paremmin jakautuneet. Tässä yhteydessä tämä on aallokemuunnoksen aiheuttamien kertoimien vinoutuma. Mitä symmetrisempi, sitä lähempänä kerrointa olemmevariance, skewness, curtosis, entropytodellisen kuvan kääntämiseen.

SVM:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learn PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

  • curtosis (tai kurtosis) of Wavelet Transformed image. Kurtosis on jatkuva arvo, joka vinouden tavoin kuvaa myös jakauman muotoa. Kurtoosikertoimesta (k) riippuen jakauma – normaalijakaumaan verrattuna voi olla enemmän tai vähemmän tasainen – tai sillä on enemmän tai vähemmän dataa ääri- tai pyrstöissään. Kun jakauma on laajempi ja tasaisempi, sitä kutsutaan platykurtic; kun se on vähemmän levinnyt ja keskittynyt keskelle, mesokurtic; ja kun jakauma on lähes kokonaan keskittynyt keskelle, sitä kutsutaan leptokurtic. Tämä on sama tapaus kuin varianssin ja vinouden aiemmat tapaukset, mitä mesokurttisempi jakauma on, sitä lähempänä kertoimet olivat todellisen kuvan kääntämistä.

SVM:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learn PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

  • entropy kuvasta. Entropia on myös jatkuva arvo, se mittaa yleensä järjestelmän satunnaisuutta tai epäjärjestystä. Kuvan yhteydessä entropia mittaa pikselin ja sen viereisten pikselien välistä eroa. Meidän kontekstissamme mitä enemmän entropiaa kertoimilla on, sitä enemmän häviötä tapahtui kuvaa muunnettaessa – ja mitä pienempi entropia, sitä pienempi informaatiohäviö.

SVM:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learn PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

Viides muuttuja oli class muuttuja, jolla on luultavasti arvot 0 ja 1, jotka kertovat, oliko seteli todellinen vai väärennetty.

Voimme tarkistaa, sisältääkö viides sarake nollia ja ykkösiä Pandan unique() menetelmä:

bankdata['class'].unique()

Yllä oleva menetelmä palauttaa:

array([0, 1]) 

Yllä oleva menetelmä palauttaa taulukon, jonka arvot ovat 0 ja 1. Tämä tarkoittaa, että luokkariveillämme olevat arvot ovat vain nollia ja ykkösiä. Se on valmis käytettäväksi mm tavoite ohjatussa oppimisessamme.

  • class kuvasta. Tämä on kokonaisluku, se on 0, kun kuva on väärennetty, ja 1, kun kuva on todellinen.

Koska meillä on sarake todellisten ja unohdettujen kuvien merkinnöillä, tämä tarkoittaa, että oppimistyyppimme on valvottu.

Neuvo: saadaksesi lisätietoja Wavelet Transformin taustalla olevista perusteluista seteleiden kuvissa ja SVM:n käytöstä, lue tekijöiden julkaistu artikkeli.

Voimme myös nähdä, kuinka monta tietuetta tai kuvaa meillä on, katsomalla tiedoissa olevien rivien määrää shape omaisuus:

bankdata.shape

Tämä tuottaa:

(1372, 5)

Yllä oleva rivi tarkoittaa, että muunnettuja seteleiden kuvia on 1,372 5 riviä ja XNUMX saraketta. Tämä on data, jota aiomme analysoida.

Olemme tuoneet tietojoukkomme ja tehneet muutaman tarkistuksen. Nyt voimme tutkia tietojamme ymmärtääksemme niitä paremmin.

Tietojoukon tutkiminen

Olemme juuri nähneet, että luokkasarakkeessa on vain nollia ja ykkösiä, mutta voimme myös tietää, missä suhteessa ne ovat – toisin sanoen – jos nollia on enemmän kuin ykkösiä, ykkösiä enemmän kuin nollia vai onko nollia on sama kuin ykkösten lukumäärä, eli ne ovat tasapainoinen.

Suhteen tuntemiseksi voimme laskea tiedoissa olevat nolla- ja yksiarvot value_counts() menetelmä:

bankdata['class'].value_counts()

Tämä tuottaa:

0 762
1 610
Name: class, dtype: int64

Yllä olevasta tuloksesta näemme, että nollia on 762 ja ykkösiä 610 eli 152 enemmän nollia kuin ykkösiä. Tämä tarkoittaa, että meillä on vähän enemmän väärennettyjä kuin oikeita kuvia, ja jos tämä ero olisi suurempi, esimerkiksi 5500 nollaa ja 610 ykköstä, se voisi vaikuttaa negatiivisesti tuloksiimme. Kun yritämme käyttää näitä esimerkkejä mallissamme – mitä enemmän esimerkkejä on, se tarkoittaa yleensä sitä, että mitä enemmän tietoja mallilla on valittava väärennettyjen tai oikeiden nuottien välillä – jos oikeita nuotteja on vähän, malli on taipuvainen erehtynyt yrittäessään tunnistaa ne.

Tiedämme jo, että väärennettyjä seteleitä on vielä 152, mutta voimmeko olla varmoja, että ne ovat tarpeeksi esimerkkejä mallin oppimiseen? On erittäin vaikea vastata, kuinka monta esimerkkiä oppimiseen tarvitaan, sen sijaan voimme yrittää ymmärtää prosentteina, kuinka paljon luokkien välinen ero on.

Ensimmäinen askel on käyttää pandoja value_counts() menetelmä uudelleen, mutta katsotaan nyt prosenttiosuus sisällyttämällä argumentti normalize=True:

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

- normalize=True laskee kunkin luokan datan prosenttiosuuden. Tähän mennessä väärennettyjen (0) ja todellisten tietojen (1) prosenttiosuus on:

0 0.555394
1 0.444606
Name: class, dtype: float64

Tämä tarkoittaa, että noin (~) 56 % tietojoukostamme on väärennettyä ja 44 % aitoa. Tämä antaa meille 56% -44% -suhteen, mikä on sama kuin 12%:n ero. Tätä pidetään tilastollisesti pienenä erona, koska se on vain hieman yli 10 %, joten dataa pidetään tasapainoisena. Jos 56:44-suhteen sijaan olisi 80:20 tai 70:30-suhde, tietomme katsottaisiin epätasapainoisiksi ja meidän pitäisi tehdä epätasapainohoitoa, mutta onneksi näin ei ole.

Näemme tämän eron myös visuaalisesti tarkastelemalla luokan tai kohteen jakaumaa Panda-histogrammin avulla käyttämällä:

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

Tämä piirtää histogrammin käyttämällä tietokehysrakennetta suoraan yhdessä matplotlib kirjasto, joka on kulissien takana.

SVM:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learn PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

Katsomalla histogrammia voimme olla varmoja, että tavoitearvomme ovat joko 0 tai 1 ja että tiedot ovat tasapainossa.

Tämä oli sarakkeen analyysi, jota yritimme ennustaa, mutta entä datamme muiden sarakkeiden analysointi?

Voimme tarkastella tilastollisia mittauksia describe() dataframe-menetelmä. Voimme myös käyttää .T transponointi – kääntää sarakkeet ja rivit, mikä tekee arvojen vertaamisesta suorempaa:

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

bankdata.describe().T

Tämä johtaa:

 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

Huomaa, että vinous- ja curtosis-sarakkeiden keskiarvot ovat kaukana keskihajonnan arvoista, mikä tarkoittaa, että ne arvot, jotka ovat kauempana datan keskeisestä suuntauksesta tai joilla on suurempi vaihtelu.

Voimme myös kurkistaa kunkin ominaisuuden jakeluun visuaalisesti piirtämällä kunkin ominaisuuden histogrammin for-silmukan sisään. Jakauman tarkastelun lisäksi olisi mielenkiintoista nähdä, kuinka kunkin luokan pisteet erotetaan kunkin ominaisuuden osalta. Tätä varten voimme piirtää hajontakaavion, joka muodostaa yhdistelmän piirteitä niiden välillä ja määrittää kullekin pisteelle eri värit sen luokkaan nähden.

Aloitetaan kunkin ominaisuuden jakautumisesta ja piirretään kunkin tietosarakkeen histogrammi paitsi sarakkeessa class sarake. class saraketta ei oteta huomioon sen sijainnin perusteella pankkitietosaraketaulukossa. Kaikki sarakkeet valitaan paitsi viimeinen, jossa on columns[:-1]:

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

Yllä olevan koodin suorittamisen jälkeen voimme nähdä, että molemmat skewness ja entropy datajakaumat ovat negatiivisesti vinossa ja curtosis on positiivisesti vinossa. Kaikki jakaumat ovat symmetrisiä ja variance on ainoa jakauma, joka on lähellä normaalia.

Voimme nyt siirtyä toiseen osaan ja piirtää kunkin muuttujan sirontakaavion. Tätä varten voimme myös valita kaikki sarakkeet paitsi luokka, kanssa columns[:-1], käytä Seabornia scatterplot() ja kaksi for-silmukkaa saadakseen kunkin ominaisuuden pariliitoksen vaihtelut. Voimme myös sulkea pois ominaisuuden yhdistämisen itsensä kanssa testaamalla, vastaako ensimmäinen ominaisuus toista 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();

Huomaa, että kaikissa kaavioissa on sekä todellisia että väärennettyjä datapisteitä, jotka eivät ole selvästi erotettu toisistaan, mikä tarkoittaa, että luokkien superpositio on jonkinlainen. Koska SVM-malli käyttää riviä luokkien erottamiseen, voisiko jokin näistä ryhmistä kaavioissa erottaa käyttämällä vain yhtä riviä? Vaikuttaa epätodennäköiseltä. Tältä useimmat todelliset tiedot näyttävät. Lähinnä voimme päästä eroon yhdistelmässä skewness ja variancetai entropy ja variance juonet. Tämä johtuu todennäköisesti siitä variance data, jonka jakauman muoto on lähempänä normaalia.

Mutta kaikkien näiden kaavioiden katsominen peräkkäin voi olla hieman vaikeaa. Meillä on vaihtoehto tarkastella kaikkia jakautumis- ja sirontakaavioita yhdessä Seabornin avulla pairplot().

Molemmat edelliset tekemämme for-silmukat voidaan korvata tällä rivillä:

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

Parikaaviota katsoen näyttää siltä, ​​että itse asiassa curtosis ja variance olisi helpoin yhdistelmä ominaisuuksia, joten eri luokat voitaisiin erottaa viivalla tai lineaarisesti erotettavissa.

Jos suurin osa tiedoista on kaukana lineaarisesti erotettavissa olevasta, voimme yrittää esikäsitellä sen pienentämällä sen mittoja ja myös normalisoida sen arvoja yrittääksemme tehdä jakaumasta lähemmäksi normaalia.

Tässä tapauksessa käytetään tietoja sellaisenaan, ilman lisäkäsittelyä, ja myöhemmin voidaan palata yksi askel taaksepäin, lisätä tietojen esikäsittelyyn ja vertailla tuloksia.

Neuvo: Tiedon kanssa työskennellessä informaatio yleensä katoaa sitä muunnettaessa, koska teemme likiarvoja sen sijaan, että keräämme lisää dataa. Alkutietojen käsitteleminen ensin sellaisenaan, jos mahdollista, tarjoaa lähtötilanteen ennen muiden esikäsittelytekniikoiden kokeilua. Tätä polkua seurattaessa raakadataa käyttävää alkutulosta voidaan verrata toiseen tulokseen, joka käyttää datan esikäsittelytekniikoita.

Huomautus: Yleensä Tilastoissa malleja rakennettaessa noudatetaan prosessia, joka riippuu datan tyypistä (diskreetti, jatkuva, kategoriallinen, numeerinen), sen jakautumisesta ja mallioletuksista. Tietojenkäsittelytieteessä (CS) on enemmän tilaa kokeilulle, virheille ja uusille iteraatioille. CS:ssä on yleistä, että vertailukohtaa voidaan käyttää. Scikit-learnissä on toteutettu valemalleja (tai valeestimaattoreita), joista jotkut eivät ole parempia kuin kolikon heittäminen, ja vain vastaa Joo (tai 1) 50 % ajasta. On mielenkiintoista käyttää dummy-malleja todellisen mallin lähtökohtana tuloksia verrattaessa. Varsinaisten mallitulosten odotetaan olevan parempia kuin satunnainen arvaus, muuten koneoppimismallin käyttäminen ei olisi välttämätöntä.

SVM:n käyttöönotto Scikit-Learnin avulla

Ennen kuin perehdymme paremmin SVM:n toiminnan teoriaan, voimme rakentaa ensimmäisen perusmallimme datan ja Scikit-Learnin avulla. Tuki vektoriluokitusta or SVC luokka.

Mallimme vastaanottaa wavelet-kertoimet ja yrittää luokitella ne luokan perusteella. Ensimmäinen vaihe tässä prosessissa on kertoimet tai piirteet luokasta tai tavoite. Tämän vaiheen jälkeen toinen vaihe on jakaa tiedot edelleen joukoksi, jota käytetään mallin oppimiseen tai junasetti ja toinen, jota käytetään mallin arvioinnissa tai testisarja.

Huomautus: Testin ja arvioinnin nimikkeistö voi olla hieman hämmentävä, koska voit myös jakaa tietosi juna-, arviointi- ja testisarjoihin. Tällä tavalla kahden sarjan sijaan sinulla olisi välisarja, jota voit käyttää ja nähdä, paraneeko mallisi suorituskyky. Tämä tarkoittaa, että mallia koulutettaisiin junasarjan kanssa, parannettaisiin arviointijoukolla ja saataisiin lopullinen metriikka testijoukolla.

Jotkut sanovat, että arviointi on välijoukko, toiset sanovat, että testisarja on välijoukko ja että arviointisarja on lopullinen joukko. Tämä on toinen tapa yrittää taata, että malli ei näe samaa esimerkkiä millään tavalla tai että jonkinlainen tietojen vuotaminen ei tapahdu, ja että on olemassa mallin yleistys viimeksi asetettujen mittareiden parannuksella. Jos haluat noudattaa tätä lähestymistapaa, voit jakaa tiedot vielä kerran tässä kuvatulla tavalla Scikit-Learnin train_test_split() – koulutus-, testaus- ja validointisarjat opas.

Tietojen jakaminen juna-/testisarjoihin

Edellisessä istunnossa ymmärsimme ja tutkimme dataa. Nyt voimme jakaa tietomme kahteen taulukkoon – yksi neljälle ominaisuudelle ja toinen viidennelle eli kohdeominaisuudesta. Koska haluamme ennustaa luokan aallokekertoimista riippuen, meidän y tulee olemaan class kolumni ja meidän X aikooko variance, skewness, curtosisja entropy sarakkeita.

Erottaaksemme kohteen ja ominaisuudet, voimme määrittää vain class sarake kohtaan y, pudottamalla sen myöhemmin tietokehyksestä määrittämään loput sarakkeet X with .drop() menetelmä:

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

Kun tiedot on jaettu attribuuteiksi ja tunnisteiksi, voimme jakaa sen edelleen harjoitus- ja testijoukkoon. Tämä voidaan tehdä käsin, mutta model_selection Scikit-Learnin kirjasto sisältää train_test_split() menetelmä, jonka avulla voimme jakaa tiedot satunnaisesti juna- ja testijoukkoon.

Voit käyttää sitä tuomalla kirjaston soittamalla numeroon train_test_split() menetelmä, mene sisään X ja y tiedot ja määritä a test_size mennä argumenttina. Tässä tapauksessa määrittelemme sen seuraavasti 0.20– Tämä tarkoittaa, että 20 % tiedoista käytetään testaukseen ja loput 80 % koulutukseen.

Tämä menetelmä ottaa satunnaisesti näytteitä määrittämämme prosenttiosuuden mukaisesti, mutta kunnioittaa Xy-pareja, jottei näytteenotto sekoittaisi suhteen täysin.

Koska näytteenottoprosessi on luonnostaan ​​satunnainen, meillä on aina erilaisia ​​​​tuloksia suoritettaessa menetelmää. Jotta voimme saada samat tai toistettavat tulokset, voimme määrittää vakion nimeltä SEED, jonka arvo on 42.

Voit tehdä tämän suorittamalla seuraavan skriptin:

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)

Huomaa, että train_test_split() menetelmä palauttaa jo X_train, X_test, y_train, y_test asettaa tässä järjestyksessä. Voimme tulostaa junaa ja testausta varten eroteltujen näytteiden määrän hankkimalla ensimmäisen (0) elementin shape omaisuus palautettu monikko:

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

Tämä osoittaa, että koulutusta varten on 1097 näytettä ja testausta varten 275 näytettä.

Mallin kouluttaminen

Olemme jakaneet tiedot juna- ja testisarjoihin. Nyt on aika luoda ja kouluttaa SVM-malli junatietoihin. Tätä varten voimme tuoda Scikit-Learnin svm kirjasto yhdessä Tuki vektoriluokitusta luokka, tai SVC luokka.

Luokan tuonnin jälkeen voimme luoda siitä ilmentymän – koska luomme yksinkertaista SVM-mallia, yritämme erottaa tietomme lineaarisesti, jotta voimme jakaa tietomme piirtämällä viivan – mikä on sama kuin käyttämällä lineaarinen funktio – määrittelemällä kernel='linear' argumenttina luokittelijalle:

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

Tällä tavalla luokitin yrittää löytää lineaarisen funktion, joka erottaa tietomme. Mallin luomisen jälkeen harjoitellaan sitä tai sovittaa se, junatietojen kanssa, käyttää fit() menetelmä ja antaminen X_train ominaisuudet ja y_train tavoitteet argumentteina.

Voimme suorittaa seuraavan koodin mallin kouluttamiseksi:

svc.fit(X_train, y_train)

Juuri niin malli on koulutettu. Tähän mennessä olemme ymmärtäneet tiedot, jakaneet sen, luoneet yksinkertaisen SVM-mallin ja sovittaneet mallin junatietoihin.

Seuraava askel on ymmärtää, kuinka hyvin tämä sovitus onnistui kuvaamaan tietojamme. Toisin sanoen vastataan, oliko lineaarinen SVM riittävä valinta.

Ennusteiden tekeminen

Yksi tapa vastata, onnistuiko malli kuvaamaan dataa, on laskea ja tarkastella luokittelua mittarit.

Ottaen huomioon, että oppiminen on ohjattua, voimme tehdä ennusteita X_test ja vertailla näitä ennustustuloksia – joita voimme kutsua y_pred – todellisen kanssa y_testtai perusteellinen totuus.

Joidenkin tietojen ennustamiseksi mallin predict() menetelmää voidaan käyttää. Tämä menetelmä saa testiominaisuudet, X_test, argumenttina ja palauttaa ennusteen, joko 0 tai 1, jokaiselle X_testn rivit.

Ennustamisen jälkeen X_test tiedot, tulokset tallennetaan a y_pred muuttuja. Joten jokainen yksinkertaisella lineaarisella SVM-mallilla ennustettu luokka on nyt mukana y_pred muuttuja.

Tämä on ennustekoodi:

y_pred = svc.predict(X_test)

Koska meillä on ennusteet, voimme nyt verrata niitä todellisiin tuloksiin.

Mallin arviointi

On olemassa useita tapoja verrata ennusteita todellisiin tuloksiin, ja ne mittaavat luokituksen eri näkökohtia. Joitakin eniten käytettyjä luokitusmittareita ovat:

  1. Sekaannusmatriisi: kun meidän on tiedettävä, kuinka paljon näytteitä saimme oikein tai väärin jokainen luokka. Arvoja, jotka olivat oikein ja oikein ennustettu, kutsutaan tosi positiivisia, niitä, joiden ennustettiin olevan positiivisia, mutta jotka eivät olleet positiivisia, kutsutaan vääriä positiivisia. Sama nimikkeistö todellisia negatiivisia ja väärät negatiivit käytetään negatiivisille arvoille;

  2. Tarkkuus: kun tavoitteenamme on ymmärtää, mitä oikeita ennustearvoja luokittelijamme piti oikeina. Tarkkuus jakaa todelliset positiiviset arvot näytteillä, jotka ennustettiin positiivisiksi;

$$
tarkkuus = frac{teksti{tosi positiiviset}}{teksti{tosi positiiviset} + teksti{väärät positiiviset}}
$$

  1. Palauttaa mieleen: lasketaan yleisesti tarkkuudella, jotta saadaan selville, kuinka monta todellista positiivista luokittimemme tunnisti. Palauttaminen lasketaan jakamalla todelliset positiiviset asiat millä tahansa, jonka olisi pitänyt ennustaa positiiviseksi.

$$
muistaminen = frac{teksti{tosi positiiviset}}{teksti{tosi positiiviset} + teksti{väärät negatiivit}}
$$

  1. F1 pisteet: on tasapainoinen tai harmoninen keskiarvo tarkkuudesta ja muistamisesta. Pienin arvo on 0 ja suurin on 1. Milloin f1-score on yhtä suuri kuin 1, se tarkoittaa, että kaikki luokat ennustettiin oikein – tämä on erittäin vaikea pistemäärä saada todellisella tiedolla (poikkeuksia on melkein aina).

$$
teksti{f1-pisteet} = 2* frac{teksti{tarkkuus} * teksti{recall}}{teksti{tarkkuus} + teksti{recall}}
$$

Olemme jo tutustuneet hämmennysmatriisiin, tarkkuuteen, muistamiseen ja F1-pisteisiin. Niiden laskemiseksi voimme tuoda Scikit-Learnin metrics kirjasto. Tämä kirjasto sisältää classification_report ja confusion_matrix menetelmiä, luokitteluraporttimenetelmä palauttaa tarkkuuden, palautuksen ja f1-pisteet. Molemmat classification_report ja confusion_matrix voidaan helposti käyttää kaikkien näiden tärkeiden mittareiden arvojen selvittämiseen.

Mittareiden laskemista varten tuomme menetelmät, kutsumme niitä ja välitämme argumenteiksi ennustetut luokitukset, y_test, ja luokitusmerkinnät tai y_true.

Sekaannusmatriisin paremman visualisoinnin saamiseksi voimme piirtää sen Seaborn'sissa heatmap määrämerkintöjen ja luokitusraportin kanssa on parasta tulostaa sen tulos, jotta sen tulokset muotoillaan. Tämä on seuraava koodi:

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

Tämä näyttää:

 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:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learn PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

Luokitteluraportissa tiedämme, että väärennettyjen seteleiden tarkkuus on 0.99, takaisinkutsu 0.99 ja f1-pistemäärä 0.99 tai luokka 0. Nämä mittaukset saatiin käyttämällä 148 näytettä tukisarakkeen osoittamalla tavalla. Sillä välin luokan 1 eli oikeiden nuottien tulos oli yksi yksikkö pienempi, tarkkuus 0.98, palautus 0.98 ja sama f1-pistemäärä. Tällä kertaa tulosten saamiseksi käytettiin 127 kuvamittausta.

Jos katsomme sekavuusmatriisia, voimme myös nähdä, että 148 luokan 0 näytteestä 146 oli luokiteltu oikein ja niissä oli 2 vääriä positiivisia, kun taas 127 luokan 1 näytteessä oli 2 väärää negatiivista ja 125 todellista positiivista.

Voimme lukea luokitusraportin ja hämmennysmatriisin, mutta mitä ne tarkoittavat?

Tulokset

Selvittääksemme merkityksen, tarkastellaan kaikkia mittareita yhdistettynä.

Melkein kaikki luokan 1 näytteet luokiteltiin oikein, mallissamme oli 2 virhettä varsinaisten seteleiden tunnistamisessa. Tämä on sama kuin 0.98 tai 98 %:n palautus. Jotain vastaavaa voidaan sanoa luokasta 0, vain 2 näytettä luokiteltiin väärin, kun taas 148 ovat todellisia negatiivisia, yhteensä 99 % tarkkuudella.

Näiden tulosten lisäksi kaikki muut antavat arvoa 0.99, mikä on lähes 1, erittäin korkea mittari. Useimmiten, kun tosielämän tiedoilla tapahtuu näin korkea mittari, tämä saattaa olla merkki mallista, joka on liian sopeutunut dataan tai ylisovitettu.

Ylisovitettaessa malli saattaa toimia hyvin jo tiedossa olevan datan ennustamisessa, mutta se menettää kyvyn yleistää uuteen dataan, mikä on tärkeää tosielämän skenaarioissa.

Pikatesti, jolla selvitetään, onko tapahtumassa ylikuormitusta, on myös junatiedoilla. Jos malli on muistanut jonkin verran junatietoja, mittarit ovat hyvin lähellä 1 tai 100 %. Muista, että junadata on suurempi kuin testidata – tästä syystä – yritä katsoa sitä suhteellisesti, enemmän näytteitä, enemmän virheitä, ellei ole ollut ylikuormitusta.

Ennustamaan junatiedoilla voimme toistaa sen, mitä olemme tehneet testitiedoille, mutta nyt 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))

Tämä tuottaa:

 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:n ja ytimen SVM:n käyttöönotto Pythonin Scikit-Learn PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

On helppo nähdä, että yliasennus näyttää olevan, kun junamittarit ovat 99%, kun dataa on 4 kertaa enemmän. Mitä tässä skenaariossa voidaan tehdä?

Ylisovituksen palauttamiseksi voimme lisätä junahavaintoja, käyttää harjoitusmenetelmää tietojoukon eri osien kanssa, kuten esim. ristiin validointi, ja muuta myös oletusparametreja, jotka ovat jo olemassa ennen harjoittelua, luodessasi malliamme tai hyperparametrien. Suurimman osan ajasta Scikit-learn asettaa jotkin parametrit oletusarvoiksi, ja tämä voi tapahtua hiljaa, jos dokumentaation lukemiseen ei ole paljon aikaa.

Voit tarkistaa tämän oppaan toisen osan (tulossa pian!) nähdäksesi kuinka ristiintarkistus toteutetaan ja hyperparametrien viritys suoritetaan.

Yhteenveto

Tässä artikkelissa tutkimme yksinkertaista lineaarista ytimen SVM:ää. Saimme intuition SVM-algoritmin takana, käytimme todellista tietojoukkoa, tutkimme dataa ja näimme kuinka näitä tietoja voidaan käyttää yhdessä SVM:n kanssa toteuttamalla se Pythonin Scikit-Learn-kirjastolla.

Jos haluat jatkaa harjoittelua, voit kokeilla muita reaalimaailman tietojoukkoja, jotka ovat saatavilla esim Kaggle, UCI, Big Queryn julkiset tietojoukot, yliopistot ja valtion verkkosivustot.

Suosittelen myös, että tutkit SVM-mallin takana olevaa varsinaista matematiikkaa. Vaikka et välttämättä tarvitse sitä käyttääksesi SVM-algoritmia, on silti erittäin kätevää tietää, mitä kulissien takana todella tapahtuu, kun algoritmisi etsii päätösrajoja.

Aikaleima:

Lisää aiheesta Stackabus