Scikit Learn - Supporta macchine vettoriali

Questo capitolo tratta un metodo di apprendimento automatico denominato SVM (Support Vector Machines).

introduzione

Le Support Vector Machine (SVM) sono metodi di machine learning supervisionati potenti ma flessibili utilizzati per la classificazione, la regressione e il rilevamento dei valori anomali. Gli SVM sono molto efficienti negli spazi ad alta dimensione e generalmente vengono utilizzati nei problemi di classificazione. Gli SVM sono popolari ed efficienti in termini di memoria perché utilizzano un sottoinsieme di punti di addestramento nella funzione decisionale.

L'obiettivo principale degli SVM è dividere i set di dati in numero di classi al fine di trovare un file maximum marginal hyperplane (MMH) che può essere fatto nei seguenti due passaggi:

  • Support Vector Machines genererà dapprima gli iperpiani in modo iterativo che separa le classi nel modo migliore.

  • Dopodiché sceglierà l'iperpiano che segrega correttamente le classi.

Alcuni concetti importanti in SVM sono i seguenti:

  • Support Vectors- Possono essere definiti come i punti dati più vicini all'iperpiano. I vettori di supporto aiutano a decidere la linea di separazione.

  • Hyperplane - Il piano decisionale o lo spazio che divide un insieme di oggetti aventi classi differenti.

  • Margin - Il divario tra due linee sui punti dati dell'armadio di classi diverse è chiamato margine.

I seguenti diagrammi ti daranno un'idea di questi concetti SVM:

SVM in Scikit-learn supporta vettori campione sia sparsi che densi come input.

Classificazione di SVM

Scikit-learn fornisce tre classi, vale a dire SVC, NuSVC e LinearSVC che può eseguire la classificazione di classi multiclasse.

SVC

È la classificazione del vettore di supporto C su cui si basa l'implementazione libsvm. Il modulo utilizzato da scikit-learn èsklearn.svm.SVC. Questa classe gestisce il supporto multiclasse secondo uno schema uno contro uno.

Parametri

La tabella seguente è costituita dai parametri utilizzati da sklearn.svm.SVC classe -

Suor n Parametro e descrizione
1

C - float, opzionale, default = 1.0

È il parametro di penalità del termine di errore.

2

kernel - stringa, opzionale, default = 'rbf'

Questo parametro specifica il tipo di kernel da utilizzare nell'algoritmo. possiamo scegliere uno qualsiasi tra,‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’. Il valore predefinito del kernel sarebbe‘rbf’.

3

degree - int, opzionale, default = 3

Rappresenta il grado della funzione del kernel "poly" e verrà ignorato da tutti gli altri kernel.

4

gamma - {'scale', 'auto'} o float,

È il coefficiente del kernel per i kernel "rbf", "poly" e "sigmoid".

5

optinal default - = 'scala'

Se scegli il valore predefinito, ad esempio gamma = 'scale', il valore di gamma che deve essere utilizzato da SVC è 1 / (_ ∗. ()).

D'altra parte, se gamma = 'auto', utilizza 1 / _.

6

coef0 - float, opzionale, Default = 0.0

Un termine indipendente nella funzione kernel che è significativo solo in "poly" e "sigmoid".

7

tol - float, opzionale, default = 1.e-3

Questo parametro rappresenta il criterio di arresto per le iterazioni.

8

shrinking - Booleano, opzionale, predefinito = True

Questo parametro rappresenta se si desidera utilizzare o meno l'euristica di riduzione.

9

verbose - Booleano, predefinito: false

Abilita o disabilita l'output dettagliato. Il suo valore predefinito è false.

10

probability - booleano, opzionale, predefinito = vero

Questo parametro abilita o disabilita le stime di probabilità. Il valore predefinito è false, ma deve essere abilitato prima di chiamare fit.

11

max_iter - int, opzionale, default = -1

Come suggerisce il nome, rappresenta il numero massimo di iterazioni all'interno del risolutore. Il valore -1 significa che non c'è limite al numero di iterazioni.

12

cache_size - galleggiante, opzionale

Questo parametro specificherà la dimensione della cache del kernel. Il valore sarà in MB (MegaByte).

13

random_state - int, istanza RandomState o None, opzionale, default = nessuno

Questo parametro rappresenta il seme del numero pseudo casuale generato che viene utilizzato durante la mescolanza dei dati. Le seguenti sono le opzioni:

  • int- In questo caso, random_state è il seme utilizzato dal generatore di numeri casuali.

  • RandomState instance - In questo caso, random_state è il generatore di numeri casuali.

  • None - In questo caso, il generatore di numeri casuali è l'istanza RandonState utilizzata da np.random.

14

class_weight - {dict, 'balanced'}, facoltativo

Questo parametro imposterà il parametro C della classe j su _ℎ [] ∗ per SVC. Se usiamo l'opzione predefinita, significa che tutte le classi dovrebbero avere un peso. D'altra parte, se scegliclass_weight:balanced, utilizzerà i valori di y per regolare automaticamente i pesi.

15

decision_function_shape - ovo ',' ovr ', default =' ovr '

Questo parametro deciderà se l'algoritmo tornerà ‘ovr’ (uno contro riposo) funzione decisionale della forma come tutti gli altri classificatori, o l'originale ovo(uno contro uno) funzione decisionale di libsvm.

16

break_ties - booleano, opzionale, predefinito = false

True - La previsione interromperà i legami in base ai valori di confidenza di decision_function

False - Il pronostico restituirà la prima classe tra le classi in parità.

Attributi

La tabella seguente è costituita dagli attributi utilizzati da sklearn.svm.SVC classe -

Suor n Attributi e descrizione
1

support_ - tipo array, forma = [n_SV]

Restituisce gli indici dei vettori di supporto.

2

support_vectors_ - tipo array, forma = [n_SV, n_features]

Restituisce i vettori di supporto.

3

n_support_ - tipo array, dtype = int32, shape = [n_class]

Rappresenta il numero di vettori di supporto per ogni classe.

4

dual_coef_ - matrice, forma = [n_class-1, n_SV]

Questi sono i coefficienti dei vettori di supporto nella funzione di decisione.

5

coef_ - array, forma = [n_class * (n_class-1) / 2, n_features]

Questo attributo, disponibile solo in caso di kernel lineare, fornisce il peso assegnato alle funzionalità.

6

intercept_ - matrice, forma = [n_class * (n_class-1) / 2]

Rappresenta il termine indipendente (costante) nella funzione decisionale.

7

fit_status_ - int

L'uscita sarebbe 0 se è montata correttamente. L'uscita sarebbe 1 se non è inserita correttamente.

8

classes_ - matrice di forma = [n_classes]

Fornisce le etichette delle classi.

Implementation Example

Come altri classificatori, anche SVC deve essere dotato dei seguenti due array:

  • Un array Xtenendo i campioni di addestramento. È di dimensione [n_samples, n_features].

  • Un array Ytenendo i valori target, ovvero le etichette di classe per i campioni di addestramento. È di dimensione [n_samples].

Seguendo gli usi dello script Python sklearn.svm.SVC classe -

import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import SVC
SVCClf = SVC(kernel = 'linear',gamma = 'scale', shrinking = False,)
SVCClf.fit(X, y)

Output

SVC(C = 1.0, 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 = False,
   tol = 0.001, verbose = False)

Example

Ora, una volta adattato, possiamo ottenere il vettore di peso con l'aiuto del seguente script python -

SVCClf.coef_

Output

array([[0.5, 0.5]])

Example

Allo stesso modo, possiamo ottenere il valore di altri attributi come segue:

SVCClf.predict([[-0.5,-0.8]])

Output

array([1])

Example

SVCClf.n_support_

Output

array([1, 1])

Example

SVCClf.support_vectors_

Output

array(
   [
      [-1., -1.],
      [ 1., 1.]
   ]
)

Example

SVCClf.support_

Output

array([0, 2])

Example

SVCClf.intercept_

Output

array([-0.])

Example

SVCClf.fit_status_

Output

0

NuSVC

NuSVC è Nu Support Vector Classification. È un'altra classe fornita da scikit-learn che può eseguire la classificazione multi-classe. È come SVC ma NuSVC accetta set di parametri leggermente diversi. Il parametro che è diverso da SVC è il seguente:

  • nu - float, opzionale, default = 0,5

Rappresenta un limite superiore sulla frazione di errori di addestramento e un limite inferiore della frazione di vettori di supporto. Il suo valore dovrebbe essere compreso nell'intervallo (o, 1].

Il resto dei parametri e degli attributi sono gli stessi di SVC.

Esempio di implementazione

Possiamo implementare lo stesso esempio usando sklearn.svm.NuSVC classe anche.

import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import NuSVC
NuSVCClf = NuSVC(kernel = 'linear',gamma = 'scale', shrinking = False,)
NuSVCClf.fit(X, y)

Produzione

NuSVC(cache_size = 200, class_weight = None, coef0 = 0.0,
   decision_function_shape = 'ovr', degree = 3, gamma = 'scale', kernel = 'linear',
   max_iter = -1, nu = 0.5, probability = False, random_state = None,
   shrinking = False, tol = 0.001, verbose = False)

Possiamo ottenere gli output del resto degli attributi come nel caso di SVC.

LinearSVC

È la classificazione del vettore di supporto lineare. È simile a SVC con kernel = 'linear'. La differenza tra loro è questaLinearSVC implementato in termini di liblinear mentre SVC è implementato in libsvm. Questa è la ragioneLinearSVCha una maggiore flessibilità nella scelta delle sanzioni e delle funzioni di perdita. Inoltre si adatta meglio a un numero elevato di campioni.

Se parliamo dei suoi parametri e attributi, non supporta ‘kernel’ perché si presume che sia lineare e manca anche di alcuni attributi come support_, support_vectors_, n_support_, fit_status_ e, dual_coef_.

Tuttavia, supporta penalty e loss parametri come segue -

  • penalty − string, L1 or L2(default = ‘L2’)

    Questo parametro viene utilizzato per specificare la norma (L1 o L2) utilizzata nella penalizzazione (regolarizzazione).

  • loss − string, hinge, squared_hinge (default = squared_hinge)

    Rappresenta la funzione di perdita dove "cerniera" è la perdita SVM standard e "squared_hinge" è il quadrato della perdita di cerniera.

Esempio di implementazione

Seguendo gli usi dello script Python sklearn.svm.LinearSVC classe -

from sklearn.svm import LinearSVC
from sklearn.datasets import make_classification
X, y = make_classification(n_features = 4, random_state = 0)
LSVCClf = LinearSVC(dual = False, random_state = 0, penalty = 'l1',tol = 1e-5)
LSVCClf.fit(X, y)

Produzione

LinearSVC(C = 1.0, class_weight = None, dual = False, fit_intercept = True,
   intercept_scaling = 1, loss = 'squared_hinge', max_iter = 1000,
   multi_class = 'ovr', penalty = 'l1', random_state = 0, tol = 1e-05, verbose = 0)

Esempio

Ora, una volta adattato, il modello può prevedere nuovi valori come segue:

LSVCClf.predict([[0,0,0,0]])

Produzione

[1]

Esempio

Per l'esempio sopra, possiamo ottenere il vettore di peso con l'aiuto del seguente script python:

LSVCClf.coef_

Produzione

[[0. 0. 0.91214955 0.22630686]]

Esempio

Allo stesso modo, possiamo ottenere il valore di intercettazione con l'aiuto del seguente script python -

LSVCClf.intercept_

Produzione

[0.26860518]

Regressione con SVM

Come discusso in precedenza, SVM viene utilizzato sia per la classificazione che per i problemi di regressione. Il metodo di Scikit-learn di Support Vector Classification (SVC) può essere esteso anche per risolvere i problemi di regressione. Questo metodo esteso è chiamato Support Vector Regression (SVR).

Somiglianza di base tra SVM e SVR

Il modello creato da SVC dipende solo da un sottoinsieme di dati di addestramento. Perché? Perché la funzione di costo per la creazione del modello non si preoccupa di addestrare i punti dati che si trovano al di fuori del margine.

Mentre il modello prodotto da SVR (Support Vector Regression) dipende anche solo da un sottoinsieme dei dati di addestramento. Perché? Perché la funzione di costo per la creazione del modello ignora qualsiasi punto di dati di addestramento vicino alla previsione del modello.

Scikit-learn fornisce tre classi, vale a dire SVR, NuSVR and LinearSVR come tre diverse implementazioni di SVR.

SVR

È la regressione vettoriale di supporto Epsilon su cui si basa l'implementazione libsvm. Al contrario diSVC Ci sono due parametri liberi nel modello, vale a dire ‘C’ e ‘epsilon’.

  • epsilon - float, opzionale, default = 0.1

Rappresenta l'epsilon nel modello epsilon-SVR e specifica il tubo epsilon entro il quale nessuna penalità è associata nella funzione di perdita di allenamento con i punti previsti entro una distanza epsilon dal valore effettivo.

Il resto dei parametri e degli attributi sono simili a quelli utilizzati in SVC.

Esempio di implementazione

Seguendo gli usi dello script Python sklearn.svm.SVR classe -

from sklearn import svm
X = [[1, 1], [2, 2]]
y = [1, 2]
SVRReg = svm.SVR(kernel = ’linear’, gamma = ’auto’)
SVRReg.fit(X, y)

Produzione

SVR(C = 1.0, cache_size = 200, coef0 = 0.0, degree = 3, epsilon = 0.1, gamma = 'auto',
   kernel = 'linear', max_iter = -1, shrinking = True, tol = 0.001, verbose = False)

Esempio

Ora, una volta adattato, possiamo ottenere il vettore di peso con l'aiuto del seguente script python -

SVRReg.coef_

Produzione

array([[0.4, 0.4]])

Esempio

Allo stesso modo, possiamo ottenere il valore di altri attributi come segue:

SVRReg.predict([[1,1]])

Produzione

array([1.1])

Allo stesso modo, possiamo ottenere anche i valori di altri attributi.

NuSVR

NuSVR è Nu Support Vector Regression. È come NuSVC, ma NuSVR utilizza un parametronuper controllare il numero di vettori di supporto. E inoltre, a differenza di NuSVC dovenu sostituito il parametro C, qui sostituisce epsilon.

Esempio di implementazione

Seguendo gli usi dello script Python sklearn.svm.SVR classe -

from sklearn.svm import NuSVR
import numpy as np
n_samples, n_features = 20, 15
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
NuSVRReg = NuSVR(kernel = 'linear', gamma = 'auto',C = 1.0, nu = 0.1)^M
NuSVRReg.fit(X, y)

Produzione

NuSVR(C = 1.0, cache_size = 200, coef0 = 0.0, degree = 3, gamma = 'auto',
   kernel = 'linear', max_iter = -1, nu = 0.1, shrinking = True, tol = 0.001,
   verbose = False)

Esempio

Ora, una volta adattato, possiamo ottenere il vettore di peso con l'aiuto del seguente script python -

NuSVRReg.coef_

Produzione

array(
   [
      [-0.14904483, 0.04596145, 0.22605216, -0.08125403, 0.06564533,
      0.01104285, 0.04068767, 0.2918337 , -0.13473211, 0.36006765,
      -0.2185713 , -0.31836476, -0.03048429, 0.16102126, -0.29317051]
   ]
)

Allo stesso modo, possiamo ottenere il valore anche di altri attributi.

LinearSVR

È la regressione vettoriale di supporto lineare. È simile a SVR con kernel = 'linear'. La differenza tra loro è questaLinearSVR implementato in termini di liblinear, mentre SVC implementato in libsvm. Questa è la ragioneLinearSVRha una maggiore flessibilità nella scelta delle sanzioni e delle funzioni di perdita. Inoltre si adatta meglio a un numero elevato di campioni.

Se parliamo dei suoi parametri e attributi, non supporta ‘kernel’ perché si presume che sia lineare e manca anche di alcuni attributi come support_, support_vectors_, n_support_, fit_status_ e, dual_coef_.

Tuttavia, supporta i parametri di "perdita" come segue:

  • loss - string, opzionale, default = 'epsilon_insensitive'

Rappresenta la funzione di perdita dove la perdita epsilon_insensitive è la perdita L1 e la perdita al quadrato epsilon-insensibile è la perdita L2.

Esempio di implementazione

Seguendo gli usi dello script Python sklearn.svm.LinearSVR classe -

from sklearn.svm import LinearSVR
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 4, random_state = 0)
LSVRReg = LinearSVR(dual = False, random_state = 0,
loss = 'squared_epsilon_insensitive',tol = 1e-5)
LSVRReg.fit(X, y)

Produzione

LinearSVR(
   C=1.0, dual=False, epsilon=0.0, fit_intercept=True,
   intercept_scaling=1.0, loss='squared_epsilon_insensitive',
   max_iter=1000, random_state=0, tol=1e-05, verbose=0
)

Esempio

Ora, una volta adattato, il modello può prevedere nuovi valori come segue:

LSRReg.predict([[0,0,0,0]])

Produzione

array([-0.01041416])

Esempio

Per l'esempio sopra, possiamo ottenere il vettore di peso con l'aiuto del seguente script python:

LSRReg.coef_

Produzione

array([20.47354746, 34.08619401, 67.23189022, 87.47017787])

Esempio

Allo stesso modo, possiamo ottenere il valore di intercettazione con l'aiuto del seguente script python -

LSRReg.intercept_

Produzione

array([-0.01041416])