В настоящее время я использую 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)
Спасибо!