Scikit Learn - Elastic-Net
Elastic-Net est une méthode de régression régularisée qui combine linéairement les deux pénalités, c'est-à-dire L1 et L2 des méthodes de régression Lasso et Ridge. Il est utile lorsqu'il existe plusieurs fonctionnalités corrélées. La différence entre Lass et Elastic-Net réside dans le fait que Lasso est susceptible de choisir l'une de ces caractéristiques au hasard, tandis qu'Elastic-Net est susceptible de choisir les deux à la fois.
Sklearn fournit un modèle linéaire nommé ElasticNetqui est formé avec les deux normes L1, L2 pour la régularisation des coefficients. L'avantage d'une telle combinaison est qu'elle permet d'apprendre un modèle clairsemé où peu de poids sont non nuls comme la méthode de régularisation Lasso, tout en conservant les propriétés de régularisation de la méthode de régularisation Ridge.
Voici la fonction objective pour minimiser -
$$ \ displaystyle \ min \ limits_ {w} \ frac {1} {2n_ {samples}} \ lVert X_ {w} -Y \ rVert_2 ^ 2 + \ alpha \ rho \ lVert W \ rVert_1 + \ frac {\ alpha \ lgroup 1- \ rho \ rgroup} {2} \ \ lVert W \ rVert_2 ^ 2 $$Paramètres
Le tableau suivant contient les paramètres utilisés par ElasticNet module -
Sr. Non | Paramètre et description |
---|---|
1 | alpha - float, facultatif, par défaut = 1.0 Alpha, la constante qui multiplie le terme L1 / L2, est le paramètre de réglage qui décide à quel point nous voulons pénaliser le modèle. La valeur par défaut est 1.0. |
2 | l1_ratio - flotter C'est ce qu'on appelle le paramètre de mixage ElasticNet. Son intervalle est 0 <= l1_ratio <= 1. Si l1_ratio = 1, la pénalité serait une pénalité L1. Si l1_ratio = 0, la pénalité serait une pénalité L2. Si la valeur du rapport l1 est comprise entre 0 et 1, la pénalité serait la combinaison de L1 et L2. |
3 | fit_intercept- Booléen, facultatif. Valeur par défaut = True Ce paramètre spécifie qu'une constante (biais ou interception) doit être ajoutée à la fonction de décision. Aucune interception ne sera utilisée dans le calcul, si elle est définie sur false. |
4 | tol - flotteur, en option Ce paramètre représente la tolérance pour l'optimisation. La valeur tol et les mises à jour seront comparées et si des mises à jour sont trouvées plus petites que tol, l'optimisation vérifie l'optimisation du double intervalle et continue jusqu'à ce qu'il soit plus petit que tol. |
5 | normalise - Booléen, facultatif, par défaut = False Si ce paramètre est défini sur True, le régresseur X sera normalisé avant la régression. La normalisation se fera en soustrayant la moyenne et en la divisant par la norme L2. Sifit_intercept = False, ce paramètre sera ignoré. |
6 | precompute - True | False | de type tableau, par défaut = False Avec ce paramètre, nous pouvons décider d'utiliser une matrice de Gram précalculée pour accélérer le calcul ou non. Pour préserver la parcimonie, ce serait toujours vrai pour les entrées rares. |
sept | copy_X - Booléen, facultatif, par défaut = True Par défaut, il est vrai, ce qui signifie que X sera copié. Mais s'il est défini sur false, X peut être écrasé. |
8 | max_iter - int, facultatif Comme son nom l'indique, il représente le nombre maximum d'itérations prises pour les solveurs de gradient conjugués. |
9 | warm_start - booléen, facultatif, par défaut = faux Avec ce paramètre défini sur True, nous pouvons réutiliser la solution de l'appel précédent pour l'ajuster comme initialisation. Si nous choisissons default, c'est-à-dire false, cela effacera la solution précédente. |
dix | random_state - int, instance RandomState ou None, facultatif, par défaut = aucun Ce paramètre représente la graine du nombre pseudo aléatoire généré qui est utilisé lors du brassage des données. Voici les options -
|
11 | selection - str, par défaut = 'cyclique'
|
Les attributs
Le tableau suivant comprend les attributs utilisés par ElasticNet module -
Sr. Non | Attributs et description |
---|---|
1 | coef_ - tableau, forme (n_tasks, n_features) Cet attribut fournit les vecteurs de poids. |
2 | Intercept_ - tableau, forme (n_tasks) Il représente le terme indépendant dans la fonction de décision. |
3 | n_iter_ - int Il donne le nombre d'itérations exécutées par le solveur de descente de coordonnées pour atteindre la tolérance spécifiée. |
Exemple d'implémentation
Suivre les utilisations de script Python ElasticNet modèle linéaire qui utilise en outre la descente de coordonnées comme algorithme pour ajuster les coefficients -
from sklearn import linear_model
ENreg = linear_model.ElasticNet(alpha = 0.5,random_state = 0)
ENreg.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2])
Production
ElasticNet(alpha = 0.5, copy_X = True, fit_intercept = True, l1_ratio = 0.5,
max_iter = 1000, normalize = False, positive = False, precompute=False,
random_state = 0, selection = 'cyclic', tol = 0.0001, warm_start = False)
Exemple
Maintenant, une fois ajusté, le modèle peut prédire de nouvelles valeurs comme suit -
ENregReg.predict([[0,1]])
Production
array([0.73686077])
Exemple
Pour l'exemple ci-dessus, nous pouvons obtenir le vecteur de poids à l'aide du script python suivant -
ENreg.coef_
Production
array([0.26318357, 0.26313923])
Exemple
De même, nous pouvons obtenir la valeur de l'interception à l'aide du script python suivant -
ENreg.intercept_
Production
0.47367720941913904
Exemple
Nous pouvons obtenir le nombre total d'itérations pour obtenir la tolérance spécifiée à l'aide du script python suivant -
ENreg.n_iter_
Production
15
Nous pouvons changer les valeurs de alpha (vers 1) pour obtenir de meilleurs résultats du modèle.
Exemple
Voyons le même exemple avec alpha = 1.
from sklearn import linear_model
ENreg = linear_model.ElasticNet(alpha = 1,random_state = 0)
ENreg.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2])
Output
ElasticNet(alpha = 1, copy_X = True, fit_intercept = True, l1_ratio = 0.5,
max_iter = 1000, normalize = False, positive = False, precompute = False,
random_state = 0, selection = 'cyclic', tol = 0.0001, warm_start = False)
#Predicting new values
ENreg.predict([[1,0]])
Output
array([0.90909216])
#weight vectors
ENreg.coef_
Output
array([0.09091128, 0.09090784])
#Calculating intercept
ENreg.intercept_
Output
0.818180878658411
#Calculating number of iterations
ENreg.n_iter_
Output
10
À partir des exemples ci-dessus, nous pouvons voir la différence dans les sorties.