zoukankan      html  css  js  c++  java
  • 机器学习-线性回归

    一、概述

    1.简单线性回归

    一种基于自变量(x)来预测因变量(Y)的方法.假设这两个变量是线性相关的,则寻找出根据特征或者自变量的线性函数来精准预测响应值.线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。需要说明的是,存在另一种成为非线性回归的回归模型,该模型不认同上面的做法,比如认为输出可能是输入的乘积。

    应该怎么从一大堆数据里求出回归方程呢?假定输入数据存放在矩阵X中,结果存放在向量y中:

    机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄

    而回归系数存放在向量w中:

    机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄

    那么对于给定的数据x1,即矩阵X的第一列数据,预测结果u1将会通过如下公式给出:

    机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄

    现在的问题是,手里有数据矩阵X和对应的标签向量y,怎么才能找到w呢?一个常用的方法就是找出使误差最小的w。这里的误差是指预测u值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。

    平方误差和可以写做:

    机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄

    用矩阵表示还可以写做:

    机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄

    为啥能这么变化,记住一个前提:若x为向量,则默认x为列向量,x^T为行向量。将上述提到的数据矩阵X和标签向量y带进去,就知道为何这么变化了。

    在继续推导之前,我们要先明确一个目的:找到w,使平方误差和最小。因为我们认为平方误差和越小,说明线性回归拟合效果越好。

    现在,我们用矩阵表示的平方误差和对w进行求导:

    机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄

    如果对于矩阵求不熟悉的,https://blog.csdn.net/nomadlx53/article/details/50849941

    令上述公式等于0,得到:

    机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄

    w上方的小标记表示,这是当前可以估计出的w的最优解。从现有数据上估计出的w可能并不是数据中的真实w值,所以这里使用了一个"帽"符号来表示它仅是w的一个最佳估计。

    值得注意的是,上述公式中包含逆矩阵,也就是说,这个方程只在逆矩阵存在的时候使用,也即是这个矩阵是一个方阵,并且其行列式不为0。最佳w求解是统计学中的常见问题,除了矩阵方法外还有很多其他方法可以解决。通过调用NumPy库里的矩阵方法,我们可以仅使用几行代码就完成所需功能。该方法也称作OLS, 意思是“普通小二乘法”(ordinary least squares)。数据下载:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Regression/ex0.txt

    2、局部加权线性回归

    线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有小均方误差的无偏估计。如果模型欠拟合将不能取得好的预测效果。所以有些方法允许在估计中引入一 些偏差,从而降低预测的均方误差。

    其中的一个方法是局部加权线性回归(Locally Weighted Linear Regression,LWLR)。在该方法中,我们给待预测点附近的每个点赋予一定的权重。与kNN一样,这种算法每次预测均需要事先选取出对应的数据子集。该算法解除回归系数W的形式如下:

    机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄

    其中W是一个矩阵,这个公式跟我们上面推导的公式的区别就在于W,它用来给每个点赋予权重。

    LWLR使用"核"(与支持向量机中的核类似)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:

    机器学习实战教程(十一):线性回归基础篇之预测鲍鱼年龄

    这样我们就可以根据上述公式,编写局部加权线性回归,我们通过改变k的值,可以调节回归效果,当k越小,拟合效果越好。但是当k过小,会出现过拟合的情况。

    3、岭回归

            如果数据的特征比样本点还多应该怎么办?很显然,此时我们不能再使用上文的方法进行计算了,因为矩阵X不是满秩矩阵,非满秩矩阵在求逆时会出现问题。统计学家引入岭回归(ridge regression)的概念。

    岭回归即我们所说的L2正则线性回归(正则有两个,其中L1正则是LASSO,L2是ridge,可用于过拟合),在一般的线性回归最小化均方误差的基础上增加了一个参数w的L2范数的罚项,从而最小化罚项残差平方和:

    机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

    简单说来,岭回归就是在普通线性回归的基础上引入单位矩阵。回归系数的计算公式变形如下:

    机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

    式中,矩阵I是一个mxm的单位矩阵,加上一个λI从而使得矩阵非奇异,进而能对矩阵求逆。

    岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。这里通过引入λ来限制了所有w之和,通过引入该惩罚项,能够减少不重要的参数,这个技术在统计学中也可以叫做缩减(shrinkage)。

    缩减方法可以去掉不重要的参数,因此能更好地裂解数据。此外,与简单的线性回归相比,缩减法能够取得更好的预测效果。(为了使用岭回归和缩减技术,首先需要对特征做标准化处理。因为,我们需要使每个维度特征具有相同的重要性。本文使用的标准化处理比较简单,就是将所有特征都减去各自的均值并除以方差。

    二、算法

    简单线性回归、局部加权线性回归

    三、使用

    3.1数据预处理

    导入相关库

    导入数据集

    检查缺失数据

    划分数据集

    特征缩放将使用简单线性模型的相关库来进行

    3.2通过训练集来训练简单线性回归模型

    使用来自sklearn.linear_model库的LinearnRegression类,然后创建一个LinearnRegression的regressor对象,最后使用LinearnRegression类的fit()方法将regressor对象对数据集进行训练.

    3.3预测结果

    预测来自测试集的结果,把输出保存在向量Y_pred中.使用前一不中的训练回归模型regressor的LinearnRegression类的预测方法来对结果进行预测.

    # 简单线性回归
    import pandas as pd
    import numpy as np
    from sklearn.linear_model import LinearRegression
    from sklearn.model_selection import train_test_split
    import matplotlib.pyplot as plt
    
    dataset = pd.read_csv('studentscores.csv')
    X = dataset.iloc[: , :1].values
    #print(X)
    Y = dataset.iloc[:,1].values
    #print(Y)
    seed = 7
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=seed)
    # print(X_test)
    # print('*********')
    # print(Y_test)
    # print('*********')
    # print(X_train)
    # print('*********')
    # print(Y_train)
    regressor = LinearRegression()
    regressor = regressor.fit(X_train, Y_train)
    Y_pred = regressor.predict(X_test)
    print(Y_pred)
    [52.33357604 16.89577953 60.20864193 34.61467779 33.63029455]

    四、参数

    sklearn实现下岭回归吧。

    官方英文文档地址:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html

    sklearn.linear_model提供了很多线性模型,包括岭回归、贝叶斯回归、Lasso等。本文主要讲解岭回归Ridge。

    机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

    1、Ridge

    让我们先看下Ridge这个函数,一共有8个参数:

    机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

    参数说明如下:

    • alpha:正则化系数,float类型,默认为1.0。正则化改善了问题的条件并减少了估计的方差。较大的值指定较强的正则化。
    • fit_intercept:是否需要截距,bool类型,默认为True。也就是是否求解b。
    • normalize:是否先进行归一化,bool类型,默认为False。如果为真,则回归X将在回归之前被归一化。 当fit_intercept设置为False时,将忽略此参数。 当回归量归一化时,注意到这使得超参数学习更加鲁棒,并且几乎不依赖于样本的数量。 相同的属性对标准化数据无效。然而,如果你想标准化,请在调用normalize = False训练估计器之前,使用preprocessing.StandardScaler处理数据。
    • copy_X:是否复制X数组,bool类型,默认为True,如果为True,将复制X数组; 否则,它覆盖原数组X。
    • max_iter:最大的迭代次数,int类型,默认为None,最大的迭代次数,对于sparse_cg和lsqr而言,默认次数取决于scipy.sparse.linalg,对于sag而言,则默认为1000次。
    • tol:精度,float类型,默认为0.001。就是解的精度。
    • solver:求解方法,str类型,默认为auto。可选参数为:auto、svd、cholesky、lsqr、sparse_cg、sag。
      • auto根据数据类型自动选择求解器。
      • svd使用X的奇异值分解来计算Ridge系数。对于奇异矩阵比cholesky更稳定。
      • cholesky使用标准的scipy.linalg.solve函数来获得闭合形式的解。
      • sparse_cg使用在scipy.sparse.linalg.cg中找到的共轭梯度求解器。作为迭代算法,这个求解器比大规模数据(设置tol和max_iter的可能性)的cholesky更合适。
      • lsqr使用专用的正则化最小二乘常数scipy.sparse.linalg.lsqr。它是最快的,但可能在旧的scipy版本不可用。它是使用迭代过程。
      • sag使用随机平均梯度下降。它也使用迭代过程,并且当n_samples和n_feature都很大时,通常比其他求解器更快。注意,sag快速收敛仅在具有近似相同尺度的特征上被保证。您可以使用sklearn.preprocessing的缩放器预处理数据。
    • random_state:sag的伪随机种子。

    以上就是所有的初始化参数,当然,初始化后还可以通过set_params方法重新进行设定。

    五、特别之处

    • 与分类一样,回归也是预测目标值的过程。回归与分类的不同点在于,前者预测连续类型变量,而后者预测离散类型变量。
    • 岭回归是缩减法的一种,相当于对回归系数的大小施加了限制。另一种很好的缩减法是lasso。lasso难以求解,但可以使用计算简便的逐步线性回归方法求的近似解。
    • 缩减法还可以看做是对一个模型增加偏差的同时减少方法

    感谢:机器学习实战教程:线性回归基础篇 | Jack Cui

  • 相关阅读:
    汉字转拼音的Java类库——JPinyin
    更改MySQL数据库的编码为utf8mb4
    mysql 添加列,修改列,删除列
    mysql解决datetime与timestamp精确到毫秒的问题
    mysql之数据库备份与恢复
    linux常用命令集锦
    如何更改linux文件目录拥有者及用户组
    linux 查找文件命令
    关于servlet中重定向、转发的地址问题
    jQuery的validation插件(验证表单插件)
  • 原文地址:https://www.cnblogs.com/2019-02-11/p/10597104.html
Copyright © 2011-2022 走看看