首页 > 编程知识 正文

多元线性回归方法,线性逐步回归分析

时间:2023-05-04 09:35:26 阅读:274966 作者:169

前言

前一篇博客,我们使用了缩减法中的岭回归来改进线性回归算法。其好处是能够减少过拟合,增大模型方差减小偏差。此博客将使用另一种方法对线性回归算法进行改进,其主要目的是找出对结果影响最大的几个属性值。

背景

和岭回归一样,lasso是也是属于缩减法的一种。但是由于其计算比较复杂,繁琐,我们使用另外一个简单的算法进行替代,这个算法就是前向逐步算法,该算法可以达到和lasso算法几乎一样的结果。

这里前向逐步算法主要使用了贪心算法的思想,即每进行一步都要减少误差,直到最后迭代结束。

前向逐步算法原理分析

该算法使用两层循环,第一层是迭代次数,第二层是属性值。

主要步骤如下:

对数据进行标准化处理第一层循环迭代次数:初始化一个损失值F第二层属性值个数:对每个属性进行添加(减少)步长计算修改之后的属性值乘以数据,即计算当前预测值计算预测值和实际值的差平方和B如果B小于F:则修改成功,保持修改、否则:不进行修改

其主要步骤就是在每次迭代中,对每个属性值进行修改,然后使用修改后的属性值参数进行预测,通过计算差平方和,来判定修改是否有利于减少误差,再决定是否进行此次修改。

就这样一步一步的去减少误差,总的方向是向着减少误差的方向前进,所以该算法命名为 前向逐步算法

源代码解析 1. 加载数据 #加载数据def LoadData(filename): dataMat = [] labelMat = [] with open(filename) as f: numFeat = len(f.readline().split('t'))-1#这里会导致忽略第一个数据 f.seek(0)#避免第一条数据丢失 for line in f.readlines(): lineArr = [] curLine = line.strip().split('t') for i in range(numFeat): lineArr.append(float(curLine[i])) dataMat.append(lineArr) labelMat.append(float(curLine[-1])) return dataMat,labelMat

这里导入数据的处理时,将数据的前八个属性放入到dataMat列表中,将输出值放入到labelMat列表中。

这里我们看一下数据格式:

红色是属性值,共有八个属性,黄色是值。

关于数据的具体含义在这里不做赘述,将数据换成其他也是能够使用

2. 损失值计算 ## 损失值计算def rssError(yMat,yTest): result = np.sum(np.power((yMat-yTest),2),0) return result

这里就是差平方和公式,用来计算预测值和真实值之间的误差

3. 主方法,前向逐步减少误差 def stageWise(xArr,yArr,eps=0.01,numIt=300): xMat = np.mat(xArr);yMat = np.mat(yArr).T yMean = np.mean(yMat,0) # 数据标准化 xMean = np.mean(xMat,0) yMat = yMat-yMean xVar = np.var(xMat,0) xMat = (xMat-xMean)/xVar # m,n = np.shape(xMat) returnMat = np.zeros((numIt,n)) ws = np.zeros((n,1));wsTest = ws.copy();wsMax = ws.copy() for i in range(numIt): lowestError = np.power(10,5)#初始化一个最大值 for j in range(n): for sign in [-1,1]: wsTest = ws.copy() wsTest[j]+=eps*sign yTest = xMat*wsTest rssE = rssError(yMat.A,yTest.A) #print("rssE:",rssE) if rssE<lowestError: lowestError=rssE wsMax = wsTest ws = wsMax.copy() returnMat[i,:] = ws.T print("第{}次优化,ws.T={}".format(i+1,ws.T)) return returnMat 函数的参数分别是 数据、真实值、步长、迭代次数我们对数据进行标准化,这里需要留意一下,我们之间大都是针对分类数据进行标准化,这次对于非分类数据集进行标准化时,输出值也需要进行变化。接下来是第一层循环,循环次数是迭代数然后是第二层循环,循环次数是属性值个数对于每个属性值,我们都对他进行添加一个步长或者减少一个步长,再判定是否有助于减小误差。若误差值相比上一次循环有所减小,则修改成功。否则不进行修改。

输出:

4. 使用matplotlib显示属性参数变化 ## 将权值的变化显示在图像上def showchange(returnMat,n): fig = plt.figure() ax = fig.add_subplot(1,1,1) colors = ['red','green','block','blue','yellow','pink'] print(np.shape(returnMat[:,1])) for i in range(n): ax.plot(range(300),returnMat[:,i],label='属性{}'.format(i+1)) ax.legend(loc='lower left',framealpha=0.2) plt.show()

这里我们循环300次,来输出各个属性参数值的变化情况

从图像中我们能够看到,这些属性的变化情况,其中属性6和属性8的绝对值最大,其次是属性5.

属性2和属性7始终是0.

属性1、属性3、属性4的值变换程度不大

5. 结果分析

从结果中我们能够看到,属性2和属性7的值始终为0,也就是说这两个属性对于我们最终值得预测,不起任何作用,完全可以摒弃掉。

属性5、属性7、属性8 的参数值比较大,对于结果的预测作用也比较大。如果我们要从这8个属性值中选则三个属性,那么毫无疑问,就选这三个属性参数。

总结

主成分分析法的文章不知道大家看了没有,该方法也可以用于筛选对结果预测产生最大影响的属性值。本文的前向逐步线性回归模型,其最大的优点就是能够帮助我们判断哪些属性对于我们结果值产生的影响比较大,哪些几乎不产生什么影响。这样也会让我们做一些调整,适当的放弃影响较小的属性值,会大大减少我们搜集数据时的工作量。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。