数据预处理中归一化(Normalization)与损失函数中正则化(Regularization)解惑

背景:数据挖掘/机器学习中的术语较多,而且我的知识有限。之前一直疑惑正则这个概念。所以写了篇博文梳理下

摘要:

  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),相当于是要求拟合的误差足够小, 同时模型不要太复杂(正则化项的极小化),这样得到的模型具有较强的泛化能力。
  
  下面是来自 一篇博文的例子
  优化如下定义的加了正则项(也叫惩罚项)的损失函数:    
  

  后面的就是正则化项,其中λ越大表明惩罚粒度越大,等于0表示不做惩罚,N表示所有样本的数量,n表示参数的个数。

  如果绘图表示就是这样:
  
    上图的 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 的稳定性.

         深入:弹性网络( Elastic Net)

 总结:结构风险最小化是一种模型选择的策略,通过加入正则项以平衡模型复杂度和经验误差;更直观的解释——正则项就是模型参数向量(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中的归一化

  构造方法:
  http://spark.apache.org/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]

  或者直接使用Vertors的norm方法:val norms = data.map(Vectors.norm(_, 2.0))

  2.4 python中skelearn中的归一化

  from sklearn.preprocessing import Normalizer   
  #归一化,返回值为归一化后的数据  

  Normalizer().fit_transform(iris.data)

转载于:https://www.cnblogs.com/arachis/p/Regulazation.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据预处理归一化是指将数据缩放到一个预定的范围内,通常是[0, 1]或[-1, 1]之间,以消除数据间的量纲差异,提高模型的训练效率。归一化的原理主要包括以下几个步骤: 1. 最小-最大归一化(Min-Max Scaling):将数据映射到指定范围内。首先找到数据集的最小值(min)和最大值(max),然后使用以下公式将数据归一化到[0, 1]之间: X_normalized = (X - X_min) / (X_max - X_min) 其,X为原始数据,X_normalized为归一化后的数据。这种方法适用于数据分布没有明显边界的情况。 2. Z-Score归一化(Standardization):将数据转化为均值为0,标准差为1的正态分布。通过以下公式计算: X_standardized = (X - X_mean) / X_std 其,X_mean为数据的均值,X_std为数据的标准差。这种方法适用于数据分布有明显边界的情况。 3. 小数定标标准化(Decimal Scaling):将数据除以一个固定的基数,使得数据的绝对值都小于1或约等于1。例如,将数据除以10的幂次方,使得数据处于[-1, 1]之间。 归一化的目的是消除数据量纲和大小的差异,使得数据在同一个数量级下进行比较,加快模型的收敛速度。通过归一化,可以去除数据的夸大特征,使得所有特征的尺度同等重要,从而提高模型的性能。 参考资料: Python数据预处理之数据规范化.https://www.jianshu.com/p/406e81b2f978 数据预处理归一化、标准化和规范化.https://blog.csdn.net/you_are_my_dream/article/details/79978528 数据预处理归一化Normalization).https://www.cnblogs.com/chaosimple/p/4153167.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值