2A.ml - Machine Learning et Marketting

Links: notebook, html, PDF, python, slides, GitHub

Prédire la souscription d’un contrat sur le jeu de données Bank Marketing Data Set.

%matplotlib inline
Populating the interactive namespace from numpy and matplotlib
import matplotlib.pyplot as plt
from jyquickhelper import add_notebook_menu
add_notebook_menu()

Données

Le jeu de données Bank Marketing Data Set contient des données destinées à évaluer le fait qu’une personne souscrive un contrat. La base de données contient 45.000 observations avec 17 attributs et une variable binaire qui représente le résultat à prédire. Tout d’abord, on récupère la base de données.

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00222/"
file = "bank.zip"
import pyensae
data = pyensae.download_data(file, website=url)
downloading of  https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip  to  bank.zip
unzipped  bank-full.csv  to  .bank-full.csv
with open("bank.csv","r") as fo :
    n = 0
    for row in fo :
        print(row.strip("\r\n "))
        n += 1
        if n > 5 : break
"age";"job";"marital";"education";"default";"balance";"housing";"loan";"contact";"day";"month";"duration";"campaign";"pdays";"previous";"poutcome";"y"
30;"unemployed";"married";"primary";"no";1787;"no";"no";"cellular";19;"oct";79;1;-1;0;"unknown";"no"
33;"services";"married";"secondary";"no";4789;"yes";"yes";"cellular";11;"may";220;1;339;4;"failure";"no"
35;"management";"single";"tertiary";"no";1350;"yes";"no";"cellular";16;"apr";185;1;330;1;"failure";"no"
30;"management";"married";"tertiary";"no";1476;"yes";"yes";"unknown";3;"jun";199;4;-1;0;"unknown";"no"
59;"blue-collar";"married";"secondary";"no";0;"yes";"no";"unknown";5;"may";226;1;-1;0;"unknown";"no"
import pandas
df = pandas.read_csv("bank.csv",sep=";")
df.tail()
age job marital education default balance housing loan contact day month duration campaign pdays previous poutcome y
4516 33 services married secondary no -333 yes no cellular 30 jul 329 5 -1 0 unknown no
4517 57 self-employed married tertiary yes -3313 yes yes unknown 9 may 153 1 -1 0 unknown no
4518 57 technician married secondary no 295 no no cellular 19 aug 151 11 -1 0 unknown no
4519 28 blue-collar married secondary no 1137 no no cellular 6 feb 129 4 211 3 other no
4520 44 entrepreneur single tertiary no 1136 yes yes cellular 3 apr 345 2 249 7 other no

Exercice 1 : prédire y en fonction des attributs

On utilisera pour cela un GradientBoostingClassifier après avoir sciender la base en base d’apprentissage et tests. Quelques liens :

Exercice 2 : tracer la courbe ROC

La plupart des classifieur produisent deux chiffres en sorties : la classe et un score. Le score est souvent une probabilité et il traduit la qualité du classifieur. On s’en sert alors pour accepter ou rejeter la prédiction Sensitivity and specificity. La dénomination vrai positif, faux positif, … est assez trompeuse. Il vaut mieux retenir les définitions de précision, rappel.

Comme le classifieur retourne un score de confiance, on décide de valider ou de rejeter sa réponse si le score est supérieur ou inférieur à ce seuil :

  • si score >= seuil, on valide la réponse, qui est soit bonne (TP : True Positive), soit fausse (FP : False Positive)

  • si score < seuil, on rejete la réponse qui est soit bonne (FN : False Negative) soit fausse (True Negative)

La présicion est définie comme étant le nombre de réponses justes sur le nombre de réponses validées :

precision = \frac{TP}{TP + FP}

Le rappel est défini comme étant le nombre de réponses justes sur le nombre total de réponses justes :

rappel = \frac{TP}{TP + FN}

Dans notre cas, on définit une réponse juste comme étant le fait qu’on prédit la bonne classe. Quelques liens :

Et il faudra tracer sur le même dessin la courbe ROC de :

  • l’ensemble de la base de test

  • deux échantillons aléatoires de la base de test

Les courbes des deux échantillons aléatoires devraient illustrer la stabilité de la courbe ROC. Il est même possible de calculer un intervalle de confiance en utilisant un bootstrap.

Quelques liens sur matplotlib :