StandardScaler antes e depois da divisão dos dados

20

Quando eu estava lendo sobre o uso StandardScaler, a maioria das recomendações dizia que você deveria usar StandardScaler antes de dividir os dados em treinamento / teste, mas quando eu estava verificando alguns dos códigos publicados on-line (usando o sklearn), havia dois usos principais.

1- Usando StandardScalerem todos os dados. Por exemplo

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 simplesmente

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

2- Usando StandardScalerem dados divididos.

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

Gostaria de padronizar meus dados, mas estou confuso sobre qual método é o melhor!

tsumaranaina
fonte

Respostas:

25

Para impedir que as informações sobre a distribuição do conjunto de testes vazem em seu modelo, você deve optar pela opção 2 e ajustar o redimensionador apenas aos dados de treinamento, padronizando os conjuntos de treinamento e teste com esse redimensionador. Ao ajustar o redimensionador no conjunto de dados completo antes da divisão (opção 1), informações sobre o conjunto de testes são usadas para transformar o conjunto de treinamento, que por sua vez é transmitido rio abaixo.

Como exemplo, conhecer a distribuição de todo o conjunto de dados pode influenciar como você detecta e processa outliers, bem como como você parametriza seu modelo. Embora os dados em si não sejam expostos, informações sobre a distribuição dos dados são. Como resultado, o desempenho do seu conjunto de testes não é uma estimativa real do desempenho em dados invisíveis. Algumas discussões adicionais que você pode achar úteis estão em Validação cruzada .

redhqs
fonte
O mesmo se aplicaria a um conjunto de validação? Em outras palavras, se eu dividir meu conjunto de treinamento em conjuntos de treinamento e validação, aprendo o ajuste apenas no trem e depois aplico aos conjuntos de validação e teste posteriormente? ou aprendo o ajuste em todo o conjunto de dados que incluía os exemplos de Validação e Treinamento e só me preocupo em aplicá-lo ao conjunto de testes posteriormente.
Phil Glau
oi - isso é correto, que só possam servir no trem - não validação ou teste
redhqs
0

Que tal o seguinte:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

X_train = sc.fit_transform(X_train)

X_test = sc.fit_transform (X_test)

Porque se X_test = sc.transform(X_test), retorna erro X_testainda não está ajustado. Ou eu perdi alguma coisa aqui?

user253546
fonte
2
Basta remover o ajuste do X_test
tsumaranaina
0

Você não deve fazer o fit_transform (X_test) nos dados do teste.
O ajuste já ocorreu acima.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)
starsini
fonte
Desculpe, isso foi feito como uma resposta ao que está abaixo :) #
starsini 10/10