我正在使用Standardscaler来规范化我的数据集,也就是说,我通过减去平均值并除以Std将每个特征转换为z分数。
我想在sklearn的管道中使用Standardscaler,我想知道如何将转换应用于X_test。也就是说,在下面的代码中,当我运行 pipeline.predict(X_test)
时,我的理解是StandardScaler
和SVC()
是在X_test上运行的,但是Standardscaler
究竟使用什么作为平均值和 StD?来自X_Train
的那些还是它只为X_test
计算那些?例如,如果X_test
仅由 2 个变量组成,规范化看起来与我完全规范化X_train
和X_test
有很大不同,对吧?
steps = [('scaler', StandardScaler()),
('model',SVC())]
pipeline = Pipeline(steps)
pipeline.fit(X_train,y_train)
y_pred = pipeline.predict(X_test)
Sklearn的pipeline
将在调用pipeline.fit()
时应用transformer.fit_transform()
,在调用pipeline.predict()
时transformer.transform()
。 因此,对于您的情况,StandardScaler
将被拟合到 X_train
中,然后X_train
的平均值和 stdev 将用于缩放X_test
。
X_train
的转变确实看起来与X_train
和X_test
的转变不同。 差异的程度将取决于X_train
和X_test
组合之间分布的差异程度。 但是,如果从同一原始数据集中随机分区,并且大小合理,则X_train
和X_test
的分布可能相似。
无论如何,重要的是要将X_test
视为样本外,以便使其成为(希望)看不见数据的可靠指标。 由于你不知道看不见的数据的分布,你应该假装你不知道X_test
的分布,包括均值和stdev。