美文网首页机器学习
(一)数据建模--线性回归

(一)数据建模--线性回归

作者: 羽天驿 | 来源:发表于2020-04-06 16:11 被阅读0次

    一、基于什么-----sklearn sci-kit learn

    介绍:sklearn对一些常用的机器学习方法进行了封装,在进行机器学习任务时,并不需要每个人都实现所有的算法,只需要简单的调用sklearn里的模块就可以实现大多数机器学习任务。
    机器学习任务通常包括分类(Classification)和回归(Regression),常用的分类器包括SVM、KNN、贝叶斯、线性回归、逻辑回归、决策树、随机森林、xgboost、GBDT、boosting、神经网络NN。
    常见的降维方法包括TF-IDF、主题模型LDA、主成分分析PCA等等

    安装:pip install sklearn

    官网:https://scikit-learn.org/stable/

    二、线性回归模型(又称线性回归方程)

    • 一元一次线性回归方程f(x) = wx + b

    • 二元一次线性回归方程f(x,y) = w_1x + w_2x^2 + b

    • 多元一次线性回归方程f(x,y,z……) = w_1x + w_2y + w_3z + …… + b

    • 多元一次线性回归方程f(x) = \sum\limits_{i = 1}^{n}w_ix_i + b

    • 多项式回归,多次幂

    • 一元二次多项式回归方程f(x) = w_1x + w_2x^2 + b

    • 一元三次多项式回归方程f(x) = w_1x + w_2x^2 + w_3x^3 + b

    • 二元二次多项式回归方程f(x,y) = w_1x + w_2x^2 + w_3y + w_4y^2 + w_5xy + b

    • 多元多次多项式回归方程

    三、线性回归模型的原理和作用

    • 将数据分为两个部分---一部分训练
      --一部分测试
    • 原理:通过训练的的数据---得出该数据的方程
    • 求解出方程的系数和截距
    • 代入测试数据
      *看算法的拟合与原数据的差距。

    四、使用sklearn中API数据实现线性回归的简单算例

    (一)

    导包

    import numpy as np
    
    # 线性回归,拟合的方程,求解的系数:一次幂
    # 线性方程,直来直去,不能拐弯
    from sklearn.linear_model import LinearRegression
    
    # 数据集
    from sklearn import datasets
    
    from sklearn.model_selection import train_test_split
    

    数据加载

    获取的数据,是numpy对象数组:ndarray

    # 波士顿房价信息,影响房价的因素很多:治安,环境,商业,等
    data = datasets.load_boston()
    # 属性,特征,未知数(元)
    X = data['data']
    # y房价的估值
    y = data['target']
    # 线性方程
    # y = f(X) = wX + b
    display(data.feature_names)
    # 506 表示:采样了506个样本
    # 每个样本,采集了13个属性,特征:CRIM,ZN,INDUS,CHAS……
    # 13个属性,构建方程,13元一次方程
    X.shape
    
    array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
           'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
    
    
    
    
    
    (506, 13)
    

    线性方程,13元一次方程

    f(X) = w_1x_1 + w_2x_2 + ……+w_{13}x_{13} + b

    将数据一分二

    # 分割之前,数据X和目标值y(房价的估值)对应
    # 分割之后,数据也是一一对应,
    # 随机进行划分,打乱顺序
    X_train,X_test,y_train,y_test = train_test_split(X,y)
    display(X_train.shape,X_test.shape)
    
    (379, 13)
    
    
    
    (127, 13)
    

    声明算法

    训练

    预测(X_test)

    # 参数一fit_intercept拟合时,计算截距
    # 参数二nomalize:归一化 [1,2,2] ---->[0.5,1,1]
    # 参数三copy_X 是否复制一份训练数据
    # 参数四 n_jobs:数据量很大时,开启多进程,充分使用CPU
    linear = LinearRegression()
    
    linear.fit(X_train,y_train)
    
    # y_ 约定俗称,算法返回的值下划线标记:y_、w_、b_
    y_ = linear.predict(X_test).round(1)
    y_
    

    预测房价和挂牌销售的房价进行对比

    # 真实的数据
    y_test[:25]
    
    array([35.4, 44.8, 16.5, 18.5, 33.4, 19.3, 20.1, 29.8, 19.5, 24.3, 23.9,
           20.3, 11.3, 12. , 21.2, 25. , 18.9, 19.5, 22.9, 24.1, 20.3, 23.1,
           38.7, 24. , 30.1])
    
    # 算法估计的房价
    y_[:25]
    
    array([31.1, 37.2, 12. , 19.8, 35.2, 22.5, 19.2, 32.5, 19.6, 24.8, 24.6,
           23.1, 13.8, 12.5, 21.1, 26. , 19.2, 17.2, 20. , 29.9, 23.7, 16.7,
           34.5, 25.5, 25.8])
    

    对比,结论:预测值和挂牌销售的值差不多,说明,算法模型适合,数据

    手动构建一下方程,模型 == 线性模型

    # 就是方程的系数coeficient 
    # 系数 斜率 权重 (weight)
    w_ = linear.coef_
    w_
    
    array([-1.28144799e-01,  5.10958761e-02,  2.09782282e-02,  2.42340039e+00,
           -2.01754074e+01,  3.36153444e+00,  1.32486107e-02, -1.45424759e+00,
            3.34888592e-01, -1.17945715e-02, -1.01062671e+00,  9.79994217e-03,
           -5.58464920e-01])
    
    # 截距,y轴交叉,纵坐标值
    # bias 偏差的意思
    b_ = linear.intercept_
    b_
    
    40.63762814741078
    
    image

    对应的位置和对应的系数进行相乘,矩阵乘法

    f(X) = w_1x_1 + w_2x_2 + …… + w_{13}x_{13} + b

    线性方程,使用矩阵表示如下:

    f(X) = Xw + b

    # 矩阵运算
    # 矩阵运算,线性代数
    # 线性代数
    def fun(w_,b_,X):
        return (np.dot(X,w_) + b_).round(1)
    
    # 自己定义的方法:线性方程
    fun(w_,b_,X_test)[:25]
    
    array([22.2, 29.1, 16.8, 13.5, 35.3, 19.2, 31.5, 20.8, 15.7, 19.1,  8.5,
           24.4, 20.6, 14.1, 17.1, 28.5, 34.8, 25.4, 27.8, 18.1, 18.5, 11.5,
           37.8,  9.4, 27.8])
    
    # 使用sklearn中线性模型计算得到的结果
    linear.predict(X_test).round(1)[:25]
    
    array([22.2, 29.1, 16.8, 13.5, 35.3, 19.2, 31.5, 20.8, 15.7, 19.1,  8.5,
           24.4, 20.6, 14.1, 17.1, 28.5, 34.8, 25.4, 27.8, 18.1, 18.5, 11.5,
           37.8,  9.4, 27.8])
    

    (二)

    import numpy as np
    
    from sklearn.linear_model import LinearRegression
    
    from sklearn import datasets
    

    最小二乘法

    作用:
    1、最小二乘法能通过最小化误差的平方和寻找数据的最佳函数匹配。

    2、利用最小二乘法能简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

    3、最小二乘法可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。当自变量和因变量同时存在均值为零,相同方差的随机误差时,此方法能给出在统计意义上最好的参数拟合结果。


    \min_{w}|| X w - y||_2^2

    右上角的2表示平方

    右下角的2表示:向量2范数

    公式中有||||表示向量

    向量1-范数表示各个元素的绝对值之和

    ||X||_1 = \sum\limits_{i = 1}^n|x_i|

    向量2-范数表示:每个元素的平方和再开平方根

    ||X||_2 = \sqrt{\sum\limits_{i = 1}^nx_i^2}

    向量无穷范数:

    ||X||_{\infty} = \max\limits_{1 \geq i \leq n}|x_i|

    根据最小二乘法的公式,求解的w的结果是:

    w = (X^TX)^{-1}X^Ty

    百度百科表示

    \hat{\beta} = (X^TX)^{-1}X^Ty

    线性方程表示形式两种

    f(x) = w_1x_1 + w_2x_2 + w_3x_3 + b

    f(x) = w_1x_1^1 + w_2x_2^1 + w_3x_3^1 + w_4x_4^0

    <font color = red>w_4x_4^0 == b</font>

    f(x) = w_1x_1 + w_2x_2 + w_3x_3 + w_4x_4^0

    X,y = datasets.load_boston(True)
    print(X,y)
    
    [[6.3200e-03 1.8000e+01 2.3100e+00 ... 1.5300e+01 3.9690e+02 4.9800e+00]
     [2.7310e-02 0.0000e+00 7.0700e+00 ... 1.7800e+01 3.9690e+02 9.1400e+00]
     [2.7290e-02 0.0000e+00 7.0700e+00 ... 1.7800e+01 3.9283e+02 4.0300e+00]
     ...
     [6.0760e-02 0.0000e+00 1.1930e+01 ... 2.1000e+01 3.9690e+02 5.6400e+00]
     [1.0959e-01 0.0000e+00 1.1930e+01 ... 2.1000e+01 3.9345e+02 6.4800e+00]
     [4.7410e-02 0.0000e+00 1.1930e+01 ... 2.1000e+01 3.9690e+02 7.8800e+00]] [24.  21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 15.  18.9 21.7 20.4
     18.2 19.9 23.1 17.5 20.2 18.2 13.6 19.6 15.2 14.5 15.6 13.9 16.6 14.8
     18.4 21.  12.7 14.5 13.2 13.1 13.5 18.9 20.  21.  24.7 30.8 34.9 26.6
     25.3 24.7 21.2 19.3 20.  16.6 14.4 19.4 19.7 20.5 25.  23.4 18.9 35.4
     24.7 31.6 23.3 19.6 18.7 16.  22.2 25.  33.  23.5 19.4 22.  17.4 20.9
     24.2 21.7 22.8 23.4 24.1 21.4 20.  20.8 21.2 20.3 28.  23.9 24.8 22.9
     23.9 26.6 22.5 22.2 23.6 28.7 22.6 22.  22.9 25.  20.6 28.4 21.4 38.7
     43.8 33.2 27.5 26.5 18.6 19.3 20.1 19.5 19.5 20.4 19.8 19.4 21.7 22.8
     18.8 18.7 18.5 18.3 21.2 19.2 20.4 19.3 22.  20.3 20.5 17.3 18.8 21.4
     15.7 16.2 18.  14.3 19.2 19.6 23.  18.4 15.6 18.1 17.4 17.1 13.3 17.8
     14.  14.4 13.4 15.6 11.8 13.8 15.6 14.6 17.8 15.4 21.5 19.6 15.3 19.4
     17.  15.6 13.1 41.3 24.3 23.3 27.  50.  50.  50.  22.7 25.  50.  23.8
     23.8 22.3 17.4 19.1 23.1 23.6 22.6 29.4 23.2 24.6 29.9 37.2 39.8 36.2
     37.9 32.5 26.4 29.6 50.  32.  29.8 34.9 37.  30.5 36.4 31.1 29.1 50.
     33.3 30.3 34.6 34.9 32.9 24.1 42.3 48.5 50.  22.6 24.4 22.5 24.4 20.
     21.7 19.3 22.4 28.1 23.7 25.  23.3 28.7 21.5 23.  26.7 21.7 27.5 30.1
     44.8 50.  37.6 31.6 46.7 31.5 24.3 31.7 41.7 48.3 29.  24.  25.1 31.5
     23.7 23.3 22.  20.1 22.2 23.7 17.6 18.5 24.3 20.5 24.5 26.2 24.4 24.8
     29.6 42.8 21.9 20.9 44.  50.  36.  30.1 33.8 43.1 48.8 31.  36.5 22.8
     30.7 50.  43.5 20.7 21.1 25.2 24.4 35.2 32.4 32.  33.2 33.1 29.1 35.1
     45.4 35.4 46.  50.  32.2 22.  20.1 23.2 22.3 24.8 28.5 37.3 27.9 23.9
     21.7 28.6 27.1 20.3 22.5 29.  24.8 22.  26.4 33.1 36.1 28.4 33.4 28.2
     22.8 20.3 16.1 22.1 19.4 21.6 23.8 16.2 17.8 19.8 23.1 21.  23.8 23.1
     20.4 18.5 25.  24.6 23.  22.2 19.3 22.6 19.8 17.1 19.4 22.2 20.7 21.1
     19.5 18.5 20.6 19.  18.7 32.7 16.5 23.9 31.2 17.5 17.2 23.1 24.5 26.6
     22.9 24.1 18.6 30.1 18.2 20.6 17.8 21.7 22.7 22.6 25.  19.9 20.8 16.8
     21.9 27.5 21.9 23.1 50.  50.  50.  50.  50.  13.8 13.8 15.  13.9 13.3
     13.1 10.2 10.4 10.9 11.3 12.3  8.8  7.2 10.5  7.4 10.2 11.5 15.1 23.2
      9.7 13.8 12.7 13.1 12.5  8.5  5.   6.3  5.6  7.2 12.1  8.3  8.5  5.
     11.9 27.9 17.2 27.5 15.  17.2 17.9 16.3  7.   7.2  7.5 10.4  8.8  8.4
     16.7 14.2 20.8 13.4 11.7  8.3 10.2 10.9 11.   9.5 14.5 14.1 16.1 14.3
     11.7 13.4  9.6  8.7  8.4 12.8 10.5 17.1 18.4 15.4 10.8 11.8 14.9 12.6
     14.1 13.  13.4 15.2 16.1 17.8 14.9 14.1 12.7 13.5 14.9 20.  16.4 17.7
     19.5 20.2 21.4 19.9 19.  19.1 19.1 20.1 19.9 19.6 23.2 29.8 13.8 13.3
     16.7 12.  14.6 21.4 23.  23.7 25.  21.8 20.6 21.2 19.1 20.6 15.2  7.
      8.1 13.6 20.1 21.8 24.5 23.1 19.7 18.3 21.2 17.5 16.8 22.4 20.6 23.9
     22.  11.9]
    

    直接使用线性回归,求解,斜率和截距

    linear = LinearRegression()
    linear.fit(X,y)
    w_ = linear.coef_
    b_ = linear.intercept_
    print(w_)
    print(b_)
    
    [-1.08011358e-01  4.64204584e-02  2.05586264e-02  2.68673382e+00
     -1.77666112e+01  3.80986521e+00  6.92224640e-04 -1.47556685e+00
      3.06049479e-01 -1.23345939e-02 -9.52747232e-01  9.31168327e-03
     -5.24758378e-01]
    36.45948838509014
    
    X.shape
    
    (506, 13)
    
    # 增加了一列,最后一列,都是1,相当于,截距
    X = np.concatenate([X,np.ones(shape = (506,1))],axis = 1)
    X
    
    array([[6.3200e-03, 1.8000e+01, 2.3100e+00, ..., 3.9690e+02, 4.9800e+00,
            1.0000e+00],
           [2.7310e-02, 0.0000e+00, 7.0700e+00, ..., 3.9690e+02, 9.1400e+00,
            1.0000e+00],
           [2.7290e-02, 0.0000e+00, 7.0700e+00, ..., 3.9283e+02, 4.0300e+00,
            1.0000e+00],
           ...,
           [6.0760e-02, 0.0000e+00, 1.1930e+01, ..., 3.9690e+02, 5.6400e+00,
            1.0000e+00],
           [1.0959e-01, 0.0000e+00, 1.1930e+01, ..., 3.9345e+02, 6.4800e+00,
            1.0000e+00],
           [4.7410e-02, 0.0000e+00, 1.1930e+01, ..., 3.9690e+02, 7.8800e+00,
            1.0000e+00]])
    

    w = (X^TX)^{-1}X^Ty

    A = X.T.dot(X)
    
    # 求解逆矩阵
    # linalg  linear algebra
    B = np.linalg.inv(A)
    
    C = B.dot(X.T)
    
    C.dot(y)
    
    array([-1.08011358e-01,  4.64204584e-02,  2.05586264e-02,  2.68673382e+00,
           -1.77666112e+01,  3.80986521e+00,  6.92224640e-04, -1.47556685e+00,
            3.06049479e-01, -1.23345939e-02, -9.52747232e-01,  9.31168327e-03,
           -5.24758378e-01,  3.64594884e+01])
    

    相关文章

      网友评论

        本文标题:(一)数据建模--线性回归

        本文链接:https://www.haomeiwen.com/subject/pnyruhtx.html