.. _td2acenoncesession4Arst: ====================================== 2A.ml - Machine Learning et Marketting ====================================== .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/td2a_ml/td2a_cenonce_session_4A.ipynb|*` Prédire la souscription d’un contrat sur le jeu de données `Bank Marketing Data Set `__. .. code:: ipython3 %matplotlib inline .. parsed-literal:: Populating the interactive namespace from numpy and matplotlib .. code:: ipython3 import matplotlib.pyplot as plt .. code:: ipython3 from jyquickhelper import add_notebook_menu add_notebook_menu() .. contents:: :local: 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. .. code:: ipython3 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) .. parsed-literal:: 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 .. code:: ipython3 with open("bank.csv","r") as fo : n = 0 for row in fo : print(row.strip("\r\n ")) n += 1 if n > 5 : break .. parsed-literal:: "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" .. code:: ipython3 import pandas df = pandas.read_csv("bank.csv",sep=";") df.tail() .. raw:: html
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 : - `train_test_split `__ - `DictVectorizer `__ - `Using DictVectorizer with sklearn DecisionTreeClassifier `__ - `iterrows `__ 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 : .. math:: 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 : .. math:: 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 : - `Receiver Operating Characteristic (ROC) `__ 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 : - `Our Favorite Recipes `__ - `How to make several plots on a single page using matplotlib? `__