Commit f030e773 authored by François Bouchet's avatar François Bouchet
Browse files

Ajout exo cours 08

parent bd26da5c
%% Cell type:markdown id: tags:
# Data Mining & Visualisation (DaMiVis)
# Séance 9 - Apprentissage non supervisé
# Séance 8 - Apprentissage non supervisé
# Exercices
*(NOM Prénom -- A EDITER)*
%% Cell type:code id: tags:
``` python
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
import pylab as pl
import seaborn as sns; sns.set()
import pandas as pd
import numpy as np
import sklearn.cluster
from sklearn.decomposition import PCA
import itertools
from scipy import linalg
```
%% Cell type:markdown id: tags:
## Exercices clustering
%% Cell type:markdown id: tags:
### Retour sur iris
* Charger le jeu de données sur les iris
* Selectionner 2 attributs
* Essayer d'appliquer un modèle de clustering avec 2, 3 et 4 clusters sur ces données
* Vérifier que le modèle avec 3 clusters est le meilleur
* Selectionner 2 attributs parmi les 4
* Essayer d'appliquer un modèle de clustering avec 1, 2, 3 et 4 clusters sur ces données
* Est-ce que le modèle avec 3 clusters est le meilleur ? (technique du coude)
%% Cell type:code id: tags:
``` python
# chargement du jeu de données
iris = _
# création de la matrice X sans l'espèce et avec seulement 2 attributs
X_iris = _
```
%% Cell type:code id: tags:
``` python
# import de K-Means
from sklearn.cluster import _
scores = []
# création d'un modèle avec X clusters (X à choisir)
model = _
# entrainement et application du modèle
y_pred = _
# affichage du tableau de clusters prédits
print(y_pred)
# ajout des clusters dans une DataFrame avec une colonne dédiée
df_iris = X_iris.join(pd.DataFrame(____)).rename({0:"cluster"},axis=1)
df_iris["cluster"] = df_iris["cluster"].astype(str) # pour avoir une variable catégorielle
# affichage en colorant les clusters
sns.pairplot(___)
```
%% Cell type:code id: tags:
``` python
# création d'un modèle avec 1 à 4 clusters
scores = []
# choix du modèle
for nbClust in range(1,4):
model = _
# entraînement et application du modèle pour trouver le cluster associé à chaque point
y_pred = _
# enregistrement du score associé à ce clustering
scores.append(model.___)
# ajout des clusters dans une DataFrame avec une colonne dédiée
df_iris = X_iris.join(pd.DataFrame(____)).rename({0:"cluster"},axis=1)
df_iris["cluster"] = df_iris["cluster"].astype(str) # pour avoir une variable catégorielle
# affichage en colorant les clusters
sns.pairplot(___)
```
%% Cell type:code id: tags:
``` python
# Détermination du nombre idéal de clusters
pl.plot(_________)
pl.xlabel('Nombre de clusters')
pl.ylabel('Score')
pl.title('Elbow Curve (coude)')
pl.show()
```
%% Cell type:markdown id: tags:
### Retour sur drinks by country
On a précédemment travaillé sur de la prédiction en fonction du continent, mais ce n'est peut-être pas le meilleur moyen de regrouper les différents pays... En utilisant la consommation de vin/bière/spiritueux comme attributs, essayer différents modèles de clustering pour repérer les points proches.
On a précédemment travaillé sur de la prédiction en fonction du continent, mais ce n'est peut-être pas le meilleur moyen de regrouper les différents pays... En utilisant la consommation de vin/bière/spiritueux comme attributs, essayer différents modèles de clustering pour repérer les points proches : comment caractériser les clusters trouvés ? Y a-t-il des pays qui sortent du lot avec des données "atypiques" ?
%% Cell type:code id: tags:
``` python
# chargement du jeu de données
df_drinks = _
# choix de la colonne servant d'index
df_drinks.set_index(___)
# renommage de colonnes (cf. TP précédent)
df_drinks.rename(columns=lambda x: str.split(x,"_")[0], inplace=True)
X_drinks = df_drinks[["beer", "spirit", "wine"]]
X_drinks.head()
```
%% Cell type:markdown id: tags:
Visualisation des données en croisant les axes 2 à 2 :
%% Cell type:code id: tags:
``` python
sns.pairplot(_)
```
%% Cell type:markdown id: tags:
Visualisation en 3D (même si pas forcément plus lisible) :
%% Cell type:code id: tags:
``` python
%matplotlib notebook
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
x = df_drinks['beer']
y = df_drinks['spirit']
z = df_drinks['wine']
ax.set_xlabel("beer")
ax.set_ylabel("spirit")
ax.set_zlabel("wine")
ax.scatter(x, y, z)
plt.show()
```
%% Cell type:code id: tags:
``` python
# retour en mode non interactif
%matplotlib inline
```
%% Cell type:markdown id: tags:
Application de K-Means sur les données : (s'inspirer de l'exercice précédent)
%% Cell type:code id: tags:
``` python
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
scores = []
y_preds = dict()
silhouettes = dict()
for nbClust in range(____):
model = _
y_pred = _
# on enregistre la prédiction dans un dictionnaire pour visualisation ultérieure
y_preds[nbClust] = y_pred
scores.append(model.score(_____))
if nbClust != 1:
silhouettes[nbClust] = silhouette_score(________)
print(scores)
print(silhouettes)
```
%% Cell type:code id: tags:
``` python
# Détermination du nombre idéal de clusters
pl.plot(_________)
pl.xlabel('Nombre de clusters')
pl.ylabel('Score')
pl.title('Elbow Curve (coude)')
pl.show()
```
%% Cell type:markdown id: tags:
Le(s) meilleur(s) nombre(s) de clusters semblent être...
%% Cell type:markdown id: tags:
Visualisation de la version à N clusters (N à choisir) :
%% Cell type:code id: tags:
``` python
df_drinks_Ncl = X_drinks.join(pd.DataFrame({"country":X_drinks.index, "cluster":______}).set_index("country"))
df_drinks_Ncl["cluster"] = df_drinks_Ncl["cluster"].astype(str)
df_drinks_Ncl
```
%% Cell type:code id: tags:
``` python
sns.pairplot(__________, height=1.5)
```
%% Cell type:markdown id: tags:
Répéter la même chose avec un mélange de gaussiennes :
%% Cell type:code id: tags:
``` python
from sklearn.mixture import GaussianMixture
# à compléter
```
%% Cell type:markdown id: tags:
Répéter l'opération avec un clustering hiérarchique. Par souci de lisibilité, on travaillera sur un jeu de données réduit :
%% Cell type:code id: tags:
``` python
X_drinks_small = X_drinks.loc[["Afghanistan", "France", "Belgium", "Spain", "Italy", "Brazil", "Indonesia", "Ukraine"]]
X_drinks_small
```
%% Cell type:code id: tags:
``` python
from scipy.cluster.hierarchy import dendrogram, linkage
# à compléter
```
%% Cell type:markdown id: tags:
## Exercices ACP
%% Cell type:markdown id: tags:
### Retour sur iris
Reprendre le jeu de données iris et déterminer 2 composantes permettant de représenter ce jeu de données normalement en 4 dimensions.
* Quel est la dimension principale associée à la première composante ? Qu'en penser ?
* Quel est le pourcentage total de variance expliqué ? Est-ce satisfaisant ?
%% Cell type:code id: tags:
``` python
from sklearn.decomposition import PCA
iris = _
X_iris = _
# création du modèle avec 2 composantes
___
# application du modèle aux données
___
```
%% Cell type:code id: tags:
``` python
# analyse des composantes extraites
___
```
%% Cell type:code id: tags:
``` python
# analyse de la variance expliquée
___
```
%% Cell type:markdown id: tags:
### Retour sur les données météo
Rappel : données à télécharger depuis https://www.kaggle.com/budincsevity/szeged-weather ou dans `data/weatherHistory.csv`
* Sélectionner les 7 features numériques dans le jeu de données météorologique (pas l'humidité)
* Appliquer une analyse en composantes principales pour réduire le nombre de composantes : quel semble être un bon nombre ?
* Appliquer à nouveau une régression linéaire pour voir si on améliore la performance du modèle : qu'en conclure ?
%% Cell type:code id: tags:
``` python
# pour la question sur la régression, import des fonctions utiles
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
```
%% Cell type:markdown id: tags:
## Exercice de réduction de dimensions et clustering sur Mushrooms
Nous allons travailler ici sur un nouveau jeu de données représentant les caractéristiques physiques de champignons avec une information relative à son caractère comestible (`class=e`) ou non (`class=p`). On souhaiterait idéalement entraîner un modèle permettant de déterminer si un champignon est comestible. Pour cela, la couleur est un bon indicateur : on souhaite donc constituer des clusters de points en fonction de la couleur des différentes parties du champignon, ce qui donnera une nouvelle feature pour un modèle de prédiction.
**Description du jeu de données :**
*This dataset includes descriptions of hypothetical samples corresponding to 23 species of gilled mushrooms in the Agaricus and Lepiota Family Mushroom drawn from The Audubon Society Field Guide to North American Mushrooms (1981). Each species is identified as definitely edible, definitely poisonous, or of unknown edibility and not recommended. This latter class was combined with the poisonous one. The Guide clearly states that there is no simple rule for determining the edibility of a mushroom; no rule like "leaflets three, let it be'' for Poisonous Oak and Ivy.*
%% Cell type:markdown id: tags:
* Charger le jeu de données `data/mushrooms.csv`
* Extraire les features correspondant aux couleurs
* Repérer d'éventuelles corrélations entre chaque paire de features
* En déduire un bon nombre de composantes pour une ACP
* Effectuer l'ACP pour réduire les dimensions
* Effectuer un clustering sur les données dans l'espace réduit
* Entraîner un modèle de classification supervisée pour prédire si un champignon est comestible ou non
%% Cell type:code id: tags:
``` python
```
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment