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