Introduction
Dans ce laboratoire, nous allons explorer la manière de réaliser une sélection de caractéristiques conjointe à l'aide de l'algorithme Lasso multi-tâches. Nous utiliserons scikit-learn, une bibliothèque populaire de machine learning en Python, pour générer des données d'échantillonnage et ajuster des modèles à ces données. Nous tracerons ensuite les résultats des modèles pour voir comment ils se comparent.
Conseils sur la machine virtuelle
Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet d'étude pour accéder au carnet Jupyter pour la pratique.
Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session, et nous résoudrons rapidement le problème pour vous.
Générer des données
Tout d'abord, nous devons générer des données d'échantillonnage que nous pouvons utiliser pour ajuster nos modèles. Nous utiliserons numpy pour générer 100 échantillons, chacun avec 30 caractéristiques et 40 tâches. Nous sélectionnerons également au hasard 5 caractéristiques pertinentes et créerons des coefficients pour elles à l'aide d'ondes sinusoïdales avec une fréquence et une phase aléatoires. Enfin, nous ajouterons du bruit aléatoire aux données.
import numpy as np
rng = np.random.RandomState(42)
## Générer quelques coefficients 2D avec des ondes sinusoïdales avec une fréquence et une phase aléatoires
n_samples, n_features, n_tasks = 100, 30, 40
n_relevant_features = 5
coef = np.zeros((n_tasks, n_features))
times = np.linspace(0, 2 * np.pi, n_tasks)
for k in range(n_relevant_features):
coef[:, k] = np.sin((1.0 + rng.randn(1)) * times + 3 * rng.randn(1))
X = rng.randn(n_samples, n_features)
Y = np.dot(X, coef.T) + rng.randn(n_samples, n_tasks)
Ajuster des modèles
Maintenant que nous avons nos données, nous pouvons ajuster des modèles à l'aide des algorithmes Lasso et Lasso multi-tâches. Nous ajusterons un modèle Lasso pour chaque tâche puis un modèle Lasso multi-tâches à toutes les tâches d'un coup.
from sklearn.linear_model import MultiTaskLasso, Lasso
coef_lasso_ = np.array([Lasso(alpha=0.5).fit(X, y).coef_ for y in Y.T])
coef_multi_task_lasso_ = MultiTaskLasso(alpha=1.0).fit(X, Y).coef_
Tracer les résultats
Enfin, nous pouvons tracer les résultats de nos modèles pour voir comment ils se comparent. Nous tracerons le support (c'est-à-dire l'emplacement des coefficients non nuls) pour chaque modèle, ainsi que la série temporelle d'une des caractéristiques.
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 5))
plt.subplot(1, 2, 1)
plt.spy(coef_lasso_)
plt.xlabel("Caractéristique")
plt.ylabel("Temps (ou Tâche)")
plt.text(10, 5, "Lasso")
plt.subplot(1, 2, 2)
plt.spy(coef_multi_task_lasso_)
plt.xlabel("Caractéristique")
plt.ylabel("Temps (ou Tâche)")
plt.text(10, 5, "MultiTaskLasso")
fig.suptitle("Emplacement des coefficients non nuls")
feature_to_plot = 0
plt.figure()
lw = 2
plt.plot(coef[:, feature_to_plot], color="seagreen", linewidth=lw, label="Vérité terrain")
plt.plot(
coef_lasso_[:, feature_to_plot], color="cornflowerblue", linewidth=lw, label="Lasso"
)
plt.plot(
coef_multi_task_lasso_[:, feature_to_plot],
color="gold",
linewidth=lw,
label="MultiTaskLasso",
)
plt.legend(loc="upper center")
plt.axis("tight")
plt.ylim([-1.1, 1.1])
plt.show()
Sommaire
Dans ce laboratoire, nous avons appris à effectuer une sélection de caractéristiques conjointe à l'aide de l'algorithme Lasso multi-tâches. Nous avons généré des données d'échantillonnage, ajusté des modèles à l'aide de Lasso et de Lasso multi-tâches, et tracé les résultats. Nous pouvons constater que l'algorithme Lasso multi-tâches est mieux à même de sélectionner les caractéristiques pertinentes pour toutes les tâches par rapport à l'algorithme Lasso.