• 机器学习——线性回归/岭回归/Lasso回归


    0、前言:

    • 线性回归会用到python第三方库:sklearn.linear_model中的LinearRegression
    • 导入第三方库的方法:from sklearn.linear_model import LinearRegression
    • 使用LinearRegression(二维数据,一维数据)进行预测,其中数据类型可以是pandas中的DataFrame或者series,也可以是numpy中的array数据,但维度一定要正确输入。
    • 在线性回归模型中可以查看训练好的模型当中的特征系数(y=kx+b当中的k)和训练好的模型当中的截距(y=kx+b当中的b),方法是调用训练好的模型的属性coef_查看系数,调用训练好的模型的属性intercept_查看截距。
    • ★注意:线性回归的原理如下图,所以在计算过程中会用到求逆矩阵的方法,如果一个数据特征数量比数据本身要多(也就是说数据中的列数大于行数),则不构成满秩矩阵,无法求出对应的逆矩阵,因此无法使用线性回归,理解起来比较困难,因此就做简单理解即可。
      在这里插入图片描述

    1、应用:

    • 通过线性回归预测糖尿病
    • 数据来源:sklearn中自带
    • 代码
    # 导入三件套
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    # 导入糖尿病数据集
    from sklearn.datasets import load_diabetes
    # 导入线性回归模型
    from sklearn.linear_model import LinearRegression
    # 查看数据集
    data_set = load_diabetes()
    display(data_set)
    feature_name = data_set['feature_names']
    data = data_set['data']
    target = data_set['target']
    print('=====')
    display(data.shape,target.shape)
    # 查看dataframe模式下的输入数据
    data = pd.DataFrame(data, columns=feature_name)
    data.head(5)
    # 切分数据
    from sklearn.model_selection import train_test_split
    
    x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.2)
    # 引入线性回归模型
    line = LinearRegression()
    # 训练模型
    line.fit(x_train,y_train)
    # 预测
    pred = line.predict(x_test)
    display(pred)
    
    # 查看系数和截距
    display(line.coef_) # 通过系数查看哪些特征对结果影响较大,一般正数影响大于负数影响
    display(line.intercept_)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    2、应用分析:

    • 讲糖尿病数据中的所有特征全部单独通过线性回归进行训练,就能够明显看出每个特征对预测结果的影响
    • 代码
    # 三件套
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 导入糖尿病数据集
    from sklearn.datasets import load_diabetes
    
    # 导入线性回归算法
    from sklearn.linear_model import LinearRegression
    
    data_set = load_diabetes()
    feature_name = data_set['feature_names']
    data = data_set['data']
    target = data_set['target']
    data = pd.DataFrame(data, columns=feature_name)
    
    # 设置画布尺寸
    plt.figure(figsize=(5*6,2*6))
    
    for i,col in enumerate(data.columns):
    #     print(i)
        
        # 画出每个特征和结果的散点图
        aex = plt.subplot(2,5,i+1)
        aex.scatter(data.loc[:,col],target)
        # 画出用每个特征单独与结果训练的特征图
        line = LinearRegression()
        line.fit(data.loc[:,[col]],target)
        x = np.linspace(data.loc[:,col].min(),data.loc[:,col].max(),100)
        y = line.coef_*x + line.intercept_
        aex.plot(x,y,c='r')
        # 给每个图在对应特征的训练得分
        score = np.round(line.score(data.loc[:,[col]],target),2)
        aex.set_title(f'score:{score}',fontsize=20)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 结果
      在这里插入图片描述

    • 可以发现:bmi这个特征和s5特征通过线性回归模型训练后的得分更高,所以这两个因素是对于结果的影响更大。

    • 上面的作图方式和分析方法是需要掌握的,在进行科技论文写作时,这是很好的表述和分析范例。


    3、岭回归回归:

    • 如果数据的特征比样本数量还多(列大于行),就可以用岭回归的方法,因为输入矩阵不是满秩矩阵,因此无法求逆,就会导致无法使用线性回归。
    • 岭回归简单理解如下:
      在这里插入图片描述
      在这里插入图片描述
      上图中的0.01就是岭回归参数λ,对于λ的选择需要调试,λ增大,模型的方差就会越小,模型的偏差就会越大。
      岭回归的调用:
    from sklearn.linear_model import Ridge
    
    • 1

    对于岭回归,本文中的介绍很粗浅,只是说明了它所解决的问题以及如何调用它,还有调用时的参数说明。

    • 理解过拟合和欠拟合
      在这里插入图片描述

    4、三种回归对比

    • 方案:给定一个特征数大于样本数的输入样本,给定参数,通过输入样本和参数计算输出样本,制作数据集,然后分别用三种回归算法训练数据集,得到训练之后的参数,画出参数对比三者的区别
    • 代码
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 数据样本设置为200个特征,50个样本
    x_train = np.random.randn(50, 200) # 生成一个形状为 (50, 200) 的数组,其中包含的元素是从标准正态分布
    
    # 系数给200个
    coef = np.random.randn(200) 
    # 为了看起来清晰,对部分系数进行归零操作
    index_list = np.arange(200)
    np.random.shuffle(index_list) # 打乱列表中的元素顺序
    coef[index_list[:190]] = 0 # 将参数数组中190个元素变为0
    
    display(x_train.shape, coef.shape)
    
    # 进行点乘运算生成y值:y_train = w1x1 + w2x2 + ... + w200x200
    y_train = np.dot(x_train, coef)
    display(y_train.shape)
    
    # 绘制预测结果图
    plt.figure(figsize=(2*5,2*4))
    
    
    
    # 正常参数图
    aex1 = plt.subplot(2,2,1)
    aex1.plot(coef,c='b')
    # 线性回归参数图
    from sklearn.linear_model import LinearRegression
    coef2 = LinearRegression().fit(x_train, y_train).coef_
    aex2 = plt.subplot(2,2,2)
    aex2.plot(coef2,c='b')
    # 岭回归参数图
    from sklearn.linear_model import Ridge
    coef3 = Ridge().fit(x_train, y_train).coef_
    aex3 = plt.subplot(2,2,3)
    aex3.plot(coef3,c='b')
    # Losse回归参数图
    from sklearn.linear_model import Lasso
    coef4 = Lasso(alpha=0.03).fit(x_train, y_train).coef_
    aex4 = plt.subplot(2,2,4)
    aex4.plot(coef4,c='b')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 结果
      在这里插入图片描述
    • 分析:可以看出Lasso回归可以筛选参数(去除参数),而其他两种回归只能缩小参数的影响,但不会去除参数。
  • 相关阅读:
    计算机网络知识点总结——第三章数据链路层
    Python大数据处理利器之Pyspark详解
    改进YOLOv7系列:22.最新HorNet结合YOLOv7应用! | 多种搭配,即插即用 | Backbone主干、递归门控卷积的高效高阶空间交互
    黑客(网络安全)技术——如何高效自学
    【React 钩子函数 useMemo以及useMemo和useEffect的区别】
    【持续置顶,使用期间保持一直更新】Ubuntu 20.0.4 使用经验分享
    彻底透彻Docker常用网络模式及应用场景
    STM32微控制器的低功耗模式
    QT 实现 TCP 客户端服务器代码
    【ESP 保姆级教程】疯狂Node.js服务器篇 ——nodejs应用部署到腾讯云,实现公网访问
  • 原文地址:https://blog.csdn.net/sz1125218970/article/details/132645471