LogTransformer#

对数变换用于转换偏斜数据,以便值在值范围内更均匀地分布。

一些回归模型,如线性回归、t检验和ANOVA,对数据有一些假设。当这些假设不满足时,我们不能信任结果。在回归分析过程中应用数据变换是一种常见做法,因为它可以帮助数据满足这些假设,从而获得更可靠的结果。

对数函数有助于处理具有右偏分布的正数据。也就是说,那些观测值向较低值累积的变量。一个常见的例子是收入变量,其值大量累积在较低的工资水平。

更一般地,当数据遵循对数正态分布时,其对数变换后的版本近似于正态分布。

其他有用的变换包括平方根变换、幂变换和Box-Cox变换。

在统计分析中,我们可以对因变量(即目标)和自变量(即预测变量)应用对数变换。这些变换可以帮助满足线性回归模型的假设,并揭示预测变量与响应变量之间的线性关系。

使用 Feature-engine,我们只能对输入特征进行对数变换。你可以通过应用 np.log(y) 轻松地对目标变量进行变换。

LogTransformer#

The LogTransformer() 对数值变量应用自然对数或以10为底的对数。请注意,对数只能应用于正值。因此,如果变量包含0或负值,此转换器将返回错误。

要转换非正变量,您可以添加一个常数以将数据点向正值方向移动。您可以通过使用 LogCpTransformer() 在转换器内部执行此操作。

Python 实现#

在本节中,我们将对Ames房价数据集中的某些自变量应用对数变换。

首先,我们导入数据分析所需库和转换器,然后加载数据集并将其分为训练集和测试集。

import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split

from feature_engine.transformation import LogTransformer

data = fetch_openml(name='house_prices', as_frame=True)
data = data.frame

X = data.drop(['SalePrice', 'Id'], axis=1)
y = data['SalePrice']

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)

print(X_train.head())

在以下输出中,我们看到了房价数据集的预测变量:

      MSSubClass MSZoning  LotFrontage  LotArea Street Alley LotShape  \
254           20       RL         70.0     8400   Pave   NaN      Reg
1066          60       RL         59.0     7837   Pave   NaN      IR1
638           30       RL         67.0     8777   Pave   NaN      Reg
799           50       RL         60.0     7200   Pave   NaN      Reg
380           50       RL         50.0     5000   Pave  Pave      Reg

     LandContour Utilities LotConfig  ... ScreenPorch PoolArea PoolQC  Fence  \
254          Lvl    AllPub    Inside  ...           0        0    NaN    NaN
1066         Lvl    AllPub    Inside  ...           0        0    NaN    NaN
638          Lvl    AllPub    Inside  ...           0        0    NaN  MnPrv
799          Lvl    AllPub    Corner  ...           0        0    NaN  MnPrv
380          Lvl    AllPub    Inside  ...           0        0    NaN    NaN

     MiscFeature MiscVal  MoSold  YrSold  SaleType  SaleCondition
254          NaN       0       6    2010        WD         Normal
1066         NaN       0       5    2009        WD         Normal
638          NaN       0       5    2008        WD         Normal
799          NaN       0       6    2007        WD         Normal
380          NaN       0       5    2010        WD         Normal

[5 rows x 79 columns]

让我们用直方图来检查原始数据中两个变量的分布。

X_train[['LotArea', 'GrLivArea']].hist(figsize=(10,5))
plt.show()

在以下图中,我们看到变量显示出右偏分布,因此它们是进行对数变换的良好候选者:

../../_images/nonnormalvars2.png

我们希望对数据集中的这两个变量应用自然对数,使用 LogTransformer()。我们如下设置转换器:

logt = LogTransformer(variables = ['LotArea', 'GrLivArea'])

logt.fit(X_train)

使用 fit() 方法时,此转换器不会学习任何参数,但它会检查您输入的变量是否为数值型,或者如果没有输入变量,它将自动查找所有数值型变量。

要在设置转换器时应用以10为底的对数,请将 '10' 传递给 base 参数。

现在,我们可以继续并转换数据:

train_t = logt.transform(X_train)
test_t = logt.transform(X_test)

现在让我们用直方图来检查对数变换数据中的变量分布:

train_t[['LotArea', 'GrLivArea']].hist(figsize=(10,5))
plt.show()

在以下直方图中,我们可以看到自然对数变换有助于使变量更好地近似于正态分布。

../../_images/nonnormalvars2logtransformed.png

注意,转换后的变量具有更接近高斯分布的分布。

如果我们想要恢复原始数据表示,使用 inverse_transform 方法,LogTransformer() 将应用指数函数以获得变量在其原始尺度上的值:

train_unt = logt.inverse_transform(train_t)
test_unt = logt.inverse_transform(test_t)

train_unt[['LotArea', 'GrLivArea']].hist(figsize=(10,5))
plt.show()

在以下图中,我们看到了显示原始尺度变量的直方图:

../../_images/nonnormalvars2.png

通过散点图和回归模型的残差分析来跟踪变换,有助于理解这些变换在我们的回归分析中是否有效。

教程、书籍和课程#

你可以在以下位置找到更多关于 LogTransformer() 的详细信息:

关于此方法及其他数据转换方法(如平方根转换、幂转换、Box-Cox 转换)的教程,请查看我们的在线课程:

../../_images/feml.png

机器学习的特征工程#











或者阅读我们的书:

../../_images/cookbook.png

Python 特征工程食谱#














我们的书籍和课程都适合初学者和更高级的数据科学家。通过购买它们,您正在支持 Feature-engine 的主要开发者 Sole。