我试图调整我的k-最近的邻居模型与网格搜索。但是由于我的数据集不稳定,我需要首先标准化它。
然而,我读过一篇教程,说明在进行k折叠交叉验证之前进行标准化会导致数据泄漏,因为验证集会影响培训集。
我想问一下下面的代码块中是否存在这个问题。如果是的话,我怎样才能避免这种情况。谢谢!
#Standardizing my data
scaler = StandardScaler().fit(X_train)
rescaledX = scaler.transform(X_train)
#Using Grid Search and k-fold cross validation
k_values = numpy.array([1,3,5,7,9,11,13,15,17,19,21])
param_grid = dict(n_neighbors=k_values)
model = KNeighborsRegressor()
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
#Does this step cause data leakage if all folds in k-fold were standardized together in 2nd line?
grid = GridSearchCV(estimator=model, param_grid=param_grid, scoring=scoring, cv=kfold)
grid_result = grid.fit(rescaledX, Y_train)发布于 2020-07-03 22:13:46
是的,它是数据泄漏:网格搜索中的评分来自测试折叠,但是这些都是与X_train的其他部分一起缩放的,因此模型已经“看到”了测试折叠中的一些信息。
您可以使用sklearn管道修复这个问题,只在网格搜索的训练褶皱上进行缩放和模型拟合:
from sklearn.pipeline import Pipeline
pipe = Pipeline(steps=[('scale', StandardScaler()),
('knn', KNeighborsRegressor())])
# the hyperparameter names need a prefix now that the model is in a pipeline:
param_grid = dict(knn__n_neighbors=k_values)
grid = GridSearchCV(estimator=pipe, param_grid=param_grid, scoring=scoring, cv=kfold)
grid_result = grid.fit(rescaledX, Y_train)(现在,缩放中的数据泄漏可能是一个相当温和的版本,特别是如果您的培训集实际上是一个很好的代表性样本的话)。由于受影响的分数只是用来选择超参数的分数(请注意,best_score_不是一个无偏估计!),任何泄漏都必须具有使某些超参数优于另一个参数的效果。但是在这种情况下,只使用管道:它可能不会对计算时间造成很大的影响,它在统计上更严格,而且更容易测试和投入生产(对于未见数据的扩展步骤)。
https://stackoverflow.com/questions/62721412
复制相似问题