python中数值型数据_教你学Python32-预测数值型数据:数据回归

一、引言

前面的文章介绍了很多分类算法,分类的目标变量是标称型数据,而本节将会对连续型的数据做出预测。主要讲解简单的线性回归和局部加权线性回归。

二、什么是回归?

回归的目的是预测数值型的目标值。他和我们之前做的分类是不一样的。最直接的办法是依据输入写出一个目标值的计算公式。假如你想预测小姐姐男友法拉利汽车的功率,可能会这么计算:

HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio

写成中文就是:

小姐姐男友法拉利汽车的功率 = 0.0015 * 小姐姐男友年薪 - 0.99 * 收听公共广播的时间

这就是所谓的回归方程(regression equation),其中的0.0015和-0.99称为回归系数(regression weights),求这些回归系数的过程就是回归。一旦有了这些回归系数,再给定输入,做预测就非常容易了。具体的做法是用回归系数乘以输入值,再将结果全部加在一起,就得到了预测值。

说到回归,一般都是指线性回归(linear regression),所以本文里的回归和线性回归代表同一个意思。线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。需要说明的是,存在另一种成为非线性回归的回归模型,该模型不认同上面的做法,比如认为输出可能是输入的乘积。这样,上面的功率计算公式也可以写做:

HorsePower = 0.0015 * annualSalary / hoursListeningToPublicRadio

这就是一个非线性回归的例子,这里对此不做深入讨论。

三、揭开回归神奇的面纱~

1、用线性回归找到最佳拟合直线

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

c8177f3e6709c93d10e6e0faf11deddad1005449.jpeg?token=27f2e25531e077a323f6e189b639c01c&s=ADB8CD12D9254D110E7150CA0200F0B2

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

d788d43f8794a4c2e3d4620c60d40ed3ac6e39cc.jpeg?token=edf3a682a177d6f73ff8c02038caf6dd&s=80304D32CDB14D985C55B0CE0200A0B2

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

cdbf6c81800a19d8efc567235dda978da71e46fc.jpeg?token=75c8d09cd3441ef75dc94f81e25937ca&s=A0B84532E1BD599A487470DA020030B1

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

平方误差和可以写做:

14ce36d3d539b600017ca6ec8670202cc75cb7e5.jpeg?token=26ea3e36a38934250a687397d51c7cff&s=C100FD1289AB64094A7928D2000010B2

用矩阵表示还可以写做:

0b7b02087bf40ad11aa1da61380c04d9a8ecce95.jpeg?token=4fe88b8423a70987d14f5adc8d327b2c&s=A980C512E6D3E0291478A0D6020030B1

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

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

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

2cf5e0fe9925bc311f1de75c31ff98b7ca13705c.jpeg?token=0c78d07bc1fd88bc10ebf69e27005552&s=8198ED3253AEECEC1475F0CE0000D0B3

如果对于矩阵求不熟悉的,可以移步这里:点击查看

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

962bd40735fae6cde273238477931a2243a70f32.jpeg?token=0f30c02aa8a45f3b4447f7e46c8c5302

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

值得注意的是,上述公式中包含逆矩阵,也就是说,这个方程只在逆矩阵存在的时候使用,也即是这个矩阵是一个方阵,并且其行列式不为0。

述的最佳w求解是统计学中的常见问题,除了矩阵方法外还有很多其他方法可以解决。通过调用NumPy库里的矩阵方法,我们可以仅使用几行代码就完成所需功能。该方法也称作OLS, 意思是“普通小二乘法”(ordinary least squares)。

数据格式为:

d31b0ef41bd5ad6e7ea7e18defeb2cddb6fd3c25.jpeg?token=8015cb0731f97247decb67e80c0c26b6&s=E9E23363CFE889700E75D40F0000A0C1

数据下载地址:数据集下载

第一列都为1.0,即x0。第二列为x1,即x轴数据。第三列为x2,即y轴数据。首先绘制下数据,看下数据分布。创建regression.py文件,编写代码如下:

0b55b319ebc4b74575fbc6f2a1dc0b118b821588.jpeg?token=4dfcdf3f49134bf9423e78e80f89f88a&s=E9E23367DAA7936C4E75FC0F0000E0C1

运行代码如下:

0d338744ebf81a4cb653396da70a755f242da6dc.jpeg?token=b148526959301d5c322db1d237b11fdf&s=3CA87C3251CA654102F1A4CA0000A0B1

通过可视化数据,我们可以看到数据的分布情况。接下来,让我们根据上文中推导的回归系数计算方法,求出回归系数向量,并根据回归系数向量绘制回归曲线,编写代码如下:

37d12f2eb9389b5023314655f515f0dbe6116e95.jpeg?token=b66974ebbf7672d8a0efbd3eeae6e437&s=E9E23367DAE6976C1C71FD0F0000E0C1

运行代码如下:

8c1001e93901213f854cc7be3bc723d72f2e957f.jpeg?token=66470665033029fa481d1000d9fcbf5e&s=7CAC387251DAE5C400F0A4CA000080B1

如何判断拟合曲线的拟合效果的如何呢?当然,我们可以根据自己的经验进行观察,除此之外,我们还可以使用corrcoef方法,来比较预测值和真实值的相关性。编写代码如下:

08f790529822720e873de70e14eb1f40f31fab7d.jpeg?token=4d2ffa35f952779a66822f8b347022c8&s=E9C233674BE8BF704E75F9120000C0C1

运行结果如下:

6f061d950a7b0208bd13d3470cf9e7d5562cc861.jpeg?token=a5ad68802aaccad4b2710a5689225552&s=E9C0AA429FA9B3680E6D540E0000A0C2

可以看到,对角线上的数据是1.0,因为yMat和自己的匹配是完美的,而YHat和yMat的相关系数为0.98。

最佳拟合直线方法将数据视为直线进行建模,具有十分不错的表现。数据当中似乎还存在其他的潜在模式。那么如何才能利用这些模式呢?我们可以根据数据来局部调整预测,下面就会介绍这种方法。

2、局部加权线性回归

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

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

aa18972bd40735fa18d11bb6f1711ab50f240846.jpeg?token=07cb6c99febf2976021184f501a1b52c

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

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

37d12f2eb9389b509e9ae57beb15f0dbe7116e5c.jpeg?token=2f7e164b3a4d03c6897193d61fff453b&s=7AAA306294E1C9095C5434C60000E0B1

这样我们就可以根据上述公式,编写局部加权线性回归,我们通过改变k的值,可以调节回归效果,编写代码如下:

95eef01f3a292df5e60b9505cc11496635a873ff.jpeg?token=4c70ff9c372a8f6212e880114b6bcca1&s=E9E23367DAA7A36E4C79FC0F0000E0C1

6f061d950a7b0208ef47039812f9e7d5562cc8e7.jpeg?token=af43c4b9f24ec5586bacd676c9052950&s=E9E23367D2B7B26C4EFDD50A0000A0C1

运行结果如下:

63d9f2d3572c11dfd747ace90c0777d6f603c208.jpeg?token=9e28cfe34a8a77971df3ed345442d758&s=5DAE3C7271BAE1CE465018DA0000E0B1

可以看到,当k越小,拟合效果越好。但是当k过小,会出现过拟合的情况,例如k等于0.003的时候。

喜欢点下关注,你的关注是我写作的最大支持

9a504fc2d56285356d339b8afecf63c0a6ef6374.jpeg?token=d1aa2d5aea916a1a8c9991d9edb1fcfc&s=3D12C45FCC74E64F4493DAA30300E01D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值