我正在开发一个用于大约100个连续特征和一个连续标签的SVR模型。
为了缩放数据,我编写了以下代码:
# 读取数据
df = pd.read_csv(data_path, sep='\t')
features = df.iloc[:,1:-1] # 100个特征
target = df.iloc[:,-1] # 标签
names = df.iloc[:,0] # 列名
# 缩放特征
scaler = StandardScaler()
scaled_df = scaler.fit_transform(features)
# 重新命名列(因为现在它是一个np数组)
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应用到整个数据框架上和分别应用到训练集和测试集上有什么区别吗?
回答:
之前的回答说在缩放时应该分开训练集和测试集,否则测试集可能会影响训练集的转换。这部分对部分错。
如果分别进行转换,那么训练集可能会被缩放到错误的比例(例如,如果它来自一个狭窄的连续时间范围,因此只采用了一部分值范围)。你最终会得到测试集变量的错误值。
一般来说,你必须在训练集上进行缩放,并将缩放传输到测试集。这是通过分别使用fit
和transform
方法来完成的,如文档中所示。