Je vois souvent des gens créer de nouvelles fonctionnalités basées sur des fonctionnalités existantes sur un problème d'apprentissage automatique. Par exemple, ici: https://triangleinequality.wordpress.com/2013/09/08/basic-feature-engineering-with-the-titanic-data/ les gens ont considéré la taille de la famille d'une personne comme une nouvelle fonctionnalité, basée sur sur le nombre de frères, soeurs et parents, qui étaient des caractéristiques existantes.
Mais à quoi ça sert? Je ne comprends pas pourquoi la création de nouvelles fonctionnalités corrélées est utile. N'est-ce pas le travail de l'algorithme de le faire seul?
machine-learning
feature-engineering
Matthieu Veron
la source
la source
Réponses:
L'exemple le plus simple utilisé pour illustrer cela est le problème XOR (voir l'image ci-dessous). Imaginez que l'on vous donne des données contenant des coordonnées et et la classe binaire à prévoir. Vous pourriez vous attendre à ce que votre algorithme d'apprentissage automatique trouve par lui-même la frontière de décision correcte, mais si vous avez généré une fonctionnalité supplémentaire , le problème devient trivial car vous donne un critère de décision presque parfait pour la classification et vous avez utilisé une arithmétique simple !x y z=xy z>0
Ainsi, alors que dans de nombreux cas, vous pouvez vous attendre à ce que l'algorithme trouve la solution, ou bien, par l'ingénierie des fonctionnalités, vous pouvez simplifier le problème. Les problèmes simples sont plus faciles et plus rapides à résoudre et nécessitent des algorithmes moins compliqués. Les algorithmes simples sont souvent plus robustes, les résultats sont souvent plus interprétables, ils sont plus évolutifs (moins de ressources de calcul, temps de formation, etc.) et portables. Vous pouvez trouver plus d'exemples et d'explications dans l'excellent discours de Vincent D. Warmerdam, donné lors de la conférence PyData à Londres .
De plus, ne croyez pas tout ce que les spécialistes du marketing de l'apprentissage automatique vous disent. Dans la plupart des cas, les algorithmes "n'apprendront pas d'eux-mêmes". Vous avez généralement un temps, des ressources et une puissance de calcul limités et les données ont généralement une taille limitée et sont bruyantes, rien de tout cela ne vous aide.
En poussant cela à l'extrême, vous pouvez fournir vos données sous forme de photos de notes manuscrites du résultat de l'expérience et les transmettre à un réseau neuronal compliqué. Il apprendrait d'abord à reconnaître les données sur les images, puis à les comprendre et à faire des prédictions. Pour ce faire, vous auriez besoin d'un ordinateur puissant et de beaucoup de temps pour la formation et le réglage du modèle et vous auriez besoin d'énormes quantités de données en raison de l'utilisation d'un réseau neuronal compliqué. Fournir les données dans un format lisible par ordinateur (sous forme de tableaux de nombres) simplifie énormément le problème, car vous n'avez pas besoin de toute la reconnaissance des caractères. Vous pouvez penser à l'ingénierie des fonctionnalités comme une étape suivante, où vous transformez les données de manière à créer desfonctionnalités, de sorte que votre algorithme a encore moins à comprendre par lui-même. Pour donner une analogie, c'est comme si vous vouliez lire un livre en langue étrangère, de sorte que vous deviez d'abord apprendre la langue, par opposition à la lire traduite dans la langue que vous comprenez.
Dans l'exemple de données Titanic, votre algorithme devrait comprendre que la somme des membres de la famille est logique, pour obtenir la fonctionnalité "taille de la famille" (oui, je la personnalise ici). C'est une caractéristique évidente pour un humain, mais ce n'est pas évident si vous voyez les données comme seulement quelques colonnes des nombres. Si vous ne savez pas quelles colonnes sont significatives lorsqu'elles sont considérées avec d'autres colonnes, l'algorithme pourrait le comprendre en essayant chaque combinaison possible de ces colonnes. Bien sûr, nous avons des moyens intelligents de le faire, mais tout de même, c'est beaucoup plus facile si les informations sont données immédiatement à l'algorithme.
la source
Eh bien, si vous prévoyez d'utiliser un classificateur linéaire simple, il est parfaitement logique de générer de nouvelles fonctionnalités qui sont une fonction non linéaire des fonctionnalités existantes, surtout si vos connaissances du domaine vous indiquent que la fonctionnalité résultante sera significative et informative. Notez qu'un classificateur linéaire ne peut pas considérer ces fonctionnalités complexes à moins que vous ne les fournissiez explicitement.
Idéalement, si vous utilisez un algorithme de classification non linéaire suffisamment puissant, il devrait être capable de créer une frontière de décision qui considère les transformations non linéaires arbitraires des entités en entrée si elles sont informatives pour la classification. Cependant, dans la pratique, la plupart des classificateurs non linéaires examinent simplement un certain type de transformations. Par exemple, un noyau polynomial SVM prendra en compte les interactions polynomiales entre les fonctionnalités, mais peut-être qu'une fonctionnalité plus informative peut être créée en appliquant d'autres types de transformations ...
En bref, si la connaissance du domaine indique qu'une combinaison non linéaire de fonctionnalités fabriquées à la main peut être informative, il est logique de l'ajouter à l'ensemble de fonctionnalités existant.
la source
Il est vrai que certains des modèles d'apprentissage automatique ont la capacité de gérer la non-linéarité et l'interaction entre les variables, cependant, cela dépend de la situation, je vois trois raisons pour lesquelles cela devient nécessaire.
Si vous ne disposez que de deux fonctionnalités, et . Un modèle linéaire simple de ne trouvera aucun moyen de classer la variable cible. Donc, à la place, vous avez besoin de nouvelles fonctionnalités quartiques pour capturer la non-linéarité: .x1 x2 y=x0+c1x1+c2x2 y=x0+c1x21+c2x22
Si vous savez à l'avance que certaines fonctionnalités (issues des connaissances ou de l'expérience métier), cela peut aider à les créer pour accélérer l'exécution du modèle et faciliter la tâche de votre modèle. Par exemple, dans votre exemple de données Titanic et si vous utilisez un modèle de classification d'arbre de décision. Si vous savez que les vieilles dames (âge et sexe) sont plus susceptibles de survivre, en créant une seule fonctionnalité qui capture les informations, votre arbre peut effectuer un fractionnement sur la nouvelle variable au lieu de diviser deux sur les deux variables. Cela peut accélérer le temps de calcul si vous savez à l'avance que la fonctionnalité est importante.
Dans le monde réel, vous n'obtiendrez aucun ensemble de données comme Kaggle. Au lieu de cela, vous obtenez des informations de partout. Par exemple, si vous souhaitez prédire l'attrition de la clientèle pour une entreprise de vente au détail en ligne comme Amazon, vous avez des informations sur la démographie des clients, des informations sur les transactions d'achat. Vous devez générer beaucoup de fonctionnalités à partir de différentes sources, dans ce cas, vous trouverez que de nombreuses fonctionnalités utiles peuvent être obtenues / agrégées à partir du niveau de transaction. Comme le dit Andrew Ng: Souvent, la capacité de faire de l'ingénierie des fonctionnalités définit le succès ou l'échec d'un projet d'apprentissage automatique.
la source