{"cells":[{"cell_type":"markdown","metadata":{"id":"ojWck8JFNwMp"},"source":["## Partie 3 : 🧠 Approches avancée (embeddings pré-entraînés et deep learning)\n","\n","Dans ce notebook, nous développons des **modèles avancés d'analyse de sentiment** pour détecter les bad buzz potentiels sur Twitter. Nous implémentons deux architectures de deep learning basées sur des réseaux **LSTM bidirectionnels**, utilisant respectivement les embeddings **Word2Vec** et **GloVe 300d** comme représentations vectorielles des mots. Ces modèles exploitent les techniques modernes d'apprentissage profond pour prédire le sentiment de tweets.\n","\n","Concernant l'entrainement, le choix a été fait d'entrainer par optimisation de la variable de perte de validation `val_loss` avec en particulier un critère d'`EarlyStopping` au bout d'un certain nombre d'époques lancées (5, en l'ocurrence) afin de garantir une bonne généralisation ainsi qu'une limitation de l'overfitting.\n","\n","Cependant, le critère qui sera retenu comme le plus important en raison de notre problématique métier est la `precision` car nous souhaitons plus que tout éviter les faux positifs (tweet prédit comme positif, alors qu'il sera mal reçu)."]},{"cell_type":"markdown","metadata":{"id":"hQ2lFBinNwMq"},"source":["## Importation des bibliothèques"]},{"cell_type":"code","source":["from google.colab import drive\n","drive.mount('/content/drive')\n","import os\n","drive_folder= \"/content/drive/MyDrive/Colab_Notebooks/Project_7/notebooks\"\n","os.chdir(drive_folder)\n","os.listdir()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"khhtDEa-Phih","executionInfo":{"status":"ok","timestamp":1751496230110,"user_tz":-120,"elapsed":1169,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"cadf18a8-46b3-4208-c6f0-49a6cd5d83f8"},"execution_count":1,"outputs":[{"output_type":"stream","name":"stdout","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"]},{"output_type":"execute_result","data":{"text/plain":["['requirements.txt',\n"," 'requirements-bert.txt',\n"," 'Copie de notebook-connexion-mlflow (1).ipynb',\n"," 'Copie de 03-notebook-modele-avance.ipynb',\n"," 'Copie de 02-notebook-modele-simple.ipynb',\n"," 'Copie de 01-notebook-analyse-exploratoire.ipynb',\n"," 'Copie de 04-notebook-modele-bert.ipynb',\n"," 'content',\n"," '.env',\n"," 'Copie de notebook-connexion-mlflow.ipynb',\n"," 'iris_class_distribution.png',\n"," 'confusion_matrix.png',\n"," 'glove.6B.zip',\n"," 'notebook-connexion-mlflow.ipynb',\n"," 'best_model.pt',\n"," '01-notebook-analyse-exploratoire.ipynb',\n"," 'best_model.pth',\n"," '03-notebook-modele-avance.ipynb',\n"," '04-notebook-modele-bert.ipynb',\n"," '02-notebook-modele-simple.ipynb']"]},"metadata":{},"execution_count":1}]},{"cell_type":"code","source":["!pip install mlflow boto3 dotenv gensim --quiet"],"metadata":{"id":"vN2rVNmf86bI","executionInfo":{"status":"ok","timestamp":1751496240500,"user_tz":-120,"elapsed":10391,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"execution_count":2,"outputs":[]},{"cell_type":"code","execution_count":3,"metadata":{"id":"Ae66AtL4NwMq","outputId":"d4c22fc1-b4f7-4252-a5df-96a253d86564","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496252555,"user_tz":-120,"elapsed":12056,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stderr","text":["[nltk_data] Downloading package punkt_tab to /root/nltk_data...\n","[nltk_data] Unzipping tokenizers/punkt_tab.zip.\n","[nltk_data] Downloading package stopwords to /root/nltk_data...\n","[nltk_data] Unzipping corpora/stopwords.zip.\n","[nltk_data] Downloading package wordnet to /root/nltk_data...\n"]}],"source":["# Importations nécessaires\n","import pandas as pd\n","import numpy as np\n","import matplotlib.pyplot as plt\n","import seaborn as sns\n","import os\n","import re\n","import time\n","import warnings\n","from collections import Counter\n","import pickle\n","from tqdm import tqdm\n","import html\n","\n","# Importations NLTK\n","import nltk\n","nltk.download('punkt_tab')\n","nltk.download('stopwords')\n","nltk.download('wordnet')\n","from nltk.corpus import stopwords\n","from nltk.tokenize import word_tokenize\n","from nltk.stem import WordNetLemmatizer\n","\n","# Importations scikit-learn\n","from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer\n","from sklearn.model_selection import train_test_split, GridSearchCV\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.svm import LinearSVC\n","from sklearn.ensemble import RandomForestClassifier\n","from sklearn.naive_bayes import MultinomialNB\n","from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score,\n"," make_scorer, matthews_corrcoef, balanced_accuracy_score,\n"," classification_report, confusion_matrix, roc_auc_score, roc_curve)\n","\n","\n","import numpy as np\n","import tensorflow as tf\n","from tensorflow import keras\n","from tensorflow.keras.preprocessing.text import Tokenizer\n","from tensorflow.keras.preprocessing.sequence import pad_sequences\n","\n","\n","# Configuration des visualisations\n","plt.style.use('ggplot')\n","plt.rcParams['figure.figsize'] = (12, 8)\n","plt.rcParams['font.family'] = 'DejaVu Sans'\n","warnings.filterwarnings('ignore')"]},{"cell_type":"markdown","metadata":{"id":"E1TqvSBHNwMr"},"source":["## 💾 Jeu de données : Sentiment140\n","\n","Le jeu de données [Sentiment140 dataset with 1.6 million tweets](https://www.kaggle.com/datasets/kazanova/sentiment140) est une ressource majeure pour l'analyse de sentiment sur Twitter, comprenant **1,6 million de tweets** extraits via l'API Twitter. Ces tweets ont été automatiquement annotés selon leur polarité sentimentale, offrant une base solide pour développer des modèles de classification de sentiment.\n","\n","Le jeu de données est organisé en 6 colonnes distinctes :\n","\n","1. **target** : La polarité du sentiment exprimé dans le tweet.\n"," - 0 = sentiment négatif\n"," - 2 = sentiment neutre\n"," - 4 = sentiment positif\n","2. **ids** : L'identifiant unique du tweet (exemple : *2087*)\n","3. **date** : La date et l'heure de publication du tweet.\n","4. **flag** : La requête utilisée pour obtenir le tweet.\n"," - Exemple : *lyx*\n"," - Si aucune requête n'a été utilisée : *NO_QUERY*\n","5. **user** : Le nom d'utilisateur de l'auteur du tweet.\n","6. **text** : Le contenu textuel du tweet."]},{"cell_type":"code","execution_count":4,"metadata":{"id":"jDsgh8mGNwMr","outputId":"a4d4a0f9-8782-4364-daf0-79bf9992ee10","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496252555,"user_tz":-120,"elapsed":25,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["CPU times: user 83 µs, sys: 12 µs, total: 95 µs\n","Wall time: 541 µs\n"]}],"source":["%%time\n","\n","# Define the URL and the local file path\n","url = \"https://s3-eu-west-1.amazonaws.com/static.oc-static.com/prod/courses/files/AI+Engineer/Project+7%C2%A0-+D%C3%A9tectez+les+Bad+Buzz+gr%C3%A2ce+au+Deep+Learning/sentiment140.zip\"\n","local_zip_path = \"./content/data/sentiment140.zip\"\n","extract_path = \"./content/data\"\n","\n","if not os.path.exists(extract_path):\n","\n"," # Create the directory if it doesn't exist\n"," os.makedirs(extract_path, exist_ok=True)\n","\n"," # Download the zip file\n"," response = requests.get(url)\n"," with open(local_zip_path, 'wb') as file:\n"," file.write(response.content)\n","\n"," # Extract the contents of the zip file\n"," with zipfile.ZipFile(local_zip_path, 'r') as zip_ref:\n"," zip_ref.extractall(extract_path)\n","\n"," # Delete the zip file\n"," os.remove(local_zip_path)"]},{"cell_type":"code","execution_count":5,"metadata":{"id":"c-6C8QR_NwMr","executionInfo":{"status":"ok","timestamp":1751496252555,"user_tz":-120,"elapsed":21,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["pd.set_option('display.max_columns', None)\n","pd.set_option('display.expand_frame_repr', True)"]},{"cell_type":"code","execution_count":6,"metadata":{"id":"MtMJv7S-NwMr","outputId":"df5f1cd8-22c2-4e0e-87c1-c2d91ff50eb2","colab":{"base_uri":"https://localhost:8080/","height":379},"executionInfo":{"status":"ok","timestamp":1751496265020,"user_tz":-120,"elapsed":12467,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" target ids date flag \\\n","0 0 1467810369 Mon Apr 06 22:19:45 PDT 2009 NO_QUERY \n","1 0 1467810672 Mon Apr 06 22:19:49 PDT 2009 NO_QUERY \n","2 0 1467810917 Mon Apr 06 22:19:53 PDT 2009 NO_QUERY \n","3 0 1467811184 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n","4 0 1467811193 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n","\n"," user text \n","0 _TheSpecialOne_ @switchfoot http://twitpic.com/2y1zl - Awww, t... \n","1 scotthamilton is upset that he can't update his Facebook by ... \n","2 mattycus @Kenichan I dived many times for the ball. Man... \n","3 ElleCTF my whole body feels itchy and like its on fire \n","4 Karoli @nationwideclass no, it's not behaving at all.... "],"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
targetidsdateflagusertext
001467810369Mon Apr 06 22:19:45 PDT 2009NO_QUERY_TheSpecialOne_@switchfoot http://twitpic.com/2y1zl - Awww, t...
101467810672Mon Apr 06 22:19:49 PDT 2009NO_QUERYscotthamiltonis upset that he can't update his Facebook by ...
201467810917Mon Apr 06 22:19:53 PDT 2009NO_QUERYmattycus@Kenichan I dived many times for the ball. Man...
301467811184Mon Apr 06 22:19:57 PDT 2009NO_QUERYElleCTFmy whole body feels itchy and like its on fire
401467811193Mon Apr 06 22:19:57 PDT 2009NO_QUERYKaroli@nationwideclass no, it's not behaving at all....
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"raw_data"}},"metadata":{},"execution_count":6}],"source":["# Define the path to the CSV file\n","csv_file_path = os.path.join(extract_path, 'training.1600000.processed.noemoticon.csv')\n","\n","# Define the column names\n","column_names = ['target', 'ids', 'date', 'flag', 'user', 'text']\n","\n","# Load the dataset into a pandas DataFrame\n","raw_data = pd.read_csv(csv_file_path, encoding='latin-1', names=column_names)\n","\n","# Display the first few rows of the DataFrame\n","raw_data.head()"]},{"cell_type":"code","execution_count":7,"metadata":{"id":"bIeawbN6NwMs","outputId":"a944ad68-7329-4fb7-8fde-f40b1f4b5833","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496265023,"user_tz":-120,"elapsed":3,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Ce dataframe contient 1600000 lignes et 6 colonnes.\n"]}],"source":["print(f\"Ce dataframe contient {raw_data.shape[0]} lignes et {raw_data.shape[1]} colonnes.\")"]},{"cell_type":"markdown","source":["## ⏩🧠 Approches avancées de Deep Learning\n","Notre démarche pour la classification de sentiment avec des approches avancées comprend:\n","\n","1. **Prétraitement des tweets**\n"," - Nettoyage\n"," - Tokenisation et lemmatisation\n"," - Remplacement des URLs et mentions par des tokens spéciaux\n","\n","3. **Modèles testés**\n"," - **Modèle LSTM bidirectionnel avec Word2Vec:** Ce modèle utilisera une architecture de réseau de neurones récurrents (LSTM) bidirectionnel et les embeddings pré-entraînés **Word2Vec** pour représenter les mots.\n"," - **Modèle LSTM bidirectionnel avec GloVe 300d:** Ce modèle similaire utilisera également une architecture LSTM bidirectionnel, mais avec les embeddings pré-entraînés **GloVe de dimension 300**.\n","\n","\n","3. **Évaluation et suivi**\n"," - Métriques: précision, accuracy, recall, F1-score, ROC-AUC\n"," - Tracking avec MLflow pour la reproductibilité et la comparaison\n","\n","\n","Il est important de noter que l'entraînement est fait sur un sous-échantillon et non sur l'intégralité du dataset."],"metadata":{"id":"Lq2h1qmW2PqP"}},{"cell_type":"markdown","metadata":{"id":"UXHYqYWiNwMs"},"source":["## Prétraitement\n","\n","Notre démarche pour la classification de sentiment avec des approches classiques comprend:\n","\n","1. **Prétraitement des tweets**\n"," - Nettoyage\n"," - Tokenisation et lemmatisation\n"," - Remplacement des URLs et mentions par des tokens spéciaux\n","\n"]},{"cell_type":"code","execution_count":8,"metadata":{"id":"XC0M0gPXNwMs","executionInfo":{"status":"ok","timestamp":1751496266518,"user_tz":-120,"elapsed":1494,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def convert_sentiment_label(df):\n"," converted_target_data = df.copy()\n"," converted_target_data['target'] = converted_target_data['target'].apply(lambda x: 0 if x == 0 else 1)\n"," return converted_target_data\n","\n","converted_target_data = convert_sentiment_label(raw_data)"]},{"cell_type":"code","execution_count":9,"metadata":{"id":"gMSXKh2RNwMs","outputId":"f692c084-abe8-4b71-aa62-abf47301f443","colab":{"base_uri":"https://localhost:8080/","height":178},"executionInfo":{"status":"ok","timestamp":1751496266572,"user_tz":-120,"elapsed":27,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":["target\n","0 800000\n","1 800000\n","Name: count, dtype: int64"],"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
count
target
0800000
1800000
\n","

"]},"metadata":{},"execution_count":9}],"source":["converted_target_data['target'].value_counts()"]},{"cell_type":"code","execution_count":10,"metadata":{"id":"WF56apRJNwMs","outputId":"c948ac8d-d5db-42e4-8b6b-f95108f795a5","colab":{"base_uri":"https://localhost:8080/","height":178},"executionInfo":{"status":"ok","timestamp":1751496266983,"user_tz":-120,"elapsed":410,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":["target\n","0 50000\n","1 50000\n","Name: count, dtype: int64"],"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
count
target
050000
150000
\n","

"]},"metadata":{},"execution_count":10}],"source":["def downsample_data(df, n_samples=50000):\n"," \"\"\"\n"," Réduit la taille d'un DataFrame en échantillonnant aléatoirement un nombre spécifié de lignes pour chaque classe.\n"," \"\"\"\n"," negative_samples = df[df['target'] == 0].sample(n=n_samples, random_state=42)\n"," positive_samples = df[df['target'] == 1].sample(n=n_samples, random_state=42)\n"," downsampled_data = pd.concat([negative_samples, positive_samples])\n"," return downsampled_data\n","\n","downsampled_data = downsample_data(converted_target_data, n_samples=50000)\n","downsampled_data['target'].value_counts()"]},{"cell_type":"code","execution_count":11,"metadata":{"id":"WZxoqzdFNwMs","executionInfo":{"status":"ok","timestamp":1751496267022,"user_tz":-120,"elapsed":34,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["from multiprocessing import Pool\n","\n","# Fonction de prétraitement pour les tweets\n","def preprocess_tweet(tweet):\n"," \"\"\"\n"," Prétraite un tweet en appliquant plusieurs transformations :\n"," - Conversion en minuscules\n"," - Remplacement des URLs, mentions et hashtags par des tokens spéciaux\n"," - Suppression des caractères spéciaux\n"," - Tokenisation et lemmatisation\n"," - Suppression des stopwords\n"," \"\"\"\n"," # Vérifier si le tweet est une chaîne de caractères\n"," if not isinstance(tweet, str):\n"," return \"\"\n","\n"," # Convertir en minuscules\n"," tweet = tweet.lower()\n","\n"," # Remplacer les URLs par un token spécial\n"," tweet = re.sub(r'https?://\\S+|www\\.\\S+', '', tweet)\n","\n"," # Remplacer les mentions par un token spécial\n"," tweet = re.sub(r'@\\w+', '', tweet)\n","\n"," # Traiter les hashtags (conserver le # comme token séparé et le mot qui suit)\n"," tweet = re.sub(r'#(\\w+)', r'# \\1', tweet)\n","\n"," # Traiter le langage html\n"," tweet = html.unescape(tweet)\n","\n"," # Supprimer les caractères spéciaux et les nombres, mais garder les tokens spéciaux\n"," tweet = re.sub(r'[^\\w\\s<>@#!?]', '', tweet)\n","\n"," # Tokenisation\n"," tokens = word_tokenize(tweet)\n","\n"," # Lemmatisation\n"," lemmatizer = WordNetLemmatizer()\n"," tokens = [lemmatizer.lemmatize(token) for token in tokens]\n","\n"," # Supprimer les stopwords, mais conserver les négations importantes\n"," stop_words = set(stopwords.words('english'))\n"," important_words = {'no', 'not', 'nor', 'neither', 'never', 'nobody', 'none', 'nothing', 'nowhere'}\n"," stop_words = stop_words - important_words\n"," tokens = [token for token in tokens if token not in stop_words]\n","\n"," # Rejoindre les tokens en une chaîne\n"," return ' '.join(tokens)\n","\n","\n","def process_in_parallel(df, func, n_jobs=4):\n"," \"\"\"\n"," Applique une fonction à un DataFrame en le divisant en parties et en traitant chaque partie en parallèle.\n"," Permet d'accélérer le traitement sur les ordinateurs multi-coeurs.\n"," \"\"\"\n"," df_split = np.array_split(df, n_jobs)\n"," pool = Pool(n_jobs)\n"," df = pd.concat(pool.map(func, df_split))\n"," pool.close()\n"," pool.join()\n"," return df\n","\n","def apply_preprocessing(df_part):\n"," df_part['processed_text'] = df_part['text'].apply(preprocess_tweet)\n"," return df_part"]},{"cell_type":"code","execution_count":12,"metadata":{"id":"f2CkXR7XNwMt","outputId":"33387259-5848-4a47-8151-912e21f50776","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496326866,"user_tz":-120,"elapsed":59842,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Prétraitement des tweets en cours...\n","Prétraitement terminé !\n"]}],"source":["# Appliquer le prétraitement à tous les tweets\n","print(\"Prétraitement des tweets en cours...\")\n","preprocessed_data = process_in_parallel(downsampled_data, apply_preprocessing, n_jobs=8)\n","print(\"Prétraitement terminé !\")"]},{"cell_type":"code","execution_count":13,"metadata":{"id":"LN5ul0JBNwMt","outputId":"125b0b97-0a9e-4f91-94aa-e81350cd4cbd","colab":{"base_uri":"https://localhost:8080/","height":573},"executionInfo":{"status":"ok","timestamp":1751496327160,"user_tz":-120,"elapsed":295,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" target ids date flag \\\n","212188 0 1974671194 Sat May 30 13:36:31 PDT 2009 NO_QUERY \n","299036 0 1997882236 Mon Jun 01 17:37:11 PDT 2009 NO_QUERY \n","475978 0 2177756662 Mon Jun 15 06:39:05 PDT 2009 NO_QUERY \n","588988 0 2216838047 Wed Jun 17 20:02:12 PDT 2009 NO_QUERY \n","138859 0 1880666283 Fri May 22 02:03:31 PDT 2009 NO_QUERY \n","\n"," user text \\\n","212188 simba98 @xnausikaax oh no! where did u order from? tha... \n","299036 Seve76 A great hard training weekend is over. a coup... \n","475978 x__claireyy__x Right, off to work Only 5 hours to go until I... \n","588988 Balasi I am craving for japanese food \n","138859 djrickdawson Jean Michel Jarre concert tomorrow gotta work... \n","\n"," processed_text \n","212188 < MENTION > oh no ! u order ? thats horrible \n","299036 great hard training weekend couple day rest le... \n","475978 right work 5 hour go im free xd \n","588988 craving japanese food \n","138859 jean michel jarre concert tomorrow got ta work... "],"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
targetidsdateflagusertextprocessed_text
21218801974671194Sat May 30 13:36:31 PDT 2009NO_QUERYsimba98@xnausikaax oh no! where did u order from? tha...< MENTION > oh no ! u order ? thats horrible
29903601997882236Mon Jun 01 17:37:11 PDT 2009NO_QUERYSeve76A great hard training weekend is over. a coup...great hard training weekend couple day rest le...
47597802177756662Mon Jun 15 06:39:05 PDT 2009NO_QUERYx__claireyy__xRight, off to work Only 5 hours to go until I...right work 5 hour go im free xd
58898802216838047Wed Jun 17 20:02:12 PDT 2009NO_QUERYBalasiI am craving for japanese foodcraving japanese food
13885901880666283Fri May 22 02:03:31 PDT 2009NO_QUERYdjrickdawsonJean Michel Jarre concert tomorrow gotta work...jean michel jarre concert tomorrow got ta work...
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"preprocessed_data","summary":"{\n \"name\": \"preprocessed_data\",\n \"rows\": 100000,\n \"fields\": [\n {\n \"column\": \"target\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 0,\n \"max\": 1,\n \"num_unique_values\": 2,\n \"samples\": [\n 1,\n 0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"ids\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 192922675,\n \"min\": 1467811594,\n \"max\": 2329205473,\n \"num_unique_values\": 99996,\n \"samples\": [\n 2046950711,\n 2254018011\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"date\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 93451,\n \"samples\": [\n \"Fri Jun 05 17:55:21 PDT 2009\",\n \"Mon Jun 01 00:07:41 PDT 2009\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"flag\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"NO_QUERY\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"user\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 82677,\n \"samples\": [\n \"FRSoul\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 99702,\n \"samples\": [\n \"@dsrosenthal I was using adium 1.4b5, just upgraded to 1.4b6...same fail \"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"processed_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 97332,\n \"samples\": [\n \"york thingy finially arrived time waiting week uea managed get three 9 day speedy no ?\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":13}],"source":["preprocessed_data.head()"]},{"cell_type":"markdown","metadata":{"id":"zyb9Fj38NwMt"},"source":["## Division des données en ensembles d'entraînement et de test"]},{"cell_type":"code","execution_count":14,"metadata":{"id":"Z_y6Ja0INwMt","outputId":"01bfc5c1-62c2-419b-a15f-8b4dacc305c4","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496327204,"user_tz":-120,"elapsed":43,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Taille de l'ensemble d'entraînement: 80000 exemples\n","Taille de l'ensemble de test: 20000 exemples\n"]}],"source":["# Diviser les données en ensembles d'entraînement et de test\n","from sklearn.model_selection import train_test_split\n","\n","X = preprocessed_data['processed_text']\n","y = preprocessed_data['target']\n","\n","# Division train/test\n","X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n","\n","print(f\"Taille de l'ensemble d'entraînement: {X_train.shape[0]} exemples\")\n","print(f\"Taille de l'ensemble de test: {X_test.shape[0]} exemples\")"]},{"cell_type":"markdown","metadata":{"id":"wPE9r-G4NwMt"},"source":["## Entraînement des modèles et tracking avec MLflow"]},{"cell_type":"markdown","metadata":{"id":"zpsZDWuANwMt"},"source":["### Configuration de MLFlow"]},{"cell_type":"code","source":["import mlflow\n","import mlflow.keras\n","from mlflow.models import infer_signature\n","from mlflow import MlflowClient\n","from dotenv import load_dotenv\n","\n","# Charger les variables d'environnement depuis le fichier .env\n","load_dotenv()\n","\n","# Configuration de MLflow avec les variables d'environnement\n","mlflow_tracking_uri = os.getenv(\"MLFLOW_TRACKING_URI\")\n","mlflow_s3_endpoint_url = os.getenv(\"MLFLOW_S3_ENDPOINT_URL\")\n","aws_access_key_id = os.getenv(\"AWS_ACCESS_KEY_ID\")\n","aws_secret_access_key = os.getenv(\"AWS_SECRET_ACCESS_KEY\")\n","\n","# Configuration explicite de MLflow\n","mlflow.set_tracking_uri(mlflow_tracking_uri)\n","print(f\"MLflow Tracking URI: {mlflow_tracking_uri}\")\n","\n","# Configuration explicite des identifiants AWS\n","os.environ[\"MLFLOW_S3_ENDPOINT_URL\"] = mlflow_s3_endpoint_url\n","os.environ[\"AWS_ACCESS_KEY_ID\"] = aws_access_key_id\n","os.environ[\"AWS_SECRET_ACCESS_KEY\"] = aws_secret_access_key\n","print(\"Identifiants AWS configurés\")"],"metadata":{"id":"qoQ4njujN758","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496328688,"user_tz":-120,"elapsed":1483,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"b87937dd-21cd-4b1a-ca4f-713db41d03db"},"execution_count":15,"outputs":[{"output_type":"stream","name":"stdout","text":["MLflow Tracking URI: https://mlflow.greg-madman-nas.duckdns.org/\n","Identifiants AWS configurés\n"]}]},{"cell_type":"code","execution_count":16,"metadata":{"id":"CZ7unEtvNwMt","outputId":"ae2a73b9-81c2-46ed-bd22-79a5471c1af6","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496329235,"user_tz":-120,"elapsed":540,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":16}],"source":["# Créer l'expérience MLflow\n","mlflow.set_experiment(\"OC Projet 7\")"]},{"cell_type":"markdown","metadata":{"id":"33JkcVxcNwMt"},"source":["## Préparation des données pour les modèles de deep learning\n","\n","D'abord, nous devons tokeniser nos textes et les préparer pour l'entraînement des modèles de deep learning."]},{"cell_type":"code","execution_count":17,"metadata":{"id":"WKfNMY_JNwMt","outputId":"2b5e61b0-25a0-4fc2-f4dc-40dad99ba40c","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496332484,"user_tz":-120,"elapsed":3223,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Taille du vocabulaire: 52692\n","Forme des données d'entraînement: (80000, 50)\n","Forme des données de test: (20000, 50)\n"]}],"source":["# Définir la longueur maximale des séquences (nombre de mots par tweet)\n","MAX_SEQUENCE_LENGTH = 50\n","\n","# Définir la taille du vocabulaire (nombre de mots uniques à considérer)\n","MAX_VOCAB_SIZE = 20000\n","\n","# Tokenisation des textes\n","tokenizer = Tokenizer(num_words=MAX_VOCAB_SIZE, oov_token='')\n","tokenizer.fit_on_texts(X_train)\n","\n","# Convertir les textes en séquences d'indices\n","X_train_seq = tokenizer.texts_to_sequences(X_train)\n","X_test_seq = tokenizer.texts_to_sequences(X_test)\n","\n","# Padding des séquences pour qu'elles aient toutes la même longueur\n","X_train_pad = pad_sequences(X_train_seq, maxlen=MAX_SEQUENCE_LENGTH, padding='post', truncating='post')\n","X_test_pad = pad_sequences(X_test_seq, maxlen=MAX_SEQUENCE_LENGTH, padding='post', truncating='post')\n","\n","# Créer le dossier pour sauvegarder les modèles\n","os.makedirs(\"content/advanced-model\", exist_ok=True)\n","# os.makedirs(\"content/advanced-model/best\", exist_ok=True)\n","\n","# Sauvegarder le tokenizer pour une utilisation ultérieure\n","import pickle\n","with open('content/advanced-model/tokenizer.pickle', 'wb') as handle:\n"," pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)\n","\n","print(f\"Taille du vocabulaire: {len(tokenizer.word_index) + 1}\")\n","print(f\"Forme des données d'entraînement: {X_train_pad.shape}\")\n","print(f\"Forme des données de test: {X_test_pad.shape}\")"]},{"cell_type":"markdown","metadata":{"id":"876rS4__NwMt"},"source":["## Fonctions d'évaluation"]},{"cell_type":"code","execution_count":18,"metadata":{"id":"OrUjzG-6NwMt","executionInfo":{"status":"ok","timestamp":1751496332484,"user_tz":-120,"elapsed":2,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def evaluate_model(model, X_test, y_test, class_names=['Négatif', 'Positif']):\n"," \"\"\"\n"," Évalue le modèle sur l'ensemble de test et retourne les métriques de performance.\n"," \"\"\"\n"," # Prédictions du modèle\n"," y_pred_proba = model.predict(X_test)\n"," y_pred = (y_pred_proba > 0.5).astype(int)\n","\n"," # Convertir les prédictions de format numpy à format list pour éviter les erreurs de sérialisation\n"," if isinstance(y_pred, np.ndarray):\n"," y_pred = y_pred.flatten().tolist()\n"," if isinstance(y_pred_proba, np.ndarray):\n"," y_pred_proba = y_pred_proba.flatten().tolist()\n","\n"," # Calculer les métriques\n"," accuracy = accuracy_score(y_test, y_pred)\n"," precision = precision_score(y_test, y_pred)\n"," recall = recall_score(y_test, y_pred)\n"," f1 = f1_score(y_test, y_pred)\n"," roc_auc = roc_auc_score(y_test, y_pred_proba)\n","\n"," # Matrice de confusion\n"," cm = confusion_matrix(y_test, y_pred)\n","\n"," # Rapport de classification\n"," report = classification_report(y_test, y_pred, target_names=class_names)\n","\n"," metrics = {\n"," 'accuracy': accuracy,\n"," 'precision': precision,\n"," 'recall': recall,\n"," 'f1': f1,\n"," 'roc_auc': roc_auc\n"," }\n","\n"," return metrics, cm, report, y_pred, y_pred_proba\n","\n","def plot_confusion_matrix(cm, class_names, title='Matrice de confusion'):\n"," \"\"\"\n"," Crée une figure de matrice de confusion.\n"," \"\"\"\n"," fig, ax = plt.subplots(figsize=(8, 6))\n"," im = ax.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)\n"," ax.figure.colorbar(im, ax=ax)\n"," ax.set(xticks=np.arange(cm.shape[1]),\n"," yticks=np.arange(cm.shape[0]),\n"," xticklabels=class_names,\n"," yticklabels=class_names,\n"," title=title,\n"," ylabel='Vraie étiquette',\n"," xlabel='Étiquette prédite')\n","\n"," # Pivoter les labels de l'axe des x\n"," plt.setp(ax.get_xticklabels(), rotation=45, ha=\"right\", rotation_mode=\"anchor\")\n","\n"," # Annoter la matrice de confusion\n"," thresh = cm.max() / 2.\n"," for i in range(cm.shape[0]):\n"," for j in range(cm.shape[1]):\n"," ax.text(j, i, format(cm[i, j], 'd'),\n"," ha=\"center\", va=\"center\",\n"," color=\"white\" if cm[i, j] > thresh else \"black\")\n","\n"," plt.tight_layout()\n"," return fig\n"]},{"cell_type":"markdown","metadata":{"id":"3_YfW-7yNwMt"},"source":["## Fonction de logging pour MLflow"]},{"cell_type":"code","source":["def log_model_to_mlflow(model, model_name, vectorizer_name, metrics, cm, report, X_test, y_test, history=None, params=None):\n"," \"\"\"\n"," Enregistre le modèle et ses performances dans MLflow.\n"," \"\"\"\n"," class_names = ['Négatif', 'Positif']\n","\n"," with mlflow.start_run(run_name=f\"Modele_Avance_{model_name}_{vectorizer_name}\"):\n"," # Enregistrer les paramètres du modèle\n"," if params:\n"," for key, value in params.items():\n"," mlflow.log_param(key, value)\n","\n"," # Enregistrer les métriques de validation issues de l'entraînement\n"," if history is not None:\n"," hist = history.history\n"," if 'val_precision' in hist:\n"," best_epoch = int(np.argmax(hist['val_precision']))\n"," mlflow.log_metric(\"val_precision\", float(hist['val_precision'][best_epoch]))\n"," if 'val_loss' in hist:\n"," mlflow.log_metric(\"val_loss\", float(hist['val_loss'][best_epoch]))\n"," if 'val_recall' in hist:\n"," mlflow.log_metric(\"val_recall\", float(hist['val_recall'][best_epoch]))\n","\n"," # Enregistrer les métriques de performance\n"," for key, value in metrics.items():\n"," mlflow.log_metric('test_' + key, value)\n","\n"," # Tracer et enregistrer la matrice de confusion\n"," fig = plot_confusion_matrix(cm, class_names)\n"," mlflow.log_figure(fig, f\"confusion_matrix_{model_name}_{vectorizer_name}.png\")\n"," plt.close(fig)\n","\n"," # Enregistrer le rapport de classification\n"," report_path = f\"content/advanced-model/{model_name}_{vectorizer_name}/classification_report.txt\"\n"," os.makedirs(os.path.dirname(report_path), exist_ok=True)\n"," with open(report_path, \"w\") as f:\n"," f.write(report)\n"," mlflow.log_artifact(report_path)\n","\n"," # Enregistrer le modèle dans MLflow\n"," signature = infer_signature(X_test, y_test)\n"," mlflow.keras.log_model(\n"," model,\n"," f\"model_{model_name}_{vectorizer_name}\",\n"," signature=signature\n"," )\n","\n"," # Log du dossier local qui contient déjà tous les artefacts\n"," artifact_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}\"\n"," if os.path.exists(artifact_dir):\n"," mlflow.log_artifacts(artifact_dir, \"local_artifacts\")\n","\n"," return mlflow.active_run().info.run_id\n","\n","\n","def plot_training_history(history, model_name, vectorizer_name, run_id=None):\n"," \"\"\"\n"," Trace l'historique d'entraînement du modèle et l'enregistre dans la même exécution MLflow.\n","\n"," Args:\n"," history: Historique d'entraînement du modèle\n"," model_name: Nom du modèle\n"," vectorizer_name: Nom du vectoriseur\n"," run_id: ID de l'exécution MLflow existante\n","\n"," Returns:\n"," fig: Figure matplotlib créée\n"," \"\"\"\n"," fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n","\n"," # Tracer precision (train & val)\n"," ax1.plot(history.history['precision'], label='train')\n"," ax1.plot(history.history['val_precision'], label='validation')\n"," ax1.set_title(f'Précision - {model_name} avec {vectorizer_name}')\n"," ax1.set_xlabel('Epoch')\n"," ax1.set_ylabel('Précision')\n"," ax1.legend()\n","\n"," # Tracer loss (train & val)\n"," ax2.plot(history.history['loss'], label='train')\n"," ax2.plot(history.history['val_loss'], label='validation')\n"," ax2.set_title(f'Loss - {model_name} avec {vectorizer_name}')\n"," ax2.set_xlabel('Epoch')\n"," ax2.set_ylabel('Loss')\n"," ax2.legend()\n","\n","\n"," plt.tight_layout()\n","\n"," # Sauvegarder la figure localement\n"," filename = f'content/advanced-model/training_history_{model_name}_{vectorizer_name}.png'\n"," plt.savefig(filename)\n","\n"," # Enregistrer dans MLflow en utilisant l'exécution existante\n"," if run_id:\n"," with mlflow.start_run(run_id=run_id):\n"," mlflow.log_figure(fig, f\"training_history_{model_name}_{vectorizer_name}.png\")\n"," else:\n"," # Fallback si aucun run_id n'est fourni\n"," with mlflow.start_run(run_name=f\"ModeleAvance_{model_name}_{vectorizer_name}\"):\n"," mlflow.log_figure(fig, f\"training_history_{model_name}_{vectorizer_name}.png\")"],"metadata":{"id":"etdkfzD9x8t3","executionInfo":{"status":"ok","timestamp":1751496332505,"user_tz":-120,"elapsed":21,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"execution_count":19,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"1UorrWtSNwMu"},"source":["## Chargement et préparation des embeddings pré-entraînés"]},{"cell_type":"markdown","metadata":{"id":"yzl1y9HSNwMu"},"source":["### Word2vec"]},{"cell_type":"code","execution_count":20,"metadata":{"id":"K0hDRRZmNwMu","outputId":"93c2982f-d9e5-41d9-888b-cc527e9e3978","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496332875,"user_tz":-120,"elapsed":369,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Word2Vec model already exists at content/pretrained-embeddings/word2vec/GoogleNews-vectors-negative300.bin\n","Word2Vec model is available at: content/pretrained-embeddings/word2vec/GoogleNews-vectors-negative300.bin\n"]}],"source":["def download_word2vec():\n"," \"\"\"\n"," Downloads the pre-trained Word2Vec embeddings.\n"," Creates the necessary directories, downloads the file, extracts it, and cleans up unneeded files.\n","\n"," Returns:\n"," str: Path to the extracted Word2Vec model file\n"," \"\"\"\n"," import os\n"," import gzip\n"," import shutil\n"," from urllib.request import urlretrieve\n"," import time\n"," import zipfile\n","\n"," # Create necessary directories\n"," content_dir = 'content/pretrained-embeddings'\n"," word2vec_dir = os.path.join(content_dir, 'word2vec')\n","\n"," os.makedirs(word2vec_dir, exist_ok=True)\n","\n"," # Define file paths\n"," model_file = os.path.join(word2vec_dir, 'GoogleNews-vectors-negative300.bin')\n"," zip_file = os.path.join(word2vec_dir, 'GoogleNews-vectors-negative300.bin.zip')\n","\n"," # Skip download if file already exists\n"," if os.path.exists(model_file):\n"," print(f\"Word2Vec model already exists at {model_file}\")\n"," return model_file\n","\n"," # URL for the pre-trained Word2Vec embeddings\n"," # Using huggingface repository as a reliable source\n"," url = 'https://huggingface.co/fse/word2vec-google-news-300/resolve/main/GoogleNews-vectors-negative300.bin.gz'\n","\n"," try:\n"," # Download the file with progress reporting\n"," print(f\"Downloading Word2Vec embeddings from {url}...\")\n"," print(\"This may take a while as the file is ~1.5GB\")\n","\n"," start_time = time.time()\n","\n"," def progress_callback(count, block_size, total_size):\n"," elapsed_time = time.time() - start_time\n"," downloaded = count * block_size / (1024 * 1024) # MB\n"," total = total_size / (1024 * 1024) if total_size > 0 else 0 # MB\n"," percent = min(100, count * block_size * 100 / total_size) if total_size > 0 else 0\n"," speed = downloaded / elapsed_time if elapsed_time > 0 else 0\n","\n"," print(f\"\\rDownloaded: {downloaded:.1f}MB / {total:.1f}MB ({percent:.1f}%) - {speed:.1f}MB/s\",\n"," end='', flush=True)\n","\n"," gz_file = os.path.join(word2vec_dir, 'GoogleNews-vectors-negative300.bin.gz')\n"," urlretrieve(url, gz_file, progress_callback)\n"," print(\"\\nDownload complete!\")\n","\n"," # Extract the gzip file\n"," print(f\"Extracting {gz_file}...\")\n"," with gzip.open(gz_file, 'rb') as f_in:\n"," with open(model_file, 'wb') as f_out:\n"," shutil.copyfileobj(f_in, f_out)\n"," print(\"Extraction complete!\")\n","\n"," # Delete the gzip file to save space\n"," os.remove(gz_file)\n"," print(f\"Deleted temporary file: {gz_file}\")\n","\n"," return model_file\n","\n"," except Exception as e:\n"," print(f\"Error downloading or extracting Word2Vec embeddings: {str(e)}\")\n"," print(\"\\nTrying alternative download source...\")\n","\n"," # Alternative URL (Google Drive mirror)\n"," try:\n"," # Install gdown if not available\n"," import subprocess\n"," import sys\n","\n"," def install_gdown():\n"," subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"gdown\"])\n","\n"," try:\n"," import gdown\n"," except ImportError:\n"," print(\"Installing gdown package for Google Drive downloads...\")\n"," install_gdown()\n"," import gdown\n","\n"," # Google Drive file ID for Word2Vec\n"," file_id = \"0B7XkCwpI5KDYNlNUTTlSS21pQmM\"\n","\n"," print(f\"Downloading Word2Vec embeddings from Google Drive (ID: {file_id})...\")\n"," output = gz_file\n"," gdown.download(id=file_id, output=output, quiet=False)\n","\n"," # Extract the gzip file\n"," print(f\"Extracting {gz_file}...\")\n"," with gzip.open(gz_file, 'rb') as f_in:\n"," with open(model_file, 'wb') as f_out:\n"," shutil.copyfileobj(f_in, f_out)\n"," print(\"Extraction complete!\")\n","\n"," # Delete the gzip file to save space\n"," os.remove(gz_file)\n"," print(f\"Deleted temporary file: {gz_file}\")\n","\n"," return model_file\n","\n"," except Exception as alt_error:\n"," print(f\"Error with alternative download: {str(alt_error)}\")\n","\n"," # Final fallback: direct user to manual download\n"," print(\"\\nAutomatic download failed. Please follow these manual steps:\")\n"," print(\"1. Download the Word2Vec embeddings from: https://drive.google.com/file/d/0B7XkCwpI5KDYNlNUTTlSS21pQmM/view?usp=sharing\")\n"," print(\"2. Extract the downloaded file\")\n"," print(f\"3. Place the 'GoogleNews-vectors-negative300.bin' file in the '{word2vec_dir}' directory\")\n","\n"," # Clean up any partial downloads\n"," if os.path.exists(gz_file):\n"," os.remove(gz_file)\n"," if os.path.exists(model_file) and os.path.getsize(model_file) < 1000000: # If file exists but is too small\n"," os.remove(model_file)\n","\n"," raise Exception(\"Failed to download Word2Vec embeddings automatically. Please download manually.\")\n","\n","# Example usage:\n","model_path = download_word2vec()\n","print(f\"Word2Vec model is available at: {model_path}\")"]},{"cell_type":"code","execution_count":21,"metadata":{"id":"WMvPJS5tNwMu","executionInfo":{"status":"ok","timestamp":1751496333725,"user_tz":-120,"elapsed":849,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["from gensim.models import KeyedVectors\n","\n","def load_word2vec_embeddings():\n"," \"\"\"\n"," Charge les embeddings Word2Vec pré-entraînés.\n"," \"\"\"\n"," print(\"Chargement des embeddings Word2Vec...\")\n","\n"," # Charger le modèle Word2Vec\n"," word2vec_model = KeyedVectors.load_word2vec_format('content/pretrained-embeddings/word2vec/GoogleNews-vectors-negative300.bin', binary=True, limit=500000)\n","\n"," # Convertir en dictionnaire pour une utilisation plus facile\n"," embeddings_index = {}\n"," for word in word2vec_model.key_to_index:\n"," embeddings_index[word] = word2vec_model[word]\n","\n"," print(f\"Trouvé {len(embeddings_index)} vecteurs d'embeddings Word2Vec.\")\n"," return embeddings_index"]},{"cell_type":"markdown","metadata":{"id":"Xor_kNOVNwMu"},"source":["## Création des matrices d'embedding à partir des embeddings pré-entraînés"]},{"cell_type":"code","execution_count":22,"metadata":{"id":"H1nz57olNwMu","executionInfo":{"status":"ok","timestamp":1751496333728,"user_tz":-120,"elapsed":1,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def create_embedding_matrix(word_index, embeddings_index, embedding_dim):\n"," \"\"\"\n"," Crée une matrice d'embedding à partir des embeddings pré-entraînés.\n"," Affiche une barre de progression pendant le traitement.\n","\n"," Args:\n"," word_index (dict): Dictionnaire de mots et leurs indices\n"," embeddings_index (dict): Dictionnaire des embeddings pré-entraînés\n"," embedding_dim (int): Dimension des vecteurs d'embedding\n","\n"," Returns:\n"," numpy.ndarray: Matrice d'embedding\n"," \"\"\"\n"," vocab_size = len(word_index) + 1\n"," embedding_matrix = np.zeros((vocab_size, embedding_dim))\n","\n"," found_words = 0\n","\n"," # Utiliser tqdm pour afficher une barre de progression\n"," print(f\"Création de la matrice d'embedding pour {len(word_index)} mots...\")\n"," for word, i in tqdm(word_index.items(), total=len(word_index), desc=\"Création matrice d'embedding\"):\n"," embedding_vector = embeddings_index.get(word)\n"," if embedding_vector is not None:\n"," embedding_matrix[i] = embedding_vector\n"," found_words += 1\n","\n"," print(f\"Trouvé {found_words} mots ({found_words/len(word_index)*100:.2f}%) dans les embeddings pré-entraînés.\")\n"," return embedding_matrix"]},{"cell_type":"markdown","metadata":{"id":"XsGjsmVYNwMu"},"source":["## Optimisations matérielle (utilisation du GPU)\n","\n","1. **Désactivation du recurrent_dropout** - Permet l'utilisation de CuDNNLSTM optimisé pour GPU\n","2. **Activation de XLA** (Accelerated Linear Algebra) - Optimise les graphes d'opérations pour GPU\n","3. **Précision mixte** - Utilise float16 pour les calculs et float32 pour les variables\n","4. **Augmentation de la taille du batch** - Passée à 256 pour mieux exploiter le parallélisme GPU\n","5. **Optimisation du pipeline de données** - Utilisation de tf.data.Dataset avec prefetch\n","6. **Scheduler de taux d'apprentissage** - Décroissance exponentielle du taux pour améliorer la convergence\n","\n","Ces modifications permettent d'utiliser efficacement les capacités de notre **GTX 1060 3GB** tout en respectant les limitations de la mémoire."]},{"cell_type":"markdown","metadata":{"id":"lF2h27fxNwMu"},"source":["### Utilisation du GPU"]},{"cell_type":"code","execution_count":23,"metadata":{"id":"TcLWpxKgNwMu","outputId":"c8d611f2-b1a1-4183-fe6b-67ae682dc067","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496334938,"user_tz":-120,"elapsed":1190,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stderr","text":["WARNING:tensorflow:From /tmp/ipython-input-23-656146420.py:12: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.\n","Instructions for updating:\n","Use `tf.config.list_physical_devices('GPU')` instead.\n"]},{"output_type":"stream","name":"stdout","text":["GPU disponible : [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]\n","TensorFlow utilise GPU: True\n","Devices disponibles: [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]\n","Compute dtype: float16\n","Variable dtype: float32\n"]}],"source":["import tensorflow as tf\n","\n","# Configuration de TensorFlow pour utiliser la GPU si disponible\n","physical_devices = tf.config.list_physical_devices('GPU')\n","if physical_devices:\n"," tf.config.experimental.set_memory_growth(physical_devices[0], True)\n"," print(\"GPU disponible :\", physical_devices)\n","else:\n"," print(\"Pas de GPU disponible, utilisation du CPU\")\n","\n","# Vérifier que TensorFlow utilise le GPU\n","print(f\"TensorFlow utilise GPU: {tf.test.is_gpu_available()}\")\n","print(f\"Devices disponibles: {tf.config.list_physical_devices()}\")\n","\n","# Optimiser les performances avec mixed precision\n","# Cette option accélère l'entraînement sur les GPU récents\n","policy = tf.keras.mixed_precision.Policy('mixed_float16')\n","tf.keras.mixed_precision.set_global_policy(policy)\n","print(f'Compute dtype: {policy.compute_dtype}')\n","print(f'Variable dtype: {policy.variable_dtype}')"]},{"cell_type":"markdown","metadata":{"id":"K6WAGmVVNwMu"},"source":["### Optimisations de la mémoire et configuration TensorFlow"]},{"cell_type":"code","execution_count":24,"metadata":{"id":"EHdEo-FBNwMu","outputId":"19e2a2df-8c60-4292-eb3f-37e45c1a9fe5","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496334949,"user_tz":-120,"elapsed":5,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Mémoire GPU dynamique activée\n","Politique de calcul: mixed_float16\n"]}],"source":["# Activer la mémoire GPU dynamique\n","gpus = tf.config.experimental.list_physical_devices('GPU')\n","if gpus:\n"," try:\n"," for gpu in gpus:\n"," tf.config.experimental.set_memory_growth(gpu, True)\n"," print(\"Mémoire GPU dynamique activée\")\n"," except RuntimeError as e:\n"," print(f\"Erreur: {e}\")\n","\n","# Activer XLA (Accelerated Linear Algebra) pour optimiser les graphes\n","tf.config.optimizer.set_jit(True) # Active la compilation Just-In-Time\n","\n","# Précision mixte pour accélérer les calculs\n","policy = tf.keras.mixed_precision.Policy('mixed_float16')\n","tf.keras.mixed_precision.set_global_policy(policy)\n","print(f'Politique de calcul: {policy.name}')"]},{"cell_type":"markdown","metadata":{"id":"5tWaCIapNwMu"},"source":["### Optimisation du chargement des données"]},{"cell_type":"code","execution_count":25,"metadata":{"id":"_OYSmRuiNwMw","executionInfo":{"status":"ok","timestamp":1751496334996,"user_tz":-120,"elapsed":46,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["# 2. Optimiser le chargement des données\n","AUTOTUNE = tf.data.AUTOTUNE\n","BATCH_SIZE = 256 # Tester avec différentes valeurs: 128, 256, 512\n","\n","# Créer un dataset TensorFlow optimisé\n","def create_optimized_dataset(x, y, is_training=True):\n"," dataset = tf.data.Dataset.from_tensor_slices((x, y))\n"," if is_training:\n"," dataset = dataset.shuffle(10000)\n","\n"," # Utiliser un batch plus grand pour mieux utiliser le GPU\n"," dataset = dataset.batch(BATCH_SIZE)\n","\n"," # Précharger les données pour éviter les goulots d'étranglement\n"," dataset = dataset.prefetch(AUTOTUNE)\n"," return dataset\n","\n","# Séparer les données de validation et créer les datasets optimisés\n","val_size = int(0.1 * len(X_train_pad))\n","x_val = X_train_pad[-val_size:]\n","y_val = y_train[-val_size:]\n","x_train_final = X_train_pad[:-val_size]\n","y_train_final = y_train[:-val_size]\n","\n","train_dataset = create_optimized_dataset(x_train_final, y_train_final)\n","val_dataset = create_optimized_dataset(x_val, y_val, is_training=False)"]},{"cell_type":"markdown","metadata":{"id":"5angsL01NwMx"},"source":["Nos optimisations fonctionnent correctement :\n","\n","1. **XLA activé** : `Loaded cuDNN version 90300` et `Compiled cluster using XLA!` confirment que l'accélération XLA est bien activée.\n","2. **CuDNN chargé** : Le message indique que cuDNN (version 9.03) est correctement chargé, ce qui signifie que vos couches LSTM utiliseront l'implémentation optimisée pour GPU.\n","3. **GPU reconnu** : Le système a bien reconnu votre NVIDIA GeForce GTX 1060 3GB avec Compute Capability 6.1.\n","\n","Nous observervons :\n","- Une utilisation GPU bien supérieure à 20% (idéalement 70-90%)\n","- Un temps d'entraînement par epoch considérablement réduit\n","\n","Pour vérifier l'utilisation réelle du GPU pendant l'entraînement, nous pouvons exécuter :\n","\n","```shell\n","nvidia-smi -l 1\n","```"]},{"cell_type":"markdown","metadata":{"id":"PicWq6E0NwMx"},"source":["### Bilan de l'optimisation\n","\n","Nous avons réussi à optimiser significativement l'utilisation de notre GPU. Les modifications que nous avons apportées ont considérablement amélioré les performances :\n","\n","- Nous avons augmenté l'**utilisation de votre GPU de 20% à 73%**\n","- Nous utilisons maintenant intelligemment la mémoire disponible\n","- Nous avons activé les technologies d'**accélération comme XLA et CuDNN**\n","- Nous avons désactivé le **recurrent_dropout** pour permettre l'utilisation des implémentations GPU optimisées\n","- Nous avons implémenté la **précision mixte** pour accélérer les calculs\n","- Nous avons optimisé la **taille du batch** et le pipeline de données\n","\n","Nous avons atteint un excellent équilibre entre l'utilisation maximale des ressources et la stabilité du système."]},{"cell_type":"markdown","metadata":{"id":"NlECzxylNwMx"},"source":["## Création d'un modèles LSTM avec embeddings pré-entraînés\n","\n","Voici une description de la fonction `create_lstm_model_with_pretrained` qui crée un **modèle LSTM** avec des **embeddings pré-entraînés** :\n","\n","- Crée un modèle de réseau de neurones pour la **classification de texte** utilisant des **embeddings pré-entraînés**\n","- Initialise une couche d'embedding avec les poids fournis dans `embedding_matrix`\n","- Utilise une architecture profonde avec deux couches LSTM bidirectionnelles (128 puis 64 unités)\n","- Implémente plusieurs techniques de régularisation (dropout spatial et classique) pour éviter le surapprentissage\n","- Inclut une couche dense intermédiaire avec activation ReLU\n","- Se termine par une **couche de sortie avec activation sigmoïde**, adaptée aux problèmes de **classification binaire**\n","- Compile le modèle avec l'**optimiseur Adam**, une fonction de perte d'entropie croisée binaire et suit la métrique de précision\n","- Permet de contrôler si les embeddings sont entraînables ou figés via le paramètre `trainable`"]},{"cell_type":"code","execution_count":26,"metadata":{"id":"1KZ4x6cGNwMx","executionInfo":{"status":"ok","timestamp":1751496335012,"user_tz":-120,"elapsed":15,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def create_optimized_lstm_model(embedding_matrix, max_seq_length=MAX_SEQUENCE_LENGTH, trainable=False):\n"," vocab_size, embedding_dim = embedding_matrix.shape\n","\n"," # Entrée du modèle\n"," input_layer = tf.keras.layers.Input(shape=(max_seq_length,))\n","\n"," # Couche d'embedding avec des poids pré-entraînés\n"," embedding_layer = tf.keras.layers.Embedding(\n"," input_dim=vocab_size,\n"," output_dim=embedding_dim,\n"," weights=[embedding_matrix],\n"," input_length=max_seq_length,\n"," trainable=trainable\n"," )(input_layer)\n","\n"," # Dropout spatial\n"," dropout_1 = tf.keras.layers.SpatialDropout1D(0.3)(embedding_layer)\n","\n"," # Couche CuDNNLSTM optimisée pour GPU (via le backend GPU automatique de TF)\n"," # Note: TF2.x utilise automatiquement l'implémentation CuDNNLSTM quand recurrent_dropout=0\n"," lstm_layer = tf.keras.layers.Bidirectional(\n"," tf.keras.layers.LSTM(\n"," units=128,\n"," dropout=0.2,\n"," recurrent_dropout=0.0, # Mettre à 0 pour utiliser l'implémentation CuDNN optimisée\n"," return_sequences=True\n"," )\n"," )(dropout_1)\n","\n"," # Deuxième couche LSTM\n"," lstm_layer_2 = tf.keras.layers.Bidirectional(\n"," tf.keras.layers.LSTM(\n"," units=64,\n"," dropout=0.2,\n"," recurrent_dropout=0.0 # Mettre à 0 pour utiliser l'implémentation CuDNN optimisée\n"," )\n"," )(lstm_layer)\n","\n"," # Couche dense avec activation ReLU\n"," dense_1 = tf.keras.layers.Dense(64, activation='relu')(lstm_layer_2)\n"," dropout_2 = tf.keras.layers.Dropout(0.4)(dense_1)\n","\n"," # Couche de sortie\n"," output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(dropout_2)\n","\n"," # Créer et compiler le modèle avec un optimiseur efficace sur GPU\n"," model = tf.keras.Model(inputs=input_layer, outputs=output_layer)\n","\n"," # Utiliser un taux d'apprentissage avec décroissance\n"," # lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(\n"," # initial_learning_rate=0.001,\n"," # decay_steps=1000,\n"," # decay_rate=0.9,\n"," # staircase=True\n"," # )\n","\n"," model.compile(\n"," optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), # taux fixe\n"," loss='binary_crossentropy',\n"," # on ajoute aussi le rappel car on veut tout de même limiter le nombre de faux négatifs\n"," metrics=[keras.metrics.Precision(name='precision'), keras.metrics.Recall(name='recall')]\n"," )\n","\n"," return model"]},{"cell_type":"markdown","metadata":{"id":"S_tupAxrNwMx"},"source":["## Fonction de sauvegarde locale des artefacts du modèle\n","\n","Sauvegarde tous les artefacts du modèle (modèle, tokenizer, fonction de prétraitement, historique) dans un sous-dossier dédié."]},{"cell_type":"code","execution_count":27,"metadata":{"id":"Mxy90vFuNwMx","executionInfo":{"status":"ok","timestamp":1751496335021,"user_tz":-120,"elapsed":8,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["import os\n","import dill # Plus puissant que pickle pour sauvegarder des fonctions\n","import datetime\n","import json\n","\n","def save_model_artifacts(model, model_name, vectorizer_name, history, tokenizer):\n"," \"\"\"\n"," Sauvegarde tous les artefacts du modèle (modèle, tokenizer, fonction de prétraitement, historique)\n"," dans un sous-dossier dédié.\n"," \"\"\"\n","\n"," # Créer un sous-dossier dédié pour ce modèle\n"," model_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}\"\n"," os.makedirs(model_dir, exist_ok=True)\n","\n"," # Sous-dossiers pour les différents types d'artefacts\n"," checkpoints_dir = f\"{model_dir}/checkpoints\"\n"," os.makedirs(checkpoints_dir, exist_ok=True)\n","\n"," # 1. Sauvegarder le modèle final\n"," model_path = f\"{model_dir}/final_model_{model_name}_{vectorizer_name}.keras\"\n"," model.save(model_path)\n"," print(f\"Modèle sauvegardé dans {model_path}\")\n","\n"," # 2. Sauvegarder le tokenizer\n"," tokenizer_path = f\"{model_dir}/tokenizer.pickle\"\n"," with open(tokenizer_path, 'wb') as handle:\n"," pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)\n"," print(f\"Tokenizer sauvegardé dans {tokenizer_path}\")\n","\n"," # 3. Sauvegarder la fonction de prétraitement\n"," preprocess_path = f\"{model_dir}/preprocess_function.dill\"\n"," with open(preprocess_path, 'wb') as handle:\n"," dill.dump(preprocess_tweet, handle)\n"," print(f\"Fonction de prétraitement sauvegardée dans {preprocess_path}\")\n","\n"," # 4. Sauvegarder l'historique d'entraînement\n"," if history is not None:\n"," history_path = f\"{model_dir}/training_history.pickle\"\n"," with open(history_path, 'wb') as handle:\n"," pickle.dump(history.history, handle, protocol=pickle.HIGHEST_PROTOCOL)\n"," print(f\"Historique d'entraînement sauvegardé dans {history_path}\")\n","\n"," # 5. Sauvegarder les paramètres utilisés - Version ultra-sécurisée\n"," params_path = f\"{model_dir}/parameters.json\"\n","\n"," # Déterminer la dimension d'embedding de façon sûre\n"," embedding_dim = None\n","\n"," # Méthode 1: Accéder directement à l'attribut output_dim des couches Embedding\n"," for layer in model.layers:\n"," if isinstance(layer, tf.keras.layers.Embedding):\n"," embedding_dim = layer.output_dim\n"," break\n","\n"," # Méthode 2: Si ce n'est pas trouvé, utiliser une valeur basée sur le nom du vectorizer\n"," if embedding_dim is None:\n"," if 'word2vec' in vectorizer_name.lower():\n"," embedding_dim = 300 # Dimension standard pour Word2Vec\n"," elif 'glove' in vectorizer_name.lower() and '300d' in vectorizer_name.lower():\n"," embedding_dim = 300\n"," else:\n"," embedding_dim = 100 # Valeur par défaut\n","\n"," params = {\n"," \"model_name\": model_name,\n"," \"vectorizer_name\": vectorizer_name,\n"," \"max_sequence_length\": MAX_SEQUENCE_LENGTH,\n"," \"vocab_size\": MAX_VOCAB_SIZE,\n"," \"embedding_dim\": embedding_dim,\n"," \"date_created\": datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n"," }\n"," with open(params_path, 'w') as f:\n"," json.dump(params, f, indent=4)\n"," print(f\"Paramètres sauvegardés dans {params_path}\")\n","\n"," return model_dir"]},{"cell_type":"markdown","metadata":{"id":"BZLUgq5gNwMx"},"source":["## Entraînement : LSTM avec Word2Vec\n","\n","Nous créons un modèle d'analyse de sentiment des tweets basé sur des **réseaux de neurones récurrents (LSTM)** avec des **embeddings Word2Vec**.\n","\n","Nous chargeons d'abord les embeddings Word2Vec pré-entraînés et les intègrons dans la matrice d'embedding, puis nous définissons une **fonction d'entraînement complète** qui:\n","\n","- Crée un **modèle LSTM bidirectionnel** optimisé pour GPU\n","- Configure des **callbacks** comme early stopping, réduction du taux d'apprentissage et sauvegarde des meilleurs modèles\n","- Entraîne le modèle sur des **données de tweets** prétraitées en utilisant des optimisations GPU\n","- Évalue les **performances du modèle** avec diverses métriques (précision, rappel, F1, etc.)\n","- **Sauvegarde les artefacts du modèle** (modèle final, tokenizer, fonction de prétraitement)\n","- **Enregistre tous les paramètres et résultats dans MLflow** pour faciliter le suivi des expériences\n","- Génère des **visualisations des courbes d'apprentissage**\n","- Retourne le modèle entraîné, son historique et ses métriques de performance\n"]},{"cell_type":"code","execution_count":28,"metadata":{"id":"qOq86PFNNwMx","outputId":"3175f0bd-9cdf-4ee4-f96d-e5fd88b0c944","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496348585,"user_tz":-120,"elapsed":13563,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Chargement des embeddings Word2Vec...\n","Trouvé 500000 vecteurs d'embeddings Word2Vec.\n","Création de la matrice d'embedding pour 52691 mots...\n"]},{"output_type":"stream","name":"stderr","text":["Création matrice d'embedding: 100%|██████████| 52691/52691 [00:00<00:00, 503127.04it/s]"]},{"output_type":"stream","name":"stdout","text":["Trouvé 18060 mots (34.28%) dans les embeddings pré-entraînés.\n","Forme de la matrice d'embedding: (52692, 300)\n","Échantillon de valeurs: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n","Type de données: float64\n"]},{"output_type":"stream","name":"stderr","text":["\n"]}],"source":["word2vec_embeddings = load_word2vec_embeddings()\n","word2vec_matrix = create_embedding_matrix(tokenizer.word_index, word2vec_embeddings, 300)\n","\n","# Vérifiez la forme et les valeurs de la matrice d'embedding\n","print(\"Forme de la matrice d'embedding:\", word2vec_matrix.shape)\n","print(\"Échantillon de valeurs:\", word2vec_matrix[0, :10]) # Affiche les 10 premières valeurs de la première ligne\n","print(\"Type de données:\", word2vec_matrix.dtype)"]},{"cell_type":"code","execution_count":29,"metadata":{"id":"KXMLd7jqNwMx","executionInfo":{"status":"ok","timestamp":1751496348604,"user_tz":-120,"elapsed":10,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["# Créer une fonction pour configurer le callback ModelCheckpoint\n","def create_model_checkpoint(model_name, vectorizer_name):\n"," \"\"\"\n"," Crée un callback ModelCheckpoint qui sauvegarde uniquement le meilleur modèle.\n"," \"\"\"\n"," # Créer le dossier pour les checkpoints\n"," checkpoint_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}/checkpoints\"\n"," os.makedirs(checkpoint_dir, exist_ok=True)\n","\n"," # Créer un seul checkpoint pour le meilleur modèle\n"," best_checkpoint = tf.keras.callbacks.ModelCheckpoint(\n"," filepath=f\"{checkpoint_dir}/best_model.keras\",\n"," # on décide de monitorer val_precision car c'est ce que l'on souhaite maximiser\n"," # monitor='val_loss',\n"," monitor='val_precision',\n"," save_best_only=True,\n"," # mode='min',\n"," mode='max',\n"," verbose=1\n"," )\n","\n"," return best_checkpoint"]},{"cell_type":"code","execution_count":30,"metadata":{"id":"JGLT8JhWNwMx","executionInfo":{"status":"ok","timestamp":1751496348612,"user_tz":-120,"elapsed":1,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def train_word2vec_lstm_model(epochs=20):\n"," \"\"\"\n"," Entraîne un modèle LSTM avec embeddings Word2Vec en utilisant les optimisations GPU\n"," et le chargement de données optimisé.\n"," \"\"\"\n"," # Définir le nom du modèle et de la méthode d'embedding\n"," model_name = \"LSTM\"\n"," vectorizer_name = \"Word2Vec-Fige\"\n","\n"," # Créer les callbacks pour ce modèle\n"," checkpoint_callback = create_model_checkpoint(model_name, vectorizer_name)\n","\n"," # Autres callbacks\n"," early_stopping = tf.keras.callbacks.EarlyStopping(\n"," monitor='val_loss',\n"," patience=5,\n"," restore_best_weights=True\n"," )\n","\n"," reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(\n"," monitor='val_loss',\n"," factor=0.2,\n"," patience=2,\n"," min_lr=0.00001\n"," )\n","\n"," # TensorBoard pour visualiser l'entraînement\n"," tensorboard_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}/logs\"\n"," os.makedirs(tensorboard_dir, exist_ok=True)\n"," tensorboard_callback = tf.keras.callbacks.TensorBoard(\n"," log_dir=tensorboard_dir,\n"," histogram_freq=1,\n"," update_freq='epoch'\n"," )\n","\n"," # Créer le modèle optimisé pour GPU\n"," model = create_optimized_lstm_model(word2vec_matrix, trainable=False)\n","\n"," print(f\"Entraînement du modèle {model_name} avec embeddings {vectorizer_name}\")\n"," print(f\"Taille du batch: {BATCH_SIZE}\")\n"," print(f\"Utilisation de la précision mixte: {tf.keras.mixed_precision.global_policy().name}\")\n","\n"," # Entraîner le modèle avec les datasets optimisés\n"," history = model.fit(\n"," train_dataset,\n"," epochs=epochs,\n"," validation_data=val_dataset,\n"," callbacks=[early_stopping, reduce_lr, tensorboard_callback, checkpoint_callback],\n"," verbose=1\n"," )\n","\n"," # Déterminer le nombre réel d'époques complétées (en cas d'early stopping)\n"," real_epochs = len(history.history['loss'])\n"," print(f\"Nombre réel d'époques effectuées: {real_epochs}/{epochs}\")\n","\n"," # Sauvegarder tous les artefacts\n"," model_dir = save_model_artifacts(model, model_name, vectorizer_name, history, tokenizer)\n","\n"," # Utiliser evaluate_model pour obtenir les métriques\n"," metrics, cm, report, y_pred, y_pred_proba = evaluate_model(\n"," model,\n"," X_test_pad,\n"," y_test\n"," )\n","\n"," # Afficher les métriques\n"," print(\"\\nMétriques pour le modèle LSTM avec embedding Word2Vec:\")\n"," for key, value in metrics.items():\n"," print(f\"{key}: {value:.4f}\")\n","\n"," print(\"\\nRapport de classification:\")\n"," print(report)\n","\n","\n"," # Enregistrer avec MLflow\n"," params = {\n"," 'model_type': model_name,\n"," 'embedding_type': vectorizer_name,\n"," 'embedding_dim': word2vec_matrix.shape[1],\n"," 'vocab_size': len(tokenizer.word_index) + 1,\n"," 'max_sequence_length': MAX_SEQUENCE_LENGTH,\n"," 'trainable_embedding': False,\n"," 'max_epochs': epochs,\n"," 'real_epochs': real_epochs, # Ajouter le nombre réel d'époques\n"," 'batch_size': BATCH_SIZE,\n"," 'precision_policy': tf.keras.mixed_precision.global_policy().name,\n"," 'gpu_optimization': 'XLA,dynamic_memory,prefetch'\n"," }\n","\n"," # Enregistrer dans MLflow\n"," # run_id = log_model_to_mlflow(model, model_name, vectorizer_name, metrics, cm, report, X_test_pad, y_test, params)\n"," run_id = log_model_to_mlflow(model, model_name, vectorizer_name, metrics, cm, report, X_test_pad, y_test, history, params)\n","\n"," # Visualiser la courbe d'apprentissage\n"," plot_training_history(history, \"LSTM\", \"Word2Vec-Fige\", run_id=run_id)\n","\n"," # Récupérer le lien vers le run MLflow\n"," print(f\"\\nRun MLflow ID: {run_id}\")\n"," print(f\"Accédez à l'interface MLflow pour voir les détails complets.\")\n","\n"," return model, history, metrics, run_id"]},{"cell_type":"code","execution_count":31,"metadata":{"id":"O8S9kFSFNwMx","outputId":"5da637a9-53e0-49ea-f914-bec555d79e36","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1751496603604,"user_tz":-120,"elapsed":254990,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Entraînement du modèle LSTM avec embeddings Word2Vec-Fige\n","Taille du batch: 256\n","Utilisation de la précision mixte: mixed_float16\n","Epoch 1/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step - loss: 0.6039 - precision: 0.6809 - recall: 0.6419\n","Epoch 1: val_precision improved from -inf to 0.74049, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m29s\u001b[0m 65ms/step - loss: 0.6038 - precision: 0.6810 - recall: 0.6421 - val_loss: 0.5326 - val_precision: 0.7405 - val_recall: 0.7330 - learning_rate: 0.0010\n","Epoch 2/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step - loss: 0.5438 - precision: 0.7252 - recall: 0.7157\n","Epoch 2: val_precision did not improve from 0.74049\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m30s\u001b[0m 49ms/step - loss: 0.5437 - precision: 0.7252 - recall: 0.7157 - val_loss: 0.5155 - val_precision: 0.7316 - val_recall: 0.7822 - learning_rate: 0.0010\n","Epoch 3/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.5235 - precision: 0.7371 - recall: 0.7416\n","Epoch 3: val_precision did not improve from 0.74049\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 36ms/step - loss: 0.5234 - precision: 0.7371 - recall: 0.7416 - val_loss: 0.4993 - val_precision: 0.7291 - val_recall: 0.8305 - learning_rate: 0.0010\n","Epoch 4/50\n","\u001b[1m280/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.5062 - precision: 0.7447 - recall: 0.7610\n","Epoch 4: val_precision improved from 0.74049 to 0.75575, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 31ms/step - loss: 0.5062 - precision: 0.7448 - recall: 0.7610 - val_loss: 0.4838 - val_precision: 0.7557 - val_recall: 0.7926 - learning_rate: 0.0010\n","Epoch 5/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4928 - precision: 0.7565 - recall: 0.7673\n","Epoch 5: val_precision improved from 0.75575 to 0.76400, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 33ms/step - loss: 0.4928 - precision: 0.7565 - recall: 0.7672 - val_loss: 0.4835 - val_precision: 0.7640 - val_recall: 0.7822 - learning_rate: 0.0010\n","Epoch 6/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4841 - precision: 0.7639 - recall: 0.7685\n","Epoch 6: val_precision improved from 0.76400 to 0.77258, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m11s\u001b[0m 36ms/step - loss: 0.4841 - precision: 0.7639 - recall: 0.7685 - val_loss: 0.4771 - val_precision: 0.7726 - val_recall: 0.7849 - learning_rate: 0.0010\n","Epoch 7/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4758 - precision: 0.7714 - recall: 0.7749\n","Epoch 7: val_precision improved from 0.77258 to 0.77753, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 32ms/step - loss: 0.4758 - precision: 0.7714 - recall: 0.7749 - val_loss: 0.4711 - val_precision: 0.7775 - val_recall: 0.7783 - learning_rate: 0.0010\n","Epoch 8/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4661 - precision: 0.7749 - recall: 0.7835\n","Epoch 8: val_precision did not improve from 0.77753\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 31ms/step - loss: 0.4661 - precision: 0.7749 - recall: 0.7835 - val_loss: 0.4715 - val_precision: 0.7536 - val_recall: 0.8241 - learning_rate: 0.0010\n","Epoch 9/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4612 - precision: 0.7780 - recall: 0.7862\n","Epoch 9: val_precision did not improve from 0.77753\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 33ms/step - loss: 0.4612 - precision: 0.7780 - recall: 0.7862 - val_loss: 0.4701 - val_precision: 0.7764 - val_recall: 0.8004 - learning_rate: 0.0010\n","Epoch 10/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4576 - precision: 0.7797 - recall: 0.7914\n","Epoch 10: val_precision did not improve from 0.77753\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 30ms/step - loss: 0.4576 - precision: 0.7797 - recall: 0.7914 - val_loss: 0.4703 - val_precision: 0.7492 - val_recall: 0.8378 - learning_rate: 0.0010\n","Epoch 11/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4487 - precision: 0.7854 - recall: 0.7978\n","Epoch 11: val_precision did not improve from 0.77753\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 31ms/step - loss: 0.4487 - precision: 0.7854 - recall: 0.7978 - val_loss: 0.4629 - val_precision: 0.7751 - val_recall: 0.8063 - learning_rate: 0.0010\n","Epoch 12/50\n","\u001b[1m280/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4432 - precision: 0.7877 - recall: 0.7963\n","Epoch 12: val_precision did not improve from 0.77753\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 33ms/step - loss: 0.4432 - precision: 0.7877 - recall: 0.7963 - val_loss: 0.4632 - val_precision: 0.7759 - val_recall: 0.8041 - learning_rate: 0.0010\n","Epoch 13/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4386 - precision: 0.7883 - recall: 0.8023\n","Epoch 13: val_precision did not improve from 0.77753\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 30ms/step - loss: 0.4386 - precision: 0.7883 - recall: 0.8023 - val_loss: 0.4699 - val_precision: 0.7710 - val_recall: 0.8118 - learning_rate: 0.0010\n","Epoch 14/50\n","\u001b[1m280/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4279 - precision: 0.7914 - recall: 0.8111\n","Epoch 14: val_precision improved from 0.77753 to 0.78057, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 33ms/step - loss: 0.4279 - precision: 0.7914 - recall: 0.8111 - val_loss: 0.4656 - val_precision: 0.7806 - val_recall: 0.7948 - learning_rate: 2.0000e-04\n","Epoch 15/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4225 - precision: 0.8004 - recall: 0.8092\n","Epoch 15: val_precision improved from 0.78057 to 0.78626, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 35ms/step - loss: 0.4224 - precision: 0.8004 - recall: 0.8092 - val_loss: 0.4677 - val_precision: 0.7863 - val_recall: 0.7911 - learning_rate: 2.0000e-04\n","Epoch 16/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4187 - precision: 0.8013 - recall: 0.8079\n","Epoch 16: val_precision did not improve from 0.78626\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 32ms/step - loss: 0.4187 - precision: 0.8013 - recall: 0.8079 - val_loss: 0.4653 - val_precision: 0.7822 - val_recall: 0.7980 - learning_rate: 4.0000e-05\n","Nombre réel d'époques effectuées: 16/50\n","Modèle sauvegardé dans content/advanced-model/LSTM_Word2Vec-Fige/final_model_LSTM_Word2Vec-Fige.keras\n","Tokenizer sauvegardé dans content/advanced-model/LSTM_Word2Vec-Fige/tokenizer.pickle\n","Fonction de prétraitement sauvegardée dans content/advanced-model/LSTM_Word2Vec-Fige/preprocess_function.dill\n","Historique d'entraînement sauvegardé dans content/advanced-model/LSTM_Word2Vec-Fige/training_history.pickle\n","Paramètres sauvegardés dans content/advanced-model/LSTM_Word2Vec-Fige/parameters.json\n","\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 4ms/step\n","\n","Métriques pour le modèle LSTM avec embedding Word2Vec:\n","accuracy: 0.7812\n","precision: 0.7684\n","recall: 0.8051\n","f1: 0.7863\n","roc_auc: 0.8637\n","\n","Rapport de classification:\n"," precision recall f1-score support\n","\n"," Négatif 0.80 0.76 0.78 10000\n"," Positif 0.77 0.81 0.79 10000\n","\n"," accuracy 0.78 20000\n"," macro avg 0.78 0.78 0.78 20000\n","weighted avg 0.78 0.78 0.78 20000\n","\n"]},{"output_type":"stream","name":"stderr","text":["2025/07/02 22:49:27 WARNING mlflow.models.model: `artifact_path` is deprecated. Please use `name` instead.\n"]},{"output_type":"stream","name":"stdout","text":["🏃 View run Modele_Avance_LSTM_Word2Vec-Fige at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/7d14f957398f44f98ac5993ae7c38400\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n","🏃 View run Modele_Avance_LSTM_Word2Vec-Fige at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/7d14f957398f44f98ac5993ae7c38400\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n","\n","Run MLflow ID: 7d14f957398f44f98ac5993ae7c38400\n","Accédez à l'interface MLflow pour voir les détails complets.\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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eHp6cvHiRRYtWsSyZctYvHgx3bp1AyAwMJBOnTqxcuVKDh06RN26dXOdKzo6mlWrVtGoUSPq1Klj3v79998zcuRI7O3t6d27N8HBwZw6dYqZM2eyePFitm/fTqVKlcz7nzt3joiICC5cuECjRo0YNWoUBoOBkydP8umnn/Lss8/esV7ZoUMH5s+fz5o1a3LVydasWYOzszPNmjWjffv2eerNGzduJDs7m3bt2pnrd7t27aJTp04kJyfTu3dvatWqxfHjx5kzZw4LFy5k9erVNGnSJE8MBbVZrl27RsuWLTl79iytW7emdevWREdH8+yzz9KlS5fCPG1mBdVz+vTpg6+vLytXruTixYu5Hl8w/ni8Y8cOwsPDzT/s7d27ly5duhAfH0/Xrl3p378/165d46+//qJ169YsWLCABx980HyOzMxMevbsyapVqwgODmbw4MG4ublx/vx5FixYQOvWrXP9sFdcNm7cSJcuXcjJyaF///5UrVqVQ4cOERERUeC8YMuXL6d///7mOk9YWBiRkZH8+eefLF26lHXr1tGwYcNij13cB8t21BLlCQV0D1+1apV5+N758+eVUv8M03JyclJ79+7Nc4xpiMuUKVNybb9x44bq2rWr0jRN7du3z7zdNAwpNDRURUZG5jnfpUuXzP/Pryvt559/rgA1derUPMempKSotLQ08+1Zs2bl6UqdnJysvLy8lE6nUxs3bsx1/Pvvv68A1blz53zLGBwcrC5cuGDenpWVpdq0aaMAtWPHjjzxFKXCDt8zGAyqSZMmClD16tVT06ZNU3v37s23e/v9XMv0upgxY4Y6f/680ul0auTIkeb7t23bpgA1adIklZWVddfdg8+cOaMMBkOe7W+++aYC1Lx583JtDw8PV3Z2diouLi7X9vT0dOXp6al8fX1zdbsvztft7QwaNEgB6vfffzdv+/bbbxWgtm3bpgwGg/Lx8VEDBgww35+YmKhsbGyUt7e3+TGZO3euAlSDBg1UcnKyed+UlBTVqFEjBaiff/4517VN7/snnngizxCEc+fOKb1erzw9PXMN3c3JyVH9+/e/qyEl169fVxUrVlSapqmjR4/mus80pNPFxSVX3EopdeXKFaXX65W3t7dKT09XSv3zHu7Xr1+u97ZS/7wGb/0siI2NVW5ubkqv1+c7tLCwz5NS/7xG+vTpoyZMmJDnzzQE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qe50v3WskvLNN9/kqcOZHD9+3DwUqjjqOpMmTWLBggWsWLHCnPy6F5UrV+bUqVO5EgtKKSZOnHjbz/onn3wSnU7H7NmzmT17NkC+PdGef/559Ho9Y8eOzTO3DxiHOt6aHGjUqBEtW7Zk//79TJkyJc/+cXFxpKenF7p8prrO+PHjgdw9wgGqV6+Ov78/c+bM4cSJE4SFheWqe7dq1Yrq1auzefNm5s+fn+vY+fPns2nTJsLDw/Od0yg/er2exx57jOTk5DzzGe3evZuff/453+P2799vrpMtXLiQHj16FOp6kLtX+A8//IBer8/zXPXp04eqVavy5Zdf8vfff+d7nm3btpnrejY2NowePZobN27w7LPP5hnimZmZmavnY3Fp1aoVVatWZd26dXl+CPz222/zfc0NGzYMDw8P3n77bXbu3JnnfoPBcNvkoCgdZE4pUSpNmzaNU6dO8dZbb/HTTz/RunVrKlasyOXLlzl27Bi7du3il19+MU+q3aVLF958800mTZpEzZo16du3L8HBwVy5coXNmzfTvHlzfvjhhwKv99NPPzF9+nRat25N1apV8fT05MyZMyxevBh7e/s7jpN2cXHh+++/Z+DAgbRr146BAwdSqVIl9uzZw8qVK/Hz82P69OlF+AgVrffff7/Ax2fMmDHodDr+85//8Oqrr9KqVSvq1KmDq6srV69eZe3atZw9exZfX18+/vjjYomvS5cu932OXr16ERYWxieffMKhQ4do0KABFy9eZMmSJfTo0YOLFy8WeOyQIUOYOXMm//vf/8y381PSr9tbVaxY0dwDCPKfxNNUeTt06FC++wwePJiFCxfy22+/Ubt2bfr27Yumafz111+cO3eORx55hMcee6xQ8YCxcvz+++/z8ssv06BBAx555BHc3d1ZsWIFiYmJPPDAAxw8eDDXMe+88w4zZ87E0dGR+vXr8/777+c5b/369enbt2++1xw5ciTz5s0zV4rzGwYxfPhw9uzZw1dffUXVqlXp2rUrlSpVIj4+nnPnzrFx40aGDRvGN998A0CFChWYO3cuDz30EBEREXTv3p0HHniApKQkDh48yKVLl0pkCNyTTz7JvHnzWL58OXXq1KF3795kZWXxxx9/0KRJE06cOJEnETl+/HgOHDjAN998w+LFi+nQoQOBgYFcvXqVU6dOsWXLFiZPniyTfwphBW433O2rr77ilVdeYdmyZSxcuJB69erx4IMPkpaWxu+//87Vq1d57bXXcjXW+/Xrh4uLC82bN6dy5coopdi0aRO7du2iUaNG5jkL77eOVRSOHz9eYPkrVarEO++8w/Llyxk1ahSVK1emVatWBAcHk5GRwalTp1ixYgVZWVmMGTOGJk2aFHl8lSpVKpIfLseOHcuzzz5LgwYNGDBgAHq9ni1btnD06FF69erF4sWL8z0uODiYiIgI1qxZg62tLXXr1s13XqsaNWrw/fffM3z4cGrXrk23bt0IDw8nKyuLixcvsmnTJnx8fDh+/Lj5mDlz5tC+fXvGjRvHH3/8Qfv27VFKcerUKVauXMnx48fNPxzeSceOHfnmm284dOgQ3t7eueb2NImIiGDu3Lnm/W+laRo//vgjnTt35pFHHqFPnz7UqFGDEydO8Ndff+Hq6srs2bPvalL29957jzVr1jB16lR2795N69atiY6O5tdff+XBBx9k0aJFufZPSEigY8eOxMfH07FjR7Zt22aerPtWL774Yr7zzlavXp22bduafyQbMGBAnrmW9Ho9f/75J127dqVHjx60bNmS+vXr4+TkxKVLl9i1axdnz54lOjranBSeMGECO3bsYPHixYSHh9OzZ09cXV25dOkSK1eu5MMPPyz2IbM6nY6ZM2fSrVs3evfuzYABA6hatSoHDx5k1apVdO/enWXLluV6fry9vZk/fz79+vWjefPmdOzYkdq1a6NpGpcuXWLbtm13nfwUFnB3i/UJUTAKueSwUv8sr3rrkp7/lpGRob744gvVokUL5ebmpuzs7FRwcLDq0KGD+vTTT9W1a9fyHLN06VLVtWtX5enpqezs7FRQUJDq27evWrNmjXmf/JYg3b59u3r22WfVAw88oDw9PZWDg4OqWrWqGjp0qDp06FCua8yaNavA5Xl37typ+vbtqypUqKD0er0KDg5Wzz77bL7Lq5qWiTUtAX+r/GIsDqZl52/3t2DBApWenq4WLFigRo0apRo0aKB8fX2Vra2tcnNzUw0bNlRvvPGGunr1aqGudbvn3PS6mDFjxh1jz8rKUoAKCQkpdHkvXryoBg8erAICApSDg4OqVauWmjJlivlct1vGOSwsTAHKy8tLZWRkFLhfcb1uC2PMmDHm5+3fr1uTwMBABahatWrle39OTo768ssvVaNGjZSjo6NydHRU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\n"},"metadata":{}}],"source":["# Entraîner le modèle LSTM avec Word2Vec\n","model_lstm_word2vec, history_lstm_word2vec, metrics_lstm_word2vec, run_id_lstm_word2vec = train_word2vec_lstm_model(epochs=50)"]},{"cell_type":"markdown","metadata":{"id":"CD8guTB_NwMx"},"source":["## Chargement du modèle entraîné\n","\n","Dans cette fonction, nous créons un mécanisme pour charger un **modèle complet** avec tous ses composants associés. Nous récupérons l'ensemble des artefacts nécessaires pour faire fonctionner notre modèle d'analyse de sentiment à partir d'un emplacement spécifique.\n","\n","- Nous chargeons d'abord le **modèle Keras entraîné** à partir du fichier .keras sauvegardé\n","- Nous récupérons le **tokenizer** qui convertit le texte brut en séquences numériques\n","- Nous importons la **fonction de prétraitement** qui nettoie les tweets avant l'analyse\n","- Nous lisons les **paramètres du modèle** à partir d'un fichier JSON\n","- Nous retournons tous ces éléments dans un dictionnaire cohérent, prêt à être utilisé pour prédire le sentiment de nouveaux tweets"]},{"cell_type":"code","execution_count":32,"metadata":{"id":"9nXo7O_XNwMx","executionInfo":{"status":"ok","timestamp":1751496603624,"user_tz":-120,"elapsed":1,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["# Fonction pour charger un modèle complet avec tous ses artefacts\n","def load_complete_model(model_name, vectorizer_name):\n"," \"\"\"\n"," Charge un modèle complet avec son tokenizer et sa fonction de prétraitement.\n"," \"\"\"\n"," model_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}\"\n","\n"," # Charger le modèle\n"," model_path = f\"{model_dir}/final_model_{model_name}_{vectorizer_name}.keras\"\n"," model = tf.keras.models.load_model(model_path)\n","\n"," # Charger le tokenizer\n"," tokenizer_path = f\"{model_dir}/tokenizer.pickle\"\n"," with open(tokenizer_path, 'rb') as handle:\n"," tokenizer = pickle.load(handle)\n","\n"," # Charger la fonction de prétraitement\n"," preprocess_path = f\"{model_dir}/preprocess_function.dill\"\n"," with open(preprocess_path, 'rb') as handle:\n"," preprocess_function = dill.load(handle)\n","\n"," # Charger les paramètres\n"," params_path = f\"{model_dir}/parameters.json\"\n"," with open(params_path, 'r') as f:\n"," params = json.load(f)\n","\n"," return {\n"," \"model\": model,\n"," \"tokenizer\": tokenizer,\n"," \"preprocess\": preprocess_function,\n"," \"params\": params\n"," }"]},{"cell_type":"markdown","metadata":{"id":"P7Ge212GNwMx"},"source":["## Prédire avec le modèle entraîné\n","\n","Dans cette fonction, nous mettons en œuvre le cœur de notre système d'analyse de sentiment, permettant de prédire si un tweet exprime un sentiment positif ou négatif. Nous utilisons l'ensemble des composants précédemment chargés pour traiter le texte et générer une prédiction fiable.\n","\n","- **Prétraitement du texte** : Application des transformations de nettoyage sur le tweet brut\n","- **Tokenisation** : Conversion du texte prétraité en séquences numériques\n","- **Padding** : Ajustement des séquences à une longueur uniforme\n","- **Prédiction** : Calcul de la probabilité de sentiment par le modèle LSTM\n","- **Interprétation** : Classification du tweet comme positif ou négatif selon le seuil de 0.5\n","- **Évaluation de confiance** : Détermination du niveau de certitude de la prédiction\n","- **Formatage des résultats** : Présentation des résultats sous forme de dictionnaire structuré"]},{"cell_type":"code","execution_count":33,"metadata":{"id":"LpuAgS8_NwMx","executionInfo":{"status":"ok","timestamp":1751496603626,"user_tz":-120,"elapsed":0,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["# Fonction pour prédire le sentiment avec un modèle chargé\n","def predict_sentiment(text, model_pack):\n"," \"\"\"\n"," Prédit le sentiment d'un texte en utilisant un modèle chargé.\n"," \"\"\"\n"," model = model_pack[\"model\"]\n"," tokenizer = model_pack[\"tokenizer\"]\n"," preprocess = model_pack[\"preprocess\"]\n"," params = model_pack[\"params\"]\n","\n"," # Prétraiter le texte\n"," preprocessed_text = preprocess(text)\n","\n"," # Tokeniser et encoder le texte\n"," tokens = tokenizer.texts_to_sequences([preprocessed_text])\n"," max_length = params.get(\"max_sequence_length\", MAX_SEQUENCE_LENGTH)\n"," padded_tokens = pad_sequences(tokens, maxlen=max_length, padding='post', truncating='post')\n","\n"," # Prédire le sentiment\n"," prediction = model.predict(padded_tokens)[0][0]\n","\n"," # Interpréter la prédiction\n"," sentiment = \"Positif\" if prediction >= 0.5 else \"Négatif\"\n"," confidence = prediction if prediction >= 0.5 else 1 - prediction\n","\n"," return {\n"," 'sentiment': sentiment,\n"," 'confidence': float(confidence),\n"," 'raw_score': float(prediction)\n"," }"]},{"cell_type":"code","execution_count":34,"metadata":{"id":"eWAj3vceNwMx","executionInfo":{"status":"ok","timestamp":1751496603633,"user_tz":-120,"elapsed":1,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["# Liste améliorée de tweets pour tester le modèle\n","test_tweets_improved = [\n"," # Tweets positifs avec différentes caractéristiques\n"," \"I absolutely love flying with @AirParadis! Their service is amazing and their staff is so helpful :) #bestairline #travel\",\n"," \"Just landed after a wonderful flight... The crew was totally awesome and the food was perfect!!! Can't wait to fly with them again :D\",\n"," \"OMG! You really have to try @AirParadis. Best. Flight. Ever. Their new seats are extremely comfortable. http://airparadis.com/newseats #travel #comfort\",\n"," \"We had a very pleasant experience with our flight today. The staff completely exceeded our expectations ;) #happy #AirParadis\",\n"," \"My first time flying business class and I'm absolutely amazed!!! The service is 100% worth it... @AirParadis never disappoints :)\",\n","\n"," # Tweets négatifs avec différentes caractéristiques\n"," \"I hate how @AirParadis always delays their flights... This is the third time this month!!! :( #disappointed #travel\",\n"," \"The worst flight experience of my life? Definitely today with @AirParadis. Their customer service won't even respond to my complaints... #terrible\",\n"," \"Really @AirParadis??? Flight cancelled and no compensation??? That's how you treat your customers? SMH :(\",\n"," \"Our baggage was lost and nobody at @AirParadis seems to care! Don't they understand that we can't enjoy our vacation without our stuff??? http://badservice.com/complaint :-(\",\n"," \"Food was terrible, seats were uncomfortable, and the staff was not helpful at all... Never flying with @AirParadis again! #worstairline\",\n","\n"," # Tweets mixtes et nuancés\n"," \"The flight was good but the food wasn't really what I expected... @AirParadis can do better! #mixedfeelings\",\n"," \"IDK what to think about my @AirParadis experience? The crew was nice but the flight was delayed for 2 hours... #confused\",\n"," \"My husband loved the flight but I didn't... Too bad they can't make everyone happy :-) #AirParadis\",\n"," \"TBH, @AirParadis has improved their service since last year! Not perfect yet, but they're trying... #progress\",\n"," \"We were so excited for our trip but then our flight got delayed... at least the staff was very apologetic and gave us free drinks! @AirParadis\",\n","\n"," # Tweets spécifiquement pour tester les caractéristiques spéciales\n"," \"This is a tweet with many!!! exclamation!!! marks!!! to test how they affect sentiment analysis :)\",\n"," \"How does the model handle multiple??? question??? marks??? in a single tweet? @AirParadis\",\n"," \"Testing ellipses... many... many... ellipses... in... one... tweet... @AirParadis #test\",\n"," \"#many #hashtags #in #one #tweet #to #see #how #they #affect #the #analysis #AirParadis\",\n"," \"@mention1 @mention2 @mention3 @mention4 @mention5 multiple mentions in one tweet\",\n"," \"Multiple URLs in one tweet: http://example1.com http://example2.com http://example3.com @AirParadis\",\n"," \"Let's try all emoticons :) :( :D ;) :-) :-( :-D ;-) in a single tweet to see the impact\"\n","]"]},{"cell_type":"code","execution_count":35,"metadata":{"id":"hRAWxNusNwMy","outputId":"cfe96035-b1a6-4d74-8b7c-1b5584097888","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496612031,"user_tz":-120,"elapsed":8397,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2s/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 41ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 40ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 40ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 42ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 46ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 44ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 45ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 42ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 41ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 41ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 42ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 42ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 44ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 46ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step\n","\n","Test du modèle sur les exemples:\n","==================================================\n","Résumé: 22 tweets analysés\n","Tweets positifs: 12 (54.5%)\n","Tweets négatifs: 10 (45.5%)\n"]}],"source":["def test_model_on_examples(model_pack, test_tweets):\n"," \"\"\"\n"," Teste le modèle sur une liste de tweets et retourne un DataFrame avec les résultats des prédictions.\n"," \"\"\"\n"," results = {\n"," \"Positif\": 0,\n"," \"Négatif\": 0\n"," }\n","\n"," # Créer un DataFrame pour stocker les résultats\n"," predictions_data = []\n","\n"," for i, tweet in enumerate(test_tweets):\n"," # Utiliser la fonction predict_sentiment avec model_pack\n"," result = predict_sentiment(tweet, model_pack)\n","\n"," # Ajouter l'emoji approprié pour le sentiment\n"," emoji = \"💚\" if result['sentiment'] == \"Positif\" else \"❌\"\n","\n"," # Ajouter les données au DataFrame\n"," predictions_data.append({\n"," \"Tweet\": tweet,\n"," \"Sentiment\": result['sentiment'],\n"," \"Emoji\": emoji,\n"," \"Score de confiance\": result['confidence'],\n"," \"Score brut\": result['raw_score'],\n"," \"Index\": i+1\n"," })\n","\n"," # Comptage des résultats\n"," results[result['sentiment']] += 1\n","\n"," # Créer le DataFrame\n"," df_predictions = pd.DataFrame(predictions_data)\n","\n"," # Afficher un résumé\n"," print(\"\\nTest du modèle sur les exemples:\")\n"," print(\"=\"*50)\n"," print(f\"Résumé: {len(test_tweets)} tweets analysés\")\n"," print(f\"Tweets positifs: {results['Positif']} ({(results['Positif']/len(test_tweets)*100):.1f}%)\")\n"," print(f\"Tweets négatifs: {results['Négatif']} ({(results['Négatif']/len(test_tweets)*100):.1f}%)\")\n","\n"," # Retourner le DataFrame\n"," return df_predictions\n","\n","# Exemple d'utilisation:\n","# Charger le model_pack (qui contient model, tokenizer, preprocess, params)\n","lstm_word2vec_model_pack = load_complete_model(\"LSTM\", \"Word2Vec-Fige\")\n","\n","# Obtenir le DataFrame des prédictions\n","df_results_word2vec = test_model_on_examples(lstm_word2vec_model_pack, test_tweets_improved)\n","\n","# Optionnel: sauvegarder les résultats dans un fichier CSV\n","df_results_word2vec.to_csv(\"content/advanced-model/LSTM_Word2Vec-Fige/predictions_results.csv\", index=False)"]},{"cell_type":"code","execution_count":36,"metadata":{"id":"aCXO6s63NwMy","outputId":"4d46c29d-7c31-4106-8814-e67d898ebf8a","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1751496612076,"user_tz":-120,"elapsed":44,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" Tweet Sentiment Emoji \\\n","0 I absolutely love flying with @AirParadis! The... Positif 💚 \n","1 Just landed after a wonderful flight... The cr... Positif 💚 \n","2 OMG! You really have to try @AirParadis. Best.... Positif 💚 \n","3 We had a very pleasant experience with our fli... Positif 💚 \n","4 My first time flying business class and I'm ab... Négatif ❌ \n","5 I hate how @AirParadis always delays their fli... Négatif ❌ \n","6 The worst flight experience of my life? Defini... Négatif ❌ \n","7 Really @AirParadis??? Flight cancelled and no ... Négatif ❌ \n","8 Our baggage was lost and nobody at @AirParadis... Négatif ❌ \n","9 Food was terrible, seats were uncomfortable, a... Négatif ❌ \n","10 The flight was good but the food wasn't really... Positif 💚 \n","11 IDK what to think about my @AirParadis experie... Négatif ❌ \n","12 My husband loved the flight but I didn't... To... Négatif ❌ \n","13 TBH, @AirParadis has improved their service si... Négatif ❌ \n","14 We were so excited for our trip but then our f... Négatif ❌ \n","15 This is a tweet with many!!! exclamation!!! ma... Positif 💚 \n","16 How does the model handle multiple??? question... Positif 💚 \n","17 Testing ellipses... many... many... ellipses..... Positif 💚 \n","18 #many #hashtags #in #one #tweet #to #see #how ... Positif 💚 \n","19 @mention1 @mention2 @mention3 @mention4 @menti... Positif 💚 \n","20 Multiple URLs in one tweet: http://example1.co... Positif 💚 \n","21 Let's try all emoticons :) :( :D ;) :-) :-( :-... Positif 💚 \n","\n"," Score de confiance Score brut Index \n","0 0.996094 0.996094 1 \n","1 0.978027 0.978027 2 \n","2 0.976074 0.976074 3 \n","3 0.964355 0.964355 4 \n","4 0.592285 0.407715 5 \n","5 0.970749 0.029251 6 \n","6 0.948334 0.051666 7 \n","7 0.734863 0.265137 8 \n","8 0.880798 0.119202 9 \n","9 0.881836 0.118164 10 \n","10 0.898438 0.898438 11 \n","11 0.837891 0.162109 12 \n","12 0.682373 0.317627 13 \n","13 0.636963 0.363037 14 \n","14 0.645508 0.354492 15 \n","15 0.502930 0.502930 16 \n","16 0.640625 0.640625 17 \n","17 0.640137 0.640137 18 \n","18 0.625977 0.625977 19 \n","19 0.900391 0.900391 20 \n","20 0.987305 0.987305 21 \n","21 0.829102 0.829102 22 "],"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
TweetSentimentEmojiScore de confianceScore brutIndex
0I absolutely love flying with @AirParadis! The...Positif💚0.9960940.9960941
1Just landed after a wonderful flight... The cr...Positif💚0.9780270.9780272
2OMG! You really have to try @AirParadis. Best....Positif💚0.9760740.9760743
3We had a very pleasant experience with our fli...Positif💚0.9643550.9643554
4My first time flying business class and I'm ab...Négatif❌0.5922850.4077155
5I hate how @AirParadis always delays their fli...Négatif❌0.9707490.0292516
6The worst flight experience of my life? Defini...Négatif❌0.9483340.0516667
7Really @AirParadis??? Flight cancelled and no ...Négatif❌0.7348630.2651378
8Our baggage was lost and nobody at @AirParadis...Négatif❌0.8807980.1192029
9Food was terrible, seats were uncomfortable, a...Négatif❌0.8818360.11816410
10The flight was good but the food wasn't really...Positif💚0.8984380.89843811
11IDK what to think about my @AirParadis experie...Négatif❌0.8378910.16210912
12My husband loved the flight but I didn't... To...Négatif❌0.6823730.31762713
13TBH, @AirParadis has improved their service si...Négatif❌0.6369630.36303714
14We were so excited for our trip but then our f...Négatif❌0.6455080.35449215
15This is a tweet with many!!! exclamation!!! ma...Positif💚0.5029300.50293016
16How does the model handle multiple??? question...Positif💚0.6406250.64062517
17Testing ellipses... many... many... ellipses.....Positif💚0.6401370.64013718
18#many #hashtags #in #one #tweet #to #see #how ...Positif💚0.6259770.62597719
19@mention1 @mention2 @mention3 @mention4 @menti...Positif💚0.9003910.90039120
20Multiple URLs in one tweet: http://example1.co...Positif💚0.9873050.98730521
21Let's try all emoticons :) :( :D ;) :-) :-( :-...Positif💚0.8291020.82910222
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n"," \n"," \n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"df_results_word2vec","summary":"{\n \"name\": \"df_results_word2vec\",\n \"rows\": 22,\n \"fields\": [\n {\n \"column\": \"Tweet\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 22,\n \"samples\": [\n \"I absolutely love flying with @AirParadis! Their service is amazing and their staff is so helpful :) #bestairline #travel\",\n \"TBH, @AirParadis has improved their service since last year! Not perfect yet, but they're trying... #progress\",\n \"Our baggage was lost and nobody at @AirParadis seems to care! Don't they understand that we can't enjoy our vacation without our stuff??? http://badservice.com/complaint :-(\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Sentiment\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"N\\u00e9gatif\",\n \"Positif\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Emoji\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"\\u274c\",\n \"\\ud83d\\udc9a\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Score de confiance\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.1588360225953438,\n \"min\": 0.5029296875,\n \"max\": 0.99609375,\n \"num_unique_values\": 22,\n \"samples\": [\n 0.99609375,\n 0.636962890625\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Score brut\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.3480322076431303,\n \"min\": 0.0292510986328125,\n \"max\": 0.99609375,\n \"num_unique_values\": 22,\n \"samples\": [\n 0.99609375,\n 0.363037109375\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Index\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 6,\n \"min\": 1,\n \"max\": 22,\n \"num_unique_values\": 22,\n \"samples\": [\n 1,\n 14\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":36}],"source":["df_results_word2vec"]},{"cell_type":"markdown","metadata":{"id":"Yk_yH3-INwMy"},"source":["## Entrainement : LSTM avec GloVe 300d"]},{"cell_type":"markdown","metadata":{"id":"E-yiOEKYNwMy"},"source":["### Chargement et préparation des embeddings pré-entraînés GloVe"]},{"cell_type":"code","source":["import os\n","import requests\n","from tqdm import tqdm\n","from zipfile import ZipFile\n","\n","# Télécharger et préparer les embeddings GloVe\n","def download_glove_embeddings(url=\"https://nlp.stanford.edu/data/glove.6B.zip\",\n"," output_dir=\"content/pretrained-embeddings/glove.6B\"):\n"," \"\"\"\n"," Télécharge et extrait les embeddings GloVe si nécessaire.\n"," Inclut une barre de progression et vérifie si les fichiers existent déjà.\n"," \"\"\"\n"," # Check if directory already exists\n"," if os.path.exists(output_dir) and os.listdir(output_dir):\n"," print(f\"Le dossier {output_dir} existe déjà. Téléchargement ignoré.\")\n"," return\n","\n"," # Create directory if it doesn't exist\n"," os.makedirs(output_dir, exist_ok=True)\n","\n"," # Temporary zip file path\n"," zip_path = \"glove.6B.zip\"\n","\n"," # Download the file with progress bar\n"," print(\"Téléchargement du fichier...\")\n"," # Add verify=False to ignore SSL certificate issues\n"," response = requests.get(url, stream=True, verify=False)\n"," total_size = int(response.headers.get('content-length', 0))\n","\n"," with open(zip_path, 'wb') as f, tqdm(\n"," desc=\"Téléchargement\",\n"," total=total_size,\n"," unit='B',\n"," unit_scale=True,\n"," unit_divisor=1024,\n"," ) as bar:\n"," for data in response.iter_content(chunk_size=1024):\n"," size = f.write(data)\n"," bar.update(size)\n","\n"," # Extract with progress bar\n"," print(\"Extraction des fichiers...\")\n"," with ZipFile(zip_path, 'r') as zip_ref:\n"," for file in tqdm(zip_ref.namelist(), desc=\"Extraction\"):\n"," zip_ref.extract(file, output_dir)\n","\n"," # Remove the zip file\n"," os.remove(zip_path)\n"," print(\"Terminé!\")\n","\n","# Exécuter la fonction\n","download_glove_embeddings()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9y9NubYo_DLG","executionInfo":{"status":"ok","timestamp":1751496612097,"user_tz":-120,"elapsed":20,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"c51f3876-4a60-4db7-fe3a-32c35716adbc"},"execution_count":37,"outputs":[{"output_type":"stream","name":"stdout","text":["Le dossier content/pretrained-embeddings/glove.6B existe déjà. Téléchargement ignoré.\n"]}]},{"cell_type":"code","execution_count":38,"metadata":{"id":"vk_8gucuNwMy","executionInfo":{"status":"ok","timestamp":1751496612106,"user_tz":-120,"elapsed":8,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def load_glove_embeddings(embedding_dim=100):\n"," \"\"\"\n"," Charge les embeddings GloVe pré-entraînés.\n"," \"\"\"\n"," print(f\"Chargement des embeddings GloVe {embedding_dim}d...\")\n"," embeddings_index = {}\n","\n"," with open(f'content/pretrained-embeddings/glove.6B/glove.6B.{embedding_dim}d.txt', encoding='utf-8') as f:\n"," for line in f:\n"," values = line.rstrip().split(' ')\n"," word = values[0]\n"," coefs = np.asarray(values[1:], dtype='float32')\n"," embeddings_index[word] = coefs\n","\n"," print(f\"Trouvé {len(embeddings_index)} vecteurs d'embeddings GloVe.\")\n"," return embeddings_index"]},{"cell_type":"code","execution_count":39,"metadata":{"id":"AegR2uCfNwMy","outputId":"99828bd8-c009-4031-b897-977375ce8dff","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751496642102,"user_tz":-120,"elapsed":29995,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Chargement des embeddings GloVe 300d...\n","Trouvé 400000 vecteurs d'embeddings GloVe.\n","Création de la matrice d'embedding pour 52691 mots...\n"]},{"output_type":"stream","name":"stderr","text":["Création matrice d'embedding: 100%|██████████| 52691/52691 [00:00<00:00, 416562.19it/s]"]},{"output_type":"stream","name":"stdout","text":["Trouvé 27333 mots (51.87%) dans les embeddings pré-entraînés.\n"]},{"output_type":"stream","name":"stderr","text":["\n"]}],"source":["glove_embeddings_300d = load_glove_embeddings(embedding_dim=300)\n","glove_matrix_300d = create_embedding_matrix(tokenizer.word_index, glove_embeddings_300d, 300)"]},{"cell_type":"code","execution_count":42,"metadata":{"id":"gPwavY_xNwMy","executionInfo":{"status":"ok","timestamp":1751497088732,"user_tz":-120,"elapsed":5,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def train_glove_lstm_model(epochs=20):\n"," \"\"\"\n"," Entraîne un modèle LSTM avec embeddings GloVe 300d en utilisant les optimisations GPU\n"," et le chargement de données optimisé.\n"," \"\"\"\n"," # Définir le nom du modèle et de la méthode d'embedding\n"," model_name = \"LSTM\"\n"," vectorizer_name = \"GloVe-300d-Fige\"\n","\n"," # Créer les callbacks pour ce modèle\n"," checkpoint_callback = create_model_checkpoint(model_name, vectorizer_name)\n","\n"," # Autres callbacks\n"," early_stopping = tf.keras.callbacks.EarlyStopping(\n"," monitor='val_loss',\n"," patience=5,\n"," restore_best_weights=True\n"," )\n","\n"," reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(\n"," monitor='val_loss',\n"," factor=0.2,\n"," patience=2,\n"," min_lr=0.00001\n"," )\n","\n"," # TensorBoard pour visualiser l'entraînement\n"," tensorboard_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}/logs\"\n"," os.makedirs(tensorboard_dir, exist_ok=True)\n"," tensorboard_callback = tf.keras.callbacks.TensorBoard(\n"," log_dir=tensorboard_dir,\n"," histogram_freq=1,\n"," update_freq='epoch'\n"," )\n","\n"," # Créer le modèle optimisé pour GPU\n"," model = create_optimized_lstm_model(glove_matrix_300d, trainable=False)\n","\n"," print(f\"Entraînement du modèle {model_name} avec embeddings {vectorizer_name}\")\n"," print(f\"Taille du batch: {BATCH_SIZE}\")\n"," print(f\"Utilisation de la précision mixte: {tf.keras.mixed_precision.global_policy().name}\")\n","\n"," # Entraîner le modèle avec les datasets optimisés\n"," history = model.fit(\n"," train_dataset,\n"," epochs=epochs,\n"," validation_data=val_dataset,\n"," callbacks=[early_stopping, reduce_lr, tensorboard_callback, checkpoint_callback],\n"," verbose=1\n"," )\n","\n"," # Déterminer le nombre réel d'époques complétées (en cas d'early stopping)\n"," real_epochs = len(history.history['loss'])\n"," print(f\"Nombre réel d'époques effectuées: {real_epochs}/{epochs}\")\n","\n"," # Sauvegarder tous les artefacts\n"," model_dir = save_model_artifacts(model, model_name, vectorizer_name, history, tokenizer)\n","\n"," # Utiliser evaluate_model pour obtenir les métriques\n"," metrics, cm, report, y_pred, y_pred_proba = evaluate_model(\n"," model,\n"," X_test_pad,\n"," y_test\n"," )\n","\n"," # Afficher les métriques\n"," print(\"\\nMétriques pour le modèle LSTM avec embedding GloVe 300d:\")\n"," for key, value in metrics.items():\n"," print(f\"{key}: {value:.4f}\")\n","\n"," print(\"\\nRapport de classification:\")\n"," print(report)\n","\n"," # Enregistrer avec MLflow\n"," params = {\n"," 'model_type': model_name,\n"," 'embedding_type': vectorizer_name,\n"," 'embedding_dim': 300,\n"," 'vocab_size': len(tokenizer.word_index) + 1,\n"," 'max_sequence_length': MAX_SEQUENCE_LENGTH,\n"," 'trainable_embedding': False,\n"," 'max_epochs': epochs,\n"," 'real_epochs': real_epochs,\n"," 'batch_size': BATCH_SIZE,\n"," 'precision_policy': tf.keras.mixed_precision.global_policy().name,\n"," 'gpu_optimization': 'XLA,dynamic_memory,prefetch'\n"," }\n","\n"," # Enregistrer dans MLflow\n"," run_id = log_model_to_mlflow(model, model_name, vectorizer_name, metrics, cm, report, X_test_pad, y_test, history, params)\n","\n"," # Visualiser la courbe d'apprentissage\n"," plot_training_history(history, \"LSTM\", \"GloVe-300d-Fige\", run_id=run_id)\n","\n"," # Récupérer le lien vers le run MLflow\n"," print(f\"\\nRun MLflow ID: {run_id}\")\n"," print(f\"Accédez à l'interface MLflow pour voir les détails complets.\")\n","\n"," return model, history, metrics, run_id"]},{"cell_type":"code","execution_count":43,"metadata":{"id":"HwGyTzEwNwMy","outputId":"405b8702-0756-4141-d394-f084c2d65123","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1751497320999,"user_tz":-120,"elapsed":231771,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Entraînement du modèle LSTM avec embeddings GloVe-300d-Fige\n","Taille du batch: 256\n","Utilisation de la précision mixte: mixed_float16\n","Epoch 1/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step - loss: 0.6039 - precision: 0.6736 - recall: 0.6449\n","Epoch 1: val_precision improved from -inf to 0.73325, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m25s\u001b[0m 54ms/step - loss: 0.6038 - precision: 0.6737 - recall: 0.6450 - val_loss: 0.5302 - val_precision: 0.7333 - val_recall: 0.7406 - learning_rate: 0.0010\n","Epoch 2/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 32ms/step - loss: 0.5362 - precision: 0.7289 - recall: 0.7212\n","Epoch 2: val_precision improved from 0.73325 to 0.76015, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 53ms/step - loss: 0.5362 - precision: 0.7289 - recall: 0.7213 - val_loss: 0.5044 - val_precision: 0.7602 - val_recall: 0.7416 - learning_rate: 0.0010\n","Epoch 3/50\n","\u001b[1m280/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 21ms/step - loss: 0.5055 - precision: 0.7487 - recall: 0.7561\n","Epoch 3: val_precision improved from 0.76015 to 0.77210, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m11s\u001b[0m 38ms/step - loss: 0.5055 - precision: 0.7488 - recall: 0.7561 - val_loss: 0.4870 - val_precision: 0.7721 - val_recall: 0.7586 - learning_rate: 0.0010\n","Epoch 4/50\n","\u001b[1m280/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4890 - precision: 0.7655 - recall: 0.7576\n","Epoch 4: val_precision improved from 0.77210 to 0.77764, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 37ms/step - loss: 0.4890 - precision: 0.7656 - recall: 0.7576 - val_loss: 0.4843 - val_precision: 0.7776 - val_recall: 0.7564 - learning_rate: 0.0010\n","Epoch 5/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4748 - precision: 0.7740 - recall: 0.7657\n","Epoch 5: val_precision improved from 0.77764 to 0.78753, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m11s\u001b[0m 40ms/step - loss: 0.4748 - precision: 0.7740 - recall: 0.7657 - val_loss: 0.4748 - val_precision: 0.7875 - val_recall: 0.7552 - learning_rate: 0.0010\n","Epoch 6/50\n","\u001b[1m280/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4660 - precision: 0.7758 - recall: 0.7770\n","Epoch 6: val_precision did not improve from 0.78753\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 31ms/step - loss: 0.4659 - precision: 0.7759 - recall: 0.7770 - val_loss: 0.4724 - val_precision: 0.7488 - val_recall: 0.8317 - learning_rate: 0.0010\n","Epoch 7/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 21ms/step - loss: 0.4546 - precision: 0.7824 - recall: 0.7864\n","Epoch 7: val_precision improved from 0.78753 to 0.79185, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 36ms/step - loss: 0.4546 - precision: 0.7824 - recall: 0.7864 - val_loss: 0.4711 - val_precision: 0.7918 - val_recall: 0.7554 - learning_rate: 0.0010\n","Epoch 8/50\n","\u001b[1m279/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4490 - precision: 0.7886 - recall: 0.7867\n","Epoch 8: val_precision improved from 0.79185 to 0.80420, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m20s\u001b[0m 35ms/step - loss: 0.4489 - precision: 0.7887 - recall: 0.7868 - val_loss: 0.4769 - val_precision: 0.8042 - val_recall: 0.7347 - learning_rate: 0.0010\n","Epoch 9/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4408 - precision: 0.7946 - recall: 0.7937\n","Epoch 9: val_precision did not improve from 0.80420\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 30ms/step - loss: 0.4408 - precision: 0.7946 - recall: 0.7937 - val_loss: 0.4705 - val_precision: 0.7761 - val_recall: 0.7889 - learning_rate: 0.0010\n","Epoch 10/50\n","\u001b[1m280/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 22ms/step - loss: 0.4307 - precision: 0.7956 - recall: 0.8007\n","Epoch 10: val_precision did not improve from 0.80420\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 35ms/step - loss: 0.4307 - precision: 0.7956 - recall: 0.8007 - val_loss: 0.4700 - val_precision: 0.7622 - val_recall: 0.8157 - learning_rate: 0.0010\n","Epoch 11/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4223 - precision: 0.7966 - recall: 0.8106\n","Epoch 11: val_precision did not improve from 0.80420\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 34ms/step - loss: 0.4222 - precision: 0.7967 - recall: 0.8106 - val_loss: 0.4734 - val_precision: 0.7821 - val_recall: 0.7923 - learning_rate: 0.0010\n","Epoch 12/50\n","\u001b[1m279/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4134 - precision: 0.8022 - recall: 0.8173\n","Epoch 12: val_precision did not improve from 0.80420\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 30ms/step - loss: 0.4134 - precision: 0.8022 - recall: 0.8172 - val_loss: 0.4790 - val_precision: 0.7563 - val_recall: 0.8140 - learning_rate: 0.0010\n","Epoch 13/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.3982 - precision: 0.8057 - recall: 0.8258\n","Epoch 13: val_precision did not improve from 0.80420\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 32ms/step - loss: 0.3981 - precision: 0.8057 - recall: 0.8258 - val_loss: 0.4875 - val_precision: 0.7796 - val_recall: 0.7886 - learning_rate: 2.0000e-04\n","Epoch 14/50\n","\u001b[1m281/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.3917 - precision: 0.8169 - recall: 0.8238\n","Epoch 14: val_precision did not improve from 0.80420\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m11s\u001b[0m 34ms/step - loss: 0.3917 - precision: 0.8169 - recall: 0.8239 - val_loss: 0.4936 - val_precision: 0.7931 - val_recall: 0.7601 - learning_rate: 2.0000e-04\n","Epoch 15/50\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.3849 - precision: 0.8224 - recall: 0.8233\n","Epoch 15: val_precision did not improve from 0.80420\n","\u001b[1m282/282\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 30ms/step - loss: 0.3849 - precision: 0.8224 - recall: 0.8234 - val_loss: 0.4894 - val_precision: 0.7853 - val_recall: 0.7783 - learning_rate: 4.0000e-05\n","Nombre réel d'époques effectuées: 15/50\n","Modèle sauvegardé dans content/advanced-model/LSTM_GloVe-300d-Fige/final_model_LSTM_GloVe-300d-Fige.keras\n","Tokenizer sauvegardé dans content/advanced-model/LSTM_GloVe-300d-Fige/tokenizer.pickle\n","Fonction de prétraitement sauvegardée dans content/advanced-model/LSTM_GloVe-300d-Fige/preprocess_function.dill\n","Historique d'entraînement sauvegardé dans content/advanced-model/LSTM_GloVe-300d-Fige/training_history.pickle\n","Paramètres sauvegardés dans content/advanced-model/LSTM_GloVe-300d-Fige/parameters.json\n","\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 4ms/step\n","\n","Métriques pour le modèle LSTM avec embedding GloVe 300d:\n","accuracy: 0.7802\n","precision: 0.7587\n","recall: 0.8217\n","f1: 0.7890\n","roc_auc: 0.8659\n","\n","Rapport de classification:\n"," precision recall f1-score support\n","\n"," Négatif 0.81 0.74 0.77 10000\n"," Positif 0.76 0.82 0.79 10000\n","\n"," accuracy 0.78 20000\n"," macro avg 0.78 0.78 0.78 20000\n","weighted avg 0.78 0.78 0.78 20000\n","\n"]},{"output_type":"stream","name":"stderr","text":["2025/07/02 23:01:25 WARNING mlflow.models.model: `artifact_path` is deprecated. Please use `name` instead.\n"]},{"output_type":"stream","name":"stdout","text":["🏃 View run Modele_Avance_LSTM_GloVe-300d-Fige at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/c083c50737c4460db033ac2872ac6d6a\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n","🏃 View run Modele_Avance_LSTM_GloVe-300d-Fige at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/c083c50737c4460db033ac2872ac6d6a\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n","\n","Run MLflow ID: c083c50737c4460db033ac2872ac6d6a\n","Accédez à l'interface MLflow pour voir les détails complets.\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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WbB27Vql1+uVk5OTmjlzpsrKysqRJiUlRc2YMUP169fPavusWbMUoGbNmnXX+c+ZM0cBqlevXnmmuX79unJ1dVUuLi4qPj7+rvPKS0pKSq7bV69erQBVq1atHPu6du2qAPXll19abR89erQC1PPPP2+1PTMzU9WqVUsB6o8//rBsz8rKUo8++qgC1H/+8598l/ns2bMKUAMHDsz3MevXr1eAateuXb6PEUKIbHm11cqCgnx+vv/++wpQXbt2VWlpaTn2x8XFqS1bttxzXoCqVKmSatq0qfLz81MZGRk50owZM0YBlnbPvXxflwaZmZmqc+fOlvq9cOFCrukOHz6sHn30UbVhwwar7UFBQffcdqxevboC1J49e/JMM27cOAWosWPH3lNeuUlLS8u1rZeenq7at2+vADVv3jyrfVu2bFGACg0NVXFxcZbtZ8+eVd7e3srR0THHfdrcuXMVoFq2bGnVztq5c6cyGo3Kx8dHJSQk5LvcAwcOVECB7gfze68iygYZvifuWqdOnahZsyZKKXbt2gXcHKa1YcMG5s6dS/PmzXFzc7OKgCcnJ/Of//yHhg0b4urqipubG/fffz+//vprnnmtXr2aXr164evri6OjI5UrV+bhhx9m7dq1ljR5zSl15swZhg0bRlhYmKV7ar169XjhhRe4evWqJd3t5mrZs2cPjz76qCX/oKAgXnzxRaKionKkvXVc9fTp06lXrx5OTk5UrFiRYcOGcf369XzWcNELDw8nISGBunXr0qlTp1zTtGzZMtdeTXeje/fuBAYGMnPmzBz7fv75Z1JTUxk6dGiBz7t+/XqGDRtG7dq18fDwwNnZmbp16/Lee++RmppqlfaFF15A0zT++OOPXM+1Y8cONE2jb9++VtuL6rrNS1ZWFsOHDyczM5Mvv/ySZ599Fp0u50e2k5MTzz33XIGG0ub3en700UcpX748y5cvJzIyMtdzzZ07l6SkJB577DE8PT0ByMzMZNq0abRo0QIPDw9cXFxo1KgRX3/9NSaTKd/lzH5+uenSpQteXl6cOnXKavvp06dZvXo1VatWZcSIEVb73nvvPVxdXfn5558tQ1LBPGz06NGjtG3b1qpHmE6n4+OPPwbg22+/zTFE8saNG7z66qsEBgbi5OREzZo1mTp1aoGfY0Hc7nNq1apVtGrVCldXV7y9venduzfHjh277VwP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APj0009JTk6+6/Nku5frvWLFijz00EPExsayePFiZs6cCZAjmGjL79Lc2jxw+zbMihUrrNIAODk50bJlS5KTk3Mtd27HZNdRbu3q69ev59rOKCoeHh6EhIQQERGR64/1ub0H7qYtL2xLglLCZnx9fXnyySfZvXs377//fq5D2E6fPm3Vi+Lll18G4LXXXsv1F5g7/SqzZ8+eXLunZkfRXVxcbnt879698fb25tdff7XqjQHmbuZnz56lc+fOOeaTKinOnj3Ll19+mWsdKaWYMmUKAG3bti30vENDQ1m5ciWLFi3KV7f+vGR3A/53IODMmTO8+eabeR6XPcdCREQEn332GQcOHOCBBx7A19fXKp09rlswd9n+9ttv0ev1vPzyy8yaNSvXxl5GRka+G2/3cj3XrVuXFi1acOTIEUuj7N9DLrPLGhUVxciRI3PtKRYVFcWRI0fyVd6rV69y5syZXPctXbqURYsW4ebmZtWbJzQ0lK5du3Lu3Dm++eYbq2MmTJhAUlISTz/9NK6urpbt7dq1o1atWmzatIk///zTst1kMlmuoRdeeMGqB+jgwYMt+299XbLfU7b08MMP4+npyZw5czhw4IDVvsmTJ+c6vPill17CYDAwevToXHuIpaenS+NNiFJoyJAhKKV44403rL7PYmNjef/99y1psq1fvz7XAM2VK1eAm+2oe21v2cq3336b4/sv27Fjx1iwYAFQNO2eyZMns2jRIlatWmUJft2NqlWrcvLkSavh/UopJk6ceNvv12eeeQadTsdPP/1k6fWcW0+0gn4/NGnShJYtW7J//34++uijHOmvXr1KamrqHZ/XU089RadOnTh+/Di9evXi0qVLuabL7TstLwW93m+V3cb59NNPWbRoERUqVKBPnz5WaQYPHoyXlxfvvfceO3fuzHEOk8lUoB+q9u7dm2s7MzExkVdeeQWABx980GrfCy+8AMCUKVOs5qzNbgc5OjoyePBgq2OGDx8OwLhx46xem127djFv3jx8fHx49NFHLdsffvhhypUrx9y5c9m9e7fVuSZOnJjnUMCi8swzz2AymXj77betPp8uXrzI559/niP93bTlhW3JnFLCpr7++mtOnjzJu+++y88//0zr1q2pWLEikZGRHD16lF27dvHrr79aJtXu2rUr48aNY/LkydSqVYvevXtTuXJlLl++zObNm2nR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MyQkRP7+Teev9ot9P3y/efT391d4eLhiY2O9XSpsRD9loaey0FNZ6KkszbWnop+y0E/V8OWeyjCb85jYB6xatUpvv/22nE6nEhISNHnyZHXu3Nnusrxm3LhxdW6/7777ml0z+X1z585VQkKC7r33XrtL8apt27Zp8eLFOn78uKKiojRq1CjddNNNdpflVWfPntWbb76pLVu2qKSkRJGRkRo4cKDuvPPOJvcX5Pd99tln+sMf/lBr+4033qgZM2bINE1lZmbqgw8+UFlZmbp27aqpU6c2uSHED+Vw1113aebMmXW+7uGHH1aPHj0aujyvudj3w/fNmDFDI0eO1KhRo7xRHnxIc++nJHqqH0JPRU/V3Hoq+ikL/VQNX+6pGEoBAAAAAADA65rHTdUAAAAAAADwKQylAAAAAAAA4HUMpQAAAAAAAOB1DKUAAAAAAADgdQylAAAAAAAA4HUMpQAAAAAAAOB1DKUAAAAAAADgdQylAAAAAAAA4HUMpQCggaxfv17jxo3TgQMH7C4FAACg0aKnApouf7sLAICfYv369frLX/5ywecfe+wxdenSxYsVAQAAND70VADswFAKQJMwbtw4RUVF1doeHR1tQzUAAACNEz0VAG9iKAWgSejdu7c6depkdxkAAACNGj0VAG9iKAWgySsqKtLMmTM1ceJEORwOZWVlqaSkRElJSZo6dao6dOjgsX9ubq4yMzN18OBB+fn5qXv37powYYLi4uI89jt58qTefPNN7dixQ6dPn1ZERISSk5M1efJk+fvX/HitrKzUa6+9po8++kjnzp1Tr169NH36dIWFhXnl/AEAAOoDPRWA+sZC5wCahLKyMpWWlnr8On36tMc+H330kVauXKlbbrlFY8aM0ZEjR/TII4/I6XS699m1a5cyMjJUUlKiu+66S6mpqdq/f7/mzJmjoqIi934nT57U7373O2VnZ6t///6aPHmyBg8erD179qiiosLj677yyiv64osvdNddd+lnP/uZtm3bpoULFzZoHgAAAD8GPRUAb+JKKQBNwqOPPlprW0BAgN544w334+PHj+uZZ55RZGSkJCk5OVnp6elasWKFJk2aJEl6/fXXFRISooyMDIWEhEiSUlJSNGvWLGVmZmrmzJmSpMWLF8vpdOrxxx/3uMR9/PjxMk3To46QkBDNnj1bhmFIkkzT1MqVK1VWVqbg4OB6TAEAAOCnoacC4E0MpQA0CVOnTlVMTIzHNofD82LQlJQUd/MkSUlJSercubNycnI0adIknTp1SocOHdJtt93mbp4kKT4+Xr169VJOTo4kyeVyaevWrerTp0+day5UN0rVbrrpJo9t3bp103vvvafi4mLFx8f/+JMGAACoZ/RUALyJoRSAJiEpKemii3J+v8Gq3rZp0yZJUnFxsSQpNja21n7t27fXzp07VV5ervLycp09e7bWugkX0qZNG4/HrVq1kiSdOXPmkl4PAADgLfRUALyJNaUAoIF9/93Fat+/JB0AAAAXRk8FND1cKQWg2Th27Fid29q2bStJ7v8WFhbW2q+wsFChoaFq2bKlAgMDFRQUpMOHDzdswQAAAD6IngpAfeFKKQDNxtatW3Xy5En34/z8fH3++edKTk6WJEVERCghIUEffvihx2Xghw8f1s6dO9W7d29J1rt0KSkp2rZtmw4cOFDr6/BuHQAAaMroqQDUF66UAtAk5OTk6OjRo7W2X3XVVe4FMaOjozVnzhzdfPPNqqysVFZWlkJDQzV69Gj3/hMnTtQTTzyh2bNna+jQoTp37pxWrVql4OBgjRs3zr3fhAkTtGvXLs2dO1fDhw9XXFycTp06pc2bN+uRRx5xr3EAAADQmNBTAfAmhlIAmoTMzMw6t993333q3r27JGnw4MFyOBx67733VFpaqqSkJE2ZMkURERHu/Xv16qX09HRlZmYqMzNTfn5+6t69u+655x5FRUW594uMjNTjjz+uJUuWaMOGDTp79qwiIyOVnJysFi1aNOzJAgAANBB6KgDeZJhcEwmgiSsqKtLMmTM1ceJE3XbbbXaXAwAA0CjRUwGob6wpBQAAAAAAAK9jKAUAAAAAAACvYygFAAAAAAAAr2NNKQAAAAAAAHgdV0oBAAAAAADA6xhKAQAAAAAAwOsYSgEAAAAAAMDrGEoBAAAAAADA6xhKAQAAAAAAwOsYSgEAAAAAAMDrGEoBAAAAAADA6xhKAQAAAAAAwOsYSgEAAAAAAMDr/j9UjuY0Nka2oAAAAABJRU5ErkJggg==\n"},"metadata":{}}],"source":["# Entraîner le modèle LSTM avec GloVe 300d\n","model_lstm_glove, history_lstm_glove, metrics_lstm_glove, run_id_lstm_glove = train_glove_lstm_model(epochs=50)"]},{"cell_type":"code","execution_count":44,"metadata":{"id":"Qq5sL0HcNwMy","executionInfo":{"status":"ok","timestamp":1751497831831,"user_tz":-120,"elapsed":1232,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["# Charger le modèle pour la prédiction\n","lstm_glove_model_pack = load_complete_model(\"LSTM\", \"GloVe-300d-Fige\")"]},{"cell_type":"code","execution_count":45,"metadata":{"id":"Kc95Dyz8NwMy","outputId":"8bd1a867-c503-4def-8a45-5d17eb174816","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751497838150,"user_tz":-120,"elapsed":6318,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Test de prédiction avec le modèle GloVe:\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 6s/step\n","{'sentiment': 'Positif', 'confidence': 0.95947265625, 'raw_score': 0.95947265625}\n"]}],"source":["# Tester le modèle sur quelques exemples\n","print(\"\\nTest de prédiction avec le modèle GloVe:\")\n","result = predict_sentiment(\"I love flying with this airline, the service is amazing!\", lstm_glove_model_pack)\n","print(result)"]},{"cell_type":"code","execution_count":46,"metadata":{"id":"gAhcxPUoNwMy","outputId":"a8de9892-563e-4f72-da62-6aa85294d640","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1751497841460,"user_tz":-120,"elapsed":3289,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 59ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 33ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 55ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 111ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 85ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 102ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 55ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 65ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 62ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 107ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 51ms/step\n","\n","Test du modèle sur les exemples:\n","==================================================\n","Résumé: 22 tweets analysés\n","Tweets positifs: 15 (68.2%)\n","Tweets négatifs: 7 (31.8%)\n","\n","Aperçu des prédictions GloVe :\n"]},{"output_type":"execute_result","data":{"text/plain":[" Tweet Sentiment Emoji \\\n","0 I absolutely love flying with @AirParadis! The... Positif 💚 \n","1 Just landed after a wonderful flight... The cr... Positif 💚 \n","2 OMG! You really have to try @AirParadis. Best.... Positif 💚 \n","3 We had a very pleasant experience with our fli... Positif 💚 \n","4 My first time flying business class and I'm ab... Positif 💚 \n","5 I hate how @AirParadis always delays their fli... Négatif ❌ \n","6 The worst flight experience of my life? Defini... Négatif ❌ \n","7 Really @AirParadis??? Flight cancelled and no ... Négatif ❌ \n","8 Our baggage was lost and nobody at @AirParadis... Négatif ❌ \n","9 Food was terrible, seats were uncomfortable, a... Négatif ❌ \n","10 The flight was good but the food wasn't really... Positif 💚 \n","11 IDK what to think about my @AirParadis experie... Négatif ❌ \n","12 My husband loved the flight but I didn't... To... Négatif ❌ \n","13 TBH, @AirParadis has improved their service si... Positif 💚 \n","14 We were so excited for our trip but then our f... Positif 💚 \n","15 This is a tweet with many!!! exclamation!!! ma... Positif 💚 \n","16 How does the model handle multiple??? question... Positif 💚 \n","17 Testing ellipses... many... many... ellipses..... Positif 💚 \n","18 #many #hashtags #in #one #tweet #to #see #how ... Positif 💚 \n","19 @mention1 @mention2 @mention3 @mention4 @menti... Positif 💚 \n","20 Multiple URLs in one tweet: http://example1.co... Positif 💚 \n","21 Let's try all emoticons :) :( :D ;) :-) :-( :-... Positif 💚 \n","\n"," Score de confiance Score brut Index \n","0 0.985352 0.985352 1 \n","1 0.935059 0.935059 2 \n","2 0.981934 0.981934 3 \n","3 0.885742 0.885742 4 \n","4 0.661621 0.661621 5 \n","5 0.964661 0.035339 6 \n","6 0.971725 0.028275 7 \n","7 0.816528 0.183472 8 \n","8 0.804565 0.195435 9 \n","9 0.836792 0.163208 10 \n","10 0.667480 0.667480 11 \n","11 0.845459 0.154541 12 \n","12 0.519775 0.480225 13 \n","13 0.696289 0.696289 14 \n","14 0.532715 0.532715 15 \n","15 0.791504 0.791504 16 \n","16 0.706543 0.706543 17 \n","17 0.849609 0.849609 18 \n","18 0.768066 0.768066 19 \n","19 0.931641 0.931641 20 \n","20 0.962402 0.962402 21 \n","21 0.916504 0.916504 22 "],"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
TweetSentimentEmojiScore de confianceScore brutIndex
0I absolutely love flying with @AirParadis! The...Positif💚0.9853520.9853521
1Just landed after a wonderful flight... The cr...Positif💚0.9350590.9350592
2OMG! You really have to try @AirParadis. Best....Positif💚0.9819340.9819343
3We had a very pleasant experience with our fli...Positif💚0.8857420.8857424
4My first time flying business class and I'm ab...Positif💚0.6616210.6616215
5I hate how @AirParadis always delays their fli...Négatif❌0.9646610.0353396
6The worst flight experience of my life? Defini...Négatif❌0.9717250.0282757
7Really @AirParadis??? Flight cancelled and no ...Négatif❌0.8165280.1834728
8Our baggage was lost and nobody at @AirParadis...Négatif❌0.8045650.1954359
9Food was terrible, seats were uncomfortable, a...Négatif❌0.8367920.16320810
10The flight was good but the food wasn't really...Positif💚0.6674800.66748011
11IDK what to think about my @AirParadis experie...Négatif❌0.8454590.15454112
12My husband loved the flight but I didn't... To...Négatif❌0.5197750.48022513
13TBH, @AirParadis has improved their service si...Positif💚0.6962890.69628914
14We were so excited for our trip but then our f...Positif💚0.5327150.53271515
15This is a tweet with many!!! exclamation!!! ma...Positif💚0.7915040.79150416
16How does the model handle multiple??? question...Positif💚0.7065430.70654317
17Testing ellipses... many... many... ellipses.....Positif💚0.8496090.84960918
18#many #hashtags #in #one #tweet #to #see #how ...Positif💚0.7680660.76806619
19@mention1 @mention2 @mention3 @mention4 @menti...Positif💚0.9316410.93164120
20Multiple URLs in one tweet: http://example1.co...Positif💚0.9624020.96240221
21Let's try all emoticons :) :( :D ;) :-) :-( :-...Positif💚0.9165040.91650422
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n"," \n"," \n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"df_results_glove","summary":"{\n \"name\": \"df_results_glove\",\n \"rows\": 22,\n \"fields\": [\n {\n \"column\": \"Tweet\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 22,\n \"samples\": [\n \"I absolutely love flying with @AirParadis! Their service is amazing and their staff is so helpful :) #bestairline #travel\",\n \"TBH, @AirParadis has improved their service since last year! Not perfect yet, but they're trying... #progress\",\n \"Our baggage was lost and nobody at @AirParadis seems to care! Don't they understand that we can't enjoy our vacation without our stuff??? http://badservice.com/complaint :-(\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Sentiment\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"N\\u00e9gatif\",\n \"Positif\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Emoji\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"\\u274c\",\n \"\\ud83d\\udc9a\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Score de confiance\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.1400476782218768,\n \"min\": 0.519775390625,\n \"max\": 0.9853515625,\n \"num_unique_values\": 22,\n \"samples\": [\n 0.9853515625,\n 0.6962890625\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Score brut\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.33611927608617925,\n \"min\": 0.0282745361328125,\n \"max\": 0.9853515625,\n \"num_unique_values\": 22,\n \"samples\": [\n 0.9853515625,\n 0.6962890625\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Index\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 6,\n \"min\": 1,\n \"max\": 22,\n \"num_unique_values\": 22,\n \"samples\": [\n 1,\n 14\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":46}],"source":["# Obtenir le DataFrame des prédictions pour le modèle GloVe\n","df_results_glove = test_model_on_examples(lstm_glove_model_pack, test_tweets_improved)\n","\n","# Sauvegarder les résultats dans un fichier CSV\n","df_results_glove.to_csv(\"content/advanced-model/LSTM_GloVe-300d-Fige/predictions_results.csv\", index=False)\n","\n","# Afficher un aperçu des prédictions\n","print(\"\\nAperçu des prédictions GloVe :\")\n","df_results_glove"]},{"cell_type":"markdown","source":["# Enregistrement de dépendances"],"metadata":{"id":"5iEc-YxAt3BU"}},{"cell_type":"code","source":["!pip freeze > requirements_modele_avance.txt"],"metadata":{"id":"jIw_YhFztVF2"},"execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"},"colab":{"provenance":[],"gpuType":"T4","toc_visible":true},"accelerator":"GPU"},"nbformat":4,"nbformat_minor":0}