基本算法——回归

本节将通过分析能源效率数据集(TsanasXifara2012)学习基本的回归算法。我们将基

于建筑的结构特点(比如表面、墙体与屋顶面积、高度、紧凑度)研究它们的加热与冷却负载要

求。研究者使用一个模拟器设计了12种不同的房屋配置,这些房屋配置通过改变18种建筑特征得

出,他们总共模拟了768种建筑。

我们的首要目标是系统分析每种建筑特征对目标变量——加热或冷却负载——产生的影响。

第二个目标是比较经典线性回归模型相对于其他方法(比如SVM回归、随机森林、神经网络)的

性能。这个任务中,我们将使用Weka库。

创建工程

接着使用上一篇文章的工程:

加载数据

        // 加载数据
        CSVLoader loader = new CSVLoader();
        loader.setFieldSeparator(",");  // 设置CSV文件的字段分隔符为逗号
        loader.setSource(new File(PATH));  // 设置数据源为CSV文件
        Instances data = loader.getDataSet();  // 从CSV文件中加载数据集

分析属性

进行属性分析之前,先了解要处理什么。总共有8个属性描述建筑特征,有两个目标变量:

heatingcooling

X1 ——相对密实性
X2 ——表面积
X3 ——墙体面积
X4 ——屋顶面积
X5 ——总体高度
X6 ——方向
X7 ——玻璃窗面积
X8 ——玻璃窗区域分布
Y1 ——加热负载
Y2 ——冷却负载

创建与评估回归模型

首先,在特征位置设置分类属性,为加热负载建立学习模型。第二个目标变量(冷却负载)现在可以移除:

        /*
         * 构建回归模型
         */
        // 设置类别索引为Y1(加热负荷),即目标变量
        data.setClassIndex(data.numAttributes() - 2);  // 设置类别索引为倒数第二个属性,表示Y1
        // 移除最后一个属性Y2,因为Y2是另一个目标变量,我们只处理Y1
        Remove remove = new Remove();
        remove.setOptions(new String[]{"-R", String.valueOf(data.numAttributes())});  // 移除最后一个属性
        remove.setInputFormat(data);  // 设置输入格式
        data = Filter.useFilter(data, remove);  // 应用过滤器,移除最后一个属性

线性回归

首先,使用LinearRegression类创建一个基本的线性回归模型。正如在分类示例中所做的

那样,先初始化一个新模型实例,传递参数与数据,并调用buildClassifier(Instances)方 法:

        // 构建线性回归模型
        LinearRegression model = new LinearRegression();
        model.buildClassifier(data);  // 使用数据训练线性回归模型
        System.out.println(model);  // 输出线性回归模型的详细信息

结果如下:

Y1 =

    -64.774  * X1 +
     -0.0428 * X2 +
      0.0163 * X3 +
     -0.089  * X4 +
      4.1699 * X5 +
     19.9327 * X7 +
      0.2038 * X8 +
     83.9329

线性回归模型构建了一个函数,它把输入变量线性组合在一起,对加热负载进行评估。特征

前面的数字解释特征对目标变量的影响:符号表示正面影响或负面影响,而大小对应于影响程度。

比如特征X1(相对紧凑度),它与加热负载是负相关的,而玻璃窗面积与加热负载是正相关的。

这两个特征也对最后加热负载的评估有明显影响。

使用交叉验证技术可以对模型性能做类似评估。 做10折交叉验证(10-fold cross-validation)如下:

        // 10折交叉验证
        Evaluation evaluation = new Evaluation(data);  // 创建评估对象
        evaluation.crossValidateModel(model, data, 10, new Random(1), new String[]{});  // 执行10折交叉验证
        System.out.println(evaluation.toSummaryString());  // 输出交叉验证的概要信息
        double[] coefficients = model.coefficients();  // 获取线性回归模型的系数

结果如下:

Correlation coefficient                  0.956 
Mean absolute error                      2.0923
Root mean squared error                  2.9569
Relative absolute error                 22.8555 %
Root relative squared error             29.282  %
Total Number of Instances              768     

回归树

另一个方法是构建一组回归模型,每一个模型对应于数据中与其自身相关的部分。图3-5

示了回归模型与回归树之间的主要不同。回归模型指的是一个与所有数据达到最好拟合的独立模

型;而回归树是一组回归模型,每个模型只对一部分数据进行建模。

Weka中的M5类用于实现回归树。创建模型时,遵从步骤与前面一样:初始化模型、传递参

数与数据、调用buildClassifier(Instances)方法。

        // 构建回归树模型(M5P模型)
        M5P m5p = new M5P();
        m5p.setOptions(new String[]{""});  // 设置选项,这里为空
        m5p.buildClassifier(data);  // 使用数据训练M5P回归树模型
        System.out.println(m5p);  // 输出M5P回归树模型的详细信息

结果如下:

M5 pruned model tree:
(using smoothed linear models)

X1 <= 0.75 : 
|   X7 <= 0.175 : 
|   |   X1 <= 0.65 : LM1 (48/1.264%)
|   |   X1 >  0.65 : LM2 (96/3.201%)
|   X7 >  0.175 : 
|   |   X1 <= 0.65 : LM3 (80/3.652%)
|   |   X1 >  0.65 : 
|   |   |   X7 <= 0.325 : LM4 (80/3.724%)
|   |   |   X7 >  0.325 : 
|   |   |   |   X1 <= 0.675 : LM5 (20/1.687%)
|   |   |   |   X1 >  0.675 : 
|   |   |   |   |   X8 <= 2.5 : LM6 (24/1.314%)
|   |   |   |   |   X8 >  2.5 : 
|   |   |   |   |   |   X8 <= 4.5 : LM7 (24/2.737%)
|   |   |   |   |   |   X8 >  4.5 : 
|   |   |   |   |   |   |   X1 <= 0.7 : LM8 (4/0.91%)
|   |   |   |   |   |   |   X1 >  0.7 : LM9 (8/1.265%)
X1 >  0.75 : 
|   X1 <= 0.805 : 
|   |   X7 <= 0.175 : LM10 (48/5.775%)
|   |   X7 >  0.175 : 
|   |   |   X7 <= 0.325 : LM11 (40/5.26%)
|   |   |   X7 >  0.325 : LM12 (40/5.756%)
|   X1 >  0.805 : 
|   |   X7 <= 0.175 : 
|   |   |   X8 <= 1.5 : 
|   |   |   |   X7 <= 0.05 : 
|   |   |   |   |   X2 <= 539 : LM13 (4/0%)
|   |   |   |   |   X2 >  539 : LM14 (12/4.501%)
|   |   |   |   X7 >  0.05 : 
|   |   |   |   |   X1 <= 0.94 : LM15 (12/4.329%)
|   |   |   |   |   X1 >  0.94 : LM16 (4/0.226%)
|   |   |   X8 >  1.5 : 
|   |   |   |   X1 <= 0.94 : LM17 (48/5.693%)
|   |   |   |   X1 >  0.94 : LM18 (16/1.119%)
|   |   X7 >  0.175 : 
|   |   |   X1 <= 0.84 : 
|   |   |   |   X7 <= 0.325 : 
|   |   |   |   |   X8 <= 2.5 : LM19 (8/3.901%)
|   |   |   |   |   X8 >  2.5 : LM20 (12/3.913%)
|   |   |   |   X7 >  0.325 : LM21 (20/5.632%)
|   |   |   X1 >  0.84 : 
|   |   |   |   X7 <= 0.325 : LM22 (60/4.548%)
|   |   |   |   X7 >  0.325 : 
|   |   |   |   |   X3 <= 306.25 : LM23 (40/4.504%)
|   |   |   |   |   X3 >  306.25 : LM24 (20/6.934%)

LM num: 1
Y1 = 
	72.2602 * X1 
	+ 0.0053 * X3 
	+ 41.5669 * X7 
	- 0.0049 * X8 
	- 37.6688

LM num: 2
Y1 = 
	-14.6772 * X1 
	+ 0.0053 * X3 
	+ 40.2316 * X7 
	+ 0.0181 * X8 
	+ 15.649

LM num: 3
Y1 = 
	84.5112 * X1 
	+ 0.0053 * X3 
	+ 13.9115 * X7 
	- 0.1471 * X8 
	- 42.4943

LM num: 4
Y1 = 
	-2.8359 * X1 
	+ 0.0053 * X3 
	+ 4.3146 * X7 
	- 0.0111 * X8 
	+ 12.0357

LM num: 5
Y1 = 
	-6.0295 * X1 
	+ 0.0053 * X3 
	+ 4.3146 * X7 
	- 0.0524 * X8 
	+ 16.0295

LM num: 6
Y1 = 
	-4.3262 * X1 
	+ 0.0053 * X3 
	+ 4.3146 * X7 
	- 0.0665 * X8 
	+ 14.5905

LM num: 7
Y1 = 
	-4.3262 * X1 
	+ 0.0053 * X3 
	+ 4.3146 * X7 
	- 0.0888 * X8 
	+ 14.5832

LM num: 8
Y1 = 
	-4.3262 * X1 
	+ 0.0053 * X3 
	+ 4.3146 * X7 
	- 0.1025 * X8 
	+ 14.5352

LM num: 9
Y1 = 
	-0.8154 * X1 
	+ 0.0053 * X3 
	+ 4.3146 * X7 
	- 0.1025 * X8 
	+ 11.9531

LM num: 10
Y1 = 
	105.9033 * X1 
	+ 0.0113 * X3 
	+ 59.6616 * X7 
	+ 0.0975 * X8 
	- 58.7462

LM num: 11
Y1 = 
	81.6537 * X1 
	+ 0.0113 * X3 
	+ 10.8932 * X7 
	+ 0.0559 * X8 
	- 33.0837

LM num: 12
Y1 = 
	64.6565 * X1 
	+ 0.0113 * X3 
	+ 10.8932 * X7 
	- 0.0337 * X8 
	- 18.0037

LM num: 13
Y1 = 
	3.2622 * X1 
	- 0.0018 * X2 
	+ 0.0164 * X3 
	+ 44.6313 * X7 
	+ 0.0592 * X8 
	+ 11.9461

LM num: 14
Y1 = 
	9.1337 * X1 
	- 0.0018 * X2 
	+ 0.0164 * X3 
	- 0.0494 * X6 
	+ 44.6313 * X7 
	+ 0.0592 * X8 
	+ 7.321

LM num: 15
Y1 = 
	11.8776 * X1 
	- 0.0018 * X2 
	+ 0.0164 * X3 
	- 0.0428 * X6 
	+ 44.6313 * X7 
	+ 0.0592 * X8 
	+ 7.0198

LM num: 16
Y1 = 
	3.2622 * X1 
	- 0.0018 * X2 
	+ 0.0164 * X3 
	+ 44.6313 * X7 
	+ 0.0592 * X8 
	+ 14.1593

LM num: 17
Y1 = 
	35.1381 * X1 
	- 0.0018 * X2 
	+ 0.0164 * X3 
	+ 16.7723 * X7 
	+ 0.0592 * X8 
	- 10.1661

LM num: 18
Y1 = 
	3.2622 * X1 
	- 0.0018 * X2 
	+ 0.0164 * X3 
	+ 16.7723 * X7 
	+ 0.0592 * X8 
	+ 16.4949

LM num: 19
Y1 = 
	8.5464 * X1 
	- 0.0012 * X2 
	+ 0.029 * X3 
	+ 15.2851 * X7 
	- 0.2151 * X8 
	+ 7.86

LM num: 20
Y1 = 
	8.5464 * X1 
	- 0.0012 * X2 
	+ 0.029 * X3 
	+ 15.2851 * X7 
	- 0.0475 * X8 
	+ 7.4789

LM num: 21
Y1 = 
	8.5464 * X1 
	- 0.0012 * X2 
	+ 0.029 * X3 
	+ 15.2851 * X7 
	+ 0.013 * X8 
	+ 8.5537

LM num: 22
Y1 = 
	1.4309 * X1 
	- 0.0012 * X2 
	+ 0.1248 * X3 
	+ 9.5464 * X7 
	+ 0.0373 * X8 
	- 10.9927

LM num: 23
Y1 = 
	5.1744 * X1 
	- 0.0012 * X2 
	+ 0.0633 * X3 
	+ 9.5464 * X7 
	+ 0.0235 * X8 
	+ 5.7355

LM num: 24
Y1 = 
	5.1744 * X1 
	- 0.0012 * X2 
	+ 0.0761 * X3 
	+ 9.5464 * X7 
	- 0.0805 * X8 
	+ 3.4386

Number of Rules : 24

这棵树总共有13个叶子,每个叶子对应于一个线性方程。

评估

        // 10折交叉验证
        evaluation = new Evaluation(data);  // 重新创建评估对象
        evaluation.crossValidateModel(m5p, data, 10, new Random(1), new String[]{});  // 执行10折交叉验证
        System.out.println(evaluation.toSummaryString());  // 输出交叉验证的概要信息

结果如下:

Correlation coefficient                  0.996 
Mean absolute error                      0.6497
Root mean squared error                  0.9164
Relative absolute error                  7.0972 %
Root relative squared error              9.0753 %
Total Number of Instances              768  

完整代码

    private static String PATH = ClassUtils.getDefaultClassLoader().getResource("ENB2012_data.csv").getPath();

    public static void main(String[] args) throws Exception {
        // 加载数据
        CSVLoader loader = new CSVLoader();
        loader.setFieldSeparator(",");  // 设置CSV文件的字段分隔符为逗号
        loader.setSource(new File(PATH));  // 设置数据源为CSV文件
        Instances data = loader.getDataSet();  // 从CSV文件中加载数据集
        /*
         * 构建回归模型
         */
        // 设置类别索引为Y1(加热负荷),即目标变量
        data.setClassIndex(data.numAttributes() - 2);  // 设置类别索引为倒数第二个属性,表示Y1
        // 移除最后一个属性Y2,因为Y2是另一个目标变量,我们只处理Y1
        Remove remove = new Remove();
        remove.setOptions(new String[]{"-R", String.valueOf(data.numAttributes())});  // 移除最后一个属性
        remove.setInputFormat(data);  // 设置输入格式
        data = Filter.useFilter(data, remove);  // 应用过滤器,移除最后一个属性
        // 构建线性回归模型
        LinearRegression model = new LinearRegression();
        model.buildClassifier(data);  // 使用数据训练线性回归模型
        System.out.println(model);  // 输出线性回归模型的详细信息
        // 10折交叉验证
        Evaluation evaluation = new Evaluation(data);  // 创建评估对象
        evaluation.crossValidateModel(model, data, 10, new Random(1), new String[]{});  // 执行10折交叉验证
        System.out.println(evaluation.toSummaryString());  // 输出交叉验证的概要信息
        double[] coefficients = model.coefficients();  // 获取线性回归模型的系数
        // 构建回归树模型(M5P模型)
        M5P m5p = new M5P();
        m5p.setOptions(new String[]{""});  // 设置选项,这里为空
        m5p.buildClassifier(data);  // 使用数据训练M5P回归树模型
        System.out.println(m5p);  // 输出M5P回归树模型的详细信息
        // 10折交叉验证
        evaluation = new Evaluation(data);  // 重新创建评估对象
        evaluation.crossValidateModel(m5p, data, 10, new Random(1), new String[]{});  // 执行10折交叉验证
        System.out.println(evaluation.toSummaryString());  // 输出交叉验证的概要信息
    }

结论

对于线性回归模型:

(1)相关性系数(Correlation coefficient)为0.956,表明模型预测值与实际值之间有较强的相关性。

(2)平均绝对误差(Mean absolute error)为2.0923,表示预测值与实际值之间的平均绝对差距。

(3)均方根误差(Root mean squared error)为2.9569,它衡量了预测值与实际值之间的标准偏差。

(4)相对绝对误差(Relative absolute error)和相对均方根误差(Root relative squared error)分别为22.8555%和29.282%,这些指标是相对于实际值的误差比例。

对于M5模型树:

(1)相关性系数为0.996,比线性回归模型更高,说明M5模型树的预测值与实际值的相关性更强。

(2)平均绝对误差降低到0.6497,表明M5模型树的预测更为准确。

(3)均方根误差也降低到0.9164,说明预测值与实际值的偏差更小。

(4)相对绝对误差和相对均方根误差分别降低到7.0972%和9.0753%,显示M5模型树在相对误差上也有显著改善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

U盘文件剪切丢失的全方位解析与恢复指南

一、U盘文件剪切丢失现象描述 在日常使用U盘的过程中&#xff0c;我们时常会遇到需要将文件从一个位置移动到另一个位置的情况&#xff0c;而剪切加粘贴便是最常用的操作之一。然而&#xff0c;有时在剪切文件后&#xff0c;却意外发现目标位置并没有出现这些文件&#xff0c;…

洛谷 P1075 [NOIP2012 普及组] 质因数分解 C语言

题目&#xff1a; P1075 [NOIP2012 普及组] 质因数分解 - 洛谷 | 计算机科学教育新生态 题目描述 已知正整数 n 是两个不同的质数的乘积&#xff0c;试求出两者中较大的那个质数。 输入格式 输入一个正整数 n。 输出格式 输出一个正整数 p&#xff0c;即较大的那个质数。…

Lecture 17

10’s Complement Representation 主要内容&#xff1a; 1. 10’s 补码表示: • 10’s 补码表示法需要指定表示的数字位数&#xff08;用 n 表示&#xff09;。 • 表示的数字取决于 n 的位数&#xff0c;这会影响具体数值的解释。 2. 举例: • 如果采用 3 位补码&…

电子电器架构 --- 智能座舱HUD技术革新

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所谓鸡汤&#xff0c;要么蛊惑你认命&#xff0c;要么怂恿你拼命&#xff0c;但都是回避问题的根源&…

零基础微信小程序开发——全局配置之tabBar(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

docker redis安装

一.镜像拉取 docker pull redis:5.0新建文件 touch /home/redis/redis.conf touch /home/redis/redis_6379.pid # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepali…

0基础跟德姆(dom)一起学AI 自然语言处理08-认识RNN模型

1 什么是RNN模型 RNN(Recurrent Neural Network), 中文称作循环神经网络, 它一般以序列数据为输入, 通过网络内部的结构设计有效捕捉序列之间的关系特征, 一般也是以序列形式进行输出. 一般单层神经网络结构: RNN单层网络结构: 以时间步对RNN进行展开后的单层网络结构: RNN的…

Xilinx PCIe高速接口入门实战(三)

引言&#xff1a;为保证FPGA设备可以连接并被系统识别&#xff0c;本节讨论了PCIe基础规范和PCIe板卡电气规范的对FPGA配置时间具体要求。 1. 配置访问时间 在PCIe的标准系统中&#xff0c;当系统通电时&#xff0c;处理器上运行的配置软件开始扫描PCIe总线以发现机器拓扑。…

InfoNCE Loss详解(上)

引言 InfoNCE对比学习损失是学习句嵌入绕不开的知识点&#xff0c;本文就从头开始来探讨一下它是怎么来的。 先验知识 数学期望与大数定律 期望(expectation&#xff0c;expected value&#xff0c;数学期望&#xff0c;mathematical expectation)是随机变量的平均值&#…

抽象工厂设计模式的理解和实践

在软件开发中&#xff0c;设计模式是前人通过大量实践总结出的、可复用的、解决特定问题的设计方案。它们为我们提供了一种标准化的解决方案&#xff0c;使得代码更加简洁、灵活和易于维护。在众多设计模式中&#xff0c;抽象工厂模式&#xff08;Abstract Factory Pattern&…

爱思唯尔word模板

爱思唯尔word模板 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 参考文献书签链接

【机器学习】工业 4.0 下机器学习如何驱动智能制造升级

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 随着科技的飞速发展&#xff0c;工业 4.0 浪潮正席卷全球制造业&#xff0c;而机器学习作为这一变革中的关键技术&#xff0c;正以前…

全面了解 SQL Server:功能、优势与最佳实践

SQL Server 是微软公司推出的一款关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于企业级数据存储、数据分析、应用开发等领域。作为全球最受欢迎的数据库管理系统之一&#xff0c;SQL Server 提供了强大的功能和工具&#xff0c;支持从小型应用到大型…

旅游管理系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

攻防世界 robots

开启场景 根据提示访问/robots.txt&#xff0c;发现了 f1ag_1s_h3re.php 拼接访问 /f1ag_1s_h3re.php 发现了 flag cyberpeace{d8b7025ed93ed79d44f64e94f2527a17}

离线语音识别+青云客语音机器人(幼儿园级别教程)

1、使用步骤 确保已安装以下库&#xff1a; pip install vosk sounddevice requests pyttsx3 2、下载 Vosk 模型&#xff1a; 下载适合的中文模型&#xff0c;如 vosk-model-small-cn-0.22。 下载地址&#xff1a; https://alphacephei.com/vosk/models 将模型解压后放置在…

秒杀场景的设计思考

秒杀场景的设计思考 在学习Redis的之后&#xff0c;一个绕不开的话题就是秒杀系统的设计。本文将从下面&#x1f447;&#x1f3fb;几个方面展开一下个人简单的理解&#xff1a; 秒杀场景的介绍设计的核心思路怎么限流、削峰、异步planB总结 ‍ 秒杀场景的介绍 秒杀场景是…

秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! 下篇更新&#xff1a; 秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。 默认的类型别名 MyBatis的增删改查 添加 <!--int insertUs…

2024年12月29日Github流行趋势

项目名称&#xff1a;cobalt 项目地址url&#xff1a;https://github.com/imputnet/cobalt项目语言&#xff1a;Svelte历史star数&#xff1a;22882今日star数&#xff1a;1049项目维护者&#xff1a;wukko, dumbmoron, Snazzah, lexito-o, KwiatekMiki项目简介&#xff1a;保存…

【LLM】OpenAI 的DAY12汇总和o3介绍

note o3 体现出的编程和数学能力&#xff0c;不仅达到了 AGI 的门槛&#xff0c;甚至摸到了 ASI&#xff08;超级人工智能&#xff09;的边。 Day 1&#xff1a;o1完全版&#xff0c;开场即巅峰 12天发布会的开场即是“炸场级”更新——o1完全版。相比此前的预览版本&#x…