Implementarea altor arome SVM cu Scikit-Learn de la Python

Implementarea altor arome SVM cu Scikit-Learn de la Python

Introducere

Acest ghid este a treia și ultima parte a trei ghiduri despre suport Vector Machines (SVMs). În acest ghid, vom continua să lucrăm cu cazul de utilizare a bancnotelor falsificate, vom avea o recapitulare rapidă despre ideea generală din spatele SVM-urilor, vom înțelege care este trucul nucleului și vom implementa diferite tipuri de nuclee neliniare cu Scikit-Learn.

În seria completă de ghiduri SVM, pe lângă informații despre alte tipuri de SVM, veți afla și despre SVM simpli, parametrii SVM predefiniti, hiperparametrii C și Gamma și cum pot fi reglați cu căutarea în grilă și validarea încrucișată.

Dacă doriți să citiți ghidurile anterioare, puteți arunca o privire la primele două ghiduri sau puteți vedea ce subiecte vă interesează cel mai mult. Mai jos este tabelul cu subiectele abordate în fiecare ghid:

  1. Implementarea SVM și Kernel SVM cu Scikit-Learn de la Python
  • Caz de utilizare: uitați bancnotele
  • Contextul SVM-urilor
  • Model SVM simplu (liniar).
    • Despre setul de date
    • Importul setului de date
    • Explorarea setului de date
  • Implementarea SVM cu Scikit-Learn
    • Împărțirea datelor în seturi de tren/test
    • Instruirea modelului
    • Realizarea previziunilor
    • Evaluarea modelului
    • Interpretarea rezultatelor
  1. Înțelegerea hiperparametrilor SVM
  • Hiperparametrul C
  • Hiperparametrul Gamma

3. Implementarea altor variante SVM cu Scikit-Learn de la Python

  • Ideea generală a SVM-urilor (o recapitulare)
  • Kernel (Trick) SVM
  • Implementarea SVM a kernelului non-liniar cu Scikit-Learn
  • Importul bibliotecilor
    • Importul setului de date
    • Împărțirea datelor în caracteristici (X) și țintă (y)
    • Împărțirea datelor în seturi de tren/test
    • Antrenarea algoritmului
  • Nucleu polinom
    • Realizarea previziunilor
    • Evaluarea algoritmului
  • Miez gaussian
    • Predicție și evaluare
  • Nuezul sigmoid
    • Predicție și evaluare
  • Comparația performanțelor kernelului neliniar

Să ne amintim despre ce este SVM înainte de a vedea câteva variații interesante ale nucleului SVM.

Ideea generală a SVM-urilor

În cazul datelor separabile liniar în două dimensiuni (așa cum se arată în Fig. 1), abordarea tipică a algoritmului de învățare automată ar fi încercarea de a găsi o limită care împarte datele în așa fel încât eroarea de clasificare greșită să fie redusă la minimum. Dacă vă uitați cu atenție la figura 1, observați că pot exista mai multe limite (infinite) care împart corect punctele de date. Cele două linii întrerupte, precum și linia continuă sunt toate clasificări valide ale datelor.

Limite de decizii multiple

Fig 1: Limite de decizii multiple

Când SVM alege hotar de decizie, alege o graniță care maximizează distanța dintre ea și cele mai apropiate puncte de date ale claselor. Știm deja că cele mai apropiate puncte de date sunt vectorii suport și că distanța poate fi parametrizată atât prin C și gamma hiperparametrii.

În calculul acelei limite de decizie, algoritmul alege câte puncte să ia în considerare și cât de departe poate merge marja - acest lucru configurează o problemă de maximizare a marjei. Pentru a rezolva această problemă de maximizare a marjei, SVM folosește vectorii suport (așa cum se vede în Fig. 2) și încearcă să descopere care sunt valorile optime care mențin distanța de marjă mai mare, în timp ce clasifică mai multe puncte în mod corect în funcție de funcția care este utilizată pentru separa datele.

Limită de decizie cu vectori suport

Fig 2: Limită de decizie cu vectori suport

Acesta este motivul pentru care SVM diferă de alți algoritmi de clasificare, odată ce nu găsește doar o limită de decizie, ci ajunge să găsească limita de decizie optimă.

Există o matematică complexă derivată din statistici și metode de calcul implicate în spatele găsirii vectorilor suport, calculând marja dintre limita de decizie și vectorii suport și maximizând acea marjă. De data aceasta, nu vom intra în detalii despre modul în care se desfășoară matematica.

Este întotdeauna important să vă aprofundați și să vă asigurați că algoritmii de învățare automată nu sunt un fel de vrajă misterioasă, deși nu cunoașteți fiecare detaliu matematic în acest moment nu v-a împiedicat și nu vă va împiedica să puteți executa algoritmul și să obțineți rezultate.

Indicații: acum că am făcut o recapitulare a procesului algoritmic, este clar că distanța dintre punctele de date va afecta limita de decizie pe care SVM o alege, din această cauză, scalarea datelor este de obicei necesar atunci când se utilizează un clasificator SVM. Încercați să utilizați Metoda Scaler standard de la Scikit-learn pentru a pregăti datele și apoi rulați din nou codurile pentru a vedea dacă există o diferență între rezultate.

Kernel (Trick) SVM

În secțiunea anterioară, ne-am amintit și am organizat ideea generală a SVM - văzând cum poate fi folosită pentru a găsi limita optimă de decizie pentru date separabile liniar. Cu toate acestea, în cazul datelor separabile neliniar, cum ar fi cea prezentată în Fig. 3, știm deja că o linie dreaptă nu poate fi folosită ca limită de decizie.

Date neliniar separabile

Fig 3: Date neliniar separabile

Mai degrabă, putem folosi versiunea modificată de SVM despre care am discutat la început, numită Kernel SVM.

Practic, ceea ce va face SVM-ul nucleului este să proiecteze datele separabile neliniar de dimensiuni inferioare la forma corespunzătoare în dimensiuni mai mari. Acesta este un truc, deoarece atunci când proiectați date neliniar separabile în dimensiuni mai mari, forma datelor se schimbă în așa fel încât devin separabile. De exemplu, când ne gândim la 3 dimensiuni, punctele de date din fiecare clasă ar putea ajunge să fie alocate într-o dimensiune diferită, făcându-l separabil. O modalitate de a crește dimensiunile datelor poate fi prin exponenția lor. Din nou, există matematică complexă implicată în acest lucru, dar nu trebuie să vă faceți griji pentru a utiliza SVM. Mai degrabă, putem folosi biblioteca Scikit-Learn de la Python pentru a implementa și a folosi nucleele neliniare în același mod în care am folosit liniarul.

Implementarea SVM a kernelului non-liniar cu Scikit-Learn

În această secțiune, vom folosi același set de date pentru a estima dacă o bancnotă este reală sau falsificată conform celor patru caracteristici pe care le cunoaștem deja.

Veți vedea că restul pașilor sunt pași tipici de învățare automată și au nevoie de foarte puține explicații până când ajungem la partea în care antrenăm SVM-urile noastre neliniare Kernel.

Importul bibliotecilor

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split

Importul setului de date

data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()mes)

Împărțirea datelor în caracteristici (X) și țintă (y)

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

Împărțirea datelor în seturi de tren/test

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

Antrenarea algoritmului

Pentru a antrena SVM-ul nucleului, vom folosi același lucru SVC clasa Scikit-Learn's svm bibliotecă. Diferența constă în valoarea parametrului kernel al SVC clasă.

În cazul SVM-ului simplu am folosit „liniar” ca valoare pentru parametrul nucleului. Cu toate acestea, așa cum am menționat mai devreme, pentru nucleu SVM, putem folosi nuclee gaussiene, polinomiale, sigmoide sau calculabile. Vom implementa nuclee polinomiale, gaussiene și sigmoide și vom analiza metricile finale pentru a vedea care dintre ele pare să se potrivească claselor noastre cu o metrică mai mare.

1. Nucleu polinom

În algebră, un polinom este o expresie de forma:

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

Aceasta are variabile, cum ar fi a și b, constante, în exemplul nostru, 9 şi coeficienţi (constante însoţite de variabile), precum 2 și 4. 3 este considerat a fi gradul polinomului.

Există tipuri de date care pot fi descrise cel mai bine atunci când se folosește o funcție polinomială, aici, ceea ce va face nucleul este să mapam datele noastre la un polinom la care vom alege gradul. Cu cât gradul este mai mare, cu atât funcția va încerca să se apropie de date, astfel încât limita de decizie este mai flexibilă (și mai predispusă la supraadaptare) – cu cât gradul este mai mic, cu atât mai puțin flexibil.

Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!

Deci, pentru implementarea nucleu polinom, pe lângă alegerea poly kernel, vom transmite și o valoare pentru degree parametrul parametrului SVC clasă. Mai jos este codul:

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

Realizarea previziunilor

Acum, odată ce am antrenat algoritmul, următorul pas este să facem predicții asupra datelor de testare.

Așa cum am făcut anterior, putem executa următorul script pentru a face acest lucru:

y_pred_poly = svclassifier.predict(X_test)

Evaluarea algoritmului

Ca de obicei, pasul final este de a face evaluări pe nucleul polinom. Deoarece am repetat de câteva ori codul pentru raportul de clasificare și matricea de confuzie, să-l transformăm într-o funcție care display_results după primirea respectivelor y_test, y_pred și titlul matricei de confuzie a Seaborn cu cm_title:

def display_results(y_test, y_pred, cm_title): cm = confusion_matrix(y_test,y_pred) sns.heatmap(cm, annot=True, fmt='d').set_title(cm_title) print(classification_report(y_test,y_pred))

Acum, putem apela funcția și privim rezultatele obținute cu nucleul polinom:

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

Ieșirea arată astfel:

 precision recall f1-score support 0 0.69 1.00 0.81 148 1 1.00 0.46 0.63 127 accuracy 0.75 275 macro avg 0.84 0.73 0.72 275
weighted avg 0.83 0.75 0.73 275

Implementarea altor variante SVM cu Scikit-Learn PlatoBlockchain Data Intelligence de la Python. Căutare verticală. Ai.

Acum putem repeta aceiași pași pentru nucleele gaussiene și sigmoide.

2. Miez gaussian

Pentru a folosi nucleul gaussian, trebuie doar să specificăm „rbf” ca valoare pentru kernel parametrul clasei SVC:

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

Când explorați în continuare acest nucleu, puteți utiliza și căutarea în grilă pentru a-l combina cu diferite C și gamma valori.

Predicție și evaluare

y_pred_gaussian = svc_gaussian.predict(X_test)
cm_title_gaussian = "Confusion matrix with Gaussian kernel"
display_results(y_test, y_pred_gaussian, cm_title_gaussian)

Ieșirea SVM-ului nucleului gaussian arată astfel:

 precision recall f1-score support 0 1.00 1.00 1.00 148 1 1.00 1.00 1.00 127 accuracy 1.00 275 macro avg 1.00 1.00 1.00 275
weighted avg 1.00 1.00 1.00 275

Implementarea altor variante SVM cu Scikit-Learn PlatoBlockchain Data Intelligence de la Python. Căutare verticală. Ai.

3. Nuezul sigmoid

În cele din urmă, să folosim un nucleu sigmoid pentru implementarea Kernel SVM. Aruncă o privire la următorul script:

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

Pentru a utiliza nucleul sigmoid, trebuie să specificați „sigmoid” ca valoare pentru kernel parametrul parametrului SVC clasă.

Predicție și evaluare

y_pred_sigmoid = svc_sigmoid.predict(X_test)
cm_title_sigmoid = "Confusion matrix with Sigmoid kernel"
display_results(y_test, y_pred_sigmoid, cm_title_sigmoid)

Ieșirea Kernel SVM cu kernel Sigmoid arată astfel:

 precision recall f1-score support 0 0.67 0.71 0.69 148 1 0.64 0.59 0.61 127 accuracy 0.65 275 macro avg 0.65 0.65 0.65 275
weighted avg 0.65 0.65 0.65 275

Implementarea altor variante SVM cu Scikit-Learn PlatoBlockchain Data Intelligence de la Python. Căutare verticală. Ai.

Comparația performanțelor kernelului neliniar

Dacă comparăm pe scurt performanța diferitelor tipuri de nuclee neliniare, s-ar putea părea că nucleul sigmoid are cele mai scăzute valori, deci cea mai proastă performanță.

Printre nucleele gaussiene și polinomiale, putem observa că nucleul gaussian a atins o rată de predicție perfectă de 100% - ceea ce este de obicei suspect și poate indica o supraadaptare, în timp ce nucleul polinomial a clasificat greșit 68 de instanțe din clasa 1.

Prin urmare, nu există o regulă strictă și rapidă cu privire la care nucleu funcționează cel mai bine în fiecare scenariu sau în scenariul nostru actual, fără a căuta în continuare hiperparametrii, a înțelege despre fiecare formă a funcției, a explora datele și a compara rezultatele trenului și testelor pentru a vedea dacă algoritmul se generalizează.

Este vorba despre testarea tuturor nucleelor ​​și selectarea celui cu combinația de parametri și pregătirea datelor care dau rezultatele așteptate în funcție de contextul proiectului dumneavoastră.

Going Further – Proiect manual de la capăt la capăt

Natura ta curios te face să vrei să mergi mai departe? Vă recomandăm să verificați Proiect ghidat: „Predicție practică pentru prețul casei – Învățare automată în Python”.

Implementarea altor variante SVM cu Scikit-Learn PlatoBlockchain Data Intelligence de la Python. Căutare verticală. Ai.

În acest proiect ghidat – veți învăța cum să construiți modele puternice tradiționale de învățare automată, precum și modele de învățare profundă, să utilizați Ensemble Learning și să pregătiți meta-învățați pentru a prezice prețurile caselor dintr-un pachet de modele Scikit-Learn și Keras.

Folosind Keras, API-ul de deep learning construit pe Tensorflow, vom experimenta arhitecturi, vom construi un ansamblu de modele stivuite și vom antrena un meta-învățator rețea neuronală (model de nivel 1) pentru a afla prețul unei case.

Învățarea profundă este uimitoare – dar înainte de a recurge la ea, se recomandă să încercați și să rezolvați problema cu tehnici mai simple, cum ar fi cu învăţare superficială algoritmi. Performanța noastră de bază se va baza pe a Regresie aleatorie a pădurii algoritm. În plus – vom explora crearea de ansambluri de modele prin Scikit-Learn prin tehnici precum insacuire și vot.

Acesta este un proiect de la capăt la capăt și, ca toate proiectele de învățare automată, vom începe cu – cu Analiza datelor exploratorii, urmat de Pre-procesare de date și, în sfârșit Construire superficială și Modele de învățare profundă pentru a se potrivi cu datele pe care le-am explorat și curățat anterior.

Concluzie

În acest articol, am făcut o recapitulare rapidă a SVM-urilor, am studiat despre trucul nucleului și am implementat diferite variante de SVM-uri neliniare.

Vă sugerez să implementați fiecare nucleu și să mergeți mai departe. Puteți explora matematica folosită pentru a crea fiecare dintre diferitele nuclee, de ce au fost create și diferențele în ceea ce privește hiperparametrii lor. În acest fel, veți afla despre tehnici și ce tip de nucleu este cel mai bine aplicat în funcție de context și de datele disponibile.

Înțelegerea clară a modului în care funcționează fiecare nucleu și când să le utilizați vă va ajuta cu siguranță în călătoria dvs. Spuneți-ne cum merge progresul și codificare fericită!

Timestamp-ul:

Mai mult de la Stackabuse