算法一篇入门

【方法】一篇入门之-正则化与正则项

作者 : 老饼 发表日期 : 2022-06-26 03:54:24 更新日期 : 2024-10-06 05:37:32
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com



正则化是解决过拟合的一种常用方法,它通过在损失函数中加入正则项来预防模型过拟合

本文讲解正则化是什么,以及正则化常用的L1,L2正则项的公式,并展示正则化的使用例子

通过本文可以快速了解什么是正则化,以及如何使用正则项来进行正则化,使模型泛化能力更好




  01. 机器学习的正则化是什么  



本节介绍正则化的概念,并通过举例具体说明什么是正则化




      什么是正则化     


正则化是机器学习中一种常用于预防过拟合的手段,它可以提高模型的泛化能力
通俗的理解,正则化就是在模型训练过程使模型"更加正常"、"更加合理"的意思 
 什么是正则化
  正则化一般通过在模型的损失函数中加入正则项来实现
加入正则项的损失函数一般形式如下:

 
 E代表模型的误差,一般是模型原来的损失函数
而penalty则是惩罚项,用于惩罚不合理的解,
则是惩罚系数
 
通过在损失函数中加入正则项,惩罚不合理的解,使训练出来的模型更加合理




      L1、L2正则项与p范     


在客观关系中,变量的系数一般不会过大,而且过大的系数易使模型不稳定
所以系数过大时,模型往往是偏离真实关系的,即模型更多时候是过拟合的

正则化最常用的手段是利用为L1、L2正则项来惩罚过大的系数,预防模型过拟合
 
  
L1正则项
L1正则项全称为一范正则项,它是所有系数绝对值之和
 L1正则项公式如下:
  
 L2正则项
L2正则项全称为二范正则项,它是所有系数的平方和    
 L2正则项公式如下:
  
p范正则项
p范正则项以p范数作为正则项,其中p可取为0,1,2,3.... 
p范正则项公式如下:


L1、L2正则项事实上都是p范正则项取p=1,2时的特殊情况
p范正则项中的p可以取为0或更大的数,但几乎很少用,基本用都只用L1,L2正则项
而最常用的是L2正则项,它可导且导数简单,因此惩罚系数过大时一般都用L2正则项







     02. 正则项的使用与注意事项      




本节讲解正则项的使用例子,以及使用正则项时的注意事项





      正则化例子解说       


岭回归与Lasso回归就是线性回归正则化的经典例子,如下:
 线性函数最原始的损失函数为:                           
                                         

  Lasso回归就是在线性回归的损失函数中加入L1正则项,如下:
        

  岭回归模型则是在线性回归的损失函数中加入L2正则项,如下:
    
过大的会让损失函数变得非常大,在最小化损失函数时,自然就不会取到得大




    正则项的使用注意事项    


使用L1、L2正则项进行系数惩罚时,需要注意以下两点:
  
使用正则项进行正则化的注意事项
1. 不要惩罚不该惩罚的系数                                                          
           使用正则项时要考虑参数实际意义,不要惩罚不该惩罚的参数      
            有些模型参数是可以比较大的,例如阈值很大也不会影响模型的合理性    

2. 需要将数据进行归一化                                                             
 在使用L1、L2惩罚变量的系数时,需要将数据进行归一化    
(1)数据归一化后,才更好判断系数的"大与小"             
(2)每个变量在统一量纲下,才能公平地惩罚它们的系数     







      03. 正则化-例子解说      




本节通过例子来展示如何在模型中使用正则项进行正则化




    正则化使用例子    


软件中每个模型往往都有正则项选择,需要正则化时只要设置相关的正则项参数即可
 由于每个模型损失函数不同,所以正则化后对模型的具体训练带来的改变也不一样
因此,如果自写代码训练模型,正则化是没有通用方法的,需要具体模型具体讨论

下面以sklearn中的逻辑回归为例,展示如何使用正则化,具体代码如下:
'''
本代码展示在python中逻辑回归模型模型的正则化
本代码来自《老饼讲解-机器学习》www.bbbdata.com
'''
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression

#----数据加载----------------------------------
data = load_breast_cancer()
X    = data.data[:,0:4]                                               # 用于建模的X,这里只选择前4列进行建模
y    = data.target                                                    # 用于建模的y

#----输入数据归一化---------------------------                                                 
xmin = X.min(axis=0)                                                  # 输入变量的最小值
xmax = X.max(axis=0)                                                  # 输入变量的最大值 
X_norm=(X-xmin)/(xmax-xmin)                                           # 对输入变量进行归一化
                                                   
#-----不使用正则项训练逻辑回归----------------
clf = LogisticRegression(penalty='none',random_state=0,max_iter=1000) # 初始化逻辑回归模型,不进行正则化
clf.fit(X_norm,y)                                                     # 用数据训练逻辑回归模型
print('\n-----不使用正则化的逻辑回归模型系数:-----')                 # 打印结果       
print( "模型系数:",clf.coef_[0])                                      # 打印逻辑回归模型系数
print( "模型阈值:",clf.intercept_)                                    # 打印逻辑回归模型阈值

#-----使用L2正则项训练逻辑回归-----------------  
clf = LogisticRegression(penalty='l2',C=0.5,random_state=0)           # 初始化逻辑回归模型,使用L2正则化
clf.fit(X_norm,y)                                                     # 用数据训练逻辑回归模型
print('\n-----使用L2正则项的逻辑回归模型系数:-----')                 # 打印结果  
print( "模型系数:",clf.coef_[0])                                      # 打印逻辑回归模型系数
print( "模型阈值:",clf.intercept_)                                    # 打印逻辑回归模型阈值
运行结果如下:
 正则化代码运行结果
可以看到,在不使用正则化时,得到的模型系数绝对值非常大,意味着模型非常不稳定
而在使用了L2正则项后,得到的逻辑回归模型系数绝对值普遍都比较小,模型更加正常
 在本例中惩罚系数C设为0.5,如果觉得模型系数不够小,可以增大C来加大对系数的惩罚




总的来说,正则化的目的就是避免模型过拟合,增强模型的泛化能力~








  End  





   

联系老饼