2A.ml - Machine Learning et Marketting#
Links: notebook
, html, 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.datasource
data = pyensae.datasource.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 :
Le rappel est défini comme étant le nombre de réponses justes sur le nombre total de réponses justes :
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 :