Construction et normalisation des fonctionnalités dans l'apprentissage automatique

13

Disons que je veux créer un classificateur logistique pour un film M. Mes caractéristiques seraient quelque chose comme l'âge de la personne, le sexe, la profession, l'emplacement. Donc, l'ensemble de formation serait quelque chose comme:

  • Âge Sexe Profession Lieu Comme (1) / Je n'aime pas (0)
  • 23 M Software US 1
  • 24 F Docteur UK 0

et ainsi de suite ... Maintenant, ma question est de savoir comment dois-je évoluer et représenter mes fonctionnalités. Une façon que je pensais: diviser l'âge en groupes d'âge, donc 18-25, 25-35, 35 ans et plus, le sexe en tant que M, F, l'emplacement comme les États-Unis, le Royaume-Uni, d'autres. Créez maintenant une fonction binaire pour toutes ces valeurs, donc l'âge aura 3 fonctions binaires correspondant chacune à un groupe d'âge, etc. Ainsi, un homme de 28 ans des États-Unis serait représenté comme 010 10 100 (010-> Groupe d'âge 25-35, 10 -> Homme, 100 -> US)

Quelle pourrait être la meilleure façon de représenter les fonctionnalités ici? De plus, j'ai remarqué dans certains exemples de sklearn que toutes les fonctionnalités ont été mises à l'échelle / normalisées d'une manière ou d'une autre, par exemple, le sexe est représenté par deux valeurs, 0,0045 et -,0,0045 pour les hommes et les femmes. Je n'ai aucune idée de comment faire une mise à l'échelle / mormalisation comme ça?

léopard des neiges
la source
Ce n'est pas clair pour moi pourquoi vous voulez faire évoluer vos fonctionnalités? Souvent, les caractéristiques sont normalisées pour avoir 0 unité moyenne std dev. Vous devrez peut-être définir le problème en termes de classes que vous essayez de classer, la régression logistique est utile pour la classification binaire.
BGreene
Vous ne voulez certainement pas catégoriser les âges. Comment la "cote du film" est-elle mesurée? Est-ce une échelle de 1 à 10, un "j'aime / je n'aime pas" ou quoi?
Peter Flom - Réintègre Monica
Pour simplifier, supposons qu'il n'y a que deux classes, Like et Dislike. Comme être 1 et ne pas aimer être 0. Ont changé l'énoncé du problème pour refléter cela.
snow_leopard

Réponses:

15

Cas binaire

Si vous voulez que vos fonctionnalités soient binaires, les bonnes représentations pour les valeurs catégorielles (resp. Réelles ) sont l' encodage à chaud (resp. Thermomètre ). Vous n'avez pas besoin de les normaliser.

Pour l' encodage à chaud d'une fonctionnalité catégorielle , il vous suffit de réserver un bit pour chaque classe. La longueur de cet encodage est donc le nombre de classes de votre entité. Prenons votre exemple de pays,

  • 00001 pour les États-Unis
  • 00010 pour le Royaume-Uni
  • 00100 pour l'Asie
  • 01000 pour l'Europe
  • 10000 pour les autres

Pour le codage par thermomètre d'une fonction réelle / entière , vous devez choisir une longueur et des seuils. Pour votre exemple d'âge, vous avez choisi de diviser l'âge selon les seuils 18,25 et 35. Le codage sera

  • 000 pour 0-17
  • 001 pour 18-25
  • 011 pour 25-34
  • 111 pour 35-ci-dessus

00010UK01130yo

Cas continu

00010UK3030yo

Comme l'a dit BGreene, vous devez ensuite normaliser cette valeur pour conserver une moyenne de 0 et un écart-type de 1, ce qui garantit la stabilité de nombreux modèles de régression. Pour ce faire, il suffit de soustraire la moyenne empirique et de diviser par l'écart-type empirique.

Y_normalized = ( Y - mean(Y) ) / std(Y)

(30-25)/dix=0,5

00010UK0,530yo
Emile
la source
Cool ... alors disons que nous avons un exemple de personne comme suit: Pays: Royaume-Uni, AgeGroup: 25-34. Cela conduira à des valeurs telles que Pays: 2 , Groupe d'âge: 4 si nous utilisons un encodage à chaud . Maintenant, lors de la création d'un vecteur d'entités, nous devons les normaliser. Supposons donc qu'ils viennent comme 0.4 et 0.6, alors notre vecteur d'entité à modéliser devient essentiellement [0.4, 0.6], n'est-ce pas?
snow_leopard
hmm .. si j'utilise un encodage "à chaud", dois-je convertir la valeur d'encodage en sa représentation entière comme une caractéristique, par exemple 0010 devient 2. OU devrais-je le traiter comme un ensemble de 4 fonctionnalités dont une seule sera activée? Dans le premier cas, n'introduit-il pas une notion selon laquelle 1000 est plus loin que 0001 puis 0100, ce qui pourrait ne pas être l'intention, car nous ne voulons pas que la valeur de la caractéristique américaine soit plus proche de la valeur de la caractéristique britannique que de la valeur de l'Asie ou autre chose?
snow_leopard
J'ai modifié ma réponse pour clarifier ces points. Vous n'avez pas besoin de normaliser les entités binaires, et vous devez les traiter comme un vecteur, ne pas les convertir en entier.
Emile
Explication vraiment utile et claire. Merci!
George Liu