Hallo. Gestern habe ich über die typische Minimum-Square-Methode (OLS) gesprochen, die ein typisches Modell der linearen Regression ist. Dieses Mal werde ich über Ridge-Regression und Lasso-Regression schreiben.
Die Regression mit einem linearen Modell verwendet buchstäblich eine lineare Funktion, um die Zielvariable vorherzusagen. Und die Zielvariable könnte durch die folgende Formel ausgedrückt werden.
y' = w_1x_1 + w_2x_2 + \dots + w_mx_m (x_1, x_2, \dots, x_m:Erklärende Variable, y':Voraussichtlicher Wert, w_1,w_2, \dots, w_m :Regressionskoeffizienten)
Wenn Sie es mit dem hinzugefügten Abschnitt schreiben,
y' = w_0x_0 + w_1x_1 + w_2x_2 + \dots + w_mx_m (w_0,Sektion: x_0 = 1)
Wenn in Vektor geschrieben,
y' = {\bf x^T}{\bf w}
Da es nicht immer nur einen Vektor (erklärende Variable) von x gibt, liegt x in Form einer Matrix vor. Mit anderen Worten
\left(
\begin{array}{cccc}
y_{1} \\
y_{2} \\
y_{3} \\
\vdots \\
y_{n}
\end{array}
\right)
= \left(
\begin{array}{cccc}
1 & x_{11} & x_{21} & \ldots & x_{m1} \\
1 & x_{12} & x_{22} & \ldots & x_{m2} \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
1 & x_{1n} & x_{2n} & \ldots & x_{mn}
\end{array}
\right)
\left(
\begin{array}{cccc}
w_{1} \\
w_{2} \\
w_{3} \\
\vdots \\
w_{m}
\end{array}
\right)
\\
y = {\bf Xw} \dots (1)
L = \sum_{i=1}^{n}(y_i - y'_i)^2
Die Parameter werden bestimmt, um diese Verlust- (Fehler-) Funktion L zu minimieren. Ich werde eine detaillierte Erklärung weglassen, aber wenn Sie diese Gleichung transformieren und Gleichung (1) verwenden
L = (y - {\bf Xw})^{T}(y - {\bf Xw})
Kann geschrieben werden.
Dies ist die Methode der kleinsten Quadrate. Mit dieser Formel wird der Parameter von ** w ** jedoch groß, was es leicht macht, Überlernen zu verursachen.
Die unten beschriebene Ridge- und Lasso-Regression ist das L plus der ** Normalisierungsterm **.
Wenn in einer Formel geschrieben
L = (y - {\bf Xw})^{T}(y - {\bf Xw}) + a \times (L_p norm)
a wird als hoher Parameter bezeichnet und ist ein Skalar zur Steuerung der Normalisierungsstärke. Mit anderen Worten, je größer es ist, desto stärker kann die Normalisierung sein. Wenn es jedoch zu stark ist, führt es zu einer unzureichenden Konformität. Seien Sie also vorsichtig.
Hier ** Lasso ** Regression für die L1-Norm Für die L2-Norm ist es eine ** Ridge ** -Regression. Es ist interessanter.
Für L1- und L2-Normen hier
Einfach gesagt Die L1-Norm wird als ** Manhattan-Abstand ** bezeichnet und ist die Summe der absoluten Werte der Differenzen zwischen den Vektorkomponenten. Die L2-Norm wird als ** euklidischer Abstand ** bezeichnet und ist die Quadratwurzel der Quadratsumme der Differenzen zwischen den Vektorkomponenten.
Die Ridge-Regression ist eine der linearen Modellregressionen. Wie oben erwähnt, hat die Gratregression eine Quadratwurzel für die Normalisierung, sodass jede Komponente des Parameters ** w ** als Ganzes geglättet werden kann. Grund, Auf der Route ist es einfacher, die größere Zahl näher an 0 zu minimieren.
Wenn Sie in mathematischen Formeln schreiben
L = (y - {\bf Xw})^{T}(y - {\bf Xw}) + a ||{\bf w}||_2^2
Die Lasso-Regression ist auch eine der Regressionen, die ein lineares Modell verwenden. Da der Teil des Regularisierungsterms der Lasso-Regression nur die Summe der absoluten Werte ist, sind einige Variablen häufig 0. Wenn Sie in mathematischen Formeln schreiben
L = \frac{1}{2}(y - {\bf Xw})^{T}(y - {\bf Xw}) + a ||{\bf w}||_1
Mathematik ist wirklich schwierig, nicht wahr? Ich habe auch einige Orte. Aber das Wichtigste ist zu sagen Der Unterschied zwischen Lasso- und Ridge-Regressionen ist der ** Unterschied zwischen den L1- und L2-Normen **. Wenn Sie die Normen L1 und L2 gedrückt halten, können Sie die Merkmale jeder Regression sehen. Ich habe noch nicht genug gelernt, aber ich werde mein Bestes geben ...
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
import mglearn
import numpy as np
import matplotlib.pyplot as plt
X, y = mglearn.datasets.make_wave(n_samples=40)
x_for_graph = np.linspace(-3, 3, 100)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
ridge = Ridge().fit(X_train, y_train)
lasso = Lasso().fit(X_train, y_train)
fig, ax = plt.subplots()
ax.scatter(X_train, y_train, marker='o')
ax.plot(x_for_graph, ridge.coef_ * x_for_graph + ridge.intercept_, label='Ridge')
ax.plot(x_for_graph, lasso.coef_ * x_for_graph + lasso.intercept_, label='Lasso')
ax.legend(loc='best')
print("Training set score for Ridge: {:.2f}".format(ridge.score(X_train, y_train)))
print("test set score: {:.2f}".format(ridge.score(X_test, y_test)))
print("Training set score for Lasso: {:.2f}".format(lasso.score(X_train, y_train)))
print("test set score: {:.2f}".format(lasso.score(X_test, y_test)))
plt.show()
Ergebnis
Training set score for Ridge: 0.69
test set score: 0.64
Training set score for Lasso: 0.40
test set score: 0.55
Die Daten enthalten zu wenige Variablen. .. .. Lol