Bonjour. Hier, j'ai parlé de la méthode typique du carré minimum (MCO), qui est un modèle typique de régression linéaire. Cette fois, j'écrirai sur la régression Ridge et la régression Lasso.
La régression avec un modèle linéaire utilise littéralement une fonction linéaire pour prédire la variable objective. Et la variable objective pourrait être exprimée par la formule suivante.
y' = w_1x_1 + w_2x_2 + \dots + w_mx_m (x_1, x_2, \dots, x_m:Variable explicative, y':Valeur prédite, w_1,w_2, \dots, w_m :Coefficient de régression)
Si vous l'écrivez avec la section ajoutée,
y' = w_0x_0 + w_1x_1 + w_2x_2 + \dots + w_mx_m (w_0,Section: x_0 = 1)
Lorsqu'il est écrit en vecteur,
y' = {\bf x^T}{\bf w}
Puisqu'il n'y a pas toujours un seul vecteur (variable explicative) de x, x se présente sous la forme d'une matrice. En d'autres termes
\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
Les paramètres sont déterminés de manière à minimiser cette fonction de perte (erreur) L. Je vais omettre une explication détaillée, mais si vous transformez cette équation et utilisez l'équation (1)
L = (y - {\bf Xw})^{T}(y - {\bf Xw})
Peut être écrit.
C'est la méthode des moindres carrés. Cependant, avec cette formule, le paramètre ** w ** devient grand, ce qui facilite le surapprentissage.
Ce L plus le ** terme de normalisation ** est la régression Ridge et Lasso décrite ci-dessous.
Lorsqu'il est écrit dans une formule
L = (y - {\bf Xw})^{T}(y - {\bf Xw}) + a \times (L_norme p)
a est appelé un paramètre élevé et est un scalaire pour contrôler la force de la normalisation. En d'autres termes, plus il est grand, plus la normalisation peut être forte. Cependant, s'il est trop fort, cela entraînera une conformité insuffisante, alors soyez prudent.
ici Régression ** Lasso ** pour la norme L1 Pour la norme L2, il s'agit d'une régression ** Ridge **. C'est plus intéressant.
Pour les normes L1 et L2, ici
Tout simplement La norme L1 est appelée la ** distance de Manhattan ** et est la somme des valeurs absolues des différences entre les composantes vectorielles. La norme L2 est appelée la ** distance euclidienne ** et est la racine carrée de la somme des carrés des différences entre les composantes vectorielles.
La régression Ridge est l'une des régressions du modèle linéaire. Comme mentionné ci-dessus, la régression de crête a une racine carrée pour la normalisation, de sorte que chaque composante du paramètre ** w ** peut être lissée dans son ensemble. Raison, Dans l'itinéraire, il est plus facile de minimiser le plus grand nombre plus proche de 0.
Si vous écrivez dans des formules mathématiques
L = (y - {\bf Xw})^{T}(y - {\bf Xw}) + a ||{\bf w}||_2^2
La régression au lasso est également l'une des régressions utilisant un modèle linéaire. Étant donné que la partie du terme de régularisation de la régression Lasso n'est que la somme des valeurs absolues, certaines variables sont souvent 0. Si vous écrivez dans des formules mathématiques
L = \frac{1}{2}(y - {\bf Xw})^{T}(y - {\bf Xw}) + a ||{\bf w}||_1
Les mathématiques sont vraiment difficiles, n'est-ce pas? J'ai aussi quelques places. Mais la chose la plus importante à dire est La différence entre les régressions Lasso et Ridge est ** la différence entre les normes L1 et L2 **. Si vous maintenez les normes L1 et L2 enfoncées, vous pouvez voir les caractéristiques de chaque régression. Je n'ai pas encore assez étudié, mais je ferai de mon mieux ...
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()
résultat
Training set score for Ridge: 0.69
test set score: 0.64
Training set score for Lasso: 0.40
test set score: 0.55
Il y a trop peu de variables dans les données. .. .. Lol