• 如何在【逻辑回归】中优化控制正则化程度的超参数C


    一.逻辑回归基本介绍

    逻辑回归也称作logistic回归,是一种广义的线性回归分析模型,主要是用来解决二分类问题(也可以解决多分类问题)。通过训练集来训练模型,并在训练结束后对测试集进行分类。
             通过激活函数,也就是sigmoid函数可以将线性回归模型的值缩放到(0,1)之间,公式和图像如下所示:

    通过这种方式我们就可以将结果靠近1的判定为一类,靠近0的判定为另外一类了。

    二.正则化基本介绍

    正则化的意义:避免过拟合。模型如果很复杂,变量稍微变动就会引起模型的剧烈变动,这会导致模型在训练集上表现非常好,但是在测试集上会出现过拟合,不具备泛化能力,这不是我们想要的。因此我们选用正则化来避免过拟合,这是因为正则项是非负的,要使得损失最小必须让正则项趋近于0,它降低了特征参数的权重,使得模型更简单。

    1、L1正则化
    公式如下:

    标题

    L1正则化可以让一部分权重变为零(降维),因此产生稀疏模型,能够去除某些特征(权重为0则等效于去除)

    2、L2正则化
    公式如下:

    L2正则化使各个维度权重普遍变小,减少了权重的固定比例,使权重平滑。

    三.超参数C的介绍

    C:浮点型(为正的浮点数),默认为1.0;表示正则化强度的倒数。数值越小表示正则化越强。

    接下来我们通过绘制图像来可视化超参数C的大小对模型准确率的影响,从而选出最优的C:

    四.python实战

    先导入必要的模块:

    1. from sklearn.linear_model import LogisticRegression as LR
    2. from sklearn.datasets import load_breast_cancer
    3. from sklearn.model_selection import train_test_split
    4. from sklearn.metrics import accuracy_score
    5. import matplotlib.pyplot as plt
    6. import numpy as np

    导入乳腺癌数据集,查看特征矩阵和标签值,并将其划分为训练集和测试集:

    1. data = load_breast_cancer()
    2. x = data.data
    3. y = data.target
    4. x.shape # (569, 30)
    5. y.shape # (569,)
    6. np.unique(y) # array([0, 1]) 二分类问题
    7. x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=420)

    为了同时对比L1正则化和L2正则化的效果,因此创建四个空列表:

    1. l1 = [] # 创建l1正则化的训练集准确率的空列表
    2. l2 = [] # 创建l2正则化的训练集准确率的空列表
    3. l1test = [] # 创建l1正则化的测试集准确率的空列表
    4. l2test = [] # 创建l2正则化的测试集准确率的空列表
    5. x_ = np.linspace(0.05, 1, 19) # 从0.05到1之间取19个数
    6. for i in x_:
    7. lrl1 = LR(penalty="l1", solver="liblinear", C=i, max_iter=1000).fit(x_train, y_train)
    8. lrl2 = LR(penalty="l2", solver="liblinear", C=i, max_iter=1000).fit(x_train, y_train)
    9. l1.append(accuracy_score(lrl1.predict(x_train), y_train)) # l1正则化的训练集准确率
    10. l1test.append(accuracy_score(lrl1.predict(x_test), y_test)) # l1正则化的测试集准确率
    11. l2.append(accuracy_score(lrl2.predict(x_train), y_train)) # l2正则化的训练集准确率
    12. l2test.append(accuracy_score(lrl2.predict(x_test), y_test)) # l2正则化的测试集准确率
    13. graph = [l1, l2, l1test, l2test]
    14. color = ["green", "black", "lightgreen", "gray"]
    15. label = ["L1", "L2", "L1test", "L2test"]
    16. plt.figure(figsize=(6, 6))
    17. for i in range(len(graph)):
    18. plt.plot(x_, graph[i], color[i], label=label[i])
    19. plt.legend(loc=4) # 图例位置.4表示右下角
    20. plt.show()

    结果如下所示:

    由图可知,用训练集的测试结果显著优于用测试集的测试结果,这说明模型在训练集上表现很好,在测试集上表现欠佳,这说明有轻微的过拟合。还可以发现,当C逐渐增大时,对模型的惩罚越来越小,训练集上的表现越来越高;但是测试集的表现,L1正则化在C在0.5左右时,就不再提升,但是L2正则化在0.5之后还有提升,且在0.62左右达到最高,在0.9左右开始下降。虽然训练集表现在一路走高,但是测试集上模型已经表现出了过拟合的倾向。因此我们会倾向选择0.62作为我们最优的C。

  • 相关阅读:
    基于显扬科技自主研发3D机器视觉HY-X5在RJ45接插件缺陷检测的应用
    【web前端】web前端设计入门到实战第一弹——html基础精华
    【注册Huggingface】获取token
    2009-2018年31省份旅游收入(入境、国内、总收入;第三产值;GDP)
    人工智能在网络流量分析中的研究与应用
    debian12安装fail2ban
    Mysql进阶优化篇06——分组查询优化、分页查询优化、覆盖索引
    携手亚信安慧AntDB,在数智化浪潮中乘风破浪
    大根堆的创建(视频讲解)
    扭蛋机小程序开发,互联网下的发展形式
  • 原文地址:https://blog.csdn.net/2301_78195908/article/details/134070078