转换具有正值、负值和零值的数据

机器算法验证 回归 数据转换
2022-04-17 01:01:35

我有一个多元线性回归模型,其中有几个因变量,这些因变量具有正值、负值和零值,并且不是正态分布的。由于 0 和负值,我无法进行自然对数转换,由于 0 值而无法对其进行平方或立方,并且 Box-Cox 转换仅适用于正值和 0 值。有没有我可以做的转变适用于所有这些?我已经看到 log(x+minimum value) 作为一个选项,但在这个论坛上没有那么多——这是一个有效的转换吗?

3个回答

是的,您可以添加一个常量,然后获取日志。

有很多方法可以转换数据。

这样做并没有本质上是无效的,但这种转换常常被误导。因变量不必服从正态分布。关于正态性的假设涉及残差,而不是响应变量本身。如果残差不是看似合理的正态分布,那么当然可能需要进行一些转换。

这种转换的一个主要缺点是它使合理的模型解释变得更加困难。

在负值的情况下,您可以使用 sklearn 中的 PowerTransformer(method='yeo-johnson') 方法。它能够处理正值和负值,也可以处理零值。数据的偏度(正态性度量)应大幅降低。与任何转换一样,您应该对训练数据使用 fit 和 transform,然后仅对测试和验证数据集使用 transform。

pt.fit(X_train)                    ## Fit the PT on training data
X_train = pt.transform(X_train)    ## Then apply on all data
X_test = pt.transform(X_test)
X_val = pt.transform(X_val)

显示使用 PowerTransformer 降低数据偏度的示例:

from sklearn.preprocessing import PowerTransformer

...

# find numeric features in your dataset to transform
numeric_feats = X.dtypes[X.dtypes != "object"].index

# calculate skew of all numeric features
skewed_feats = X[numeric_feats].apply(lambda x: skew(x.dropna())).sort_values(ascending=False)

# convert to dataframe for easier processing
skewness = pd.DataFrame({'Skew' :skewed_feats})

# print performance before transform
print("Pre: There are {} skewed numerical features to Box Cox transform".format(skewness.shape[0]))
print("Pre", abs(skewness.Skew).mean())

# transform data
pt = PowerTransformer(method='yeo-johnson').fit(X)
X = pd.DataFrame(pt.transform(X), index=X.index, columns=X.columns)

numeric_feats = X.dtypes[X.dtypes != "object"].index
skewed_feats = X[numeric_feats].apply(lambda x: skew(x.dropna())).sort_values(ascending=False)
skewness = pd.DataFrame({'Skew' :skewed_feats})

# print performance after transform
print("Post: There are {} skewed numerical features to Box Cox transform".format(skewness.shape[0]))
print("Post", abs(skewness.Skew).mean())

Example results:

Pre: There are 17 skewed numerical features to Box Cox transform
Pre 3.514581911418132
Post: There are 8 skewed numerical features to Box Cox transform
Post 1.977383868458546

此方法还旨在处理异方差数据,即在 x/y 值之间具有非均匀方差的数据。

例子: 在此处输入图像描述

参考:来自 sklearn 的 PowerTransformer

原则上,变量可能为负、零或正的转换包括

  • sign(x)log(1+|x|),它方便地保留了它的论点的符号(包括映射00) 同时表现得像日志X为了X0和喜欢-日志(-X)为了X0.

  • 反双曲正弦阿辛(X)或更一般地说阿辛(ķX)对于一些ķ>0,它也保留了它的论点的符号

  • 立方根X1/3或更一般的奇整数根,例如五度根、七度根等,它们也保留其参数的符号。在实践中,您可能需要从符号(X)及其绝对值的选择根|X|. 根据您的软件,如果在实践中一般根的例程取决于首先将参数推入对数的代码中,则负值甚至零值的根可能会返回为缺失、NA 或 NaN。

正如已经指出的那样,任何变量是否是正态分布的,它本身对于回归并不重要,甚至是理想条件(通常被描述为假设)。但是,提取异常值可能有助于分析高度偏斜或重尾分布,至少对于探索性数据分析是这样。实际示例可能包括许多公司的利润(负值意味着损失)或任何变化或差异的变量。

读者所了解的心理学和社会学在实践中选择这些转变中的一种可能很重要,假设这样的转变是一个好主意。因此,许多读者应该在中学时就已经了解了立方根,但反双曲正弦更有可能显得奇异或神秘。