• 如何绘制【逻辑回归】中threshold参数的学习曲线


    threshold参数的意义是通过筛选掉低于threshold的参数,来对逻辑回归的特征进行降维。

    首先导入相应的模块:

    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
    7. from sklearn.feature_selection import SelectFromModel # 从模型中选择特征
    8. from sklearn.model_selection import cross_val_score # 交叉验证

    导入乳腺癌数据集

    1. data = load_breast_cancer()
    2. x = data.data
    3. y = data.target

    查看数据集特征矩阵的情况:

    data.data.shape # (569, 30)

    这个时候有30个特征。实例化一个逻辑回归模型,并使用交叉验证评估模型性能:

    1. LR_ = LR(solver="liblinear", C=0.8, random_state=420)
    2. cross_val_score(LR_, x, y, cv=10).mean() # 0.9508145363408522

    使用select_from_model函数根据模型的权重系数或特征重要性等信息,选择重要的特征,并将选择后的特征矩阵返回给x_embedded:

    1. X_embedded = SelectFromModel(LR_, threshold = 0.8, norm_order=1).fit_transform(x, y) # norm_order=1表示L1正则,模型会删除L1正则化后系数为0的特征,threshold表示阈值,当特征的系数小于阈值时,删除该特征
    2. X_embedded.shape # (569, 9)

    可以发现现在特征只剩下9个了。在这里我们设置了threshold = 0.8,也就是说小于0.8的权重系数被删除掉了。但是我们怎么知道设置哪个threshold值后得到的特征矩阵去训练模型,会得到最优的模型效果呢?

    接下来我们开始绘制threshold的学习曲线,也就是不同的threshold值对模型效果的影响。在绘制之前,我们先训练模型,看一下权重系数的最大值,找到threshold的取值范围:

    1. # 画threshod的学习曲线
    2. LR_.fit(x, y) # 训练模型
    3. LR_.coef_ # 查看训练后各变量的系数
    4. LR_.coef_.shape # (1, 30)
    5. LR_.coef_.max() # 1.9376881066687164

    为了对比特征选择前和选择后模型的效果,我们设置了一组对照,同时确定了threshold的取值范围:

    1. fullx = [] # 创建特征选择前的交叉验证的空列表
    2. fsx = [] # 创建特征选择后的交叉验证的空列表
    3. threshold = np.linspace(0, abs(LR_.fit(x, y).coef_).max(), 20) # 从0到最大系数之间取20个数

    接下来绘制函数图像:

    1. k = 0
    2. for i in threshold:
    3. x_embedded = SelectFromModel(LR_, threshold=i).fit_transform(x, y) # threshold表示阈值,当特征的系数小于阈值时,删除该特征。此行代码是形成新的特征矩阵
    4. fullx.append(cross_val_score(LR_, x, y, cv=5).mean()) # 特征选择前进行交叉验证
    5. fsx.append(cross_val_score(LR_, x_embedded, y, cv=5).mean()) # 特征选择后进行交叉验证
    6. print((threshold[k], x_embedded.shape[1])) # 打印每次循环取到的阈值和降维后的特征数
    7. k += 1
    8. plt.figure(figsize=(20, 5))
    9. plt.plot(threshold, fullx, label="full")
    10. plt.plot(threshold, fsx, label="feature selection")
    11. plt.xticks(threshold)
    12. plt.legend()
    13. plt.show()

    结果如下:

    由图可知,随着threshold的值逐渐变大,被删除的特征越多,模型效果越差。这不是我们想要的结果,因此我们将范围缩小,将threshold的取值范围缩小(0,0.1),再来跑一下模型:

    1. fullx = [] # 创建特征选择前的交叉验证的空列表
    2. fsx = [] # 创建特征选择后的交叉验证的空列表
    3. threshold = np.linspace(0, 0.1, 20) # 从0到最大系数之间取20个数
    4. k = 0
    5. for i in threshold:
    6. x_embedded = SelectFromModel(LR_, threshold=i).fit_transform(x, y) # threshold表示阈值,当特征的系数小于阈值时,删除该特征。此行代码是形成新的特征矩阵
    7. fullx.append(cross_val_score(LR_, x, y, cv=5).mean()) # 特征选择前进行交叉验证
    8. fsx.append(cross_val_score(LR_, x_embedded, y, cv=5).mean()) # 特征选择后进行交叉验证
    9. print((threshold[k], x_embedded.shape[1])) # 打印每次循环取到的阈值和降维后的特征数
    10. k += 1
    11. plt.figure(figsize=(20, 5))
    12. plt.plot(threshold, fullx, label="full")
    13. plt.plot(threshold, fsx, label="feature selection")
    14. plt.xticks(threshold)
    15. plt.legend()
    16. plt.show()

    结果如下:

    可以发现,当threshold取0.0053时,模型可以获得最好的效果。

  • 相关阅读:
    第4章 请求与响应
    来看看这几个拍视频可以变漫画的软件
    使用Caffeine实现帖子的缓存来优化网站的运行速度
    Graph WaveNet:用于时空图建模的图神经网络结构
    STM32F103C8T6 + 0.96“ I2C OLED显示3D_Cube
    一个方法用js生成随机双色球、大乐透
    【后端】韩顺平Java学习笔记(基础篇01)
    基于单片机的步进电机驱动控制系统的设计与实现
    【Spring】初阶二
    130 行代码搞定核酸统计,程序员在抗疫期间的大能量
  • 原文地址:https://blog.csdn.net/2301_78195908/article/details/134083828