一、概述
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
线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有小均方误差的无偏估计。如果模型欠拟合将不能取得好的预测效果。所以有些方法允许在估计中引入一 些偏差,从而降低预测的均方误差。
其中的一个方法是局部加权线性回归(Locally Weighted Linear Regression,LWLR)。在该方法中,我们给待预测点附近的每个点赋予一定的权重。与kNN一样,这种算法每次预测均需要事先选取出对应的数据子集。该算法解除回归系数W的形式如下:
其中W是一个矩阵,这个公式跟我们上面推导的公式的区别就在于W,它用来给每个点赋予权重。
LWLR使用"核"(与支持向量机中的核类似)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:
这样我们就可以根据上述公式,编写局部加权线性回归,我们通过改变k的值,可以调节回归效果,当k越小,拟合效果越好。但是当k过小,会出现过拟合的情况。
如果数据的特征比样本点还多应该怎么办?很显然,此时我们不能再使用上文的方法进行计算了,因为矩阵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。
让我们先看下Ridge这个函数,一共有8个参数:
参数说明如下:
以上就是所有的初始化参数,当然,初始化后还可以通过set_params方法重新进行设定。
五、特别之处
感谢:机器学习实战教程:线性回归基础篇 | Jack Cui
原文:https://www.cnblogs.com/2019-02-11/p/10597104.html