Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons - KDnuggets

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons – KDnuggets

Nœud source: 2893531

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
[Image par auteur]

 

Le concept « d’importance des fonctionnalités » est largement utilisé dans l’apprentissage automatique comme type d’explicabilité de modèle le plus élémentaire. Par exemple, il est utilisé dans l'élimination récursive de fonctionnalités (RFE), pour supprimer de manière itérative la fonctionnalité la moins importante du modèle.

Cependant, il existe une idée fausse à ce sujet.

Le fait qu’une fonctionnalité soit importante n’implique pas qu’elle soit bénéfique pour le modèle !

En effet, quand on dit qu’une fonctionnalité est importante, cela signifie simplement que la fonctionnalité apporte une forte contribution aux prédictions faites par le modèle. Mais nous devrions considérer que une telle contribution peut être fausse.

Prenons un exemple simple : un data scientist oublie accidentellement l'ID client entre les fonctionnalités de son modèle. Le modèle utilise l'ID client comme fonctionnalité hautement prédictive. En conséquence, cette fonctionnalité aura une grande importance même si elle détériore le modèle, car elle ne peut pas fonctionner correctement sur des données invisibles.

Pour clarifier les choses, il faudra distinguer deux notions :

  • Contribution à la prédiction: quelle partie des prédictions est due à la fonctionnalité ; cela équivaut à l'importance des fonctionnalités.
  • Contribution d'erreur: quelle partie des erreurs de prédiction est due à la présence de la fonctionnalité dans le modèle.

Dans cet article, nous verrons comment calculer ces quantités et comment les utiliser pour obtenir des informations précieuses sur un modèle prédictif (et pour l'améliorer).

Remarque : cet article se concentre sur le cas de régression. Si vous êtes plus intéressé par le cas de classification, vous pouvez lire « Quelles fonctionnalités sont néfastes pour votre modèle de classification ? »

Supposons que nous construisions un modèle pour prédire le revenu des personnes en fonction de leur emploi, de leur âge et de leur nationalité. Nous utilisons maintenant le modèle pour faire des prédictions sur trois personnes.

Ainsi, nous avons la vérité terrain, la prédiction du modèle et l’erreur qui en résulte :

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Vérité terrain, prédiction du modèle et erreur absolue (en milliers de dollars). [Image par auteur]

 

Lorsque nous disposons d'un modèle prédictif, nous pouvons toujours décomposer les prédictions du modèle en contributions apportées par les fonctionnalités individuelles. Cela peut être fait via les valeurs SHAP (si vous ne savez pas comment fonctionnent les valeurs SHAP, vous pouvez lire mon article : Les valeurs SHAP expliquées exactement comme vous souhaiteriez que quelqu'un vous explique).

Supposons donc que ce soient les valeurs SHAP relatives à notre modèle pour les trois individus.

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Valeurs SHAP pour les prédictions de notre modèle (en milliers de $). [Image par auteur]

 

La principale propriété des valeurs SHAP est qu’elles sont additives. Cela signifie qu'en prenant la somme de chaque ligne, nous obtiendrons la prédiction de notre modèle pour cet individu. Par exemple, si nous prenons la deuxième ligne : 72 3 $ +22 53 $ -XNUMX XNUMX $ = XNUMX XNUMX $, ce qui est exactement la prédiction du modèle pour le deuxième individu.

Désormais, les valeurs SHAP sont un bon indicateur de l’importance d’une fonctionnalité pour nos prédictions. En effet, plus la valeur (absolue) de SHAP est élevée, plus la caractéristique est influente pour la prédiction concernant cet individu spécifique. Notez que je parle de valeurs SHAP absolues car le signe ici n'a pas d'importance : une fonctionnalité est tout aussi importante si elle pousse la prédiction vers le haut ou vers le bas.

Par conséquent, la contribution à la prédiction d'une fonctionnalité est égale à la moyenne des valeurs SHAP absolues de cette fonctionnalité. Si vous avez les valeurs SHAP stockées dans une trame de données Pandas, c'est aussi simple que :

prediction_contribution = shap_values.abs().mean()

Dans notre exemple, voici le résultat :

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Contribution à la prédiction. [Image par auteur]

 

Comme vous pouvez le constater, le travail est clairement la caractéristique la plus importante puisqu'il représente en moyenne 71.67k $ de la prédiction finale. La nationalité et l’âge constituent respectivement la deuxième et la troisième caractéristique la plus pertinente.

Cependant, le fait qu'une fonctionnalité donnée représente une partie pertinente de la prédiction finale ne dit rien sur les performances de la fonctionnalité. Pour considérer également cet aspect, nous devrons calculer la « contribution à l’erreur ».

Disons que nous voulons répondre à la question suivante : « Quelles prédictions le modèle ferait-il s’il ne disposait pas de la fonctionnalité JOB?" Les valeurs SHAP nous permettent de répondre à cette question. En fait, comme elles sont additives, il suffit de soustraire les valeurs SHAP relatives à la fonctionnalité JOB à partir des prédictions faites par le modèle.

Bien entendu, nous pouvons répéter cette procédure pour chaque fonctionnalité. Chez les Pandas :

y_pred_wo_feature = shap_values.apply(lambda feature: y_pred - feature)

Voici le résultat :

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Prédictions que nous obtiendrons si nous supprimons la fonctionnalité respective. [Image par auteur]

 

Cela signifie que, si nous n'avions pas la fonctionnalité JOB, alors le modèle prédirait 20 19 $ pour le premier individu, -8 XNUMX $ pour le deuxième et -XNUMX XNUMX $ pour le troisième. Au lieu de cela, si nous n'avions pas la fonctionnalité âge, le modèle prédirait 73 50 $ pour le premier individu, XNUMX XNUMX $ pour le second, et ainsi de suite.

Comme vous pouvez le constater, les prédictions pour chaque individu varient considérablement si nous supprimons différentes fonctionnalités. En conséquence, les erreurs de prédiction seraient également très différentes. On peut facilement les calculer :

abs_error_wo_feature = y_pred_wo_feature.apply(lambda feature: (y_true - feature).abs())

Le résultat est le suivant :

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Erreurs absolues que nous obtiendrons si nous supprimons la fonctionnalité respective. [Image par auteur]

 

Ce sont les erreurs que nous obtiendrons si nous supprimons la fonctionnalité respective. Intuitivement, si l’erreur est faible, la suppression de la fonctionnalité ne pose pas de problème – voire est même bénéfique – pour le modèle. Si l’erreur est élevée, supprimer la fonctionnalité n’est pas une bonne idée.

Mais nous pouvons faire plus que cela. En effet, nous pouvons calculer la différence entre les erreurs du modèle complet et les erreurs que nous obtiendrions sans la fonctionnalité :

error_diff = abs_error_wo_feature.apply(lambda feature: abs_error - feature)

Qui est:

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Différence entre les erreurs du modèle et les erreurs que nous aurions sans la fonctionnalité. [Image par auteur]

 

Si ce numéro est :

  • négatif, alors la présence de la fonctionnalité entraîne une réduction de l'erreur de prédiction, donc la fonctionnalité fonctionne bien pour cette observation !
  • positif, alors la présence de la caractéristique entraîne une augmentation de l'erreur de prédiction, donc la caractéristique est mauvaise pour cette observation.

Nous pouvons calculer la « contribution à l'erreur » comme la moyenne de ces valeurs, pour chaque fonctionnalité. Chez les Pandas :

error_contribution = error_diff.mean()

Voici le résultat :

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Contribution aux erreurs. [Image par auteur]

 

Si cette valeur est positive, cela signifie qu'en moyenne, la présence de la fonctionnalité dans le modèle entraîne une erreur plus élevée. Ainsi, sans cette fonctionnalité, la prédiction aurait été généralement meilleure. En d’autres termes, cette fonctionnalité fait plus de mal que de bien !

Au contraire, plus cette valeur est négative, plus la caractéristique est bénéfique pour les prédictions puisque sa présence entraîne des erreurs plus faibles.

Essayons d'utiliser ces concepts sur un ensemble de données réel.

Ci-après, j'utiliserai un ensemble de données extrait de Picaret (une bibliothèque Python sous Licence MIT). L'ensemble de données s'appelle « Gold » et contient des séries chronologiques de données financières.

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Échantillon d'ensemble de données. Les caractéristiques sont toutes exprimées en pourcentage, donc -4.07 signifie un rendement de -4.07 %. [Image par auteur]

 

Les caractéristiques consistent en les retours d'actifs financiers respectivement 22, 14, 7 et 1 jours avant le moment d'observation (« T-22 », « T-14 », « T-7 », « T-1 »). Voici la liste exhaustive de tous les actifs financiers utilisés comme fonctionnalités prédictives :

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Liste des actifs disponibles. Chaque actif est observé aux instants -22, -14, -7 et -1. [Image par auteur]

 

Au total, nous avons 120 fonctionnalités.

L’objectif est de prédire le prix (retour) de l’or 22 jours à l’avance (« Gold_T+22 »). Jetons un coup d'œil à la variable cible.

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Histogramme de la variable. [Image par auteur]

 

Une fois l'ensemble de données chargé, voici les étapes que j'ai effectuées :

  1. Divisez l'ensemble de données complet de manière aléatoire : 33 % des lignes de l'ensemble de données d'entraînement, 33 % supplémentaires dans l'ensemble de données de validation et les 33 % restants dans l'ensemble de données de test.
  2. Entraînez un régresseur LightGBM sur l’ensemble de données de formation.
  3. Faites des prédictions sur les ensembles de données d’entraînement, de validation et de test, à l’aide du modèle entraîné à l’étape précédente.
  4. Calculez les valeurs SHAP des ensembles de données de formation, de validation et de test à l'aide de la bibliothèque Python « shap ».
  5. Calculez la contribution à la prédiction et la contribution aux erreurs de chaque fonctionnalité sur chaque ensemble de données (entraînement, validation et test), en utilisant le code que nous avons vu dans le paragraphe précédent.

Comparons la contribution à l'erreur et la contribution à la prédiction dans l'ensemble de données d'entraînement. Nous utiliserons un nuage de points afin que les points identifient les 120 caractéristiques du modèle.

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Contribution à la prédiction par rapport à la contribution à l'erreur (sur l'ensemble de données d'entraînement). [Image par auteur]

 

Il existe une corrélation hautement négative entre la contribution à la prédiction et la contribution à l'erreur dans l'ensemble de formation.

Et cela a du sens : étant donné que le modèle apprend sur l'ensemble de données d'entraînement, il a tendance à attribuer une grande importance (c'est-à-dire une contribution à la prédiction élevée) aux caractéristiques qui conduisent à une grande réduction de l'erreur de prédiction (c'est-à-dire une contribution à l'erreur très négative).

Mais cela n’ajoute pas grand-chose à nos connaissances, n’est-ce pas ?

En effet, ce qui compte vraiment pour nous, c'est l'ensemble de données de validation. L'ensemble de données de validation est en fait le meilleur proxy que nous puissions avoir sur la façon dont nos fonctionnalités se comporteront sur les nouvelles données. Faisons donc la même comparaison sur l’ensemble de validation.

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Contribution à la prédiction par rapport à la contribution à l'erreur (sur l'ensemble de données de validation). [Image par auteur]

 

De ce graphique, nous pouvons extraire des informations beaucoup plus intéressantes.

Les caractéristiques dans la partie inférieure droite du graphique sont celles auxquelles notre modèle attribue à juste titre une grande importance puisqu'elles apportent en réalité une réduction de l'erreur de prédiction.

A noter également que « Gold_T-22 » (le retour de l’or 22 jours avant la période d’observation) fonctionne vraiment bien par rapport à l’importance que le modèle lui accorde. Cela signifie que cette fonctionnalité est peut-être sous-estimée. Et cette information est particulièrement intéressante puisque l’or est l’actif que l’on cherche à prédire (« Gold_T+22 »).

D'autre part, les fonctionnalités qui ont une contribution d'erreur supérieure à 0 aggravent nos prédictions. Par exemple, « US Bond ETF_T-1 » modifie en moyenne la prédiction du modèle de 0.092 % (contribution à la prédiction), mais cela amène le modèle à faire une prédiction en moyenne de 0.013 % (contribution à l'erreur) pire qu'elle ne l'aurait été sans cette fonctionnalité. .

On peut supposer que toutes les fonctionnalités avec une contribution d'erreur élevée (par rapport à leur contribution à la prédiction) sont probablement surajustées ou, en général, ils ont un comportement différent dans l'ensemble d'apprentissage et dans l'ensemble de validation.

Voyons quelles fonctionnalités ont la plus grande contribution aux erreurs.

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Fonctionnalités triées par contribution décroissante aux erreurs. [Image par auteur]

 

Et maintenant les fonctionnalités avec la plus faible contribution aux erreurs :

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Fonctionnalités triées par augmentation de la contribution aux erreurs. [Image par auteur]

 

Fait intéressant, nous pouvons observer que toutes les caractéristiques avec une contribution à l'erreur plus élevée sont relatives à T-1 (1 jour avant le moment d'observation), alors que presque toutes les caractéristiques avec une contribution à l'erreur plus faible sont relatives à T-22 (22 jours avant le moment d'observation). ).

Cela semble indiquer que les fonctionnalités les plus récentes sont sujettes au surapprentissage, tandis que les fonctionnalités plus éloignées dans le temps ont tendance à mieux se généraliser.

Notez que, sans la contribution aux erreurs, nous n’aurions jamais connu cette information.

Les méthodes traditionnelles d’élimination de fonctionnalités récursives (RFE) sont basées sur la suppression de fonctionnalités sans importance. Cela équivaut à supprimer d'abord les fonctionnalités avec une petite contribution à la prédiction.

Cependant, sur la base de ce que nous avons dit dans le paragraphe précédent, il serait plus logique de supprimer d'abord les fonctionnalités ayant la contribution d'erreur la plus élevée.

Pour vérifier si notre intuition est vérifiée, comparons les deux approches :

  • RFE traditionnel : supprimer d'abord les fonctionnalités inutiles (contribution à la prédiction la plus faible).
  • Notre RFE : suppression des fonctionnalités nuisibles premier (contribution aux erreurs la plus élevée).

Voyons les résultats sur l'ensemble de validation :

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Erreur absolue moyenne des deux stratégies sur l’ensemble de validation. [Image par auteur]

 

La meilleure itération pour chaque méthode a été encerclée : il s'agit du modèle à 19 fonctionnalités pour le RFE traditionnel (ligne bleue) et du modèle à 17 fonctionnalités pour notre RFE (ligne orange).

En général, il semble que notre méthode fonctionne bien : la suppression de la fonctionnalité avec la contribution d'erreur la plus élevée entraîne un MAE systématiquement plus petit par rapport à la suppression de la fonctionnalité avec la contribution de prédiction la plus élevée.

Cependant, vous pensez peut-être que cela fonctionne bien simplement parce que nous surajustons l'ensemble de validation. Après tout, ce qui nous intéresse, c'est le résultat que nous obtiendrons sur l'ensemble de test.

Voyons donc la même comparaison sur l'ensemble de test.

 

Vos fonctionnalités sont importantes ? Cela ne veut pas dire qu'ils sont bons
Erreur absolue moyenne des deux stratégies sur l’ensemble de test. [Image par auteur]

 

Le résultat est similaire au précédent. Même s'il y a moins de distance entre les deux lignes, le MAE obtenu en supprimant le contributeur d'erreur le plus élevé est clairement meilleur que le MAE obtenu en supprimant le contributeur de prédiction le plus bas.

Puisque nous avons sélectionné les modèles conduisant au plus petit MAE sur l'ensemble de validation, voyons leur résultat sur l'ensemble de test :

  • Contribution RFE-Prediction (19 fonctionnalités). MAE sur l'ensemble de test : 2.04.
  • Contribution aux erreurs RFE (17 fonctionnalités). MAE sur l'ensemble de test : 1.94.

Ainsi, le meilleur MAE utilisant notre méthode est 5 % meilleur que le RFE traditionnel !

Le concept d’importance des fonctionnalités joue un rôle fondamental dans l’apprentissage automatique. Cependant, la notion d’« importance » est souvent confondue avec celle de « bonté ».

Afin de distinguer ces deux aspects, nous avons introduit deux concepts : la contribution à la prédiction et la contribution à l'erreur. Les deux concepts sont basés sur les valeurs SHAP de l'ensemble de données de validation, et dans l'article, nous avons vu le code Python pour les calculer.

Nous les avons également essayés sur un ensemble de données financières réelles (dans lequel la tâche consiste à prédire le prix de l'or) et avons prouvé que l'élimination récursive des caractéristiques basée sur la contribution à l'erreur conduit à une erreur absolue moyenne 5 % meilleure que l'ERF traditionnelle basée sur la contribution à la prédiction.

Tout le code utilisé pour cet article se trouve dans ce cahier.

Merci pour la lecture!

 
 
Samuele Mazzanti est Lead Data Scientist chez Jakala et vit actuellement à Rome. Il est diplômé en statistiques et ses principaux intérêts de recherche concernent les applications d'apprentissage automatique pour l'industrie. Il est également créateur de contenu indépendant.

 
ORIGINALE. Republié avec permission.
 

Horodatage:

Plus de KDnuggetsGenericName