SVM-i hüperparameetrite mõistmine

SVM-i hüperparameetrite mõistmine

Sissejuhatus

See juhend on teine ​​osa kolmest tugivektori masinaid (SVM) käsitlevast juhendist. Selles juhendis jätkame töötamist võltsitud pangatähtede kasutamise juhtumiga, mõistame, milliseid SVM-i parameetreid Scikit-learn juba määrab, millised on C- ja Gamma-hüperparameetrid ning kuidas neid ristvalideerimise ja ruudustikuotsingu abil häälestada.

SVM-i juhendite täielikust seeriast saate lisaks SVM-i hüperparameetritele teada ka lihtsa SVM-i, kontseptsiooni, mida nimetatakse kerneli trikkja uurige muud tüüpi SVM-e.

Kui soovite lugeda kõiki juhendeid, heita pilk esimesele juhendile või vaadata, 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

  • 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

Õpime ristvalideerimise rakendamist ja hüperparameetrite häälestamist.

SVM hüperparameetrid

Kõigi Scikit-learni poolt juba määratud mudeli parameetrite ja selle vaikeväärtuste nägemiseks saame kasutada get_params() meetod:

svc.get_params()

See meetod kuvab:

{'C': 1.0, 'break_ties': False, 'cache_size': 200, 'class_weight': None, 'coef0': 0.0, 'decision_function_shape': 'ovr', 'degree': 3, 'gamma': 'scale', 'kernel': 'linear', 'max_iter': -1, 'probability': False, 'random_state': None, 'shrinking': True, 'tol': 0.001, 'verbose': False}

Pange tähele, et kokku on juba seadistatud 15 hüperparameetrit. See juhtub seetõttu, et SVM-algoritmil on palju variatsioone. Oleme kasutanud lineaarset kernelit lineaarse funktsiooni saamiseks, kuid on ka tuumasid, mis kirjeldavad teist tüüpi funktsioone ja need tuumad on erinevatel viisidel parametriseeritud.

Need variatsioonid muudavad mudeli paindlikumaks ja sobivamaks erinevate andmete kujundite vahelise eraldatuse leidmiseks. Kui suudame oma klasside eraldamiseks joone tõmmata, siis a lineaarne tuum on hea valik, kui vajame kõverat, siis a polünoom kernel võib olla parim valik, kui meie andmed on ringikujulised, siis a Radiaalne aluse funktsioon or RBF kernel sobib andmetega paremini, kui väärtusi on üle- ja allapoole läve, a sigmoidne kernel võib klasse paremini eraldada. Andmetes uuritu põhjal näib, et lineaarsest tuumast oleks sobivam kas RBF või polünoomtuum.

Nüüd, kui meil on idee, et erinevaid kerneli funktsioone on 4 tüüpi, võime parameetrite juurde tagasi pöörduda. Kui SVM-algoritm püüab leida klasside vahelist eraldust, oleme juba aru saanud, et see koostab klassifikatsiooni varu tugivektorite ja eraldusjoone (või kõvera) vahel.

See veeris on teatud mõttes nagu puhver eraldusjoone ja punktide vahel. Veerise suurus võib varieeruda, kui veeris on väiksem, on veerisest väljapoole jäävate punktide jaoks vähem ruumi, mis muudab klassidevahelise eraldatuse selgemaks, nii et võetakse rohkem valimeid õigesti klassifitseeritud, vastupidi, kui veeris on suurem, on klasside eraldamine vähem selge ja näidiseid võib olla rohkem valesti klassifitseeritud. Teisisõnu, väiksem varu tähendab korrektsemalt klassifitseeritud valimeid ja ka rohkem jäik klassifikaator, kuigi suurem varu, tähistab rohkem valesti klassifitseeritud proove, kuid rohkem paindlik klassifikaator.

Kui need veerised on valitud, määrab need parameeter C parameeter.

C hüperparameeter

. C parameeter on pöördvõrdeline veerise suurusega, see tähendab, et suurem väärtus C, väiksem marginaal ja vastupidi väiksem väärtus C, suurem marginaal. The C parameetrit saab kasutada koos mis tahes kerneliga, see ütleb algoritmile, kui palju vältida iga treeningnäidise valesti klassifitseerimist, seetõttu nimetatakse seda ka kui seadustamine. Meie lineaarne kerneli SVM on kasutanud a C 1.0, mis on a suur väärtus ja annab a väiksem varu.

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Saame katsetada a väiksem C väärtus ja mõista praktikas, mis juhtub a-ga suurem varu. Selleks loome uue klassifikaatori, svc_cja muuta ainult väärtust C et 0.0001. Kordame ka üle fit ja predict sammud:

svc_c = SVC(kernel='linear', C=0.0001)
svc_c.fit(X_train, y_train)
y_pred_c = svc_c.predict(X_test)

Nüüd saame vaadata katseandmete tulemusi:

print(classification_report(y_test, y_pred_c)) cm_c = confusion_matrix(y_test, y_pred_c)
sns.heatmap(cm_c, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001')

See annab väljundi:

 precision recall f1-score support 0 0.82 0.96 0.88 148 1 0.94 0.76 0.84 127 accuracy 0.87 275 macro avg 0.88 0.86 0.86 275
weighted avg 0.88 0.87 0.86 275

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Kasutades väiksemat C ja suurema varu saamisel on klassifikaator muutunud paindlikumaks ja rohkemate klassifitseerimisvigadega. Klassifitseerimisaruandes näeme, et f1-score, mis oli varem mõlema klassi puhul 0.99, langes 0.88. klassi puhul 0-ni ja 0.84. klassi puhul 1-ni. Segaduste maatriksis muutus mudel 2-lt 6-le valepositiivsele ja 2-lt 31-le valepositiivsele.

Võime ka korrata predict samm ja vaadake tulemusi, et kontrollida, kas rongi andmete kasutamisel on ikka veel liiga palju.

y_pred_ct = svc_c.predict(X_train) cm_ct = confusion_matrix(y_train, y_pred_ct)
sns.heatmap(cm_ct, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001 and train data') print(classification_report(y_train, y_pred_ct))

Selle tulemuseks on:

 precision recall f1-score support 0 0.88 0.96 0.92 614 1 0.94 0.84 0.88 483 accuracy 0.90 1097 macro avg 0.91 0.90 0.90 1097
weighted avg 0.91 0.90 0.90 1097

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Vaadates tulemusi väiksemaga C ja rongiandmed, näeme, et liigne sobivus on paranenud, kuid kui enamik mõõdikuid on rongiandmete puhul ikka veel kõrgemad, siis tundub, et liigne sobivus pole lahendatud. Niisiis, lihtsalt muutke C parameetrist ei piisanud mudeli paindlikumaks muutmiseks ja selle üldistuse parandamiseks.

märkused: Püüab leida tasakaalu andmetest liiga kaugele jääva, liiga fikseeritud funktsiooni või funktsiooni olemasolu vahel kõrge eelarvamus või see on vastupidine, funktsioon, mis sobib andmetega, on liiga paindlik või millel on kõrge dispersioon on tavaliselt viidatud kui erapoolikuse dispersiooni kompromiss. Selle tasakaalu leidmine ei ole triviaalne, kuid kui see saavutatakse, ei toimu mudelit andmetega ala- ega ülepaigutamist. Dispersiooni vähendamiseks ja ülepaigutamise vältimiseks saab andmeid ühtlaselt kahandada, et muuta need korrapärasemaks ja lihtsustada neid kirjeldava funktsiooni hankimisel. See on see parameeter C teeb, kui seda kasutatakse SVM-is, sel põhjusel nimetatakse seda ka L2 seadustamine or Ridge'i regressioon.

Siiani oleme aru saanud SVM-i veeristest ja sellest, kuidas need mõjutavad algoritmi üldist tulemust, aga kuidas on lood klasse eraldava joonega (või kõveraga)? See rida on otsuse piir. Seega, me juba teame, et marginaalid mõjutavad otsustuspiiride paindlikkust vigade suhtes, nüüd saame heita pilgu teisele parameetrile, mis mõjutab ka otsustuspiiri.

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!

märkused: Otsustuspiiri võib nimetada ka a hüperplaan. Hüpertasand on geomeetriline mõiste, mis viitab ruumi mõõtmete arvule miinus üks (dims-1). Kui ruum on kahemõõtmeline, näiteks x- ja y-koordinaatidega tasapind, on 2-mõõtmelised jooned (või kõverad) hüpertasandid. Kuna masinõppe kontekstis on mudelis kasutatavate veergude arv selle tasapinna mõõtmed, siis 1 veeru ja SVM-klassifikaatoriga töötades leiame 4-mõõtmelise hüpertasandi, mis eraldab klassid.

Gamma hüperparameeter

Valida saab lõpmatu arvu otsustuspiire, mõned neist piiridest eraldavad klasse ja teised mitte. Kas tõhusa otsustuspiiri valimisel tuleks arvestada iga klassi esimese 10 lähima punktiga? Või tuleks kaaluda rohkem punkte, sealhulgas neid, mis on kaugel? SVM-is määrab selle vahemiku valiku mõni teine ​​hüperparameeter, gamma.

nagu C, gamma on mõnevõrra pöördvõrdeline selle kaugusega. The rohkem selle väärtus, Lähim on punktid, mida võetakse otsuse piiriks, ja madalaim the,en gamma, kaugemal punkte arvestatakse ka otsustuspiiri valikul.

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Veel üks gamma mõju seisneb selles, et mida kõrgem on selle väärtus, seda rohkem läheneb otsustuspiiri ulatus seda ümbritsevatele punktidele, muutes selle sakilisemaks ja kalduvamaks üle sobituma – ja mida madalam on selle väärtus, seda sujuvam ja korrapärasem on otsustuspiir. pind muutub ka vähem altid liigsobivusele. See kehtib iga hüpertasandi kohta, kuid seda on lihtsam jälgida, kui eraldada andmeid suuremates mõõtmetes. Mõnedes dokumentides gamma võib viidata ka kui sigma.

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Meie mudeli puhul vaikeväärtus gamma oli scale. Nagu võib näha Scikit-learn SVC dokumentatsioon, tähendab see, et selle väärtus on:

$$
gamma = (1/ tekst{n_funktsioonid} * X.var())
$$

or

$$
gamma = (1/ tekst{omaduste_arv} * tekst{funktsioonide_variance})
$$

Meie puhul peame arvutama dispersiooni X_train, korrutage see 4-ga ja jagage tulemus 1-ga. Seda saame teha järgmise koodiga:

number_of_features = X_train.shape[1] features_variance = X_train.values.var()
gamma = 1/(number_of_features * features_variance)
print('gamma:', gamma)

See annab väljundi:

gamma: 0.013924748072859962

On ka teine ​​viis väärtust vaadata gamma, pääsedes juurde klassifikaatori objektile gamma parameeter koos ._gamma:

svc._gamma 

Näeme, et gamma meie klassifikaatoris kasutatud oli madal, seega arvestati ka kaugemate punktidega.

märkused: Nagu nägime, C ja gamma on mõne mudeli määratluse jaoks olulised. Teine hüperparameeter, random_state, kasutatakse sageli Scikit Learnis, et tagada mudelite jaoks andmete segamine või juhuslik seeme, nii et meil on alati samad tulemused, kuid SVM-ide puhul on see pisut erinev. Eelkõige, random_state sellel on mõju ainult siis, kui mõni muu hüperparameeter, probability, on seatud tõeseks. Selle põhjuseks on asjaolu, et see segab andmeid tõenäosushinnangute saamiseks. Kui me ei soovi oma klassidele tõenäosuse hinnanguid ja tõenäosus on seatud vääraks, siis SVM random_state parameeter ei mõjuta mudeli tulemusi.

Hüperparameetrite (nt C ja gamma) väärtuste valimisel pole reeglit – see sõltub sellest, kui kaua ja millised ressursid on erinevate hüperparameetri väärtustega katsetamiseks saadaval, milliseid teisendusi saab andmetes teha ja milliseid tulemusi oodatakse. . Tavaline viis hüperparameetri väärtuste otsimiseks on kombineerida kõik pakutud väärtused läbi a võrguotsing koos protseduuriga, mis rakendab neid hüperparameetrite väärtusi ja hangib mõõdikuid kutsutud andmete erinevate osade jaoks ristvalideerimine. Scikit-learnis on see juba rakendatud GridSearchCV (CV ristvalideerimisest) meetod.

Ristvalideerimisega ruudustikuotsingu käivitamiseks peame importima GridSearchCV, määratlege sõnastik katsetatavate hüperparameetrite väärtustega, näiteks kernel, vahemik CNing gamma, looge eksemplar SVC, määratlege score või mõõdikut kasutatakse hindamiseks (siin valime optimeerimise nii täpsuse kui ka meeldetuletuse jaoks, seega kasutame f1-score), jaotuste arv, mis otsingu käivitamiseks andmetes tehakse cv – vaikimisi on 5, kuid hea tava on kasutada vähemalt 10 – siin kasutame 5 andmevolti, et tulemuste võrdlemisel oleks selgem.

. GridSearchCV on fit meetod, mis võtab vastu meie rongiandmed ja jagab need ristvalideerimiseks rongi- ja katsekomplektideks. Saame sättida return_train_score tõeseks, et võrrelda tulemusi ja garanteerida, et ei esine ülemäärast sobivust.

See on ristvalideerimisega ruudustikuotsingu kood:

from sklearn.model_selection import GridSearchCV parameters_dictionary = {'kernel':['linear', 'rbf'], 'C':[0.0001, 1, 10], 'gamma':[1, 10, 100]}
svc = SVC() grid_search = GridSearchCV(svc, parameters_dictionary, scoring = 'f1', return_train_score=True, cv = 5, verbose = 1) grid_search.fit(X_train, y_train)

See kood väljastab:

Fitting 5 folds for each of 18 candidates, totalling 90 fits
# and a clickable GridSeachCV object schema

Pärast hüperparameetrite otsingut saame kasutada best_estimator_, best_params_ ja best_score_ omadused, et saada parim mudel, parameetrite väärtused ja kõrgeim f1-skoor:

best_model = grid_search.best_estimator_
best_parameters = grid_search.best_params_
best_f1 = grid_search.best_score_ print('The best model was:', best_model)
print('The best parameter values were:', best_parameters)
print('The best f1-score was:', best_f1)

Selle tulemuseks on:

The best model was: SVC(C=1, gamma=1)
The best parameter values were: {'C': 1, 'gamma': 1, 'kernel': 'rbf'}
The best f1-score was: 0.9979166666666666

Kinnitades meie esialgset arvamist andmete põhjal, ei ole parimal mudelil lineaarne kernel, vaid mittelineaarne RBF.

Nõuanne: edasisel uurimisel on huvitav, et lisate ruudustiku otsingusse rohkem mittelineaarseid tuumasid.

Mõlemad C ja gamma mille väärtus on 1 ja f1-score on väga kõrge, 0.99. Kuna väärtus on kõrge, siis vaatame, kas tegemist oli ületalitlusega, piiludes keskmisi testi- ja treeningtulemusi, mille oleme tagastanud. cv_results_ objekt:

gs_mean_test_scores = grid_search.cv_results_['mean_test_score']
gs_mean_train_scores = grid_search.cv_results_['mean_train_score'] print("The mean test f1-scores were:", gs_mean_test_scores)
print("The mean train f1-scores were:", gs_mean_train_scores)

Keskmine punktisumma oli:

The mean test f1-scores were: [0.78017291 0. 0.78017291 0. 0.78017291 0. 0.98865407 0.99791667 0.98865407 0.76553515 0.98865407 0.040291 0.98656 0.99791667 0.98656 0.79182565 0.98656 0.09443985] The mean train f1-scores were: [0.78443424 0. 0.78443424 0. 0.78443424 0. 0.98762683 1. 0.98762683 1. 0.98762683 1. 0.98942923 1. 0.98942923 1. 0.98942923 1. ]

Vaadates keskmisi hindeid, näeme, et kõrgeim, 0.99791667, ilmub kaks korda ja mõlemal juhul oli rongiandmete skoor 1. See näitab, et liigne sobivus püsib. Siit oleks huvitav minna tagasi andmete ettevalmistamise juurde ja mõista, kas on mõtet andmeid normaliseerida, teha mingit muud tüüpi andmete teisendust ja ka funktsioonide inseneriga uusi funktsioone luua.

Oleme just näinud tehnikat mudeli hüperparameetrite leidmiseks ja oleme juba maininud midagi lineaarse eraldatavuse, tugivektorite, otsustuspiiride, veeriste maksimeerimise ja kerneli trikkide kohta. SVM on keerukas algoritm, mis sisaldab tavaliselt palju matemaatilisi kontseptsioone ja väikeseid kohandatavaid osi, mida tuleb tervikuks koondamiseks kohandada.

Kombineerime seni nähtu, teeme kokkuvõtte selle kohta, kuidas kõik SVM-i osad töötavad, ja seejärel vaatame mõnda muud kerneli rakendust koos nende tulemustega.

Järeldus

Selles artiklis saime aru Scikit-Learni SVM-i juurutamise vaikeparameetritest. Saime aru, mis on C- ja Gamma-parameetrid ning kuidas nende muutmine võib SVM-mudelit mõjutada.

Samuti õppisime ruudustikuotsingut, et otsida parimaid C- ja gammaväärtusi ning kasutada ristvalideerimist, et tulemusi paremini üldistada ja tagada, et andmelekkeid ei esineks.

Hüperparameetrite häälestamine ruudustikuotsingu ja ristvalideerimisega on andmeteaduses tavaline praktika, seega soovitan tungivalt rakendada tehnikaid, käivitada kood ja näha seoseid hüperparameetri väärtuste ja SVM-ennustuste muutuste vahel.

Ajatempel:

Veel alates Stackabus