微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何对测试数据进行 Yeo Johnson 特征标准化?

如何解决如何对测试数据进行 Yeo Johnson 特征标准化?

我有一个训练和测试数据作为交叉验证的一部分。当我使用 Yeo Johnson 变换,为了防止数据泄露,我计划从训练数据归一化中保存 lambda,并将其用于测试数据归一化。 我写了一个小片段来测试这个,如下所示:

import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
# fig = plt.figure(figsize=(10,10),dpi=600)
ax1 = fig.add_subplot(421)
xTr = stats.loggamma.rvs(5,size=500) + 5
prob = stats.probplot(xTr,dist=stats.norm,plot=ax1)
ax1.set_xlabel('')
ax1.set_title('Probplot:Train')

ax2 = fig.add_subplot(422)
sns.distplot(xTr,color="skyblue")
ax2.set_title('distribution of Training Data')

ax3 = fig.add_subplot(423)
xt_scipy,lmbda = stats.yeojohnson(xTr)
prob = stats.probplot(xt_scipy,plot=ax3)
ax3.set_title('Probplot:Yeo-Johnson:Scipy on train')

ax4 = fig.add_subplot(424)
sns.distplot(xt_scipy,color="skyblue")
ax4.set_title('distribution of Transformed Train Data')

ax5 = fig.add_subplot(425)
xTst = stats.loggamma.rvs(10,size=500) + 5
# xTst = stats.loglaplace.rvs(7,size=500)
prob = stats.probplot(xTst,plot=ax5)
ax5.set_xlabel('')
ax5.set_title('Probplot:Test')

ax6 = fig.add_subplot(426)
sns.distplot(xTst,color="skyblue")
ax6.set_title('distribution of Test Data')

ax7 = fig.add_subplot(427)
xtst_scipy = stats.yeojohnson(xTst,lmbda=lmbda)
prob = stats.probplot(xtst_scipy,plot=ax7)
ax7.set_title('Probplot:Yeo-Johnson:Scipy on Test')

ax8 = fig.add_subplot(428)
sns.distplot(xtst_scipy,color="skyblue")
ax8.set_title('distribution of Transformed Test Data')
plt.tight_layout(h_pad=0.9,w_pad=0.9)
plt.show()

这给出了以下图。

Fig1

我有以下问题:

  1. 是否如我的代码所示使用 Scipy 正确完成了测试数据的标准化步骤?
  2. 如何在 SKlearn 中使用先前从训练数据计算的 lambda 来完成此操作?我问的原因是,Yeo Johnson 的 Sklearn PowerTransformerfit_transform 不允许传递预先计算的 lambda。

谢谢
塞迪

解决方法

我认为您误解了变形金刚的功能。 fit_transform() 在训练集上执行并计算 lambda 和缩放函数。计算完成后,您可以使用 transform() 函数在测试集上应用此转换。

关于您的第一个问题,明智的做法是使用 scikit-learn 转换器而不是 scipy 转换,因为它们是标准的并且可以添加到管道中。

对于第二个问题,您可以通过如下手动设置 lambdas 来使用 PowerTransformer 而无需拟合它:

from sklearn.preprocessing import PowerTransformer

pt = PowerTransformer(method='yeo-johnson',standardize=False)
pt.lambdas_=[1,2]
pt.transform([[10,20]])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。