zoukankan      html  css  js  c++  java
  • 02-05 scikit-learn库之线性回归


    更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

    scikit-learn库之线性回归

    由于scikit-learn库中sclearn.linear_model提供了多种支持线性回归分析的类,本文主要总结一些常用的线性回归的类,并且由于是从官方文档翻译而来,翻译会略有偏颇,如果有兴趣想了解其他类的使用方法的同学也可以去scikit-learn官方文档查看https://scikit-learn.org/stable/modules/classes.html#module-sklearn.linear_model

    在讲线性回归理论的时候讲到了,线性回归的目的是找到一个线性回归系数向量ω,使得输入特征X和输出向量Y之间有一个

    Y=Xω

    的映射关系,接下来的线性回归模型和线性回归模型的思想类似。假设一个数据集有m实例,每个实例有n个特征,则其中Y的维度是m1X的维度是mnω的维度是n1

    使用线性回归的目的就是找到一个合适的线性回归系数ω能够最小化我们定义的目标函数,又由于最小化目标函数的优化方法的不同,会有不同的线性回归算法。

    由于其他版本的线性回归模型的参数类似于LinearRegression,即其他类型的线性回归模型的参数详解都会跳过,只会讲解它与LinearRegression的不同之处。我们接下来的目的就是为了给大家介绍scikit-learn库中常用的线性回归模型。

    一、LinearRegression

    1.1 使用场景

    LinearRegression回归模型,即我们在线性回归中讲到的普通线性回归,该普通线性回归可以处理一元线性回归,也可以处理多元线性回归,但是该类使用的优化方法是最小二乘法

    通常情况下该类是我们使用线性回归处理线性问题的首选方法,因为它的目标函数较其他线性回归简单,计算量小,如果它拟合数据出现过拟合问题则可以考虑使用正则化形式的线性回归。

    1.2 代码

    import numpy as np
    from sklearn.linear_model import LinearRegression
    

    X = np.array([[2, 0], [1, 9], [6, 6], [8, 8]])
    # y = 1 * x_0 + 2 * x_1 + 3
    y = np.dot(X, np.array([6, 8])) + 3

    reg = LinearRegression()
    reg.fit(X, y)
    
    LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
             normalize=False)
    
    reg.score(X, y)
    
    1.0
    
    reg.coef_
    
    array([6., 8.])
    
    reg.intercept_
    
    2.999999999999986
    
    reg.predict(np.array([[8, 6]]))
    
    array([99.])
    

    1.3 参数详解

    • fit_intercept:截距(偏置单元),bool类型。是否存在截距或者偏置单元。如果使用中心化的数据(中心点为0的数据),可以考虑设置fit_intercept=False。默认为True。
    • normalize:标准化数据,bool类型。当fit_intercept=False的时候,这个参数会被自动忽略;如果fit_intercept=True,回归器会标准化输入数据,该标准化方式为:减去平均值,并且除以相应的二范数。建议在使用fit()训练模型之前使用sklearn.preprocessing.StandardScaler对数据标准化,同时设置normalize=False。默认为False。
    • copy_X:复制数据,bool类型。如果copy_X=False,可能会因为对数据中心化把原始X数据覆盖。默认为True。
    • n_jobs:并行数,int类型。n_jobs=1使用1个cpu运行程序;n_jobs=2,使用2个cpu运行程序;n_jobs=-1,使用所有cpu运行程序。默认为1。

    1.4 属性

    • coef_:array类型,线性回归系数。
    • intercept_:array类型,截距。

    1.5 方法

    • fit(X,y,sample_weight=None):把数据放入模型中训练模型,其中sample_weight=None是array类型可以对训练集中实例添加权重,即对训练集中不同的数据增加不同的权重。
    • get_params([deep]):返回模型的参数,例如可以用于Pipeline中。
    from sklearn.pipeline import Pipeline  
    

    p =Pipeline([
    ('poly', PolynomialFeatures()),
    ('linear', LinearRegression(fit_intercept=False))])
    lin = p.get_params('linear')['linear']
    print(lin.coef_)

    • predict(X):通过样本X得到X对应的预测值。
    • score(X, y[, sample_weight]):基于报告决定系数R2评估模型。
    • set_prams(**params):创建模型参数。

    1.5.1 报告决定系数

    报告决定系数(R2),可以理解成MSE的标准版,R2的公式为

    R2=11ni=1n(y(i)y(i)^)21ni=1n(y(i)μ(y))2

    其中μ(y)y的平均值,即1ni=1n(y(i)μ(y))2y的方差,公式可以写成

    R2=1MSEVar(y)

    R2的取值范围在01之间,如果R2=1,则均方误差MSE=0,即模型完美的拟合数据。

    二、ARDRegression

    当数据集中有很多缺失值或异常值时使用ARDRegression模型,该模型属于贝叶斯回归模型。该模型会对模型输出Y和模型参数ω作出分布假设,并且正则化参数alpha也会从数据中估计得到,虽然该模型对异常值鲁棒性很好,但由于该模型计算量大,耗时,一般情况不推荐使用,此处不多赘述。

    三、BayesianRidge

    该模型类似于ARDRegression模型,两者都属于贝叶斯回归,不同之处在于对ω的分布假设不同。由于该模型的目标函数类似于Ridge模型的目标函数,因此取名BayesianRidge。但由于该模型同样计算量大,耗时,一般情况下也不推荐使用,此处不多赘述。

    四、ElasticNet

    ElasticNet模型的优化方法是坐标轴下降法,该模型由L1正则化和L2正则化的加权得到,如果使用L1正则化和L2正则化都不行的时候,可以考虑使用该模型。

    该模型由于增加了参数alphal1_ratio,需要手动调参,通常使用接下来的LassoCV

    五、ElasticNetCV

    ElasticNetCV模型在目标函数和优化方式类似于ElasticNet,但是可以自己手动输入10组、100组参数alphal1_ratio,该模型会通过交叉验证后给你这组参数中最优模型。

    六、Lasso

    Lasso模型的优化方法是坐标轴下降法,该模型即线性回归L1正则化,该。如果数据集的特征维度较高,可以使用该模型,该模型可以把一些较小的回归系数直接变为0,由于减少了数据集的特征维度,也会间接的减轻模型过拟合问题,增强模型的泛化能力。

    该模型由于会把一些较小的回归系数变为0,既可以找出重要的特征,对数据集的解释能力强。

    该模型由于增加了参数alpha,需要手动调参,通常使用接下来的LassoCV

    七、LassoCV

    LassoCV模型在目标函数和优化方式类似于Lasso,但是可以自己手动输入10组、100组参数alpha,该模型会通过交叉验证后给你这组参数中最优模型。

    八、LassoLars

    LassoLars模型的优化方法是最小角回归法,该模型类似于Lasso模型,但是该模型优化方法为。

    该模型由于增加了参数alpha,需要手动调参,通常使用接下来的LassoLarsCV

    九、LassoLarsCV

    LassoLarsCV模型在目标函数和优化方式类似于LassoLars,但是可以自己手动输入10组、100组参数alpha,该模型会通过交叉验证后给你这组参数中最优模型。

    十、LassoLarsIC

    LassoLarsIC模型类似于Lasso模型,不同之处在于它并不使用交叉验证的方式得到最优模型。它基于AIC和BIC准则,一轮就可以找到找到一个最优alpha和最优模型,而交叉验证如果使用k折交叉验证,则需要k1次才能找到最优模型。

    该模型从上述讲述看起来是很完美的,但是该模型要求数据集是由某个假设的模型产生的,并且如果当特征数量大于实例数量的时候该模型可能会成为一个较差的模型,所以在工业上一般不推荐使用。

    十一、MutilTaskLasso

    MutilTaskLasso模型的优化方法是坐标轴下降法,模型中的MutilTask可以理解成“多个”而不是“多进程”,即一次性使用多个L1正则化线性回归模型拟合数据,有时候也称之为共享特征协同回归。

    普通线性回归的模型是

    Y=Xω

    其中假设一个数据集有m实例,每个实例有n个特征,则其中Y的维度是m1X的维度是mnω的维度是n1

    该模型去掉正则化项是

    Y=XW

    其中假设一个数据集有m实例,每个实例有n个特征,则其中Y的维度是mkX的维度是mnW的维度是nk,其中k为回归模型的个数,即该模型的fit()方法可以传入k维的特征。

    该模型由于增加了参数alphak,需要手动调参,通常使用接下来的MutilTaskLassoCV

    十二、MutilTaskElasticNet

    MutilTaskElasticNet模型的优化方法是坐标轴下降法,该模型类似于MutilTaskLasso模型,只是在正则化项上前者使用了L1正则项,后者使用了弹性网络正则项。

    该模型由于增加了参数alphal1_ratio,需要手动调参,通常使用接下来的LassoCV

    十三、MutilTaskLassoCV

    MutilTaskLassoCV模型在目标函数和优化方式类似于MutilTaskLasso,但是可以自己手动输入10组、100组参数alpha,该模型会通过交叉验证后给你这组参数中最优模型。

    十四、MutilTaskElasticNetCV

    该模型在目标函数和优化方式类似于Lasso,但是可以自己手动输入10组、100组参数alphal1_ratio,该模型会通过交叉验证后给你这组参数中最优模型。

    十五、OrthogonalMatchingPursuit

    OrthogonalMatchingPursuit模型优化方法是前向选择算法,优化方法速度虽然快,但是精确度较低。

    该模型使用参数n_nonzero_coefs限制模型参数ω向量中元素非0的个数,由于该特征可以用于稀疏特征模型的特征选择上,这一点类似于Lasso模型,但是由于优化方法前向选择算法,一般不推荐使用。

    该模型由于增加了参数n_nonzero_coefs,需要手动调参,通常使用接下来的LassoCV

    十六、OrthogonalMatchingPursuitCV

    OrthogonalMatchingPursuitCV模型在目标函数和优化方式类似于OrthogonalMatchingPursuitCV,但是可以自己手动输入10组、100组参数n_nonzero_coefs,该模型会通过交叉验证后给你这组参数中最优模型。

    十七、RANSACRegressor

    RANSACRegressor模型使用的优化算法是RANSACR算法,该算法可以控制使用部分区域的数据集训练模型。

    可以参考《RANSAC算法线性回归(波斯顿房价预测)》

    十八、Ridge

    Ridge模型的优化方法是最小二乘法,该模型即线性回归L2正则化,一般使用LinearRegression模型时模型过拟合时可以使用该方法。

    由于额外增加了alpha参数,一般情况下需要自己手动调参,所以可以在自己测试的时候使用,一般工业上使用较多的是接下来的RidgeCV

    十九、RidgeCV

    RidgeCV模型在目标函数和优化方式类似于Ridge,但是可以自己手动输入10组、100组参数alpha,该模型会通过交叉验证后给你这组参数中最优模型。

  • 相关阅读:
    IO流基础
    DB2 存储过程创建、系统表
    dubbo实现原理简单介绍
    Java 标准 I/O 介绍
    mysql由于权限问题看不到用户数据库
    java 字符常量池
    Java NIO:NIO概述
    128 C语言实现文件复制功能(包括文本文件和二进制文件)
    Linux 下各个目录的作用及内容
    Linux文件系统详解
  • 原文地址:https://www.cnblogs.com/abdm-989/p/14111336.html
Copyright © 2011-2022 走看看