机器学习-线性回归

一、概述

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

原文地址:https://www.cnblogs.com/2019-02-11/p/10597104.html