Introduction à la Recherche Opérationelle


M1 Statistique Science des Données (SSD)
Anatoli Juditsky
Franck Iutzeler
2017/2018

Problème de régression logistique

Dans cet TP, nous cherchons à classer des observations en deux classes: $\mathcal{O} = \{-1 , +1 \}$ par régression logistique. La fonction de perte logistique s'écrit \begin{align*} \min_{x\in\mathbb{R}^d } f(x) := \frac{1}{m} \sum_{i=1}^m \log( 1+\exp(-b_i \langle a_i,x \rangle) ) + \lambda_1 \|x\|_1 + \frac{\lambda}{2} \|x\|_2^2. \end{align*} où:

  • $a_i$ est une observation et $b_i$ la classe correspondate
  • les deux derniers termes s'écrivent sont une régularisation de type elastic-net.

Sous certaines hypothèses évoquées ici, $x^\star = \arg\min f(x)$ maximise la vraisemblance régularisées des labels sachant les observations. Ainsi pour une nouvelle observation $a$ de classe $d$ (inconnue), $$ p_1(a) = \mathbb{P}[d\in \text{ class } +1] = \frac{1}{1+\exp(-\langle a;x^\star \rangle)} $$

Ainsi, a partir de $a$, si $p_1(a)$ est proche de $1$, il est raisonnable de décider que l'example arrivant appartient à la classe $1$; et l'inverse si $p(a)$ est proche de $0$. Entre les deux, l'appréciation est laissée à l'analyste selon l'application.

Vos objectifs:

  • Implementer une fonction de minimisation de la perte logistique régularisée en utilisant CVXR
  • Écrire une fonction de prédiction des labels pour un nouveau vecteur à partir de la solution obtenue par la fonction précédente
  • Motivez un choix pour les paramètres du modèle ($\lambda_1, \lambda_2$) et de la prédiction (seuil entre +1 et -1)

Rendu: Par groupe de 1,2, ou 3, un compte rendu d'une page + le code des deux fonctions demandées:

Données

Les données Student database contient les notes d'élèves portugais en mathématiques niveau lycée en fonction de facteurs socio-culturels. Le but est de prédire si un étudiant va passer dans la classe supérieure , note G3 supérieure ou égale à 12 grace à la donnée du reste.

La description des variables sont dans data/student.txt, la plupart sont catégoriques, vous les pré-traiterez pour les rendre numériques.

In [ ]:
stud=read.table("./data/student-mat.csv",sep=";",header=TRUE)
In [ ]:
stud = sapply(stud,as.numeric)

A vous de jouer

In [ ]:
require(CVXR)