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()
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 |
On utilisera pour cela un GradientBoostingClassifier après avoir sciender la base en base d'apprentissage et tests. Quelques liens :
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 :
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 :
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 :