《机器学习实战》学习笔记-[11]-回归-前向逐步回归
来源:互联网 发布:网络桥架 编辑:程序博客网 时间:2024/05/03 13:30
《机器学习实战》学习笔记-[11]-回归-前向逐步回归
其他学习:你应该掌握的七种回归技术 7 Types of Regression Techniques you should know!
原理简介
(1)在特征较多时,我们面临降低维度分析的问题,也就是统计学中的缩减,去掉不重要的参数,对数据进行降维,根据在特定领域中的知识或是理论假设,选择其中一些可能更有意义的变量进行后续分析。但不是任何情况下我们都掌握这些先验信息,所以基于数据本身的特征提取方法应运而生。
(2)在 stepwise regression 中,提取哪些变量主要基于的假设是:在线性条件下,哪些变量组合能够解释更多的因变量变异,则将其保留。也就是那些参数的变化会更严重的影响到因变量(这些参数对因变量是主要影响因素)
(3)逐步线性回归优点:构建一个模型后,利用本算法找出重要的特征,及时停止对不重要特征的收集
具体操作方法有三种:
- Forward selection: 首先模型中只有一个单独解释因变量变异最大的自变量,之后尝试将加入另一自变量,看加入后整个模型所能解释的因变量变异是否显著增加(这里需要进行检疫,可以用 F-test, t-test 等等);这一过程反复迭代,直到没有自变量再符合加入模型的条件。
- Backward elimination: 与 Forward selection 相反,此时,所有变量均放入模型,之后尝试将其中一个自变量从模型中剔除,看整个模型解释因变量的变异是否有显著变化,之后将使解释量减少最少的变量剔除;此过程不断迭代,直到没有自变量符合剔除的条件。
- Bidirectional elimination: 这种方法相当于将前两种结合起来。可以想象,如果采用第一种方法,每加入一个自变量,可能会使已存在于模型中的变量单独对因变量的解释度减小,当其的作用很小(不显著)时,则可将其从模型中剔除。而第三种方法就做了这么一件事,不是一味的增加变量,而是增加一个后,对整个模型中的所有变量进行检验,剔除作用不显著的变量。最终尽可能得到一个最优的变量组合。
实现
'''机器学习实战-回归'''from numpy import *def loadDataSet(fileName): #general function to parse tab -delimited floats numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields dataMat = []; labelMat = [] fr = open(fileName) for line in fr.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,labelMatdef rssError(yArr,yHatArr): #yArr and yHatArr both need to be arrays return ((yArr-yHatArr)**2).sum()def regularize(xMat):#regularize by columns inMat = xMat.copy() inMeans = mean(inMat,0) #calc mean then subtract it off inVar = var(inMat,0) #calc variance of Xi then divide by it inMat = (inMat - inMeans)/inVar return inMatdef stepWise(xArr, yArr, eps=0.01, numIt=100): xMat = mat(xArr) yMat = mat(yArr).T # yMat归一化 yMean = mean(yMat, 0) yMat = yMat - yMean # xMat归一化 xMat = regularize(xMat) m, n = shape(xMat) # 返回迭代后的系数矩阵,每行为一次迭代,最后一行为本地迭代的最优 returnMat = zeros((numIt, n)) ws = zeros((n, 1)) wsTest = ws.copy() wsMax = ws.copy() for i in range(numIt): print(ws.T) #打印上次迭代的结果 lowestError = inf #初识化误差 for j in range(n): #迭代n个特征 for sign in [-1,1]: #对每个特征加上或减去步进值对比效果 wsTest= ws.copy() wsTest[j] += eps*sign yTest = xMat*wsTest rssErr = rssError(yMat.A,yTest.A) if rssErr < lowestError: lowestError = rssErr wsMax = wsTest ws = wsMax.copy() returnMat[i,:] = ws.T return returnMat测试
import osfrom numpy import *import matplotlib.pyplot as plt#导入训练数据集from ML_Learn.com.ML.Regression.Regres_Stepwise import stepWiseRegresxArr, yArr = stepWiseRegres.loadDataSet(os.getcwd() + '/resource/abalone.txt')ridegeWeights = stepWiseRegres.stepWise(xArr, yArr,0.01,200)
[[ 0. 0. 0. 0. 0. 0. 0. 0.]]
[[ 0. 0. 0. 0.01 0. 0. 0. 0. ]]
[[ 0. 0. 0. 0.02 0. 0. 0. 0. ]]
[[ 0. 0. 0. 0.03 0. 0. 0. 0. ]]
[[ 0. 0. 0. 0.04 0. 0. 0. 0. ]]
[[ 0. 0. 0. 0.05 0. 0. 0. 0. ]]
[[ 0. 0. 0. 0.06 0. 0. 0. 0. ]]
[[ 0. 0. 0.01 0.06 0. 0. 0. 0. ]]
[[ 0. 0. 0.01 0.06 0. 0. 0. 0.01]]
。。。。
[[ 0.05 0. 0.09 0.03 0.31 -0.64 0. 0.36]]
[[ 0.04 0. 0.09 0.03 0.31 -0.64 0. 0.36]]
以上
每次迭代中只改变一个wi 元素
最后
[[ 0.04 0. 0.09 0.03 0.31 -0.64 0. 0.36]]
可见w1和w6对目标值无影响,这两个特征值可以不需要,减少步长,增加迭代次数如0.001好5000,可以得到和最小二乘近似的结果。
【结论】
逐步线性回归优点:构建一个模型后,利用本算法找出重要的特征,及时停止对不重要特征的收集
- 《机器学习实战》学习笔记-[11]-回归-前向逐步回归
- [机器学习]前向逐步回归
- 机器学习-回归总结-标准回归,局部加权回归,岭回归,lasso,前向逐步回归
- 机器学习:线性回归、局部加权线性回归、岭回归、前向逐步回归
- 《机器学习实战》学习笔记---Logister回归
- 机器学习实战笔记5(logistic回归)
- 机器学习实战Logistic回归笔记
- 机器学习实战笔记-Logistic回归
- 机器学习实战笔记-树回归
- 机器学习实战 回归
- 《机器学习实战》学习笔记-[10]-回归-岭回归
- 《机器学习实战》学习笔记-[12]-回归-树回归
- 机器学习实战线性回归局部加权线性回归笔记
- 前向逐步回归
- 前向逐步回归
- 机器学习实战 第九章 树回归 学习笔记
- 《机器学习实战》学习笔记1-logistic回归
- 机器学习实战学习笔记9——Logistic回归
- 《机器学习实战》学习笔记-[10]-回归-岭回归
- 如何解决java.sql.Statement无法处理特殊字符以及容易被黑问题
- 连接小岛
- poj 2456 二分
- keil用JLink下载程序或调试出现“连接有缺陷的。。。”的警告解决
- 《机器学习实战》学习笔记-[11]-回归-前向逐步回归
- linux环境修改mysql密码
- TCP协议
- 【Python】argsort
- HDU 6053 TrickGCD(莫比乌斯反演)
- CSS文字动画平移
- hadoop2.7.3源码解析之hdfs删除文件全流程分析
- Stream 中的 求最大值,第一个值,任意一个值,是否含有匹配元素
- spring cloud Feign