StandardScaler prima e dopo la divisione dei dati


20

Quando stavo leggendo sull'uso StandardScaler, la maggior parte dei consigli dicevano che dovresti usare StandardScaler prima di suddividere i dati in treno / test, ma quando stavo controllando alcuni dei codici pubblicati online (usando sklearn) c'erano due usi principali.

1- Utilizzo StandardScalersu tutti i dati. Per esempio

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

O

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

O semplicemente

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

2- Utilizzo StandardScalersu dati suddivisi.

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

Vorrei standardizzare i miei dati, ma sono confuso quale sia il metodo migliore!

Risposte:


25

Nell'interesse di prevenire informazioni sulla distribuzione del set di test perdita nel modello, è necessario scegliere l'opzione n. 2 e adattare lo scaler solo ai dati di allenamento, quindi standardizzare entrambi i set di allenamento e test con tale scaler. Montando lo scaler sul set di dati completo prima della divisione (opzione n. 1), le informazioni sul set di test vengono utilizzate per trasformare il set di addestramento, che a sua volta viene passato a valle.

Ad esempio, conoscere la distribuzione dell'intero set di dati potrebbe influenzare il modo in cui si rilevano ed elaborano i valori anomali, nonché il modo in cui si parametrizza il modello. Sebbene i dati stessi non siano esposti, le informazioni sulla distribuzione dei dati lo sono. Di conseguenza, le prestazioni del set di test non sono una vera stima delle prestazioni su dati invisibili. Qualche ulteriore discussione che potresti trovare utile è su Convalida incrociata .


Lo stesso vale per un set di validazione? In altre parole, se divido il mio set di allenamento in set di treni e convalida, imparo l'adattamento solo sul treno e successivamente mi rivolgo a entrambi i set di convalida e test? oppure imparo l'adattamento sull'intero set di dati che comprende sia gli esempi di convalida che di formazione e mi preoccupo solo di applicarlo al set di test in un secondo momento.
Phil Glau,

ciao - è corretto, si adatta solo al treno - non convalida o test
redhqs

0

Che ne dici di quanto segue:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

X_train = sc.fit_transform(X_train)

X_test = sc.fit_transform (X_test)

Perché se X_test = sc.transform(X_test), restituisce errore X_testnon ancora installato. O mi sono perso qualcosa qui?


2
Basta rimuovere l'adattamento da X_test
tsumaranaina il

0

Non dovresti fare fit_transform (X_test) sui dati del test.
L'adattamento si è già verificato sopra.

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

Siamo spiacenti, questo voleva essere una risposta a ciò che è sotto :)
starsini,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.