前言

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

背景

和岭回归一样,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).TyMean = np.mean(yMat,0)# 数据标准化xMean = np.mean(xMat,0)yMat = yMat-yMeanxVar = 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*signyTest = xMat*wsTestrssE = rssError(yMat.A,yTest.A)#print("rssE:",rssE)if  rssE<lowestError:lowestError=rssEwsMax = wsTestws = wsMax.copy()returnMat[i,:] = ws.Tprint("第{}次优化,ws.T={}".format(i+1,ws.T))return returnMat
  1. 函数的参数分别是 数据、真实值、步长、迭代次数
  2. 我们对数据进行标准化,这里需要留意一下,我们之间大都是针对分类数据进行标准化,这次对于非分类数据集进行标准化时,输出值也需要进行变化。
  3. 接下来是第一层循环,循环次数是迭代数
  4. 然后是第二层循环,循环次数是属性值个数
  5. 对于每个属性值,我们都对他进行添加一个步长或者减少一个步长,再判定是否有助于减小误差。
  6. 若误差值相比上一次循环有所减小,则修改成功。否则不进行修改。

输出:

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. 【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集

    各位同学好,今天我和大家分享一下python机器学习中线性回归算法的实例应用,并介绍正则化.岭回归方法.在上一篇文章中我介绍了线性回归算法的原理及推导过程:[机器学习](7) 线性回归算法:原理.公式 ...

  2. 回归模型-线性回归算法

    线性回归算法 问题分为有监督问题和无监督问题两类 当用到标签来划分的时候就是有监督问题,当没有用标签值的时候就是无监督问题. 线性回归求解的结果是值 比如: 根据工资和年龄来预测出一个具体的值,根据工 ...

  3. python 预测算法_通过机器学习的线性回归算法预测股票走势(用Python实现)

    本文转自博客园,作者为hsm_computer 原文链接:https://www.cnblogs.com/JavaArchitect/p/11717998.html在笔者的新书里,将通过股票案例讲述P ...

  4. c语言线性分类回归库 台湾,最全的线性回归算法库总结—— scikit-learn篇

    原标题:最全的线性回归算法库总结-- scikit-learn篇 本文建议收藏后食用更加美味 scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析,本文就对这些类库 ...

  5. 机器学习算法:scikit-learn 线性回归算法总结

    写在前面 从一开始的课题需要重新整理XGBoost,到现在整理机器学习算法的知识将近一个礼拜了,希望自己能一直坚持下去~ 线性回归在机器学习算法中算是一个比较简单基础的算法.线性回归的目的是要得到输出 ...

  6. 多元线性回归算法预测房价——Excel、jupyter+sklearn

    嘿!我是目录 一.多元线性回归 1. 定义 2. 数据清洗 2.1 缺失值处理 2.2 异常值(离群点)处理 3. 特征共线性问题 二.用Excel做房价预测线性回归 1. 配置Excel 2. 完善 ...

  7. 通过机器学习的线性回归算法预测股票走势(用Python实现)

    在本人的新书里,将通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得.这里给出以线性回归算法预测股票的案例,以此讲述通过Python的sklearn ...

  8. 机器学习算法 10 —— HMM模型(马尔科夫链、前向后向算法、维特比算法解码、hmmlearn)

    文章目录 系列文章 隐马尔科夫模型 HMM 1 马尔科夫链 1.1 简介 1.2 经典举例 2 HMM简介 2.1 简单案例 2.2 案例进阶 问题二解决 问题一解决 问题三解决 3 HMM模型基础 ...

  9. Python手写线性回归算法

    作者 | 苏南下 来源 | 机器会学习ML(ID:AI_Learning007) 摘要:通俗易懂介绍线性回归算法,并 Python 手写实现. 之前我们介绍了:kNN 算法,主要用于解决分类问题,也可 ...

最新文章

  1. python functools.wraps functools.partial实例解析
  2. rpm 安装 忽略依赖_CentOS 7 安装 MySQL 5.7 详细教程及常见问题
  3. python unicode编码书写方式_python 中文编码 小结 ,json读写,str转换unicode,文字比较...
  4. 解决Maven打包怪异异常:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:2.6:resource...
  5. 曲线抽稀 java_Python实现曲线点抽稀算法
  6. 05模块-barcode【条码扫描】
  7. 大规模知识图谱预训练模型及电商应用
  8. Linux命令之目录和文件操作
  9. 微信授权获取基本信息java_Java微信网页授权授权获取用户基本信息
  10. arcgis栅格数据绘制等值线_ArcGIS教程:绘制等值线的工作原理
  11. 深入分析一个经典的单片机供电电路
  12. LTE-5G学习笔记17--COMP技术讲解
  13. 通过Navicat for MySQL导入数据时,日期时间错误问题解决办法
  14. 链接如何生成二维码?怎样创建一个网址二维码?
  15. 父爱动画代码python_情人节锦囊:简单的python表白程序(动画效果)
  16. Smali语法学习三
  17. OpenModelica仿真RLC电路
  18. 数据库中的视图理解和优点介绍
  19. 计算机组成原理-组成篇(下)
  20. adprw指令教程_三菱介绍FX3U新增指令ADPRW

热门文章

  1. micropython gui_T-Watch手表初试micropython之电子秤教程
  2. php机器代出价,php - PHP/MySQL自动出价系统
  3. UML建模详解(1)—初识UML建模
  4. 手机通讯录java首字母排序,Android联系人按拼音排序以及按汉字首字母或全拼搜索...
  5. 中南大学信息与通信工程专业研究生入学考试计算机网络试题2001答案,中南大学信息与通信工程专业研究生入学考试计算机网络试题.doc...
  6. 序列标注 | (5) 命名实体识别技术综述
  7. 理解设计模式——工厂模式
  8. 27 岁学编程是不是太晚了
  9. jenkins部署 java项目到远程 windows服务器
  10. android源生Browser分析---APP层基本架构