Vous êtes sur la page 1sur 19

FOUILLE DE DONNÉES

CORRECTION TP2
PRÉSENTÉ PAR

M. Taoufik BEN ABDALLAH M. Ali BEN MRAD


 taoufik.benabdallah@iit.ens.tn  benmradali2@gmail.com
2022-2023 ⚫
Travaux pratiques n°2

Importation des bibliothèques


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split, cross_val_predict


from sklearn.preprocessing import OneHotEncoder
from sklearn.tree import DecisionTreeClassifier, export_graphviz, export_text
from sklearn.metrics import confusion_matrix, accuracy_score,
precision_score, recall_score

from graphviz import Source

import warnings
warnings.filterwarnings('ignore')

IIT-Sfax
Taoufik Ben Abdallah 2
Travaux pratiques n°2

1. Charger le jeu de donnée credits.csv dans une variable nommée 𝒅𝒂𝒕𝒂_𝒄𝒓𝒆𝒅𝒊𝒕


(utiliser la fonction read_csv de la bibliothèque pandas). Afficher les 𝟓 premières lignes
de 𝒅𝒂𝒕𝒂_𝒄𝒓𝒆𝒅𝒊𝒕

#Assemblage Google Drive dans Colaboratory


from google.colab import drive
drive.mount('/content/drive')

#Chargement du fichier

data_credit=pd.read_csv('/content/drive/MyDrive/credit.csv')
data_credit.head()

IIT-Sfax
Taoufik Ben Abdallah 3
Travaux pratiques n°2

2. Déterminer l’histogramme de la répartition des classes de 𝒅𝒂𝒕𝒂_𝒄𝒓𝒆𝒅𝒊𝒕 (utiliser la


fonction countplot de la bibliothèque seborn)

plt.title("Répartition des classes")


sns.countplot(x='C',data=data_credit)

# Autre solution
plt.title("Répartition des classes")
plt.hist(data_credit['C'], bins=2,rwidth = 0.5)
positions = (0.25, 0.75)
labels = ('+','-')
plt.xticks(positions, labels)
plt.show()

IIT-Sfax
Taoufik Ben Abdallah 4
Travaux pratiques n°2

3. Transformer les attributs discrets avec 𝒎 modalités en 𝒎 attributs binaires en un


dataframe nommé 𝒅𝒂𝒕𝒂_𝒕
(utiliser la classe OneHotEncoder de la bibliothèque sklearn.preprocessing).Afficher les
5 premières lignes de 𝒅𝒂𝒕𝒂_𝒕
𝑨𝟏 : b, a 𝑨𝟓 : g, p, gg 𝑨𝟗 : t, f 𝑨𝟏𝟑 : g, p, s
𝑨𝟐 : numérique 𝑨𝟔 : c, d, cc, i, j, k, m, r, q, w, x, e, aa, ff 𝑨𝟏𝟎 : t, f 𝑨𝟏𝟒 : numérique
𝑨𝟑 : numérique 𝑨𝟕 : v, h, bb, j, n, z, dd, ff, o 𝑨𝟏𝟏 : numérique 𝑨𝟏𝟓 : numérique
𝑨𝟒 : u, y, l, t 𝑨𝟖 : numérique 𝑨𝟏𝟐 : t, f 𝑪 : + ou -
col_cat = [0, 3, 4, 5, 6, 8, 9, 11, 12]

X_cat=data_credit.iloc[:,col_cat]

enc = OneHotEncoder(sparse=False)
arr=enc.fit_transform(X_cat)
data_t=pd.DataFrame(arr)

data_t.head()

IIT-Sfax
Taoufik Ben Abdallah 5
Travaux pratiques n°2

IIT-Sfax
Taoufik Ben Abdallah 6
Travaux pratiques n°2

4. Construire le dataframe 𝒅𝒇_𝒄𝒓𝒆𝒅𝒊𝒕 en concaténant les colonnes de 𝒅𝒂𝒕𝒂_𝒕 avec les


colonnes des attributs continus de 𝒅𝒂𝒕𝒂_𝒄𝒓𝒆𝒅𝒊𝒕 (y compris la classe 𝑪).
Afficher les 3 premières lignes de 𝒅𝒇_𝒄𝒓𝒆𝒅𝒊𝒕

col_num = [1, 2, 7, 10,13, 14]

df_credit=pd.concat([data_t,
data_credit.iloc[:,col_num],
data_credit['C']], axis=1,ignore_index=True)

for i in range(df_credit.shape[1]-1):
df_credit=df_credit.rename(columns={i: 'A'+str(i+1)})
df_credit=df_credit.rename(columns={df_credit.shape[1]-1: 'C'})

df_credit.head(3)

IIT-Sfax
Taoufik Ben Abdallah 7
Travaux pratiques n°2

5. Transformer 𝒅𝒇_𝒄𝒓𝒆𝒅𝒊𝒕 en deux tableaux (ndarray) 𝑿 et 𝒀; 𝑿 contient les valeurs


des variables descripteurs, et 𝒀 contient les valeurs de la variable à prédire.
Afficher 𝑿 et 𝒀

X = df_credit.iloc[:,:df_credit.shape[1]-1].values
Y = df_credit.iloc[:, df_credit.shape[1]-1].values

print("X=\n", X)
print("Y=\n", Y)

IIT-Sfax
Taoufik Ben Abdallah 8
Travaux pratiques n°2

6. Séparer les données en deux parties : 𝟕𝟎% sélectionnées aléatoirement sans


répétions pour l’apprentissage (𝑿_𝒕𝒓𝒂𝒊𝒏, 𝒀_𝒕𝒓𝒂𝒊𝒏), et les 𝟑𝟎% restantes pour le test
(𝑿_𝒕𝒆𝒔𝒕, 𝒀_𝒕𝒓𝒂𝒊𝒏) (appliquer la fonction train_test_split de la bibliothèque
sklearn.model_selection)

X_train, X_test, Y_train, Y_test = train_test_split(X, Y,


test_size=0.3, random_state=1) L’utilisation de train_test_split avec
random_state=1 donne des résultats similaires
chaque fois que vous exécutez le code
7. Générer un modèle, nommé 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟏, en appliquant l’algorithme d’arbre de
décision CART (utiliser la classe DecisionTreeClassifier de la bibliothèque sklearn.tree
sans modifier ses paramètres)
cls_credit1 = DecisionTreeClassifier()
cls_credit1.fit(X_train,Y_train)

cls_credit1.classes_

IIT-Sfax
Taoufik Ben Abdallah 9
Travaux pratiques n°2

8. Représenter graphiquement l’arbre de décision associé à 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟏 (utiliser la


fonction export_graphviz de la bibliothèque sklearn.tree et la fonction Source de la
bibliothèque graphviz)
features=list(df_credit)
dot_data = export_graphviz(cls_credit1,
feature_names=features[:len(features)-1],
class_names=cls_credit1.classes_)
Source(dot_data)

9. Générer les règles de décisions associées à 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟏 (utiliser la fonction


export_text de la bibliothèque sklearn.tree)

r = export_text(cls_credit1,
feature_names=features[:len(features)-1])
print(r)

IIT-Sfax
Taoufik Ben Abdallah 10
Travaux pratiques n°2

10. Représenter graphiquement la matrice de confusion associée aux données


d'apprentissage en utilisant le modèle 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟏 (utiliser la fonction heatmap de la
bibliothèque seaborn)

Y_p_train = cls_credit1.predict(X_train)

cm=confusion_matrix(Y_train, Y_p_train)
print(cm)

sns.heatmap(cm, annot=True, fmt="d",


xticklabels=['+','-'], yticklabels=['+','-'])

IIT-Sfax
Taoufik Ben Abdallah 11
Travaux pratiques n°2

11. Calculer le taux de classification correcte (Accuracy) associé aux données


d’apprentissage (utiliser la fonction accuracy_score de la bibliothèque sklearn.metrics)

accuracy_score(Y_train,Y_p_train)

12. Représenter la matrice de confusion associée aux données de test selon


𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟏 . Puis, calculer le taux de classification correcte, la sensitivité, et la précision
de la classe "+"
Y_test_p1=cls_credit1.predict(X_test)
print(confusion_matrix(Y_test,Y_test_p1))

print("Accuracy (Test)= {:.3f}".format(accuracy_score(Y_test,Y_test_p1)))

print("recall (+)= {:.3f}".format(recall_score(Y_test,Y_test_p1,


pos_label="+")))
print("precision (+)= {:.3f}".format(precision_score(Y_test,Y_test_p1,
pos_label='+')))

IIT-Sfax
Taoufik Ben Abdallah 12
Travaux pratiques n°2

13. Générer un modèle, nommé 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟐, en appliquant l’algorithme d’arbre de


décision CART dont la profondeur maximale d’arbre est égal à 3 (max_depth=3), et le
nombre de descripteurs à examiner pour trouver la meilleure répartition est égal à
n_feat (max_features="sqrt")

cls_credit2 = DecisionTreeClassifier(max_depth=3,
max_features="sqrt")

"auto" (valeur par défaut) →max_features=sqrt(n_features)


"sqrt"→max_features=sqrt(n_features)
"log2"→max_features=log2(n_features)
None →max_features=n_features

int → max_features=the int given in parameter (≤ n_features).


float [0..1] → max_features= the flaot given in parameter × n_features

IIT-Sfax
Taoufik Ben Abdallah 13
Travaux pratiques n°2

14. Représenter la matrice de confusion associée 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟐 en appliquant 10-validations


croisées (utiliser la fonction cross_val_predict de la bibliothèque sklearn.model_selection).
Déduire l’Accuracy de 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟐

y_pred = cross_val_predict(cls_credit2, X, Y, cv=10)

print(confusion_matrix(Y,y_pred))

print("Accuracy: {:.3f}".format(accuracy_score(Y,y_pred)))

#ou bien
from statistics import mean
scores=cross_val_score(cls_credit2, X, Y, cv=10)
print(scores)
print("Accuracy: {:.3f}".format(scores.mean()))

IIT-Sfax
Taoufik Ben Abdallah 14
Travaux pratiques n°2

15. Générer un modèle, nommé 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟑, en appliquant l’algorithme de forêts


aléatoires (Random Forest). (utiliser la classe RandomForestClassifier de la
Spécifier bibliothèque sklearn.ensemble)
✓ Le nombre d’arbres à 120 (n_estimators=120)
✓ Le nombre de descripteurs à examiner pour trouver la meilleure répartition à 30
(max_features=30)
✓ Le nombre d’observations à tirer aléatoirement avec remise de la base
d’apprentissage (𝑿_𝒕𝒓𝒂𝒊𝒏, 𝒀_𝒕𝒓𝒂𝒊𝒏) dans la construction de chaque arbre à 63%
(max_samples=0.63)

from sklearn.ensemble import RandomForestClassifier

cls_credit3 = RandomForestClassifier(n_estimators=120,max_features=30,
bootstrap=True, max_samples=0.63)

cls_credit3.fit(X_train,Y_train)

IIT-Sfax
Taoufik Ben Abdallah 15
Travaux pratiques n°2

16. Calculer l’accuracy associé aux données d’apprentissage et de test en utilisant


𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟑

Y_train_p=cls_credit3.predict(X_train)

Y_test_p=cls_credit3.predict(X_test)

print("Accuracy (Train)= {:.3f}".format(accuracy_score(Y_train,Y_train_p)))

print("Accuracy (Test)= {:.3f}".format(accuracy_score(Y_test,Y_test_p)))

IIT-Sfax
Taoufik Ben Abdallah 16
Travaux pratiques n°2

17. Représenter la courbe d’évaluation d’erreur de 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟑 en fonction du nombre d’arbres


(n_estimators= 𝟏𝟎. . 𝟐𝟎𝟎 , 𝐩𝐚𝐬 = 𝟐𝟎) sur les données out-of-bag (OOB) de la base d’apprentissage
extraites lors de la construction de chaque arbre du forêt. Déduire le nombre optimal d’arbres n_estimators

error_rate=[]
nbt=list(range(10, 200,20))
for i in nbt :
cls_credit3.set_params(n_estimators=i)
cls_credit3.fit(X_train,Y_train) #15
oob_error = 1 - cls_credit3.oob_score_ cls_credit3 = RandomForestClassifier(
error_rate.append(oob_error) n_estimators=120, max_features=30,
bootstrap=True, max_samples=0.63,
oob_score=True)
plt.plot(nbt, error_rate)
plt.xlim(10, 200)
plt.xlabel("n_estimators"); plt.ylabel("OOB error rate")
plt.show()

min_value = min(error_rate)
print ("n_estimators*=", nbt[error_rate.index(min_value)])
IIT-Sfax
Taoufik Ben Abdallah 17
‫الحصة الحادية عشر‬
Travaux pratiques n°2

18. Représenter la courbe ROC associée au modèle 𝒄𝒍𝒔_𝒄𝒓𝒆𝒅𝒊𝒕𝟑 sur les données de test, puis déduire
son AUC (utiliser les fonctions roc_curve et roc_auc_score de la bibliothèque sklearn.metrics)

from sklearn.metrics import roc_curve,roc_auc_score


#ar=cls_credit3.predict_proba(X)
ar=cls_credit3.predict_proba(X_test)[:,0] print(ar.shape) #(653, 2)

#print (cls_credit3.classes_) # ['+' '-']


fpr, tpr, thresholds =roc_curve(Y_test,ar,pos_label='+')

plt.plot(fpr, tpr)
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.show()

auc_dt = roc_auc_score(Y_test,ar)
print("AUC=", auc_dt)

IIT-Sfax
Taoufik Ben Abdallah 19

Vous aimerez peut-être aussi