Scikit Learn - Stochastischer Gradientenabstieg

Hier lernen wir einen Optimierungsalgorithmus in Sklearn kennen, der als Stochastic Gradient Descent (SGD) bezeichnet wird.

Stochastic Gradient Descent (SGD) ist ein einfacher, aber effizienter Optimierungsalgorithmus, mit dem die Werte von Parametern / Koeffizienten von Funktionen ermittelt werden, die eine Kostenfunktion minimieren. Mit anderen Worten, es wird zum diskriminativen Lernen von linearen Klassifikatoren unter konvexen Verlustfunktionen wie SVM und logistischer Regression verwendet. Es wurde erfolgreich auf große Datensätze angewendet, da die Aktualisierung der Koeffizienten für jede Trainingsinstanz und nicht am Ende der Instanzen durchgeführt wird.

SGD-Klassifikator

Der SGD-Klassifikator (Stochastic Gradient Descent) implementiert im Wesentlichen eine einfache SGD-Lernroutine, die verschiedene Verlustfunktionen und Strafen für die Klassifizierung unterstützt. Scikit-Learn bietetSGDClassifier Modul zur Implementierung der SGD-Klassifizierung.

Parameter

Die folgende Tabelle enthält die von verwendeten Parameter SGDClassifier Modul -

Sr.Nr. Parameter & Beschreibung
1

loss - str, default = 'Scharnier'

Es stellt die Verlustfunktion dar, die während der Implementierung verwendet werden soll. Der Standardwert ist 'Scharnier', wodurch wir eine lineare SVM erhalten. Die anderen Optionen, die verwendet werden können, sind -

  • log - Dieser Verlust gibt uns eine logistische Regression, dh einen probabilistischen Klassifikator.

  • modified_huber - ein reibungsloser Verlust, der Ausreißern Toleranz zusammen mit Wahrscheinlichkeitsschätzungen bringt.

  • squared_hinge - Ähnlich wie bei einem Scharnierverlust, wird jedoch quadratisch bestraft.

  • perceptron - Wie der Name schon sagt, handelt es sich um einen linearen Verlust, der vom Perzeptron-Algorithmus verwendet wird.

2

penalty - str, 'keine', 'l2', 'l1', 'elastisches Netz'

Dies ist der im Modell verwendete Regularisierungsterm. Standardmäßig ist es L2. Wir können L1 oder 'Elasticnet verwenden; auch, aber beide könnten dem Modell Sparsamkeit verleihen, was mit L2 nicht erreichbar ist.

3

alpha - float, Standard = 0,0001

Alpha, die Konstante, die den Regularisierungsterm multipliziert, ist der Abstimmungsparameter, der entscheidet, wie sehr wir das Modell bestrafen möchten. Der Standardwert ist 0,0001.

4

l1_ratio - float, Standard = 0,15

Dies wird als ElasticNet-Mischparameter bezeichnet. Sein Bereich ist 0 <= l1_ratio <= 1. Wenn l1_ratio = 1 wäre, wäre die Strafe L1 Strafe. Wenn l1_ratio = 0 ist, wäre die Strafe eine L2-Strafe.

5

fit_intercept - Boolean, Standard = True

Dieser Parameter gibt an, dass der Entscheidungsfunktion eine Konstante (Bias oder Intercept) hinzugefügt werden soll. Bei der Berechnung wird kein Achsenabschnitt verwendet, und es wird angenommen, dass die Daten bereits zentriert sind, wenn sie auf false gesetzt werden.

6

tol - float oder none, optional, Standard = 1.e-3

Dieser Parameter repräsentiert das Stoppkriterium für Iterationen. Der Standardwert ist False. Wenn dieser Wert jedoch auf None gesetzt ist, werden die Iterationen gestoppt, wennloss > best_loss - tol for n_iter_no_changeaufeinanderfolgende Epochen.

7

shuffle - Boolesch, optional, Standard = True

Dieser Parameter gibt an, ob unsere Trainingsdaten nach jeder Epoche gemischt werden sollen oder nicht.

8

verbose - Ganzzahl, Standard = 0

Es repräsentiert die Ausführlichkeitsstufe. Der Standardwert ist 0.

9

epsilon - float, Standard = 0.1

Dieser Parameter gibt die Breite des unempfindlichen Bereichs an. Wenn Verlust = "epsilonunempfindlich" ist, wird jeder Unterschied zwischen der aktuellen Vorhersage und der korrekten Bezeichnung, der unter dem Schwellenwert liegt, ignoriert.

10

max_iter - int, optional, Standard = 1000

Wie der Name schon sagt, repräsentiert es die maximale Anzahl von Durchgängen über die Epochen, dh Trainingsdaten.

11

warm_start - bool, optional, default = false

Wenn dieser Parameter auf True gesetzt ist, können wir die Lösung des vorherigen Aufrufs als Initialisierung wiederverwenden. Wenn wir Standard wählen, dh false, wird die vorherige Lösung gelöscht.

12

random_state - int, RandomState-Instanz oder None, optional, default = none

Dieser Parameter stellt den Startwert der erzeugten Pseudozufallszahl dar, die beim Mischen der Daten verwendet wird. Folgende Optionen stehen zur Verfügung.

  • int - In diesem Fall random_state ist der vom Zufallszahlengenerator verwendete Startwert.

  • RandomState instance - In diesem Fall random_state ist der Zufallszahlengenerator.

  • None - In diesem Fall ist der Zufallszahlengenerator die von np.random verwendete RandonState-Instanz.

13

n_jobs - int oder none, optional, Default = None

Es gibt die Anzahl der CPUs an, die bei der OVA-Berechnung (One Versus All) für Probleme mit mehreren Klassen verwendet werden sollen. Der Standardwert ist none, was 1 bedeutet.

14

learning_rate - Zeichenfolge, optional, Standard = 'optimal'

  • Wenn die Lernrate 'konstant' ist, ist eta = eta0;

  • Wenn die Lernrate 'optimal' ist, ist eta = 1,0 / (alpha * (t + t0)), wobei t0 von Leon Bottou gewählt wird;

  • Wenn die Lernrate = "invscalling" ist, ist eta = eta0 / pow (t, power_t).

  • Wenn die Lernrate = 'adaptiv' ist, ist eta = eta0.

15

eta0 - double, default = 0.0

Es stellt die anfängliche Lernrate für die oben genannten Lernratenoptionen dar, dh "konstant", "aufrufend" oder "adaptiv".

16

power_t - idouble, Standard = 0,5

Es ist der Exponent für die Lernrate.

17

early_stopping - bool, default = False

Dieser Parameter stellt die Verwendung eines frühen Stopps dar, um das Training zu beenden, wenn sich der Validierungswert nicht verbessert. Der Standardwert ist false, aber wenn er auf true gesetzt ist, wird automatisch ein geschichteter Teil der Trainingsdaten als Validierung beiseite gelegt und das Training abgebrochen, wenn sich der Validierungswert nicht verbessert.

18

validation_fraction - float, Standard = 0.1

Es wird nur verwendet, wenn Early_Stopping wahr ist. Es stellt den Anteil der Trainingsdaten dar, der als Validierungssatz für die vorzeitige Beendigung von Trainingsdaten beiseite gelegt werden soll.

19

n_iter_no_change - int, Standard = 5

Es stellt die Anzahl der Iterationen ohne Verbesserung dar, sollte der Algorithmus vor dem frühen Stoppen ausgeführt werden.

20

classs_weight - diktieren, {class_label: weight} oder "ausgeglichen" oder Keine, optional

Dieser Parameter repräsentiert die mit Klassen verknüpften Gewichte. Wenn nicht angegeben, sollen die Klassen Gewicht 1 haben.

20

warm_start - bool, optional, default = false

Wenn dieser Parameter auf True gesetzt ist, können wir die Lösung des vorherigen Aufrufs als Initialisierung wiederverwenden. Wenn wir Standard wählen, dh false, wird die vorherige Lösung gelöscht.

21

average - iBoolean oder int, optional, default = false

Es gibt die Anzahl der CPUs an, die bei der OVA-Berechnung (One Versus All) für Probleme mit mehreren Klassen verwendet werden sollen. Der Standardwert ist none, was 1 bedeutet.

Attribute

Die folgende Tabelle enthält die von verwendeten Attribute SGDClassifier Modul -

Sr.Nr. Attribute & Beschreibung
1

coef_ - Array, Form (1, n_Features) wenn n_classes == 2, sonst (n_classes, n_features)

Dieses Attribut gibt das den Features zugewiesene Gewicht an.

2

intercept_ - Array, Form (1,) wenn n_classes == 2, sonst (n_classes,)

Es repräsentiert den unabhängigen Begriff in der Entscheidungsfunktion.

3

n_iter_ - int

Es gibt die Anzahl der Iterationen an, um das Stoppkriterium zu erreichen.

Implementation Example

Wie andere Klassifikatoren muss auch der stochastische Gradientenabstieg (SGD) mit den folgenden zwei Arrays ausgestattet werden:

  • Ein Array X, das die Trainingsmuster enthält. Es hat die Größe [n_samples, n_features].

  • Ein Array Y, das die Zielwerte enthält, dh Klassenbezeichnungen für die Trainingsmuster. Es hat die Größe [n_samples].

Example

Das folgende Python-Skript verwendet das lineare Modell 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

Nach der Anpassung kann das Modell neue Werte wie folgt vorhersagen:

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

Output

array([2])

Example

Für das obige Beispiel können wir den Gewichtsvektor mit Hilfe des folgenden Python-Skripts erhalten -

SGDClf.coef_

Output

array([[19.54811198, 9.77200712]])

Example

In ähnlicher Weise können wir den Wert des Abfangens mithilfe des folgenden Python-Skripts ermitteln:

SGDClf.intercept_

Output

array([10.])

Example

Wir können den vorzeichenbehafteten Abstand zur Hyperebene mithilfe von ermitteln SGDClassifier.decision_function wie im folgenden Python-Skript verwendet -

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

Output

array([68.6402382])

SGD Regressor

Der Stochastic Gradient Descent (SGD) -Regressor implementiert im Wesentlichen eine einfache SGD-Lernroutine, die verschiedene Verlustfunktionen und Strafen unterstützt, um lineare Regressionsmodelle anzupassen. Scikit-Learn bietetSGDRegressor Modul zur Implementierung der SGD-Regression.

Parameter

Von SGDRegressorsind fast die gleichen wie im SGDClassifier-Modul. Der Unterschied liegt im Parameter 'Verlust'. ZumSGDRegressor Verlustparameter der Module Die positiven Werte sind wie folgt:

  • squared_loss - Es bezieht sich auf die gewöhnliche Anpassung der kleinsten Quadrate.

  • huber: SGDRegressor- Korrigieren Sie die Ausreißer, indem Sie über eine Entfernung von Epsilon vom quadratischen zum linearen Verlust wechseln. Die Arbeit von 'huber' besteht darin, 'squared_loss' so zu modifizieren, dass sich der Algorithmus weniger auf die Korrektur von Ausreißern konzentriert.

  • epsilon_insensitive - Tatsächlich werden die Fehler weniger als bei epsilon ignoriert.

  • squared_epsilon_insensitive- Es ist dasselbe wie epsilon_insensitive. Der einzige Unterschied besteht darin, dass es nach einer Toleranz von Epsilon zu einem quadratischen Verlust wird.

Ein weiterer Unterschied besteht darin, dass der Parameter 'power_t' den Standardwert 0,25 anstelle von 0,5 wie in hat SGDClassifier. Darüber hinaus gibt es keine Parameter 'class_weight' und 'n_jobs'.

Attribute

Die Attribute von SGDRegressor sind auch dieselben wie die des SGDClassifier-Moduls. Vielmehr hat es drei zusätzliche Attribute wie folgt:

  • average_coef_ - Array, Form (n_features,)

Wie der Name schon sagt, werden die den Features zugewiesenen Durchschnittsgewichte angegeben.

  • average_intercept_ - Array, Form (1,)

Wie der Name schon sagt, liefert es den gemittelten Intercept-Term.

  • t_ - int

Es gibt die Anzahl der Gewichtsaktualisierungen an, die während der Trainingsphase durchgeführt wurden.

Note - Die Attribute durchschnittlich_coef_ und durchschnittlich_intercept_ funktionieren, nachdem der Parameter 'Durchschnitt' auf True gesetzt wurde.

Implementation Example

Das folgende Python-Skript verwendet SGDRegressor lineares Modell -

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

Nach dem Anpassen können wir den Gewichtsvektor mithilfe des folgenden Python-Skripts abrufen:

SGDReg.coef_

Output

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

Example

In ähnlicher Weise können wir den Wert des Abfangens mithilfe des folgenden Python-Skripts ermitteln:

SGReg.intercept_

Output

SGReg.intercept_

Example

Wir können die Anzahl der Gewichtsaktualisierungen während der Trainingsphase mithilfe des folgenden Python-Skripts ermitteln:

SGDReg.t_

Output

61.0

Vor- und Nachteile von SGD

Den Profis von SGD folgen -

  • Der stochastische Gradientenabstieg (SGD) ist sehr effizient.

  • Es ist sehr einfach zu implementieren, da es viele Möglichkeiten zur Code-Optimierung gibt.

Nach den Nachteilen von SGD -

  • Der stochastische Gradientenabstieg (SGD) erfordert mehrere Hyperparameter wie Regularisierungsparameter.

  • Es reagiert empfindlich auf die Skalierung von Features.