Comment appliquer de la normalisation pour les SVMs dans scikit-learn?
J'utilise la version stable actuelle 0.13 des scikit-learn. Je suis de l'application d'un linéaire de vecteurs de support classificateur à certaines données à l'aide de la classe sklearn.svm.LinearSVC
.
Dans le chapitre sur le préprocesseur dans scikit-learn documentation, j'ai lu les suivantes:
De nombreux éléments utilisés dans la fonction objectif d'un algorithme d'apprentissage (comme le noyau RBF des Machines à Vecteurs de Support ou de la l1 et de la l2 regularizers de modèles linéaires) supposons que toutes les fonctionnalités sont centrées autour de zéro et ont de la variance dans le même ordre. Si une fonction a un écart qui est des ordres de grandeur de plus que les autres, il pourrait dominer la fonction objectif et de faire de l'estimateur sont incapables d'apprendre des autres caractéristiques correctement comme prévu.
Question 1: la normalisation Est utile pour les SVMs, en général, également pour les personnes avec un linéaire de la fonction noyau, comme dans mon cas?
Question 2: Comme je le comprends, je dois calculer la moyenne et l'écart-type sur les données d'apprentissage et d'appliquer cette même transformation sur les données de test à l'aide de la classe sklearn.prétraitement.StandardScaler
. Cependant, ce que je ne comprends pas, c'est que j'ai de transformer les données d'entraînement en tant que bien ou tout simplement les données de test avant d'alimenter le SVM.
Qui est, dois-je faire ceci:
scaler = StandardScaler()
scaler.fit(X_train) # only compute mean and std here
X_test = scaler.transform(X_test) # perform standardization by centering and scaling
clf = LinearSVC()
clf.fit(X_train, y_train)
clf.predict(X_test)
Ou dois-je faire ceci:
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train) # compute mean, std and transform training data as well
X_test = scaler.transform(X_test) # same as above
clf = LinearSVC()
clf.fit(X_train, y_train)
clf.predict(X_test)
En bref, dois-je utiliser scaler.fit(X_train)
ou scaler.fit_transform(X_train)
sur les données d'apprentissage afin d'obtenir des résultats raisonnables avec LinearSVC
?
Vous devez vous connecter pour publier un commentaire.
Ni.
scaler.transform(X_train)
n'a aucun effet. Letransform
opération n'est pas en place.Que vous avez à faire
ou
Vous avez toujours besoin de faire le même prétraitement sur la formation ou des données de test. Et oui, la normalisation est toujours bon si il reflète votre avis pour les données.
En particulier pour le noyau-les svms, il est souvent crucial.
fit()
oufit_transform()
surX_train
.fit
oufit_transform
mais si pour transformer l'essai et les données d'apprentissage. La réponse est: certainement. Si vous transformez une seule, comment pourriez-vous espérer apprendre quelque chose? Ils ne seraient pas de la même distribution plus.transform
sur l'ensemble de test? L'exemple dans cette page de doc utilisefit
sur l'ensemble de test au lieu detransform
.Pourquoi ne pas utiliser un
Pipeline
à la chaîne (ou de les combiner) les transformateurs et les estimateurs en une seule fois? Vous permet d'économiser les tracas de séparément montage et la transformation de vos données, puis à l'aide de l'estimateur. Cela permettrait d'économiser de l'espace, trop.