Atelier4
Atelier4
Atelier4
Recherche Scientifique
Université de Carthage Module : Machine Learning
TP 4 : Apprentissage Supervisée
Objectifs
Construire des modèles de prédiction en utilisant des algorithmes basés sur
l’apprentissage supervisée.
Evaluer et optimiser les modèles générés.
digit = load_digits()
dig = pd.DataFrame(digit['data'][0:1700])
print(dig.head())
print(digit.keys())
On remarque que le DataFrame contient 64 colonnes (de 0 à 63). Ce qui représente
l’ensemble des valeurs de la matrice de taille 8×8 (pixels).
Dans notre cas, nous sommes intéressés par les colonnes : data et target. La variable
“data” est la représentation en GrayScale d’un chiffre, et le target, représente son
étiquette. Pour afficher quelques images de la base de données MNIST, remplacez-le (i)
par le chiffre que vous voulez l’afficher.
plt.imshow(digit['images'][i], cmap='Greys_r')
1
plt.show()
Pour diviser le jeu de données en 75% de Training Set et 25% de Testing Set, on utilise la
fonction train_test_split ().
train_x = digit.data # input variables
train_y = digit.target # les étiquettes (output variable)
#découpage du jeu de données (0.25 pour indiquer 25%)
x_train,x_test,y_train,y_test=train_test_split(train_x,train_y,test_size=
0.25)
Enfin, pour entraîner un K-NN, on utilise la librairie SickitLearn qui propose la
classe KNeighborsClassifier
### Train
KNN = KNeighborsClassifier(7) # on utilise 7 voisins
KNN.fit(x_train, y_train)
Pour mesurer la performance (exactitude) de notre classifieur à 7 voisins, on utilise les 25%
des observations du jeu de test.
###Test
print(KNN.score(x_test,y_test))
Question 1 : Variez la valeur de k et étudiez la performance de KNN.
3
La classe MultinomialNB (NB pour Naïve Bayes) permet de lancer le processus
d’apprentissage avec le bayésien Naïf.
########### TRAIN ############
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
spam_filter = Pipeline([
('vectorizer', TfidfVectorizer(analyzer=process)), # messages to
weighted TFIDF score
('classifier', MultinomialNB()) # train on TFIDF vectors with NB
])
x_train, x_test, y_train, y_test = train_test_split(df['message'],
df['label'], test_size=0.20, random_state = 21)
spam_filter.fit(x_train, y_train)
Question 3 :
a) Quel est le nombre de prédictions erronées ?
b) Visualisez les prédictions erronées qui ont été classées comme du ham ?
c) Vérifiez que le message suivant est un ham ou un spam : 'Your cash-balance is
currently 500 pounds - to maximize your cash-in now, send COLLECT to 83600.'
#Calculez Rappel Précision F1 score
from sklearn.metrics import classification_report
print(classification_report(predictions, y_test))
4
nombre de population (variable prédictive X), on a le gain effectué dans cette dernière (la
variable qu’on cherche à prédire : Y).
Pour résoudre ce problème, il faut prédire le profit (la variable Y) en fonction de la taille de
la population (la variable prédictive X). On commence par charger les données contenues
dans le fichier CSV. La fonction read_csv(), renvoie un DataFrame de deux dimensions
contenant, respectivement, la taille de population et les profits effectués.
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
df = pd.read_csv("C:\\BD_ML\\univariateLinearRegression.csv")
print(len(df))
Pour pouvoir utiliser les librairies de régression de Python (stats.linregress), il faut
séparer les deux colonnes dans deux variables.
La fonction len() permet d’obtenir la taille d’un tableau.
La fonction iloc permet de récupérer une donnée via sa position.
iloc[0:len(df),0] permet de récupérer toutes les données de la ligne 0 à la ligne 97
se trouvant à la colonne d’indice 0.
#selection de la première colonne de la base (la taille de la population)
X = df.iloc[0:len(df),0]
#selection de la deuxième colonne de la base (le profit effectué)
Y = df.iloc[0:len(df),1]
Question 4 : Visualiser les données avec un scatter plot. Interprétez le résultat.
Pour appliquer la régression linéaire à une variable (univariée), on utilise le
module scipy.stats qui dispose de la fonction linregress, qui permet de faire la
régression linéaire.
#linregress() renvoie plusieurs variables de retour. On s'interesse au
slope et intercept
slope, intercept, r_value, p_value, std_err = stats.linregress(X, Y)
5
def F(x):
return slope * x + intercept
#la variable fitLine est un tableau de valeurs prédites depuis la tableau
de variables X
fitLine = F(X)
plt.scatter(X,Y)
plt.plot(X, fitLine, c='r')
plt.show()
Pour effectuer la prédiction du gain d’une population de taille 20.27, appliquons la
fonction F() qu’on a défini précédemment :
print (F(20.27))
6
import matplotlib.pyplot as plt
df = pd.read_excel("C:\BD_ML\multivariateLinearRegression.xlsx")
print(df.head())
Puis, on va récupérer le prix : les valeurs observées pour la variable Cible et les variables
prédictives : La superficie en pieds² et le nb chambre.
#Récupérer le prix : les valeurs observées pour la variable Cible
Y = df["prix"]
#Récupérer les variables prédictives : La superficie en pieds² et le nb
chambre
X = df[['taille_en_pieds_carre','nb_chambres']]
Question 5 : Visualiser les données avec un scatter plot. Interprétez le résultat.
Dans cette base, on note que les variables prédictives ont des ordres de grandeurs très
différents. En effet, le nombre de chambre d’une maison est généralement compris entre 1
et 10 alors que la superficie se compte en quelques milliers de pieds2. Pour appliquer
l’algorithme Multivariate Regression, il est nécessaire que les variables prédictives
soient du même ordre de grandeur. Généralement, il faut que la valeur de chaque variable
prédictive soient compris (approximativement) entre -1 et 1. Le
package sklearn.preprocessing propose la classe StandardScaler qui permettra de faire
du features scaling sur toutes les variables prédictives.
scale = StandardScaler()
X_scaled = scale.fit_transform(X[['taille_en_pieds_carre',
'nb_chambres']].as_matrix())
print(X_scaled)
Enfin, pour appliquer l’algorithme de régression linéaire multivariée, on utilise ici
l’Ordinary Least Squares (OLS). En effet, OLS est une méthode pour estimer une
variable cible dans un modèle de régression linéaire. Ainsi, OLS va minimiser la somme
des carrés des différences entre les réponses observées (de notre Training Set) et ceux
prédits par la fonction linéaire appliquée à nos variables prédictives.
model = sm.OLS(Y, X).fit()
print(model.summary())
La fonction prédictive obtenue :
prix_estimé = F(superficie, nb_chambres) = ε + α * superficie + β * nb_chambres
Pour tester notre modèle, on va lui fournir la taille de la maison et le nombre chambre.
def predict_price_of_house(taille_maison, nb_chambre):
return 140.8611 * taille_maison + 1.698e+04 * nb_chambre
print(predict_price_of_house(4500,5))
7
Régression polynomiale (Prédiction du salaire)
Nous allons utiliser les données de salaire des employés. Dans cet ensemble de données,
nous avons trois colonnes : Position, Level and Salary. On commence par charger les
données contenues dans le fichier Excel.
# Importez les libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
8
Pour tester une valeur de y (salaire) en fonction de X (poste, niveau) avec le modèle
généré.
# TEST
y_pred_lr = lr.predict(X) # Linear Regression
y_pred_poly = lr_2.predict(X_poly) # Polynomial Regression
Question 7
a) Dressez les plots de prédiction pour visualisez les données réelles avec la régression
linéaire ainsi que la régression polynomiale.
b) Soit un level égal à 7.5, examinez quel salaire les modèles générés prédisent et à quel
point ils ont précis.
9
# choix de deux variables : Utiliser les deux premières colonnes afin
d'avoir un problème de classification binaire
X = iris.data[:, :2]
y = (iris.target != 0) * 1 # re-étiquetage des fleurs
Question 8 : Visualisez les données dans ce jeu de données. Interprétez le résultat.
## TRAIN
model = LogisticRegression(C=1e20)
model.fit(X, y)
Pour prédire la classe de fleurs d’IRIS, on fournit des valeurs pour les deux variables
(“Sepal Length” et “Sepal Width” ) et on demande au modèle prédictif de nous indiquer la
classe de la fleur.
Question 9 : Testez les valeurs suivants [5.5, 2.5], [7, 3], [3,2] et [5,3] et déterminez les
classes attribuées par le modèle. Vérifiez les résultats obtenus sur le plot scatter dressé
au début.
Arbre de décision
Installer les packages suivants.
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus
import matplotlib.pyplot as plt
11
max_degree : (par défaut=Aucun). Ce paramètre permet de définir la profondeur
maximale d'un arbre. Si « aucun » est défini, les nœuds sont développés jusqu'à ce que
toutes les feuilles contiennent moins d'échantillons que min_samples_split. Une valeur
plus élevée de la profondeur maximale provoque unover-fittingt, et une valeur inférieure
entraîne un under-fitting.
a) Appliquez l’entropie pour le calcul de l’impureté des nœuds et fixez la profondeur à 3.
b) Générez de nouveau le graphique de l’arbre de décision. Que constatez-vous ?
c) Cette optimisation est considérée comme un pré-élagage ou un post-élagage ?
12