逻辑回归-L1,L2正则比较

为了增加模型的泛化能力,可以通过加入正则项的方式来避免过拟合
如下代码:

import numpy as np
np.random.seed(12)
# 生成正负样本各100个
num_sample = 100
# 20乘20的矩阵
rand_m = np.random.rand(20, 20)
cov = np.matmul(rand_m.T, rand_m)
# 通过高斯分布生成样本
x1 = np.random.multivariate_normal(np.random.rand(20), cov, num_sample)
x2 = np.random.multivariate_normal(np.random.rand(20) + 5, cov, num_sample)
X = np.vstack((x1, x2)).astype(np.float32)
y = np.hstack((np.zeros(num_sample), np.ones(num_sample)))
from sklearn.linear_model import LogisticRegression
# 使用L1的正则,C为控制正则的参数,C值越大,正则项的强度会越弱
clf = LogisticRegression(fit_intercept=True, C=0.1, penalty='l1', solver='liblinear')
clf.fit(X, y)
print("(L1)逻辑回归的参数w为", clf.coef_)
# 使用L2的正则,C为控制正则的参数,C值越大,正则项的强度就会越弱
clf = LogisticRegression(fit_intercept=True, C=0.1, penalty='l2', solver='liblinear')
clf.fit(X, y)
print("(L2)逻辑回归的参数w为", clf.coef_)

运行后,会发现L1正则项相比较于L2正则项具有稀疏性

如下图,
逻辑回归-L1,L2正则比较_第1张图片
L1正则的时候,
①、在顶点是没有梯度的,因为没法求导,所以为解容易出现0的情况。所以,就能够让某些参数变为0,即L1的稀疏性,
L1正则的缺点:
①、例:f1,f2,f3,f4,f5,f6,f7,f8,f9,10
有可能(f1,f3,f4),(f2,f7,f8),(f,5,f6,f9,f10)他们这几个的关联度很高。但L1正则,他会随机从这三个集合里面抽取出一个特征作为该集团的特征,其他的特征都会被废弃掉,而不会选出最好的特征。

使用L2正则的时候,
①、相交不会出现上述情况,因为L2正则圆上任何一个点都是可导的。

总结起来,面对模型训练中的过拟合问题,L2是最为常用的正则。至于L1正则,它的首要应用场景在我们希望参数变稀疏的时候。

你可能感兴趣的:(机器学习,机器学习,逻辑回归,过拟合)