Apprentissage Statistique avec Python.scikit-learn
1
Apprentissage Statistique avec Python.scikit-learn
riables qualitatives complexes. Une variable binaire est simplement remplace par un codage (0, 1) mais, en prsence de plusieurs modalits,
traiter celles-ci comme des entiers na pas de sens statistique et remplacer une variable qualitative par lensemble des indicatrices (dummy
variables(0, 1)) de ses modalits complique les stratgies de slection de
modle et rend inexploitable linterprtation statistique.
Rsum
? Les implmentations en Python de certains algorithmes dans
scikit-learn sont aussi efficaces (i.e. k-means), voire beaucoup
Aprs la prparation des donnes, cette vignette introduit lutilisaplus efficaces (i.e. forts alatoires) pour des donnes volumineuses.
tion de la librairie scikit-learn pour la modlisation et lap?
R offre beaucoup plus de possibilits pour une exploration, des recherches
prentissage. Pourquoi utiliser scikit-learn ? Ou non ? Liste des
et comparaisons de modles, des interprtations mais les capacits de pafonctionnalits, quelques exemples de mise en ?uvre : exploration
ralllisation de Python sont plus performantes. Plus prcisment, lintro(ACP, AFCM, k-means), modlisation (rgression logistique, k-plus
duction de nouvelles librairies nest pas ou peu contraintes dans R comme
proches voisins, arbres de dcision, forts alatoires. Optimisation
en Python alors que celle de nouvelles mthodes dans scikit-learn
des paramtres (complexit) des modles par validation croise.
est sous contr?le dun petit groupe qui vrifie la pertinence des mthodes,
? Python pour Calcul Scientifique
seules celles reconnues sont acceptes, et lefficacit du code.
? Trafic de Donnes avec Python.Pandas
En consquences :
? Apprentissage Statistique avec Python.Scikit-learn
? Prfrer R et ses libraires si la prsentation (graphiques) des rsultats et
? Programmation lmentaire en Python
leur interprtation est prioritaire, si lutilisation et / ou la comparaison de
? Sciences des donnes avec Spark-MLlib
beaucoup de mthodes est recherche.
? Prfrer Python et scikit-learn pour mettre au point une cha?ne de
1 Introduction
traitements (pipe line) oprationnelle de lextraction une analyse privilgiant la prvision brute linterprtation et pour des donnes quantitatives
1.1 Scikit-learn vs. R
ou rendues quantitatives ("vectorisation" de corpus de textes).
En revanche, si les donnes sont trop volumineuses pour la taille du disque et
Lobjectif de ce tutoriel est dintroduire la librairie scikit-learn de Pydistribues sur les n?uds dun cluster sous Hadoop, consulter ltape suivante
thon dont les fonctionnalits sont pour lessentiel un sous-ensemble de celles
pour lutilisation de MLlib de Spark/Hadoop.
proposes par les librairies de R. Se pose alors la question : quand utiliser
scikit-learn de Python plut?t que par exemple caret de R plus com- 1.2 Fonctions de scikit-learn
plet et plus simple demploi ?
La communaut qui dveloppe cette librairie est trs active, elle volue raLe choix repose sur les points suivants :
pidement. Ne pas hsiter consulter la documentation pour des complments.
? Attention cette librairie manipule des objets de classe array de numpy
Voici une slection de ses principales fonctionnalits.
chargs en mmoire et donc de taille limite par la RAM de lordinateur ;
? Transformations (standardisation, discrtisation binaire, regroupement de
de fa?on analogue R charge en RAM des objets de type data.frame.
modalits, imputations rudimentaires de donnes manquantes) , "vectori? Attention toujours, scikit-learn (0.16) ne reconna?t pas (ou pas
sation" de corpus de textes (encodage, catalogue, Tf-idf), images.
encore ?) la classe DataFrame de pandas ; scikit-learn utilise
? Exploration : ACP, classification non supervise (mlanges gaussiens,
la classe array de numpy. Cest un problme pour la gestion de va-
Apprentissage Statistique avec
Python.scikit-learn
2
Apprentissage Statistique avec Python.scikit-learn
arbres de discrimination, et forts alatoires. Les paramtres de complexit des
modles sont optimiss par minimisation de lerreur de prvision estime par
lyse discriminante linaire et quadratique, k plus proches voisins, proces- validation croise.
sus gaussiens, classifieur baysien na?f, arbres de rgression et classificaDautres fonctionnalits sont laisses momentanment de c?t ; cela
tion (CART), agrgation de modles (bagging, random forest, adaboost, concerne les possibilits dencha?nement (pipeline) de mthodes et dautogradient tree boosting), SVM (classification, rgression, dtection daty- matisation. Il sagit, par exemple, de rpter automatiquement la sparation
piques...).
alatoire des chantillons apprentissage et test pour estimer les distributions
? Algorithmes de validation croise (loo, k-fold, VC stratifie...) et slec- des erreurs, comme cest relativement facile mettre en ?uvre en R avec la
tion de modles, optimisation sur une grille de paramtres, sparation librairie caret 2 . Ces fonctionnalits seront dveloppes en Python avec les
alatoire apprentissage et test, encha?nement (pipe line) de traitements, scnarios venir sur des donnes plus complexes et plus volumineuses.
courbe ROC.
En rsum, cette librairie est focalise sur les aspects "machine" de lapprentissage de donnes quantitatives (sries, signaux, images) volumineuses tandis 2 Exploration multidimensionnelle
que R intgre lanalyse de variables qualitatives complexes et linterprtation
2.1 Les donnes
statistique fine des rsultats au dtriment parfois de lefficacit des calculs.
Les diffrences dusage entre R et Pyhton.scikitlearn rsument fi- Les donnes "Caractres"
nalement les nuances qui peuvent tre mises en vidences entre apprentissage
Il sagit dexplorer celles de reconnaissance de caractres dont les procStatistique et apprentissage Machine.
ds dobtention et prtraitements sont dcrits sur le site de lUCI (Lichman,
2013)[3]. Les chiffres ont t saisies sur des tablettes lintrieur de cadres
1.3 Objectif
de rsolution 500 500. Des procdures de normalisation, r-chantillonnage
Lobjectif est dillustrer la mise en ?uvre de quelques fonctionnalits 1 de la spatial puis de lissage ont t appliques. Chaque caractre appara?t finalement
librairie scikit-learn.
discrtis sous la forme dune matrice 8 8 de pixels 16 niveaux de gris et
Deux jeux de donnes lmentaires sont utiliss. Celui prcdent gr avec identifi par un label. Les donnes sont archives sous la forme dune matrice
pandas et concernant le naufrage du Titanic mlange des variables explica- ou tableau trois indices. Elles sont galement archives aprs vectorisation
tives qualitatives et quantitatives dans un objet de la classe DataFrame. Pour des images sous la forme dune matrice p = 64 colonnes.
tre utilis dans scikit-learn les donnes doivent tre transformes en un
Ouvrir la fentre dun calepin ipython dans un navigateur.
objet de classe Array de numpy en rempla?ant les variables qualitatives par
# Importations
les indicatrices de leurs modalits. Lautre ensemble de donnes est entireimport matplotlib.pyplot as plt
ment quantitatif. Cest un problme classique de reconnaissance de caractres
from sklearn import datasets
qui est inclus dans la librairie scikit-learn, de mme que les trop fameux
%matplotlib inline
iris de Fisher.
propagation daffinit, ascendante hirarchique, SOM,...)
? Modle linaire gnral avec pnalisation (ridge, lasso, elastic net...), ana-
# les donnes
Ces donnes sont explores par analyse en composantes principales (caractres) ou analyse multiple des correspondances (titanic), classifies puis modlises par rgression logistique (titanic), k- plus proches voisins (caractres),
1. Consulter la documentation et ses nombreux exemples pour plus de dtails.
digits = datasets.load_digits()
# Contenu et mode dobtention
print(digits)
2. Consulter les scnarios de wikistat.fr.
3
# Dimensions
digits.images.shape
# Sous forme dun cube dimages 1797 x 8x8
print(digits.images)
# Sous forme dune matrice 1797 x 64
print(digits.data)
# Label rel de chaque caractre
print(digits.target)
Voici un aper?u des images discriminer :
images_and_labels = list(zip(digits.images,
digits.target))
for index, (image, label) in
enumerate(images_and_labels[:8]):
plt.subplot(2, 4, index + 1)
plt.axis(off)
plt.imshow(image, cmap=plt.cm.gray_r,
interpolation=nearest)
plt.title(Training: %i % label)
Titanic
Les donnes sur le naufrage du Titanic sont dcrites dans le scnario consacr pandas. Reconstruire la table de donnes en lisant le fichier .csv disponible dans ce rpertoire ou charger larchive au format HDF5.
# Lire les donnes dapprentissage
import pandas as pd
df=pd.read_csv("titanic-train.csv",skiprows=1,
header=None,usecols=[1,2,4,5,9,11],
names=["Surv","Classe","Genre","Age",
"Prix","Port"],dtype={"Surv":object,
"Classe":object,"Genre":object,"Port":object})
df.head()
# dimensions
df.shape
# Redfinir les types
Apprentissage Statistique avec Python.scikit-learn
df["Surv"]=pd.Categorical(df["Surv"],ordered=False)
df["Classe"]=pd.Categorical(df["Classe"],
ordered=False)
df["Genre"]=pd.Categorical(df["Genre"],
ordered=False)
df["Port"]=pd.Categorical(df["Port"],ordered=False)
df.dtypes
Vrifier que les donnes contiennent des valeurs manquantes, faire des imputations la mdiane dune valeur quantitative manquante ou la modalit la plus
frquente dune valeur qualitative absente.
df.count()
# imputation des valeurs manquantes
df["Age"]=df["Age"].fillna(df["Age"].median())
df.Port=df["Port"].fillna("S")
Continuer en transformant les variables.
# Discrtiser les variables quantitatives
df["AgeQ"]=pd.qcut(df_train.Age,3,labels=["Ag1",
"Ag2","Ag3"])
df["PrixQ"]=pd.qcut(df_train.Prix,3,labels=["Pr1",
"Pr2","Pr3"])
# redfinir les noms des modalits
df["Surv"]=df["Surv"].cat.rename_categories(
["Vnon","Voui"])
df["Classe"]=df["Classe"].cat.rename_categories(
["Cl1","Cl2","Cl3"])
df["Genre"]=df["Genre"].cat.rename_categories(
["Gfem","Gmas"])
df["Port"]=df["Port"].cat.rename_categories(
["Pc","Pq","Ps"])
df.head()
2.2
Analyse en composantes principales
La fonction danalyse en composantes principales (ACP) est surtout adapte lanalyse de signaux, de nombreuses options ne sont pas disponibles no-
4
Apprentissage Statistique avec Python.scikit-learn
tamment les graphiques usuels (biplot, cercle des corrlations...). En revanche
[0,1,2,3,4,5,6,7,8,9], target_name):
des rsultats sont lis la version probabiliste de lACP sous hypothse dune
plt.scatter(C[y == i,0], C[y == i,1],
c=c, label=target_name)
distribution gaussienne multidimensionnelle des donnes. Attention, lACP est
videmment centre mais par rduite. Loption nest pas prvue et les variables
plt.legend()
doivent tre rduites (fonction sklearn.preprocessing.scale) avant
plt.title("ACP Digits")
si cest ncessaire. Lattribut transform dsigne les composantes prinshow()
cipales, sous-entendu : transformation par rduction de la dimension ;
n_components fixe le nombre de composantes retenues, par dfaut toutes ; Graphique en trois dimensions.
lattribut components_ contient les n_components vecteurs propres mais
from mpl_toolkits.mplot3d import Axes3D
non normaliss, cest--dire de norme carre la valeur propre associe et donc
fig = plt.figure(1, figsize=(8, 6))
utiliser pour reprsenter les variables.
ax = Axes3D(fig, elev=-150, azim=110)
ax.scatter(C[:, 0], C[:, 1], C[:, 2], c=y,
from sklearn.decomposition import PCA
cmap=plt.cm.Paired)
X=digits.data
ax.set_title("ACP:
trois premieres composantes")
y=digits.target
ax.set_xlabel("Comp1")
target_name=[0,1,2,3,4,5,6,7,8,9]
ax.w_xaxis.set_ticklabels([])
# dfinition de la commande
ax.set_ylabel("Comp2")
pca = PCA()
ax.w_yaxis.set_ticklabels([])
# Estimation , calcul des composantes principales
ax.set_zlabel("Comp3")
C = pca.fit(X).transform(X)
ax.w_zaxis.set_ticklabels([])
# Dcroissance de la variance explique
show()
plot(pca.explained_variance_ratio_)
show()
Dautres versions danalyse en composantes principales sont proposes : kernel PCA, sparse PCA...
Diagramme bo?te des premires composantes principales.
boxplot(C[:,0:20])
show()
2.3
Classification non supervise
Excution de lalgorithme de classification non supervise (clustering) kmeans
dans un cas simple : le nombre des classes : paramtre n_clusters
Reprsentation des caractres dans le premier plan principal.
(8 par dfaut) est a priori connu. Dautres paramtres peuvent tre prciss
plt.scatter(C[:,0], C[:,1], c=y, label=target_name) ou laisss leur valeur par dfaut. Le nombre max_iter ditrations (300),
show()
le nombre n_init (10) dexcutions parmi lesquelles la meilleure en terme
de minimisation de la variance intra-classe est retenue, le mode init diniLe mme graphique avec une lgende mais moins de couleurs.
tialisation qui peut tre k-means++ (par dfaut) pour en principe acclrer
la convergence, random parmi les donnes, ou une matrice dterminant les
# attention aux indentations
centres initiaux.
plt.figure()
for c, i, target_name in zip("rgbcmykrgb",
Loption n_jobs permet dexcuter les n_init en parallle. Pour la va-
5
leur -2, tous les processeurs sauf un sont utiliss.
Les attributs en sortie contiennent les centres : cluster_centers_, les
numros de classe de chaque observation : labels_.
De nombreux critres consulter dans la documentation sont proposs pour
valuer la qualit dune classification non-supervise.
On se contente des options par dfaut dans cette illustration.
from sklearn.cluster import KMeans
from sklearn.metrics import confusion_matrix
est=KMeans(n_clusters=10)
est.fit(X)
classe=est.labels_
print(classe)
Apprentissage Statistique avec Python.scikit-learn
ax.w_zaxis.set_ticklabels([])
show()
2.4
Analyse multiple des correspondances
Les donnes "Titanic" regroupent des variables qualitatives et quantitatives.
Aprs recodage en classes (discrtisation) (cf. le scnario sur lutilisation de
pandas) des variables quantitatives, la table obtenue se prte une analyse
factorielle multiple des correspondances. Cette mthode nest pas prsente
dans les librairies courantes de python mais disponible sous la forme dune
fonction mca.py. Il est possible dinstaller la librairie correspondante ou de
simplement charger le seul module mca.py dans le rpertoire courant. Remarque, il ne serait pas plus compliqu de recalculer directement les composantes de lAFCM partir de la SVD du tableau disjonctif complet.
Ce tableau est obtenu en rempla?ant chaque variables par les indicatrices,
Les vraies classes tant connues, il est facile de construire une matrice de
ou dummy variables, de ses modalits.
confusion.
import pandas as pd
table=pd.crosstab(df["Surv"],df["Classe"])
print(table)
matshow(table)
title("Matrice de Confusion")
colorbar()
show()
# Suppression des variables quantitatives
# pour lAFCM
df_q=df.drop(["Age","Prix"],axis=1)
df_q.head()
# Indicatrices
dc=pd.DataFrame(pd.get_dummies(df_q[["Surv",
"Classe","Genre","Port","AgeQ","PrixQ"]]))
dc.head()
Il nest pas plus difficile de reprsenter les classes dans les coordonnes de
Calcul de lAFCM et reprsentations graphiques.
lACP. Cest la variable classe qui dfinit les couleurs.
fig = plt.figure(1, figsize=(8, 6))
ax = Axes3D(fig, elev=-150, azim=110)
ax.scatter(C[:, 0], C[:, 1], C[:, 2], c=classe,
cmap=plt.cm.Paired)
ax.set_title("ACP: trois premieres composantes")
ax.set_xlabel("Comp1")
ax.w_xaxis.set_ticklabels([])
ax.set_ylabel("Comp2")
ax.w_yaxis.set_ticklabels([])
ax.set_zlabel("Comp3")
import mca
mca_df=mca(dc,benzecri=False)
# Valeurs singulires
print(mca_df.L)
# Composantes principales des colonnes (modalits)
print(mca_df.fs_c())
# Premier plan principal
col=[1,1,2,2,2,3,3,5,5,5,6,6,6,7,7,7]
plt.scatter(mca_df.fs_c()[:, 0],
mca_df.fs_c()[:, 1],c=col)
................
................
In order to avoid copyright disputes, this page is only a partial summary.
To fulfill the demand for quickly locating and searching documents.
It is intelligent file search solution for home and business.