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