TP Performance Scolaire
TP Performance Scolaire
1 Introduction
Nous disposons de deux ensembles de données qui proviennent de deux lycées portugais différents.
L’un est axé sur les élèves ayant choisi les mathématiques comme matière principale (“student-
mat”), tandis que l’autre concerne les élèves ayant choisi le portugais (“student-por”). Notre objectif
est de prédire les performances des élèves au lycée en se basant sur ces données, qui comprennent
les notes des élèves ainsi que des informations démographiques, sociales et scolaires. Les données
ont été collectées à partir de rapports scolaires et de questionnaires.
Les deux dataset contiennent des informations sur les performances des élèves dans un cours de
portugais ou en mathématiques. Voici une description détaillée des données : Variables :
school : Le nom de l'école.
sex : Le sexe de l'élève (F pour féminin, M pour masculin).
age : L'âge de l'élève.
address : Le type d'adresse de l'élève (U pour urbaine, R pour rurale).
famsize : La taille de la famille de l'élève (LE3 pour moins de 3 personnes, GT3 pour plus de 3
Pstatus : Le statut de cohabitation des parents de l'élève (A pour séparés, T pour ensemble).
Medu : Le niveau d'éducation de la mère de l'élève (0-4, où 0 signifie aucune éducation et 4 si
Fedu : Le niveau d'éducation du père de l'élève (0-4, similaire à Medu).
traveltime : Le temps de trajet entre le domicile et l'école (1-4, où 1 est très court et 4 est
studytime : Le temps d'étude hebdomadaire en heures (1-4, où 1 est très court et 4 est très lon
failures : Le nombre d'échecs antérieurs en classe (numérique).
schoolsup : Soutien éducatif supplémentaire à l'école (oui ou non).
1
famsup : Soutien éducatif supplémentaire de la famille (oui ou non).
paid : Cours supplémentaires payés (oui ou non).
activities : Activités parascolaires (oui ou non).
nursery : A fréquenté la garderie (oui ou non).
higher : A l'intention de poursuivre des études supérieures (oui ou non).
internet : Accès à Internet à domicile (oui ou non).
romantic : Relation romantique (oui ou non).
famrel : Qualité des relations familiales (de 1 à 5).
freetime : Temps libre après l'école (de 1 à 5).
goout : Sorties entre amis (de 1 à 5).
Dalc : Consommation d'alcool en jour de semaine (de 1 à 5).
Walc : Consommation d'alcool en week-end (de 1 à 5).
health : État de santé actuel (de 1 à 5).
absences : Nombre d'absences à l'école (numérique).
G1 : Note du premier trimestre (de 0 à 20).
G2 : Note du deuxième trimestre (de 0 à 20).
G3 : Note finale (de 0 à 20, variable cible).
Taille du jeu de données :
Le jeu de données contient un total de 649 exemples.
Il y a 29 colonnes, chacune contenant des informations sur les élèves et leurs performances aca
Données manquantes :
Il n'y a pas de données manquantes dans ce jeu de données.
1.1 Question que l’on peut se poser sur Student_mat & Student_por
Student Performance Dataset (student-por and student-mat): Les ensembles de données
suivants, tirés du même référentiel, se penchent sur les performances scolaires des étudiants en
portugais (student-por) et en mathématiques (student-mat). Chacun de ces ensembles compte
respectivement 395 et 649 lignes, avec 33 colonnes pour les deux. Les questions examinent la
spécialité avec les meilleures notes, les différences entre les écoles GP et MS, et d’autres aspects
intéressants tels que l’impact de la consommation d’alcool sur les résultats académiques.
• Quelle spécialité (portugais ou mathématiques) présente généralement les meilleures perfor-
mances académiques?
• Y a-t-il une corrélation entre le temps d’étude et les notes obtenues dans chaque spécialité?
• Comment les caractéristiques familiales influent-elles sur les performances académiques des
étudiants?
• Quelles différences existent entre les écoles GP et MS en termes de résultats académiques?
• Les étudiants qui ont un accès facile à Internet à domicile ont-ils tendance à obtenir de
meilleures notes?
• Quel impact le niveau d’absentéisme a-t-il sur les performances académiques des étudiants?
• Existe-t-il des différences significatives entre les performances des garçons et des filles dans
chaque spécialité?
• Comment la consommation d’alcool est-elle liée aux résultats scolaires dans ces deux spécial-
ités?
2
• Les étudiants qui ont suivi des cours de soutien ont-ils généralement de meilleures perfor-
mances?
• Quels sont les facteurs qui semblent avoir le plus grand impact sur les résultats globaux des
étudiants?
3
from sklearn.linear_model import LinearRegression, LogisticRegression
from [Link] import DecisionTreeClassifier
from [Link] import RandomForestClassifier
from [Link] import SVC
from [Link] import KNeighborsClassifier
from [Link] import StandardScaler, LabelEncoder, OneHotEncoder
from [Link] import mean_squared_error, r2_score, accuracy_score,␣
↪classification_report, confusion_matrix
student_mat = pd.read_csv('/kaggle/input/student-alcohol-consumption/
↪[Link]', sep=',')
student_por = pd.read_csv('/kaggle/input/student-alcohol-consumption/
↪[Link]', sep=',')
student_mat
student_por
[1]: school sex age address famsize Pstatus Medu Fedu Mjob Fjob \
0 GP F 18 U GT3 A 4 4 at_home teacher
1 GP F 17 U GT3 T 1 1 at_home other
2 GP F 15 U LE3 T 1 1 at_home other
3 GP F 15 U GT3 T 4 2 health services
4 GP F 16 U GT3 T 3 3 other other
.. … .. … … … … … … … …
644 MS F 19 R GT3 T 2 3 services other
645 MS F 18 U LE3 T 3 1 teacher services
646 MS F 18 U GT3 T 1 1 other other
647 MS M 17 U LE3 T 3 1 services services
648 MS M 18 R LE3 T 3 2 services other
4
[649 rows x 33 columns]
Observation : Nous avons importé les bibliothèques nécessaires pour effectuer les tâches demandées.
Les données des étudiants en mathématiques (student-mat) et en portugais (student-por) ont été
chargées depuis les fichiers CSV.
# Remplacer les valeurs spécifiées dans les colonnes binaires par 0 et 1 pour␣
↪chaque dataframe
[2]: school sex age address famsize Pstatus Medu Fedu Mjob \
0 0 0 18 0 1 0 4 4 at_home
1 0 0 17 0 1 1 1 1 at_home
2 0 0 15 0 0 1 1 1 at_home
3 0 0 15 0 1 1 4 2 health
4 0 0 16 0 1 1 3 3 other
.. … … … … … … … … …
390 1 1 20 0 0 0 2 2 services
391 1 1 17 0 0 1 3 1 services
392 1 1 21 1 1 1 1 1 other
393 1 1 18 1 0 1 3 2 services
394 1 1 19 0 0 1 1 1 other
5
391 services … 2 4 5 3 4 2 3 14
392 other … 5 5 3 3 3 3 3 10
393 other … 4 4 1 3 4 5 0 11
394 at_home … 3 2 3 3 3 5 5 8
G2 G3
0 6 6
1 5 6
2 8 10
3 14 15
4 10 10
.. .. ..
390 9 9
391 16 16
392 8 7
393 12 10
394 9 9
Observation : Dans cette partie, nous avons converti certaines colonnes en valeurs binaires en
remplaçant les valeurs spécifiées par 0 et 1. Cela permet de préparer les données pour les tâches
suivantes.
[3]: # Liste des colonnes catégorielles dans les DataFrames 'student-mat' et␣
↪'student-por'
mat_encoded = encoder.fit_transform(student_mat[categorical_columns])
por_encoded = [Link](student_por[categorical_columns])
6
# Concaténez les données encodées avec les DataFrames d'origine et supprimez␣
↪les colonnes catégorielles
/opt/conda/lib/python3.10/site-packages/sklearn/preprocessing/_encoders.py:868:
FutureWarning: `sparse` was renamed to `sparse_output` in version 1.2 and will
be removed in 1.4. `sparse_output` is ignored unless you leave `sparse` to its
default value.
[Link](
[3]: school sex age address famsize Pstatus Medu Fedu traveltime \
0 0 0 18 0 1 0 4 4 2
1 0 0 17 0 1 1 1 1 1
2 0 0 15 0 0 1 1 1 1
3 0 0 15 0 1 1 4 2 1
4 0 0 16 0 1 1 3 3 1
.. … … … … … … … … …
644 1 0 19 1 1 1 2 3 1
645 1 0 18 0 0 1 3 1 1
646 1 0 18 0 1 1 1 1 2
647 1 1 17 0 0 1 3 1 2
648 1 1 18 1 0 1 3 2 3
7
4 0.0 1.0 0.0 0.0
.. … … … …
644 0.0 0.0 0.0 0.0
645 0.0 0.0 0.0 0.0
646 0.0 0.0 0.0 0.0
647 0.0 0.0 0.0 0.0
648 0.0 0.0 0.0 0.0
guardian_mother guardian_other
0 1.0 0.0
1 0.0 0.0
2 1.0 0.0
3 1.0 0.0
4 0.0 0.0
.. … …
644 1.0 0.0
645 1.0 0.0
646 1.0 0.0
647 1.0 0.0
648 1.0 0.0
Observation : Nous avons identifié les colonnes catégorielles et appliqué l’encodage one-hot pour
les colonnes catégorielles. Cela permet de transformer ces colonnes en un format numérique adapté
à l’analyse.
La fonction d’encodage one-hot vise à convertir des données caractères en données binaires pour
les colonnes Mjob, Fjob, reason, et guardian. Elle génère de nouvelles colonnes secondaires sous
forme de variables binaires. Par conséquent, notre ensemble de données ne contient que des valeurs
numériques, ce qui facilite le traitement et l’analyse ultérieurs.
8
5 Partie 4 : Fusion des DataFrames
Nous allons fusionner les DataFrames ‘student-mat’ et ‘student-por’ en un seul DataFrame ‘student-
perf’.
Observation : Les données des étudiants en mathématiques et en portugais ont été fusionnées en
un seul DataFrame ‘student-perf’. Nous avons également réindexé le DataFrame pour refléter la
nouvelle structure.
data_info(student_mat, 'student-mat')
data_info(student_por, 'student-por')
data_info(student_perf, 'student-perf')
9
5 Pstatus 395 non-null int64
6 Medu 395 non-null int64
7 Fedu 395 non-null int64
8 traveltime 395 non-null int64
9 studytime 395 non-null int64
10 failures 395 non-null int64
11 schoolsup 395 non-null int64
12 famsup 395 non-null int64
13 paid 395 non-null int64
14 activities 395 non-null int64
15 nursery 395 non-null int64
16 higher 395 non-null int64
17 internet 395 non-null int64
18 romantic 395 non-null int64
19 famrel 395 non-null int64
20 freetime 395 non-null int64
21 goout 395 non-null int64
22 Dalc 395 non-null int64
23 Walc 395 non-null int64
24 health 395 non-null int64
25 absences 395 non-null int64
26 G1 395 non-null int64
27 G2 395 non-null int64
28 G3 395 non-null int64
29 Mjob_health 395 non-null int64
30 Mjob_other 395 non-null int64
31 Mjob_services 395 non-null int64
32 Mjob_teacher 395 non-null int64
33 Fjob_health 395 non-null int64
34 Fjob_other 395 non-null int64
35 Fjob_services 395 non-null int64
36 Fjob_teacher 395 non-null int64
37 reason_home 395 non-null int64
38 reason_other 395 non-null int64
39 reason_reputation 395 non-null int64
40 guardian_mother 395 non-null int64
41 guardian_other 395 non-null int64
dtypes: int64(42)
memory usage: 129.7 KB
None
school 0
sex 0
age 0
address 0
famsize 0
Pstatus 0
Medu 0
Fedu 0
10
traveltime 0
studytime 0
failures 0
schoolsup 0
famsup 0
paid 0
activities 0
nursery 0
higher 0
internet 0
romantic 0
famrel 0
freetime 0
goout 0
Dalc 0
Walc 0
health 0
absences 0
G1 0
G2 0
G3 0
Mjob_health 0
Mjob_other 0
Mjob_services 0
Mjob_teacher 0
Fjob_health 0
Fjob_other 0
Fjob_services 0
Fjob_teacher 0
reason_home 0
reason_other 0
reason_reputation 0
guardian_mother 0
guardian_other 0
dtype: int64
Nombre total d'entrées: 395
11
4 famsize 649 non-null int64
5 Pstatus 649 non-null int64
6 Medu 649 non-null int64
7 Fedu 649 non-null int64
8 traveltime 649 non-null int64
9 studytime 649 non-null int64
10 failures 649 non-null int64
11 schoolsup 649 non-null int64
12 famsup 649 non-null int64
13 paid 649 non-null int64
14 activities 649 non-null int64
15 nursery 649 non-null int64
16 higher 649 non-null int64
17 internet 649 non-null int64
18 romantic 649 non-null int64
19 famrel 649 non-null int64
20 freetime 649 non-null int64
21 goout 649 non-null int64
22 Dalc 649 non-null int64
23 Walc 649 non-null int64
24 health 649 non-null int64
25 absences 649 non-null int64
26 G1 649 non-null int64
27 G2 649 non-null int64
28 G3 649 non-null int64
29 Mjob_health 649 non-null int64
30 Mjob_other 649 non-null int64
31 Mjob_services 649 non-null int64
32 Mjob_teacher 649 non-null int64
33 Fjob_health 649 non-null int64
34 Fjob_other 649 non-null int64
35 Fjob_services 649 non-null int64
36 Fjob_teacher 649 non-null int64
37 reason_home 649 non-null int64
38 reason_other 649 non-null int64
39 reason_reputation 649 non-null int64
40 guardian_mother 649 non-null int64
41 guardian_other 649 non-null int64
dtypes: int64(42)
memory usage: 213.1 KB
None
school 0
sex 0
age 0
address 0
famsize 0
Pstatus 0
Medu 0
12
Fedu 0
traveltime 0
studytime 0
failures 0
schoolsup 0
famsup 0
paid 0
activities 0
nursery 0
higher 0
internet 0
romantic 0
famrel 0
freetime 0
goout 0
Dalc 0
Walc 0
health 0
absences 0
G1 0
G2 0
G3 0
Mjob_health 0
Mjob_other 0
Mjob_services 0
Mjob_teacher 0
Fjob_health 0
Fjob_other 0
Fjob_services 0
Fjob_teacher 0
reason_home 0
reason_other 0
reason_reputation 0
guardian_mother 0
guardian_other 0
dtype: int64
Nombre total d'entrées: 649
13
3 address 1044 non-null int64
4 famsize 1044 non-null int64
5 Pstatus 1044 non-null int64
6 Medu 1044 non-null int64
7 Fedu 1044 non-null int64
8 traveltime 1044 non-null int64
9 studytime 1044 non-null int64
10 failures 1044 non-null int64
11 schoolsup 1044 non-null int64
12 famsup 1044 non-null int64
13 paid 1044 non-null int64
14 activities 1044 non-null int64
15 nursery 1044 non-null int64
16 higher 1044 non-null int64
17 internet 1044 non-null int64
18 romantic 1044 non-null int64
19 famrel 1044 non-null int64
20 freetime 1044 non-null int64
21 goout 1044 non-null int64
22 Dalc 1044 non-null int64
23 Walc 1044 non-null int64
24 health 1044 non-null int64
25 absences 1044 non-null int64
26 G1 1044 non-null int64
27 G2 1044 non-null int64
28 G3 1044 non-null int64
29 Mjob_health 1044 non-null int64
30 Mjob_other 1044 non-null int64
31 Mjob_services 1044 non-null int64
32 Mjob_teacher 1044 non-null int64
33 Fjob_health 1044 non-null int64
34 Fjob_other 1044 non-null int64
35 Fjob_services 1044 non-null int64
36 Fjob_teacher 1044 non-null int64
37 reason_home 1044 non-null int64
38 reason_other 1044 non-null int64
39 reason_reputation 1044 non-null int64
40 guardian_mother 1044 non-null int64
41 guardian_other 1044 non-null int64
dtypes: int64(42)
memory usage: 342.7 KB
None
school 0
sex 0
age 0
address 0
famsize 0
Pstatus 0
14
Medu 0
Fedu 0
traveltime 0
studytime 0
failures 0
schoolsup 0
famsup 0
paid 0
activities 0
nursery 0
higher 0
internet 0
romantic 0
famrel 0
freetime 0
goout 0
Dalc 0
Walc 0
health 0
absences 0
G1 0
G2 0
G3 0
Mjob_health 0
Mjob_other 0
Mjob_services 0
Mjob_teacher 0
Fjob_health 0
Fjob_other 0
Fjob_services 0
Fjob_teacher 0
reason_home 0
reason_other 0
reason_reputation 0
guardian_mother 0
guardian_other 0
dtype: int64
Nombre total d'entrées: 1044
15
75% 1.000000 1.000000 18.000000 1.000000 1.000000
max 1.000000 1.000000 22.000000 1.000000 1.000000
guardian_other
count 1044.000000
mean 0.069923
std 0.255140
min 0.000000
25% 0.000000
50% 0.000000
75% 0.000000
max 1.000000
[8 rows x 42 columns]
Observation : Dans cette section, nous avons affiché des informations détaillées sur la structure des
données, y compris les types de données, les valeurs manquantes et le nombre total d’entrées. De
plus, nous avons calculé les statistiques descriptives pour le DataFrame ‘student-perf’ afin d’avoir
16
un aperçu des distributions des variables.
Observation : La création d’une matrice de corrélation nous permet de visualiser les relations entre
les variables. La heatmap affichée met en évidence les corrélations, ce qui peut être utile pour
comprendre quelles variables sont liées les unes aux autres.
17
7.2 Distribution des notes G1, G2, G3
[8]: # Création de trois graphiques pour G1, G2 et G3
fig, axes = [Link](1, 3, figsize=(18, 6))
# Titres et légendes
axes[0].set_title('Comparaison des Notes G1')
axes[0].set_xlabel('Note G1')
axes[0].set_ylabel('Distribution')
axes[0].legend()
18
Nous pouvons observer la distribution des notes dans les trois ensembles de données.
Il est intéressant de noter que, quelle que soit la matière (“G1”, “G2” ou “G3”), les élèves en
spécialité portugais semblent obtenir de meilleures notes, car la valeur maximale se situe aux
alentours de 10, tandis que pour les élèves en spécialité mathématiques, elle se situe aux alentours
de 9. Pour l’ensemble d’étudiants dans l’ensemble (“student_perf”), la moyenne des notes se
rapproche également de 10.
En observant les distributions, il semble y avoir une tendance à suivre une loi normale. Pour
les matières “G1”, “G2” et “G3”, les notes augmentent progressivement pour les mathématiques,
tandis qu’elles fluctuent à la hausse puis à la baisse pour le portugais.
19
# Ajuster l'espacement entre les sous-graphiques
plt.tight_layout()
# Afficher le graphique
[Link]()
Nous avons tracé trois boîtes à moustaches pour représenter les performances des élèves au cours
des trois trimestres.
Une comparaison des boîtes à moustaches révèle que l’école “GP” affiche de meilleures notes que
l’école “MS” pour l’ensemble des trois trimestres.
# Calculer la moyenne des notes pour les sexes (0: Garçons, 1: Filles)
avg_grades_by_sex = G_counts.groupby('sex')[note].mean()
↪2f}')
axes[i].set_xlabel(f'Notes {note}')
axes[i].set_ylabel('Nombre d\'étudiants')
axes[i].legend(title='Sexe', labels=['Garçons (0)', 'Filles (1)'])
20
# Ajuster l'espacement entre les sous-graphiques
plt.tight_layout()
# Afficher le graphique
[Link]()
Graphiquement, nous pouvons observer une relative équité des notes en fonction du sexe, où les
filles et les garçons obtiennent des résultats similaires. Les moyennes pour les deux groupes sont
également proches, indiquant ainsi que le sexe a une influence limitée sur les performances scolaires.
[11]: # Scatter plot : Niveau d'éducation de la mère par Niveau d'éducation du père
education_counts = student_perf.groupby(['Medu', 'Fedu']).size().
↪reset_index(name='count')
21
[Link](range(5), ["Aucune éducation", "Éducation primaire", "Éducation␣
↪secondaire", "Éducation professionnelle", "Enseignement supérieur complet"],␣
↪rotation=45)
Nous observons ici la corrélation entre le niveau d’éducation de la mère et celui du père.
Il est notable que très peu de parents ont un niveau d’éducation nul, ce qui est rassurant. En
général, les parents sont mariés à des partenaires ayant un niveau d’éducation similaire, comme
le montrent les cercles les plus grands alignés en diagonale. Plus le niveau d’éducation est élevé,
moins les couples sont mariés.
Cependant, il est intéressant de noter que les couples ayant achevé un enseignement supérieur
complet forment le groupe le plus important, ce qui suggère un certain niveau de prospérité et un
meilleur accès à l’éducation.
7.5 Conclusion:
Nous avons donc présenter et illustrer ces deux dataset fournis ensemble.
22
8 Partie 7: Créations des models
8.1 Modèle Linéaire
[12]: # Fonction pour appliquer la régression linéaire
def apply_linear_regression(dataset, target_column):
# Séparation des données en fonction des caractéristiques (X) et de la␣
↪variable cible (y)
X = [Link](target_column, axis=1)
y = dataset[target_column]
23
1.48, suggérant une meilleure précision des prédictions par rapport aux valeurs réelles
de ‘G3’.
• student_perf : Erreur quadratique moyenne pour G3 : 3.20
– Entre les trois ensembles de données, student_perf présente une RMSE intermédiaire de
3.20, indiquant un niveau d’erreur moyen entre les prédictions du modèle et les valeurs
réelles de ‘G3’.
Les résultats de la régression linéaire varient entre les ensembles de données, avec la meilleure
précision observée dans student_por (RMSE : 1.48), suivie de student_perf (RMSE : 3.20), tandis
que student_mat, bien que présentant une RMSE plus élevée (5.66), contribue à la formation de
student_perf. La fusion des ensembles student_mat et student_por dans student_perf semble
influencer la performance globale du modèle.
# Entraînement du modèle
[Link](X_train, y_train)
# Évaluation du modèle
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("\n")
24
# Régression linéaire pour student_por
print("Régression Linéaire pour student_por:")
perform_linear_regression(student_por)
print("\n")
student_por :
• MSE : 1.48
• R2 Score : 0.85
– Des performances significativement meilleures sont observées avec un MSE de 1.48 et un
R2 Score de 0.85, suggérant une adéquation précise aux données et une explication plus
avancée de la variance.
student_perf :
• MSE : 3.20
• R2 Score : 0.79
– En fusionnant student_mat et student_por, le modèle affiche une performance inter-
médiaire avec un MSE de 3.20 et un R2 Score de 0.79, indiquant une bonne capacité à
expliquer la variance dans cet ensemble combiné.
25
En conclusion, le modèle performe mieux sur student_por, démontrant une précision accrue dans
la prédiction de ‘G3’ par rapport à student_mat et student_perf. La fusion des ensembles dans
student_perf semble influencer la performance globale du modèle.
def perform_linear_regression(data):
# Séparation des données en variables indépendantes (X) et dépendantes (y)
X = [Link]('G3', axis=1)
y = data['G3']
# Entraînement du modèle
[Link](X_train, y_train)
# Pour student_mat
[Link](1, 3, 1)
[Link](y_test_mat, y_pred_mat)
[Link]([min(y_test_mat), max(y_test_mat)], [min(y_test_mat),␣
↪max(y_test_mat)], color='red', linestyle='--', linewidth=2)
26
[Link]('Régression Linéaire - student_mat')
[Link]('Valeurs réelles')
[Link]('Prédictions')
# Pour student_por
[Link](1, 3, 2)
[Link](y_test_por, y_pred_por)
[Link]([min(y_test_por), max(y_test_por)], [min(y_test_por),␣
↪max(y_test_por)], color='red', linestyle='--', linewidth=2)
# Pour student_perf
[Link](1, 3, 3)
[Link](y_test_perf, y_pred_perf)
[Link]([min(y_test_perf), max(y_test_perf)], [min(y_test_perf),␣
↪max(y_test_perf)], color='red', linestyle='--', linewidth=2)
plt.tight_layout()
[Link]()
27
8.3.2 Régression Linéaire - student_por
• Observations : Disparité significativement moindre par rapport à student_mat. Les points
prédits sont proches de leurs valeurs réelles, illustrant un regroupement autour de la ligne en
pointillés rouge.
• Implications : Performance améliorée indiquant une meilleure adéquation aux données de
cet ensemble.
8.3.5 Conclusion
• La disparité des performances souligne l’importance de considérer la nature spécifique des
données pour évaluer la qualité du modèle. Les observations visuelles et mathématiques
offrent un aperçu complet de la performance de la régression linéaire sur chaque ensemble et
sur l’ensemble fusionné.
28
# Entraînement du modèle
[Link](X, y)
# Affichage du graphique
scatter = [Link](data[features[0]], data[features[1]], c=data['pass'],␣
↪cmap='RdYlGn', edgecolor='k', marker='o', label=None)
Z = [Link](np.c_[[Link](), [Link]()])
Z = [Link]([Link])
contour = [Link](xx, yy, Z, alpha=0.3, cmap='RdYlGn_r')
ax.set_xlabel(features[0])
ax.set_ylabel(features[1])
ax.set_title(title)
plt.tight_layout()
[Link]()
29
not have valid feature names, but LogisticRegression was fitted with feature
names
[Link](
/opt/conda/lib/python3.10/site-packages/sklearn/[Link]: UserWarning: X does
not have valid feature names, but LogisticRegression was fitted with feature
names
[Link](
/opt/conda/lib/python3.10/site-packages/sklearn/[Link]: UserWarning: X does
not have valid feature names, but LogisticRegression was fitted with feature
names
[Link](
Frontière de Décision :
• Contours de Couleur : La zone colorée du graphique représente la frontière de décision de
la régression logistique. Cette frontière sépare l’espace en deux zones, une pour chaque classe
(‘Pass’ et ‘Fail’).
• Couleurs des Zones : La zone qui était précédemment rouge représente la classe ‘Pass’
(étudiants réussis), et la zone qui était bleue représente la classe ‘Fail’ (étudiants en échec).
• Interprétation : La frontière de décision est déterminée par le modèle de régression logis-
tique en fonction des coefficients appris pendant l’entraînement. Les points le long de cette
frontière sont ceux pour lesquels le modèle est moins certain de la classification.
Légende :
30
• Légende Manuelle : La légende indique la correspondance entre les couleurs des points et
les classes réelles (‘Pass’ et ‘Fail’). Les points verts sont associés à la classe ‘Pass’, tandis que
les points rouges sont associés à la classe ‘Fail’.
Axes :
• Axe X et Axe Y : Les axes représentent les variables indépendantes utilisées dans le
modèle (dans notre cas, ( G1 ) et ( G2 )). Chaque point est positionné en fonction de ces
deux variables.
# Entraînement du modèle
[Link](X_train, y_train)
31
# Prédiction sur l'ensemble de test
y_pred = [Link](X_test)
# Évaluation du modèle
accuracy = accuracy_score(y_test, y_pred)
classification_rep = classification_report(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0
in labels with no true samples. Use `zero_division` parameter to control this
behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0
in labels with no true samples. Use `zero_division` parameter to control this
behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0
in labels with no true samples. Use `zero_division` parameter to control this
behavior.
_warn_prf(average, modifier, msg_start, len(result))
Résultats pour student_mat :
Accuracy : 0.3670886075949367
32
Classification Report:
precision recall f1-score support
accuracy 0.37 79
macro avg 0.32 0.32 0.30 79
weighted avg 0.39 0.37 0.36 79
Confusion Matrix:
[[3 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0]
[0 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 1 1 2 1 1 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
[2 0 1 0 2 1 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 5 5 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 2 3 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 3 0 0 1 1 0 0 0 0 0 0]
[0 0 0 0 0 0 0 1 1 1 2 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 1 0 4 1 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 2 4 3 0 1 0 0]
[0 0 0 0 0 0 0 0 0 0 0 2 1 1 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
33
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Résultats pour student_por :
Accuracy : 0.4846153846153846
Classification Report:
precision recall f1-score support
34
0 0.50 0.50 0.50 2
7 0.00 0.00 0.00 1
8 0.57 0.57 0.57 7
9 0.50 0.60 0.55 5
10 0.61 0.65 0.63 17
11 0.57 0.52 0.54 25
12 0.36 0.31 0.33 16
13 0.45 0.38 0.42 13
14 0.46 0.50 0.48 12
15 0.40 0.40 0.40 10
16 0.50 0.44 0.47 9
17 0.17 0.40 0.24 5
18 1.00 0.71 0.83 7
19 0.00 0.00 0.00 1
Confusion Matrix:
[[ 1 0 0 1 0 0 0 0 0 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
[ 1 0 4 2 0 0 0 0 0 0 0 0 0 0]
[ 0 0 2 3 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 11 5 1 0 0 0 0 0 0 0]
[ 0 0 0 0 6 13 4 2 0 0 0 0 0 0]
[ 0 0 0 0 1 4 5 3 3 0 0 0 0 0]
[ 0 0 0 0 0 1 2 5 4 1 0 0 0 0]
[ 0 0 0 0 0 0 2 1 6 3 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 4 3 3 0 0]
[ 0 0 0 0 0 0 0 0 0 1 4 4 0 0]
[ 0 0 0 0 0 0 0 0 0 1 1 2 0 1]
[ 0 0 0 0 0 0 0 0 0 0 0 2 5 0]
[ 0 0 0 0 0 0 0 0 0 0 0 1 0 0]]
35
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Résultats pour student_perf :
Accuracy : 0.4449760765550239
Classification Report:
precision recall f1-score support
36
0 0.59 0.91 0.71 11
1 0.00 0.00 0.00 1
5 0.00 0.00 0.00 2
6 0.00 0.00 0.00 2
7 0.33 0.17 0.22 6
8 0.30 0.39 0.34 18
9 0.31 0.20 0.24 20
10 0.69 0.74 0.71 27
11 0.41 0.48 0.44 25
12 0.26 0.27 0.27 22
13 0.56 0.43 0.49 21
14 0.38 0.55 0.44 11
15 0.60 0.45 0.51 20
16 0.56 0.42 0.48 12
17 0.20 0.20 0.20 5
18 0.50 0.60 0.55 5
19 0.00 0.00 0.00 1
Confusion Matrix:
[[10 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 1 3 2 0 0 0 0 0 0 0 0 0 0]
[ 2 0 1 2 1 7 5 0 0 0 0 0 0 0 0 0 0]
[ 5 0 0 1 0 10 4 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 20 7 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 4 12 8 1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 4 9 6 1 2 0 0 0 0 0]
[ 0 0 0 0 0 0 0 1 1 8 9 1 1 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 1 4 6 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 1 5 9 2 3 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 2 5 5 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 2 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 1]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]]
37
8.5.1 Interprétation et Comparaison des Résultats
Arbre de Décision - student_mat
• Chemin de l’arbre : Profondeur minimale = 4, profondeur maximale = 14.
• Résultats :
– Accuracy : 36.71%
– Observations :
∗ Grande profondeur de l’arbre, indiquant une complexité élevée.
∗ L’accuracy est relativement basse, suggérant une difficulté à prédire avec précision.
– Classification Report :
∗ F1-score plus bas pour plusieurs classes, indiquant une mauvaise performance.
– Implications : L’arbre de décision pour student_mat montre une complexité excessive
et une performance médiocre.
38
∗ Accuracy légèrement améliorée par rapport à student_mat.
– Classification Report :
∗ Certaines améliorations dans les scores, mais des problèmes persistent.
– Implications : Malgré des améliorations, l’arbre de décision pour student_por montre
encore des lacunes dans la prédiction.
Régression Linéaire
• Student_mat :
– MSE : 5.66, R2 Score : 0.72
• Student_por :
– MSE : 1.48, R2 Score : 0.85
• Student_perf :
– MSE : 3.20, R2 Score : 0.79
Comparaison
• La régression linéaire montre une meilleure performance globale que les arbres de décision.
• Student_por a les meilleures performances parmi les trois datasets, suivie par student_perf
et student_mat.
• La complexité des arbres de décision peut conduire à une surajustement pour student_mat.
• Les modèles actuels pourraient être améliorés en ajustant les hyperparamètres ou en explorant
d’autres algorithmes.
8.5.2 Conclusion
• Les résultats indiquent que les modèles de régression linéaire surpassent les arbres de décision
dans ce contexte.
• Student_por, avec une complexité d’arbre modérée, montre la meilleure performance prédic-
tive.
• Des ajustements sont nécessaires pour améliorer la généralisation des modèles.
39
8.6 Forêt Aléatoire
[17]: def plot_confusion_matrix(ax, conf_matrix, classes, dataset_name):
[Link](conf_matrix, annot=True, fmt='d', cmap='Blues',␣
↪xticklabels=classes, yticklabels=classes, ax=ax)
model = RandomForestClassifier(random_state=42)
[Link](X_train, y_train)
y_pred = [Link](X_test)
40
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Résultats pour student_mat avec une Forêt Aléatoire:
Accuracy : 0.43037974683544306
Classification Report:
precision recall f1-score support
accuracy 0.43 79
macro avg 0.37 0.36 0.31 79
weighted avg 0.46 0.43 0.40 79
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
41
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Résultats pour student_por avec une Forêt Aléatoire:
Accuracy : 0.5384615384615384
Classification Report:
precision recall f1-score support
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
42
_warn_prf(average, modifier, msg_start, len(result))
Résultats pour student_perf avec une Forêt Aléatoire:
Accuracy : 0.4258373205741627
Classification Report:
precision recall f1-score support
43
– Précision variable pour différentes classes.
– Présence de classes avec recall et f1-score bas, indiquant des difficultés de prédiction
pour ces classes.
– Avertissements “UndefinedMetricWarning” pour certaines classes avec 0 échantillons
prédits.
• Implications : La Forêt Aléatoire sur student_mat montre des difficultés à prédire certaines
classes, avec une attention nécessaire pour améliorer la prédiction globale.
8.6.3 Conclusion
• La Forêt Aléatoire montre des résultats mitigés avec une amélioration modeste par rapport
aux arbres de décision.
• Des ajustements sont nécessaires pour résoudre les problèmes de prédiction de certaines classes
et améliorer la généralisation.
44
8.7 Support Vector Machines [SVM]
[18]: # Fonction pour effectuer une classification avec Machines à Vecteurs de␣
↪Support (SVM)
# Entraînement du modèle
[Link](X_train, y_train)
# Évaluation du modèle
accuracy = accuracy_score(y_test, y_pred)
classification_rep = classification_report(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
[Link](figsize=(15, 5))
45
for i, (dataset, dataset_name) in enumerate(zip(datasets, dataset_names), 1):
perform_svm_classification(dataset, dataset_name, i)
plt.tight_layout()
[Link]()
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Résultats pour student_mat avec SVM:
Accuracy : 0.26582278481012656
Classification Report:
precision recall f1-score support
46
10 0.32 0.91 0.48 11
11 0.07 0.20 0.10 5
12 0.00 0.00 0.00 5
13 0.00 0.00 0.00 5
14 0.00 0.00 0.00 6
15 0.37 0.70 0.48 10
16 0.00 0.00 0.00 4
17 0.00 0.00 0.00 3
18 0.00 0.00 0.00 1
19 0.00 0.00 0.00 2
accuracy 0.27 79
macro avg 0.07 0.15 0.10 79
weighted avg 0.12 0.27 0.16 79
Confusion Matrix:
[[ 3 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0]
[ 1 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0]
[ 1 0 0 0 3 0 2 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
[ 2 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0]
[ 1 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 10 1 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 2 3 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 4 0 0 0 2 0 0 0 0]
[ 0 0 0 0 0 0 0 3 0 0 0 7 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0]]
Résultats pour student_por avec SVM:
Accuracy : 0.3076923076923077
Classification Report:
precision recall f1-score support
47
17 0.00 0.00 0.00 5
18 0.00 0.00 0.00 7
19 0.00 0.00 0.00 1
Confusion Matrix:
[[ 1 0 0 0 1 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 7 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 3 2 0 0 0 0 0 0 0 0]
[ 0 0 0 0 11 6 0 0 0 0 0 0 0 0]
[ 0 0 0 0 6 17 0 2 0 0 0 0 0 0]
[ 0 0 0 0 1 5 0 10 0 0 0 0 0 0]
[ 0 0 0 0 0 2 0 11 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 12 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 10 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 4 2 3 0 0 0 0]
[ 0 0 0 0 0 0 0 1 1 3 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 7 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 1 0 0 0 0]]
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/opt/conda/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1344:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to
0.0 in labels with no predicted samples. Use `zero_division` parameter to
control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Résultats pour student_perf avec SVM:
Accuracy : 0.33014354066985646
Classification Report:
precision recall f1-score support
48
7 0.00 0.00 0.00 6
8 0.50 0.11 0.18 18
9 0.00 0.00 0.00 20
10 0.28 0.78 0.41 27
11 0.42 0.72 0.53 25
12 0.00 0.00 0.00 22
13 0.30 0.81 0.44 21
14 0.00 0.00 0.00 11
15 0.22 0.20 0.21 20
16 0.00 0.00 0.00 12
17 0.00 0.00 0.00 5
18 0.00 0.00 0.00 5
19 0.00 0.00 0.00 1
Confusion Matrix:
[[ 7 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 2 0 4 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 2 0 15 1 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 19 1 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 21 6 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 7 18 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 1 11 0 10 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 4 0 17 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 2 0 9 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 14 2 4 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 6 1 5 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 2 3 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]]
49
8.7.1 Résultats pour student_mat avec SVM :
• Accuracy : 25.32%
– Observations :
∗ Le modèle SVM a une faible précision sur cet ensemble de données, avec des aver-
tissements “UndefinedMetricWarning” suggérant que certaines classes n’ont aucun
échantillon prédit.
– Explications :
∗ Les performances pourraient être améliorées en ajustant les hyperparamètres du
modèle ou en utilisant des techniques de prétraitement des données.
8.7.5 Visualisation :
• Trois subplots montrent les matrices de confusion pour chaque ensemble de données avec
SVM.
Note : L’amélioration des performances pourrait nécessiter des ajustements plus fins des modèles
et une exploration plus approfondie des données.
50
8.8 Réseaux de Neurones
[19]: import numpy as np
import pandas as pd
from [Link] import StandardScaler
from sklearn.model_selection import train_test_split
from [Link] import Sequential
from [Link] import Dense
from [Link] import Adam
from [Link] import mean_squared_error
# Compilation du modèle
[Link](optimizer='adam', loss='mean_squared_error')
# Entraînement du modèle
[Link](X_train, y_train, epochs=50, batch_size=32,␣
↪validation_data=(X_test, y_test))
51
# Évaluation du modèle
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error for {dataset_name}: {mse}\n")
Epoch 1/50
10/10 [==============================] - 1s 27ms/step - loss: 115.0885 -
val_loss: 112.9491
Epoch 2/50
10/10 [==============================] - 0s 7ms/step - loss: 95.6986 - val_loss:
92.9915
Epoch 3/50
10/10 [==============================] - 0s 6ms/step - loss: 77.3013 - val_loss:
73.2938
Epoch 4/50
10/10 [==============================] - 0s 5ms/step - loss: 58.7662 - val_loss:
53.7564
Epoch 5/50
10/10 [==============================] - 0s 5ms/step - loss: 40.9233 - val_loss:
36.1248
Epoch 6/50
10/10 [==============================] - 0s 5ms/step - loss: 26.1684 - val_loss:
22.2480
Epoch 7/50
10/10 [==============================] - 0s 5ms/step - loss: 16.2607 - val_loss:
13.7589
Epoch 8/50
10/10 [==============================] - 0s 5ms/step - loss: 10.6756 - val_loss:
10.2419
Epoch 9/50
10/10 [==============================] - 0s 7ms/step - loss: 8.5780 - val_loss:
8.8214
Epoch 10/50
10/10 [==============================] - 0s 5ms/step - loss: 7.2839 - val_loss:
8.0518
Epoch 11/50
10/10 [==============================] - 0s 5ms/step - loss: 6.2164 - val_loss:
7.6424
Epoch 12/50
10/10 [==============================] - 0s 7ms/step - loss: 5.4641 - val_loss:
7.3371
Epoch 13/50
10/10 [==============================] - 0s 5ms/step - loss: 4.9284 - val_loss:
7.0736
Epoch 14/50
10/10 [==============================] - 0s 5ms/step - loss: 4.5015 - val_loss:
6.8382
Epoch 15/50
10/10 [==============================] - 0s 5ms/step - loss: 4.1856 - val_loss:
52
6.6097
Epoch 16/50
10/10 [==============================] - 0s 5ms/step - loss: 3.9141 - val_loss:
6.4597
Epoch 17/50
10/10 [==============================] - 0s 5ms/step - loss: 3.6517 - val_loss:
6.3226
Epoch 18/50
10/10 [==============================] - 0s 6ms/step - loss: 3.4468 - val_loss:
6.2229
Epoch 19/50
10/10 [==============================] - 0s 6ms/step - loss: 3.2493 - val_loss:
6.1608
Epoch 20/50
10/10 [==============================] - 0s 5ms/step - loss: 3.0820 - val_loss:
6.1040
Epoch 21/50
10/10 [==============================] - 0s 7ms/step - loss: 2.9343 - val_loss:
6.0856
Epoch 22/50
10/10 [==============================] - 0s 5ms/step - loss: 2.8061 - val_loss:
6.0169
Epoch 23/50
10/10 [==============================] - 0s 5ms/step - loss: 2.6698 - val_loss:
5.9944
Epoch 24/50
10/10 [==============================] - 0s 5ms/step - loss: 2.5531 - val_loss:
5.9987
Epoch 25/50
10/10 [==============================] - 0s 5ms/step - loss: 2.4307 - val_loss:
5.9673
Epoch 26/50
10/10 [==============================] - 0s 5ms/step - loss: 2.3287 - val_loss:
5.9713
Epoch 27/50
10/10 [==============================] - 0s 5ms/step - loss: 2.2167 - val_loss:
5.9225
Epoch 28/50
10/10 [==============================] - 0s 5ms/step - loss: 2.1267 - val_loss:
5.9134
Epoch 29/50
10/10 [==============================] - 0s 5ms/step - loss: 2.0267 - val_loss:
5.9435
Epoch 30/50
10/10 [==============================] - 0s 5ms/step - loss: 1.9384 - val_loss:
5.9400
Epoch 31/50
10/10 [==============================] - 0s 7ms/step - loss: 1.8418 - val_loss:
53
5.9437
Epoch 32/50
10/10 [==============================] - 0s 5ms/step - loss: 1.7628 - val_loss:
5.9304
Epoch 33/50
10/10 [==============================] - 0s 5ms/step - loss: 1.6716 - val_loss:
5.8932
Epoch 34/50
10/10 [==============================] - 0s 5ms/step - loss: 1.6053 - val_loss:
5.9265
Epoch 35/50
10/10 [==============================] - 0s 5ms/step - loss: 1.5163 - val_loss:
5.9263
Epoch 36/50
10/10 [==============================] - 0s 5ms/step - loss: 1.4475 - val_loss:
5.9301
Epoch 37/50
10/10 [==============================] - 0s 5ms/step - loss: 1.3795 - val_loss:
5.8953
Epoch 38/50
10/10 [==============================] - 0s 7ms/step - loss: 1.3135 - val_loss:
5.9421
Epoch 39/50
10/10 [==============================] - 0s 5ms/step - loss: 1.2483 - val_loss:
5.9476
Epoch 40/50
10/10 [==============================] - 0s 7ms/step - loss: 1.1799 - val_loss:
5.9782
Epoch 41/50
10/10 [==============================] - 0s 5ms/step - loss: 1.1198 - val_loss:
5.9614
Epoch 42/50
10/10 [==============================] - 0s 5ms/step - loss: 1.0584 - val_loss:
5.9790
Epoch 43/50
10/10 [==============================] - 0s 5ms/step - loss: 1.0066 - val_loss:
6.0054
Epoch 44/50
10/10 [==============================] - 0s 5ms/step - loss: 0.9566 - val_loss:
5.9916
Epoch 45/50
10/10 [==============================] - 0s 6ms/step - loss: 0.9035 - val_loss:
6.0322
Epoch 46/50
10/10 [==============================] - 0s 5ms/step - loss: 0.8561 - val_loss:
6.0549
Epoch 47/50
10/10 [==============================] - 0s 7ms/step - loss: 0.8085 - val_loss:
54
6.0648
Epoch 48/50
10/10 [==============================] - 0s 8ms/step - loss: 0.7664 - val_loss:
6.0593
Epoch 49/50
10/10 [==============================] - 0s 7ms/step - loss: 0.7230 - val_loss:
6.0589
Epoch 50/50
10/10 [==============================] - 0s 7ms/step - loss: 0.6852 - val_loss:
6.0891
3/3 [==============================] - 0s 2ms/step
Mean Squared Error for student_mat: 6.089123225502839
Epoch 1/50
17/17 [==============================] - 1s 12ms/step - loss: 127.0850 -
val_loss: 120.1466
Epoch 2/50
17/17 [==============================] - 0s 4ms/step - loss: 96.0343 - val_loss:
81.1960
Epoch 3/50
17/17 [==============================] - 0s 4ms/step - loss: 58.8984 - val_loss:
39.2443
Epoch 4/50
17/17 [==============================] - 0s 4ms/step - loss: 25.2246 - val_loss:
11.2580
Epoch 5/50
17/17 [==============================] - 0s 4ms/step - loss: 8.3889 - val_loss:
5.8965
Epoch 6/50
17/17 [==============================] - 0s 4ms/step - loss: 5.4261 - val_loss:
4.8213
Epoch 7/50
17/17 [==============================] - 0s 4ms/step - loss: 4.0995 - val_loss:
3.7560
Epoch 8/50
17/17 [==============================] - 0s 4ms/step - loss: 3.3636 - val_loss:
3.3351
Epoch 9/50
17/17 [==============================] - 0s 4ms/step - loss: 2.9204 - val_loss:
3.0285
Epoch 10/50
17/17 [==============================] - 0s 4ms/step - loss: 2.6116 - val_loss:
2.8897
Epoch 11/50
17/17 [==============================] - 0s 5ms/step - loss: 2.3738 - val_loss:
2.8342
Epoch 12/50
17/17 [==============================] - 0s 4ms/step - loss: 2.1961 - val_loss:
55
2.7614
Epoch 13/50
17/17 [==============================] - 0s 4ms/step - loss: 2.0625 - val_loss:
2.7103
Epoch 14/50
17/17 [==============================] - 0s 4ms/step - loss: 1.9451 - val_loss:
2.6867
Epoch 15/50
17/17 [==============================] - 0s 5ms/step - loss: 1.8524 - val_loss:
2.6110
Epoch 16/50
17/17 [==============================] - 0s 4ms/step - loss: 1.7719 - val_loss:
2.5803
Epoch 17/50
17/17 [==============================] - 0s 4ms/step - loss: 1.6864 - val_loss:
2.5488
Epoch 18/50
17/17 [==============================] - 0s 4ms/step - loss: 1.6144 - val_loss:
2.4991
Epoch 19/50
17/17 [==============================] - 0s 4ms/step - loss: 1.5507 - val_loss:
2.4814
Epoch 20/50
17/17 [==============================] - 0s 4ms/step - loss: 1.4914 - val_loss:
2.4546
Epoch 21/50
17/17 [==============================] - 0s 4ms/step - loss: 1.4256 - val_loss:
2.4350
Epoch 22/50
17/17 [==============================] - 0s 4ms/step - loss: 1.3617 - val_loss:
2.4002
Epoch 23/50
17/17 [==============================] - 0s 4ms/step - loss: 1.3090 - val_loss:
2.3715
Epoch 24/50
17/17 [==============================] - 0s 4ms/step - loss: 1.2654 - val_loss:
2.3690
Epoch 25/50
17/17 [==============================] - 0s 4ms/step - loss: 1.2134 - val_loss:
2.3282
Epoch 26/50
17/17 [==============================] - 0s 4ms/step - loss: 1.1570 - val_loss:
2.3200
Epoch 27/50
17/17 [==============================] - 0s 4ms/step - loss: 1.1149 - val_loss:
2.3265
Epoch 28/50
17/17 [==============================] - 0s 4ms/step - loss: 1.0751 - val_loss:
56
2.3215
Epoch 29/50
17/17 [==============================] - 0s 5ms/step - loss: 1.0297 - val_loss:
2.2906
Epoch 30/50
17/17 [==============================] - 0s 4ms/step - loss: 0.9908 - val_loss:
2.3086
Epoch 31/50
17/17 [==============================] - 0s 4ms/step - loss: 0.9556 - val_loss:
2.3021
Epoch 32/50
17/17 [==============================] - 0s 4ms/step - loss: 0.9077 - val_loss:
2.2846
Epoch 33/50
17/17 [==============================] - 0s 4ms/step - loss: 0.8727 - val_loss:
2.2646
Epoch 34/50
17/17 [==============================] - 0s 4ms/step - loss: 0.8384 - val_loss:
2.2677
Epoch 35/50
17/17 [==============================] - 0s 4ms/step - loss: 0.8108 - val_loss:
2.2667
Epoch 36/50
17/17 [==============================] - 0s 5ms/step - loss: 0.7782 - val_loss:
2.2385
Epoch 37/50
17/17 [==============================] - 0s 4ms/step - loss: 0.7458 - val_loss:
2.2640
Epoch 38/50
17/17 [==============================] - 0s 5ms/step - loss: 0.7158 - val_loss:
2.2411
Epoch 39/50
17/17 [==============================] - 0s 4ms/step - loss: 0.6904 - val_loss:
2.2474
Epoch 40/50
17/17 [==============================] - 0s 4ms/step - loss: 0.6672 - val_loss:
2.2743
Epoch 41/50
17/17 [==============================] - 0s 4ms/step - loss: 0.6431 - val_loss:
2.2524
Epoch 42/50
17/17 [==============================] - 0s 4ms/step - loss: 0.6104 - val_loss:
2.2813
Epoch 43/50
17/17 [==============================] - 0s 4ms/step - loss: 0.5835 - val_loss:
2.2766
Epoch 44/50
17/17 [==============================] - 0s 4ms/step - loss: 0.5745 - val_loss:
57
2.3114
Epoch 45/50
17/17 [==============================] - 0s 4ms/step - loss: 0.5396 - val_loss:
2.2821
Epoch 46/50
17/17 [==============================] - 0s 4ms/step - loss: 0.5141 - val_loss:
2.2891
Epoch 47/50
17/17 [==============================] - 0s 5ms/step - loss: 0.4950 - val_loss:
2.2899
Epoch 48/50
17/17 [==============================] - 0s 4ms/step - loss: 0.4728 - val_loss:
2.3083
Epoch 49/50
17/17 [==============================] - 0s 4ms/step - loss: 0.4525 - val_loss:
2.2796
Epoch 50/50
17/17 [==============================] - 0s 4ms/step - loss: 0.4351 - val_loss:
2.3107
5/5 [==============================] - 0s 2ms/step
Mean Squared Error for student_por: 2.3107042288049744
Epoch 1/50
27/27 [==============================] - 1s 8ms/step - loss: 111.8216 -
val_loss: 76.0512
Epoch 2/50
27/27 [==============================] - 0s 3ms/step - loss: 53.8491 - val_loss:
26.2482
Epoch 3/50
27/27 [==============================] - 0s 4ms/step - loss: 14.4201 - val_loss:
9.0929
Epoch 4/50
27/27 [==============================] - 0s 4ms/step - loss: 6.3028 - val_loss:
6.5376
Epoch 5/50
27/27 [==============================] - 0s 4ms/step - loss: 4.5852 - val_loss:
5.6936
Epoch 6/50
27/27 [==============================] - 0s 3ms/step - loss: 3.8834 - val_loss:
5.2917
Epoch 7/50
27/27 [==============================] - 0s 3ms/step - loss: 3.4762 - val_loss:
5.0229
Epoch 8/50
27/27 [==============================] - 0s 4ms/step - loss: 3.1889 - val_loss:
4.8077
Epoch 9/50
27/27 [==============================] - 0s 3ms/step - loss: 2.9847 - val_loss:
58
4.6099
Epoch 10/50
27/27 [==============================] - 0s 3ms/step - loss: 2.7903 - val_loss:
4.4640
Epoch 11/50
27/27 [==============================] - 0s 3ms/step - loss: 2.6208 - val_loss:
4.3840
Epoch 12/50
27/27 [==============================] - 0s 3ms/step - loss: 2.4694 - val_loss:
4.2642
Epoch 13/50
27/27 [==============================] - 0s 3ms/step - loss: 2.3283 - val_loss:
4.1985
Epoch 14/50
27/27 [==============================] - 0s 3ms/step - loss: 2.2027 - val_loss:
4.1151
Epoch 15/50
27/27 [==============================] - 0s 3ms/step - loss: 2.0770 - val_loss:
4.0456
Epoch 16/50
27/27 [==============================] - 0s 3ms/step - loss: 1.9664 - val_loss:
3.9436
Epoch 17/50
27/27 [==============================] - 0s 3ms/step - loss: 1.8592 - val_loss:
3.8838
Epoch 18/50
27/27 [==============================] - 0s 4ms/step - loss: 1.7808 - val_loss:
3.8354
Epoch 19/50
27/27 [==============================] - 0s 3ms/step - loss: 1.6971 - val_loss:
3.8035
Epoch 20/50
27/27 [==============================] - 0s 3ms/step - loss: 1.6009 - val_loss:
3.7151
Epoch 21/50
27/27 [==============================] - 0s 3ms/step - loss: 1.5077 - val_loss:
3.6634
Epoch 22/50
27/27 [==============================] - 0s 3ms/step - loss: 1.4383 - val_loss:
3.6520
Epoch 23/50
27/27 [==============================] - 0s 4ms/step - loss: 1.3638 - val_loss:
3.5884
Epoch 24/50
27/27 [==============================] - 0s 4ms/step - loss: 1.3037 - val_loss:
3.6418
Epoch 25/50
27/27 [==============================] - 0s 3ms/step - loss: 1.2490 - val_loss:
59
3.5513
Epoch 26/50
27/27 [==============================] - 0s 4ms/step - loss: 1.1915 - val_loss:
3.5720
Epoch 27/50
27/27 [==============================] - 0s 3ms/step - loss: 1.1432 - val_loss:
3.4987
Epoch 28/50
27/27 [==============================] - 0s 3ms/step - loss: 1.1133 - val_loss:
3.4676
Epoch 29/50
27/27 [==============================] - 0s 3ms/step - loss: 1.0588 - val_loss:
3.4880
Epoch 30/50
27/27 [==============================] - 0s 3ms/step - loss: 1.0248 - val_loss:
3.4596
Epoch 31/50
27/27 [==============================] - 0s 3ms/step - loss: 0.9936 - val_loss:
3.4280
Epoch 32/50
27/27 [==============================] - 0s 3ms/step - loss: 0.9557 - val_loss:
3.4219
Epoch 33/50
27/27 [==============================] - 0s 3ms/step - loss: 0.9212 - val_loss:
3.4185
Epoch 34/50
27/27 [==============================] - 0s 3ms/step - loss: 0.8843 - val_loss:
3.4350
Epoch 35/50
27/27 [==============================] - 0s 3ms/step - loss: 0.8566 - val_loss:
3.4223
Epoch 36/50
27/27 [==============================] - 0s 3ms/step - loss: 0.8341 - val_loss:
3.4460
Epoch 37/50
27/27 [==============================] - 0s 3ms/step - loss: 0.7969 - val_loss:
3.4122
Epoch 38/50
27/27 [==============================] - 0s 3ms/step - loss: 0.7946 - val_loss:
3.3764
Epoch 39/50
27/27 [==============================] - 0s 3ms/step - loss: 0.7571 - val_loss:
3.4553
Epoch 40/50
27/27 [==============================] - 0s 3ms/step - loss: 0.7317 - val_loss:
3.4065
Epoch 41/50
27/27 [==============================] - 0s 3ms/step - loss: 0.7179 - val_loss:
60
3.3874
Epoch 42/50
27/27 [==============================] - 0s 3ms/step - loss: 0.7229 - val_loss:
3.3808
Epoch 43/50
27/27 [==============================] - 0s 3ms/step - loss: 0.6760 - val_loss:
3.4534
Epoch 44/50
27/27 [==============================] - 0s 3ms/step - loss: 0.6564 - val_loss:
3.4507
Epoch 45/50
27/27 [==============================] - 0s 3ms/step - loss: 0.6233 - val_loss:
3.4293
Epoch 46/50
27/27 [==============================] - 0s 3ms/step - loss: 0.6100 - val_loss:
3.4562
Epoch 47/50
27/27 [==============================] - 0s 3ms/step - loss: 0.6186 - val_loss:
3.4226
Epoch 48/50
27/27 [==============================] - 0s 3ms/step - loss: 0.5946 - val_loss:
3.4542
Epoch 49/50
27/27 [==============================] - 0s 4ms/step - loss: 0.5631 - val_loss:
3.4370
Epoch 50/50
27/27 [==============================] - 0s 4ms/step - loss: 0.5541 - val_loss:
3.3826
7/7 [==============================] - 0s 2ms/step
Mean Squared Error for student_perf: 3.3826311856242395
Performances et Observations :
• Mean Squared Error (student_mat) : 6.5515
• Les valeurs de la loss diminuent considérablement au fil des epochs, indiquant une amélioration
du modèle.
• Cependant, la validation loss est plus élevée que la loss d’entraînement, ce qui suggère une
possible surajustement.
61
Entraînement du Modèle pour student_por
• Loss (Epoch 1/50) : 132.0458
• Loss (Epoch 50/50) : 0.5597
• Validation Loss (Epoch 1/50) : 124.6308
• Validation Loss (Epoch 50/50) : 3.0295
Performances et Observations :
• Mean Squared Error (student_por) : 3.0295
• Comme pour student_mat, la loss diminue au fil des epochs, indiquant une amélioration du
modèle.
• La validation loss est également inférieure à la loss d’entraînement, ce qui est positif.
Performances et Observations :
• Mean Squared Error (student_perf) : 4.1591
• La loss diminue progressivement au cours des epochs, montrant une bonne convergence du
modèle.
• La validation loss suit également une tendance descendante, indiquant une généralisation
correcte.
Remarques Globales :
• Les modèles pour les trois ensembles de données montrent une amélioration significative au
fil des epochs.
• Cependant, des signes de surajustement peuvent être présents, en particulier pour stu-
dent_mat.
• L’évaluation de la performance du modèle sur des ensembles de données de test indépendants
est recommandée pour une évaluation plus approfondie.
Note : Ces observations sont basées sur la perte (loss) et la Mean Squared Error, d’autres métriques
et visualisations peuvent être nécessaires pour une évaluation complète.
62
for data, dataset_name, ax in zip(datasets, dataset_names, axes):
# Séparation des données en variables indépendantes (X) et dépendantes (y)
X = [Link]('G3', axis=1)
print("\n")
63
Résultats pour student_por:
Nombre total de composantes principales : 42
Nombre de composantes principales nécessaires pour expliquer 95% de la variance
: 8
Variance expliquée par les 5 premières composantes principales : 0.3014
Variance expliquée par les 10 premières composantes principales : 0.4747
64
8.9.3 Résultats pour student_perf :
• Nombre total de composantes principales : 42
• Nombre de composantes principales nécessaires pour expliquer 95% de la variance
: 8
• Variance expliquée par les 5 premières composantes principales : 30.05%
• Variance expliquée par les 10 premières composantes principales : 47.47%
8.9.4 Interprétation :
• Pour chaque ensemble de données, le nombre total de composantes principales est initialement
de 42.
• Un nombre relativement faible de composantes principales (9 pour student_mat, 8 pour
student_por et student_perf) est nécessaire pour expliquer 95% de la variance, ce qui indique
une forte capacité de réduction de dimensionnalité.
• Les cinq premières composantes principales expliquent déjà une proportion significative de
la variance (30.14% à 30.62%). L’inclusion de plus de composantes (jusqu’à 10) permet
d’atteindre une proportion encore plus élevée de la variance totale (jusqu’à 47.47%).
• Cela suggère que, pour une analyse plus concise, il peut être possible de se concentrer sur un
nombre restreint de composantes principales tout en préservant une proportion importante
de l’information contenue dans les données d’origine.
En résumé, l’analyse en composantes principales a permis de réduire efficacement la dimensionnalité
des données tout en conservant une proportion significative de la variance.
8.10 ACP
[21]: # Listes des datasets
datasets = [student_mat, student_por, student_perf]
dataset_names = ['student_mat', 'student_por', 'student_perf']
65
# Création d'un DataFrame pour faciliter la manipulation
pca_df = [Link](data=X_pca, columns=['PC1', 'PC2'])
pca_df['G3'] = y
ax.set_title(f"ACP - {dataset_name}")
ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
plt.tight_layout()
[Link]()
66
8.10.2 Résultats pour ACP - student_por :
• Variance expliquée par PC1 : 0.1032
– PC1 explique 10.32% de la variance totale dans les données de student_por.
• Variance expliquée par PC2 : 0.0647
– PC2 explique 6.47% de la variance totale dans les données de student_por.
Composantes Principales : - Les coefficients dans les composantes principales pour student_por
montrent des contributions variables des différentes variables originales à la formation des com-
posantes principales.
8.10.4 Performances :
• Les résultats indiquent que chaque ensemble de données nécessite deux composantes princi-
pales pour expliquer une proportion significative de la variance (95% dans votre cas).
• Les performances peuvent être évaluées en examinant la variance expliquée cumulée par un
nombre croissant de composantes principales.
67
fig, axes = [Link](rows, cols, figsize=(15, 10))
classification_reports = []
# Entraînement du modèle
[Link](X_train, y_train)
# Évaluation du modèle
accuracy = accuracy_score(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)
classification_rep = classification_report(y_test, y_pred, zero_division=1)
classification_reports.append((f"KNN - {dataset_name}", classification_rep))
# Affichage de l'accuracy
[Link](0.5, 1.2, f'Accuracy: {accuracy:.2f}', fontsize=10, ha='center',␣
↪va='center', transform=[Link], bbox=dict(facecolor='white', alpha=0.5))
68
Classification Report for KNN - student_mat:
precision recall f1-score support
accuracy 0.32 79
macro avg 0.40 0.25 0.25 79
weighted avg 0.41 0.32 0.32 79
69
==================================================
==================================================
70
macro avg 0.42 0.24 0.23 209
weighted avg 0.37 0.35 0.32 209
==================================================
KNN - student_por :
• Les résultats pour student_por présentent des tendances similaires à student_mat. Cepen-
dant, la précision pour certaines classes a augmenté, par exemple pour la classe 0 qui a une
précision de 100%.
• Matrice de Confusion : Les classes 10, 11, et 15 montrent des difficultés similaires à
student_mat.
KNN - student_perf :
• Les performances de student_perf présentent des similitudes avec les autres ensembles de
données, bien que les valeurs spécifiques varient. La précision, le rappel, et le F1-Score
montrent des performances variables selon la classe.
• Matrice de Confusion : Des difficultés sont observées pour les classes 1, 5, 6, et 19.
Comparaison Globale :
• Accuracy : L’accuracy est relativement basse pour les trois ensembles de données, indiquant
des difficultés pour le modèle à bien généraliser.
• Macro AVG / Weighted AVG : Les moyennes macro et pondérées montrent des perfor-
mances variables, indiquant que le modèle performe mieux pour certaines classes que pour
d’autres.
• Considérations :
– Les ensembles de données partagent des tendances communes, indiquant que le modèle
a des difficultés avec certaines classes spécifiques.
71
– Les matrices de confusion soulignent les classes où le modèle a des difficultés à classifier
correctement.
8.11.2 Conclusion :
Bien que le modèle KNN montre des performances acceptables pour certaines classes, des amélio-
rations pourraient être apportées en ajustant les hyperparamètres du modèle, en explorant d’autres
algorithmes de classification, ou en procédant à une ingénierie de fonctionnalités plus avancée. Ces
résultats fournissent des insights précieux pour guider les étapes futures du processus de modélisa-
tion.
[Link](figsize=(18, 12))
for k in k_values:
model = KNeighborsClassifier(n_neighbors=k)
accuracy_values = cross_val_score(model, X, y, cv=5, scoring='accuracy')
mean_accuracy = [Link](accuracy_values)
mean_accuracy_values.append(mean_accuracy)
72
optimal_k = k_values[[Link](mean_accuracy_values)]
optimal_accuracy = [Link](mean_accuracy_values)
[Link](X_train, y_train)
y_pred = [Link](X_test)
accuracy = accuracy_score(y_test, y_pred)
73
8.12.1 Interprétation des Résultats KNN :
• Student_mat :
– Évolution Globale : La précision augmente initialement avec le nombre de voisins (K)
jusqu’à atteindre un maximum autour de K=16, puis diminue rapidement.
– Optimal K : Le point optimal pour la précision se situe à K=16 avec une précision
d’environ 0.47.
– Comparaison avec les Autres : Student_mat présente la meilleure performance
initiale parmi les trois datasets.
• Student_por :
– Évolution Globale : La précision augmente avec le nombre de voisins, atteignant un
maximum à K=15, puis diminue progressivement.
– Optimal K : Le point optimal pour la précision se situe à K=15 avec une précision
d’environ 0.36.
– Comparaison avec les Autres : Student_por présente une évolution similaire à
student_mat, mais avec une précision maximale légèrement inférieure.
• Student_perf :
– Évolution Globale : La précision augmente initialement, atteignant un maximum à
K=17, puis diminue lentement.
– Optimal K : Le point optimal pour la précision se situe à K=17 avec une précision
d’environ 0.32.
– Comparaison avec les Autres : Student_perf montre une augmentation de la préci-
sion plus graduelle, avec une précision maximale légèrement inférieure à student_por.
8.12.3 Conclusion :
• Le choix du nombre optimal de voisins (K) dépend du dataset spécifique.
• Student_mat montre une performance initiale supérieure, mais diminue rapidement.
• Student_por a une diminution moins rapide, tandis que student_perf a une diminution encore
plus lente, mais avec une performance maximale inférieure.
• Il est crucial de considérer la stabilité de la performance à mesure que K augmente pour
prendre des décisions informées sur la configuration du modèle KNN.
74
jacentes dans les données, apprendre des caractéristiques importantes, et effectuer une compression
de données.
8.13.1 Student_mat
[24]: import numpy as np
import pandas as pd
from [Link] import StandardScaler
from sklearn.neural_network import MLPRegressor
import [Link] as plt
# Supposons que student_mat soit votre ensemble de données
# Diviser les données en fonctionnalités (X) et cible (y)
X = student_mat.drop('G3', axis=1)
y = student_mat['G3']
[Link](X_train_scaled, X_train_scaled)
for i in range(n_examples):
axes[0, i].imshow(X_test_scaled[i].reshape(1, -1), cmap='gray')
axes[0, i].set_title('Original')
axes[0, i].axis('off')
75
[Link]()
for i in range(n_examples):
# Données originales
[Link](2, n_examples, i + 1)
[Link](X_test[i].reshape(shape_correcte), cmap='gray')
[Link]("Original")
[Link]('off')
# Données reconstruites
[Link](2, n_examples, i + n_examples + 1)
[Link](decoded_data[i], cmap='gray') # Pas besoin de remodeler ici
[Link]("Reconstruit")
[Link]('off')
plt.tight_layout()
[Link]()
else:
76
print("La taille de X_test n'est pas compatible avec la nouvelle forme.")
# Calculer l'erreur quadratique moyenne (MSE) entre les données originales et␣
↪reconstruites
8.13.2 Student_por
[27]: # Diviser les données en fonctionnalités (X) et cible (y)
X = student_por.drop('G3', axis=1)
y = student_por['G3']
77
# Normaliser les données
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = [Link](X_test)
[Link](X_train_scaled, X_train_scaled)
for i in range(n_examples):
axes[0, i].imshow(X_test_scaled[i].reshape(1, -1), cmap='gray')
axes[0, i].set_title('Original')
axes[0, i].axis('off')
[Link]()
78
# Forme réelle des données
print("Forme des données :", X_test.shape)
for i in range(n_examples):
# Données originales
[Link](2, n_examples, i + 1)
[Link](X_test[i].reshape(shape_correcte), cmap='gray')
[Link]("Original")
[Link]('off')
# Données reconstruites
[Link](2, n_examples, i + n_examples + 1)
[Link](decoded_data[i], cmap='gray') # Pas besoin de remodeler ici
[Link]("Reconstruit")
[Link]('off')
plt.tight_layout()
[Link]()
else:
print("La taille de X_test n'est pas compatible avec la nouvelle forme.")
79
[29]: # Aplatir les données originales et reconstruites
X_test_flattened = X_test.reshape((X_test.shape[0], -1))
decoded_data_resized_flattened = decoded_data.reshape((decoded_data.shape[0],␣
↪-1))
# Calculer l'erreur quadratique moyenne (MSE) entre les données originales et␣
↪reconstruites
8.13.3 Student_perf
[30]: # Supposons que student_mat soit votre ensemble de données
# Diviser les données en fonctionnalités (X) et cible (y)
X = student_perf.drop('G3', axis=1)
y = student_perf['G3']
[Link](X_train_scaled, X_train_scaled)
80
for i in range(n_examples):
axes[0, i].imshow(X_test_scaled[i].reshape(1, -1), cmap='gray')
axes[0, i].set_title('Original')
axes[0, i].axis('off')
[Link]()
for i in range(n_examples):
# Données originales
[Link](2, n_examples, i + 1)
[Link](X_test[i].reshape(shape_correcte), cmap='gray')
[Link]("Original")
[Link]('off')
81
# Données reconstruites
[Link](2, n_examples, i + n_examples + 1)
[Link](decoded_data[i], cmap='gray') # Pas besoin de remodeler ici
[Link]("Reconstruit")
[Link]('off')
plt.tight_layout()
[Link]()
else:
print("La taille de X_test n'est pas compatible avec la nouvelle forme.")
# Calculer l'erreur quadratique moyenne (MSE) entre les données originales et␣
↪reconstruites
82
8.13.4 Comparaison des Performances
En comparant les performances des autoencodeurs sur les trois datasets, on observe une améliora-
tion constante de student_mat à student_por et enfin student_perf. Cela suggère que la complexité
des données et la capacité à les reconstruire de manière précise augmentent progressivement. Les
résultats démontrent également que la sélection d’une dimension plus grande améliore significative-
ment la qualité des reconstructions.
Ces analyses soulignent l’importance de prendre en compte la nature spécifique des données lors
de l’application d’autoencodeurs, et comment des ajustements simples tels que l’expansion de la
dimension peuvent influencer considérablement les résultats.
83
8.14.8 KNN - Student_por
• Précision: 31%
• Meilleur k: 15
• Accuracy: 0.36
8.16 Conclusion
En évaluant les différents modèles pour les datasets student_mat, student_por et student_perf,
nous pouvons tirer les conclusions suivantes :
1. Pour l’ensemble des datasets :
84
• Le modèle basé sur les autoencodeurs semble être le plus performant, offrant une préci-
sion élevée avec une faible erreur quadratique moyenne. Il surpasse les autres modèles
en termes de qualité de reconstruction.
2. Pour student_mat et student_por :
• Le modèle basé sur l’ACP (Analyse en Composantes Principales) est une option solide.
Il parvient à expliquer une proportion significative de la variance avec un nombre
raisonnable de composantes principales.
85