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.

Google Online Preview   Download

To fulfill the demand for quickly locating and searching documents.

It is intelligent file search solution for home and business.

Literature Lottery

Related searches