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