通过前面的介绍,我们了解到求解惩罚性回归模型等价于求解一个优化问题,有大量的通用算法可以求解。这次介绍一个非常快速敏捷的算法——最小角回归(LARS)算法。LARS算法可以理解为一种改进的前向逐步回归算法。
前向逐步回归算法和最小角回归算法(LARS):
  前向逐步回归算法过程如下:
 将回归系数的所有值初始化为0
 在每一步使用已经选择的变量找到残差值
 确定哪个未使用的变量能够最佳的解释残差,将该变量加入选择变量中。
  LARS算法与前向逐步回归算法类似,LARS与前向逐步回归算法的主要差异是LARS在引入新属性时只是部分引入,引入属性过程并非不可逆。LARS算法过程如下:
 将回归系数的所有值初始化为0
 在每一步中,决定哪个属性与残差有最大关联
 如果关联为正,小幅度增加关联系数;关联未负,小幅度减少关联系数;
  下面以红酒数据集为例,介绍一下LARS算法:

import urllib.request, urllib.error, urllib.parse
import numpy
from sklearn import datasets, linear_model
from math import sqrt
import matplotlib.pyplot as plot#读取数据
target_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
data = urllib.request.urlopen(target_url)xList = []
labels = []
names = []
firstLine = True
for line in data:if firstLine:names = line.decode().strip().split(";")firstLine = Falseelse:#分号分割row = line.decode().strip().split(";")#读取标签labels.append(float(row[-1]))#移除标签row.pop()#特征转为浮点型floatRow = [float(num) for num in row]xList.append(floatRow)#读取数据规模nrows = len(xList)
ncols = len(xList[0])#计算均值和标准差
xMeans = []
xSD = []
for i in range(ncols):col = [xList[j][i] for j in range(nrows)]mean = sum(col)/nrowsxMeans.append(mean)colDiff = [(xList[j][i] - mean) for j in range(nrows)]sumSq = sum([colDiff[i] * colDiff[i] for i in range(nrows)])stdDev = sqrt(sumSq/nrows)xSD.append(stdDev)#数据标准化
xNormalized = []
for i in range(nrows):rowNormalized = [(xList[i][j] - xMeans[j])/xSD[j] for j in range(ncols)]xNormalized.append(rowNormalized)#标签数据标准化
meanLabel = sum(labels)/nrows
sdLabel = sqrt(sum([(labels[i] - meanLabel) * (labels[i] - meanLabel) for i in range(nrows)])/nrows)labelNormalized = [(labels[i] - meanLabel)/sdLabel for i in range(nrows)]#系数初始化
beta = [0.0] * ncols#初始化迭代系数矩阵
betaMat = []
betaMat.append(list(beta))#迭代参数
nSteps = 350
stepSize = 0.004
nzList = []for i in range(nSteps):#计算残差residuals = [0.0] * nrowsfor j in range(nrows):labelsHat = sum([xNormalized[j][k] * beta[k] for k in range(ncols)])residuals[j] = labelNormalized[j] - labelsHat#计算特征与残差的相关性corr = [0.0] * ncolsfor j in range(ncols):corr[j] = sum([xNormalized[k][j] * residuals[k] for k in range(nrows)]) / nrowsiStar = 0corrStar = corr[0]for j in range(1, (ncols)):if abs(corrStar) < abs(corr[j]):iStar = j; corrStar = corr[j]beta[iStar] += stepSize * corrStar / abs(corrStar)betaMat.append(list(beta))nzBeta = [index for index in range(ncols) if beta[index] != 0.0]for q in nzBeta:if (q in nzList) == False:nzList.append(q)nameList = [names[nzList[i]] for i in range(len(nzList))]print(nameList)
for i in range(ncols):#画迭代步数和残差相关性图coefCurve = [betaMat[k][i] for k in range(nSteps)]xaxis = range(nSteps)plot.plot(xaxis, coefCurve)plot.xlabel("Steps Taken")
plot.ylabel(("Coefficient Values"))
plot.show()

代码主要分为三部分:
  第一部分读入数据以及列名称,将数据转换为属性列表以及标签。
  第二部分对属性以及标签进行数据标准化(归一化)。
  第三部分对问题进行求解获取结果。这里因为上面已经对数据进行了归一化,所以不需要再有截距项。截距项一般是用于表示标签值与加权属性值之间的差异。

  LARS算法生成的结果如图所示,对图进行理解可以参考如下的方法:沿着迭代的方向想象有一个点,在该点上,一条垂直的线会穿过所有曲线,垂直线和系数曲线相交的值就是LARS算法在该步得到的系数。如果生成曲线需要350步,那么就生成350组系数集合。我们注意到对于前25步,只有一个系数值非零,第一个系数不为零的属性是酒精,在后此一段时间内,这是LARS回归唯一使用的变量。随着迭代步数的增多第二个变量开始出现,这样的过程一直持续到所有变量被包含到解中。
  那么350个解的集合中,到底哪个解最优呢?正如前面章节中说的,模型的性能是指在测试集上的性能。前面也介绍过预留测试集的方法,本节中使用10折交叉验证法决定部署使用的最佳系数集合。代码如下:

import urllib.request, urllib.error, urllib.parse
import numpy
from sklearn import datasets, linear_model
from math import sqrt
import matplotlib.pyplot as plot#读取数据
target_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
data = urllib.request.urlopen(target_url)xList = []
labels = []
names = []
firstLine = True
for line in data:if firstLine:names = line.decode().strip().split(";")firstLine = Falseelse:#分号分割row = line.decode().strip().split(";")#读取标签labels.append(float(row[-1]))#移除标签row.pop()#转为浮点型floatRow = [float(num) for num in row]xList.append(floatRow)#数据标准化nrows = len(xList)
ncols = len(xList[0])#计算均值和标准差
xMeans = []
xSD = []
for i in range(ncols):col = [xList[j][i] for j in range(nrows)]mean = sum(col)/nrowsxMeans.append(mean)colDiff = [(xList[j][i] - mean) for j in range(nrows)]sumSq = sum([colDiff[i] * colDiff[i] for i in range(nrows)])stdDev = sqrt(sumSq/nrows)xSD.append(stdDev)#特征数据标准化计算
xNormalized = []
for i in range(nrows):rowNormalized = [(xList[i][j] - xMeans[j])/xSD[j] for j in range(ncols)]xNormalized.append(rowNormalized)#标签数据标准化
meanLabel = sum(labels)/nrows
sdLabel = sqrt(sum([(labels[i] - meanLabel) * (labels[i] - meanLabel) for i in range(nrows)])/nrows)labelNormalized = [(labels[i] - meanLabel)/sdLabel for i in range(nrows)]#10折法
nxval = 10#迭代参数设置
nSteps = 350
stepSize = 0.004#初始化
errors = []
for i in range(nSteps):b = []errors.append(b)for ixval in range(nxval):#设置训练集和测试集idxTest = [a for a in range(nrows) if a%nxval == ixval*nxval]idxTrain = [a for a in range(nrows) if a%nxval != ixval*nxval]#定义测试集和训练集xTrain = [xNormalized[r] for r in idxTrain]xTest = [xNormalized[r] for r in idxTest]labelTrain = [labelNormalized[r] for r in idxTrain]labelTest = [labelNormalized[r] for r in idxTest]#训练LARSnrowsTrain = len(idxTrain)nrowsTest = len(idxTest)#初始化beta系数beta = [0.0] * ncols#初始化系数矩阵betaMat = []betaMat.append(list(beta))for iStep in range(nSteps):#计算残差residuals = [0.0] * nrowsfor j in range(nrowsTrain):labelsHat = sum([xTrain[j][k] * beta[k] for k in range(ncols)])residuals[j] = labelTrain[j] - labelsHat#计算特征和残差相关性corr = [0.0] * ncolsfor j in range(ncols):corr[j] = sum([xTrain[k][j] * residuals[k] for k in range(nrowsTrain)]) / nrowsTrainiStar = 0corrStar = corr[0]for j in range(1, (ncols)):if abs(corrStar) < abs(corr[j]):iStar = j; corrStar = corr[j]beta[iStar] += stepSize * corrStar / abs(corrStar)betaMat.append(list(beta))#计算均方误差for j in range(nrowsTest):labelsHat = sum([xTest[j][k] * beta[k] for k in range(ncols)])err = labelTest[j] - labelsHaterrors[iStep].append(err)cvCurve = []
for errVect in errors:mse = sum([x*x for x in errVect])/len(errVect)cvCurve.append(mse)minMse = min(cvCurve)
minPt = [i for i in range(len(cvCurve)) if cvCurve[i] == minMse ][0]
print("Minimum Mean Square Error", minMse)
print("Index of Minimum Mean Square Error", minPt)xaxis = range(len(cvCurve))
plot.plot(xaxis, cvCurve)plot.xlabel("Steps Taken")
plot.ylabel(("Mean Square Error"))
plot.show()


  通过模型输出结果可以看出,最小值在低311步出现,所以选择311步的系数最为模型系数进行部署。
  
  

All things are difficult before they are easy.

【Python机器学习预测分析算法实战五】最小角回归LARS相关推荐

  1. 【Python机器学习预测分析算法实战三】预测模型性能评估及影响因素

      选择并拟合一个预测算法的最终目标是获得最佳可能的效果.能够达到的性能取决于3方面的因素:问题的复杂性,模型算法的复杂性,可用数据的丰富程度. 理解函数逼近   预测问题包括两种变量:   第一种变 ...

  2. 《Python机器学习——预测分析核心算法》——2.2 分类问题:用声纳发现未爆炸的水雷...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.2节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  3. 《Python机器学习——预测分析核心算法》——2.4 基于因素变量的实数值预测:鲍鱼的年龄...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.4节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  4. python分类预测_《Python机器学习——预测分析核心算法》——2.6 多类别分类问题:它属于哪种玻璃...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.6节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  5. python模型预测_《Python机器学习——预测分析核心算法》——1.5 构建预测模型的流程...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第1章,第1.5节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  6. 《Python机器学习——预测分析核心算法》——2.5 用实数值属性预测实数值目标:评估红酒口感...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.5节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  7. 惩罚线性回归---Python机器学习:预测分析核心算法

    惩罚线性回归 参考教材:Python机器学习预测分析核心算法,书中代码较为过时,借用sklearn等工具包进行了重写. 实践中遇到的绝大多数预测分析(函数逼近)问题,惩罚线性回归和集成方法都具有最优或 ...

  8. 最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )

    Lasso回归模型,是常用线性回归的模型,当模型维度较高时,Lasso算法通过求解稀疏解对模型进行变量选择.Lars算法则提供了一种快速求解该模型的方法.Lars算法的基本原理有许多其他文章可以参考, ...

  9. python数据预测模型算法_《python机器学习—预测分析核心算法》:构建预测模型的一般流程...

    参见原书1.5节 构建预测模型的一般流程 问题的日常语言表述->问题的数学语言重述 重述问题.提取特征.训练算法.评估算法 熟悉不同算法的输入数据结构: 1.提取或组合预测所需的特征 2.设定训 ...

最新文章

  1. 如何使用代码美化器Uncrustify (How to use code beautifier Uncrustify)
  2. 20051020:该办宽带了
  3. 掌握后可为孩子收藏的MySQL入门全套
  4. Tell me why -- Declan Galbraith
  5. CCF NOI1032 菱形
  6. 三菱melsec-a系列plc的指令与编程_三菱Q系列PLC定时器、计数器结构化编程基础
  7. MySQL的存储函数与存储过程的区别
  8. 江苏省徐州市谷歌高清卫星地图下载(百度网盘离线包下载)
  9. win7计算机重启遇到错误,安装Win7系统过程出现计算机意外地重新启动或遇到错误提示的解决方法...
  10. 实时数据采集-免费实时数据采集软件
  11. 安规的XY电容器件作用
  12. python tokenize怎么用_tokenize -- 对 Python 代码使用的标记解析器 — Python 3.7.9 文档...
  13. 算法工程师也有35岁危机吗?
  14. java注解和反射详解
  15. 贵卅大学计算机研究生院导师,贵州大学机械工程学院研究生导师:罗绍华
  16. php游戏对接,php游戏
  17. 计算机cpu散热方式,调整电脑CPU散热风扇转速的简单方法【图文】
  18. Python 印章代码(附有解析)
  19. 中国医学史(二--医药的起源)
  20. 记录+亲测+FastAdmin使用导入功能

热门文章

  1. logTracker错误日志跟踪组件(二)
  2. 判定图中存在回路java_图示电路中二极管为理想二极管,请判断它是否导通,并求出 u 0 。 (7.0分)_学小易找答案...
  3. 您需要最新版本的Outlook才能使用此数据库-MacOS的Outlook
  4. python数据分析实战:生存分析与电信用户流失预测
  5. 大兴线各站名均有特殊含义,给大家普及一下!
  6. ​​【​观察】萨提亚为微软中国定下主基调 平台价值释放与生态伙伴共赢
  7. TNF拮抗剂的结构、功能与结核感染_Wallis2008
  8. 互联网晚报 | 9月25日 | 辉瑞公司CEO新冠检测再次呈阳性;​央视揭秘“羊了个羊”通关诈骗陷阱;特斯拉变相降价8000元?...
  9. Islands UVA - 1665
  10. 大数据告诉你,其实中国电影票房的最强锦鲤,不是吴京