Scikit Learn - Estocástico Gradiente Descendente

Aqui, aprenderemos sobre um algoritmo de otimização no Sklearn, denominado Stochastic Gradient Descent (SGD).

Stochastic Gradient Descent (SGD) é um algoritmo de otimização simples, mas eficiente, usado para encontrar os valores de parâmetros / coeficientes de funções que minimizam uma função de custo. Em outras palavras, é usado para aprendizagem discriminativa de classificadores lineares sob funções de perda convexa, como SVM e regressão logística. Ele foi aplicado com sucesso a conjuntos de dados em grande escala porque a atualização dos coeficientes é realizada para cada instância de treinamento, e não no final das instâncias.

Classificador SGD

O classificador Stochastic Gradient Descent (SGD) basicamente implementa uma rotina de aprendizagem SGD simples, suportando várias funções de perda e penalidades para a classificação. Scikit-learn forneceSGDClassifier módulo para implementar a classificação SGD.

Parâmetros

A tabela a seguir consiste nos parâmetros usados ​​por SGDClassifier módulo -

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

loss - str, default = 'dobradiça'

Ele representa a função de perda a ser usada durante a implementação. O valor padrão é 'dobradiça', o que nos dará um SVM linear. As outras opções que podem ser usadas são -

  • log - Essa perda nos dará uma regressão logística, ou seja, um classificador probabilístico.

  • modified_huber - uma perda suave que traz tolerância para outliers junto com estimativas de probabilidade.

  • squared_hinge - semelhante à perda 'dobradiça', mas é penalizada quadraticamente.

  • perceptron - como o nome sugere, é uma perda linear que é usada pelo algoritmo perceptron.

2

penalty - str, 'nenhum', 'l2', 'l1', 'elasticnet'

É o termo de regularização usado no modelo. Por padrão, é L2. Podemos usar L1 ou 'elasticnet; também, mas ambos podem trazer esparsidade para o modelo, portanto, não alcançável com L2.

3

alpha - flutuante, padrão = 0,0001

Alpha, a constante que multiplica o termo de regularização, é o parâmetro de ajuste que decide o quanto queremos penalizar o modelo. O valor padrão é 0,0001.

4

l1_ratio - flutuante, padrão = 0,15

Isso é chamado de parâmetro de mistura ElasticNet. Seu intervalo é 0 <= l1_ratio <= 1. Se l1_ratio = 1, a penalidade seria a penalidade de L1. Se l1_ratio = 0, a penalidade seria uma penalidade L2.

5

fit_intercept - Booleano, padrão = verdadeiro

Este parâmetro especifica que uma constante (polarização ou interceptação) deve ser adicionada à função de decisão. Nenhuma interceptação será usada no cálculo e os dados serão considerados já centrados, se forem configurados como falsos.

6

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

Este parâmetro representa o critério de parada para iterações. Seu valor padrão é False, mas se definido como Nenhum, as iterações irão parar quandoloss > best_loss - tol for n_iter_no_changeépocas sucessivas.

7

shuffle - Booleano, opcional, padrão = Verdadeiro

Este parâmetro representa se queremos que nossos dados de treinamento sejam misturados após cada época ou não.

8

verbose - inteiro, padrão = 0

Ele representa o nível de verbosidade. Seu valor padrão é 0.

9

epsilon - flutuante, padrão = 0,1

Este parâmetro especifica a largura da região insensível. Se perda = 'insensível a epsilon', qualquer diferença, entre a previsão atual e o rótulo correto, menor que o limite seria ignorada.

10

max_iter - int, opcional, padrão = 1000

Como o nome sugere, ele representa o número máximo de passagens ao longo das épocas, ou seja, dados de treinamento.

11

warm_start - bool, opcional, padrão = falso

Com este parâmetro definido como True, podemos reutilizar a solução da chamada anterior para caber como inicialização. Se escolhermos o padrão, ou seja, falso, ele apagará a solução anterior.

12

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 - Neste 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.

13

n_jobs - int ou nenhum, opcional, padrão = nenhum

Representa o número de CPUs a serem usadas na computação OVA (One Versus All), para problemas de várias classes. O valor padrão é nenhum, o que significa 1.

14

learning_rate - string, opcional, padrão = 'ideal'

  • Se a taxa de aprendizagem for 'constante', eta = eta0;

  • Se a taxa de aprendizagem é 'ótima', eta = 1,0 / (alpha * (t + t0)), onde t0 é escolhido por Leon Bottou;

  • Se taxa de aprendizagem = 'invscalling', eta = eta0 / pow (t, power_t).

  • Se a taxa de aprendizagem = 'adaptável', eta = eta0.

15

eta0 - duplo, padrão = 0,0

Representa a taxa de aprendizado inicial para as opções de taxa de aprendizado mencionadas acima, ou seja, 'constante', 'invscalling' ou 'adaptável'.

16

power_t - iduplo, padrão = 0,5

É o expoente para a taxa de aprendizagem "crescente".

17

early_stopping - bool, padrão = False

Este parâmetro representa o uso de parada antecipada para encerrar o treinamento quando a pontuação de validação não está melhorando. Seu valor padrão é falso, mas quando definido como verdadeiro, ele automaticamente separa uma fração estratificada dos dados de treinamento como validação e interrompe o treinamento quando a pontuação de validação não está melhorando.

18

validation_fraction - flutuante, padrão = 0,1

Só é usado quando a parada precoce é verdadeira. Representa a proporção de dados de treinamento a serem definidos como validação definida para o encerramento antecipado de dados de treinamento.

19

n_iter_no_change - int, padrão = 5

Ele representa o número de iterações sem melhorias, caso o algoritmo seja executado antes da parada antecipada.

20

classs_weight - dict, {class_label: weight} ou “balanceado”, ou nenhum, opcional

Este parâmetro representa os pesos associados às classes. Se não forem fornecidas, as classes devem ter peso 1.

20

warm_start - bool, opcional, padrão = falso

Com este parâmetro definido como True, podemos reutilizar a solução da chamada anterior para caber como inicialização. Se escolhermos o padrão, ou seja, falso, ele apagará a solução anterior.

21

average - iBoolean ou int, opcional, default = false

Representa o número de CPUs a serem usadas na computação OVA (One Versus All), para problemas de várias classes. O valor padrão é nenhum, o que significa 1.

Atributos

A tabela a seguir consiste nos atributos usados ​​por SGDClassifier módulo -

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

coef_ - array, shape (1, n_features) if n_classes == 2, else (n_classes, n_features)

Este atributo fornece o peso atribuído aos recursos.

2

intercept_ - matriz, forma (1,) se n_classes == 2, senão (n_classes,)

Ele representa o termo independente na função de decisão.

3

n_iter_ - int

Fornece o número de iterações para atingir o critério de parada.

Implementation Example

Como outros classificadores, Stochastic Gradient Descent (SGD) deve ser equipado com as seguintes duas matrizes -

  • Um array X contendo as amostras de treinamento. É do tamanho [n_samples, n_features].

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

Example

O script Python a seguir usa o modelo linear SGDClassifier -

import numpy as np
from sklearn import linear_model
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
Y = np.array([1, 1, 2, 2])
SGDClf = linear_model.SGDClassifier(max_iter = 1000, tol=1e-3,penalty = "elasticnet")
SGDClf.fit(X, Y)

Output

SGDClassifier(
   alpha = 0.0001, average = False, class_weight = None,
   early_stopping = False, epsilon = 0.1, eta0 = 0.0, fit_intercept = True,
   l1_ratio = 0.15, learning_rate = 'optimal', loss = 'hinge', max_iter = 1000,
   n_iter = None, n_iter_no_change = 5, n_jobs = None, penalty = 'elasticnet',
   power_t = 0.5, random_state = None, shuffle = True, tol = 0.001,
   validation_fraction = 0.1, verbose = 0, warm_start = False
)

Example

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

SGDClf.predict([[2.,2.]])

Output

array([2])

Example

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

SGDClf.coef_

Output

array([[19.54811198, 9.77200712]])

Example

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

SGDClf.intercept_

Output

array([10.])

Example

Podemos obter a distância sinalizada para o hiperplano usando SGDClassifier.decision_function como usado no seguinte script python -

SGDClf.decision_function([[2., 2.]])

Output

array([68.6402382])

Regressor SGD

O regressor Stochastic Gradient Descent (SGD) basicamente implementa uma rotina de aprendizagem SGD simples que suporta várias funções de perda e penalidades para ajustar modelos de regressão linear. Scikit-learn forneceSGDRegressor módulo para implementar a regressão SGD.

Parâmetros

Parâmetros usados ​​por SGDRegressorsão quase os mesmos que foram usados ​​no módulo SGDClassifier. A diferença está no parâmetro 'perda'. ParaSGDRegressor parâmetro de perda dos módulos, os valores positivos são os seguintes -

  • squared_loss - Refere-se ao ajuste de mínimos quadrados ordinários.

  • huber: SGDRegressor- corrigir os outliers mudando de perda quadrada para linear após uma distância de épsilon. O trabalho de 'huber' é modificar 'squared_loss' para que o algoritmo se concentre menos na correção de outliers.

  • epsilon_insensitive - Na verdade, ele ignora os erros menores que épsilon.

  • squared_epsilon_insensitive- É o mesmo que epsilon_insensitive. A única diferença é que se torna a perda quadrática após a tolerância de épsilon.

Outra diferença é que o parâmetro denominado 'power_t' tem o valor padrão de 0,25 em vez de 0,5 como em SGDClassifier. Além disso, ele não possui os parâmetros 'class_weight' e 'n_jobs'.

Atributos

Os atributos de SGDRegressor também são iguais aos do módulo SGDClassifier. Em vez disso, tem três atributos extras como segue -

  • average_coef_ - matriz, forma (n_features,)

Como o nome sugere, ele fornece os pesos médios atribuídos aos recursos.

  • average_intercept_ - matriz, forma (1,)

Como o nome sugere, ele fornece o termo médio de interceptação.

  • t_ - int

Ele fornece o número de atualizações de peso realizadas durante a fase de treinamento.

Note - os atributos average_coef_ e average_intercept_ funcionarão após habilitar o parâmetro 'average' para True.

Implementation Example

O seguinte script Python usa SGDRegressor modelo linear -

import numpy as np
from sklearn import linear_model
n_samples, n_features = 10, 5
rng = np.random.RandomState(0)
y = rng.randn(n_samples)
X = rng.randn(n_samples, n_features)
SGDReg =linear_model.SGDRegressor(
   max_iter = 1000,penalty = "elasticnet",loss = 'huber',tol = 1e-3, average = True
)
SGDReg.fit(X, y)

Output

SGDRegressor(
   alpha = 0.0001, average = True, early_stopping = False, epsilon = 0.1,
   eta0 = 0.01, fit_intercept = True, l1_ratio = 0.15,
   learning_rate = 'invscaling', loss = 'huber', max_iter = 1000,
   n_iter = None, n_iter_no_change = 5, penalty = 'elasticnet', power_t = 0.25,
   random_state = None, shuffle = True, tol = 0.001, validation_fraction = 0.1,
   verbose = 0, warm_start = False
)

Example

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

SGDReg.coef_

Output

array([-0.00423314, 0.00362922, -0.00380136, 0.00585455, 0.00396787])

Example

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

SGReg.intercept_

Output

SGReg.intercept_

Example

Podemos obter o número de atualizações de peso durante a fase de treinamento com a ajuda do seguinte script python -

SGDReg.t_

Output

61.0

Prós e Contras do SGD

Seguindo os prós do SGD -

  • Stochastic Gradient Descent (SGD) é muito eficiente.

  • É muito fácil de implementar, pois há muitas oportunidades para ajuste de código.

Seguindo os contras do SGD -

  • Stochastic Gradient Descent (SGD) requer vários hiperparâmetros como parâmetros de regularização.

  • É sensível ao dimensionamento de recursos.