1
votes

Normaliser les données avant de supprimer la faible variance, fait des erreurs

Je teste le jeu de données iris (on peut charger avec la fonction load_iris () de sklearn.datasets ) avec le scikit- apprendre les fonctions normaliser et VarianceThreshold .

Il semble que si j'utilise MinMaxScaler et que j'exécute VarianceThreshold - il n'y a plus de fonctionnalités.

Avant la mise à l'échelle:

    from sklearn.feature_selection import VarianceThreshold
    sel = VarianceThreshold(threshold=(.8 * (1 - .8)))

Après la mise à l'échelle ( MinMaxScaler )

Column:  sepal length (cm)  Mean:  0.42870370370370364  var =  0.052555727023319614  var/mean:  0.12259219262459005
Column:  sepal width (cm)  Mean:  0.44055555555555553  var =  0.03276265432098764  var/mean:  0.07436668067815606
Column:  petal length (cm)  Mean:  0.46745762711864397  var =  0.08892567269941587  var/mean:  0.19023258481745967
Column:  petal width (cm)  Mean:  0.4580555555555556  var =  0.10019668209876545  var/mean:  0.2187435145879658

J'utilise VarianceThreshold comme:

Column:  sepal length (cm)  Mean:  5.843333333333334  var =  0.6811222222222223  var/mean:  0.11656398554858338
Column:  sepal width (cm)  Mean:  3.0573333333333337  var =  0.1887128888888889  var/mean:  0.06172466928332606
Column:  petal length (cm)  Mean:  3.7580000000000005  var =  3.0955026666666665  var/mean:  0.8237101295015078
Column:  petal width (cm)  Mean:  1.1993333333333336  var =  0.5771328888888888  var/mean:  0.48121141374837856

Devrions-nous mettre les données à l'échelle (par exemple, via MinMaxScaler ) si nous voulons supprimer des fonctionnalités à faible variance?


0 commentaires

3 Réponses :


1
votes

En gros, une fonctionnalité à faible variance signifie une fonctionnalité qui manque d'informations . Autrement dit, si une entité a une variance proche de zéro, elle est proche de prendre une valeur constante. Cependant, chaque caractéristique peut représenter une quantité différente, donc sa variance est différente.

Par exemple, considérez comme des covariables age qui pourrait aller de 0 à 100 et number_of_childs qui pourrait aller de 0 à 5 à titre d'exemple. Comme ces deux variables prennent des valeurs différentes, elles auraient des variances différentes. Désormais, en mettant à l'échelle les fonctionnalités, on les définit dans les mêmes unités . De cette façon, nous pourrions comparer leurs informations sur la même échelle.

Notez que pour l ' ensemble de données d'iris, toutes les entités sont réglées sur la même échelle (centimètres), c'est-à-dire

import pandas as pd 

X = pd.DataFrame(data['data'], columns=data.feature_names)
X = X - X.mean()

Dans ce cas, une bonne première étape serait de centrer les données . En faisant cela, vous pouvez supprimer le bruit de celui-ci.

from sklearn.datasets import load_iris

data = load_iris()
print(data.features_names) 
>>> ['sepal length (cm)',
     'sepal width (cm)',
     'petal length (cm)',
     'petal width (cm)']


1 commentaires

En centrant les données, vous supprimez le biais (c'est-à-dire la moyenne ou la composante constante), pas le «bruit». La normalisation des données est généralement effectuée parce que de nombreux algorithmes (par exemple SVM) fonctionnent beaucoup mieux lorsque les données sont dans la plage autour de [-1..1]. Pour certains, comme la normalisation de l'arbre de décision n'est pas du tout nécessaire.



0
votes

Le MinMaxScaler utilise la formule suivante:

a: 2/3
b: 2/3 

Si vous cochez la case docs du seuil de variance et voir la formule de variance, la variance d'un ensemble de n valeurs également probables peut être exprimée de manière équivalente, sans référence directe à la moyenne, en termes d'écarts carrés de tous les points les uns par rapport aux autres:

entrez la description de l'image ici

Alors comparons un petit exemple avec deux colonnes et trois variables:

a  b
1  0
0  0.5
0  1

Sans scaller, nous avons les variances suivantes:

a: (0.5(1-0)^2+0.5(1-0)^2+ 0.5(0-1)^2 +0.5(0-0)^2 + 0.5(0-1)^2 + 0.5(0-1)^2 )/3 = (0.5+0.5+0.5+0.5)/3= 2/3 = 0.75
b: 6/3 = 2

Après MinMaxScaler code> nous aurions:

a  b
1  0
0  1
0  2

et donc la variance:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

Donc, avec le seuil 0.8, les deux seraient expulsés après la normalisation.

Donc oui, quand vous normali ze vos données avant le seuil de variance, vous supprimerez toujours plus de colonnes, car l'idée de base de minmaxscaler est de normaliser vos données, ce qui signifie que vous aurez moins de variance.


1 commentaires

Cela semble très contre-intuitif. Pour même utiliser VarianceThreshold , nous devons d'abord normaliser les données. Est-ce que StandardScaler () serait une meilleure option?



1
votes

La mise à l'échelle des données en général ne vous aidera pas à trouver des fonctionnalités redondantes.

Habituellement, VarianceThreshold est utilisé pour supprimer des entités dont la variance est égale à zéro, c'est-à-dire des constantes qui ne fournissent aucune information. La ligne de votre code VarianceThreshold (threshold = (. 8 * (1 - .8))) rejette toutes les fonctionnalités dont la variance est inférieure à 0,16. Et dans votre cas, toutes les fonctionnalités ont une variance inférieure à celle-ci (après MinMaxScaler la variance la plus élevée est une largeur de pétale de 0,1 ), vous jetez donc tout. Je pense que vous avez voulu laisser des fonctionnalités qui contribuent à plus de 80% de la variance, mais ce n'est pas ce que fait votre code. Et si vous appliquiez cette ligne avant MinMaxScaler , alors toutes vos fonctionnalités passeraient.

Pour supprimer des fonctionnalités à faible variance, vous devez d'abord définir quel est le seuil raisonnable pour cette fonctionnalité spécifique. Mais dans un cas général, vous ne pouvez pas définir un seuil arbitraire codé en dur pour la variance, car pour certaines fonctionnalités, la valeur serait trop élevée et pour d'autres trop faible. Par exemple, la PCA est souvent utilisée comme procédure de sélection des fonctionnalités. On effectue l'ACP et ne prend que K premiers vecteurs propres, où K est choisi de telle sorte que «l'énergie» des valeurs propres correspondantes soit (disons) 95% (voire 80%) du total. Donc, dans les cas où vous avez un ensemble de données avec 50-100 entités, vous pouvez réduire le nombre d'entités par dix sans perdre beaucoup d'informations.

Lorsque vous appliquez StandardScaler , toutes vos fonctionnalités seront cénétrées et normées , leur moyenne sera donc zéro et la variance 1 (sauf pour les constantes, bien sûr). MinMaxScaler par défaut amènera vos fonctionnalités dans une plage [0..1]. La question n'est pas de savoir quel scaler utiliser, mais pourquoi voulez-vous utiliser un scaler. En général, vous ne voulez pas abandonner les fonctionnalités sauf si vous en avez besoin.

L'hypothèse selon laquelle les informations sont conservées dans la variance n'est pas vraie pour la plupart des jeux de données réels, et souvent les entités avec une variance plus faible ne correspondent pas à des entités à faible information. Comme votre objectif final n'est pas de réduire le nombre de fonctionnalités mais de créer un meilleur algorithme de classification, vous ne devez pas optimiser trop fortement les objectifs intermédiaires.


0 commentaires