J'ai étudié la régularisation en tant que développement de l'analyse de régression multiple. Cette fois, je vais résumer la régression des crêtes (régularisation L2).
Pour comprendre la régression des crêtes (régression L2), je me suis référé à ce qui suit.
La régression Ridge est une fonction de perte lors de l'exécution d'une analyse de régression multiple avec un terme de régularisation ajouté. L'analyse de régression multiple dérive l'équation de régression optimale en trouvant les poids qui minimisent la fonction de perte comme indiqué ci-dessous.
Exprimé sous forme vectorielle, il ressemble à ceci.
C'est OK si le poids $ \ boldsymbol {w} $ qui minimise le $ L $ ci-dessus est obtenu. Si le $ L $ ci-dessus est différencié par $ \ boldsymbol {w} $ et défini comme $ 0 $, ce sera comme suit.
En résolvant ceci, le poids $ \ boldsymbol {w} $ peut être obtenu.
Ce qui précède est la régression des crêtes(Régularisation L2)Cela devient la formule de la fonction de perte de. Terme de régularisation pour la fonction de perte de l'analyse de régression multiple$\lambda|| \boldsymbol{w} ||_{2} $C'est sous forme d'ajout. La régression de crête (régularisation L2) est effectuée en ajoutant le carré de la norme L2 du poids $ \ boldsymbol {w} $ comme décrit ci-dessus.
La racine carrée de la somme des carrés de la différence des composantes vectorielles (la soi-disant «distance ordinaire», la distance euclidienne) est la norme L2. La norme est un indice indiquant la «taille», et la norme L1 et la norme L∞ sont également utilisées.
L'ajout d'un terme de régularisation à la fonction de perte a pour effet de réduire la taille du poids $ \ boldsymbol {w}
La figure suivante est souvent utilisée pour expliquer la régression des crêtes (régularisation L2). Puisqu'il est difficile de comprendre si c'est tel quel, une explication est ajoutée dans la figure. Ce qui suit est un tracé bidimensionnel des courbes de niveau de la valeur de la fonction de perte lorsqu'il existe deux types de paramètres de pondération. Vous pouvez voir sur la figure comment la valeur de poids est réduite en ajoutant le terme de régularisation.
Calculez en différenciant la fonction de perte ci-dessus avec le poids $ \ boldsymbol {w} $ et en le plaçant comme $ 0 $.
-2X^T\boldsymbol{y}+2\boldsymbol{w}X^TX+2\lambda\boldsymbol{w} = 0 \\
(X^TX+\lambda I)\boldsymbol{w} - X^T\boldsymbol{y} = 0 \\
(X^TX+\lambda I)\boldsymbol{w} = X^T\boldsymbol{y} \\
\boldsymbol{w} = (X^TX+\lambda I)^{-1}X^T\boldsymbol{y}
Ici, nous avons pu dériver le poids $ \ boldsymbol {w} $.
Ce qui suit est le résultat de l'auto-implémentation du modèle de régression des crêtes (régression L2).
import numpy as np
class RidgeReg:
def __init__(self, lambda_ = 1.0):
self.lambda_ = lambda_
self.coef_ = None
self.intercept_ = None
def fit(self, X, y):
#Ajoutez une colonne avec toutes les valeurs 1 à la première ligne de la matrice de variables explicatives pour inclure le calcul de section
X = np.insert(X, 0, 1, axis=1)
#Créer une matrice d'unité
i = np.eye(X.shape[1])
#Formule de calcul pour calculer le poids
temp = np.linalg.inv(X.T @ X + self.lambda_ * i) @ X.T @ y
#C'est la valeur du coefficient de régression
self.coef_ = temp[1:]
#C'est la valeur de la section
self.intercept_ = temp[0]
def predict(self, X):
#Renvoie la valeur prédite par le modèle de régression de crête
return (X @ self.coef_ + self.intercept_)
Vérifiez que le modèle auto-implémenté ci-dessus correspond aux résultats de sklearn. Cette fois, nous vérifierons à l'aide de l'ensemble de données sur les prix des logements de Boston. Les détails du contenu de l'ensemble de données peuvent être trouvés dans Article sur la vérification de l'analyse de régression multiple.
from sklearn.datasets import load_boston
import pandas as pd
from sklearn.preprocessing import StandardScaler
#Lire les données
boston = load_boston()
#Une fois converti au format de trame de données pandas
df = pd.DataFrame(boston.data, columns=boston.feature_names)
#Obtenez la variable objective (valeur à laquelle vous voulez vous attendre)
target = boston.target
df['target'] = target
from sklearn.linear_model import Ridge
X = df[['INDUS', 'CRIM']].values
X = StandardScaler().fit_transform(X)
y = df['target'].values
clf = Ridge(alpha=1)
clf.fit(X, y)
print(clf.coef_)
print(clf.intercept_)
Cliquez ici pour la sortie. Du haut se trouvent les coefficients de régression et les sections du modèle.
[-3.58037552 -2.1078602 ]
22.532806324110677
X = df[['INDUS', 'CRIM']].values
X = StandardScaler().fit_transform(X)
y = df['target'].values
linear = RidgeReg(lambda_ = 1)
linear.fit(X,y)
print(linear.coef_)
print(linear.intercept_)
Cliquez ici pour la sortie. Du haut se trouvent les coefficients de régression et les sections du modèle.
[-3.58037552 -2.1078602 ]
22.532806324110677
Les coefficients de régression étaient exactement les mêmes, mais pour une raison quelconque, il y avait une différence subtile dans les sections. Je l'ai enquêté, mais je n'ai pas compris la cause, je vais donc l'afficher tel quel. Si quelqu'un sait, veuillez le signaler ... Next Ensuite, je vais remettre en question la compréhension de la régression Lasso (régularisation L1) et de l'auto-implémentation.
Recommended Posts