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()
在以下图中,我们看到变量显示出右偏分布,因此它们是进行对数变换的良好候选者:
我们希望对数据集中的这两个变量应用自然对数,使用 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()
在以下直方图中,我们可以看到自然对数变换有助于使变量更好地近似于正态分布。
注意,转换后的变量具有更接近高斯分布的分布。
如果我们想要恢复原始数据表示,使用 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()
在以下图中,我们看到了显示原始尺度变量的直方图:
通过散点图和回归模型的残差分析来跟踪变换,有助于理解这些变换在我们的回归分析中是否有效。
教程、书籍和课程#
你可以在以下位置找到更多关于 LogTransformer()
的详细信息:
关于此方法及其他数据转换方法(如平方根转换、幂转换、Box-Cox 转换)的教程,请查看我们的在线课程:
或者阅读我们的书:
我们的书籍和课程都适合初学者和更高级的数据科学家。通过购买它们,您正在支持 Feature-engine 的主要开发者 Sole。