背景:数据挖掘/机器学习中的术语较多,而且我的知识有限。之前一直疑惑正则这个概念。所以写了篇博文梳理下
摘要:
1.正则化(Regularization)
1.1 正则化的目的
1.2 正则化的L1范数(lasso),L2范数(ridge)
2.归一化 (Normalization)
2.1归一化的目的
2.1归一化计算方法
2.2.spark ml中的归一化
2.3 python中skelearn中的归一化
知识总结:
1.正则化(Regularization)
1.1 正则化的目的:我的理解就是平衡训练误差与模型复杂度的一种方式,通过加入正则项来避免过拟合(over-fitting)。
后面的就是正则化项,其中λ越大表明惩罚粒度越大,等于0表示不做惩罚,N表示所有样本的数量,n表示参数的个数。
上图的 lambda = 0表示未做正则化,模型过于复杂(存在过拟合)
L2正则化:
,其中是L2正则项,lambda是正则化参数
L1与L2正则化的比较:
1.L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。
2.Lasso在特征选择时候非常有用,而Ridge就只是一种规则化而已。
2.归一化 (Normalization)
2.1归一化的目的:
1)归一化后加快了梯度下降求最优解的速度;
2)归一化有可能提高精度。详解可查看
2.2归一化计算方法
2.3.spark ml中的归一化
newNormalizer(p: Double) ,其中p就是计算公式中的向量绝对值的幂指数
可以使用transform方法对Vector类型或者RDD[Vector]类型的数据进行正则化
下面举一个简单的例子:
scala> val dv: Vector = Vectors.dense(3.0,4.0)
dv: org.apache.spark.mllib.linalg.Vector = [3.0,4.0]
scala> val l2 = new Normalizer(2)
scala> l2.transform(dv)
res8: org.apache.spark.mllib.linalg.Vector = [0.6,0.8]
或者直接使用Vertors的norm方法:val norms = data.map(Vectors.norm(_, 2.0))
2.4 python中skelearn中的归一化
from sklearn.preprocessing import Normalizer
#归一化,返回值为归一化后的数据
Normalizer().fit_transform(iris.data)