{"id":10710,"date":"2016-06-23T17:23:28","date_gmt":"2016-06-23T15:23:28","guid":{"rendered":"https:\/\/www.etalab.gouv.fr\/?p=10710"},"modified":"2019-06-18T10:34:32","modified_gmt":"2019-06-18T08:34:32","slug":"les-techniques-standards-appliquees-a-opensolarmap-13","status":"publish","type":"post","link":"https:\/\/preprod.etalab.gouv.fr\/les-techniques-standards-appliquees-a-opensolarmap-13","title":{"rendered":"Les techniques standards appliqu\u00e9es \u00e9 OpenSolarMap (1\/3)"},"content":{"rendered":"\n
Lorsqu\u2019un algorithme simple ne convient pas, la \ndeuxi\u00e8me \u00e9tape d\u2019un projet de machine learning est d\u2019essayer des \n\u00ab grands classiques \u00bb. Ces algorithmes sont plus complexes d\u2019un point de\n vue th\u00e9orique, mais des impl\u00e9mentations toutes pr\u00eates existent et cette\n \u00e9tape est g\u00e9n\u00e9ralement rapide \u00e0 mettre en oeuvre.<\/strong><\/p>\n\n\n\n La r\u00e9gression logistique<\/a>\n porte un nom d\u00e9routant puisque cette m\u00e9thode est utilis\u00e9e autant pour \ndes probl\u00e8mes de r\u00e9gression que de classification. De plus, le choix par\n Pierre Fran\u00e7ois Verhulst du terme \u00ab logistique \u00bb est aujourd\u2019hui un \nmyst\u00e8re. Pourtant, la r\u00e9gression logistique est sans doute la m\u00e9thode la\n plus r\u00e9pandue pour traiter des probl\u00e8mes de classification comme c\u2019est \nle cas ici.<\/p>\n\n\n\n Il existe une multitude d\u2019impl\u00e9mentations de la r\u00e9gression logistique. La m\u00e9thode utilis\u00e9e pour OpenSolarMap est celle de Scikit-Learn<\/a>. Scikit-Learn est un ensemble d\u2019impl\u00e9mentation en langage Python<\/a> d\u2019algorithmes courants. Cette librairie maintenue par l\u2019INRIA est tr\u00e8s populaire partout dans le monde. Voir la documentation de l\u2019impl\u00e9mentation<\/a>.<\/p>\n\n\n\n Entra\u00eener puis tester un mod\u00e8le de r\u00e9gression logistique requiert d\u2019\u00e9crire un peu de code :<\/p>\n\n\n\n Passons en revue chaque ligne :<\/p>\n\n\n\n \n Figure 1 : choix des hyperparam\u00e8tres pour la r\u00e9gression logistique\n <\/p>\n\n\n\n On choisit la taille des images ##Support Vector Machines<\/p>\n\n\n\n Si la r\u00e9gression logistique a \u00e9t\u00e9 d\u00e9velopp\u00e9e dans la fin des ann\u00e9es \n60 par le statisticien David Cox et elle est maintenant consid\u00e9r\u00e9e comme\n un outil de statistique classique, les \u00ab machines \u00e0 vecteurs de \nsupport \u00bb sont d\u00e9velopp\u00e9es depuis les ann\u00e9es 90 et constituent encore un\n domaine de recherche tr\u00e8s actif. Cette diff\u00e9rence d\u2019\u00e2ge, ainsi que le \nfait que l\u2019analyse math\u00e9matique de ces deux m\u00e9thodes est tr\u00e8s diff\u00e9rente\n fait souvent oublier que les performances, tant en pr\u00e9diction qu\u2019en \ntemps de calcul, sont souvent tr\u00e8s semblables.<\/p>\n\n\n\n Passer de la r\u00e9gression logistique au Support Vector Classifier (SVC)<\/a> est presque imm\u00e9diat, il faut remplacer la ligne<\/p>\n\n\n\n par la ligne<\/p>\n\n\n\n Le param\u00e8tre Le meilleur r\u00e9sultat est toujours obtenu avec une taille de 6 pixels \npar 6 pixels, mais cette fois-ci en couleurs (rouge, vert et bleu). Le \nr\u00e9sultat de l\u2019\u00e9tape de la validation est aussi de 12.5%.<\/p>\n\n\n\n \n Figure 2 : choix des hyperparam\u00e8tres pour la SVM\n <\/p>\n\n\n\n Pour beaucoup de probl\u00e8mes de machine learning, il existe un ou \nplusieurs algorithmes classiques \u00e0 essayer en priorit\u00e9. Pour aider \u00e0 \nfaire ce choix, le projet Scikit-Learn a \u00e9dit\u00e9 un arbre de d\u00e9cision<\/a> tr\u00e8s pratique :<\/p>\n\n\n\nR\u00e9gression logistique<\/h1>\n\n\n\n
train_data, val_data, test_data = load.load_all_data(train_ids, val_ids, test_ids, l, color)\nmodel = sklearn.linear_model.LogisticRegression(penalty='l2', C=1e10)\nmodel.fit(train_data, train_labels)\npredictions = model.predict(val_data)\nerr = (predictions != val_labels).sum() \/ len(val_labels)\n<\/pre>\n\n\n\n
train_data<\/code>,
val_data<\/code> et
test_data<\/code>. La fonction
load.load_all_data()<\/code>, sp\u00e9cifique a notre probl\u00e8me, prend en param\u00e8tre la liste des identifiants de toits \u00e0 charger, la taille
l<\/code>\n des images voulue et le nombre de canaux de couleur voulu (rouge, vert \net bleu ou noir et blanc). Les images de toitures sont s\u00e9par\u00e9es en 3 \n\u00e9chantillons :\n
penalty<\/code> et
C<\/code> configurent la r\u00e9gularisation. La r\u00e9gularisation<\/a>\n est utile lorsque le nombre de features est comparable \u00e0 la taille de \nl\u2019\u00e9chantillon. Ici, il y a plusieurs milliers d\u2019exemples dans \nl\u2019\u00e9chantillon d\u2019apprentissage et quelques centaines de features tout au \nplus. Pour simplifier, le param\u00e8tre
C<\/code> a une valeur tr\u00e8s \u00e9lev\u00e9e (
1e10 = 10.000.000.000<\/code>) ce qui correspond \u00e0 une r\u00e9gularisation n\u00e9gligeable.<\/li>
train_data<\/code>) mais aussi aux labels (
train_labels<\/code>) pour pouvoir se corriger et s\u2019am\u00e9liorer.<\/li>
<\/a><\/figure>\n\n\n\n
l<\/code>\n et le choix de couleurs (rouge, vert et bleu ou noir et blanc) en \nessayant plusieurs combinaison. La figure 1 montre que la taille qui \ndonne les meilleurs r\u00e9sultats est de 6 pixels par 6 pixels. Le fait de \ntester successivement plusieurs hyper-param\u00e8tres (les param\u00e8tres comme
l<\/code>, qui sont ext\u00e9rieurs au mod\u00e8le de r\u00e9gression logistique et d\u00e9finis par le data-scientist) peut provoquer un ph\u00e9nom\u00e8ne appel\u00e9 surapprentissage<\/a>.\n Il est n\u00e9cessaire de valider la performance sur un \u00e9chantillon qui n\u2019a \n\u00e9t\u00e9 utilis\u00e9 ni durant l\u2019apprentissage ni durant la phase de test, l\u2019\u00e9chantillon de validation<\/a>. Dans notre situation, le taux d\u2019erreur sur l\u2019\u00e9chantillon de validation est de 12.5%.<\/p>\n\n\n\n
model = sklearn.linear_model.LogisticRegression(penalty='l2', C=1e10)\n<\/pre>\n\n\n\n
model = sklearn.svm.LinearSVC(penalty='l2', C=1e10, dual=False)\n<\/pre>\n\n\n\n
dual=False<\/code> \ncommande \u00e0 la librairie Scikit-Learn de ne pas utiliser l\u2019impl\u00e9mentation\n \u00ab duale \u00bb, qui est appropri\u00e9e dans les cas o\u00f9 le nombre de features est\n plus important que la taille de l\u2019\u00e9chantillon.<\/p>\n\n\n\n
<\/a><\/figure>\n\n\n\n
Quels sont les grands classiques ?<\/h1>\n\n\n\n