Comment utiliser l’algorithme de sélection de variables MRMR sur tidymodels ?

Dans la plupart des projets de machine learning, la sélection de variables est une étape essentielle pour identifier les variables les plus pertinentes pour le problème en question. Il existe différentes méthodes de sélection, qui peuvent être regroupées en trois catégories : les méthodes filtres, les méthodes wrapper et les méthodes intégrées.

  • Les méthodes filtres évaluent chaque variable indépendamment des autres, en utilisant des critères statistiques ou des mesures de corrélation pour classer les variables en fonction de leur pertinence pour la tâche de prédiction. Ces méthodes sont souvent utilisées comme une étape préliminaire de la sélection de variables, car elles sont rapides et faciles à mettre en œuvre. Cependant, elles ne tiennent pas compte généralement des interactions entre les variables, ce qui peut conduire à la sélection de variables non pertinentes ou redondantes.

 Sélection de variables : Méthodes filtres

  • Les méthodes wrapper  utilisent un modèle de machine learning pour évaluer chaque sous-ensemble de variables possibles et sélectionner celui qui donne la meilleure performance de prédiction. Ces méthodes sont plus coûteuses en temps de calcul que les méthodes filtres, car elles nécessitent l’entraînement d’un modèle pour chaque sous-ensemble de variables. Cependant, elles sont plus précises car elles tiennent compte des interactions entre les variables et peuvent conduire à la sélection de variables plus pertinentes.

                 Sélection de variables : Méthodes wrapper

  • Les méthodes intégrées combinent la construction du modèle et la sélection des variables en une seule étape. Ces méthodes construisent le modèle de machine learning en utilisant uniquement les variables les plus pertinentes, tout en évitant la sélection de variables redondantes. 

             Sélection de variables : Méthodes intégrées

Dans cet article de blog, je vous présente une méthode de sélection que j’apprécie particulièrement : le Maximum Relevance – Minimum Redundancy (MRMR). Cette méthode a été introduite pour la première fois en 2005 dans un article publié par deux chercheurs de Berkeley, qui ont montré que la sélection de seulement quelques gènes parmi des milliers permettait d’obtenir un niveau de précision maximal pour la prédiction de maladies.

Depuis, l’algorithme MRMR a été largement utilisé dans le monde de l’apprentissage automatique, notamment par Uber pour trouver le sous-ensemble de fonctionnalités “minimal-optimal” sur sa plateforme. L’objectif de cet article n’est pas de détailler le fonctionnement de l’algorithme (ce sera l’objet d’un prochain article), mais plutôt de montrer comment l’implémenter à l’aide de la bibliothèque Tidymodels.

L’algorithme MRMR permet essentiellement de sélectionner les variables les plus pertinentes pour prédire la variable cible, tout en évitant la redondance des informations contenues dans les variables sélectionnées. Cela permet d’obtenir une liste de variables minimales et optimales pour la prédiction, ce qui peut améliorer considérablement les performances des modèles de machine learning.

MRMR avec tidymodels

Actuellement, un nouveau package nommé “colino” est en cours de développement et n’est pas encore disponible sur CRAN. Ce package implémente plusieurs algorithmes de sélection de variables, y compris MRMR. Vous pouvez le charger grâce au code suivant.

devtools::install_github("stevenpawley/colino")

Pour illustrer l’algorithme, je vais charger un jeu de données qui est disponible ici. Ce jeu de données concerne des réclamations d’assurance automobile et comprend 33 variables, y compris la variable cible FraudFound_P. Il s’agit d’un problème de classification binaire.

fraud_oracle =  read_csv("data/fraud_oracle.csv")
fraud_oracle %>% glimpse()
Rows: 15,420
Columns: 33
$ Month                <fct> Dec, Jan, Oct, Jun, Jan, Oct, Feb, Nov, Dec,…
$ WeekOfMonth          <fct> 5, 3, 5, 2, 5, 4, 1, 1, 4, 3, 2, 5, 3, 5, 5,…
$ DayOfWeek            <fct> Wednesday, Wednesday, Friday, Saturday, Mond…
$ Make                 <fct> Honda, Honda, Honda, Toyota, Honda, Honda, H…
$ AccidentArea         <fct> Urban, Urban, Urban, Rural, Urban, Urban, Ur…
$ DayOfWeekClaimed     <fct> Tuesday, Monday, Thursday, Friday, Tuesday, …
$ MonthClaimed         <fct> Jan, Jan, Nov, Jul, Feb, Nov, Feb, Mar, Dec,…
$ WeekOfMonthClaimed   <fct> 1, 4, 2, 1, 2, 1, 3, 4, 5, 3, 3, 5, 3, 1, 1,…
$ Sex                  <fct> Female, Male, Male, Male, Female, Male, Male…
$ MaritalStatus        <fct> Single, Single, Married, Married, Single, Si…
$ Age                  <dbl> 21, 34, 47, 65, 27, 20, 36, 0, 30, 42, 71, 5…
$ Fault                <fct> Policy Holder, Policy Holder, Policy Holder,…
$ PolicyType           <fct> Sport - Liability, Sport - Collision, Sport …
$ VehicleCategory      <fct> Sport, Sport, Sport, Sport, Sport, Sport, Sp…
$ VehiclePrice         <fct> more than 69000, more than 69000, more than …
$ FraudFound_P         <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ PolicyNumber         <fct> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1…
$ RepNumber            <fct> 12, 15, 7, 4, 3, 12, 14, 1, 7, 7, 7, 13, 11,…
$ Deductible           <fct> 300, 400, 400, 400, 400, 400, 400, 400, 400,…
$ DriverRating         <fct> 1, 4, 3, 2, 1, 3, 1, 4, 4, 1, 3, 1, 1, 3, 1,…
$ Days_Policy_Accident <fct> more than 30, more than 30, more than 30, mo…
$ Days_Policy_Claim    <fct> more than 30, more than 30, more than 30, mo…
$ PastNumberOfClaims   <fct> none, none, 1, 1, none, none, 1, 1, none, 2 …
$ AgeOfVehicle         <fct> 3 years, 6 years, 7 years, more than 7, 5 ye…
$ AgeOfPolicyHolder    <fct> 26 to 30, 31 to 35, 41 to 50, 51 to 65, 31 t…
$ PoliceReportFiled    <fct> No, Yes, No, Yes, No, No, No, No, No, No, No…
$ WitnessPresent       <fct> No, No, No, No, No, No, No, No, Yes, No, No,…
$ AgentType            <fct> External, External, External, External, Exte…
$ NumberOfSuppliments  <fct> none, none, none, more than 5, none, 3 to 5,…
$ AddressChange_Claim  <fct> 1 year, no change, no change, no change, no …
$ NumberOfCars         <fct> 3 to 4, 1 vehicle, 1 vehicle, 1 vehicle, 1 v…
$ Year                 <dbl> 1994, 1994, 1994, 1994, 1994, 1994, 1994, 19…
$ BasePolicy           <fct> Liability, Collision, Collision, Liability, …

Maintenant, nous allons charger la librairie colino et effectuer une sélection de 10 variables en utilisant la fonction step_select_mrmr() et affichons les variables sélectionnées.

###### selection de variables ###
rec = recipe(FraudFound_P ~ .,  data = fraud_oracle) %>% 
           step_select_mrmr(all_predictors(),top_p = 10,outcome = "FraudFound_P")
      
rec %>% prep() %>% juice() %>% glimpse()
Rows: 15,420
Columns: 11
$ AccidentArea         <fct> Urban, Urban, Urban, Rural, Urban, Urban, Ur…
$ Fault                <fct> Policy Holder, Policy Holder, Policy Holder,…
$ PolicyNumber         <fct> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1…
$ Deductible           <fct> 300, 400, 400, 400, 400, 400, 400, 400, 400,…
$ Days_Policy_Accident <fct> more than 30, more than 30, more than 30, mo…
$ Days_Policy_Claim    <fct> more than 30, more than 30, more than 30, mo…
$ PoliceReportFiled    <fct> No, Yes, No, Yes, No, No, No, No, No, No, No…
$ WitnessPresent       <fct> No, No, No, No, No, No, No, No, Yes, No, No,…
$ AgentType            <fct> External, External, External, External, Exte…
$ NumberOfCars         <fct> 3 to 4, 1 vehicle, 1 vehicle, 1 vehicle, 1 v…
$ FraudFound_P         <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…