Question:
Est-ce une bonne pratique de toujours mettre à l'échelle / normaliser les données pour l'apprentissage automatique?
Juan Antonio Gomez Moriano
2016-01-07 10:09:44 UTC
view on stackexchange narkive permalink

Je crois comprendre que lorsque certaines fonctionnalités ont des plages de valeurs différentes (par exemple, imaginez qu'une fonctionnalité correspond à l'âge d'une personne et une autre à son salaire en USD) aura un impact négatif sur les algorithmes, car la fonctionnalité avec des valeurs plus élevées prendra plus d'influence, est-ce une bonne pratique de simplement TOUJOURS mettre à l'échelle / normaliser les données?

Il me semble que si les valeurs sont déjà similaires, alors les normaliser aura peu d'effet, mais si les valeurs une normalisation très différente aidera, mais cela semble trop simple pour être vrai :)

Est-ce que je manque quelque chose? Existe-t-il des situations / algorithmes dans lesquels il est en fait souhaitable de laisser certaines fonctionnalités l'emporter délibérément sur d'autres?

En relation: http://stats.stackexchange.com/questions/89809/is-it-important-to-scale-data-before-clustering
Sept réponses:
one_observation
2016-01-07 10:53:13 UTC
view on stackexchange narkive permalink

Tout d'abord, je ne pense pas qu'il y ait beaucoup de questions de la forme "Est-ce une bonne pratique de toujours X en machine learning" où la réponse va être définitive. Toujours? Toujours toujours? À travers des modèles paramétriques, non paramétriques, bayésiens, de Monte Carlo, des sciences sociales, purement mathématiques et des millions de modèles d'entités? Ce serait bien, non!

Mais concrètement, voici quelques façons dont: cela dépend.

Parfois, quand la normalisation est bonne:

1) Plusieurs algorithmes, en particulier les SVM qui me viennent à l'esprit, peuvent parfois converger beaucoup plus rapidement sur des données normalisées (même si pourquoi, précisément, je ne m'en souviens pas).

2) Lorsque votre modèle est sensible à la magnitude et que les unités de deux entités différentes sont différentes et arbitraires. C'est comme le cas que vous suggérez, dans lequel quelque chose a plus d'influence qu'il ne le devrait.

Mais bien sûr, tous les algorithmes ne sont pas sensibles à la magnitude comme vous le suggérez. Les coefficients de régression linéaire seront identiques si vous mettez ou non vos données à l'échelle, car elles examinent les relations proportionnelles entre elles.

Parfois, la normalisation est mauvais:

1) Lorsque vous voulez interpréter vos coefficients, et qu'ils ne se normalisent pas bien. La régression sur quelque chose comme les dollars vous donne un résultat significatif. La régression sur la proportion de dollars maximum dans l'échantillon pourrait ne pas l'être.

2) Quand, en fait, les unités de vos entités sont significatives et que la distance fait une différence! Revenons aux SVM - si vous essayez de trouver un classificateur à marge maximale, les unités qui entrent dans ce «max» comptent. La mise à l'échelle des fonctionnalités pour les algorithmes de clustering peut considérablement modifier le résultat. Imaginez quatre groupes autour de l'origine, chacun dans un quadrant différent, tous bien mis à l'échelle. Maintenant, imaginez que l'axe y soit étiré à dix fois la longueur de l'axe x. au lieu de quatre petits groupes de quadrants, vous allez obtenir la longue baguette écrasée de données coupée en quatre morceaux sur sa longueur! (Et, la partie importante est que vous préférerez peut-être l'un ou l'autre!)

Dans le résumé insatisfaisant, je suis sûr, la réponse la plus générale est que vous devez vous demander sérieusement ce qui a du sens avec les données, et modèle que vous utilisez.

Merci pour la réponse, mais voici une autre question, vous dites que dans les modèles de régression normaliser par exemple le salaire (1000-100000) et (disons) l'âge (10-80) n'aidera pas beaucoup (surtout parce que l'on perd le sens duchiffres ...), cependant, si je ne normalise pas cela, il arrivera que le salaire l'emportera sur l'âge, n'est-ce pas?
Qu'entendez-vous par l'emporter?Je suppose que le salaire et l'âge sont deux variables indépendantes ici.Les normaliser ne modifie que les unités sur leurs coefficients.Mais par exemple, parce que c'est plus clair qu'une constante de normalisation, divisons par exemple par 1000. Mais alors votre coefficient signifie simplement changement par - \ $ 1000-changement, par opposition à changement par - \ $ 1-changement.Les nombres sont différents, mais vous devriez toujours penser à ce que signifient vos coefficients - vous ne pouvez tout simplement pas vous arrêter aux seuls chiffres.
En les normalisant, j'entends utiliser une fonction telle que scale dans r, comme data $ age <-scale (data $ age) et data $ salaire <- scale (data $ salaire).En fin de compte, lorsqu'on utilise quelque chose comme la régression logistique, on apprend simplement les paramètres d'un vecteur, n'est-ce pas?si un tel vecteur contient des variables dont les valeurs sont dans une plage beaucoup plus grande que d'autres, cela ne poserait-il pas de problème?J'ai joué avec et sans données mises à l'échelle pour la régression logistique et la mise à l'échelle semble aider ... Est-ce que je manque quelque chose?
_Normalisation_, je comprends - vous avez utilisé le mot _poids_, et je ne comprends toujours pas comment vous l'utilisez.Et encore une fois, la mise à l'échelle «semble aider» - que voulez-vous dire?Aide _comment_?
C'est peut-être mon anglais :).Ce que je veux dire, c'est qu'étant donné qu'une variable (salaire) a une fourchette plus large que l'autre (disons l'âge), cela signifie que l'âge aura très peu d'importance lorsqu'il s'agira d'effectuer des prédictions tandis que le salaire sera le facteur le plus déterminant et c'estpas toujours souhaitable.Par «semble aider», je veux dire que lorsque vous essayez un modèle entraîné avec / sans valeurs mises à l'échelle, celui à l'échelle se généralise mieux (en utilisant l'ensemble de validation croisée).J'espère que cela clarifie :)
@JuanAntonioGomezMoriano: Ce n'est pas vrai: les modèles linéaires sont invariants aux transformations linéaires de leurs prédicteurs.Ce n'est que lorsque vous pénalisez les estimations des coefficients en fonction de leur ampleur que cela compte (un cas du 2e point du sophologue).Voir [Lorsque vous effectuez une régression multiple, quand devez-vous centrer vos variables prédictives et quand les standardiser?] (Http://stats.stackexchange.com/q/29781/17230).Si la mise à l'échelle des prédicteurs entraîne * un quelconque changement * dans les prédictions, cela est dû à des problèmes numériques dans votre algorithme d'ajustement.
"Les coefficients de régression linéaire seront identiques si vous mettez ou non vos données à l'échelle".Cela est vrai pour la mise à l'échelle des entrées et des sorties par une seule valeur constante.Mais mettre à l'échelle chaque caractéristique (ou la sortie) séparément changerait les coefficients.
Une chose que personne n'a encore mentionnée est l'impact que les échelles de différence des variables indépendantes ont sur «l'interception» du modèle.Vous pouvez certainement vous retrouver avec des interceptions négatives, ce qui devient difficile à interpréter (plutôt à expliquer à un dirigeant).
Amir
2016-01-07 10:56:06 UTC
view on stackexchange narkive permalink

Eh bien, je crois qu'un point de vue plus géométrique aidera à mieux décider si la normalisation aide ou non. Imaginez que votre problème d'intérêt ne comporte que deux caractéristiques et qu'elles varient différemment. Puis géométriquement, les points de données sont répartis autour et forment un ellipsoïde. Cependant, si les caractéristiques sont normalisées, elles seront plus concentrées et, espérons-le, formeront un cercle unitaire et rendront la covariance diagonale ou au moins proche de la diagonale. C'est l'idée derrière des méthodes telles que la normalisation par lots des représentations intermédiaires des données dans les réseaux de neurones. En utilisant BN, la vitesse de convergence augmente étonnamment (peut-être 5 à 10 fois) car le gradient peut facilement aider les gradients à faire ce qu'ils sont censés faire afin de réduire l'erreur.

Dans le cas non normalisé, gradient- les algorithmes d'optimisation basés sur la base auront beaucoup de mal à déplacer les vecteurs de poids vers une bonne solution. Cependant, la surface de coût pour le cas normalisé est moins allongée et les méthodes d'optimisation basées sur le gradient feront beaucoup mieux et divergeront moins.

C'est certainement le cas des modèles linéaires et en particulier de ceux dont la fonction de coût est une mesure de la divergence de la sortie du modèle et de la cible (par exemple, régression linéaire avec fonction de coût MSE), mais peut ne pas être nécessairement la cas dans les non-linéaires. La normalisation ne nuit pas aux modèles non linéaires; ne pas le faire pour les modèles linéaires sera douloureux.

L'image ci-dessous pourrait être [à peu près] considérée comme l'exemple d'une surface d'erreur allongée dans laquelle les méthodes basées sur le gradient pourraient avoir du mal à aider les vecteurs de poids aller vers les optima locaux.

enter image description here

_Cependant, la normalisation ne nuit pas aux modèles non linéaires, mais ne pas le faire pour les modèles linéaires fera mal._ Je trouve cette phrase difficile à comprendre.Est-il (grosso modo) hors de propos pour les modèles non linéaires que les données soient normalisées?Ne pas le faire pour les modèles linéaires cassera quelque chose, mais pouvez-vous spécifier mieux pour les modèles non linéaires?Essayez peut-être d'éviter de mélanger des expressions positives et négatives dans cette seule phrase.
Dans les modèles linéaires, les caractéristiques avec de grandes plages induiront une forte variance du modèle et peuvent donc devenir inutilement importantes.Par exemple, dans PCA, ces fonctionnalités auront des valeurs propres beaucoup plus grandes que d'autres.Cependant, dans les modèles non linéaires (dépend de nombreux facteurs), cela peut ne pas être le cas car le modèle peut complètement changer la représentation des données par le biais des non-linéarités.Il n'est donc pas aussi facile d'analyser ce qui se passe dans un modèle non linéaire et comment des fonctionnalités non normalisées affectent la sortie.
Donc, fondamentalement, l'effet de la normalisation dans les modèles non linéaires est difficile à prédire et devrait être décidé au cas par cas?
Vrai.Bien qu'il ait été prouvé empiriquement que la normalisation aide également les modèles non linéaires.
Merci pour cette clarification.Cela m'a aidé à mieux comprendre votre réponse.
Pourriez-vous ajouter une explication de ce que signifie votre deuxième graphique?
@JuanAntonioGomezMoriano C'est la convergence (se rapprocher des minima locaux)
Quel est l'axe X et Y?
L'axe X est le nombre d'itérations de l'axe Y est le représente la convergence
Vihari Piratla
2016-01-07 12:36:25 UTC
view on stackexchange narkive permalink

Permettez-moi de vous raconter comment j'ai appris l'importance de la normalisation.

J'essayais de classer une donnée de chiffres manuscrits (c'est une tâche simple de classer des caractéristiques extraites d'images d'écritures manuscrites digits) avec Neural Networks comme devoir pour un cours d'apprentissage automatique.
Comme tout le monde, j'ai commencé avec une bibliothèque / un outil de réseau neuronal, je l'ai alimenté avec les données et j'ai commencé à jouer avec les paramètres. J'ai essayé de changer le nombre de couches, le nombre de neurones et diverses fonctions d'activation. Aucun d'entre eux n'a donné les résultats attendus (précision autour de 0,9).

Le coupable? Le (s) facteur (s) de mise à l'échelle de la fonction d'activation = $ \ frac {s} {1 + e ^ {- s.x}} $ - 1. Si le paramètre s n'est pas défini, la fonction d'activation activera chaque entrée ou annulera chaque entrée à chaque itération. Ce qui a évidemment conduit à des valeurs inattendues pour les paramètres du modèle. Ce que je veux dire, c'est qu'il n'est pas facile de définir des s lorsque l'entrée x varie sur de grandes valeurs.

Comme certaines des autres réponses l'ont déjà souligné, le "bon la pratique "de normaliser ou non les données dépend des données, du modèle et de l'application. En normalisant, vous jetez en fait des informations sur les données telles que les valeurs absolues maximum et minimum. Donc, il n'y a pas de règle empirique.

arielf
2016-01-08 02:51:51 UTC
view on stackexchange narkive permalink

Comme d'autres l'ont dit, la normalisation n'est pas toujours applicable; par exemple. d'un point de vue pratique.

Pour pouvoir mettre à l'échelle ou normaliser des entités dans une plage commune comme [0,1] , vous devez connaître le min / max (ou mean / stdev selon la méthode de mise à l'échelle que vous appliquez) de chaque fonctionnalité. IOW: vous devez avoir toutes les données pour toutes les fonctionnalités avant de commencer la formation.

De nombreux problèmes d'apprentissage pratiques ne vous fournissent pas tous les données a-priori, donc vous ne pouvez tout simplement pas normaliser. Ces problèmes nécessitent une approche d'apprentissage en ligne.

Cependant, notez que certains algorithmes en ligne (par opposition à l'apprentissage par lots) qui apprennent d'un exemple à la fois, prennent en charge une approximation de la mise à l'échelle /normalisation. Ils apprennent les échelles et les compensent, de manière itérative. vowpal wabbit par exemple normalise de manière itérative la mise à l'échelle par défaut (à moins que vous ne désactiviez explicitement la mise à l'échelle automatique en forçant un certain algorithme d'optimisation comme le --sgd naïf)

probabilityislogic
2018-09-29 03:29:07 UTC
view on stackexchange narkive permalink

La mise à l'échelle / la normalisation modifie légèrement votre modèle. La plupart du temps, cela correspond à l'application d'une fonction affine. Donc vous avez $ Z = A_X + B_XXC_X $ $ X $ est votre "entrée / données d'origine" (une ligne pour chaque exemple d'entraînement, une colonne pour chaque fonctionnalité). Alors $ A_X, B_X, C_X $ sont des matrices qui sont généralement des fonctions de $ X $ . La matrice $ Z $ est ce que vous insérez dans votre algorithme ML.

Maintenant, supposons que vous vouliez prédire un nouvel échantillon. Mais vous n'avez que $ X_ {new} $ et non $ Z_ {new} $ . Vous devriez appliquer la fonction $ Z_ {new} = A_X + B_XX_ {new} C_X $ . Autrement dit, utilisez le même $ A_X, B_X, C_X $ de l'ensemble de données d'entraînement, plutôt que de les ré-estimer. Cela donne à ces matrices la même forme que les autres paramètres de votre modèle.

Bien qu'elles soient souvent équivalentes en termes de valeurs prédites que vous obtenez à partir de l'ensemble de données d'entraînement, il ne s'agit certainement pas de nouvelles données pour les prédictions. Un exemple simple, prédire pour $ 1 $ nouvelle observation, la normalisation (soustraire la moyenne, diviser par sd) renverra toujours zéro.

Steven Scott
2018-09-29 02:06:16 UTC
view on stackexchange narkive permalink

Pour les modèles d'apprentissage automatique qui incluent des coefficients (par exemple, régression, régression logistique, etc.), la principale raison de normaliser est la stabilité numérique.Mathématiquement, si l'une de vos colonnes de prédicteur est multipliée par 10 ^ 6, le coefficient de régression correspondant sera multiplié par 10 ^ {- 6} et les résultats seront les mêmes.

Sur le plan informatique, vos prédicteurs sont souvent transformés par l'algorithme d'apprentissage (par exemple, la matrice X des prédicteurs dans une régression devient X'X) et certaines de ces transformations peuvent entraîner une perte de précision numérique si X est très grand ou très petit.Si vos prédicteurs sont sur une échelle de 100, cela n'aura pas d'importance.Si vous modélisez des grains de sable, des unités astronomiques ou des nombres de requêtes de recherche, c'est peut-être le cas.

Ayush
2016-05-30 04:02:17 UTC
view on stackexchange narkive permalink

J'essayais de résoudre un problème de régression de crête en utilisant la descente de gradient. Maintenant, sans normalisation, j'ai défini une taille d'étape appropriée et j'ai exécuté le code. Afin de m'assurer que mon codage était sans erreur, j'ai également codé le même objectif dans CVX. Maintenant, CVX n'a ​​pris que quelques itérations pour converger vers une certaine valeur optimale, mais j'ai exécuté mon code pour la meilleure taille de pas que j'ai pu trouver par itérations de 10k et j'étais proche de la valeur optimale de CVX mais toujours pas exacte.

Après avoir normalisé l'ensemble de données et l'avoir alimenté dans mon code et CVX, j'ai été surpris de voir que maintenant la convergence ne prenait que 100 itérations et la valeur optimale vers laquelle la descente de gradient convergeait était exactement égale à celle de CVX.
De plus, la quantité de «variance expliquée» par modèle après normalisation était plus importante que celle d'origine. Donc, juste à partir de cette expérience naïve, j'ai réalisé qu'en ce qui concerne le problème de régression, j'irais pour la normalisation des données. BTW ici, la normalisation implique la soustraction par la moyenne et la division par l'écart type.

Pour me soutenir sur la régression, veuillez consulter cette question pertinente et en discuter:
Lorsque vous effectuez une régression multiple, quand devez-vous centrez vos variables prédictives & quand devriez-vous les standardiser?

ce que vous appelez la normalisation s'appelle la normalisation.Voir https://en.wikipedia.org/wiki/Feature_scaling#Standardization


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...