logo

Suport a l'algoritme de màquina vectorial

Support Vector Machine o SVM és un dels algorismes d'aprenentatge supervisat més populars, que s'utilitza per a problemes de classificació i regressió. Tanmateix, principalment, s'utilitza per a problemes de classificació en aprenentatge automàtic.

L'objectiu de l'algorisme SVM és crear la millor línia o límit de decisió que pugui segregar l'espai n-dimensional en classes perquè puguem posar fàcilment el nou punt de dades a la categoria correcta en el futur. Aquest límit de millor decisió s'anomena hiperpla.

SVM tria els punts/vectors extrems que ajuden a crear l'hiperpla. Aquests casos extrems s'anomenen vectors de suport i, per tant, l'algorisme s'anomena màquina de vectors de suport. Considereu el diagrama següent en què hi ha dues categories diferents que es classifiquen mitjançant un límit de decisió o hiperpla:

Suport a l'algoritme de màquina vectorial

Exemple: SVM es pot entendre amb l'exemple que hem utilitzat en el classificador KNN. Suposem que veiem un gat estrany que també té algunes característiques dels gossos, de manera que si volem un model que pugui identificar amb precisió si és un gat o un gos, es pot crear aquest model mitjançant l'algorisme SVM. Primer entrenarem el nostre model amb moltes imatges de gats i gossos perquè pugui conèixer les diferents característiques dels gats i els gossos, i després el testem amb aquesta estranya criatura. Així, com que el vector de suport crea un límit de decisió entre aquestes dues dades (gat i gos) i tria casos extrems (vectors de suport), veurà el cas extrem de gat i gos. A partir dels vectors suport, el classificarà com a gat. Considereu el diagrama següent:

Suport a l'algoritme de màquina vectorial

Es pot utilitzar l'algorisme SVM per Detecció de cares, classificació d'imatges, categorització de text, etc.

java com anul·lar

Tipus de SVM

SVM pot ser de dos tipus:

    SVM lineal:SVM lineal s'utilitza per a dades separables linealment, el que significa que si un conjunt de dades es pot classificar en dues classes mitjançant una única línia recta, aquestes dades s'anomenen dades separables linealment i el classificador s'utilitza com a classificador SVM lineal.SVM no lineal:SVM no lineal s'utilitza per a dades separades no linealment, el que significa que si un conjunt de dades no es pot classificar mitjançant una línia recta, aquestes dades s'anomenen dades no lineals i el classificador utilitzat s'anomena classificador SVM no lineal.

Hiperplà i vectors de suport a l'algorisme SVM:

Hiperplà: Pot haver-hi múltiples línies/límits de decisió per segregar les classes en l'espai n-dimensional, però hem de trobar el millor límit de decisió que ajudi a classificar els punts de dades. Aquest millor límit es coneix com l'hiperpla de SVM.

Les dimensions de l'hiperpla depenen de les característiques presents al conjunt de dades, el que significa que si hi ha 2 característiques (com es mostra a la imatge), l'hiperpla serà una línia recta. I si hi ha 3 característiques, l'hiperpla serà un pla de 2 dimensions.

Sempre creem un hiperpla que tingui un marge màxim, és a dir, la distància màxima entre els punts de dades.

Vectors de suport:

Els punts de dades o vectors més propers a l'hiperpla i que afecten la posició de l'hiperpla s'anomenen vector de suport. Com que aquests vectors suporten l'hiperpla, per tant s'anomena vector Suport.

Com funciona SVM?

SVM lineal:

El funcionament de l'algorisme SVM es pot entendre utilitzant un exemple. Suposem que tenim un conjunt de dades que té dues etiquetes (verd i blau) i que el conjunt de dades té dues característiques x1 i x2. Volem un classificador que pugui classificar el parell (x1, x2) de coordenades en verd o blau. Considereu la imatge següent:

Suport a l'algoritme de màquina vectorial

Així, com que és un espai 2-d, amb només utilitzar una línia recta, podem separar fàcilment aquestes dues classes. Però hi pot haver diverses línies que poden separar aquestes classes. Considereu la imatge següent:

Suport a l'algoritme de màquina vectorial

Per tant, l'algorisme SVM ajuda a trobar la millor línia o límit de decisió; aquest millor límit o regió s'anomena a hiperpla . L'algorisme SVM troba el punt més proper de les línies de les dues classes. Aquests punts s'anomenen vectors suport. La distància entre els vectors i l'hiperpla s'anomena com marge . I l'objectiu de SVM és maximitzar aquest marge. El hiperpla amb marge màxim s'anomena hiperpla òptim .

Suport a l'algoritme de màquina vectorial

SVM no lineal:

Si les dades estan disposades linealment, podem separar-les mitjançant una línia recta, però per a dades no lineals, no podem dibuixar una única línia recta. Considereu la imatge següent:

Suport a l'algoritme de màquina vectorial

Per tant, per separar aquests punts de dades, hem d'afegir una dimensió més. Per a dades lineals, hem utilitzat dues dimensions x i y, per tant, per a dades no lineals, afegirem una tercera dimensió z. Es pot calcular com:

 z=x<sup>2</sup> +y<sup>2</sup> 

En afegir la tercera dimensió, l'espai de mostra es convertirà en la imatge següent:

Suport a l'algoritme de màquina vectorial

Ara, SVM dividirà els conjunts de dades en classes de la manera següent. Considereu la imatge següent:

Suport a l'algoritme de màquina vectorial

Com que estem a l'espai 3-d, per tant sembla un pla paral·lel a l'eix x. Si el convertim a l'espai 2d amb z=1, es convertirà així:

Suport a l'algoritme de màquina vectorial

Per tant, obtenim una circumferència de radi 1 en cas de dades no lineals.

Implementació de Python de la màquina vectorial de suport

L'actor Rekha

Ara implementarem l'algorisme SVM mitjançant Python. Aquí farem servir el mateix conjunt de dades dades_usuari , que hem utilitzat en la regressió logística i la classificació KNN.

    Pas de preprocessament de dades

Fins al pas de preprocessament de dades, el codi romandrà igual. A continuació es mostra el codi:

 #Data Pre-processing Step # importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv(&apos;user_data.csv&apos;) #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test) 

Després d'executar el codi anterior, preprocessarem les dades. El codi donarà el conjunt de dades com:

Suport a l'algoritme de màquina vectorial

La sortida escalada per al conjunt de prova serà:

Suport a l'algoritme de màquina vectorial

Adaptació del classificador SVM al conjunt d'entrenament:

Ara el conjunt d'entrenament s'adaptarà al classificador SVM. Per crear el classificador SVM, importarem SVC classe des de Sklearn.svm biblioteca. A continuació es mostra el codi per a això:

 from sklearn.svm import SVC # &apos;Support vector classifier&apos; classifier = SVC(kernel=&apos;linear&apos;, random_state=0) classifier.fit(x_train, y_train) 

En el codi anterior, hem utilitzat kernel='lineal' , ja que aquí estem creant SVM per a dades separables linealment. Tanmateix, podem canviar-ho per a dades no lineals. I després vam ajustar el classificador al conjunt de dades d'entrenament (x_train, y_train)

Sortida:

 Out[8]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape=&apos;ovr&apos;, degree=3, gamma=&apos;auto_deprecated&apos;, kernel=&apos;linear&apos;, max_iter=-1, probability=False, random_state=0, shrinking=True, tol=0.001, verbose=False) 

El rendiment del model es pot alterar canviant el valor de C (factor de regularització), gamma i nucli .

    Predicció del resultat del conjunt de proves:
    Ara, predirem la sortida del conjunt de proves. Per a això, crearem un nou vector y_pred. A continuació es mostra el codi per a això:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

Després d'obtenir el vector y_pred, podem comparar el resultat de i_pred i y_prova per comprovar la diferència entre el valor real i el valor previst.

Sortida: A continuació es mostra la sortida per a la predicció del conjunt de proves:

Suport a l'algoritme de màquina vectorial
    Creació de la matriu de confusió:
    Ara veurem el rendiment del classificador SVM que quantes prediccions incorrectes hi ha en comparació amb el classificador de regressió logística. Per crear la matriu de confusió, hem d'importar el fitxer matriu_confusió funció de la biblioteca sklearn. Després d'importar la funció, l'anomenarem mitjançant una nova variable cm . La funció pren dos paràmetres, principalment i_true (els valors reals) i i_pred (el valor objectiu retornat pel classificador). A continuació es mostra el codi per a això:
 #Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred) 

Sortida:

Suport a l'algoritme de màquina vectorial

Com podem veure a la imatge de sortida anterior, hi ha 66 + 24 = 90 prediccions correctes i 8 + 2 = 10 prediccions correctes. Per tant, podem dir que el nostre model SVM ha millorat en comparació amb el model de regressió logística.

    Visualització del resultat del conjunt d'entrenament:
    Ara visualitzarem el resultat del conjunt d'entrenament, a continuació es mostra el codi:
 from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap((&apos;red&apos;, &apos;green&apos;))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap((&apos;red&apos;, &apos;green&apos;))(i), label = j) mtp.title(&apos;SVM classifier (Training set)&apos;) mtp.xlabel(&apos;Age&apos;) mtp.ylabel(&apos;Estimated Salary&apos;) mtp.legend() mtp.show() 

Sortida:

En executar el codi anterior, obtindrem la sortida com:

prova l'estructura de dades
Suport a l'algoritme de màquina vectorial

Com podem veure, la sortida anterior sembla semblant a la sortida de regressió logística. A la sortida, hem obtingut la línia recta com a hiperpla perquè tenim va utilitzar un nucli lineal al classificador . I també hem comentat anteriorment que per a l'espai 2d, l'hiperpla a SVM és una línia recta.

    Visualització del resultat del conjunt de proves:
 #Visulaizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap((&apos;red&apos;,&apos;green&apos; ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap((&apos;red&apos;, &apos;green&apos;))(i), label = j) mtp.title(&apos;SVM classifier (Test set)&apos;) mtp.xlabel(&apos;Age&apos;) mtp.ylabel(&apos;Estimated Salary&apos;) mtp.legend() mtp.show() 

Sortida:

En executar el codi anterior, obtindrem la sortida com:

Suport a l'algoritme de màquina vectorial

Com podem veure a la imatge de sortida anterior, el classificador SVM ha dividit els usuaris en dues regions (comprat o no comprat). Els usuaris que han comprat el SUV es troben a la regió vermella amb els punts de dispersió vermells. I els usuaris que no van comprar el SUV es troben a la regió verda amb punts de dispersió verds. L'hiperplà ha dividit les dues classes en variable comprada i no comprada.