{"id":953,"date":"2017-05-26T09:15:03","date_gmt":"2017-05-26T09:15:03","guid":{"rendered":"http:\/\/blog.tiran.info\/?p=953"},"modified":"2017-05-26T09:15:03","modified_gmt":"2017-05-26T09:15:03","slug":"reseaux-de-neurones-avec-r-1","status":"publish","type":"post","link":"https:\/\/blog.tiran.stream\/?p=953","title":{"rendered":"R\u00e9seaux de neurones avec R (#1)"},"content":{"rendered":"<p style=\"text-align: justify;\">On parle beaucoup de l&rsquo;utilisation des r\u00e9seaux de neurones dans des domaines vari\u00e9s (<a href=\"http:\/\/www.numerama.com\/sciences\/253407-tribune-la-medecine-est-elle-la-prochaine-conquete-de-lintelligence-artificielle.html\" target=\"_blank\" rel=\"noopener\">diagnostic m\u00e9dical<\/a>, <a href=\"https:\/\/www.sciencesetavenir.fr\/high-tech\/intelligence-artificielle\/applique-a-la-finance-le-deep-learning-modifie-t-il-le-cours-de-l-economie_111364\" target=\"_blank\" rel=\"noopener\">analyse financi\u00e8re<\/a>, reconnaissance d&rsquo;<a href=\"http:\/\/www.lefigaro.fr\/secteur\/high-tech\/2016\/11\/24\/32001-20161124ARTFIG00178-l-intelligence-artificielle-sait-mieux-lire-sur-les-levres-que-l-homme.php\" target=\"_blank\" rel=\"noopener\">image<\/a> ou <a href=\"https:\/\/www.lesechos.fr\/20\/02\/2017\/lesechos.fr\/0211814265707_les-nouvelles-promesses-de-la-voix-artificielle.htm\" target=\"_blank\" rel=\"noopener\">vocale<\/a> etc&#8230;). Les fondements math\u00e9matiques sont connus depuis longtemps et les premi\u00e8res mise en oeuvre comme le\u00a0<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Perceptron\" target=\"_blank\" rel=\"noopener\">perceptron<\/a> datent des ann\u00e9es 50. Ce n&rsquo;est pourtant que ces derni\u00e8res ann\u00e9es que ces techniques se sont d\u00e9mocratis\u00e9es gr\u00e2ce notamment aux capacit\u00e9s de calcul des processeurs actuels et \u00e0 la profusion des donn\u00e9es disponibles (n\u00e9cessaires \u00e0 leur entrainement).<\/p>\n<p style=\"text-align: justify;\">On trouve sur internet d&rsquo;innombrables sources d&rsquo;information sur les <a href=\"https:\/\/fr.wikipedia.org\/wiki\/R%C3%A9seau_de_neurones_artificiels\" target=\"_blank\" rel=\"noopener\">ANN (Artificial Neural Network)<\/a>. Une bonne introduction se trouve sur <a href=\"https:\/\/fr.wikiversity.org\/wiki\/R%C3%A9seaux_de_neurones\" target=\"_blank\" rel=\"noopener\">Wikiversit\u00e9<\/a>.<\/p>\n<p style=\"text-align: justify;\">Dans les grandes lignes, un ANN est constitu\u00e9 d&rsquo;une succession de <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Neurone_formel\" target=\"_blank\" rel=\"noopener\">couches de neurones<\/a> interconnect\u00e9s. Chaque interconnexion est caract\u00e9ris\u00e9e par un <a href=\"https:\/\/en.wikipedia.org\/wiki\/Synaptic_weight\" target=\"_blank\" rel=\"noopener\">poids synaptique<\/a>, et chaque neurone met en oeuvre une <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Fonction_d%27activation\" target=\"_blank\" rel=\"noopener\">fonction d&rsquo;activation<\/a>.<\/p>\n<p style=\"text-align: justify;\">La phase d&rsquo;apprentissage consiste dans l&rsquo;ajustement progressif des poids synaptique en utilisant un algorithme de <a href=\"https:\/\/fr.wikipedia.org\/wiki\/R%C3%A9tropropagation_du_gradient\" target=\"_blank\" rel=\"noopener\">r\u00e9tropropagation (back-propagation) du gradient<\/a>.<\/p>\n<p style=\"text-align: justify;\">La structure du r\u00e9seau (nombre de couches, nombre de neurones et fonctions d&rsquo;activation) est en revanche fix\u00e9e \u00e0 priori.<\/p>\n<p style=\"text-align: justify;\">Ici, je me suis int\u00e9ress\u00e9 \u00e0 l&rsquo;impl\u00e9mentation des ANN avec R. Pour cela, j&rsquo;ai utilis\u00e9 des donn\u00e9es mises \u00e0 disposition sur le site de <a href=\"https:\/\/archive.ics.uci.edu\/ml\/datasets\/Breast+Cancer+Wisconsin+%28Diagnostic%29\" target=\"_blank\" rel=\"noopener\">l&rsquo;UCI<\/a>\u00a0et relatives au diagnostic du cancer du sein pour une cohorte du Wisconsin.<\/p>\n<p style=\"text-align: justify;\">Plusieurs jeux de donn\u00e9es sont disponibles, je me suis initialement int\u00e9ress\u00e9 au dataset\u00a0<a href=\"https:\/\/archive.ics.uci.edu\/ml\/machine-learning-databases\/breast-cancer-wisconsin\/breast-cancer-wisconsin.data\" target=\"_blank\" rel=\"noopener\">breast-cancer-wisconsin.data<\/a>\u00a0dont le format est d\u00e9taill\u00e9 ici:\u00a0<a href=\"https:\/\/archive.ics.uci.edu\/ml\/machine-learning-databases\/breast-cancer-wisconsin\/breast-cancer-wisconsin.names\" target=\"_blank\" rel=\"noopener\">breast-cancer-wisconsin.names<\/a>.<\/p>\n<p style=\"text-align: justify;\">Celui-ci contient 699 instances. 9 attributs num\u00e9riques sont exploitables. 2\/3 des enregistrements correspondent \u00e0 des tumeurs b\u00e9gnines, 1\/3 a des tumeurs malignes.<\/p>\n<pre class=\"brush: js; ruler: true;\">\u00a0\n&gt; breastcancer &lt;- read.csv(url(&quot;https:\/\/archive.ics.uci.edu\/ml\/machine-learning-databases\/breast-cancer-wisconsin\/breast-cancer-wisconsin.data&quot;), header=FALSE)\n&gt; summary(breastcancer)\n       V1                 V2               V3               V4               V5               V6               V7            V8               V9        \n Min.   :   61634   Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   1      :402   Min.   : 1.000   Min.   : 1.000  \n 1st Qu.:  870688   1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.: 2.000   10     :132   1st Qu.: 2.000   1st Qu.: 1.000  \n Median : 1171710   Median : 4.000   Median : 1.000   Median : 1.000   Median : 1.000   Median : 2.000   2      : 30   Median : 3.000   Median : 1.000  \n Mean   : 1071704   Mean   : 4.418   Mean   : 3.134   Mean   : 3.207   Mean   : 2.807   Mean   : 3.216   5      : 30   Mean   : 3.438   Mean   : 2.867  \n 3rd Qu.: 1238298   3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 5.000   3rd Qu.: 4.000   3rd Qu.: 4.000   3      : 28   3rd Qu.: 5.000   3rd Qu.: 4.000  \n Max.   :13454352   Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.000   8      : 21   Max.   :10.000   Max.   :10.000  \n                                                                                                         (Other): 56                                    \n      V10              V11      \n Min.   : 1.000   Min.   :2.00  \n 1st Qu.: 1.000   1st Qu.:2.00  \n Median : 1.000   Median :2.00  \n Mean   : 1.589   Mean   :2.69  \n 3rd Qu.: 1.000   3rd Qu.:4.00  \n Max.   :10.000   Max.   :4.00  \n                                \n&gt; \n<\/pre>\n<p style=\"text-align: justify;\">On op\u00e8re quelques ajustements sur le dataset :<\/p>\n<ul>\n<li style=\"text-align: justify;\">Suppression de la premiere colonne (V1) qui correspond \u00e0 un ID patient.<\/li>\n<li style=\"text-align: justify;\">Binarisation (0\/1) de la colonne V11 qui correspond au diagnostic (codification initiale: 2 pour une tumeur benigne, 4 pour une tumeur maligne)<\/li>\n<li style=\"text-align: justify;\">Suppression des lignes pour lesquelles le champ V7 est inconnu (\u00ab\u00a0?\u00a0\u00bb)<\/li>\n<li style=\"text-align: justify;\">Conversion de la colonne V7 de facteur \u00e0 num\u00e9rique.<\/li>\n<li style=\"text-align: justify;\">Centrage\/r\u00e9duction \u00e0 l&rsquo;aide de la fonction \u00ab\u00a0scale\u00a0\u00bb de toutes les valeurs du dataframe (sauf celles de la colonne V11 qui est binaris\u00e9e)<\/li>\n<\/ul>\n<pre class=\"brush: js; ruler: true;\">\u00a0\n&gt; breastcancer &lt;- breastcancer[-1]\n&gt; breastcancer$V11 &lt;- ifelse(breastcancer$V11==2,0,1)\n&gt; breastcancer &lt;- breastcancer[-which(breastcancer$V7==&quot;?&quot;),]\n&gt; breastcancer$V7 &lt;- as.numeric(levels(breastcancer$V7))[breastcancer$V7]\nWarning message:\nNAs introduced by coercion \n&gt; breastcancer[,-10] &lt;- scale(breastcancer[,-10])[,]\n&gt; summary(breastcancer)\n       V2                V3                V4                V5                V6                V7                V8                V9         \n Min.   :-1.2203   Min.   :-0.7017   Min.   :-0.7412   Min.   :-0.6389   Min.   :-1.0050   Min.   :-0.6983   Min.   :-0.9981   Min.   :-0.6125  \n 1st Qu.:-0.8658   1st Qu.:-0.7017   1st Qu.:-0.7412   1st Qu.:-0.6389   1st Qu.:-0.5552   1st Qu.:-0.6983   1st Qu.:-0.5899   1st Qu.:-0.6125  \n Median :-0.1568   Median :-0.7017   Median :-0.7412   Median :-0.6389   Median :-0.5552   Median :-0.6983   Median :-0.1817   Median :-0.6125  \n Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000  \n 3rd Qu.: 0.5523   3rd Qu.: 0.6033   3rd Qu.: 0.5972   3rd Qu.: 0.4084   3rd Qu.: 0.3444   3rd Qu.: 0.6738   3rd Qu.: 0.6347   3rd Qu.: 0.3703  \n Max.   : 1.9703   Max.   : 2.2345   Max.   : 2.2702   Max.   : 2.5029   Max.   : 3.0434   Max.   : 1.7716   Max.   : 2.6758   Max.   : 2.3358  \n      V10               V11        \n Min.   :-0.3481   Min.   :0.0000  \n 1st Qu.:-0.3481   1st Qu.:0.0000  \n Median :-0.3481   Median :0.0000  \n Mean   : 0.0000   Mean   :0.3499  \n 3rd Qu.:-0.3481   3rd Qu.:1.0000  \n Max.   : 4.8461   Max.   :1.0000  \n&gt; \n<\/pre>\n<p style=\"text-align: justify;\">On divise ensuite le dataset breastcancer en un \u00e9chantillon d&rsquo;apprentissage (70%) et un \u00e9chantillon de test (30%). L&rsquo;appel a set.seed permet d&rsquo;obtenir des r\u00e9sultats reproductibles.<\/p>\n<pre class=\"brush: js; ruler: true;\">\u00a0\n&gt; set.seed(1234)\n&gt; sub &lt;- sample(nrow(breastcancer), floor(nrow(breastcancer) * 0.70))\n&gt; breastcancer_train &lt;- breastcancer[sub,]\n&gt; breastcancer_test &lt;- breastcancer[-sub,]\n&gt;\n<\/pre>\n<p style=\"text-align: justify;\">A ce stade, un premier ANN est cr\u00e9\u00e9 \u00e0 l&rsquo;aide du package nnet qui est inclus par d\u00e9faut dans la distribution R. Ce package ne permet n\u00e9anmoins que la cr\u00e9ation d&rsquo;un r\u00e9seau simple contenant \u00a0une unique couche cach\u00e9e.<\/p>\n<p style=\"text-align: justify;\">Ici, on fixe arbitrairement le nombre de neurones de cette couche cach\u00e9e \u00e0 5. Il n&rsquo;y a pas de r\u00e8gle particuli\u00e8re pour d\u00e9terminer ce nombre ni plus g\u00e9n\u00e9ralement la topologie du r\u00e9seau de neurones que l&rsquo;on construit. C&rsquo;est l&rsquo;exp\u00e9rience et la connaissance du domaine d&rsquo;\u00e9tude qui permettent de d\u00e9terminer une topologie adapt\u00e9e. D&rsquo;autre part, il existe plusieurs m\u00e9ta-param\u00e8tres qui peuvent aussi \u00eatre adapt\u00e9s. G\u00e9n\u00e9ralement, on essaie plusieurs configuration et on choisit celle offrant la meilleure performance sur l&rsquo;\u00e9chantillon de test.<\/p>\n<pre class=\"brush: js; ruler: true;\">\u00a0\n&gt; library(nnet)\n&gt; nn_model &lt;- nnet(V11 ~ ., data=breastcancer_train, size=5)\n# weights:  56\ninitial  value 114.785410 \niter  10 value 12.000001\nfinal  value 12.000000 \nconverged\n&gt; pred &lt;- predict(nn_model, newdata=breastcancer_test, supplemental_cols=c(&quot;V11&quot;))\n&gt;\n<\/pre>\n<p style=\"text-align: justify;\">Le vecteur pred contient la sortie de la fonction d&rsquo;activation (sigmoide) du neurone de sortie. On binarise le r\u00e9sultat avec un seuil \u00e0 0.5:<\/p>\n<pre class=\"brush: js; ruler: true;\">\u00a0\n&gt; pred.bin &lt;- ifelse(pred&gt;0.5,1,0)\n&gt; table(pred.bin, breastcancer_test$V11)\n        \npred.bin   0   1\n       0 122   5\n       1   5  73\n&gt; \n<\/pre>\n<p style=\"text-align: justify;\">Le taux de r\u00e9ussite des pr\u00e9dictions avec ce mod\u00e8le est de l&rsquo;ordre de 95% (122+73)\/(122+73+5+5).<\/p>\n<p style=\"text-align: justify;\">C&rsquo;est excellent mais&#8230; pour cet exemple simple, une r\u00e9gression logistique toute simple permet aussi d&rsquo;atteindre un r\u00e9sultat similaire!!<\/p>\n<pre class=\"brush: js; ruler: true;\">\u00a0\n&gt; breastcancer_train$V11 &lt;- as.factor(breastcancer_train$V11)\n&gt; breastcancer_test$V11 &lt;- as.factor(breastcancer_test$V11)\n&gt; log_model &lt;- glm(V11 ~ ., family=binomial, data=breastcancer_train)\n&gt; step(log_model, dir=&quot;backward&quot;, trace=0)\n\nCall:  glm(formula = V11 ~ V2 + V4 + V5 + V7 + V8 + V9, family = binomial, \n    data = breastcancer_train)\n\nCoefficients:\n(Intercept)           V2           V4           V5           V7           V8           V9  \n    -1.4256       1.7191       1.5855       0.8481       0.9593       1.1630       0.8326  \n\nDegrees of Freedom: 477 Total (i.e. Null);  471 Residual\nNull Deviance:\t    610.8 \nResidual Deviance: 68.99 \tAIC: 82.99\n&gt; log_model &lt;- glm(V11 ~ V2 + V4 + V5 + V7 + V8 + V9, family=binomial, data=breastcancer_train)\n&gt; pred &lt;- predict(log_model, breastcancer_test)\n&gt; levels(breastcancer_test$V11)[1]\n[1] &quot;0&quot;\n&gt; pred.bin &lt;- ifelse(pred &gt; 0.5,1,0)\n&gt; table(pred.bin, breastcancer_test$V11)\n        \npred.bin   0   1\n       0 124   8\n       1   3  70\n&gt;\n<\/pre>\n<p style=\"text-align: justify;\">En fait, c&rsquo;est lorsque le nombre de pr\u00e9dicteurs devient important que les ANN tirent r\u00e9ellement leur \u00e9pingle du jeu.<\/p>\n<p style=\"text-align: justify;\">To be continued&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>On parle beaucoup de l&rsquo;utilisation des r\u00e9seaux de neurones dans des domaines vari\u00e9s (diagnostic m\u00e9dical, analyse financi\u00e8re, reconnaissance d&rsquo;image ou<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[2,3,12,13],"tags":[],"class_list":["post-953","post","type-post","status-publish","format-standard","hentry","category-ann","category-classification","category-r","category-regression"],"_links":{"self":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts\/953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=953"}],"version-history":[{"count":0,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts\/953\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}