Classification Automatique de Fromages

Classification, Data Analysis, Machine Learning · lab

Voir tous les documents en intelligence artificielle et données

1

Importation des donn es, description

DONN ES

2

Objectif de l tude

Classification automatique de fromages

Objectifs de l tude

Ce document retranscrit une d marche de classification automatique dun ensemble de fromages (29

observations) d crits par leurs propri t s nutritives (ex. prot ines, lipides, etc. ; 9 variables). Lobjectif

est didentifier des groupes de fromages homog nes, partageant des caract ristiques similaires.

Nous utiliserons essentiellement deux approches en nous appuyant sur deux proc dures des packages

sp cialis s pour Python : la classification ascendante hi rarchique (CAH Package SciPy) ; la m thode des

centres mobiles (k-Means Package Scikit-Learn).

Le fichier fromage.txt provient de la page de cours de Marie Chavent de lUniversit de Bordeaux. Les

excellents supports et exercices corrig s que lon peut y trouver compl teront profit ce tutoriel qui se

veut avant tout un guide simple pour une premi re prise en main de Python dans le contexte de la

classification automatique.

Traitements r alis s

"

"

"

"

Chargement et description des donn es

Classification automatique

Pistes pour la d tection du nombre ad quat de classes

Description interpr tation des groupes

Donn es

disponibles

Label des observations

Variables actives

3

FromagescaloriessodiumcalciumlipidesretinolfolatesproteinescholesterolmagnesiumCarredelEst314353.572.626.351.630.3217020Babybel314238209.825.163.76.422.67027Beaufort401112259.433.354.91.226.612041Bleu342336211.128.937.127.520.29027Camembert264314215.919.510336.423.46020Cantal36725626428.848.85.7239030Chabichou34419287.227.990.136.319.58036Chaource292276132.925.4116.432.517.87025Cheddar406172182.332.576.44.92611028Comte39992220.532.455.91.329.212051Coulomniers30822279.225.663.621.120.58013Edam327148272.224.765.75.524.78044Emmental37860308.229.456.32.429.411045Fr.chevrepatemolle20616072.818.5150.53111.15016Fr.fondu.45292390168.52477.45.516.87020Fr.frais20nat.8041146.33.550208.31011Fr.frais40nat.1152594.87.864.322.673010Maroilles338311236.729.146.73.620.49040Morbier34728521929.557.65.823.68030Parmesan381240334.627.5905.235.78046Petitsuisse401422278.210.463.420.49.42010PontlEveque300223156.723.453421.17022Pyrenees355232178.92851.56.822.49025Reblochon309272202.324.673.18.119.78030Rocquefort37043216231.283.513.318.710025SaintPaulin29820526123.360.46.723.37026Tome321252125.527.362.36.221.88020Vacherin32114021829.349.23.717.68030Yaourtlaitent.nat.7091215.73.442.92.94.11314Fichier de donn es

Importation, statistiques descriptives et graphiques

#modification du dossier par d faut

import os

os.chdir("&")

#importation des donn es

import pandas

fromage = pandas.read_table("fromage.txt",sep="\t",header=0,index_col=0)

#dimension des donn es

print(fromage.shape)

#statistiques descriptives

print(fromage.describe())

#graphique - croisement deux deux des variables

from pandas.tools.plotting import scatter_matrix

scatter_matrix(fromage,figsize=(9,9))

Ce type de graphique nest

jamais anodin. Nous

constatons par exemple que

(1) lipides est fortement

corr l avec calories et

cholest rol (sans trop de

surprises) (remarque : la

m me information va peser

3 fois dans lanalyse) ; (2)

dans certaines

configurations, des groupes

semblent appara tre

naturellement (ex.

croisement de prot ines

et cholest rol , avec une

corr lation inter-groupes

assez marqu e).

4

Classification ascendante hi rarchique

CAH

Publicité

5

Classification ascendante hi rarchique

Utilisation du package scipy

#librairies pour la CAH

from matplotlib import pyplot as plt

from scipy.cluster.hierarchy import dendrogram, linkage

#g n rer la matrice des liens

Z = linkage(fromage_cr,method='ward',metric='euclidean')

#affichage du dendrogramme

plt.title("CAH")

dendrogram(Z,labels=fromage.index,orientation='left',color_threshold=0)

plt.show()

Le dendrogramme sugg re un d coupage en 4 groupes. On

note quune classe de fromages, les fromages frais (tout

gauche), se d marque fortement des autres au point quon

aurait pu envisager aussi un d coupage en 2 groupes seulement.

Nous y reviendrons plus longuement lorsque nous mixerons

lanalyse avec une analyse en composantes principales (ACP).

6

Classification ascendante hi rarchique

D coupage en classes Mat rialisation des groupes

#mat rialisation des 4 classes (hauteur t = 7)

plt.title('CAH avec mat rialisation des 4 classes')

dendrogram(Z,labels=fromage.index,orientation='left',color_threshold=7)

plt.show()

#d coupage la hauteur t = 7 ==> identifiants de 4 groupes obtenus

groupes_cah = fcluster(Z,t=7,criterion='distance')

print(groupes_cah)

#index tri s des groupes

import numpy as np

idg = np.argsort(groupes_cah)

#affichage des observations et leurs groupes

print(pandas.DataFrame(fromage.index ,groupes_cah ))

Le 1er groupe est constitu de fromages frais.

Le 2nd de fromages p te molle.

Le 3 me de fromages durs .

Le 4 me est un peu fourre-tout (de mon point de vue).

Mes comp tences en fromage sarr tent l (merci

Wikip dia). Pour une caract risation laide des variables

de l tude, il faut passer par des techniques statistiques

univari es (simples lire) ou multivari es (tenant compte

des relations entre les variables).

R.R. Universit Lyon 2

7

GroupeFromage1Yaourtlaitent.nat.1Fr.frais20nat.1Petitsuisse401Fr.frais40nat.2Fr.chevrepatemolle2Camembert2Chabichou2Chaource3Emmental3Parmesan3Beaufort3Comte4Pyrenees4PontlEveque4Rocquefort4SaintPaulin4Tome4Reblochon4CarredelEst4Maroilles4Vacherin4Edam4Coulomniers4Cheddar4Cantal4Bleu4Babybel4Morbier4Fr.fondu.45M thode des centres mobiles

K-MEANS

8

Groupes issus du clustering

M thode des centres mobiles

Utilisation du package scikit-learn

#k-means sur les donn es centr es et r duites

from sklearn import cluster

kmeans = cluster.KMeans(n_clusters=4)

kmeans.fit(fromage_cr)

#index tri s des groupes

idk = np.argsort(kmeans.labels_)

#affichage des observations et leurs groupes

print(pandas.DataFrame(fromage.index ,kmeans.labels_ ))

#distances aux centres de classes des observations

print(kmeans.transform(fromage_cr))

#correspondance avec les groupes de la CAH

pandas.crosstab(groupes_cah,kmeans.labels_)

Correspondance CAH K-Means

Le groupe 1 de la CAH co ncide avec

le groupe 1 des K-Means. Apr s, il y a

certes des correspondances, mais

Publicité

elles ne sont pas exactes.

Distances aux centres de classes pour chaque individu

(avec en couleur les min. respectifs)

R.R. Universit Lyon 2

9

Groupe0123CarredelEst2.225.535.222.92Babybel3.025.192.790.74Beaufort5.167.511.152.86Bleu3.246.123.902.11Camembert1.935.405.103.54Cantal4.026.302.201.19Chabichou1.785.934.533.39Chaource1.035.555.093.46Cheddar3.756.822.291.95Comte5.447.841.353.42Coulomniers1.964.844.752.49Edam4.236.131.342.25Emmental5.537.480.903.40Fr.chevrepatemolle3.105.017.095.54Fr.fondu.452.845.284.451.89Fr.frais20nat.5.330.687.616.00Fr.frais40nat.4.551.017.325.61Maroilles4.206.462.451.53Morbier3.476.062.500.65Parmesan5.237.942.113.60Petitsuisse404.381.217.135.40PontlEveque3.084.693.521.26Pyrenees3.285.712.810.71Reblochon2.745.312.940.81Rocquefort3.026.814.222.18SaintPaulin3.475.122.671.37Tome2.735.253.671.26Vacherin3.795.272.631.50Yaourtlaitent.nat.6.091.937.465.94ClasseFromages0CarredelEst0Camembert0Fr.chevrepatemolle0Chabichou0Chaource0Coulomniers1Petitsuisse401Fr.frais40nat.1Fr.frais20nat.1Yaourtlaitent.nat.2Parmesan2Edam2Emmental2Beaufort2Comte3Tome3SaintPaulin3Rocquefort3Reblochon3Pyrenees3PontlEveque3Cheddar3Morbier3Maroilles3Bleu3Vacherin3Cantal3Babybel3Fr.fondu.45M thode des centres mobiles

Aide la d tection du nombre ad quat de groupes

K-MEANS, la diff rence de la CAH, ne fournit pas doutils daide la d tection du nombre de

classes. Nous devons les programmer sous Python ou utiliser des proc dures propos es par

des packages d di s. Le sch ma est souvent le m me : on fait varier le nombre de groupes et

on surveille l volution dun indicateur de qualit de la solution c.- -d. laptitude des individus

tre plus proches de ses cong n res du m me groupe que des individus des autres groupes.

Dans ce qui suit, on calcule la m trique silhouette pour diff rents nombres de groupes issus

de la m thode des centres mobiles.

#librairie pour valuation des partitions

from sklearn import metrics

#utilisation de la m trique "silhouette"

#faire varier le nombre de clusters de 2 10

res = np.arange(9,dtype="double")

for k in np.arange(9):

km = cluster.KMeans(n_clusters=k+2)

km.fit(fromage_cr)

res = metrics.silhouette_score(fromage_cr,km.labels_)

print(res)

#graphique

import matplotlib.pyplot as plt

plt.title("Silhouette")

plt.xlabel("# of clusters")

plt.plot(np.arange(2,11,1),res)

plt.show()

La partition en k = 2

groupes semble la

meilleure au sens de la

m trique silhouette .

10

Analyses univari es et multivari es

INTERPR TATION DES

CLASSES

11

Interpr tation des classes

Statistiques comparatives

Lid e est de comparer les moyennes des variables actives conditionnellement aux groupes. Il

est possible de quantifier globalement lamplitude des carts avec la proportion de variance

expliqu e (carr du rapport de corr lation). La d marche peut tre tendue aux variables

illustratives. Pour les cat gorielles, nous confronterions les distributions conditionnelles.

Lapproche est simple et les r sultats faciles lire. Rappelons cependant que nous ne tenons

pas compte des liaisons entre les variables dans ce cas.

#moyenne par variable

m = fromage.mean()

#TSS

TSS = fromage.shape[0]*fromage.var(ddof=0)

print(TSS)

#data.frame conditionnellement aux groupes

gb = fromage.groupby(kmeans.labels_)

#effectifs conditionnels

nk = gb.size()

print(nk)

#moyennes conditionnelles

mk = gb.mean()

print(mk)

#pour chaque groupe cart la moyenne par

variable

EMk = (mk-m)**2

#pond r par les effectifs du groupe

EM = EMk.multiply(nk,axis=0)

#somme des valeurs => BSS

Publicité

BSS = np.sum(EM,axis=0)

print(BSS)

#carr du rapport de corr lation

#variance expliqu e par l'appartenance aux groupes

#pour chaque variable

R2 = BSS/TSS

print(R2)

Effec. Cond.

4

0

5

1

6

2

14

3

Carr Rapport de corr.

calories

sodium

calcium

lipides

retinol

folates

proteines

cholesterol

magnesium

0.863799

0.599117

0.620108

0.851983

0.382815

0.760722

0.810316

0.797596

0.796207

La d finition des groupes est avant

tout domin e par les teneurs en

graisses (lipides, cholest rol et

calories rel vent de la m me id e) et

en prot ines.

Le groupe n 0 est fortement

d termin par ces variables, les

moyennes conditionnelles sont tr s

diff rentes.

Moyennes conditionnelles

calories sodium calcium

lipides

retinol

folates

0 101.750000 44.750000 133.75 6.275000 55.150000 16.475000

1 377.200000 130.400000 278.98 29.460000 64.560000 3.120000

2 288.000000 252.916667 110.10 23.866667 95.866667 31.266667

3 334.285714 267.428571 199.70 27.500000 60.050000 7.728571

cholesterol

proteines

0 7.200000

18.250000 11.250000

1 29.120000 102.000000 45.400000

68.333333 21.666667

2 18.883333

83.571429 27.142857

3 21.228571

magnesium

12

Interpr tation des classes

Analyse en composantes principales (ACP)

Publicité

Avec lACP, nous tenons compte des liaisons entre les variables. Lanalyse est

plus riche. Mais il faut savoir lire correctement les sorties de lACP.

#ACP

from sklearn.decomposition import PCA

acp = PCA(n_components=2).fit_transform(fromage_cr)

#projeter dans le plan factoriel

#avec un code couleur diff rent selon le groupe

#remarquer le r le de zip() dans la boucle

for couleur,k in zip(['red','blue','lawngreen','aqua'],[0,1,2,3]):

plt.scatter(acp ,acp ,c=couleur)

plt.show()

Il y a un probl me. Le groupe des fromages frais (n de groupe = 0)

crase linformation disponible et tasse les autres fromages dans un

bloc qui soriente diff remment.

De fait, si lon comprend bien la nature du groupe n 0 des fromages

frais, les autres sont plus compliqu s comprendre lorsquils sont

replac s dans le premier plan factoriel.

13

A la lumi re des r sultats de lACP

COMPL TER LANALYSE

14

Approfondir lanalyse

Retirer les fromages frais du jeu de donn es

Les fromages frais sont tellement particuliers loign s de lensemble des autres observations

quils masquent des relations int ressantes qui peuvent exister entre ces produits. Nous

reprenons lanalyse en les excluant des traitements.

#retirer des observations le groupe n 0 du k-means pr c dent

fromage_subset = fromage.iloc

print(fromage_subset.shape)

#centrer et r duire

fromage_subset_cr = preprocessing.scale(fromage_subset)

#g n rer la matrice des liens

Z_subset = linkage(fromage_subset_cr,method='ward',metric='euclidean')

#cah et affichage du dendrogramme

plt.title("CAH")

dendrogram(Z_subset,labels=fromage_subset.index,orientation='left',color_threshold=7)

plt.show()

#groupes

groupes_subset_cah = fcluster(Z_subset,t=7,criterion='distance')

print(groupes_subset_cah)

3 groupes se distinguent. On a

moins le ph nom ne d crasement

constat dans lanalyse pr c dente.

15

Approfondir lanalyse

Retirer les fromages frais du jeu de donn es (2/2)

#ACP

acp_subset = PCA(n_components=2).fit_transform(fromage_subset_cr)

#projeter dans le plan factoriel

#avec un code couleur selon le groupe

#remarquer le r le de zip()

plt.figure(figsize=(10,10))

for couleur,k in zip(['blue','lawngreen','aqua'],[1,2,3]):

plt.scatter(acp_subset ,acp_subset ,c=couleur)

#mettre les labels des points

#remarquer le r le de enumerate()

for i,label in enumerate(fromage_subset.index):

plt.annotate(label,(acp_subset ,acp_subset ))

plt.show()

Les groupes sont constitu s essentiellement sur le 1er facteur.

Quelques fromages ont chang de camp par rapport lanalyse

pr c dente.

16

17