<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Iwannadata]]></title><description><![CDATA[Data Sport]]></description><link>https://www.iwannadata.com/</link><image><url>https://www.iwannadata.com/favicon.png</url><title>Iwannadata</title><link>https://www.iwannadata.com/</link></image><generator>Ghost 1.25</generator><lastBuildDate>Mon, 23 Mar 2026 17:59:49 GMT</lastBuildDate><atom:link href="https://www.iwannadata.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[ACARS : exemple d'une application de streaming sous Spark]]></title><description><![CDATA[<div class="kg-card-markdown"><p>À proximité de l'aéroport d'Orly un ami se plaignait que les appareils ne respectaient pas toujours les couloirs aériens, connaissant la possibilité de recevoir la position des appareils je me suis amusé à créer une application qui relevait la présence d'un aéronef dans une zone définie à une altitude minimale</p></div>]]></description><link>https://www.iwannadata.com/a/</link><guid isPermaLink="false">5de2856377760a67b304fb2d</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Sat, 19 Dec 2020 15:07:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>À proximité de l'aéroport d'Orly un ami se plaignait que les appareils ne respectaient pas toujours les couloirs aériens, connaissant la possibilité de recevoir la position des appareils je me suis amusé à créer une application qui relevait la présence d'un aéronef dans une zone définie à une altitude minimale définie. Cela a constitué un bon apprentissage des données flux sous Spark.</p>
<img alt="Image Description" src="https://www.iwannadata.com/content/images/2022/07/diagram.gif" style="width: 542px; height:381px">
<hr>
<br>
<h4 id="volsaronefs">Vols aéronefs</h4>
<p>Selon la définition de Air France :<br>
L'ACARS (Aircraft Communication Addressing and Reporting System) est un système permettant l'échange d'informations (messages) entre l'avion et le sol sous forme numérique codée par liaison radio ou satellite.</p>
<p>Pour capter ce flux de données qui émettent sur 1090 MHz il est possible d'utiliser une simple clé usb qui reçoit la TNT et d'y ajouter une petite antenne spécifique.</p>
<p>Le site Flight24 de manière plus professionnel utilise essentiellement les flux de données de type ACARS.</p>
<br>
<h4 id="logicielpermettantletraitementduflux">Logiciel permettant le traitement du flux</h4>
<p>Les données brutes de données de type ACARS ne sont pas directement utilisables, elles nécessitent un traitement complexe réalisé par le logiciel freeware dump1090.</p>
<p>Un exemple des données de sortie de dump1090<br>
<font size="2"><br>
MSG,4,111,11111,400804,111111,2020/05/16,15:57:34.670,2020/05/16,15:57:34.665,,,390,326,,,64,,,,,0<br>
MSG,6,111,11111,406091,111111,2020/05/16,15:57:34.719,2020/05/16,15:57:34.670,,,,,,,,2041,0,0,0,0<br>
MSG,8,111,11111,800734,111111,2020/05/16,15:57:34.752,2020/05/16,15:57:34.732,,,,,,,,,,,,0<br>
MSG,8,111,11111,AE4BE6,111111,2020/05/16,15:57:34.752,2020/05/16,15:57:34.732,,,,,,,,,,,,0<br>
MSG,7,111,11111,800734,111111,2020/05/16,15:57:34.765,2020/05/16,15:57:34.734,ka,37000,,,,,,,,,,0<br>
MSG,8,111,11111,AE4BE6,111111,2020/05/16,15:57:34.768,2020/05/16,15:57:34.735,,,,,,,,,,,,0<br>
MSG,8,111,11111,400804,111111,2020/05/16,15:57:34.792,2020/05/16,15:57:34.737,me,,,,,,,,,,,0<br>
MSG,8,111,11111,AE4BE6,111111,2020/05/16,15:57:34.792,2020/05/16,15:57:34.737,,,,,,,,,,,,0<br>
MSG,8,111,11111,400804,111111,2020/05/16,15:57:34.800,2020/05/16,15:57:34.796</font></p>
<p><a href="http://www.iwannadata.com/dump1090/">Explication des variables de dump1090</a><br>
<br><br>
Sur ces 22 variables, nous allons en retenir 5 pour réaliser le filtrage:</p>
<ul>
<li>icao : Numéro d'identification de l'appareil indépendant de la compagnie</li>
<li>callsign : Identifiant de l'appareil lié à la compagnie</li>
<li>altitude : Altitude</li>
<li>latitude : Latitude</li>
<li>longitude : Longitude</li>
</ul>
<br>
<h4 id="sparkstreaming">Spark streaming</h4>
<p>Dans les multiples possibilités offertes par Spark il est possible de traiter des données streaming en temps réels.<br>
L'outil dump1090 permet de transmettre les données Acars en mode réseau, Spark peut récupérer ce type de flux (socketTextStream) et transformer ces données pour réaliser un traitement.<br>
<br><br>
L'objectif initial est de définir une zone de contrôle et une altitude minimale à ne pas dépasser.</p>
<p>Pour créer le programme de traitement, il y aura trois étapes :<br>
<br></p>
<p><strong>1. Réaliser le programme avec un jeu de données fixes afin de réaliser des tests</strong></p>
<ul>
<li>La zone de test<br>
Elle est située au nord de Paris, latitude strictement supérieure à 48,903296 et strictement inférieure à 48,924444, longitude strictement supérieure à 2,331250 et strictement inférieure à 2,385399, l'altitude est strictement inférieure à 15000 pieds.<br>
<img alt="Image Description" src="https://www.iwannadata.com/content/images/2022/07/perimetre.png" style="width: 376px; height:218px"></li>
<li>Avec l'outil dump1090 dans un parc parisien j'ai réalisé la captation des données sur une période de 28 minutes, 103 435 lignes soit un peu moins de 4 000 lignes par minutes avec une antenne artisanale. <a href="https://alfardshare.s3.eu-west-1.amazonaws.com/blog/Doc/Acars/3003nc5.7z">Lien du fichier</a></li>
<li>On traite les données afin qu'elles correspondent à la zone de test, on réalise différentes jointures afin de récupérer le icao et le callsign et avoir ces données sur une même ligne, car les données acars sont émises sous formes de packet de données différents.<br>
<br></li>
</ul>
<p><strong>2. Refaire le programme avec des données temps réels</strong></p>
<ul>
<li>Le traitement des données est réalisé toutes les 5 minutes c'est-à-dire que pendant 5 minutes les données Acars s'écrivent dans Spark, le traitement et le filtrage sont réalisé après 5 minutes (StreamingContext(sc, Minutes(5)))</li>
<li>Pour éviter qu'un échec de l'application entraine une perte des données, des checkpoints sont mis en places dans un environnement de données sécurisées de type hdfs Hadoop</li>
<li>À noter que dans le programme il y a une simplification, la date du traitement du programme est la date de l'événement</li>
<li>Le résultat du traitement est copier dans un disque hdfs sous le format suivant :<br>
(4CAA7B,AZA312,7425.0,48.91099,2.33134,2020/05/16,16:14:19.638)<br>
(440452,EJU89ZB,8775.0,48.9082,2.33269,2020/05/16,16:23:44.883)<br>
(440452,EJU89ZB,8775.0,48.90811,2.33149,2020/05/16,16:23:45.433)<br>
(392AEE,AFR1889,8300.0,48.90946,2.33734,2020/05/16,16:16:03.400)<br>
(392AEE,AFR1889,8300.0,48.90939,2.33636,2020/05/16,16:16:03.841)<br>
icao,callsign,altitude, longitude, latitude, date</li>
</ul>
<br>
<p><strong>3. Il faut créer un exécutable de l'application</strong><br>
Pour Spark sous scala nous utiliserons SBT.</p>
<ul>
<li><a href="https://alfardshare.s3.eu-west-1.amazonaws.com/blog/Doc/Acars/v1.html">Lien de l'éxecutable en html</a></li>
<li><a href="https://alfardshare.s3.eu-west-1.amazonaws.com/blog/Doc/Acars/Streamv3.zip">Lien de l'éxecutable avec en plus la configuration SBT</a></li>
</ul>
</div>]]></content:encoded></item><item><title><![CDATA[What's up doc ?]]></title><description><![CDATA[<div class="kg-card-markdown"><h2 id="basetarget_blank"><base target="_blank"></h2>
<p>En France chaque année il y a plus de 10 000 décès liés à un mauvais usage des médicaments c'est-à-dire <em>&quot;un mauvais dosage, mauvaise prise, non-respect du traitement prescrit, interaction entre plusieurs médicaments&quot;</em>.</p>
<p>Dans cette étude nous nous intéresserons au problème lié à l'interaction entre plusieurs médicaments. Dans</p></div>]]></description><link>https://www.iwannadata.com/whats-up-doc/</link><guid isPermaLink="false">5bb61489ecf530084a313fa0</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Wed, 13 Jun 2018 13:30:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><h2 id="basetarget_blank"><base target="_blank"></h2>
<p>En France chaque année il y a plus de 10 000 décès liés à un mauvais usage des médicaments c'est-à-dire <em>&quot;un mauvais dosage, mauvaise prise, non-respect du traitement prescrit, interaction entre plusieurs médicaments&quot;</em>.</p>
<p>Dans cette étude nous nous intéresserons au problème lié à l'interaction entre plusieurs médicaments. Dans le cadre d'un mémoire de fin d'étude de médecine, j'ai apporté ma contribution dans la construction de modèles explicatifs. Cette contribution ne fut pas vaine, car l'étudiante est devenue médecin lors de sa soutenance avec les féliciations du jury.</p>
<hr>
<br>
<h4 id="rcuprationdedonnes">Récupération de données</h4>
<p>Cette étude met le focus sur les médecins. Nous cherchons à déterminer les facteurs qui permettent d'expliquer le niveau de connaissance des risques liés à la posologie.</p>
<p>À partir d'une base de données de médecin, un sondage en ligne a été réalisé et a permis de récupérer près de 5656 participants. N'étant pas propriétaire des données ces dernières ne sont pas en ligne.<br>
<br></p>
<h4 id="lesvariablesutilisespourlaralisationdumodle">Les variables utilisées pour la réalisation du modèle</h4>
<br>
<h4 id="variablesprdire">Variables à prédire</h4>
<style>
table {
    border-collapse: collapse;
    width: 100%;
}

th, td {
    text-align: left;
    padding: 8px;
    
}

tr:nth-child(even) {background-color: #E6E6FA;}
</style>
<hr>
<table>
<thead>
<tr>
<th>Nom des variables</th>
<th>Signification</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>sge</strong></td>
<td>Score général</td>
</tr>
<tr>
<td><strong>sgr</strong></td>
<td>Score gravité</td>
</tr>
</tbody>
</table>
<hr>
<style>
table {
    border-collapse: collapse;
    width: 100%;
}

th, td {
    text-align: left;
    padding: 8px;
    
}

tr:nth-child(even) {background-color: #E6E6FA;}
</style>
<p>En fonction de questions techniques liées aux interactions médicamenteuses, deux notes ou scores sont calculés.<br>
Le score de général va de 0 à 9 sachant que le meilleur score est de 9.<br>
Le score de gravité va de 0 à 5 sachant que le meilleur score est de 5.<br>
<br></p>
<h4 id="variablesexplicatives">Variables explicatives</h4>
<hr>
<table>
<thead>
<tr>
<th style="text-align:left">Nom des variables</th>
<th style="text-align:left">Signification</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>ansmedit</strong></td>
<td style="text-align:left">Savez-vous que l’ANSM édite sur son site un thésaurus actualisé des interactions médicamenteuses?</td>
</tr>
<tr>
<td style="text-align:left"><strong>alertlog</strong></td>
<td style="text-align:left">Tenez-vous compte des alertes d’interaction détectées par votre logiciel de prescription ?</td>
</tr>
<tr>
<td style="text-align:left"><strong>sexe</strong></td>
<td style="text-align:left">Féminin ou masculin</td>
</tr>
<tr>
<td style="text-align:left"><strong>depart</strong> (param=ref ref='75')</td>
<td style="text-align:left">Code départemental où vous exercez</td>
</tr>
<tr>
<td style="text-align:left"><strong>faculte</strong> (param=ref ref='Paris 6')</td>
<td style="text-align:left">Votre faculté d'origine</td>
</tr>
<tr>
<td style="text-align:left"><strong>exercice</strong></td>
<td style="text-align:left">Votre mode d'exercice</td>
</tr>
<tr>
<td style="text-align:left"><strong>zone</strong></td>
<td style="text-align:left">Zone où vous exercez</td>
</tr>
<tr>
<td style="text-align:left"><strong>vidal</strong></td>
<td style="text-align:left">Utilisation de l’outil vidal</td>
</tr>
<tr>
<td style="text-align:left"><strong>prescrire</strong></td>
<td style="text-align:left">Utilisation de l’outil prescrire</td>
</tr>
<tr>
<td style="text-align:left"><strong>net</strong></td>
<td style="text-align:left">Utilisation d’internet</td>
</tr>
<tr>
<td style="text-align:left"><strong>ansm</strong></td>
<td style="text-align:left">Utilisation de l’outil thesaurus ANSM theriaque</td>
</tr>
<tr>
<td style="text-align:left"><strong>doroz</strong></td>
<td style="text-align:left">Utilisation de l’outil doroz</td>
</tr>
<tr>
<td style="text-align:left"><strong>bcb</strong></td>
<td style="text-align:left">Utilisation de l’outil bcb</td>
</tr>
<tr>
<td style="text-align:left"><strong>age</strong></td>
<td style="text-align:left">Quel âge avez-vous?</td>
</tr>
<tr>
<td style="text-align:left"><strong>xp</strong></td>
<td style="text-align:left">Depuis combien d'années exercez-vous?</td>
</tr>
</tbody>
</table>
<hr>
<h4 id="choixdutypedemodle">Choix du type de modèle</h4>
<p>Il ne s’agit pas de trouver le modèle qui permet de prévoir si un score est de 1 ou de 5. Ici les variables à<br>
expliquer respectent un ordre, il est plus important de rechercher les déterminants qui font croitre le score c’est pourquoi nous utiliserons des modèles de régression logistique de type polytomique avec des données ordinales avec une distribution de probabilité cumulative.</p>
<p>Soit la variable Y : score sge ou sgr, j : niveau du score<br>
Une probabilité cumulative pour Y est la probabilité que Y soit au-delà ou en deçà d’un niveau j.<br>
Dans notre cas nous étudierons le cas de la probabilité cumulative pour que la probabilité que Y soit au-delà d’un niveau j c’est-à-dire que le score augmente.</p>
<p>Pour faciliter l’étude des variables explicatives, on réalise les modèles avec l’hypothèse des odds<br>
proportionnels. (voir Score Test for the Proportional Odds Assumption sortie SAS).</p>
<p>Pour la variable explicative score sge ou sgr, le modèle est le suivant :<br>
$$ logit [P(Y \ge j)] = \exp^{(\alpha_{j}+\beta_{x})} \ avec \ j = 1, ...., j-1 $$<br>
avec le paramètre β décrivant les effets de x sur log odds of response de la catégorie j. Puisque nous sommes<br>
dans le cadre d’odds proportionnels nous admettons que l’effet de x est identique pour tous les j-1 logit<br>
cumulatif.</p>
<p><strong>Pourquoi j-1 ?</strong></p>
<p>Exemple pour le premier score<br>
6 modalités et 5 courbes car la probabilité d'une des courbes = 1</p>
<img alt="Image Description" src="https://www.iwannadata.com/content/images/2018/10/courbe.png" style="width: 489px; height:169px">
<h4 id="laformedelacourbe">La forme de la courbe</h4>
<p>$$ P(Y \ge j) = \frac{\exp^{(\alpha_{j}+\beta_{x})}}{1+\exp^{(\alpha_{j}+\beta_{x})}} $$</p>
<br>
Dans les sorties SAS dans le tableau Analysis of Maximum Likehood Estimates :
<p>α j , valeur des intercepts qui définit la position des courbes logit relatives aux scores avec j étant le niveau du score.<br>
Les coefficients intercepts sont différents pour chaque courbe, plus j augmente plus on se déplace vers la gauche car les coefficients intercepts baissent.</p>
<p>βx , paramètre des variables explicatives x<br>
L'intérêt des odds proportionnels est que pour les courbes logit ont les mêmes paramètres βx,seul change la<br>
valeur de α pour chaque j.</p>
<p>Les coefficients de la courbe sont identiques pour les 5 courbes car nous avons testé l’hypothèse d’égalité des pentes (Test for the Proportional Odds Assumption) sinon pour chaque courbe nous aurions des coefficients différents et il ne serait pas possible d'avoir des odds ratios pour l'ensemble des données.</p>
<p>Exemple d'une des sorties<br>
P(y&gt;=0) = 1 pas de courbe, probabilité = 1<br>
P(y&gt;=1)  : intercept 0.09<br>
P(y&gt;=2)  : intercept -1.27<br>
P(y&gt;=3) : intercept -2.34<br>
P(y&gt;=4) : intercept -3.67<br>
P(y&gt;=5) : intercept -5.47<br>
<br></p>
<h4 id="lesmodlesslectionns">Les modèles sélectionnés</h4>
<hr>
<p>Modélisation d'avoir un score de gravité élevé (le plus élevé est 5)</p>
<hr>
<p><a href="https://s3-eu-west-1.amazonaws.com/alfardshare/blog/Doc/Modele7.html">Les sorties sas pour le modèle du score de gravité</a></p>
<p><strong>Modèle 7 Analysis of Maximum Likehood Estimates</strong><br>
• le fait d'être plus âgé augmente le logit de 0.0235 et ainsi augmente la probabilité d'avoir un score de gravité plus élevé<br>
• le fait de connaître l'existence du thésaurus présent sur le site de l'ansm augmente le logit de 0.4816 et ainsi augmente la probabilité d'avoir un score de gravité plus élevé<br>
• le fait d'avoir fait ses études dans une université non parisienne augmente le logit de 0.2134 et ainsi augmente la probabilité d'avoir un score de gravité plus élevé<br>
• le fait d'utiliser l'outil ansm augmente le logit de 0.8162 et ainsi augmente la probabilité d'avoir un score de gravité plus élevé</p>
<p><strong>Rapport de chance relative (odds ratio)</strong><br>
• l'odds ratio de l'expérience est de 1.024 soit supérieur à un c'est à dire que si l'expérience augmente d'une unité la probabilité d'avoir un score de gravité plus élevé augmente, l'effet est faible mais est présent.<br>
• lorsqu'un individu connaît l'existence du thésaurus présent sur le site de l'ansm nous avons 1,619 fois plus de chance d'avoir un niveau de gravité plus élevé par rapport à un individu qui n'en a pas sa connaissance.<br>
• lorsque les études ont été réalisées dans une université non parisienne nous avons 1.532 plus de chance d'avoir un niveau de gravité plus élevé par rapport à un individu qui a réalisé ses études dans une université parisienne.<br>
• lorsqu'un individu utilise l'outil ansm nous avons 2,262 fois plus de chance d'avoir un niveau de gravité plus élevé par rapport à un individu qui n'utilise pas ce dernier.</p>
<hr>
<hr>
<hr>
<p>Modélisation d'avoir un score général élevé (le plus élevé est 10)</p>
<hr>
<p><a href="https://s3-eu-west-1.amazonaws.com/alfardshare/blog/Doc/Modele8.html">Les sorties sas pour le modèle du score général</a></p>
<p><strong>Modèle 8 Analysis of Maximum Likehood Estimates</strong><br>
• le fait de connaître l'existence du thésaurus présent sur le site de l'ansm augmente le logit de 0.5971 et ainsi augmente la probabilité d'avoir un score général plus élevé<br>
• le fait d'être de sexe masculin augmente le logit de 0.3559 et ainsi augmente la probabilité d'avoir un score général plus élevé</p>
<p><strong>Rapport de chance relatives (odds ratio)</strong><br>
• lorsqu'un individu connaît l'existence du thésaurus présent sur le site de l'ansm nous avons 1.817 fois plus de chance<br>
d'avoir un niveau général plus élevé par rapport à un individu qui n'en a pas sa connaissance.<br>
• lorsque l'individu est de sexe masculin nous avons 1.427 fois de plus de chance d'avoir un niveau général plus élevé par<br>
rapport à un individu de sexe féminin.</p>
<hr>
<p>Pour le modèle de score de gravité nous avons 60,1% de paires concordantes, 38,1% de paires discordantes et 1.8% de paires égales.</p>
<p>Pour le modèle de score de général nous avons 57,1% de paires concordantes, 39,7% de paires discordantes et 3.3% de paires égales.<br>
<br><br>
<strong>Autres</strong></p>
<p><a href="https://www.iwannadata.com/explication/">Détail de la signification des pourcentages de paires</a></p>
<p><a href="https://s3-eu-west-1.amazonaws.com/alfardshare/blog/Doc/Sas+code.html">Code Sas</a></p>
<p>p180 6.2.1 Dans l'exemple du livre l'ordre est différent avec P(Y&lt;=j), dans nos modèles on a modélisé la probabilité d'être à un niveau plus élevé</p>
<p>Agreti introduction to categorical data</p>
</div>]]></content:encoded></item><item><title><![CDATA[Vitesse d'indexation des données : Elasticsearch et Influxdb]]></title><description><![CDATA[<div class="kg-card-markdown"><br>
De nos jours nous utilisons de plus en plus de données temporaires. L’internet des objets, les détections de pannes, les données météorologiques, l'étude de la qualité de l’air, la gestion des flux sur les routes utilisent des données provenant de capteurs. L’efficacité de ces systèmes nécessite un</div>]]></description><link>https://www.iwannadata.com/vitesse-dindexation-des-donnees-elasticsearch-et-influxdb/</link><guid isPermaLink="false">5c0e882277760a67b304fb00</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Thu, 13 Apr 2017 15:43:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><br>
De nos jours nous utilisons de plus en plus de données temporaires. L’internet des objets, les détections de pannes, les données météorologiques, l'étude de la qualité de l’air, la gestion des flux sur les routes utilisent des données provenant de capteurs. L’efficacité de ces systèmes nécessite un enregistrement et un stockage en temps réel des données afin que
ces dernières puissent être utilisées pour lancer des alarmes, exécuter des algorithmes pour réaliser des prévisions... La présence de flux continus avec de fortes volumétries qui rend aujourd’hui nécessaire l’utilisation de bases de données optimisées.
<p>Les bases de données Nosql proposent une maintenance simplifiée et la possibilité de dimensionner la puissance de calcul en fonction de l’importance du flux.<br>
Pour avoir un ordre d’idée de l’importance des flux des données temporelles, pour rappel une seconde est 1 000 millisecondes, une milliseconde est 1 000 microsecondes et une microseconde est 1 000 nanosecondes, c’est-à-dire que pour une seconde nous avons un million de microsecondes et qu’en une heure nous avons 3.6e+9 microsecondes.</p>
<p>D’après Wikipédia, la vitesse de transaction pour le trading haute fréquence était de 20 millisecondes à la fin des années 2010 pour passer en 2011 à 113 microsecondes, ce changement d’échelle nécessite une faible latence que les bases de données NoSql propose.</p>
<p><strong>Format des dates</strong></p>
<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg .tg-baqh{text-align:center;vertical-align:top}
.tg .tg-c3ow{border-color:inherit;text-align:center;vertical-align:top}
</style>
<table class="tg">
  <tr>
    <th class="tg-c3ow"></th>
    <th class="tg-c3ow">Unix timestamp</th>
    <th class="tg-c3ow">ISO8601</th>
  </tr>
  <tr>
    <td class="tg-c3ow">Secondes</td>
    <td class="tg-c3ow">1487331769</td>
    <td class="tg-c3ow">2017-01-16T19:20:30</td>
  </tr>
  <tr>
    <td class="tg-baqh">Millisecondes</td>
    <td class="tg-baqh">1487331769345</td>
    <td class="tg-baqh">2017-01-16T19:20:03.166</td>
  </tr>
  <tr>
    <td class="tg-baqh">Microsecondes</td>
    <td class="tg-baqh">1487331769345234</td>
    <td class="tg-baqh">2017-01-16T19:20:03.166456</td>
  </tr>
  <tr>
    <td class="tg-c3ow">Nanosecondes</td>
    <td class="tg-c3ow">1487331769345234654</td>
    <td class="tg-c3ow">2017-01-16T19:20:03.166456345</td>
  </tr>
</table>
<br>
<h3 id="1prsentationdesdonnes"><strong>1. Présentation des données</strong></h3>
<p>Dans cette partie nous étudierons l'injection de données d'une base de plusieurs millions d'enregistrements.<br>
<a href="https://archive.ics.uci.edu/ml/datasets/Heterogeneity+Activity+Recognition">https://archive.ics.uci.edu/ml/datasets/Heterogeneity+Activity+Recognition</a></p>
<p>Exemple d'un document du fichier csv<br>
Index,Arrival_Time,Creation_Time,x,y,z,User,Model,Device,gt<br>
0,1424696633909,1424696631914042029,0.013748169,-0.0006256103500000001,-<br>
0.023376465,a,nexus4,nexus4_1,stand</p>
<p>Dans cette base nous utiliserons les données du gyroscope de téléphone portable, fichier<br>
Phones_gyroscope.csv, taille de 1.3 Go.<br>
Les données des gyroscopes sont x, y, z.<br>
Pour chaque enregistrement nous avons la date en millisecondes de type Unix de la mesure,<br>
le type d'appareil utilisé, le numéro de l'appareil, le nom de l'utilisation et le type d'activité :<br>
&quot;Biking&quot;, &quot;Sitting&quot;, &quot;Standing&quot;, &quot;Walking&quot;, &quot;Stair Up&quot;, &quot;Stair down&quot;.</p>
<p>Ce type de données provenant de capteurs peut être utilisé pour modéliser le type d'activité c'est-à-dire qu'avec seulement les données des capteurs il serait possible de connaître le type d'activité en cours.<br>
Dans notre cas nous utiliserons ce fichier de presque 14 millions d'enregistrements pour tester la vitesse d'indexation d'Elasticsearch et de influxdb.</p>
<h3 id="2elasticsearch"><strong>2. Elasticsearch</strong></h3>
<p><a href="http://www.iwannadata.com/elastic-search/">Détail</a></p>
<h3 id="3influxdb"><strong>3. Influxdb</strong></h3>
<p><a href="http://www.iwannadata.com/influxdb/">Détail</a></p>
<h3 id="conclusion"><strong>Conclusion</strong></h3>
<p>L'environnement d'Elasticsearch permet relativement simplement de récupérer un flux de données et de créer un tableau de bord. J'ai été séduit par la possibilité de créer des index selon la date ce qui permet de supprimer facilement des données obsolètes sans bloquer la base de données avec des opérations de sauvegardes ce qui réduit le risque de corrompre ses données.</p>
<p>Le langage de requête d'Elasticsearch gagnerait à être plus lisible, l'utilisation du format json oblige à gérer un grand nombre d'accolades et augmente le risque d'erreur, à la différence du sql une requête complexe peut prendre plusieurs dizaines de lignes, les différentes documentations traitent peu de ce type de requête. Il faudrait créer un outil graphique pour rendre l'outil plus accessible, cependant on ne peut retirer à Elasticsearch la rapidité d'exécution des requêtes, souvent moins de 200 millisecondes avec les données que j'ai utilisées.</p>
<p>Au sujet de la vitesse d'indexation des données j'ai été impressionné par la vitesse d'indexation de influxdb par rapport à Elasticsearch cependant je ne peux conclure si un outil est mieux qu'un autre n'ayant testé que la partie indexation.</p>
<p>Pour des données massives, il faudrait en plus de la vitesse d'indexation tester la scalabilité des deux outils, selon une étude du Cern il y a quelques années elasticsearch brillait par sa capacité à la &quot;scalabilité&quot; par rapport à influxdb depuis il y a eu de nombreuses nouvelles versions de ces deux outils une nouvelle étude serait intéressante.</p>
</div>]]></content:encoded></item><item><title><![CDATA[Petit kmeans sous Matlab]]></title><description><![CDATA[<div class="kg-card-markdown"><h2 id="basetarget_blank"><base target="_blank"></h2>
<p>La meilleure manière de comprendre un algorithme est de le programmer, dans le cas suivant je vais implémenter un algorithme de type kmeans. Pour tester ce dernier j'utilise des données fournis par le département informatique de l'université de l'Est de la Finlande.</p>
<p>Mon choix se porte sur le dataset s1</p></div>]]></description><link>https://www.iwannadata.com/petit-kmeans-sous-matlab/</link><guid isPermaLink="false">5c0d24f477760a67b304faf1</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Tue, 20 Dec 2016 15:44:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><h2 id="basetarget_blank"><base target="_blank"></h2>
<p>La meilleure manière de comprendre un algorithme est de le programmer, dans le cas suivant je vais implémenter un algorithme de type kmeans. Pour tester ce dernier j'utilise des données fournis par le département informatique de l'université de l'Est de la Finlande.</p>
<p>Mon choix se porte sur le dataset s1 : deux dimensions, 5 000 points avec 15 clusters.</p>
<p><a href="http://cs.joensuu.fi/sipu/datasets/">Clustering basic benchmark</a></p>
<p>L'algorithme est réalisé sur matlab.</p>
<p><mark>Description simplifiée de l'implémentation de l'algorithme</mark></p>
<ul>
<li>
<p>définition de l'espace du nuage des points (max, min)</p>
</li>
<li>
<p>tirage aléatoire de k points correspondant au k groupe que l'on recherche dans l'espace du nuage des points</p>
</li>
</ul>
<hr>
<p><strong>Boucle</strong></p>
<ul>
<li>
<p>calcul pour chaque point de la distance de ces derniers avec les k centres.</p>
</li>
<li>
<p>rattachement des points au groupe dont le centre est le plus proche</p>
</li>
<li>
<p>calcul du total T des distances entre chacun des points et leur centre</p>
</li>
<li>
<p>définition les nouveaux centres de chaque groupe qui sont les barycentres ou centres de gravité de chacun de groupes. (moyenne de la position des points du nuage)</p>
</li>
</ul>
<hr>
<ul>
<li>Arrêt de boucle de l'algorithme lorsque le total T n'évoluent plus c'est à dire que chacun des groupes a un centre de gravité stable</li>
</ul>
<hr>
<p><strong>Résultat</strong><br>
Nous avons 15 groupes. Pour avoir une aussi bonne classification, un script a été créé qui a lancé ce programme un très grand nombre de fois et conservé la classification qui avait le total T le plus faible.</p>
<img alt="Image Description" src="https://www.iwannadata.com/content/images/2018/12/1-2.png" style="width: 680px; height:600px">
<hr>
<p><strong>Interprétation des résultats en utilisant une analyse graphique de type silhouette</strong></p>
<p>La description de cette méthodologie est issue de l'article de Peter J. Rousseeuw, Silhouettes:a graphical aid to the interpretation and validation of cluster analysis.</p>
<p>On considère habituellement la distance euclidienne.<br>
Soit i, un membre du cluster<br>
Soit a(i), la moyenne de la distance du membre i du cluster par rapport à l'ensemble des membres du cluster auquel il appartient</p>
<p>Soit d(i,k) : la moyenne de la distance du membre i du cluster auquel i appartient et l'ensemble des membres du cluster k.</p>
<p>A partir de d(i,k) on calcule l'indice de voisinage b(i), on recherche la distance d(i,k) la plus faible qui nous donne une indication de la proximité du membre i par rapport à un autre cluster.</p>
<p>Avec ces deux moyennes on peut construire un indice de similarité s(i):</p>
<div>
$$ s(i) =
\begin{cases}
1-a(i)/b(i),  & \text{if $a(i)$<$b(i)$} \\="" 0,="" &="" \text{if="" $a(i)$="$b(i)$}\\" b(i)="" a(i)-1,="">$b(i)$}
\end{cases} $$
</$b(i)$}></div>
<ul>
<li>
<p>Dans le premiere cas où a(i)&lt;b(i), nous avons la distance moyenne mininal du membre i par rapport aux autres clusters qui est supérieure à la distance moyenne des membres auquel appartient i, c'est à dire que ce membre n'a pas de cluster auquel il serait plus optimal d'appartenir. Cette situation correspond à un bon classement et à un indice de similarité positif. La meilleure des situations étant le cas où l'indice de similarité est proche de 1.</p>
</li>
<li>
<p>Dans le deuxième cas où a(i)=b(i), l'indice de similarité est nulle c'est à dire qu'il existe un ou plusieurs clusters où le membre i pourrait aussi appartenir.</p>
</li>
<li>
<p>Dans le troisième cas où a(i)&gt;b(i), nous avons la distance moyenne minimal du membre i par rapport aux autres clusters qui est inférieure à la distance moyenne des membres auqel appartient i, c'est à dire que ce membre n'est pas dans le cluster le plus optimal. Cette situation correspond à un mauvais classement et à un indice de similarité négatif. La plus mauvaise des situations étant le cas où l'indice de similarité est proche de -1.</p>
</li>
</ul>
<br>
<p><strong>Résulat répresentation graphique silhouette : fonction inclue dans matlab</strong><br>
<img alt="Image Description" src="https://www.iwannadata.com/content/images/2018/12/silhouette15.png" style="width: 680px; height:600px"></p>
<p>A noter que pour chaque cluster, les indices de similarité des membres i sont classés par ordre décroissant.<br>
Cette réprésentation graphique nous permet de constater que le nombre de cluster est conforme et que le classement est bonne qualité, la majorité des membres de chaque cluster a un indice de similarité supérieur à 0.75.</p>
<hr>
<p><a href="https://s3-eu-west-1.amazonaws.com/alfardshare/blog/Doc/kmeans.html">Code Matlab</a></p>
</div>]]></content:encoded></item><item><title><![CDATA[Facebook : Find the robots]]></title><description><![CDATA[<div class="kg-card-markdown"><br>
<p>Each year, Facebook using Kaggle platform to find their future data scientist.</p>
<p>The best competitor participants could pass a job interview. The interest of this contest is the members of kaggle couldn't exchange trick and models, its imply that your rating is the real rating and not a copy/paste</p></div>]]></description><link>https://www.iwannadata.com/findrobot/</link><guid isPermaLink="false">5b2288c0ecf530084a313f8f</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Sat, 19 Sep 2015 15:24:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><br>
<p>Each year, Facebook using Kaggle platform to find their future data scientist.</p>
<p>The best competitor participants could pass a job interview. The interest of this contest is the members of kaggle couldn't exchange trick and models, its imply that your rating is the real rating and not a copy/paste program, method process.</p>
<p>We must find if a bidder is a human or a robot with bidding data provided by Facebook.<br>
The score is an area under the ROC curve which quantifies the overall ability of the test to discriminate between human and robot.</p>
<p>At the end of the competition, my score is a 0.92, near to the best score of 0.94. My rank is 198 of 989, not bad.</p>
<p><a href="https://www.kaggle.com/c/facebook-recruiting-iv-human-or-bot">Kaggle link</a></p>
<p><strong>1. Data</strong><br>
We have two sets of data :</p>
<ul>
<li>
<p>Bidder dataset : bidder_id, robot flag<br>
Training dataset :<br>
2 013 distinct bidders with 103 robots (5,11%)</p>
<p>Testing dataset :<br>
4 700 distinct bidders for testing dataset</p>
</li>
<li>
<p>Bid dataset : bid_id, 7 656 335 transactions<br>
We have 7.6 millions of bid_id, related to bidder_id</p>
</li>
</ul>
<p>I group Bid dataset by bidder_id, and create engineering features.<br>
<br><br>
<strong>2. Feature engineering</strong><br>
<em>Time</em><br>
The time is not in hours/minutes/seconds, we have to explore this feature, to simplified time feature, I divide this time by 100 000 000 000 to control the number of time value.</p>
<p>If we plot time value against bid_id value, we find three not joined periods.</p>
<img src="https://www.iwannadata.com/content/images/2018/06/time.jpg" style="width: 399px; height:253px">
<br>
<br>
I define three periods :
<ul>
<li>Period 1: 96319 - 96455 : 136 distinct units of new time</li>
<li>Period 2: 96955 - 97092 : 137 distinct units of new time</li>
<li>Period 3: 97592 - 97728 : 136 distinct units of new time</li>
</ul>
<p>I decide to create this new features :</p>
<p>By bidder_id, for each period :</p>
<ul>
<li>Number of bid</li>
<li>Number of bid at same times</li>
<li>Standard deviation between bid</li>
</ul>
<p><em>Other features</em></p>
<p><strong>Number of merchandise</strong> by bidder_id<br>
Count distinct <strong>device</strong> by bidder_id<br>
Number of <strong>country</strong> by bidder_id<br>
Count distinct <strong>IP</strong> by bidder_id<br>
Count distinct <strong>URL</strong> by bidder_id</p>
<br>
<p><strong>3. Overfitting</strong></p>
<p>Before the end of the contest, when we have found a model, we could send our prediction to kaggle which compute your score from only 30% of data, the final score is computed with 100% of data.</p>
<p>If for the same model with different submission we don’t have a stable score, maybe our model is unable to generalize.</p>
<p>My first models were clearly overfit : my training score was near 0.99, for gradient boosting and random forest with a testing score of 0.92, when I was testing on kaggle the score was near 0.89.</p>
<p>To limit overfitting, I have tried to reduce the difference between training score and testing score, and lower training score from 0.99 to 0.95-0.92.</p>
<p>I have made ensemble models for each models, and an ensemble models of ensemble models for the final prediction.<br>
<br><br>
<strong>4. Models</strong></p>
<p>Neural Network :<br>
I am using the new python libraries, <a href="https://github.com/aigamedev/scikit-neuralnetwork">https://github.com/aigamedev/scikit-neuralnetwork</a> .</p>
<hr>
<p>3 layers :<br>
Maxout : units=500, pieces=2   ==&gt;   Sigmoid: units=10  ==&gt;  Softmax<br>
The validation size is 0.4</p>
<hr>
<p>To have a validation error near to 0.16, we must have training score greater than 0.89. I have created an iterative process which select only these models, and made an ensemble of these models. It was a long processing, more than one day to create an ensemble of 5 models because 90% of models don't respect criteria.</p>
<p>Gradient boosting :<br>
I am using scikit learn libraries, <a href="http://scikit-learn.org/stable/">http://scikit-learn.org/stable/</a></p>
<p>My model is a gradient boosting with calibrated classifier cross validation.<br>
&quot;When performing classification you often want not only to predict the class label, but also obtain a probability of the respective label. This probability gives you some kind of confidence on the prediction. Some models can give you poor estimates of the class probabilities and some even do not not support probability prediction. The calibration module allows you to better calibrate the probabilities of a given model, or to add support for probability prediction&quot;</p>
<hr>
<p>GBM:<br>
Number estimators : 500<br>
Max depth : 6<br>
Learning rate: 0.001<br>
Max features : sqrt</p>
<hr>
<p>I have created an ensemble of calibrated classifier. For each calibrated classifier, I choose a cross validation of 10 and I repeat the procedure of calibrated classifier 100 times to get more precise result.</p>
<br>
<p><strong>5. Ensemble models</strong></p>
<p>To find the weight of GBM and NN which maximize the area under the ROC curve, I have used a logistic regression.</p>
<p>0.25<em>Neural Network + 0.85</em>Gradient Boosting</p>
<p>Code Python :</p>
<ul>
<li><a href="https://gist.github.com/alfard/e1414f9eba2967bc40c0">Data Management 1/2</a></li>
<li><a href="https://gist.github.com/alfard/9161fa9b04de490da38a">Data Management 2/2</a></li>
<li><a href="https://gist.github.com/alfard/cc4ee6f704f4a32d4afe">Neural Network</a></li>
<li><a href="https://gist.github.com/alfard/224dcc0868425d365892">GBM</a></li>
<li><a href="https://gist.github.com/alfard/f0ac95aeeabd7af0527c">Final Model</a></li>
</ul>
</div>]]></content:encoded></item><item><title><![CDATA[Using python to build a CART algorithm]]></title><description><![CDATA[<div class="kg-card-markdown"><p>In this article, I described a method how we can code CART algorithm in python language. I think it is a good exercise to build your own algorithm to increase your coding skills and tree knowledge. It's not the fastest algorithm implementation but it's enough to understand CART and object</p></div>]]></description><link>https://www.iwannadata.com/using-python-to-build-a-cart-algorithm/</link><guid isPermaLink="false">5bb8b3156500c6097eaa68e7</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Mon, 18 May 2015 13:05:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>In this article, I described a method how we can code CART algorithm in python language. I think it is a good exercise to build your own algorithm to increase your coding skills and tree knowledge. It's not the fastest algorithm implementation but it's enough to understand CART and object oriented programming.</p>
<br>
<p><strong>Cart algorithm</strong></p>
<p>In 1983, Breiman et al first described CART algorithm like classified and Regression Tree. It could be used for regression and classification of binary target.</p>
<p>It's a recursive algorithm, at each iteration it finds the best splitting of data which could increase the probability of predicting the target values.</p>
<br>
<p><strong>Tree definition</strong></p>
<p>A tree is composed of nodes. Each node could have one, two children or could be a leaf node, a node with no children.</p>
<p>In a list, I stored each object Node.</p>
<p>Tree=[node1, node2, node3, node4….]<br>
<br></p>
<p><strong>Tree structure</strong></p>
<p>To store links and paths between Nodes, I am using Breadth first Search layout.</p>
<p>If the node(x) has a left child the index of the child node is : node(2*x + 1)</p>
<p>If the node(x) has a right child the index of the child node is : node(2*x + 2)</p>
<br>
Each node is a python object :
<p>class Node:</p>
<p>def <strong>init</strong>(self,t,L,R,D,S,V,M) :</p>
<p>self.t=t <em>Index of Node</em></p>
<p>self.L=L <em>Index of Left child</em></p>
<p>self.R=R <em>Index of right child</em></p>
<p>self.D=D <em>Depth of the Node</em></p>
<p>self.S=S <em>Value of split</em></p>
<p>self.V=V <em>Feature of split</em></p>
<p>self.M=M <em>Subset array</em></p>
<p>self.X=X <em>Execution Flag</em></p>
<br>
<p><strong>Splitting criteria : Gini impurity gain</strong></p>
<p>$$i (n) = 1 - \sum p^2_j $$ where</p>
<p>$$p_j ( t) = \frac{n_t ( t)}{n ( t)}$$</p>
<p>is the relative proportion of category j in Node(t)</p>
<p>For instance, if a data set has only one class target, its gini index is zero, is a purity data set.</p>
<p>We have two subsets : left and right induced by the value A and feature of the split.</p>
<p>$$ \Delta i ( n) = i ( n) - p_{left} i ( n_{left}) - p_{right} i ( n_{right}) $$</p>
<p>For each features, and for each split value A, we compute gini impurity gain and we choose the partition that maximize gini impurity gain.<br>
<br><br>
<strong>Example of split calculus</strong></p>
<p>In this example, we considered only one feature x which is continuous.</p>
<table cellpadding="4" cellspacing="0" style="width: 384px;">
 <colgroup><col width="13">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="10">
 <col width="9">
 </colgroup><tbody>
<tr valign="top">
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="13"><div align="center">
<span style="font-size: 18.6666660308838px;">y</span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border: 1px solid #000000; padding: 0.1cm;" width="9"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
 </tr>
<tr valign="top">
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="13"><div align="center">
<span style="font-size: 18.6666660308838px;">x</span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">1</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="10"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="9"><div align="center">
<span style="font-family: Times New Roman;"><span style="font-size: 14pt;">0</span></span></div>
</td>
 </tr>
</tbody></table>
<br>
(0+1)/2=0.5 => 0.5 split
<br>
<table cellpadding="4" cellspacing="1" style="width: 391px;">
 <colgroup><col width="114">
 <col width="26">
 <col width="98">
 <col width="114">
 </colgroup><tbody>
<tr valign="top">
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: 1.05pt double #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="114"><br>
<br></td>
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: 1.05pt double #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="26"><br>
<br></td>
  <td colspan="2" style="border: 1.05pt double #000000; padding: 0.1cm;" width="221"><div align="center">
Feature x for 0.5 split value</div>
</td>
 </tr>
<tr valign="top">
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="114"><br>
<br></td>
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="26"><div align="center">
<br></div>
</td>
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="98"><div align="center">
0</div>
</td>
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: 1.05pt double #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="114"><div align="center">
1</div>
</td>
 </tr>
<tr valign="top">
  <td rowspan="2" style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="114"><div align="center">
Target y class</div>
</td>
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="26"><div align="center">
0</div>
</td>
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="98"><div align="center">
10</div>
</td>
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: 1.05pt double #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="114"><div align="center">
0</div>
</td>
 </tr>
<tr valign="top">
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="26"><div align="center">
1</div>
</td>
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="98"><div align="center">
3</div>
</td>
  <td style="border-bottom: 1.05pt double #000000; border-left: 1.05pt double #000000; border-right: 1.05pt double #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="114"><div align="center">
7</div>
</td>
 </tr>
</tbody></table>
<br>
<p>$$i ( n) = 1 - \left( \frac{10}{20} \right)^2 - \left( \frac{10}{20} \right)^2 = 0.5$$</p>
<p>$$i ( left) = 1 - \left( \frac{10}{13} \right)^2 - \left( \frac{3}{13} \right)^2 = 0.3550295$$</p>
<p>$$i ( right) = 1 - \left( \frac{10}{20} \right)^2 = 0$$</p>
<p>$$\Delta i ( n) = 0.5 - \left( \frac{13}{20} \right)0.355 = 0.2692308$$</p>
<p>If we have had more than one feature, we compute for each feature all the splits, and we choose the best gini impurity gain.</p>
<hr>
<p><strong>Code of the Cart Algorithm</strong></p>
<p><a href="https://gist.github.com/alfard/25c177f61e6b05dffe26">GitHub link : Tree_Cart_clean.py</a></p>
<p>Function Build(Tr):</p>
<p>Tr : node of the tree</p>
<p>Ex: T[0] : node one of the list T(list of the all nodes)</p>
<p>Using result of ginisplit function to define or not children Node</p>
<hr>
<p>Function Split(v,a):</p>
<p>v: feature, a:array</p>
<p>Ex: Split(2,a) : feature 2, array a</p>
<p>Compute maximum gini gain for one feature, it computes all the split possibility</p>
<hr>
<p>Function Giniplit(matrix):</p>
<p>Matrix: Array of features</p>
<p>Agregate all the best split, feature, and find the best partitionning.</p>
<hr>
<p>Function TT(depth): Main program</p>
<p>depth : depth of the tree, if you want a max depth of 3 you must type 2.</p>
<p>It's the maximum depth of root node.</p>
<p>Build Tree list and define node</p>
<hr>
<p><mark>Comparison between my Cart algorithm and sklearn Cart : Same data, same depth, same criterion</mark></p>
<pre><code>import numpy as np

import random


np.random.seed(42)

X=np.random.randint(10, size=(100, 4))

Y=np.random.randint(2, size=100)


a=np.column_stack((Y,X))
</code></pre>
<p>Tree from Sklearn</p>
<pre><code>
from sklearn import tree


clf = tree.DecisionTreeClassifier(criterion='gini',max_depth=3)

clf = clf.fit(X, Y)

tree.export_graphviz(clf,out_file='tree.dot')
</code></pre>
<br>
<p align="center">
<img alt="Image Description" src="https://www.iwannadata.com/content/images/2018/10/tree.png" style="width: 729px; height:375px">
</p>
<br>
<p>Tree from my Cart algorithm</p>
<pre><code>#Initialisation ot the Tree list 

Tree=[]


#Initialisation of Node[0] 

Tree.append(Node(0,&quot;L&quot;,&quot;R&quot;,0,&quot;S&quot;,&quot;V&quot;,a,&quot;X&quot;))


#2 for 3 depth 

TT(2)


#Print Tree

for index,node in enumerate(Tree):

print index,node.t,&quot;*&quot;,node.L,node.R,&quot;*&quot;,&quot;Depth:&quot;,node.D,node.S,len(node.M)
</code></pre>
<br>
<table cellpadding="3" cellspacing="0" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;">
<tbody>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>Index</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>t</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>left</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>right</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>depth</b></td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>split value</b></td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom"><b>shape</b></td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">0</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">0</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">1</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">0</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">7,5</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">100</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">1</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">1</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">4</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">1</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">0,5</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">78</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">5</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">6</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">1</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3,5</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">22</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">7</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">4</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">4</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">9</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">10</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2,5</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">71</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">5</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">9</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">24</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">6</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">10</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">47</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">7</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">5</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">11</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">12</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">8,5</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">9</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">8</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">6</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">13</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">14</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">2</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">8,5</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">13</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">11</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">11</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">4</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">12</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">12</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">5</td>
</tr>
<tr>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">13</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">13</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">12</td>
</tr>
<tr>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">14</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">14</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">3</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">*</td>
<td align="center" style="border-bottom: thin solid #000000; border-left: thin solid #000000; border-right: thin solid #000000; border-top: thin solid #000000; font-size: 10pt;" valign="bottom">1</td>
</tr>
</tbody></table>
<br>
If we compare the tree generate by sklearn Cart and my tree generate by my Cart algorithm, they have the same results.
<br>
<hr>
Usefull documents :
<ul>
<li>Cart algorithm</li>
<li>Gilles Louppe : Understanding Random Forests</li>
</ul>
<p><em>To do :</em></p>
<p><em>- improve recursion loop in TT function to remove execution flag. This flag prevent algorithm to create children from a Node which has already been built.</em><br>
<em>- create predict function</em></p>
<p><em>- change the storage of array in object to rules to save memory</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[Heritage Provider Network Health Prize]]></title><description><![CDATA[<div class="kg-card-markdown"><br>
L'Heritage Provider Network Health Prize est une compétition qui a pour objectif de créer un modèle qui sera à même de prévoir le nombre de jours d'hospitalisation à partir de données historiques.
<p>À partir des données historiques d'un patient (nombre et type de consultation, prise de médicaments, catégories de maladie.</p></div>]]></description><link>https://www.iwannadata.com/heritage-provider-network-health-prize/</link><guid isPermaLink="false">5c0d327a77760a67b304faf9</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Thu, 10 Apr 2014 15:22:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><br>
L'Heritage Provider Network Health Prize est une compétition qui a pour objectif de créer un modèle qui sera à même de prévoir le nombre de jours d'hospitalisation à partir de données historiques.
<p>À partir des données historiques d'un patient (nombre et type de consultation, prise de médicaments, catégories de maladie...) à la période n, nous devons estimer le nombre de jours d'hospitalisation à la période n+1.</p>
<p>Pour cela nous disposons de données années 1 avec le nombre de jours d'hospitalisation années 2, de données années 2 avec le nombre de jours d'hospitalisation années 3 et enfin de données années 3 à partir desquelles on estimera le nombre de jours d'hospitalisation années 4.</p>
<p>J'utilise les données années 1 avec le nombre de jours d'hospitalisation années 2 en échantillon d'apprentissage.<br>
J'utilise les données années 2 avec le nombre de jours d'hospitalisation années 3 en échantillon de test.</p>
<p>Le but est de minimiser le score suivant :</p>
<br>
<p align="center">
<img alt="Image Description" src="https://www.iwannadata.com/content/images/2018/12/erreur.png" style="width: 301px; height:77px">
</p>
<br>
<p>Soit : i : un individu, n : le total d'individu, pred : prévision du nombre de jours hospitalisés, act : le nombre de jours passés à l’hôpital.</p>
<p><strong>Résultat</strong> : le meilleur modèle a un score de 0.461197, mon modèle arrive à un score de 0.470774.<br>
En classement final, j'obtiens la 241e place sur un total de 1358 équipes participantes.</p>
<h3 id="1actionsurlesdonnes"><strong>1.Action sur les données</strong></h3>
<ul>
<li>
<p>la distribution de DaysinHospital est asymétrique à droite, en réalisant une transformation log je limite cet effet</p>
</li>
<li>
<p>pour réaliser un modèle, il faut que l'échantillon d'apprentissage, de test et sur lequel on applique le modèle soit proche or les variables relatives au délai de paiement ont des moyennes et des variances très différentes selon les échantillons, je décide de les exclure<br>
<br></p>
</li>
</ul>
<h3 id="2lesmeilleursmodles"><strong>2.Les meilleurs modèles</strong></h3>
<p>À la suite de nombreuses estimations et modèles, je sélectionne les 4 modèles suivants :</p>
<table border="0" cellspacing="0" cols="3">
 <colgroup width="201"></colgroup>
 <colgroup width="113"></colgroup>
 <colgroup width="446"></colgroup>
 <tbody>
<tr>
  <td align="CENTER" height="16" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000;"><b>Modèle</b></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000;"><b>Score</b></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000;"><b>Paramètres</b></td>
 </tr>
<tr>
  <td align="CENTER" height="17" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">Régression linéaire</td>
  <td align="CENTER" sdnum="1036;" sdval="0,4761" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">0,4761</td>
  <td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-top: 1px solid #000000;">Stepwise sous SAS</td>
 </tr>
<tr>
  <td align="CENTER" height="62" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">Gradient Boosting </td>
  <td align="CENTER" sdnum="1036;" sdval="0,472" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">0,472</td>
  <td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-top: 1px solid #000000;">distribution="gaussian", n.trees=600, shrinkage=0.01, interaction.depth=12,                               <br>
Bag.fraction = 0.5,train.fraction = 0.5,n.minobsinnode = 50, cv.folds = 1,<br>
<br></td>
 </tr>
<tr>
  <td align="CENTER" height="17" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">Random Forest</td>
  <td align="CENTER" sdnum="1036;" sdval="0,4786" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">0,4786</td>
  <td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-top: 1px solid #000000;">ntree=200, do.trace=T, sampsize=20000</td>
 </tr>
<tr>
  <td align="CENTER" height="62" style="border-right: 1px solid #000000; border-top: 1px solid #000000;">Regularized Greedy Forest</td>
  <td align="CENTER" sdnum="1036;" sdval="0,4715" style="border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">0,4715</td>
  <td align="LEFT" style="border-left: 1px solid #000000; border-top: 1px solid #000000;">reg_L2=1            # Regularization parameter<br>
loss=LS             # Square loss<br>
test_interval=100   # Test (and save) models every time 100 leaves are added.<br>
max_leaf_forest=500</td>
 </tr>
</tbody></table>
<br>
<h3 id="3ensemblemodle"><strong>3.Ensemble modèle</strong></h3>
<p>La combinaison de différents modèles permet de réduire l'erreur c'est pourquoi à partir des quatre meilleurs modèles je construis un ensemble modèle.</p>
<p>Il faut trouver un modèle qui ne suridentifie pas l'échantillon d'apprentissage et ainsi ne pas fait augmenter l'erreur de l'échantillon de test lors de l'application du modèle sur ce dernier.</p>
<p>La régression linéaire donne une erreur de prévision très faible à partir de l'échantillon d'apprentissage (score : 0.28) mais fait augmenter l'erreur de l'échantillon du test (score : 0.51). Il y a donc ici sur-apprentissage.</p>
<p>Un ensemble modèle étant constitué de la combinaison de différents modèles, il me faut trouver la meilleure combinaison.</p>
<p>À travers un algorithme qui calcule l'erreur sur l'échantillon d'apprentissage et sur l'échantillon de test pour chacune des combinaisons, j'ai trouvé la combinaison suivante :</p>
<table border="0" cellspacing="0" cols="2">
 <colgroup width="201"></colgroup>
 <colgroup width="113"></colgroup>
 <tbody>
<tr>
  <td align="CENTER" height="16" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><br></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">Poids </td>
 </tr>
<tr>
  <td align="CENTER" height="16" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">Régression linéaire</td>
  <td align="CENTER" sdnum="1036;" sdval="8" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">8</td>
 </tr>
<tr>
  <td align="CENTER" height="17" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">Gradient Boosting </td>
  <td align="CENTER" sdnum="1036;" sdval="34" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">34</td>
 </tr>
<tr>
  <td align="CENTER" height="17" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">Random Forest</td>
  <td align="CENTER" sdnum="1036;" sdval="1" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">1</td>
 </tr>
<tr>
  <td align="CENTER" height="17" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">Regularized Greedy Forest</td>
  <td align="CENTER" sdnum="1036;" sdval="57" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;">57</td>
 </tr>
</tbody></table>
<br>
L'algorithme mettra plus de 13 heures pour calculer plus de 160 000 combinaisons sous R.
<p>Le score de notre ensemble modèle est de 0.470774.</p>
<p><img src="https://www.iwannadata.com/content/images/2018/12/densit-.png" alt="densit-"></p>
<p>régression linéaire : bleu<br>
gradient boosting : gris<br>
random forest : rouge,<br>
regularized greedy forest : vert<br>
ensemble modèle : rouge pointillé</p>
<p><a href="http://www.heritagehealthprize.com/c/hhp">Lien de la compétition kaggle</a></p>
</div>]]></content:encoded></item><item><title><![CDATA[Récupérer les flux Twitter]]></title><description><![CDATA[<div class="kg-card-markdown"><br>
Aujourd'hui pour disposer de l'information la plus fraîche il est nécessaire d'utiliser Twitter. Les grandes entreprises, les décideurs, les experts, les journalistes utilisent ce média pour communiquer, il n'est plus nécessaire d'attendre la parution de la presse pour avoir à un instant t une idée des tendances sur divers sujets.</div>]]></description><link>https://www.iwannadata.com/recuperer-les-flux-twitter/</link><guid isPermaLink="false">5bb8c9ec6500c6097eaa68ef</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Thu, 10 Apr 2014 14:43:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><br>
Aujourd'hui pour disposer de l'information la plus fraîche il est nécessaire d'utiliser Twitter. Les grandes entreprises, les décideurs, les experts, les journalistes utilisent ce média pour communiquer, il n'est plus nécessaire d'attendre la parution de la presse pour avoir à un instant t une idée des tendances sur divers sujets.
<p>Le fait que Bloomberg, entreprise sérieuse, propose depuis un peu plus d'une année un outil d'analyse des sentiments des tweets à destination des traders souligne le fait que l'utilisation de ces outils va se généraliser dans d'autres domaines. (Détail de la plateforme de Bloomberg)</p>
<p>Dans cet article, je présenterai les deux façons de récupérer les flux provenant de twitter en utilisant la librairie tweepy sous Python.</p>
<p>J'utiliserai pour illustrer les derniers jours de la campagne municipale parisienne opposant Nathalie Kosciusko-Morizet et Anne Hidalgo.</p>
<p>Dans un premier temps, il faut se déclarer développeur sur <a href="https://apps.twitter.com">https://apps.twitter.com</a> ainsi on pourra récupérer les différentes clefs qui nous permettront d'accéder aux flux. Je ne détaillerai pas plus la procédure qui est présente sur de nombreux forums. Un fois ces codes il faut accéder aux flux.</p>
<p>Il y a deux types de flux, ayant chacun des restrictions liées à l'api de twitter, le flux en direct et le flux différé.</p>
<h3 id="1fluxendirect"><strong>1.Flux en direct</strong></h3>
<p>Nous récupérons l'ensemble des tweets pendant l'exécution du programme en appliquant des filtres qui peuvent être sur un mot clef, une langue... Pour le flux en direct, il est possible de suivre en théorie jusqu'à 400 thèmes en simultanée, la restriction est qu'il ne faut pas que l'ensemble des tweets que vous récupérez représente plus de 1 % de l'ensemble des tweets. Si ce cas se produit, il y aura une partie des tweets qui seront absents du résultat de votre requête.</p>
<p><a href="https://gist.github.com/alfard/10392688">Exemple de code pour le flux en direct</a></p>
<p>Dans le code ci-dessus nous récupérons le 'created_at', date de création et 'text', texte du tweet provenant du status.</p>
<p>Au status d'autres données sont rattachées.</p>
<p>Exemple provenant d'un forum</p>
<hr>
<pre><code> 'contributors': None,

 'truncated': False,

 'text': 'My Top Followers in 2010: @tkang1 @serin23 @uhrunland @aliassculptor @kor0307 @yunki62. Find yours @ http://mytopfollowersin2010.com',

 'in_reply_to_status_id': None,

 'id': 21041793667694593,

 '_api': &lt;tweepy.api.api object=&quot;&quot; at=&quot;&quot; 0x6bebc50=&quot;&quot;&gt;,

 'author': &lt;tweepy.models.user object=&quot;&quot; at=&quot;&quot; 0x6c16610=&quot;&quot;&gt;,

 'retweeted': False,

 'coordinates': None,

 'source': 'My Top Followers in 2010',

 'in_reply_to_screen_name': None,

 'id_str': '21041793667694593',

 'retweet_count': 0,

 'in_reply_to_user_id': None,

 'favorited': False,

 'retweeted_status': &lt;tweepy.models.status object=&quot;&quot; at=&quot;&quot; 0xb2b5190=&quot;&quot;&gt;,

 'source_url': 'http://mytopfollowersin2010.com',

 'user': &lt;tweepy.models.user object=&quot;&quot; at=&quot;&quot; 0x6c16610=&quot;&quot;&gt;,

 'geo': None,

 'in_reply_to_user_id_str': None,

 'created_at': datetime.datetime(2011, 1, 1, 3, 15, 29),

 'in_reply_to_status_id_str': None,

 'place': None
</code></pre>
<hr>
<p>Il est à noter que le flux étant gratuit, il est possible que lors de la capture il y ait des coupures, il faut mettre en place une stratégie pour gérer les erreurs et éviter ainsi de perdre des tweets.</p>
<h3 id="2fluxdiffr"><strong>2.Flux différé</strong></h3>
<p>Nous récupérons les flux qui ont lieu dans le passé, il est possible de remonter jusqu'à une semaine. La restriction de l'api nous impose à respecter la fréquence de 180 résultats par tranche de 15 minutes, si cette fréquence n'est pas respectée la récupération du flux s'intérrompt du fait que vous avez dépassé les quotas.</p>
<p><a href="https://gist.github.com/alfard/15bd8c58df93af548dd2">Exemple de code pour le flux différé</a></p>
<h3 id="3exempledelacampagnemunicipaleparisienne"><strong>3.Exemple de la campagne municipale parisienne</strong></h3>
<p>Pour illustrer la récupération des flux sous Twitter, j'ai récupéré les flux de la campagne électorale parisienne qui opposaient Anne Hidalgo et Nathalie Kosciusko-Morizet.</p>
<p>L'extraction couvre la période du 26 mars 2014 au 30 mars 2014 inclus. Les données récupérées étaient par minutes et ont été agrégées par heure.</p>
<p>La présence du mot clef &quot;Hildalgo&quot; conditionne la récupération de tweet relatif à Anne Hildago.</p>
<p>La présence du mot clef &quot;NKM&quot; conditionne la récupération de tweet relatif à Nathalie Kosciusko-Morizet.</p>
<p>Les retweets sont inclus.</p>
<p>Nous dénombrons trois pics qui correspondent à :</p>
<ul>
<li>
<p>le 26 mars à 18h : débat entre les deux candidates</p>
</li>
<li>
<p>le 27 mars : dernier meeting des candidates</p>
</li>
<li>
<p>le 30 mars au soir : proclamation des résultats</p>
</li>
</ul>
<p>Hors de ces trois pics, on peut constater que les médias sociaux n'ont pas été utilisés à leur pleine mesure, nous ne sommes pas au niveau des Etats-Unis (10.3 millions de tweet pour 1h30 de débat pour la présidentielle américaine) toute proportion gardée.</p>
<p><img src="https://www.iwannadata.com/content/images/2018/10/nombretweet.png" alt="nombretweet"></p>
<p>Pour réaliser ce graphique, la version de ggplot pour Python a été utilisée.</p>
<p><a href="https://gist.github.com/alfard/c82a653ae327890aa4fe">Exemple du code</a></p>
</div>]]></content:encoded></item><item><title><![CDATA[Personalize Expedia Hotel Searches - ICDM 2013]]></title><description><![CDATA[<div class="kg-card-markdown"><br>
Expedia est une agence de voyages en ligne. Lorsque vous effectuez une recherche le site vous affiche une liste d’hôtels susceptible de vous intéresser, le résultat qui en résulte est calculé en amont par Expédia. Ce calcul provient d'un algorithme de classement (ranking) qui vise à augmenter la probabilité</div>]]></description><link>https://www.iwannadata.com/personalize-expedia-hotel-searches-icdm-2013/</link><guid isPermaLink="false">5c34a11b77760a67b304fb0c</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Sun, 22 Dec 2013 13:19:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><br>
Expedia est une agence de voyages en ligne. Lorsque vous effectuez une recherche le site vous affiche une liste d’hôtels susceptible de vous intéresser, le résultat qui en résulte est calculé en amont par Expédia. Ce calcul provient d'un algorithme de classement (ranking) qui vise à augmenter la probabilité que le client procède à une réservation. Cet algorithme est fonction de la caractéristique des hôtels, du pays de destination, de l'historique d'achat ainsi que des prix proposés par la concurrence. L'objectif est de réussir à créer un modèle qui a de meilleurs résultats que celui déjà existant.
<p>Critère de classement<br>
5 - Si l'utilisateur a pris une chambre à cet hôtel<br>
1 - L'utilisateur a cliqué pour avoir plus d'information sur l’hôtel<br>
0 - L'utilisateur n'a ni cliqué ni pris une chambre à cet hôtel</p>
<p>Il faut donc pour chaque recherche proposer le meilleur classement soit pour les trois premiers résultats : 5,1,0</p>
<p>Résultat :<br>
Le critère d'évaluation est le NDCG. Il fallait battre le NDCG d'Expedia qui est de 0.49748.<br>
En conclusion, le meilleur modèle a un de NDCG de 0.54075, mon modèle obtient un NDCG de 0.47527.<br>
En classement final, j'obtiens <strong>la 132e place sur un total de 337 équipes</strong> participantes. La taille de la mémoire nécessaire à l'apprentissage et à la prédiction, la lenteur de divers traitement sous R ont rendu plus ardue la recherche du meilleur modèle.</p>
<p>Pour les modèles de learning ranking (apprendre à classer), il y a trois types approches :</p>
<p><strong>Pointwise</strong><br>
Le problème de ranking est transformé en un problème de régression, classification. La structure de la requête est ignorée.</p>
<p><strong>Pairwise</strong><br>
Ici le problème de ranking est transformé en un problème classification, mais ici les différents résultats de la requête sont classés deux par deux. La structure de la requête dans son ensemble est ainsi ignorée. Cette méthodologie est lourde en calcul du fait du grand nombre de combinaison.(RankSVM)</p>
<p><strong>Listwise</strong><br>
En comparaison avec l'approche pairwise qui minimise les erreurs de classification des documents des requêtes par deux, l'approche pairwise vise à minimiser l'erreur de ranking de la requête. On tient compte ici de la structure de la requête. (ListNet, Lambdarank)</p>
<p>Un excellent document pour commencer :<br>
<a href="http://www.hangli-hl.com/uploads/3/4/4/6/34465961/learning_to_rank.pdf">http://www.hangli-hl.com/uploads/3/4/4/6/34465961/learning_to_rank.pdf</a></p>
<p><strong>NDCG</strong><br>
Normalized Discounted Cumulative Gain est la mesure de performance d'un système de recommandation. Elle varie de 0.0 à 1.0, où 1.0 représente le classement idéal. Cette mesure est communément utilisée pour évaluer la performance d'un moteur de recherche.<br>
<lr><br>
Exemple issu de <a href="https://en.wikipedia.org/wiki/Discounted_cumulative_gain#Normalized_DCG">wikipedia</a></lr></p>
<table border="1" class="wikitable" style="background-color: #f9f9f9; border-collapse: collapse; border: 1px solid rgb(170, 170, 170); color: black; font-family: sans-serif; font-size: 13px; line-height: 19.1875px; margin: 1em 0px;"><tbody>
<tr><th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em; text-align: center;"><br class="Apple-interchange-newline">
<img alt="rel_{i}" class="tex" src="http://upload.wikimedia.org/math/e/5/1/e51cbb62c039ce5344cbc95967c1cee2.png" style="border: none; vertical-align: middle;"></th><th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em; text-align: center;"><img alt="\log_{2}i" class="tex" src="http://upload.wikimedia.org/math/f/2/6/f262c4148279fde630ad85c89614864c.png" style="border: none; vertical-align: middle;"></th><th style="background-color: #f2f2f2; border: 1px solid rgb(170, 170, 170); padding: 0.2em; text-align: center;"><img alt=" \frac{rel_{i}}{\log_{2}i} " class="tex" src="http://upload.wikimedia.org/math/6/2/3/623fa28c81265cb3c2dffd0f8f5e739f.png" style="border: none; vertical-align: middle;"></th></tr>
<tr><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">1</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">3</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">0</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">N/A</td></tr>
<tr><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">2</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">2</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">1</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">2</td></tr>
<tr><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">3</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">3</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">1.585</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">1.892</td></tr>
<tr><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">4</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">0</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">2.0</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">0</td></tr>
<tr><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">5</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">1</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">2.322</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">0.431</td></tr>
<tr><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">6</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">2</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">2.584</td><td style="border: 1px solid rgb(170, 170, 170); padding: 0.2em;">0.774</td></tr>
</tbody></table>
<lr>
Classement présent
<div class="con" style="width:100px;height:80px;">
$${DCG_{6}} = rel_{1} + \sum_{i=2}^{6} \frac{rel_{i}}{\log_{2}i} = 3 + (2 + 1.892 + 0 + 0.431 + 0.774) = 8.10 $$
</div>
Classement idéal
C'est à dire 3,3,2,2,1,0
<div class="con" style="width:100px;height:50px;">
$${IDCG_{6}} = 8.69$$
</div>
Le NDCG est le rapport entre le classement présent et le classement idéal.
<div class="con" style="width:100px;height:50px;">
$${nDCG_{6}} = \frac{DCG_{6}}{IDCG_{6}} = \frac{8.10}{8.69} = 0.932$$    
</div>
<br>
<p><strong>Données</strong></p>
<p>Expédia a fourni une base Train qui inclus à la fois des clients dont les données ont été ordonnées (en première position : réservation de chambre ou clique) par l'algorithme d'Expédia et des clients dont les données ont été mises dans le désordre.<br>
La base Train a 9,9 millions de lignes et la base Test a 6,6 millions de lignes.</p>
<p>Pour faire apprendre mon modèle, j'utilise la base Train non randomisée soit 3 millions de lignes.</p>
<p>Mon modèle final est de type pointwise après avoir tenté un modèle de type pairwise.</p>
<h3 id="1modlepointwise"><strong>1.Modèle pointwise</strong></h3>
<p>Le but du jeu est de déterminer pour chaque requête, les hôtels pour lesquels les clients vont réserver au moins une nuit soit 5, cliquer soit 1 ou ne rien faire soit 0.<br>
En utilisant l'approche pointwise, je transforme un problème de classement en une &quot;simple&quot; prédiction. Lors de chaque recherche, une liste d'hôtels est présentée au client or cette liste peut-être longue (jusqu'à plus de 30 hôtels). Si l'on utilise l'ensemble de la base Train c'est-à-dire l'ensemble des hôtels proposés pour réaliser le modèle la proportion des 5 et des 1 est très faible par rapport à la fréquence des 0, les 5 et 1 sont alors des événements rares. C'est pour cela que je limite le nombre d'hôtels aux 5 premiers proposé ce qui fait mécaniquement augmenter la proportion de 5 et de 1, les 5 et les 1 étant en début de classement. La proportion de 1 étant toujours trop faible, je transforme les 1 en 0 et simplifie le problème. Le modèle devient binomial et s'attache à rechercher les hôtels les plus susceptibles d'être réservés versus ceux qui le sont le moins.<br>
Pour le classement final, j'ordonne les hôtels en fonction de leur probabilité d'être réservé.</p>
<p>J'utilise un gradient boosting qui est constitué d'un ensemble de 2000 arbres avec comme paramètre une distribution de type Bernouilli. La base de train a près de 20% d'hôtels qui ont le score de 5 suite au choix de 5 premiers hôtels. Le gradient boosting a l'avantage de s’accommoder avec les données manquantes et les outliers c'est pourquoi je n'ai pas procédé aux remplacements des valeurs manquantes.</p>
<h3 id="2modlepairwise"><strong>2.Modèle pairwise</strong></h3>
<p>Selon la littérature, les modèles pairwise et listwise sont les plus performants pour résoudre les problèmes de ranking, j'ai commencé à réaliser des tests avec l'algorithme du RankSVM concluant rapide, performant, économe en mémoire vive.<br>
<a href="http://www.cs.cornell.edu/people/tj/svm_light/svm_rank.html">http://www.cs.cornell.edu/people/tj/svm_light/svm_rank.html</a><br>
Cet algorithme utilise un format de fichier peu commun, il a fallu réaliser sous R un petit programme pour convertir mes données dans ce format cependant lorsque j'ai appliqué ce programme à l'ensemble des données de train et de test (10 millions de lignes) j'ai rencontré un problème de performance. Je pense refaire ce programme sous Python.</p>
<p><strong>Conclusion</strong><br>
Mon modèle nécessite quelques heures d’exécution, le modèle gagnant près de 30 heures. Ces concours sont très utiles pour se former et échanger, mais dans un cadre industriel où la référence de temps est la centaine de millisecondes le meilleur modèle est déjà trop lent. À la suite d'une conférence chez Critéo, j'ai découvert que les modèles de ce dernier ainsi que ceux de Google étaient plus &quot;simples&quot; que je ne l'avais pensé, ils sont surtout rapides et optimisés.</p>
<p>Autres :</p>
<ul>
<li><a href="http://gist.github.com/alfard/7536739">code calcul du NDCG</a></li>
<li><a href="http://gist.github.com/alfard/7536685">code Gradient Boosting</a></li>
<li><a href="http://gist.github.com/alfard/7536752">code mise au format RankSVM</a></li>
<li><a href="http://www.kaggle.com/c/expedia-personalized-sort">Site de la compétition</a></li>
</ul>
</lr></div>]]></content:encoded></item><item><title><![CDATA[Manipuler de gros fichiers en ayant peu de mémoire vive]]></title><description><![CDATA[<div class="kg-card-markdown"><p>SAS a une gestion très poussée de la mémoire, cet outil propriétaire permet de manipuler des bases de données de très grande taille et utilise la mémoire vive ainsi que le disque dur comme espace de travail, or cet outil n'est pas toujours disponible dans les petites structures et présente</p></div>]]></description><link>https://www.iwannadata.com/manipuler-de-gros-fichiers-en-ayant-peu-de-memoire-vive/</link><guid isPermaLink="false">5bb8cd906500c6097eaa68f1</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Mon, 18 Nov 2013 15:00:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>SAS a une gestion très poussée de la mémoire, cet outil propriétaire permet de manipuler des bases de données de très grande taille et utilise la mémoire vive ainsi que le disque dur comme espace de travail, or cet outil n'est pas toujours disponible dans les petites structures et présente un coût non négligeable en licence.</p>
<p>R est un outil puissant de modélisation, mais dans le domaine du datamanagement il a un certain nombre de faiblesses : la taille des tables est limitée par la taille de la mémoire vive, les modules complémentaires de R qui facilitent le chargement de grosses tables ne permettent pas d'accéder à l'ensemble des librairies de modélisation.</p>
<p>Pour la partie modélisation, il semble difficile de s'astreindre des contraintes en mémoire vive, on utilisera volontiers des technologies cloud telles qu' Amazon EC2. Pour le datamanagement, il est possible de réaliser la plupart des manipulations de fichier avec des ressources très faibles avec PostgreSQL ou le langage de programmation PYTHON.</p>
<h3 id="1postgresql"><strong>1.PostgreSQL</strong></h3>
<p>PostgreSQL est un système de gestion de base de données gratuit et très puissant, l'installation est très simple et permet de charger et manipuler des tables de grandes tailles.</p>
<p>Par le passé ayant déjà utilisé des bases de données sur des outils limités tels que Access je constate que la mise en place de PostgreSQL aurait permis à de nombreuses structures de gagner en rapidité et en optimisation des traitements.</p>
<p>Lors d'installation, il faut créer un utilisateur</p>
<p><mark>Lancement de postgres</mark> : sudo -i -u postgres puis psql.</p>
<p><mark>Commande base</mark></p>
<p><mark>Lister les tables</mark>  : \d</p>
<p><mark>Lister les colonnes d'une table</mark> : \d nom_de_la_table</p>
<p><mark>Effacer table</mark> : drop table nom_de_la_table;</p>
<p><mark>Création de la table et de ces variables</mark></p>
<p>CREATE TABLE TRAIN (ID BIGINT PRIMARY KEY,TITLE TEXT,BODY TEXT,TAGS TEXT);</p>
<p><mark>Importer un fichier csv dans la table TRAIN</mark></p>
<p>COPY TRAIN FROM   '/home/alfard/Documents/Kaggle/Facebook2/Train.csv' csv header;</p>
<p>Une fois la table importée on peut réaliser les traitements en utilisant le langage SQL.</p>
<p><mark>Exporter une table en fichier csv</mark></p>
<p>COPY matable TO '/root/pg/extraction.csv' WITH CSV;</p>
<h3 id="2python"><strong>2.Python</strong></h3>
<p>Python est un langage de plus en plus en vogue dans le monde de la data, il est simple à apprendre, dispose de plus en plus de librairies spécialisées et a reçu récemment un soutient financier de près de 3 millions de dollars de la DARPA.</p>
<p>Il est possible avec Python de charger un fichier ligne et par ligne, d'y appliquer des traitements et de l'enregistrer ligne par ligne, la consommation en mémoire vive est alors très faible.</p>
<pre><code>#A noter sur python, on compte à partir de 0 et non de 1

import pandas as pd
import numpy as np
import csv


f = open('/home/alfard/Documents/Kaggle/Facebook2/Train.csv',&quot;rb&quot;)
fw= open('/home/alfard/Documents/Kaggle/Facebook2/TrainClean.csv',&quot;w&quot;)

 
fileopen = csv.reader(f,delimiter=',', quotechar='&quot;')
filewrite = csv.writer(fw,delimiter=',', quotechar='&quot;')

#Mise en place d'un compteur pour connaître le nombre de ligne traitées 
p=0
for row in fileopen:
    #Exemple de traitement de caractère
    for i in range(len(stopwords)):
        
        row[1] = row[1].lower()
        row[1] = row[1].replace(stopwords[i],' ')
        row[1] = &quot; &quot;.join(row[1].split())
        

        #Ecriture du résultat du traitement dans le fichier TrainClean.csv       
    filewrite.writerow([row[1],row[3]])
    p=p+1
    print p
        # row[1],row[3] signifie que je copie la 2e et le 4e élement de la ligne traitée,
        # à la fin de traitement, l'ensemble des éléments de la ligne constituera une colonne 
        # CAD la 2e colonne et la 4e colonne 
        

#Obligatoire pour réaliser l'écriture du csv
f.close()
fw.close()
</code></pre>
</div>]]></content:encoded></item><item><title><![CDATA[Calcul matriciel]]></title><description><![CDATA[<div class="kg-card-markdown"><br>
<p>À la suite du concours Heritage Health Prize j'ai constaté que sous R le moteur de calcul matriciel n'était pas rapide (je ne fais pas référence aux calculs des librairies spécialisées) ce qui n'est pas vraiment compatible avec une utilisation professionnelle.<br>
Il existe pourtant des solutions qui permettent de faire</p></div>]]></description><link>https://www.iwannadata.com/calcul-matriciel/</link><guid isPermaLink="false">5c0d354677760a67b304fafb</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Sat, 11 May 2013 15:33:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><br>
<p>À la suite du concours Heritage Health Prize j'ai constaté que sous R le moteur de calcul matriciel n'était pas rapide (je ne fais pas référence aux calculs des librairies spécialisées) ce qui n'est pas vraiment compatible avec une utilisation professionnelle.<br>
Il existe pourtant des solutions qui permettent de faire du calcul matriciel avec un rapport coût/performance intéressant. J'en ai testé quelques-unes.</p>
<p>Le modèle ensemble est une combinaison de modèles. Il faut déterminer les meilleures combinaisons c'est à dire celles qui permettent de minimiser l'erreur de l'échantillon d'apprentissage et de test.</p>
<p>Pour chaque modèle, nous avons une prévision, le poids de ces prévisions dans l'ensemble modèle est recherché de la façon suivante :</p>
<p><strong>Boucle</strong><br>
Prévision de l'ensemble modèle<br>
(<br>
prévision modèle 1<em>poids de 1+<br>
prévision modèle 2</em>poids de 2+<br>
prévision modèle 3<em>poids de 3+<br>
prévision modèle 4</em>poids de 4<br>
)<br>
/100</p>
<p>Poids de 1+Poids de 2+Poids de 3+Poids de 4 = 100</p>
<p>Le poids de 1,2,3 et 4 varie de 0 à 100, soit près de 156 849 combinaisons.</p>
<p>Pour chacune de ces combinaisons, je calcule l'erreur de l'échantillon d'apprentissage et de test.</p>
<p><strong>Julia</strong> : <a href="http://julialang.org/">http://julialang.org/</a><br>
Julia est un nouveau langage qui a été crée par le MIT qui a pour objectif de permettre le calcul matriciel avec un code proche de Matlab et de performance proche du C/Fortran. Il est relativement simple de transcrire du code Matlab en Julia. Inutilisable professionnellement à  l'heure actuelle car trop jeune cependant il a un énorme potentiel.</p>
<p><strong>Armadillo</strong> : <a href="http://arma.sourceforge.net/">http://arma.sourceforge.net/</a><br>
Armadillo est une librairie qui permet de faire du calcul matriciel en C++ avec un code proche de Matlab. Elle présente d'excellente performance.<br>
<br></p>
<table border="0" cellspacing="0" cols="6">
 <colgroup width="117"></colgroup>
 <colgroup width="74"></colgroup>
 <colgroup width="110"></colgroup>
 <colgroup width="122"></colgroup>
 <colgroup width="100"></colgroup>
 <colgroup width="90"></colgroup>
 <tbody>
<tr>
  <td align="CENTER" height="73" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000;" valign="MIDDLE"><b>Outil</b></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000;" valign="MIDDLE"><b>Logiciel libre</b></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000;" valign="MIDDLE"><b>Nombre de processeurs utilisés lors de la boucle</b></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000;" valign="MIDDLE"><b>Traitement multiprocesseur</b></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000;" valign="MIDDLE"><b>Temps de calcul</b></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000;" valign="MIDDLE"><b>Détail du code</b></td>
 </tr>
<tr>
  <td align="CENTER" height="19" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">R</span></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">X</span></td>
  <td align="CENTER" sdnum="1036;" sdval="1" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">1</span></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">Pas disponible</span></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">12h56</span></td>
  <td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-top: 1px solid #000000;"><a href="https://gist.github.com/alfard/5355960">Code R</a></td>
 </tr>
<tr>
  <td align="CENTER" height="19" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">Julia</span></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">X</span></td>
  <td align="CENTER" sdnum="1036;" sdval="1" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">1</span></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">Pas dans le code</span></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">3h11</span></td>
  <td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-top: 1px solid #000000;"><a href="https://gist.github.com/alfard/5355794">Code Julia</a></td>
 </tr>
<tr>
  <td align="CENTER" height="19" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">Matlab</span></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;"><br></span></td>
  <td align="CENTER" sdnum="1036;" sdval="1,5" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">1,5</span></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">X</span></td>
  <td align="CENTER" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">1h18</span></td>
  <td align="LEFT" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-top: 1px solid #000000;"><a href="https://gist.github.com/alfard/5355730">Code Matlab</a></td>
 </tr>
<tr>
  <td align="CENTER" height="19" style="border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">C++/Armadillo</span></td>
  <td align="CENTER" style="border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">X</span></td>
  <td align="CENTER" sdnum="1036;" sdval="2" style="border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">2</span></td>
  <td align="CENTER" style="border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">X</span></td>
  <td align="CENTER" style="border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000;"><span style="font-size: small;">46 minutes</span></td>
  <td align="LEFT" style="border-left: 1px solid #000000; border-top: 1px solid #000000;"><a href="https://gist.github.com/alfard/5355969">Code C++</a></td>
 </tr>
</tbody></table>
<br>
<p>Ne disposant pas de la librairie IML je n'ai pas pu réaliser de test sous SAS</p>
<p>Conclusion : Il existe toujours des solutions pour accélérer un traitement.</p>
</div>]]></content:encoded></item><item><title><![CDATA[Course aux algorithmes ?]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Les données doivent devenir le pétrole du 21ie siècles. À travers de nombreux cours et de concours de modélisation une communauté de data scientist est en train de se constituer. Le big data est un terme à la mode alors que déjà les statisticiens font du big data depuis un</p></div>]]></description><link>https://www.iwannadata.com/course-aux-algorithmes/</link><guid isPermaLink="false">5bb8ce7c6500c6097eaa68f3</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Thu, 28 Feb 2013 15:03:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>Les données doivent devenir le pétrole du 21ie siècles. À travers de nombreux cours et de concours de modélisation une communauté de data scientist est en train de se constituer. Le big data est un terme à la mode alors que déjà les statisticiens font du big data depuis un certain temps.</p>
<p>Pourquoi une telle effervescence ?</p>
<ul>
<li>des outils libres ont fait leurs apparitions et ainsi ont permis de diffuser le data mining, alors qu'auparavant seuls des outils onéreux étaient disponibles.</li>
<li>il est possible de louer de la puissance de calcul en faisant appel à des services de cloud comme Azure ou Amazon EC2 pour quelques euros</li>
</ul>
<p>La contrepartie à ce développement est de mettre de coté l'importance des statistiques pour la réalisation et la compréhension des modèles.</p>
<p>Je ferais une analogie avec le monde du jeu d'échec.</p>
<p>En 1988, Gary Kasparov a perdu une partie face à Deep Blue qui était capable de calculer 300 millions de coups par seconde. Pour caricaturer le statisticien comme le jour d'échec connait les raccourcis pour trouver le meilleur modèle en limitant les calculs, tandis que l'informaticien alias Deep Blue connait la puissance brute pour trouver le meilleur modèle hors pour devenir un bon data scientist il faut combiner ces deux aspects, il faut être à la fois un bon statisticien et un bon informaticien.</p>
<p>Or aujourd'hui, il n'y a de moins en moins une analyse en amont des données, du travail d'enquêtes pour comprendre ces dernières. J'ai vu de nombreux concours de modélisations où la connaissance des données n'était pas un préalable obligatoire :</p>
<ul>
<li>la KDD Cup 2009 sponsorisée par Orange pour expliquer le comportement du consommateur avait la majorité des variables non expliquées</li>
<li>le concours Kaggle pour prévoir la durée d'hospitalisation avec un ensemble de prix s'élevant à 3 millions de dollars a un certain nombre de variables dont l'articulation est obscure pour l'ensemble des participants</li>
</ul>
<p>Cette méconnaissance des données risque de transformer le travail de modélisation en un simple concours d'algorithme et de puissance de calcul. Il faut utiliser la puissance de calcul à bon escient, et ne pas négliger le travail d'études statistiques des données en amont.</p>
</div>]]></content:encoded></item><item><title><![CDATA[Predict census mail return rates]]></title><description><![CDATA[<div class="kg-card-markdown"><br>
<p>En 2010 des courriers ont été envoyés dans les foyers américains pour réaliser le recensement. Afin d'optimiser sa communication le bureau du recensement recherche le meilleur modèle qui sera à même de prévoir le taux de retour des plis, pour cela nous avons à notre disposition le taux de retour</p></div>]]></description><link>https://www.iwannadata.com/predict-census-mail-return-rates/</link><guid isPermaLink="false">5c0d2f7a77760a67b304faf7</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Tue, 06 Nov 2012 15:10:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><br>
<p>En 2010 des courriers ont été envoyés dans les foyers américains pour réaliser le recensement. Afin d'optimiser sa communication le bureau du recensement recherche le meilleur modèle qui sera à même de prévoir le taux de retour des plis, pour cela nous avons à notre disposition le taux de retour réel de 2010, ainsi qu'un ensemble de données sociodémographique. Les données sont au niveau des &quot;block group&quot; qui regroupent jusqu'à 25 000 habitants. Il a été possible d'inclure des données externes après validation par le bureau du recensement américain.</p>
<p>L'évaluation se fait par la moyenne absolue des erreurs pondérées par le poids des populations (weighted mean absolute error).</p>
<p><strong>Résultat</strong> : le meilleur modèle a un WMAE de 2.54476, mon modèle arrive à un WMAE de 3.27624.<br>
En classement final j'obtiens la 98e place sur un total de 244 équipes participantes.</p>
<br>
<p align="center">
<img alt="Image Description" src="https://www.iwannadata.com/content/images/2018/12/census.png" style="width: 515px; height:569px">
</p>
<br>
<p>2: Avec un nombre si élevé de variables il est difficile de choisir les données qui appartiendront au modèle, la première approche qui j'avais mis en place fut de supprimer les valeurs qui étaient trop corrélées entre elles, cela fut fastidieux sans des résultats probants.<br>
Dans mon esprit un modèle ne doit pas avoir trop de variables explicatives, car le but d'un modèle c'est de pouvoir déterminer les variables les plus déterminantes.<br>
J'ai pour la première fois utilisés la sélection de variables en utilisant un random forest, cette technique semble utilisée dans de nombreuses situations, des utilisateurs de SAS Miner ne disposant pas de random forest utilisent R dans un premier temps pour essayer de déterminer les variables les plus explicatives.<br>
Par un processus itératif, j'isole 40 variables.</p>
<p>3: Pour tenter d'améliorer le modèle, j'ai inclus les données géographiques (longitude, latitude) ainsi que les taux de chômage de chacune des zones, je n'ai pas d'amélioration significative du modèle.</p>
<p>4: Sur mes données j'applique les trois modèles suivants : random forest, gradient boosting ainsi que neural network.<br>
Le gradient boosting donne les meilleures prévisions suivies des random forest et du neural network. Ne disposant pas de puissance de calcul nécessaire, je n'ai pas pu réaliser le meilleur des tunings. L'utilisation du cloud amazon EC2 devrait à l'avenir me permettre d'éviter cet écueil.</p>
<p>5: En combinant mes trois modèles j'ai significativement amélioré mes estimations, j'ai réalisé un ensemble modèle linéaire, une simple régression du taux de retour réel versus les taux de retour estimé par les trois modèles. L'utilisation la plus connue du modèle ensemble fut lors du concours Netfix.<br>
<a href="http://elf-project.sourceforge.net/CombiningPredictionsForAccurateRecommenderSystems.pdf">Papier de référence au sujet de la combinaison de prédictions</a></p>
<p><a href="https://www.kaggle.com/c/us-census-challenge">Lien de la compétition kaggle</a></p>
</div>]]></content:encoded></item><item><title><![CDATA[Best Buy mobile website]]></title><description><![CDATA[<div class="kg-card-markdown"><br>
On recherche à déterminer le comportement d'achat de jeux Xbox à partir de requêtes sur la plate forme mobile de Best Buy. À partir d'une requête comment peut-on prévoir le clic sur un produit ?
<p>Pour cela nous disposons d'un historique de deux années comportant 67 millions de clics et 27</p></div>]]></description><link>https://www.iwannadata.com/best-buy-mobile-web-site/</link><guid isPermaLink="false">5c0d2c5377760a67b304faf5</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Sat, 29 Sep 2012 14:53:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><br>
On recherche à déterminer le comportement d'achat de jeux Xbox à partir de requêtes sur la plate forme mobile de Best Buy. À partir d'une requête comment peut-on prévoir le clic sur un produit ?
<p>Pour cela nous disposons d'un historique de deux années comportant 67 millions de clics et 27 millions de recherches, ainsi d'un catalogue des jeux Xbox avec leur référence produit respective.</p>
<p><strong>Résultat</strong> : la meilleure méthodologie arrive à prévoir en moyenne 78 % de clics sur un produit, ma méthodologie arrive à en prévoir en moyenne 64 %. En classement final, j'obtiens la 65e place sur un total de 97 équipes participantes.</p>
<p>Pour chaque requête, il y a des probabilités différentes de choisir différents produits, je conserve la probabilité de choix la plus élevée que je mets dans un dictionnaire que j'appelle dictionnaire historique.<br>
Le cas des requêtes existantes a été ainsi traité.</p>
<p>Si une requête n'existe pas dans l'historique, j'utilise alors un dictionnaire que j'appelle dictionnaire nouveau. Ce dictionnaire est constitué de la manière suivante :<br>
je procède à un rapprochement textuel c'est-à-dire si je réalise la requête suivante :&quot;tetris&quot;, alors le moteur va rechercher dans le catalogue des produits un nom de produits qui se rapproche le plus du nom &quot;tetris&quot; en utilisant la fonction SAS compged (voir ci-dessous). Je n'ai pas réalisé volontairement de filtre sur le catalogue des produits pour n'intégrer que les produits xbox ce qui fait réduire les résultats de ma prévision.<br>
<br></p>
<p align="center">
<img alt="Image Description" src="https://www.iwannadata.com/content/images/2018/12/xbox2.png" style="width: 515px; height:430px">
</p>
<br>
<p>Normalisation : suppression des accents, des majuscules, des espaces</p>
<p><strong>La fonction compged</strong></p>
<p>Elle permet de calculer sous la forme d'un score la distance généralisée entre deux chaines de caractères. Plus le score GED est faible plus il y a correspondance des deux chaînes de caractères.</p>
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
 <colgroup><col width="85*">
 <col width="85*">
 <col width="85*">
 </colgroup><tbody>
<tr valign="TOP">
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="33%"><div align="CENTER">
Chaîne de caractères A &nbsp;</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="33%"><div align="CENTER">
Chaîne de caractères B &nbsp;&nbsp;</div>
</td>
  <td style="border: 1px solid #000000; padding: 0.1cm;" width="33%"><div align="CENTER">
Score GED</div>
</td>
 </tr>
<tr valign="TOP">
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baboon</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baboon</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="33%"><div align="CENTER">
0</div>
</td>
 </tr>
<tr valign="TOP">
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baXboon
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baboon
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="33%"><div align="CENTER">
100</div>
</td>
 </tr>
<tr valign="TOP">
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baoon
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baboon
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="33%"><div align="CENTER">
100</div>
</td>
 </tr>
<tr valign="TOP">
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baXoon
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baboon
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="33%"><div align="CENTER">
50</div>
</td>
 </tr>
<tr valign="TOP">
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baboonX
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baboon
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="33%"><div align="CENTER">
10</div>
</td>
 </tr>
<tr valign="TOP">
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baboo
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="33%"><div align="CENTER">
baboon
</div>
</td>
  <td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="33%"><div align="CENTER">
20</div>
</td>
 </tr>
</tbody></table>
Exemples issus de Nefera Croom, NYASUG June 2009
<br>
<br>
<p>Cette fonction est très utile, je l'ai déjà utilisée dans un programme pour détecter des emails crées par des robots, les emails ayant un corps identique auquel une série de chiffres (exemple : <a href="mailto:toto1@yahoo.fr">toto1@yahoo.fr</a>, <a href="mailto:toto2@yahoo.fr">toto2@yahoo.fr</a>, <a href="mailto:toto3@yahoo.fr">toto3@yahoo.fr</a>).</p>
<p><a href="https://www.kaggle.com/c/acm-sf-chapter-hackathon-small">Lien de la compétition kaggle</a></p>
</div>]]></content:encoded></item><item><title><![CDATA[Retour sur le Census]]></title><description><![CDATA[<div class="kg-card-markdown"><p>L’intérêt des compétitions de Kaggle est qu'une fois l'épreuve terminée il est possible de découvrir les meilleures solutions. La méthodologie gagnante sera bientôt accessible dans le détail, car le bureau du recensement a décidé de partager le modèle avec l'ensemble de la communauté, en attendant il ressort plusieurs pistes</p></div>]]></description><link>https://www.iwannadata.com/retour-sur-le-census/</link><guid isPermaLink="false">5bb8ceef6500c6097eaa68f5</guid><dc:creator><![CDATA[Antoine Bencheikh]]></dc:creator><pubDate>Thu, 20 Sep 2012 15:04:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>L’intérêt des compétitions de Kaggle est qu'une fois l'épreuve terminée il est possible de découvrir les meilleures solutions. La méthodologie gagnante sera bientôt accessible dans le détail, car le bureau du recensement a décidé de partager le modèle avec l'ensemble de la communauté, en attendant il ressort plusieurs pistes qui ont permis aux compétiteurs de s'élever en haut du classement</p>
<ul>
<li>
<p>à partir des variables de départ de nouvelles variables ont été créées à la suite d'étude des relations des variables entres-elles souvent en réalisant de simples régressions, à noter qu'un module de R : Mars permet de rechercher ces interactions (à voir)</p>
</li>
<li>
<p>Les modèles n'ont pas été simplement lancés en testant différents paramètres, mais un gros travail de &quot;fitting&quot; a été réalisé c'est-à-dire que pour chacun des paramètres des modèles des intervalles ont été définis et le programme de recherche du modèle a tourné le temps que les modifications de ces paramètres permettent de réduire l'erreur du modèle. Cette méthode a donné de bons résultats, mais a été gourmande en calcul : pour trouver le nombre d'arbres optimal en utilisant le gradient boosting cela a nécessité sur un ordinateur personnel près de trois journées de calcul. Il est donc nécessaire de savoir programmer pour trouver les meilleurs paramètres.</p>
</li>
<li>
<p>il semble obligatoire de réaliser un ensemble model c'est-à-dire en utilisant différents modèles pour réaliser la prévision</p>
</li>
</ul>
</div>]]></content:encoded></item></channel></rss>