Bureau d'étude PEIP - IS

TP7 - Régression linéaire

Nous avons vu dans le TP précédent ce qu'étaient les word embeddings, nous allons maintenant voir comment les utiliser avec un algorithme que vous avez déjà étudié : la regression linéaire.

Pour rappel, la regression linéaire utilise un ensemble de vecteurs associés à des labels, et calcul un ensemble de coefficients (autant que de coordonnées dans un vecteur +1) permettant, par une combinaison linéaire des coordonnées du vecteur, de retrouver le label.

Nous allons utiliser la fonction "LinearRegression" du package scikit learn. Commencez par inclure cette fonction dans votre fichier .py ; nous aurons aussi besoin de numpy et de pickle.

import numpy as np
from sklearn.linear_model import LinearRegression
import pickle

Fichiers de données

Pour réaliser ce travail, nous allons utiliser deux fichiers contenant chacun des paires de mots associées à un label : 1 si les mots sont synonymes, 0 sinon.

  • - syn_train.data : ce fichier servira à entrainer le modèle de regression linéaire pour déterminer les coefficients du modèle.
  • - syn_test.data : ce fichier servira uniquement à tester le modèle une fois celui-ci réalisé. Il ne sera pas dû tout utiliser pour déterminer les coefficients afin de ne pas biaiser le modèle.

On utilisera également le fichier syn_wordEmb.pickle contenant un dictionnaire avec les word embeddings associés à chacun des mots des fichiers précédent. Cela nous évitera de devoir charger gensim. Pour le charger, il suffit de faire :

f = open("syn_wordEmb.pickle", "rb")
we_dict = pickle.load(f)
f.close()

Le travail préparatoire étant réalisé, nous allons pouvoir passer à la réalisation du modèle de prédiction pas à pas.

Travail demandé

  1. Il s'agit d'abord de résoudre un problème : nos données d'entrée ne sont pas composées d'un, mais de deux vecteurs (un pour chacun des mots composant la paire de synonymes). Comment proposez vous de les combiner en un seul vecteur ? Proposez une fonction combine(X1, X2) qui prend en paramètre deux vecteurs de taille N et renvoie un seul vecteur de taille N issu de la combinaison des deux.
  2. Pour entrainer le modèle de regression linéaire, nous allons utiliser la fonction fit qui s'utilise comme suit :
    reg = LinearRegression().fit(X, Y)
    où X est une matrice contenant les vecteurs d'entrainement en ligne, et Y est un vecteur contenant les labels cible. Dans notre cas particulier, chacun de nos vecteurs d'entrainement est de taille 50 (la taille des words embeddings) et nous avons 209 individus dans le fichier. La matrice X doit donc être de taille 209x50. À l'aide des fonctions np.concatenate et np.append, construisez la matrice X et le vecteur Y.
  3. Utilisez le code donné dans l'encart précédent pour générer le modèle de regression linéaire.
  4. Le modèle de regression ainsi entraîné possède une fonction predict qui prend en paramètre un vecteur et donne une estimation du label associé.
    reg.predict(V.reshape(1,-1))
    Cette estimation n'est cependant pas binaire (0 ou 1 comme nos labels), c'est un nombre flottant quelconque. Comment proposez vous de transformer ce flottant en 0 ou 1 ? Écrivez une fonction prediction(w1,w2,reg) qui prend en paramètre deux mots et un modèle de regression linéaire entraîné, et retourne 0 ou 1 suivant la prédiction qui sera faite.
  5. Réalisez une prédiction pour chacune des paires présente dans le fichier de test. Comptez le nombre de prédiction qui sont correctes (en comparant au label) et affichez la proportion de bonnes réponses. Qu'en pensez vous ?
  6. Essayez d'autres façon de combiner les vecteurs (question 1) et de déterminer une prédiction à partir de la valeur donnée par le modèle (question 4). Qu'est-ce qui semble donner les meilleurs résultats ?
  7. En utilisant votre meilleur pipeline (la configuration qui donne les meilleurs résultats à la question précédente), identifier les paires pour lesquelles la prédiction est fausse. Proposez deux hypothèses pouvant expliquer pourquoi le modèle se trompe.