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

Posted

技术标签:

【中文标题】如何对测试数据进行 Yeo Johnson 特征标准化?【英文标题】:How to do Yeo Johnson feature normalization on test data? 【发布时间】:2021-09-21 07:48:56 【问题描述】:

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

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()

这给出了以下图。 我有以下问题:

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

谢谢 赛迪

【问题讨论】:

【参考方案1】:

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

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

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

from sklearn.preprocessing import PowerTransformer

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

【讨论】:

以上是关于如何对测试数据进行 Yeo Johnson 特征标准化?的主要内容,如果未能解决你的问题,请参考以下文章

行标征求:车辆图像识别 车辆特征数据

当我使用管道对线性 svc 进行预处理、训练和测试时,如何获得最重要的特征系数?

如何对 PHP 特征进行单元测试

Quanteda 包,朴素贝叶斯:如何预测不同特征的测试数据?

如何标准化数据集中的数值变量?

性能测试基础