如何规范化非正态分布?
How to normalize a non-normal distribution?
我有上面的分布,均值为 -0.02
,标准差为 0.09
,样本大小为 13905
。
我只是不确定为什么在大样本量的情况下分布是左偏的。从 bin [-2.0 到 -0.5],该 bin 中只有 10 个样本 count/outliers,这解释了形状。
我只是想知道是否可以规范化以使其更平滑 'normal' 分布。目的是将其输入模型,同时减少预测变量的标准误差。
这里有两种选择。您可以进行 Box-Cox 变换或 Yeo-Johnson 变换。 Box-Cox 变换的问题在于它仅适用于正数。要使用 Box-Cox 变换,您必须采用指数,执行 Box-Cox 变换,然后采用对数以获取原始比例的数据。 Box-Cox 变换在 scipy.stats
中可用
您可以避免这些步骤,只需使用 Yeo-Johnson 变换即可。 sklearn
为
提供 API
from matplotlib import pyplot as plt
from scipy.stats import normaltest
import numpy as np
from sklearn.preprocessing import PowerTransformer
data=np.array([-0.35714286,-0.28571429,-0.00257143,-0.00271429,-0.00142857,0.,0.,0.,0.00142857,0.00285714,0.00714286,0.00714286,0.01,0.01428571,0.01428571,0.01428571,0.01428571,0.01428571,0.01428571,0.02142857,0.07142857])
pt = PowerTransformer(method='yeo-johnson')
data = data.reshape(-1, 1)
pt.fit(data)
transformed_data = pt.transform(data)
我们已经转换了数据,但我们需要一种方法来衡量并查看我们是否朝着正确的方向前进。由于我们的目标是成为正态分布,因此我们将使用正态性检验。
k2, p = normaltest(data)
transformed_k2, transformed_p = normaltest(transformed_data)
测试returns两个值k2
和p
。 p
的值在这里是我们感兴趣的。
如果 p
大于某个阈值(例如 0.001
左右),我们可以说拒绝 data
来自正态分布的假设。
在上面的示例中,您会看到 p
大于 0.001
而 transformed_p
小于此阈值,表明我们正朝着正确的方向前进。
我有上面的分布,均值为 -0.02
,标准差为 0.09
,样本大小为 13905
。
我只是不确定为什么在大样本量的情况下分布是左偏的。从 bin [-2.0 到 -0.5],该 bin 中只有 10 个样本 count/outliers,这解释了形状。
我只是想知道是否可以规范化以使其更平滑 'normal' 分布。目的是将其输入模型,同时减少预测变量的标准误差。
这里有两种选择。您可以进行 Box-Cox 变换或 Yeo-Johnson 变换。 Box-Cox 变换的问题在于它仅适用于正数。要使用 Box-Cox 变换,您必须采用指数,执行 Box-Cox 变换,然后采用对数以获取原始比例的数据。 Box-Cox 变换在 scipy.stats
您可以避免这些步骤,只需使用 Yeo-Johnson 变换即可。 sklearn
为
from matplotlib import pyplot as plt
from scipy.stats import normaltest
import numpy as np
from sklearn.preprocessing import PowerTransformer
data=np.array([-0.35714286,-0.28571429,-0.00257143,-0.00271429,-0.00142857,0.,0.,0.,0.00142857,0.00285714,0.00714286,0.00714286,0.01,0.01428571,0.01428571,0.01428571,0.01428571,0.01428571,0.01428571,0.02142857,0.07142857])
pt = PowerTransformer(method='yeo-johnson')
data = data.reshape(-1, 1)
pt.fit(data)
transformed_data = pt.transform(data)
我们已经转换了数据,但我们需要一种方法来衡量并查看我们是否朝着正确的方向前进。由于我们的目标是成为正态分布,因此我们将使用正态性检验。
k2, p = normaltest(data)
transformed_k2, transformed_p = normaltest(transformed_data)
测试returns两个值k2
和p
。 p
的值在这里是我们感兴趣的。
如果 p
大于某个阈值(例如 0.001
左右),我们可以说拒绝 data
来自正态分布的假设。
在上面的示例中,您会看到 p
大于 0.001
而 transformed_p
小于此阈值,表明我们正朝着正确的方向前进。