```python import numpy as np import pandas as pd import matplotlib import matplotlib.pyplot as plt import seaborn as sns import scipy from scipy.stats import pearsonr, ttest_ind, ttest_1samp print("pandas version:", pd.__version__) print("matplotlib version:", matplotlib.__version__) print("seaborn version:", sns.__version__) print("scipy version", scipy.__version__) ``` pandas version: 2.2.2 matplotlib version: 3.8.4 seaborn version: 0.13.2 scipy version 1.13.1 # Data (glue) ```python df = sns.load_dataset("glue") df.dropna(inplace=True) df ``` <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>Model</th> <th>Year</th> <th>Encoder</th> <th>Task</th> <th>Score</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>ERNIE</td> <td>2019</td> <td>Transformer</td> <td>CoLA</td> <td>75.5</td> </tr> <tr> <th>1</th> <td>T5</td> <td>2019</td> <td>Transformer</td> <td>CoLA</td> <td>71.6</td> </tr> <tr> <th>2</th> <td>RoBERTa</td> <td>2019</td> <td>Transformer</td> <td>CoLA</td> <td>67.8</td> </tr> <tr> <th>3</th> <td>BERT</td> <td>2018</td> <td>Transformer</td> <td>CoLA</td> <td>60.5</td> </tr> <tr> <th>4</th> <td>BiLSTM+ELMo</td> <td>2018</td> <td>LSTM</td> <td>CoLA</td> <td>32.1</td> </tr> <tr> <th>...</th> <td>...</td> <td>...</td> <td>...</td> <td>...</td> <td>...</td> </tr> <tr> <th>59</th> <td>BERT</td> <td>2018</td> <td>Transformer</td> <td>RTE</td> <td>70.1</td> </tr> <tr> <th>60</th> <td>BiLSTM+ELMo</td> <td>2018</td> <td>LSTM</td> <td>RTE</td> <td>57.4</td> </tr> <tr> <th>61</th> <td>BiLSTM+CoVe</td> <td>2017</td> <td>LSTM</td> <td>RTE</td> <td>52.7</td> </tr> <tr> <th>62</th> <td>BiLSTM+Attn</td> <td>2017</td> <td>LSTM</td> <td>RTE</td> <td>58.4</td> </tr> <tr> <th>63</th> <td>BiLSTM</td> <td>2017</td> <td>LSTM</td> <td>RTE</td> <td>57.4</td> </tr> </tbody> </table> <p>64 rows × 5 columns</p> </div> ```python df.info() ``` <class 'pandas.core.frame.DataFrame'> RangeIndex: 64 entries, 0 to 63 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Model 64 non-null object 1 Year 64 non-null int64 2 Encoder 64 non-null object 3 Task 64 non-null object 4 Score 64 non-null float64 dtypes: float64(1), int64(1), object(3) memory usage: 2.6+ KB Une personne affirme que les Transformers ont en moyenne la même performance que les LSTM. On veut tester cette affirmation avec ce jeu de données trouvé sur internet. 1. D'où vient ce Dataset ? 2. Que signifie la variable score ? 3. Créer le meilleur graphique possible pour montrer à un client l'évolution du score des différents Encoders sur les dernières années 4. Répondre à la question initiale : Est-ce que les LSTM one en moyenne la même performance que les Transformers ? ```python pd.crosstab(df["Model"], df["Task"]) ``` <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th>Task</th> <th>CoLA</th> <th>MNLI</th> <th>MRPC</th> <th>QNLI</th> <th>QQP</th> <th>RTE</th> <th>SST-2</th> <th>STS-B</th> </tr> <tr> <th>Model</th> <th></th> <th></th> <th></th> <th></th> <th></th> <th></th> <th></th> <th></th> </tr> </thead> <tbody> <tr> <th>BERT</th> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <th>BiLSTM</th> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <th>BiLSTM+Attn</th> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <th>BiLSTM+CoVe</th> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <th>BiLSTM+ELMo</th> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <th>ERNIE</th> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <th>RoBERTa</th> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <th>T5</th> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> </tbody> </table> </div> # 1. D'où vient ce Dataset ? ### What ? Le référentiel GLUE (General Language Understanding Evaluation) est un ensemble de ressources pour la formation, l'évaluation et l'analyse des systèmes de compréhension du langage naturel. #### Variables - *Model* : Nom du modèle de Machine Learning - *Year* : Année de sortie du modèle - *Encoder* : Nom de l'encodeur utilisé - *Task¨: Test éffectué et évalué - *CoLA* : Corpus of Linguistic Acceptability - *SST-2* : Stanford Sentiment Treebank - *MRPC* : Microsoft Research Paraphrase Corpu - *STS-B* : Semantic Textual Similarity Benchmark - *QQP* : Quora Question Pairs - *MNLI* : Multi-Genre Natural Language Inference Corpu - *QNLI* : Stanford Question Answering Dataset - *RTE* : Recognizing Textual Entailment - *Score* : Score obtenu pour les différents modèles de ML et de test. ### Who ? Le dataset a été récupéré sur le site https://gluebenchmark.com/diagnostics. Ce site est le résultat d'un travail de recherche mené par des membres de la New York University, de l'University of Washington et enfin de DeepMind. Les données ont été publiées par les propriétaires des modèles. ###When: Le dataset a été ajouté à la collection de datasets de Seaborn le 25 Août 2022. Il concerne des modèles sortis de 2017 à 2019. Le plus récent a 5 ans. Dans le domaine de l'IA, il s'agit d'une éternité. ### Where: Il ne semble pas y avoir de restriction sur l'origine des modèles dont les résultats sont publiés. ### How: Les publications des résultats des tests sont réalisées directement par les propriétaires des modèles et le contrôle n'est pas clair. Le dataset n'a pas sa forme d'origine. Il a été modifié lors de son intégration dans Seaborn. En effet à l'origine la colonne Score n'existait pas et chaque Task avait sa propre colonne et le score y correspondant. ### Why: Pour Seaborn, l'objectif est de fournir des datasets diversifiés pour prendre en main la library. Pour gluebenchmark.com, l'objectif semble être la recherche. # Que signifie la variable *Score* ? Ce sont des coéfficients de corrélations exprimés en pourcentage. Attention ils sont calculés différemment selon les tests, ils ne doivent pas être comparés entre les différents modèles et tests effectués. # Évolutiondu score des Encoders sur les dernières années ```python sns.boxplot(data=df, x="Year", y="Score", hue="Encoder") ``` <Axes: xlabel='Year', ylabel='Score'> ![png](exo_Hypothèses_3_Glue_11_1.png) # Est-ce que les LSTM one en moyenne la même performance que les Transformers ? Sur le graphique, on remarque que les données de la variable *Score* ne sont pas identiquement distribuées. Les données ne sont pas issues de la mêm distribution. La variable score est associée à des modèles et des tâches; les tâches ne sont pas toutes les mêmes et n'emploient pas toute la même métrique. On ne peut donc pas faire de Student. Les données ne sont pas issues de la mêm distribution. La vazriable score est associée à des mod!èles et des tâches et les tâches ne sont pas toutes les mêles et n'emploient pas toute la même métrique.