Scikit Learn - Suporte a máquinas de vetores

Este capítulo trata de um método de aprendizado de máquina denominado Support Vector Machines (SVMs).

Introdução

As máquinas de vetores de suporte (SVMs) são métodos de aprendizado de máquina supervisionados poderosos, porém flexíveis, usados ​​para classificação, regressão e detecção de outliers. SVMs são muito eficientes em espaços dimensionais elevados e geralmente são usados ​​em problemas de classificação. Os SVMs são populares e têm memória eficiente porque usam um subconjunto de pontos de treinamento na função de decisão.

O principal objetivo dos SVMs é dividir os conjuntos de dados em várias classes, a fim de encontrar um maximum marginal hyperplane (MMH) o que pode ser feito nas duas etapas a seguir -

  • O Support Vector Machines primeiro irá gerar hiperplanos iterativamente que separa as classes da melhor maneira.

  • Em seguida, ele escolherá o hiperplano que segregará as classes corretamente.

Alguns conceitos importantes em SVM são os seguintes -

  • Support Vectors- Eles podem ser definidos como os pontos de dados mais próximos do hiperplano. Os vetores de suporte ajudam a decidir a linha de separação.

  • Hyperplane - O plano ou espaço de decisão que divide o conjunto de objetos de diferentes classes.

  • Margin - A lacuna entre duas linhas nos pontos de dados do armário de classes diferentes é chamada de margem.

Os diagramas a seguir lhe darão uma visão sobre esses conceitos de SVM -

O SVM no Scikit-learn oferece suporte a vetores de amostra esparsos e densos como entrada.

Classificação de SVM

Scikit-learn oferece três classes, a saber SVC, NuSVC e LinearSVC que pode realizar a classificação multiclasse.

SVC

É a classificação do vetor C-suporte, cuja implementação é baseada em libsvm. O módulo usado pelo scikit-learn ésklearn.svm.SVC. Esta classe lida com o suporte multiclasse de acordo com o esquema um contra um.

Parâmetros

A tabela a seguir consiste nos parâmetros usados ​​por sklearn.svm.SVC classe -

Sr. Não Parâmetro e Descrição
1

C - flutuante, opcional, padrão = 1,0

É o parâmetro de penalidade do termo de erro.

2

kernel - string, opcional, padrão = 'rbf'

Este parâmetro especifica o tipo de kernel a ser usado no algoritmo. podemos escolher qualquer um entre,‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’. O valor padrão do kernel seria‘rbf’.

3

degree - int, opcional, padrão = 3

Ele representa o grau da função 'poli' do kernel e será ignorado por todos os outros kernels.

4

gamma - {'escala', 'auto'} ou flutuação,

É o coeficiente do kernel para os kernels 'rbf', 'poly' e 'sigmoid'.

5

optinal default - = 'escala'

Se você escolher o padrão, ou seja, gama = 'escala', então o valor de gama a ser usado pelo SVC é 1 / (_ ∗. ()).

Por outro lado, se gamma = 'auto', ele usa 1 / _.

6

coef0 - flutuante, opcional, padrão = 0,0

Um termo independente na função do kernel que só é significativo em 'poli' e 'sigmóide'.

7

tol - flutuante, opcional, padrão = 1.e-3

Este parâmetro representa o critério de parada para iterações.

8

shrinking - Booleano, opcional, padrão = Verdadeiro

Este parâmetro representa se queremos usar a heurística de redução ou não.

9

verbose - Booleano, padrão: falso

Ele ativa ou desativa a saída detalhada. Seu valor padrão é falso.

10

probability - booleano, opcional, padrão = verdadeiro

Este parâmetro ativa ou desativa as estimativas de probabilidade. O valor padrão é falso, mas deve ser habilitado antes de chamarmos o ajuste.

11

max_iter - int, opcional, padrão = -1

Como o nome sugere, ele representa o número máximo de iterações no solucionador. O valor -1 significa que não há limite para o número de iterações.

12

cache_size - float, opcional

Este parâmetro irá especificar o tamanho do cache do kernel. O valor será em MB (MegaBytes).

13

random_state - int, instância RandomState ou Nenhum, opcional, padrão = nenhum

Este parâmetro representa a semente do número pseudoaleatório gerado que é usado ao embaralhar os dados. A seguir estão as opções -

  • int- Neste caso, random_state é a semente usada pelo gerador de números aleatórios.

  • RandomState instance - Nesse caso, random_state é o gerador de números aleatórios.

  • None - Nesse caso, o gerador de número aleatório é a instância RandonState usada por np.random.

14

class_weight - {dict, 'balanceado'}, opcional

Este parâmetro definirá o parâmetro C da classe j para _ℎ [] ∗ para SVC. Se usarmos a opção padrão, significa que todas as classes devem ter peso um. Por outro lado, se você escolherclass_weight:balanced, ele usará os valores de y para ajustar automaticamente os pesos.

15

decision_function_shape - ovo ',' ovr ', padrão =' ovr '

Este parâmetro decidirá se o algoritmo retornará ‘ovr’ (um contra o resto) função de decisão da forma como todos os outros classificadores, ou o original ovofunção de decisão (um contra um) de libsvm.

16

break_ties - booleano, opcional, padrão = falso

True - A previsão quebrará empates de acordo com os valores de confiança de função_de_ decisão

False - O prognóstico retornará a primeira turma entre as turmas empatadas.

Atributos

A tabela a seguir consiste nos atributos usados ​​por sklearn.svm.SVC classe -

Sr. Não Atributos e descrição
1

support_ - semelhante a matriz, forma = [n_SV]

Ele retorna os índices dos vetores de suporte.

2

support_vectors_ - semelhante a matriz, forma = [n_SV, n_features]

Ele retorna os vetores de suporte.

3

n_support_ - semelhante a matriz, dtype = int32, forma = [n_class]

Ele representa o número de vetores de suporte para cada classe.

4

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

Estes são os coeficientes dos vetores de suporte na função de decisão.

5

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

Este atributo, disponível apenas no caso de kernel linear, fornece o peso atribuído aos recursos.

6

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

Representa o termo independente (constante) na função de decisão.

7

fit_status_ - int

A saída seria 0 se estiver corretamente ajustada. A saída seria 1 se fosse encaixada incorretamente.

8

classes_ - matriz de forma = [n_classes]

Dá os rótulos das classes.

Implementation Example

Como outros classificadores, o SVC também deve ser equipado com as duas seguintes matrizes -

  • Uma matriz Xsegurando as amostras de treinamento. É do tamanho [n_samples, n_features].

  • Uma matriz Ymantendo os valores alvo, ou seja, rótulos de classe para as amostras de treinamento. É do tamanho [n_samples].

O seguinte script Python usa 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

Agora, uma vez ajustado, podemos obter o vetor de peso com a ajuda do seguinte script python -

SVCClf.coef_

Output

array([[0.5, 0.5]])

Example

Da mesma forma, podemos obter o valor de outros atributos da seguinte maneira -

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. É outra classe fornecida pelo scikit-learn que pode realizar a classificação de várias classes. É como o SVC, mas o NuSVC aceita conjuntos de parâmetros ligeiramente diferentes. O parâmetro que é diferente de SVC é o seguinte -

  • nu - flutuante, opcional, padrão = 0,5

Ele representa um limite superior da fração de erros de treinamento e um limite inferior da fração de vetores de suporte. Seu valor deve estar no intervalo de (o, 1].

O resto dos parâmetros e atributos são os mesmos do SVC.

Exemplo de Implementação

Podemos implementar o mesmo exemplo usando sklearn.svm.NuSVC classe também.

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)

Resultado

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)

Podemos obter as saídas do restante dos atributos como fizemos no caso do SVC.

LinearSVC

É uma classificação de vetor de suporte linear. É semelhante ao SVC com kernel = 'linear'. A diferença entre eles é queLinearSVC implementado em termos de liblinear enquanto SVC é implementado em libsvm. Essa é a razãoLinearSVCtem mais flexibilidade na escolha de penalidades e funções de perda. Ele também é melhor dimensionado para um grande número de amostras.

Se falarmos sobre seus parâmetros e atributos, então ele não suporta ‘kernel’ porque é considerado linear e também carece de alguns dos atributos como support_, support_vectors_, n_support_, fit_status_ e, dual_coef_.

No entanto, ele suporta penalty e loss parâmetros como segue -

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

    Este parâmetro é usado para especificar a norma (L1 ou L2) usada na penalização (regularização).

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

    Ele representa a função de perda, em que 'dobradiça' é a perda padrão de SVM e 'quadratura_valor' é o quadrado da perda de dobradiça.

Exemplo de Implementação

O seguinte script Python usa 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)

Resultado

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)

Exemplo

Agora, uma vez ajustado, o modelo pode prever novos valores da seguinte forma -

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

Resultado

[1]

Exemplo

Para o exemplo acima, podemos obter o vetor de peso com a ajuda do seguinte script python -

LSVCClf.coef_

Resultado

[[0. 0. 0.91214955 0.22630686]]

Exemplo

Da mesma forma, podemos obter o valor de interceptar com a ajuda do seguinte script python -

LSVCClf.intercept_

Resultado

[0.26860518]

Regressão com SVM

Conforme discutido anteriormente, o SVM é usado para problemas de classificação e regressão. O método de classificação de vetores de suporte (SVC) do Scikit-learn pode ser estendido para resolver problemas de regressão também. Esse método estendido é denominado Support Vector Regression (SVR).

Semelhança básica entre SVM e SVR

O modelo criado pelo SVC depende apenas de um subconjunto de dados de treinamento. Por quê? Porque a função de custo para construir o modelo não se preocupa com pontos de dados de treinamento que estão fora da margem.

Visto que o modelo produzido pelo SVR (Support Vector Regression) também depende apenas de um subconjunto dos dados de treinamento. Por quê? Porque a função de custo para construir o modelo ignora quaisquer pontos de dados de treinamento próximos à previsão do modelo.

Scikit-learn oferece três classes, a saber SVR, NuSVR and LinearSVR como três implementações diferentes de SVR.

SVR

É a regressão vetorial de suporte a Epsilon, cuja implementação é baseada em libsvm. O oposto deSVC Existem dois parâmetros livres no modelo, nomeadamente ‘C’ e ‘epsilon’.

  • epsilon - flutuante, opcional, padrão = 0,1

Ele representa o épsilon no modelo SVR-épsilon e especifica o tubo épsilon dentro do qual nenhuma penalidade está associada na função de perda de treinamento com pontos previstos dentro de uma distância épsilon do valor real.

O resto dos parâmetros e atributos são semelhantes aos usados ​​em SVC.

Exemplo de Implementação

O seguinte script Python usa 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)

Resultado

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)

Exemplo

Agora, uma vez ajustado, podemos obter o vetor de peso com a ajuda do seguinte script python -

SVRReg.coef_

Resultado

array([[0.4, 0.4]])

Exemplo

Da mesma forma, podemos obter o valor de outros atributos da seguinte maneira -

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

Resultado

array([1.1])

Da mesma forma, podemos obter os valores de outros atributos também.

NuSVR

NuSVR é Nu Support Vector Regression. É como NuSVC, mas NuSVR usa um parâmetronupara controlar o número de vetores de suporte. E, além disso, ao contrário do NuSVC, ondenu substituiu o parâmetro C, aqui ele substitui epsilon.

Exemplo de Implementação

O seguinte script Python usa 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)

Resultado

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)

Exemplo

Agora, uma vez ajustado, podemos obter o vetor de peso com a ajuda do seguinte script python -

NuSVRReg.coef_

Resultado

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

Da mesma forma, podemos obter o valor de outros atributos também.

LinearSVR

É a regressão do vetor de suporte linear. É semelhante ao SVR com kernel = 'linear'. A diferença entre eles é queLinearSVR implementado em termos de liblinear, enquanto SVC implementado em libsvm. Essa é a razãoLinearSVRtem mais flexibilidade na escolha de penalidades e funções de perda. Ele também é melhor dimensionado para um grande número de amostras.

Se falarmos sobre seus parâmetros e atributos, então ele não suporta ‘kernel’ porque é considerado linear e também carece de alguns dos atributos como support_, support_vectors_, n_support_, fit_status_ e, dual_coef_.

No entanto, ele suporta parâmetros de 'perda' da seguinte forma -

  • loss - string, opcional, padrão = 'epsilon_insensitive'

Ele representa a função de perda em que a perda insensível a epsilon é a perda L1 e a perda insensível a epsilon ao quadrado é a perda L2.

Exemplo de Implementação

O seguinte script Python usa 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)

Resultado

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
)

Exemplo

Agora, uma vez ajustado, o modelo pode prever novos valores da seguinte forma -

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

Resultado

array([-0.01041416])

Exemplo

Para o exemplo acima, podemos obter o vetor de peso com a ajuda do seguinte script python -

LSRReg.coef_

Resultado

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

Exemplo

Da mesma forma, podemos obter o valor de interceptar com a ajuda do seguinte script python -

LSRReg.intercept_

Resultado

array([-0.01041416])