scipy 如何对测试数据进行YeoJson特征归一化?

gz5pxeao  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(129)

作为交叉验证的一部分,我有一个训练和测试数据。当我使用YeoJson变换对训练数据进行规范化时,为了防止数据泄漏,我计划保存训练数据规范化中的lambada,并将其用于测试数据规范化。我编写了一小段代码来测试它,如下所示:

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, dist=stats.norm, 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, dist=stats.norm, 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, dist=stats.norm, 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()


我有以下问题:
1.测试数据的规范化步骤是否使用Scipy正确完成,如我的代码所示?
1.如何在SKlearn中使用之前从训练数据中计算的lambda来实现这一点呢?我提出这个问题的原因是,Sklearn PowerTransformer 和YeoJson的 fit_transform 不允许传递预先计算的lambda。
谢谢您
塞迪

roqulrg3

roqulrg31#

我认为您误解了Transformers函数。fit_transform()是在训练集上执行的,并计算lambda和缩放函数。一旦计算出它们,您就可以使用transform()函数在测试集上应用此转换。
关于你的第一个问题,使用scikit-learn transformer而不是scipy transformer是明智的,因为它们是标准的,可以添加到管道中。
对于第二个问题,您可以使用PowerTransformer,而不需要手动设置lambda,如下所示:

from sklearn.preprocessing import PowerTransformer

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

相关问题