Partie 3: modéliser

Principes

Machine Learning ou Econométrie ?

Un modèle statistique est une construction mathématique qui formalise une loi ayant généré les données. La différence principale entre machine learning (ML) et économétrie est dans le degré de structure imposé par le modélisateur :

  • En ML, la structure imposée par le data scientist est minimale et ce sont plutôt les algorithmes qui, sur des critères de performance statistique, vont déterminer une loi mathématique qui correspond aux données.

  • En économétrie, les hypothèses de structure des lois sont plus fortes (même dans un cadre semi ou non-paramétrique) et sont plus souvent imposées par le modélisateur.

L’adoption du Machine Learning dans la littérature économique a été longue car la structuration des données est souvent le pendant empirique d’hypothèses théoriques sur le comportement des acteurs ou des marchés (Athey and Imbens 2019). Pour caricaturer, l’économétrie s’attacherait à comprendre la causalité de certaines variables sur une autre. Cela implique que ce qui intéresse l’économètre est principalement de l’estimation des paramètres (et l’incertitude sur l’estimation de ceux-ci) qui permettent de quantifier l’effet d’une variation d’une variable sur une autre. Toujours pour caricaturer, le Machine Learning se focaliserait sur un simple objectif prédictif en exploitant les relations de corrélations entre les variables. Dans cette perspective, l’important n’est pas la causalité mais le fait qu’une variation de $x$% d’une variable permette d’anticiper un changement de $\beta x$ de la variable d’intérêt ; peu importe la raison. Cette approche est néanmoins caricaturale: la recherche est très dynamique sur la question de l’explicabilité et de l’interprétabilité des modèles de Machine Learning. Certaines approches sont reliées à des notions théoriques comme les valeurs de Shapley.

Apprentissage supervisé ou non supervisé ?

On distingue généralement deux types de méthodes, selon qu’on dispose d’information, dans l’échantillon d’apprentissage, sur les valeurs cibles y (on utilisera parfois le terme label) :

  • apprentissage supervisé : la valeur cible est connue et peut-être utilisée pour évaluer la qualité d’un modèle

Ex : modèles de prédiction du type régression / classification : SVM, kNN, arbres de classification…

  • apprentissage non supervisé : la valeur cible est inconnue et ce sont des critères statistiques qui vont amener à sélectionner la structure de données la plus plausible.

Ex : modèles de réduction de dimension ou de clustering (PCA, kmeans…)

Panorama d’un éco-système vaste

Grâce aux principaux packages de Machine Learning (scikit), Deep Learning (keras, pytorch, TensorFlow…) et économétrie (statsmodels), la modélisation est extrêmement simplifiée. Cela ne doit pas faire oublier l’importance de la structuration et de la préparation des données. Souvent, l’étape la plus cruciale est le choix du modèle le plus adapté à la structure des données.

L’aide-mémoire suivante, issue de l’aide de scikit-learn, concernant les modèles de Machine Learning peut déjà donner de premiers enseignements sur les différentes familles de modèles:

Données

La plupart des exemples de cette partie s’appuient sur les résultats des élections US 2020 au niveau comtés. Plusieurs bases sont utilisées pour cela:

  • Les données électorales sont une reconstruction à partir des données du MIT election lab proposées sur Github par (tonmcg?) ou directement disponibles sur le site du MIT Election Lab
  • Les données socioéconomiques (population, données de revenu et de pauvreté, taux de chômage, variables d’éducation) proviennent de l’USDA (source)
  • Le shapefile vient des données du Census Bureau. Le fichier peut être téléchargé directement depuis cet url: https://www2.census.gov/geo/tiger/GENZ2019/shp/cb_2019_us_county_20m.zip

Le code pour construire une base unique à partir de ces sources diverses est disponible ci-dessous :

import urllib
import urllib.request
import os
import zipfile
from urllib.request import Request, urlopen
from pathlib import Path
import numpy as np
import pandas as pd
import geopandas as gpd

def download_url(url, save_path):
    with urllib.request.urlopen(url) as dl_file:
        with open(save_path, 'wb') as out_file:
            out_file.write(dl_file.read())


def create_votes_dataframes():
    
  Path("data").mkdir(parents=True, exist_ok=True)
  
  
  download_url("https://www2.census.gov/geo/tiger/GENZ2019/shp/cb_2019_us_county_20m.zip", "data/shapefile")
  with zipfile.ZipFile("data/shapefile", 'r') as zip_ref:
      zip_ref.extractall("data/counties")
  
  shp = gpd.read_file("data/counties/cb_2019_us_county_20m.shp")
  shp = shp[~shp["STATEFP"].isin(["02", "69", "66", "78", "60", "72", "15"])]
  shp
  
  df_election = pd.read_csv("https://raw.githubusercontent.com/tonmcg/US_County_Level_Election_Results_08-20/master/2020_US_County_Level_Presidential_Results.csv")
  df_election.head(2)
  population = pd.read_excel("https://www.ers.usda.gov/webdocs/DataFiles/48747/PopulationEstimates.xls?v=290.4", header = 2).rename(columns = {"FIPStxt": "FIPS"})
  education = pd.read_excel("https://www.ers.usda.gov/webdocs/DataFiles/48747/Education.xls?v=290.4", header = 4).rename(columns = {"FIPS Code": "FIPS", "Area name": "Area_Name"})
  unemployment = pd.read_excel("https://www.ers.usda.gov/webdocs/DataFiles/48747/Unemployment.xls?v=290.4", header = 4).rename(columns = {"fips_txt": "FIPS", "area_name": "Area_Name", "Stabr": "State"})
  income = pd.read_excel("https://www.ers.usda.gov/webdocs/DataFiles/48747/PovertyEstimates.xls?v=290.4", header = 4).rename(columns = {"FIPStxt": "FIPS", "Stabr": "State", "Area_name": "Area_Name"})
  
  
  dfs = [df.set_index(['FIPS', 'State']) for df in [population, education, unemployment, income]]
  data_county = pd.concat(dfs, axis=1)
  df_election = df_election.merge(data_county.reset_index(), left_on = "county_fips", right_on = "FIPS")
  df_election['county_fips'] = df_election['county_fips'].astype(str).str.lstrip('0')
  shp['FIPS'] = shp['GEOID'].astype(str).str.lstrip('0')
  votes = shp.merge(df_election, left_on = "FIPS", right_on = "county_fips")
  
  req = Request('https://dataverse.harvard.edu/api/access/datafile/3641280?gbrecs=false')
  req.add_header('User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0')
  content = urlopen(req)
  df_historical = pd.read_csv(content, sep = "\t")
  #df_historical = pd.read_csv('https://dataverse.harvard.edu/api/access/datafile/3641280?gbrecs=false', sep = "\t")
  
  df_historical = df_historical.dropna(subset = ["FIPS"])
  df_historical["FIPS"] = df_historical["FIPS"].astype(int)
  df_historical['share'] = df_historical['candidatevotes']/df_historical['totalvotes']
  df_historical = df_historical[["year", "FIPS", "party", "candidatevotes", "share"]]
  df_historical['party'] = df_historical['party'].fillna("other")
  
  df_historical_wide = df_historical.pivot_table(index = "FIPS", values=['candidatevotes',"share"], columns = ["year","party"])
  df_historical_wide.columns = ["_".join(map(str, s)) for s in df_historical_wide.columns.values]
  df_historical_wide = df_historical_wide.reset_index()
  df_historical_wide['FIPS'] = df_historical_wide['FIPS'].astype(str).str.lstrip('0')
  votes['FIPS'] = votes['GEOID'].astype(str).str.lstrip('0')
  votes = votes.merge(df_historical_wide, on = "FIPS")
  votes["winner"] =  np.where(votes['votes_gop'] > votes['votes_dem'], 'republican', 'democrats') 

  return votes

Contenu de la partie

  • Préparation des données pour construire un modèle

    Afin d’avoir des données cohérentes avec les hypothèses de modélisation, il est absolument fondamental de prendre le temps de préparer les données à fournir à un modèle. La qualité de la prédiction dépend fortement de ce travail préalable qu’on appelle preprocessing. Beaucoup de méthodes sont disponibles dans scikit, ce qui rend ce travail moins fastidieux et plus fiable.

  • Evaluer la qualité d'un modèle

    Faire preuve de méthode pour évaluer la qualité d’un modèle permet de proposer des prédictions plus robustes, ayant de meilleures performances sur un nouveau jeu de données (prédictions out-of-sample). Décomposer l’échantillon initial en sous-échantillons d’entraînement et de tests, faire de la validation croisée, utiliser les bonnes mesures de performances peut se faire, grâce à scikit, de manière relativement standardisée. Cette démarche scientifique est essentielle pour assurer la confiance dans la qualité d’un modèle, ce qu’a illustré récemment un cycle de séminaire de Princeton

  • Classification: premier modèle avec les SVM

    La classification permet d’attribuer une classe d’appartenance (label dans la terminologie du machine learning) discrète à des données à partir de certaines variables explicatives (features dans la même terminologie). Les algorithmes de classification sont nombreux. L’un des plus intuitifs et les plus fréquemment rencontrés est le SVM (Support Vector Machine). Ce chapitre illustre les enjeux de la classification à partir de ce modèle sur les données de vote aux élections présidentielles US de 2020.

  • Régression : une introduction

    La régression linéaire est la première modélisation statistique qu’on découvre dans un cursus quantitatif. Il s’agit en effet d’une méthode très intuitive et très riche. Le Machine Learning permet de l’appréhender d’une autre manière que l’économétrie. Avec scikit et statsmodels, on dispose de tous les outils pour satisfaire à la fois data scientists et économistes.

  • Sélection de variables : une introduction

    L’accès à des bases de données de plus en plus riches permet des modélisations de plus en plus raffinées. Cependant, les modèles parcimonieux sont généralement préférables aux modèles extrêmement riches pour obtenir de bonnes performances sur un nouveau jeu de données (prédictions out-of-sample). Les méthodes de sélection de variables, notamment le LASSO, permettent de sélectionner le signal le plus pertinent dilué au milieu du bruit lorsqu’on a beaucoup d’information à traiter.

  • Clustering

    Le clustering consiste à répartir des observations dans des groupes, généralement non observés, en fonction de caractéristiques observables. Il s’agit d’une application classique, en machine learning de méthodes non supervisées puisqu’on ne dispose généralement pas de l’information sur le groupe auquel appartient réellement une observation. Les applications au monde réel sont nombreuses, notamment dans le domaine de la segmentation tarifaire.

  • Premier pas vers l'industrialisation avec les pipelines scikit

    Les pipelines scikit permettent d’intégrer de manière très flexible un ensemble d’opérations de pre-processing et d’entraînement de modèles dans une chaîne d’opérations. Il s’agit d’une approche particulièrement appropriée pour réduire la difficulté à changer d’algorithme ou pour faciliter la ré-application d’un code à de nouvelles données

Autres champs: * maximum vraisemblance * stats bayésiennes * semi et non paramétrique: méthodes noyaux, GAM

Références

Athey, Susan, and Guido W Imbens. 2019. “Machine Learning Methods That Economists Should Know About.” Annual Review of Economics 11: 685–725.