数据预处理中归⼀化(Normalization)与损失函数中正则化
(Regularizat。。。
背景:数据挖掘/机器学习中的术语较多,⽽且我的知识有限。之前⼀直疑惑正则这个概念。所以写了篇博⽂梳理下
摘要:
  1.正则化(Regularization)
    1.1 正则化的⽬的 
    1.2 结构风险最⼩化(SRM)理论
    1.3 L1范数(lasso),L2范数(ridge),ElasticNet
    1.4为什么说L1是稀疏的,L2是平滑的?
  2.归⼀化(Normalization)
      2.1归⼀化的⽬的
    2.1归⼀化计算⽅法 
    2.2.spark ml中的归⼀化
    2.3 python中skelearn中的归⼀化
知识总结:
1.正则化(Regularization)
1.1 正则化的⽬的:我的理解就是平衡训练误差与模型复杂度的⼀种⽅式,通过加⼊正则项来避免过拟合(over-fitting)。(可以引⼊拟合时候的龙格现象,然后引⼊正则化及正则化的选取,待添加)
1.2 结构风险最⼩化(SRM)理论: 
  经验风险最⼩化 + 正则化项 = 结构风险最⼩化
  经验风险最⼩化(ERM),是为了让拟合的误差⾜够⼩,即:对训练数据的预测误差很⼩。但是,我们学习得到的模型,当然是希望对未知数据有很好的预测能⼒(泛化能⼒),这样才更有意义。当拟合的误差⾜够⼩的时候,可能是模型参数较多,模型⽐较复杂,此时模型的泛化能⼒⼀般。于是,我们增
加⼀个正则化项,它是⼀个正的常数乘以模型复杂度的函数,aJ(f),a>=0 ⽤于调整ERM与模型复杂度的关系。结构风险最⼩化(SRM),相当于是要求拟合的误差⾜够⼩,同时模型不要太复杂(正则化项的极⼩化),这样得到的模型具有较强的泛化能⼒。
  下⾯是来⾃的例⼦
  优化如下定义的加了正则项(也叫惩罚项)的损失函数:   
  后⾯的
  如果绘图表⽰就是这样:
  上图的 lambda = 0表⽰未做正则化,模型过于复杂(存在过拟合)
  上图的 lambda = 1 添加了正则项,模型复杂度降低
1.3 正则化的L1,L2范数
  L1正则化(lasso):
 ,其中C0是代价函数,是L1正则项,lambda是正则化参数
  L2正则化(ridge):(待添加:权值衰减引⼊)
 ,其中是L2正则项,lambda是正则化参数
  ElasticNet 正则化:
 L1与L2以及ElasticNet 正则化的⽐较:
   1.L1会趋向于产⽣少量的特征,⽽其他的特征都是0,⽽L2会选择更多的特征,这些特征都会接近于0。
   2.Lasso在特征选择时候⾮常有⽤,⽽Ridge就只是⼀种规则化⽽已。
    3.ElasticNet 吸收了两者的优点,当有多个相关的特征时,Lasso 会随机挑选他们其中的⼀个,⽽ElasticNet则会选择两个;并且ElasticNet 继承 Ridge 的稳定性.
  深⼊:
 总结:结构风险最⼩化是⼀种模型选择的策略,通过加⼊正则项以平衡模型复杂度和经验误差;更直观的解释——正则项就是模型参数向量(w)的范数,⼀般有L1,L2两种常⽤的范数。
1.4为什么说L1是稀疏的,L2是平滑的?
L1 Regularizer
L1 Regularizer是⽤w的⼀范数来算,该形式是凸函数,但不是处处可微分的,所以它的最佳化问题会相对难解⼀些。
L1 Regularizer的最佳解常常出现在顶点上(顶点上的w只有很少的元素是⾮零的,所以也被称为稀疏解sparse solution),这样在计算过程中会⽐较快。
L2 Regularizer
L2 Regularizer是凸函数,平滑可微分,所以其最佳化问题是好求解的。
参考链接:中的Lp球
2.归⼀化(Normalization)
  2.1归⼀化的⽬的:
    1)归⼀化后加快了梯度下降求最优解的速度;
    2)归⼀化有可能提⾼精度。
  2.2归⼀化计算⽅法     
  公式:
    对于⼤于1的整数p, Lp norm = sum(|vector|^p)(1/p)
  2.3.spark ml中的归⼀化
  构造⽅法:
  /docs/2.0.0/api/scala/index.html#org.apache.spark.mllib.feature.Normalizer
  newNormalizer(p: Double) ,其中p就是计算公式中的向量绝对值的幂指数
  可以使⽤transform⽅法对Vector类型或者RDD[Vector]类型的数据进⾏正则化
  下⾯举⼀个简单的例⼦:
  scala> import org.apache.spark.mllib.linalg.{Vector, Vectors} 
  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]
truncated normal distribution
  或者直接使⽤Vertors的norm⽅法:val norms = data.(_, 2.0))
  2.4 python中skelearn中的归⼀化
  from sklearn.preprocessing import Normalizer   
  #归⼀化,返回值为归⼀化后的数据 
  Normalizer().fit_transform(iris.data)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。