我可以在整个数据集上使用 StandardScaler(),还是应该分别在训练集和测试集上计算?

Posted

技术标签:

【中文标题】我可以在整个数据集上使用 StandardScaler(),还是应该分别在训练集和测试集上计算?【英文标题】:Can I use StandardScaler() on whole data set, or should I calculate on train and test sets separately? 【发布时间】:2021-06-03 23:33:49 【问题描述】:

我正在为大约 100 个连续特征和一个连续标签开发 SVR。

为了缩放数据,我写道:

#Read in
df = pd.read_csv(data_path,sep='\t')
features = df.iloc[:,1:-1] #100 features
target = df.iloc[:,-1] #The label
names = df.iloc[:,0] #Column names


#Scale features
scaler = StandardScaler()
scaled_df = scaler.fit_transform(features)


# rename columns (since now its an np array)
features.columns = df_columns

所以现在我有了一个缩放的数据框,我的下一步就是分成训练和测试,然后开发一个模型(SVR):

X_train, X_test, y_train, y_test = train_test_split(scaled_df, target, test_size=0.2)
model = SVR()

...然后我将模型拟合到数据中。

但我注意到其他人不适合整个数据帧的 StandardScaler(),但他们先将数据帧拆分为训练和测试,然后分别将 StandardScaler() 应用于每个数据帧。

将 StandardScaler 应用于整个数据框,还是分别训练和测试有区别吗?

【问题讨论】:

也就是说,关于测试集有一个简单的经验法则:在建模阶段,假装它甚至不存在。如果它不存在,你就不能将它包含在你的缩放中,对吧? 【参考方案1】:

您需要将 StandardScaler 应用于训练集,以防止测试集的分布泄漏到模型中。如果在拆分之前将缩放器拟合到完整数据集上,则测试集信息用于转换训练集并使用它来训练模型。

【讨论】:

以上是关于我可以在整个数据集上使用 StandardScaler(),还是应该分别在训练集和测试集上计算?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 可扩展性:整个数据集上的观察者与多个观察者

在整个数据集上或仅在训练数据上计算 TF-IDF?

整个数据集的交叉验证和数据的矢量化

BigQuery:在目标表上设置过期时间

如何在使用 make_csv_dataset 创建的数据集上制作 train_test_split

我需要使用 python 在具有 144 列的数据集上创建 corr 矩阵