StandardScaler avant et après le fractionnement des données

20

Lorsque je lisais sur l'utilisation StandardScaler, la plupart des recommandations disaient que vous devriez utiliser StandardScaler avant de diviser les données en train / test, mais lorsque je vérifiais certains des codes publiés en ligne (en utilisant sklearn), il y avait deux utilisations principales.

1- Utilisation StandardScalersur toutes les données. Par exemple

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_fit = sc.fit(X)
X_std = X_fit.transform(X)

Ou

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit(X)
X = sc.transform(X)

Ou simplement

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_std = sc.fit_transform(X)

2- Utilisation StandardScalersur des données fractionnées.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)

Je voudrais standardiser mes données, mais je ne sais pas quelle méthode est la meilleure!

tsumaranaina
la source

Réponses:

25

Afin d'éviter que des informations sur la distribution de l'ensemble de tests ne fuient dans votre modèle, vous devez opter pour l'option n ° 2 et ajuster le scaler sur vos données d'entraînement uniquement, puis normaliser les ensembles de formation et de test avec ce scaler. En ajustant le scaler sur l'ensemble de données complet avant la division (option # 1), les informations sur l'ensemble de test sont utilisées pour transformer l'ensemble d'apprentissage, qui à son tour est transmis en aval.

Par exemple, connaître la distribution de l'ensemble de données peut influencer la façon dont vous détectez et traitez les valeurs aberrantes, ainsi que la façon dont vous paramétrez votre modèle. Bien que les données elles-mêmes ne soient pas exposées, les informations sur la distribution des données le sont. Par conséquent, les performances de votre ensemble de tests ne sont pas une véritable estimation des performances sur des données invisibles. Une discussion plus approfondie que vous pourriez trouver utile est sur la validation croisée .

redhqs
la source
La même chose s'appliquerait-elle à un ensemble de validation? En d'autres termes, si je divise mon ensemble d'entraînement en ensembles de train et de validation, est-ce que j'apprends l'ajustement uniquement sur le train et que je postule ensuite aux ensembles de validation et de test? ou est-ce que j'apprends l'ajustement sur l'ensemble de données qui comprenait à la fois les exemples de validation et de formation et je ne m'inquiète que de l'appliquer à l'ensemble de test plus tard.
Phil Glau
salut - c'est correct, ne rentre que dans le train - pas de validation ou de test
redhqs
0

Qu'en est-il des éléments suivants:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

X_train = sc.fit_transform(X_train)

X_test = sc.fit_transform (X_test)

Parce que si X_test = sc.transform(X_test), il renvoie l'erreur X_testn'est pas encore ajusté. Ou ai-je raté quelque chose ici?

user253546
la source
2
Il suffit de retirer l'ajustement du X_test
tsumaranaina
0

Vous ne devriez pas faire fit_transform (X_test) sur les données de test.
L'ajustement s'est déjà produit ci-dessus.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)
starsini
la source
Désolé, c'était une réponse à ce qui est en dessous :)
starsini