分享

基于pyspark理解数据标准化和正则化及其区别?

本帖最后由 regan 于 2018-4-17 13:13 编辑

Normalizer
Normalizer是一个Transformer,它使用p-norm范数对数据集进行正则化,默认p的取值为2,借助Normalizer可以标准化输入,往往标准化的输入数据能够提高学习算法的表现性能。接下来我们演示下在范数p=1和p->无穷的时候使用Normalizer对数据进行标准化处理。将每个样本缩放到单位范数(每个样本的范数为1),如果后面要使用如二次型(点积)或者其他核函数方法计算两个样本之间的相似性,这个方法会很有用。
Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是是的每个处理后样本的p-范数(L1-norm, L2-norm)等于1。
p-范数的计算公式:||x||p=(|x1|^p+|x2|^p+…+|xn|^p)^(1/p)
该方法主要应用在文本分类和聚类中。例如,对于两个TF-IDF向量的I2-norm进行点积,就可以得到这两个向量的余弦相似性。

from pyspark.ml.feature import Normalizerfrom pyspark.ml.linalg import Vectors
dataFrame = spark.createDataFrame([    (0, Vectors.dense([1.0, 0.5, -1.0]),),    (1, Vectors.dense([2.0, 1.0, 1.0]),),    (2, Vectors.dense([4.0, 10.0, 2.0]),)], ["id", "features"])dataFrame.show()
1.png
normalizer = Normalizer(inputCol="features", outputCol="normFeatures", p=1.0)
l1NormData = normalizer.transform(dataFrame)print("Normalized using L^1 norm")l1NormData.show()
2.png
normalizer = Normalizer(inputCol="features", outputCol="normFeatures")
l1NormData = normalizer.transform(dataFrame,{normalizer.p:float(2)})print("Normalized using L^2 norm")l1NormData.show(truncate=False)
3.png
怎么计算的呢?利用p-norm范数公式
4.png
lInfNormData = normalizer.transform(dataFrame, {normalizer.p: float("inf")})print("Normalized using L^inf norm")lInfNormData.show()
5.png
StandardScaler
标准化也叫归一化是对于每个特征进行的,经过归一化处理之后,每个特征服从均值为0,标准差为1的分布。下面来使用StandardScaler对数据特征进行归一化。StandardScaler也叫Z-Score标准化。
from pyspark.ml.feature import StandardScaler
dataFrame = spark.read.format("libsvm").load("/datas/lib_svm.txt")
dataFrame.show()
scaler = StandardScaler(inputCol="features", outputCol="scaledFeatures",    withStd=True, withMean=True)
scalerModel = scaler.fit(dataFrame)scaledData = scalerModel.transform(dataFrame)scaledData.show()
6.png
常见的标准化方法有Min-Max标准化,Z-Score标准化。
Min-Max:
7.png
Z-Score:
8.png
直接用每个元素除以总元素的和这种方式也可以用于归一化数据。
9.png

对于Min-Max标准化,pyspark提供了MinMaxScaler类用来做这类处理,下面以一个例子加以说明。
from pyspark.ml.feature import MinMaxScaler
from pyspark.ml.linalg import Vectors
dataFrame = spark.createDataFrame([    (0, Vectors.dense([1.0, 0.1, -1.0]),),    (1, Vectors.dense([2.0, 1.1, 1.0]),),    (2, Vectors.dense([3.0, 10.1, 3.0]),)], ["id", "features"])
scaler = MinMaxScaler(inputCol="features", outputCol="scaledFeatures")
scalerModel = scaler.fit(dataFrame)
scaledData = scalerModel.transform(dataFrame)
print("Features scaled to range: [%f, %f]" % (scaler.getMin(), scaler.getMax()))
scaledData.select("features", "scaledFeatures").show()
10.png
还用一种归一化方法叫MaxAbsScaler ,他会把数据归一化到【-1,1】之间,它除以的是数据集总绝对值最大的值。这种方法他不会移动或集中数据,因此不会破坏数据的稀疏性。
from pyspark.ml.feature import MaxAbsScaler
from pyspark.ml.linalg import Vectors
dataFrame = spark.createDataFrame([    (0, Vectors.dense([1.0, 0.1, -8.0]),),    (1, Vectors.dense([2.0, 1.0, -4.0]),),    (2, Vectors.dense([4.0, 10.0, 8.0]),)], ["id", "features"])
scaler = MaxAbsScaler(inputCol="features", outputCol="scaledFeatures")
scalerModel = scaler.fit(dataFrame)
scaledData = scalerModel.transform(dataFrame)
scaledData.select("features", "scaledFeatures").show()
11.png

总结:标准化是是使用例如min-max或z-score等方式在每一个特征【每一列】进行的数据规范化操作,而正则化是使用p-norm方法针对每一行数据。参考资源:http://edu.51cto.com/center/course/lesson/index?id=254886



没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条