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?
3 Réponses :
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)']
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.
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:
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.
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?
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.