Comment normaliser un tableau si l'écart-type est nul?

8

J'essaie de normaliser les colonnes de l'ensemble de données pour la régression linéaire.

L'une des colonnes a l'écart type = 0.

def standardize(X):
    return (X - mean(X)) / std(X) 

Donc, ce code ne fonctionne pas.

Existe-t-il des astuces pour résoudre ce problème? J'ai essayé deux choses

  1. Jetez la colonne avec l'écart-type 0 car c'est un paramètre inutile.
  2. Ajoutez un très petit bruit comme à l'un des éléments de la colonne pour que la fonction fonctionne.1010standardize

Je vous remercie!

Pratik Deoghare
la source
Vous faites bien. Comme deuxième option, il sera préférable d'ajouter du bruit aléatoire distribué normalement avec un petit écart-type à chaque valeur de la colonne. Mais comme la première option est plus simple, elle est préférée.
O_Devinyak
17
Si l'écart-type est nul, la colonne est remplie d'une valeur. Donc, si votre objectif est de préparer les données pour la régression, vous pouvez jeter la colonne, car elle ne contribuera en rien à la régression. L'ajout de petits bruits ne vous donnera que plus de problèmes.
mpiktas
4
(Avec la mise en garde que @mpiktas suppose implicitement que la régression contiendra un terme constant, ce qui est généralement le cas.) Notez que l'ajout de petit bruit entraînera cette colonne et la constante extrêmement parallèles, créant potentiellement toutes sortes de ravages dans le numérique solutions en raison de la multicolinéarité élevée. Mais pourquoi normaliser les colonnes en premier lieu? Cela se produira automatiquement, en utilisant presque n'importe quelle bonne méthode de solution.
whuber
5
@Pratik, je ne pense pas qu'il existe un moyen de transformer une variable avec une variance nulle en une avec une moyenne 0 et une variance 1. Si vous faites l'option (2) ci-dessus, vous remplacez simplement votre variable par des nombres aléatoires normalisés.
Macro

Réponses:

7

La situation que vous décrivez résultera de l'un de ces deux scénarios:

  1. La colonne à laquelle vous faites référence est la colonne de 1 qui est ajoutée à votre matrice de covariables afin que votre régression linéaire ait un terme d'interception .
  2. La colonne est une colonne différente de la colonne mentionnée précédemment, vous donnant deux colonnes de constantes [****].

Pour le scénario 1 : ignorez cette colonne, standardisez toutes les autres colonnes, puis exécutez la régression comme vous le feriez normalement.

Pour le scénario 2 , cependant, vous devrez vous débarrasser entièrement de cette colonne constante supplémentaire. En fait, quelle que soit la question de la normalisation , vous ne pourrez jamais exécuter la régression avec deux colonnes constantes car vous auriez alors une colinéarité parfaite . Le résultat est que même si vous essayez d' exécuter la régression, le programme informatique crachera un message d'erreur et quittera à mi-chemin [Remarque: c'est parce qu'une régression OLS nécessite que la matrice X'X soit non singulière pour que les choses fonctionnent. correctement].

Quoi qu'il en soit, bonne chance avec votre, euh, régression!

[****] Juste pour clarifier: ce que je veux dire par "deux colonnes de constantes", c'est que vous avez une colonne dans laquelle chaque élément est "1" et une deuxième colonne dans laquelle chaque élément est une constante "k" .. .

Steve S
la source
2

La bonne façon serait de supprimer la colonne d'entités des données. Mais comme un hack temporaire -

Vous pouvez simplement remplacer le 0 std par 1 pour cette fonctionnalité. Cela signifierait essentiellement que la valeur mise à l'échelle serait nulle pour tous les points de données de cette entité. Cela a du sens car cela implique que les valeurs des caractéristiques ne s'écartent même pas un peu de la moyenne (car les valeurs sont constantes, la constante est la moyenne).

FYI- C'est ce que fait sklearn! https://github.com/scikit-learn/scikit-learn/blob/7389dbac82d362f296dc2746f10e43ffa1615660/sklearn/preprocessing/data.py#L70

PankajKabra
la source
L'écart type étant 0 signifie que la caractéristique est constante et donc pas utile pour la prédiction. La modification de l'écart-type d'une constante n'a aucun sens.
Michael R. Chernick
Oui, cela n'a aucun sens du point de vue de la modélisation, je l'ai simplement suggéré comme un hack pour ne pas passer par la difficulté de supprimer la colonne à chaque fois qu'une fonctionnalité constante entre dans un ensemble de données.
PankajKabra
0

La fonction qui n'a aucune variance est inutile, supprimez-la.

Considérez ceci, si c'était la seule fonctionnalité, vous n'apprendriez rien de la réponse à cette fonctionnalité à partir des données. Dans le cas multivarié, il faut une algèbre linéaire pour arriver à la même conclusion, mais l'idée est la même.

Aksakal
la source