机器学习实战:预测数值型数据 - 回归

本文详细探讨了回归技术,从回归的基本概念、应用场景到原理,包括线性回归、局部加权线性回归及其项目案例。通过具体案例展示了如何使用线性和局部加权线性回归进行数据预测,并介绍了缩减系数在理解和优化模型中的作用,如岭回归和Lasso方法。文章还讨论了权衡偏差和方差的重要性,提供了回归技术在实际项目中的应用示例。
摘要由CSDN通过智能技术生成

机器学习实战:预测数值型数据 - 回归

一、回归

1、回归 概述

回归的目的是预测数值型的目标值。

其核心就是通过样本得到回归方程(一个预测值的计算公式),形如 y = ax , 其中a 就是回归系数,求回归系数的过程就是回归。一旦有了回归方程,再给定输入,预测就非常容易了。具体的做法是用回归系数乘以输入值,再将结果全部加在一起,就得到了预测值。 我们这里所说的,回归系数是一个向量,输入也是向量,这些运算也就是求出二者的内积。

说到回归,一般都是指线性回归。线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。

补充:
线性回归假设特征和结果满足线性关系。其实线性关系的表达能力非常强大,每个特征对结果的影响强弱可以由前面的参数体现,而且每个特征变量可以首先映射到一个函数,然后再参与线性计算。这样就可以表达特征与结果之间的非线性关系。

2、回归 场景

预测数值型的目标值。

假如你想要预测兰博基尼跑车的功率大小,可能会这样计算:

HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio

这就是回归方程,其中的 0.0015 和 -0.99 称作回归系数,求这些回归系数的过程就是回归。

3、回归 原理

线性回归

我们应该怎样从一大堆数据里求出回归方程呢? 假定输入数据存放在矩阵 x 中,而回归系数存放在向量 w 中。那么对于给定的数据 X1,预测结果将会通过 Y = X1^T w 给出。现在的问题是,手里有一些 X 和对应的 y,怎样才能找到 w 呢?一个常用的方法就是找出使误差最小的 w 。这里的误差是指预测 y 值和真实 y 值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差(实际上就是我们通常所说的最小二乘法)。

平方误差可以写做(其实我们是使用这个函数作为 loss function):
平方误差
用矩阵表示还可以写做 平方误差_2 。如果对 w 求导,得到 平方误差_3 ,令其等于零,解出 w 如下(具体求导过程为: http://blog.csdn.net/nomadlx53/article/details/50849941 ):
回归系数的最佳估计计算公式

须知概念

矩阵求逆

因为我们在计算回归方程的回归系数时,用到的计算公式如下:
回归系数的最佳估计计算公式
需要对矩阵求逆,因此这个方程只在逆矩阵存在的时候适用,我们在程序代码中对此作出判断。 判断矩阵是否可逆的一个可选方案是:

判断矩阵的行列式是否为 0,若为 0 ,矩阵就不存在逆矩阵,不为 0 的话,矩阵才存在逆矩阵。

最小二乘法

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。

工作原理

读入数据,将数据特征x、特征标签y存储在矩阵x、y中
验证 x^Tx 矩阵是否可逆
使用最小二乘法求得 回归系数 w 的最佳估计

开发流程
  1. 收集数据: 采用任意方法收集数据
  2. 准备数据: 回归需要数值型数据,标称型数据将被转换成二值型数据
  3. 分析数据: 绘出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩 减法求得新回归系数之后,可以将新拟合线绘在图上作为对比
  4. 训练算法: 找到回归系数
  5. 测试算法: 使用 R^2 或者预测值和数据的拟合度,来分析模型的效果
  6. 使用算法: 使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签
算法特点
  • 优点:结果易于理解,计算上不复杂。
  • 缺点:对非线性的数据拟合不好。
  • 适用于数据类型:数值型和标称型数据。

4、线性回归 & 局部加权线性回归 项目案例

完整代码:https://blog.csdn.net/qq_45556599/article/details/103637161

4.1 线性回归 项目案例

项目概述

根据下图中的点,找出该数据的最佳拟合直线。
在这里插入图片描述
数据格式为:

x0          x1          y 
1.000000	0.067732	3.176513
1.000000	0.427810	3.816464
1.000000	0.995731	4.550095
1.000000	0.738336	4.256571

编写代码

def loadDataSet(fileName):
    """ 加载数据
        解析以tab键分隔的文件中的浮点数
    Returns:
        dataMat :  feature 对应的数据集
        labelMat : feature 对应的分类标签,即类别标签
    """
    # 获取样本特征的总数,不算最后的目标变量
    numFeat = len(open(fileName).readline().split('\t')) - 1
    dataMat = []
    labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        # 读取每一行
        lineArr = []
        # 删除一行中以tab分隔的数据前后的空白符号
        curLine = line.strip().split('\t')
        # i 从0到2,不包括2
        for i in range(numFeat):
            # 将数据添加到lineArr List中,每一行数据测试数据组成一个行向量
            lineArr.append(float(curLine[i]))
            # 将测试数据的输入数据部分存储到dataMat 的List中
        dataMat.append(lineArr)
        # 将每一行的最后一个数据,即类别,或者叫目标变量存储到labelMat List中
        labelMat.append(float(curLine[-1]))
    return dataMat, labelMat


def standRegres(xArr, yArr):
    """
    Description:
        线性回归
    Args:
        xArr :输入的样本数据,包含每个样本数据的 feature
        yArr :对应于输入数据的类别标签,也就是每个样本对应的目标变量
    Returns:
        ws:回归系数
    """

    # mat()函数将xArr,yArr转换为矩阵 mat().T 代表的是对矩阵进行转置操作
    xMat = mat(xArr)
    yMat = mat(yArr).T
    # 矩阵乘法的条件是左矩阵的列数等于右矩阵的行数
    xTx = xMat.T * xMat
    # 因为要用到xTx的逆矩阵,所以事先需要确定计算得到的xTx是否可逆,条件是矩阵的行列式不为0
    # linalg.det() 函数是用来求得矩阵的行列式的,如果矩阵的行列式为0,则这个矩阵是不可逆的,就无法进行接下来的运算
    if linalg.det(xTx) == 0.0:
        print("This matrix is singular, cannot do inverse")
        return
    # 最小二乘法
    # 书中的公式,求得w的最优解
    ws = xTx.I * (xMat.T * yMat)
    return ws
    

def regression1():
    xArr, yArr = loadDataSet("data/data.txt")
    xMat = mat(xArr)
    yMat = mat(yArr)
    ws = standRegres(xArr, yArr)
    fig = plt.figure()
    ax = fig.add_subplot(
        111)  # add_subplot(349)函数的参数的意思是,将画布分成3行4列图像画在从左到右从上到下第9块
    ax.scatter(
        [xMat[:, 1].flatten()],
        [yMat.T[:, 0].flatten().A[0]])  # scatter 的x是xMat中的第二列,y是yMat的第一列
    xCopy = xMat.copy()
    xCopy.sort(0)
    yHat = xCopy * ws
    ax.plot(xCopy[:, 1], yHat)
    plt.show()

拟合效果
在这里插入图片描述

4.2 局部加权线性回归 项目案例
局部加权线性回归

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

一个方法是局部加权线性回归(Locally Weighted Linear Regression,LWLR)。在这个算法中,我们给预测点附近的每个点赋予一定的权重,然后与 线性回归 类似,在这个子集上基于最小均方误差来进行普通的回归。我们需要最小化的目标函数大致为:
在这里插入图片描述
目标函数中 w 为权重,不是回归系数。与 kNN 一样,这种算法每次预测均需要事先选取出对应的数据子集。该算法解出回归系数 w 的形式如下:
在这里插入图片描述
其中 W 是一个矩阵,用来给每个数据点赋予权重。 w ^ \hat{w} w^ 则为回归系数。 这两个是不同的概念,请勿混用。

LWLR 使用 “核”(与支持向量机中的核类似)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:
在这里插入图片描述
这样就构建了一个只含对角元素的权重矩阵w,并且点x与x(i)越近,w(i,i)将会越大。上 述公式包含一个需要用户指定的参数k,它决定了对附近的点赋予多大的权重,这也是使用LWLR 时唯一需要考虑的参数,在图8-4中可以看到参数k与权重的关系。
在这里插入图片描述
上面的图是 每个点的权重图(假定我们正预测的点是 x = 0.5),最上面的图是原始数据集,第二个图显示了当 k = 0.5 时,大部分的数据都用于训练回归模型;而最下面的图显示当 k=0.01 时,仅有很少的局部点被用于训练回归模型。

工作原理

读入数据,将数据特征x、特征标签y存储在矩阵x、y中
利用高斯核构造一个权重矩阵 W,对预测点附近的点施加权重
验证 X^TWX 矩阵是否可逆
使用最小二乘法求得 回归系数 w 的最佳估计

项目案例

我们仍然使用上面 线性回归 的数据集,对这些点进行一个 局部加权线性回归 的拟合。
在这里插入图片描述
数据格式为:

1.000000	0.067732	3.176513
1.000000	0.427810	3.816464
1.000000	0.995731	4.550095
1.000000	0.738336	4.256571
编写代码
# 局部加权线性回归
def lwlr(testPoint, xArr, yArr, k=1.0):
    """
        Description:
            局部加权线性回归,在待预测点附近的每个点赋予一定的权重,在子集上基于最小均方差来进行普通的回归。
        Args:
            testPoint:样本点
            xArr:样本的特征数据,即 feature
            yArr:每个样本对应的类别标签,即目标变量
            k:关于赋予权重矩阵的核的一个参数,与权重的衰减速率有关
        Returns:
            testPoint * ws:数据点与具有权重的系数相乘得到的预测点
        Notes:
            这其中会用到计算权重的公式,w = e^((x^((i))-x) / -2k^2)
            理解:x为某个预测点,x^((i))为样本点,样本点距离预测点越近,贡献的误差越大(权值越大),越远则贡献的误差越小(权值越小)。
            关于预测点的选取,在我的代码中取的是样本点。其中k是带宽参数,控制w(钟形函数)的宽窄程度,类似于高斯函数的标准差。
            算法思路:假设预测点取样本点中的第i个样本点(共m个样本点),遍历1到m个样本点(含第i个),算出每一个样本点与预测点的距离,
            也就可以计算出每个样本贡献误差的权值,可以看出w是一个有m个元素的向量(写成对角阵形式)。
    """
    # mat() 函数是将array转换为矩阵的函数, mat().T 是转换为矩阵之后,再进行转置操作
    xMat = mat(xArr)
    yMat = mat(yArr).T
    # 获得xMat矩阵的行数
    m = shape(xMat)[0]
    
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值