向前逐步回归

article/2025/9/3 7:09:39

向前逐步回归

我们在进行拟合的时候,没有必要将所有变量都引入到我们的函数之中,这种操作往往会导致过拟合,而过拟合带来的致命影响就是泛化能力差,最小二乘法估计参数的时候无法终止学习的过程。向前逐步回归的引入则可以控制学习过程中出现的过拟合,它是对最小二乘法的一种优化改进。其基本思想就是由少到多地向模型中引入变量,每次增加一个,直到没有可以引入变量为止,最后通过比较在预留样本上计算出的错误进行模型的选择。
参考连接:https://www.csdn.net/tags/NtzaUg3sNTc4NjktYmxvZwO0O0OO0O0O.html

这里我们用到的是葡萄酒测试集:下载链接如下https://archive.ics.uci.edu/ml/datasets/Wine+Quality

#导入要用到的各种包和函数
import numpy as np
import pandas as pd
from sklearn import datasets,linear_model
from math import sqrt
import matplotlib.pyplot as plt
#读入要用到的红酒数据集
wine_data = pd.read_csv('winequality-red.csv',sep=';',header=0,encoding='utf-8')
wine_data.head()
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality
07.40.700.001.90.07611.034.00.99783.510.569.45
17.80.880.002.60.09825.067.00.99683.200.689.85
27.80.760.042.30.09215.054.00.99703.260.659.85
311.20.280.561.90.07517.060.00.99803.160.589.86
47.40.700.001.90.07611.034.00.99783.510.569.45
#查看红酒数据集的统计信息
wine_data.describe()
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality
count1599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.000000
mean8.3196370.5278210.2709762.5388060.08746715.87492246.4677920.9967473.3111130.65814910.4229835.636023
std1.7410960.1790600.1948011.4099280.04706510.46015732.8953240.0018870.1543860.1695071.0656680.807569
min4.6000000.1200000.0000000.9000000.0120001.0000006.0000000.9900702.7400000.3300008.4000003.000000
25%7.1000000.3900000.0900001.9000000.0700007.00000022.0000000.9956003.2100000.5500009.5000005.000000
50%7.9000000.5200000.2600002.2000000.07900014.00000038.0000000.9967503.3100000.62000010.2000006.000000
75%9.2000000.6400000.4200002.6000000.09000021.00000062.0000000.9978353.4000000.73000011.1000006.000000
max15.9000001.5800001.00000015.5000000.61100072.000000289.0000001.0036904.0100002.00000014.9000008.000000
#定义从输入数据集中区指定列作为训练集和测试集的函数(从取1列一直到取11列)
def xattrSelect(x,idxSet):xOut = []for row in x:xOut.append([row[i] for i in idxSet])return(xOut)xList = [] #构造用于存放属性集的列表
labels = [float(label)for label in wine_data.iloc[:,-1].tolist()]#提取wine_data中的标签值放入列表中
names = wine_data.columns.tolist() #提取出wine_data中所有属性的名称并放入列表中
for i in range (len(wine_data)):xList.append(wine_data.iloc[i,0:-1])#列表xList中的每个元素对应着wine_data中除去标签的每一行#将原始数据集划分成训练集占(2/3),测试集占(1/3);
indices = range(len(xList))xListTest = [xList[i] for i in indices if i%3 == 0]
xListTrain = [xList[i] for i in indices if i%3 != 0]
labelsTest = [labels[i] for i in indices if i%3 == 0]
labelsTrain = [labels[i] for i in indices if i%3 != 0]attributeList = [] #构造用于存放属性索引的列表
index = range(len(xList[1]))#index用于下面代码中的外层for循环
indexSet =set(index) #构造由names中的所有属性对应的索引构成索引集合
oosError = []#构造用于存放下面代码中内层for循环每次结束后最小的RMSE(均方根误差)for i in index:attSet = set(attributeList)attTrySet = indexSet - attSet #构造由不在attributeList中的属性索引组成的集合attTry = [ii for ii in attTrySet] #构造由在attTryz中的属性索引组成的列表errorList = []attTemp = []for iTry in attTry:attTemp = [] + attributeListattTemp.append(iTry)#调用attrSelect函数从xListTrain和xListTest中选取指定的列构成暂时的训练集与测试集xTrainTemp = xattrSelect(xListTrain, attTemp)xTestTemp = xattrSelect(xListTest,attTemp)#将需要用到的训练集进而测试集都转化成数组对象xTrain = np.array(xTrainTemp)yTrain = np.array(labelsTrain)xTest = np.array(xTestTemp)yTest = np.array(labelsTest)#使用scikit包训练线性回归模型wineQModel = linear_model.LinearRegression()wineQModel.fit(xTrain,yTrain)#计算在测试集上的RMSErmsError = np.linalg.norm((yTest-wineQModel.predict(xTest)),2)/sqrt(len(yTest))errorList.append(rmsError)attTemp = []iBest = np.argmin(errorList)  #选出errorList中的最小值对应的新索引attributeList.append(attTry[iBest]) #利用新索引iBest将attTry中对应的属性索引添加到attributeListtoosError.append(errorList[iBest]) #将errorList中的最小值添加到oosError列表中print("Out of sample error versus attribute set size")
print(oosError)
print('\n'+'Best attribute indices')
print(attributeList)
namesList = [names[i]  for i in attributeList]
print("\n"+"Best attribute names")
print(namesList)
Out of sample error versus attribute set size
[0.8162067605843373, 0.7638643857209025, 0.7638643857209025, 0.7638281646287916, 0.7570245479523805, 0.755096811807613, 0.7402464046416789, 0.7095983105997431, 0.7078841064360114, 0.673980209520692, 0.656971757677521, 0.6573909869011335]Best attribute indices
[0, 1, 1, 3, 4, 5, 6, 7, 8, 9, 10, 2]Best attribute names
['fixed acidity', 'volatile acidity', 'volatile acidity', 'residual sugar', 'chlorides', 'free sulfur dioxide', 'total sulfur dioxide', 'density', 'pH', 'sulphates', 'alcohol', 'citric acid']
# 绘制由不同数量的属性构成的线性回归模型在测试集上的RMSE与属性数量的关系图像
x = range(len(oosError))
plt.plot(x,oosError, 'k')
plt.xlabel('Number of Attributes')
plt.ylabel('Error(RMS)')
plt.show()

在这里插入图片描述

#绘制由最佳数量的属性构成的线性回归模型在测试集上的误差分布直方图
indexBest = oosError.index(min(oosError))
attributesBest = attributeList[1:(indexBest+1)]#attributesBests#调用xattrSelect函数从xListTrain和xListTest中选取最佳数量的列暂时的训练集和测试集
xTrainTemp = xattrSelect(xListTrain,attributesBest)
xTestTemp = xattrSelect(xListTest,attributesBest)
xTrain = np.array(xTrainTemp)#将xTrain转化成数组对象
xTest = np.array(xTestTemp)#将xTrain转化成数组对象#训练模型并绘制直方图
wineQModel = linear_model.LinearRegression()
wineQModel.fit(xTrain,yTrain)
errorVector = yTest-wineQModel.predict(xTest)
plt.hist(errorVector)
plt.xlabel('Bin Boundaries')
plt.ylabel('Counts')
plt.show()#绘制红酒口感实际值与预测值之间的散点图
plt.scatter(wineQModel.predict(xTest),yTest,s=100,alpha=1)
plt.xlabel("Predict Taste Score")
plt.ylabel("Actual Taste Score")
plt.show()

在这里插入图片描述

在这里插入图片描述


http://chatgpt.dhexx.cn/article/ey5owWyV.shtml

相关文章

SPSSAU中逐步回归法——探索分析单支股票数据(实践)

数据说明: 还是选择万兴科技的股票数据来做回归分析,和《股票时序分析和时序模型(实践)》这篇文章使用数据一致。需要说明由于spssau免费账号最多输入50项数据,所以使用的都是近50期数据。 spssau上的相关分析图 pyth…

多元逐步回归算法

先谈一下个人对多元逐步回归的理解:多元逐步回归的最本质的核心是最小二乘原理,本方法中调用smf方法。# encoding: utf-8""" 功能:多元逐步回归 描述:基于python实现多元逐步回归的功能 作者:CHEN_C_W …

【模型开发】逐步回归

1.定义 当变量中含有对被解释变量影响不大的解释变量时,可能因为误差平方和的自由度减小而使方差的估计增大,从而影响回归预测的精度,适当的选择一个变量建立一个最优的回归方程十分重要。 逐步回归(Stepwise Regression&#xff…

matlab逐步回归分析法,天大matlab大作业逐步回归分析方法.doc

天大matlab大作业逐步回归分析方法.doc 逐步回归分析方法在实际中,影响Y的因素很多,这些因素可能存在多重共线性(相关性),这就对系数的估计带来不合理的解释,从而影响对Y的分析和预测。“最优”的回归方程就是包含所有对Y有影响的…

【R语言数据科学】(十九):变量选择(一)逐步回归法

【R语言数据科学】 🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编程基础、R语言可视化、R…

4.1程序控制流图

程序控制流图,简称流图,是对程序流程图进行简化后得到的,它可以更加突出的表示程序控制流的结构。 控制流图中包括两种图形符号: 节点控制流线 复合条件要分解为简单条件 判定节点(谓词节点) 由判定节点发…

流程控制(上)

大家好,我是Python领域的博主。 如果你是编程爱好者可以小编一起学习,在这里我每天都会发Python的基础知识,以及相关的代码。 如果文章有什么错误的地方,请不吝赐教。 觉得博主文章写的还错的话,请三连支持一下博主哦 …

使用soot和graphviz画Java的控制流图

辛苦两天了,啥也不说,先来张图: 看着可真漂亮,O(∩_∩)O哈哈~ 实验环境是Ubuntu。 1.JDK的版本必须是1.7或者以下,JDK1.8不行,总会报错, 2.下载sootclasses-2.5.0.jar包:http://d…

软件测试----------------- 控制流图 圈复杂度 独立路径 测试用例

最近在学软件测试,学到了画,控制流图 圈复杂度 独立路径 测试用例,这里,有些不理解,就网上查了下,发现好多老哥写错了,大佬写的甚至收费79。 我试着写写,如果有不足的,大…

LLVM CFG控制流图可视化

LLVM CFG控制流图可视化 准备 安装必要组件 sudo apt-get install -y graphviz-doc libgraphviz-dev graphviz示例程序 /// file 1.c int x 10; int y 11; int main(){int z 12; for (int i 0;i < 10;i){z * x * y;} return 0; }生成LLVM IR 文件 clang -S -em…

白盒测试--控制流测试(白盒测试,逻辑覆盖,路径测试(基路径测试、循环测试),控制流图)

文章目录 白盒测试概念白盒测试方法--控制流测试语句覆盖判定覆盖&#xff08;分支覆盖&#xff09;条件覆盖判定-条件覆盖条件组合覆盖路径覆盖 路径测试基路径测试循环测试 控制流图基本控制流图复合逻辑下的控制流图图矩阵环形复杂度 白盒测试概念 又叫结构测试&#xff0c…

控制流分析(Control Flow Analysis)

控制流(Control Flow)&#xff1a;操作的序列 控制流分析(Control Flow Analysis)&#xff1a;通过分析程序去发现每一过程内控制流层次结构。 控制流分析的原因&#xff1a; 控制流分析(CFA)能够帮助我们理解控制流图&#xff08;control-flow graphs,CFG&#xff09;的结构…

程序流图画法详解

程序流图一般是软件评测师考试中的第一道大题&#xff0c;同时也是必考大题&#xff0c;多层嵌套的循环程序绘制流程图时十分繁琐&#xff0c;本人在经过练习真题以及查阅资料后有了一些绘制控制流图的小经验&#xff0c;如有不对请指出。下面以2017年的软件评测师下午第一套真…

对Python控制流图(Control Flow Graph)-(CFG)的一些探索

对Python控制流图&#xff08;Control Flow Graph&#xff09;-&#xff08;CFG&#xff09;的一些探索 粗浅的了解 1.定义 控制流图(Control Flow Graph, CFG)也叫控制流程图&#xff0c;是一个过程或程序的抽象表现&#xff0c;是用在编译器中的一个抽象数据结构&#xff…

中间表示- 控制流图

基本概念 基本块&#xff1a;是语句的一个序列&#xff0c;从第一条执行到最后一条 不能从中间进入&#xff0c;不能从中间退出&#xff0c;即跳转指令只能出现在最后 控制流图&#xff1a;控制流图是一个有向图G(V&#xff0c;E) 节点V&#xff1a;是基本块边E&#xff1a…

控制流图分类

The if Statement if (x < y) {y 0;x x 1; } else {x y; } if (x < y) {y 0;x x 1; } The if-return Statement if (x < y) {return; } print (x); return; 注意&#xff1a;2到3 没有边 while and for Loops x 0; while (x < y) {y f (x, y);x x …

【浅析】程序分析中的数据流图(data flow graph)和控制流图(control flow graph)

文章目录 前言1、data flow graphs2、Control Flow Graph小结 前言 创作开始时间&#xff1a;2021年4月9日09:17:11 如题。看了一些网页文献&#xff0c;大概对这两种流图有了一定的理解&#xff0c;这里简单地记录一下&#xff0c;尤其是一些例子&#xff0c;感觉比较直观。…

软件测试之控制流图以及环形复杂度独立路径求解问题

首先需要明确的是&#xff0c;控制流图并不等于流程图&#xff0c;可以理解为控制流图的出现是为了后续的环形复杂度的计算和写出独立路径和配以相应的测试用例。 所以控制流图是核心&#xff0c;画图的时候务必谨慎再谨慎&#xff0c;要不然可能你后面的全部崩盘。 控制流图考…

【程序分析】函数调用图 | 控制流图 | 过程间控制流图 | 数据流图 | 值流图

CG&#xff08;call graph&#xff09;和CFG&#xff08;control-flow graph&#xff09;都是表示程序控制流的有向图。 1 函数调用图&#xff1a;CG&#xff08;call graph&#xff09; 一个CG是表示整个程序中方法&#xff08;函数&#xff09;之间调用关系的图&#xff0c…

LLVM CFG/DFG控制流图和数据流图可视化

1.引言 由于最近在学习数据流分析的相关知识&#xff0c;记录一下利用LLVM生成CFG和DFG的学习过程&#xff0c;参考文献和网址放在文章末尾。 2.实验环境 操作系统&#xff1a;Ubuntu 20.04.3 LTS 64bit&#xff1b; 硬件设备&#xff1a;Intel Celeron(R) CPU N34…