{"id":2419,"date":"2016-08-18T09:35:42","date_gmt":"2016-08-18T13:35:42","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/fr\/?p=2419"},"modified":"2017-04-29T16:56:12","modified_gmt":"2017-04-29T20:56:12","slug":"la-methode-la-plus-rapide-pour-calculer-une-auc","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/la-methode-la-plus-rapide-pour-calculer-une-auc\/","title":{"rendered":"La m\u00e9thode la plus rapide pour calculer une AUC"},"content":{"rendered":"<h2>Contexte:<\/h2>\n<p>AUC est un\u00a0acronyme pour \u00ab\u00a0Area Under the (ROC) Curve\u00a0\u00bb. Si vous n&rsquo;\u00eates pas familier avec les notions de courbe ROC et d&rsquo;AUC, je vous sugg\u00e8re de commencer par ce <a href=\"http:\/\/blog.yhat.com\/posts\/roc-curves.html\">blog post<\/a>\u00a0avant de continuer.<\/p>\n<p>Dans plusieurs projets, il m&rsquo;a fallu calculer un grand nombre d&rsquo;AUC. J&rsquo;ai commenc\u00e9 par devoir en calculer 25000, puis 230000 et, maintenant, j&rsquo;en suis au tour de 1,5 million. Avec autant d&rsquo;AUC, le temps n\u00e9cessaire pour calculer une AUC devient un param\u00e8tre critique. Je n&rsquo;ai pas trouv\u00e9 beaucoup d&rsquo;information sur ce sujet sp\u00e9cifique, il est probable\u00a0que cette contrainte ne soit pas souvent rencontr\u00e9e dans la communaut\u00e9.<\/p>\n<p>Ainsi, l&rsquo;objectif de cet article est de faire une revue compl\u00e8te des m\u00e9thodes existantes en fonction de leurs temps d&rsquo;ex\u00e9cution. Si jamais vous connaissez une autre m\u00e9thode n&rsquo;h\u00e9sitez pas \u00e0 laisser un commentaire, merci.<\/p>\n<h2>Analyse:<\/h2>\n<p>Partant d&rsquo;un vecteur de scores\u00a0(avec des \u00e9tiquettes):<\/p>\n<table style=\"height: 59px; width: 539px; border-color: #000000;\">\n<tbody>\n<tr>\n<td style=\"width: 121px; text-align: center;\">Label:<\/td>\n<td style=\"width: 29px; text-align: center;\">A<\/td>\n<td style=\"width: 39px; text-align: center;\">A<\/td>\n<td style=\"width: 36px; text-align: center;\">A<\/td>\n<td style=\"width: 45px; text-align: center;\">A<\/td>\n<td style=\"width: 46px; text-align: center;\">&#8230;<\/td>\n<td style=\"width: 50px; text-align: center;\">B<\/td>\n<td style=\"width: 47px; text-align: center;\">B<\/td>\n<td style=\"width: 50px; text-align: center;\">B<\/td>\n<td style=\"width: 44px; text-align: center;\">B<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 121px; text-align: center;\">Score:<\/td>\n<td style=\"width: 29px; text-align: center;\">10<\/td>\n<td style=\"width: 39px; text-align: center;\">20<\/td>\n<td style=\"width: 36px; text-align: center;\">15<\/td>\n<td style=\"width: 45px; text-align: center;\">5<\/td>\n<td style=\"width: 46px; text-align: center;\">&#8230;<\/td>\n<td style=\"width: 50px; text-align: center;\">8<\/td>\n<td style=\"width: 47px; text-align: center;\">12<\/td>\n<td style=\"width: 50px; text-align: center;\">9<\/td>\n<td style=\"width: 44px; text-align: center;\">3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>J&rsquo;ai trouv\u00e9 3 m\u00e9thodes pour calculer une\u00a0AUC:<\/p>\n<ol>\n<li>Aire des trap\u00e9zo\u00efdes: il faut commencer par transformer le vecteur de scores en un vecteur de coordonn\u00e9es (qui repr\u00e9sente la courbe ROC) et calculer l&rsquo;aire de chaque trap\u00e9zo\u00efdes.<\/li>\n<li>Mesure de concordance: il faut comparer toutes les paires possibles et de compter le nombre de fois o\u00f9 le Score(A) &gt; Score(B).<\/li>\n<li>\u00c0 partir du test Mann Whitney: on utilise le calcul de la statistique\u00a0<em>U.<\/em><\/li>\n<\/ol>\n<p>Maintenant, je vous propose d&rsquo;identifier la m\u00e9thode la plus rapide en estimant le nombre d&rsquo;op\u00e9rations n\u00e9cessaires pour chaque strat\u00e9gie. Globalement, si on a besoin de plus d&rsquo;op\u00e9rations, alors le calcul devrait \u00eatre plus long. Estimer le nombre d&rsquo;op\u00e9rations est un sujet vaste appel\u00e9 la\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Time_complexity\">complexit\u00e9<\/a>, mais ici je propose\u00a0une approche simplifi\u00e9:<\/p>\n<ul>\n<li>La mesure de concordance\u00a0n\u00e9cessite\u00a0n*m comparaisons, avec n (resp. m) le nombre d&rsquo;\u00e9chantillons A (resp. B). Cette m\u00e9thode fait\u00a0partie des algorithmes dit quadratiques, le nombre d&rsquo;op\u00e9rations augmente de fa\u00e7on exponentielle avec le nombre d&rsquo;\u00e9chantillons. Il est possible de r\u00e9duire le nombre d&rsquo;op\u00e9rations en comparant seulement un sous-ensemble de paires (n*m*p, with 0&lt;p&lt;1). Chaque paire doit \u00eatre choisie al\u00e9atoirement avec remise. Attention cette astuce ne fait qu&rsquo;\u00e9changer de la pr\u00e9cision (au niveau du calcul de l&rsquo;AUC) contre du temps, et trouver la \u00ab\u00a0taille optimale\u00a0\u00bb\u00a0du sous-ensemble n&rsquo;est pas forc\u00e9ment \u00e9vident.<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Mann%E2%80%93Whitney_U_test#Area-under-curve_.28AUC.29_statistic_for_ROC_curves\">u-test<\/a>: Pour calculer la statistique <em>U<\/em>, nous avons principalement besoin de calculer le rang de chaque \u00e9chantillon en fonction de son score, ce qui peut \u00eatre fait avec un <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Algorithme_de_tri\">algorithme de tri<\/a>\u00a0en\u00a0N*log(N) op\u00e9rations (avec N=n+m).<\/li>\n<li>Calcul de l&rsquo;aire commence par trier le vecteur pour transformer les scores en coordonn\u00e9es. Il est ensuite possible de calculer et de faire la somme de l&rsquo;aire des <a href=\"https:\/\/en.wikipedia.org\/wiki\/File:Composite_trapezoidal_rule_illustration.png\">N-1 trap\u00e9zo\u00efdes<\/a>. Ceci n\u00e9cessite N*log(N) + N op\u00e9rations.<\/li>\n<\/ul>\n<p>Ainsi, c&rsquo;est le U-test qui calcule l&rsquo;AUC avec le moins d&rsquo;op\u00e9rations et qui devrait \u00eatre la m\u00e9thode la plus rapide. Pour v\u00e9rifier ce r\u00e9sultat de fa\u00e7on concr\u00e8te, j&rsquo;ai impl\u00e9ment\u00e9 toutes ces m\u00e9thodes en python3 et j&rsquo;ai obtenu la figure ci-dessous.<\/p>\n<p><a href=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/08\/time_auc-2.png\"><img decoding=\"async\" class=\" wp-image-2406 aligncenter\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/08\/time_auc-2-300x212.png\" alt=\"time_auc\" width=\"464\" height=\"328\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/08\/time_auc-2-300x212.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/08\/time_auc-2.png 680w\" sizes=\"(max-width: 464px) 100vw, 464px\" \/><\/a><\/p>\n<p style=\"text-align: center;\">\u00ab\u00a0concordance_15p\u00a0\u00bb (resp. \u00ab\u00a0concordance_5p\u00a0\u00bb) repr\u00e9sente la m\u00e9thode \u00ab\u00a0concordance\u00a0\u00bb appliqu\u00e9e \u00e0 un sous-ensemble de paires avec p=0.15 (resp. 0.05).<\/p>\n<p>Comme on peut le voir:<\/p>\n<ul>\n<li>Mann Whitney\/u-test est bien la m\u00e9thode la plus rapide, si on n&rsquo;a pas besoin des coordonn\u00e9es pour afficher la courbe ROC.<\/li>\n<li>Le temps de calcul de l&rsquo;aire progresse de mani\u00e8re similaire \u00e0 celui du u-test (les 2 m\u00e9thodes sont dans la cat\u00e9gories des algorithmes pseudo lin\u00e9aires). Comme on pouvait s&rsquo;y attendre, il est toutefois 2 fois plus lent que le u-test: N*log(N) + N = <strong>2*\u00a0<\/strong>N*(log(N)+1).<\/li>\n<li>Comme pour le nombre d&rsquo;op\u00e9rations, le temps de calcul de la concordance augmente de fa\u00e7on exponentielle avec le nombre d&rsquo;\u00e9chantillons.<\/li>\n<li>Le calcul de la concordance sur un sous-ensemble est toujours plus lent que le calcul du\u00a0u-test. Je n&rsquo;ai pas mesur\u00e9 la pr\u00e9cision des estimations de l&rsquo;AUC, mais je ne vois aucun avantage \u00e0 utiliser cette m\u00e9thode. En fait, je ne comprends pas pourquoi cette m\u00e9thode est si souvent cit\u00e9e contrairement au u-test.<\/li>\n<\/ul>\n<p>Ci-dessous vous trouverez l&rsquo;impl\u00e9mentation du \u00ab\u00a0u-test\u00a0\u00bb en R et python. Les impl\u00e9mentations de toutes ces m\u00e9thodes sont d&rsquo;ailleurs disponibles sur mon\u00a0<a href=\"https:\/\/bitbucket.org\/eaudemard\/blog_script\/src\/264a0d574e0a889ea1f106b78b90dbc44f43e2ce\/auc\/?at=master\">git<\/a>.<\/p>\n<table style=\"width: 886px;\">\n<tbody>\n<tr style=\"height: 22.5156px;\">\n<td style=\"width: 424px; text-align: center; height: 22.5156px;\">R<\/td>\n<td style=\"width: 424px; text-align: center; height: 22.5156px;\">Python<\/td>\n<\/tr>\n<tr style=\"height: 298px;\">\n<td style=\"width: 424px; height: 298px; vertical-align: top;\">\n<pre><code class=\"r\">auc_u_test = function(vec, len_A, len_B){\r\n  rank_value = rank(vec, ties.method=\"average\")\r\n  rank_sum = sum(rank_value[1:len_A])\r\n  u_value = rank_sum - (len_A*(len_A+1))\/2\r\n  auc = u_value \/ (len_A * len_B)\r\n  if(auc &lt; 0.50) {\r\n    auc = 1.0 - auc\r\n  }\r\n  return (auc)\r\n}\r\n\r\n<\/code><\/pre>\n<\/td>\n<td style=\"width: 424px; height: 298px; vertical-align: top;\">\n<pre><code class=\"python\">import math\r\nfrom scipy.stats import rankdata\r\n\r\ndef auc_u_test(vec, len_A, len_B):\r\n  rank_value = rankdata(vec)\r\n  rank_sum = sum(rank_value[0:len_A])\r\n  u_value = rank_sum - (len_A*(len_A+1))\/2\r\n  auc = u_value \/ (len_A * len_B)\r\n  if auc &lt; 0.50:\r\n    auc = 1.0 - auc\r\n  return(auc)\r\n<\/code><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>sources: <a href=\"http:\/\/stats.stackexchange.com\/questions\/145566\/how-to-calculate-area-under-the-curve-auc-or-the-c-statistic-by-hand\">stackexchange<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mann%E2%80%93Whitney_U_test#Area-under-curve_.28AUC.29_statistic_for_ROC_curves\">wikipedia<\/a>, <a href=\"http:\/\/stackoverflow.com\/questions\/4903092\/calculate-auc-in-r\">stackoverflow<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Contexte: AUC est un\u00a0acronyme pour \u00ab\u00a0Area Under the (ROC) Curve\u00a0\u00bb. Si vous n&rsquo;\u00eates pas familier avec les notions de courbe ROC et d&rsquo;AUC, je vous sugg\u00e8re de commencer par ce blog post\u00a0avant de continuer. Dans plusieurs projets, il m&rsquo;a fallu calculer un grand nombre d&rsquo;AUC. J&rsquo;ai commenc\u00e9 par devoir en calculer 25000, puis 230000 et, maintenant, j&rsquo;en suis au tour de 1,5 million. Avec autant d&rsquo;AUC, le temps n\u00e9cessaire pour calculer une AUC devient un param\u00e8tre critique. Je n&rsquo;ai pas <a href=\"https:\/\/bioinfo.iric.ca\/fr\/la-methode-la-plus-rapide-pour-calculer-une-auc\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[32,26,24,27],"tags":[142],"class_list":["post-2419","post","type-post","status-publish","format-standard","hentry","category-performance-fr-2","category-langage-python","category-langage-r","category-statistiques","tag-aire-sous-la-courbe"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/2419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=2419"}],"version-history":[{"count":17,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/2419\/revisions"}],"predecessor-version":[{"id":3260,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/2419\/revisions\/3260"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=2419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=2419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=2419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}