居中和缩放 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]
。
你最终得到非常不同的分布,因为你没有以相同的方式对极值进行加权
我正在尝试对 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]
。
你最终得到非常不同的分布,因为你没有以相同的方式对极值进行加权