美文网首页机器学习我爱编程
数据预处理中归一化(Normalization)与损失函数中正则

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

作者: 薛东弗斯 | 来源:发表于2018-04-09 14:59 被阅读101次

    数据预处理中归一化(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?utm_source=itdadao&utm_medium=referral

    期望风险或期望损失:是真实的,需要x,y的联合概率分布相乘 

    经验风险或经验损失:机器学习问题不可能已知x,y的联合概率分布,如果已知的话,那么x得出y就很容易了。那么根据大数定理可以使用1/n*损失函数来代替期望风险,得出经验风险。

    结构风险最小化:是带正则项的经验风险最小化。 

    经验风险最小化容易带来模型复杂度过高,过拟合问题

    正则化: 

    是结构风险最小化策略的实现。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大

    范数: 

    0范数表示的是向量中非0元素的个数 

    1范数表示的是向量中元素的绝对值的和 

    2范数表示的是向量中元素的模的和

    模型的稀疏化得优点:是可以实现自动特征选择和优秀的特征可解释性。

    想要模型稀疏,最好的方法是使用正则化0范数。但是0范数是不好求w的最优化解得。并且l1是l0的最优凸近似。如果w在0点处不可微(l1就不可微),且可以分解为一个求和的形式,那么这个规则化算子就可以实现稀疏. 

    l2范数会使模型的参数很小,但是不能为0。l2相比L1具有更平滑的特性。当遇到两个对预测有帮助的特征时,L1倾向于选择一个更大的特征。而L2更倾向把两者结合起来。

    交叉验证: 

    1、简单验证,70%训练集,30%测试集。使用此方法不断的选择模型和参数,比较测试集的准确率。 

    2、kfold,将数据集切分成k份,随机选择k-1做训练集,1做测试集。最后选出S次评测中平均测试误差最小的模型。

    阅读全文

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_27612639/article/details/51898685

    相关文章

      网友评论

        本文标题:数据预处理中归一化(Normalization)与损失函数中正则

        本文链接:https://www.haomeiwen.com/subject/vldihftx.html