[PYTHON] Comprendre et mettre en œuvre la régression des crêtes (régularisation L2)

introduction

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

référence

Pour comprendre la régression des crêtes (régression L2), je me suis référé à ce qui suit.

Présentation de la régression de crête (régularisation L2)

Examen de l'analyse de régression multiple

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.

L = \sum_{n=1}^{n} (y_{n} -\hat{y}_{n} )^2

Exprimé sous forme vectorielle, il ressemble à ceci.

L = (\boldsymbol{y}-X\boldsymbol{w})^T(\boldsymbol{y}-X\boldsymbol{w})

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.

-2X^T\boldsymbol{y}+2\boldsymbol{w}X^TX = 0

En résolvant ceci, le poids $ \ boldsymbol {w} $ peut être obtenu.

Régression Ridge (régularisation L2)

L = (\boldsymbol{y} - X\boldsymbol{w})^T (\boldsymbol{y} - X\boldsymbol{w}) + \lambda|| \boldsymbol{w} ||_{2}

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.

Quelle est la norme L2

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.

Effet de la régularisation L2

L'ajout d'un terme de régularisation à la fonction de perte a pour effet de réduire la taille du poids $ \ boldsymbol {w} . Pour une analyse de régression multiple normale, les seuls termes à minimiser sont: $(\boldsymbol{y} - X\boldsymbol{w})^T (\boldsymbol{y} - X\boldsymbol{w})$ Si la régularisation est ajoutée ici, il est nécessaire de la minimiser en incluant les éléments suivants. $\lambda|| \boldsymbol{w} ||_{2}$$ Puisque le poids $ \ boldsymbol {w} $ a un effet plus fort sur la fonction de perte, la valeur du poids $ \ boldsymbol {w} $ sera réduite en taille. Le degré est contrôlé par la taille de $ \ lambda $.

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.

図1.png

Dérivation des poids pour la régression des crêtes (régularisation L2)

L = (\boldsymbol{y} - X\boldsymbol{w})^T (\boldsymbol{y} - X\boldsymbol{w}) + \lambda|| \boldsymbol{w} ||_{2}

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} $.

Mettre en œuvre la régression des crêtes (régularisation L2)

la mise en oeuvre

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érification

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.

modèle de sklearn

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

Modèle auto-implémenté

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

Comprendre et mettre en œuvre la régression des crêtes (régularisation L2)
Implémenter et comprendre l'arborescence de recherche d'union dans Go
Différence entre la régression linéaire, la régression Ridge et la régression Lasso
Ridge et Lasso
Intelligence artificielle, machine learning, deep learning pour mettre en œuvre et comprendre
Réseau de neurones pour comprendre et mettre en œuvre en mathématiques au secondaire
Théorie et mise en œuvre de modèles de régression multiple - pourquoi une régularisation est nécessaire -