Wenn Modelle bei den Trainingsdaten, mit denen sie gefüttert werden, eine sehr gute Leistung erbringen, sich aber nicht auf nicht sichtbare Daten verallgemeinern lassen, ist dies eines der Merkmale dafür, dass das Modell eine Überanpassung an die Trainingsdaten aufweist. Eine sehr gute Möglichkeit, eine Überanpassung zu vermeiden, besteht darin, einige Parameter der Modelle durch Regularisierung einzuschränken.
Die Regularisierung in Modellen erfolgt durch Hinzufügen einer Strafe zur Kostenfunktion.
Verschiedene Regressionstypen bieten unterschiedliche Möglichkeiten, die Gewichtung dieser Modelle einzuschränken. Wir haben Ridge-Regression, Lasso-Regression und Elastic Web. Bevor wir jedoch mit diesen Regressionstypen der hinzugefügten Strafe fortfahren, wollen wir zwei Arten von Normen verstehen.
Der l2 Und l1 Norm
Im Allgemeinen werden Normen zur Berechnung des Abstands zwischen zwei Vektoren verwendet. Diese werden normalerweise zur Berechnung von Fehlern verwendet. Dies erfolgt durch Berechnung des Abstands zwischen dem Vektor von tatsächliche Werte und der Vektor des vorhergesagte Werte.
Der l2 Die auch als euklidische Norm bekannte Norm berechnet den Abstand zwischen den beiden Vektoren, indem sie eine Linie direkt von einem Punkt zum anderen zieht. Der Abstand dieser Linie bestimmt den Rechenfehler.
In ihrer einfachen Type kann zur Berechnung dieser Norm die bekannte pythagoräische Formel verwendet werden.
Der l1- oder Manhattan-Abstand wird verwendet, um den Abstand zwischen zwei Vektoren zu berechnen, indem die Summe der absoluten Summe der Elemente gebildet wird.
Um dies zu verstehen, nehmen wir es vom Namen. Stellen Sie sich einen Ort in Manhattan vor. Um einen bestimmten Punkt zu erreichen, müssen wir uns in Type eines Gitters bewegen und können uns aufgrund der dazwischen liegenden Gebäude nicht in Type einer geraden diagonalen Linie bewegen. Daher müssen wir uns innerhalb des Rasters in vertikalen und horizontalen Abständen bewegen. Wir werden uns später ausführlicher mit den Normen befassen.
Nachdem wir das nun verstanden haben, wollen wir uns mit den hinzugefügten Strafen und den Modellen befassen.
Bei der Ridge-Regression kommt es zu einer Strafe in Höhe des halben Quadrats der l2-Norm, die zur Kostenfunktion addiert wird, was dem mittleren quadratischen Fehler entspricht. Die zur Kostenfunktion hinzugefügte Strafe stellt sicher, dass die Gewichte der Parameter so gering wie möglich sind.
Alpha steuert den Grad der Regularisierung, der auf das Modell angewendet werden soll. Dies wird normalerweise in Type von Intervallen wie 0,001, 0,01, 1, 10, 100 usw. berücksichtigt. Wenn Alpha gleich 0 ist, haben wir ein normales Regressionsmodell. Wenn wir einen sehr großen Alpha-Wert haben, liegen alle Gewichte sehr nahe bei Null und wir haben eine flache Linie, die durch den Mittelwert der Daten verläuft.
Lassen Sie uns das Folgende auf einen zufällig generierten Datensatz mit einem einzelnen Parameter anwenden, um zu verstehen, wie dies implementiert wird.
X bezeichnet unseren Merkmalsvektor, und wir generieren ein einzelnes Merkmal mit Werten von -10 bis 20. y bezeichnet die Bezeichnung oder die Zielwerte und entspricht der Gleichung y = 1 + 0,5X, die eine lineare Gleichung ergibt. Wir haben den Beschriftungen wie gezeigt etwas Rauschen hinzugefügt.
import numpy as np
from matplotlib import pyplot as pltnp.random.seed(42)
m = 20
X = 30 * np.random.rand(m, 1) - 10 # creates random X values from -10 to twenty
random_noise = np.random.randn(m, 1) / 0.5 # the place 0.5 is the dimensions issue
y = 1 + 0.5 * X + random_noise
Von unten kann Alpha angepasst werden, was die Regularisierung zeigt. Sie können damit herumspielen und sich die Änderungen notieren. random_state stellt sicher, dass wir bei der Wiederholung das gleiche Ergebnis erhalten, ohne dass sich die Werte aufgrund der Zufälligkeit der Daten ändern. Wir können andere Löser wie Stochastic Common Gradient (Sag), Single Worth Decomposition (SVD) usw. verwenden.
from sklearn.linear_model import Ridge, LinearRegression
from sklearn.metrics import mean_squared_errorridge_model = Ridge(alpha=1, solver="cholesky", random_state=42)
ridge_model.match(X, y)
ridge_model.coef_, ridge_model.intercept_
## outputs under
# (array([[0.46527694]]), array([0.58392585]))
ridge_model.predict([[50]])
# outputs 23.84777305
# The perfect worth for the above is gotten from the equation y = 1 + 0.5x
# therefore y = 1 + 0.5(50) = 26
Aus dem oben Gesagten schätzte das Ridge-Modell das Gewicht des Koeffizienten auf 0,47, was nahe am ursprünglichen Wert von 0,5 liegt. Der vorhergesagte Schnittpunkt liegt bei 0,58 und der vorhergesagte Wert bei ca. 23.85
Versuchen Sie, mit dem Regularisierungsbegriff Alpha herumzuspielen und sehen Sie, was Sie selbst finden können.
Das manuelle Anpassen des Alpha-Werts ist nicht die idealste Scenario. Um das beste Alpha auszuwählen, können wir mithilfe der Rastersuche versuchen, das zu erreichen, was wir wollen. Der folgende Code testet verschiedene Alpha-Werte.
from sklearn.model_selection import GridSearchCV# Arrange the mannequin and grid search
mannequin = Ridge()
parameters = {'alpha': [0.0001, 0.001, 0.01, 0.1, 1, 10, 100]}
ridge = GridSearchCV(mannequin, parameters, cv=5)
ridge.match(X, y)
# Outputthe greatest alpha
print(f"Finest alpha: {ridge.best_params_}")
# Check out prediction your self utilizing this mannequin
# Trace: use ridge.predict()
Lasso-Regression
Im Gegensatz zur Ridge-Regression fügt die Lasso-Regression eine Strafe hinzu, die die Verwendung der l1- oder Manhattan-Norm zum Gewichtsvektor verwendet. Die l1-Norm erzeugt eine dünn besetzte Lösung, bei der die meisten Modellgewichte auf Null reduziert werden. Unwichtige Merkmalswerte werden auf 0 herabgesetzt und neigen daher dazu, das Gewicht der unwichtigsten Merkmale zu eliminieren. Daher versucht es, nicht nützliche Funktionen zu vernachlässigen und führt eine automatische Funktionsauswahl durch.
Die Lasso-Regression kann wie folgt mit Rastersuche implementiert werden, um den besten Alpha-Wert zu erhalten
Um Lasso alleine zu implementieren, können wir Folgendes tun.
from sklearn.linear_model import Lassolasso_model = Lasso(alpha=10, random_state=42)
lasso_model.match(X, y)
lasso_model.coef_, lasso_model.intercept_
Aber vergleichen wir die Leistung der Lasso-Regression im Gegensatz zur Ridge-Regression, indem wir unten dem Merkmalsvektor X ein nicht nützliches Merkmal hinzufügen.
# generate non-useful characteristic
non_useful_feature = 100 * np.random.rand(m, 1) - 50 # random numbers between -50 and 50# Add the non_useful_feature as a column within the new characteristic vector X_new
# by horizontally stacking the earlier characteristic vector X with the non_useful options
X_new = np.hstack([X, non_useful_feature])
X_new
Führen Sie eine Rastersuche für das Ridge-Modell für den neuen Function-Vektor X_new durch, wobei die Beschriftung y gleich bleibt
from sklearn.model_selection import GridSearchCV# Arrange the mannequin and grid search
mannequin = Ridge()
parameters = {'alpha': [0.0001, 0.001, 0.01, 0.1, 1, 10, 100]}
ridge_m = GridSearchCV(mannequin, parameters, cv=5)
ridge_m.match(X_new, y)
# Outpits the very best alpha
print(f"Finest alpha: {ridge_m.best_params_}")
Führen Sie eine Rastersuche nach dem Lasso-Modell für den neuen Merkmalsvektor X durch, wobei die Beschriftung y gleich bleibt
mannequin = Lasso()
parameters = {'alpha': [0.0001, 0.001, 0.01, 0.1, 1, 10, 100]}
lasso_m = GridSearchCV(mannequin, parameters, cv=5)lasso_m.match(X_new, y)
# Outputs the very best alpha
print(f"Finest alpha: {lasso_m.best_params_}")
Lassen Sie uns die Vorhersage mit beiden oben genannten Modellen durchführen.
Für Ridge
print(f"Prediction for Ridge: {ridge_m.predict([[250, 50]])}")
# outputs - Prediction for Ridge: [[122.27607691]]
Für Lasso
print(f"Prediction for Lasso: {lasso_m.predict([[250, 50]])}")
#outputs - Prediction for Lasso: [122.69694706]
Aus dem oben Gesagten sehen wir, dass Lasso im Allgemeinen eine bessere Leistung erbringt als die Ridge-Regression, wenn wir eine nicht nützliche Funktion im Datensatz haben.
Elastisches Netz
Elastic Web ist eine Kombination aus Ridge und Lasso und fungiert tendenziell als Mittelweg für beide. Es fungiert als lineare Kombination beider Strafen für die l1- und l2-Norm. Wenn r genau 1 ist, ist die Kostenfunktion gleich der der Lasso-Regressionen. Wenn r genau 0 ist, haben wir eine Kostenfunktion, die der der Ridge-Regression entspricht.
Lassen Sie uns unten ein elastisches Netz implementieren!
elastic_model = ElasticNet()# Outline the parameter grid
param_grid = {
'alpha': [0.0001, 0.001, 0.01, 0.1, 1, 10, 100],
'l1_ratio': [0.1, 0.2, 0.3,0.4,0.5,0.6, 0.7, 0.8, 0.9]
}
elastic_grid = GridSearchCV(elastic_model, param_grid, cv=5)
elastic_grid.match(X_new, y)
elastic_grid.best_estimator_
elastic_grid.predict([[250, 50]])
# outputs 120.34651985
Wann sollte Was verwendet werden?
Wenn Sie einen Blick auf die obigen Vorhersagen werfen, ist Ihnen vielleicht aufgefallen, dass ElasticNet scheinbar schlechter abschneidet als die beiden oben genannten, obwohl die Entscheidung darüber durch eine Kreuzvalidierung getroffen werden kann. Wie entscheiden Sie additionally, wann oder ob überhaupt welche Artwork der Regularisierung verwendet wird?
Im Allgemeinen ist es nicht ratsam, ein LinearRegression-Modell ohne Regularisierung zu verwenden. Ridge bietet eine bessere Leistung, wenn Sie wissen, wann die meisten Ihrer Funktionen wichtig sind. Verwenden Sie Lasso oder Elastic Web, wenn Sie über einige wichtige Funktionen verfügen. Lasso sollte vermieden werden, wenn wir mehrere korrelierte Merkmale haben. ElasticNet wird im Allgemeinen bevorzugt, wenn wir über eine große Anzahl von Funktionen verfügen. Im obigen ElasticNet-Ergebnis haben wir eine sehr geringe Anzahl von Funktionen, daher sehen wir, dass Elastic Web keine gute Leistung erbringt.
Zusammenfassend lässt sich sagen, dass Ridge, Lasso und Elastic Web robuste Regularisierungstechniken für den Umgang mit Überanpassungen und die Verbesserung der Modellverallgemeinerung sind. Unabhängig von den oben hervorgehobenen Anwendungsfällen sollten Sie sich darüber im Klaren sein, dass es keine allgemeingültige beste Wahl gibt – die Auswahl hängt vom Kontext und Datensatz Ihres Issues ab. Aus diesem Grund ist es ratsam, die Ergebnisse zu testen und zu vergleichen. Im Gegensatz zu dem Vergleich professional Fall, den wir oben durchgeführt haben, besteht der beste Weg, Regressionsmodelle zu vergleichen, darin, den Fehler zu betrachten. Wir können entweder den mittleren quadratischen Fehler oder den quadratischen Mittelwert jedes Modells nehmen und die Werte vergleichen. Instruments wie Kreuzvalidierung oder Rastersuche können bei der Auswahl der besten Modell- und Hyperparameter helfen. Denken Sie daran, dass das Ziel darin besteht, Modelle zu erstellen, die sich intestine auf neue Daten übertragen lassen. Eine Regularisierung, gepaart mit einem guten Verständnis Ihrer Daten und einem systematischen Modellauswahlansatz, wird dabei helfen, dieses Ziel zu erreichen.
Wenn Ihnen dieser Artikel gefällt, hinterlassen Sie bitte einen Applaus oder mehr und folgen Sie mir für mehr!
Ich schreibe, um mehr zu verstehen.
Wenn Ihnen ein Fehler aufgefallen ist, Sie Verbesserungsvorschläge für den Artikel haben oder Kontakt mit mir aufnehmen möchten, können Sie mir gerne eine Nachricht senden LinkedIn oder Twitter
Schauen Sie sich meine vorherigen Artikel an: