我可以在整个数据集上使用 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 可扩展性:整个数据集上的观察者与多个观察者