居中和缩放 Pyspark 数据框

Centering and Scaling Pyspark Dataframe

我正在尝试对 spark 数据帧中的 5 个特征进行标准化。 所有特征都有不同的尺度。

理论上,在我的数据帧的矢量化形式上使用 Normalizer() 是否正确? 其他选项是 MinMaxScaler() 和 StandardScaler()。但是,在经历了各种实施之后,我不确定是否应该在每一列或矢量化数据帧上使用它。

欢迎指教。

如果您使用了 VectorAssembler(),您的数据的格式是 normalized/rescaled。

您可以进行不同类型的转换。他们将在您的向量中创建不同的值分布。我从这个 post.

中获取示例

现在的问题是:之后哪种分布对您有意义?你想要 N(0,1) 分布吗?在这种情况下,使用 StandardScaler

StandardScaler

向量的每个 i 元素都通过删除均值并除以所有 i 行的标准差来转换。

+---+--------------+------------------------------------------------
|id |features      |Scaled_features|
+---+--------------+------------------------------------------------
|0  |[1.0,0.1,-1.0]|[1.195228,0.02337,-0.597614]|
|1  |[2.0,1.1,1.0] |[2.390457,0.25713,0.597614]   |
|0  |[1.0,0.1,-1.0]|[1.19522,0.023376,-0.5976143046671968]|
|1  |[2.0,1.1,1.0] |[2.390457,0.257138,0.597614]   |
|1  |[3.0,10.1,3.0]|[3.585682.3609991,1.792842]  |
+---+--------------+------------------------------------------------

根据你的问题标题,我认为这就是你要执行的操作。

Normalizer

您通过从所有维度计算的范数对第 i 个值进行归一化。最常见的是曼哈顿范数(范数 L1,您使用的范数)和欧几里德范数(范数 L2)。

因此,您将每个值除以计算得出的范数

+---+--------------+-----------------------------------------------+
|id |features      |l1_norm                    |
+---+--------------+-----------------------------------------------+
|0  |[1.0,0.1,-1.0]|[0.47619,0.047619,-0.47619]|
|1  |[2.0,1.1,1.0] |[0.48780,0.26829,0.24390]  |
|0  |[1.0,0.1,-1.0]|[0.47619,0.047619,-0.47619]|
|1  |[2.0,1.1,1.0] |[0.48780,0.26829,0.24390]  |
|1  |[3.0,10.1,3.0]|[0.18633,0.62732,0.18633]  |
+---+--------------+-----------------------------------------------+

这里,[1,.1,-1]/sum(abs([1,.1,-1])) -> [0.47619,0.047619,-0.47619]

最小最大缩放器

您更改值的区间以适应 [a,b] 区间

一个例子

假设您有 [10 000, 1, 1, 1]:

  • Normalizer:用L1范数,[0.9997, 9.997001e-05 9.997001e-05 9.997001e-05]
  • StandardScaler:假设你减去均值并除以 sd,你最终得到 [1.5, -0.5, -0.5, -0.5]

你最终得到非常不同的分布,因为你没有以相同的方式对极值进行加权