StandardScaler для всего набора данных обучения или для отдельных сгибов для перекрестной проверки - PullRequest
2 голосов
/ 05 февраля 2020

В настоящее время я использую cross_val_score и KFold для оценки влияния использования StandardScaler в различных точках предварительной обработки данных, в частности, приводит ли масштабирование всего обучающего набора данных перед выполнением перекрестной проверки к утечке данных, и каков эффект этого, когда по сравнению с масштабированием данных внутри конвейера (и, следовательно, только применяя их к тренировочным сгибам).

мой текущий процесс выглядит следующим образом:

Эксперимент A

  • Импортировать набор данных жилья в Бостоне из sklearn.datasets и разделить на Data (X) и target (y)
  • создать конвейер (sklearn.pipeline), который применяет StandardScaler перед применением линейной регрессии
  • Укажите метод перекрестной проверки как KFold с 5-кратными сгибами
  • Выполните перекрестную проверку (cross_val_score), используя описанный выше метод Pipeline и KFold, и просмотрите оценку

Эксперимент B

  • Использовать те же данные о корпусе в Бостоне как указано выше
  • fit_transform StandardScaler для всего набора данных
  • Используйте cross_val_Score для повторной перекрестной проверки 5 раз, но на этот раз вводите LinearRegression, а не конвейер
  • Сравните оценки здесь к эксперименту A

Полученные оценки идентичны (примерно до 13 десятичных знаков), которые я подвергаю сомнению, поскольку эксперимент B вводит утечку данных во время перекрестной проверки.

Я видел сообщения, в которых что не имеет значения, выполняется ли масштабирование на всем тренировочном наборе перед перекрестной проверкой, если это правда, я пытаюсь понять, почему, если это не так, я хотел бы понять, почему оценки все еще могут быть такими похожими, несмотря на утечка данных?

См. мой тестовый код ниже:

import numpy as np
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn import datasets

from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.model_selection import KFold, StratifiedKFold

from sklearn.model_selection import cross_val_score, cross_val_predict

from sklearn.linear_model import LinearRegression

np.set_printoptions(15)

boston = datasets.load_boston()
X = boston["data"]
y = boston["target"]
scalar = StandardScaler()
clf = LinearRegression()

class StScaler(StandardScaler):
    def fit_transform(self,X,y=None):
        print('Length of Data on which scaler is fit on =', len(X))
        output = super().fit(X,y)
#         print('mean of scalar =',output.mean_)
        output = super().transform(X)
        return output


pipeline = Pipeline([('sc', StScaler()), ('estimator', clf)])

cv = KFold(n_splits=5, random_state=42)

cross_val_score(pipeline, X, y, cv = cv)

# Now fitting Scaler on whole train data
scaler_2 = StandardScaler()
clf_2 = LinearRegression()

X_ss = scaler_2.fit_transform(X)
cross_val_score(clf_2, X_ss, y, cv=cv)

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...