如何处理范围很广的特征

数据挖掘 特征选择 机器学习模型 特征缩放
2022-03-01 12:35:00

我有一长串连续值,如下图所示: 在此处输入图像描述

情节如下所示: 在此处输入图像描述

如何处理这些功能?如果我用这个来训练模型,模型不会有最好的精度,因为有很多轮廓。

3个回答

我建议尝试对数转换。这有两个潜在的好处:

  1. x 值的范围变小
  2. 您转换后的数据可能更接近于正态分布(仅与某些模型相关,例如与树无关)

这里有两个玩具例子来说明:

玩具示例 1

s = np.random.lognormal(3, 1, 1000)
plt.hist(s, 100)
plt.show()

在此处输入图像描述

plt.hist(np.log(s), 100)
plt.show()

在此处输入图像描述

从第二张图中可以看出,x 值的范围变小了,转换后的分布类似于正态分布。当然,这是一个高度人为的例子,因为未转换的分布是log_normal.

玩具示例 2

s = np.random.geometric(0.2,100000)
plt.hist(s, 100)
plt.show()

在此处输入图像描述

plt.hist(np.log(s), 100)
plt.show()

在此处输入图像描述

这个看起来不像示例 1 那样好(即正态分布),但您的 x 值范围仍然变得更加紧凑。

如果您的数据包含 x 值0你可以使用np.log(x+1). 如果您的数据包含负值,它将变得更加棘手(这种情况下的方法包括此处描述的签名日志,或者只是向您的数据添加一个常数值,例如最小值)。

由于您有很多接近 0 的值,因此我建议您进行与对数转换非常相似的转换,但不要进行对数转换。它被称为双对称对数变换。我建议您阅读内容。

据我所知,你的价值观是积极的,所以你可以简单地记录日志。您还可以将变量除以某个值,例如 10。您可以进行任何类型的线性变换。

您还可以查看缩放(例如最小/最大缩放)是否适合您。预处理数据 | scikit-学习