【人工智能Ⅰ】实验6:回归预测实验

实验6 回归预测实验

一、实验目的

1:了解机器学习中数据集的常用划分方法以及划分比例,并学习数据集划分后训练集、验证集及测试集的作用。

2:了解降维方法和回归模型的应用。

二、实验要求

数据集(LUCAS.SOIL_corr-实验6数据.exl)为 LUCAS 土壤数据集,每一行代表一个样本,每一列代表一个特征,特征包含近红外光谱波段数据(spc列)和土壤理化指标。

1. 对数据集进行降维处理。

2. 统计各土壤理化指标的最大值、最小值、均值、中位数,并绘制各指标的箱型图。

3. 将数据集划分后训练集、验证集及测试集。使用偏最小二乘回归法预测某一指标含量。

4. 打印训练集和验证集的R2和RMSE。

5. 绘制训练集真实标签和模型预测的标签之间的散点图。(如下图所示)

三、实验结果

1:利用PCA进行降维

    在任务1中,本实验采用主成分分析(PCA)方法对数据进行降维,整体维度从1201个降低到500个。降维结束后打印数据维度的变化,如下图所示。

2:统计各个指标的数据并绘制箱型图

在任务2中,本实验采用agg方法对数据进行聚合操作。首先从数据中选择包含了理化指标的列名的列表,然后利用agg方法对目标列进行了多个聚合操作,最终生成了最大值、最小值、均值和中位数的结果,并保存到summary_stats这个二维数据结构之中。最终的处理结果如下图所示。

同时,本实验采用plot方法,分别生成了离群点未剔除和剔除后的箱型图。两种情况的最终结果如下图所示,图1为离群点未剔除,图2为离群点剔除。

3:划分数据集,使用偏最小二乘回归法预测pH.in.H2O指标含量

    在任务3中,本实验以8:1:1的比例,将数据集随机划分成为训练集、验证集及测试集。

    此外,本实验调用机器学习库中的偏最小二乘回归法,通过训练X_train和y_train来预测验证集和测试集的pH.in.H2O指标含量结果。整体代码如下图所示。

4:打印训练集和验证集的R2 和 RMSE

在任务4中,本实验调用机器学习库中的mean_squared_error函数和r2_score函数来计算验证集和测试集上的均方根误差结果和R2结果。整体代码和计算结果如下图所示,图1为调用机器学习依赖的代码,图2为验证集和测试集的均方根误差结果和R2结果。

5:绘制真实标签和模型预测的标签间的散点图。

在任务5中,本实验汇总了模型在训练集、验证集、测试集上的整体表现结果,并进行了绘图展示。最终结果如下图所示,其中蓝色的数据点表示数据来自训练集,橙色的数据点表示数据来自验证集,绿色的数据点表示数据来自测试集,红色的y=x直线为预测结果与真实值相等的标准直线。


同时,本实验也分别对训练集、验证集、测试集散点图进行了散点图绘制和线性回归模型拟合。最终结果如下图所示,图1为训练集结果,图2为验证集结果,图3为测试集结果,其中红色的直线为使用线性回归模型拟合的回归线。

四、遇到的问题和解决方案

问题1:一开始设置的主成分个数过小(n_components=10),验证集和测试集的R2结果只能达到0.5左右,实验得到的相关性不够好。

解决1:增大主成分个数,并发现当n_components过百后结果较好,此时验证集和测试集的R2结果可以达到0.7+。


问题2:一开始进行特征列选择的时候全选了excel表格的所有列,导致模型直接以因变量进行拟合,验证集和测试集的R2高达0.99。结果如下图所示。

解决2:上述结果显然不符合箱型图的离散点情况。在经过一定分析之后,得知需要在选择需要进行PCA降维的特征列中,排除最后4列理化指标。即把代码更改为【selected_columns = data.columns[:-4].tolist()】。

五、实验总结和心得

1:在计算模型评价机制的时候,mean_squared_error函数中的squared参数用于控制均方误差(MSE)的计算方式。当squared=True时,它表示计算的是均方误差的平方值,即MSE。而当squared=False时,它表示计算的是均方根误差(RMSE),即MSE的平方根。

2:在划分数据集的时候,设置random_state参数可以确保数据集分割的随机性可复现。即多次运行代码时,相同的random_state值会产生相同的随机划分结果。

3:在绘制箱型图的时候,showfliers 参数用于控制箱线图中是否显示离群点(outliers)。如果将 showfliers 设置为 True,则箱线图将显示离群点,如果设置为 False,则离群点将被隐藏,只显示箱体和须部分。

4:linear fit指的是使用线性回归模型对数据进行拟合,即假设目标变量与特征之间存在线性关系。线性回归模型试图找到一条直线(或在多维情况下是一个超平面),以最佳方式拟合数据点,使得观测到的数据点与模型预测的值之间的残差平方和最小化。

5:在本实验中,我们首先对土壤理化指标进行了统计分析,包括计算最大值、最小值、均值和中位数,这有助于了解指标的分布情况和基本统计特性。同时,通过绘制每个指标的箱型图,我们可以直观地感受数据的分布和可能的离群点。

6:在本实验中,如果使用python文件运行,则每次需要较长时间等read_excel完成读入工作。后续思考后发现,可以使用jupyter notebook的ipynb文件运行,这样的话只需要读入一次数据到cell里面,后续就可以不需要重复读入了,实验效率会快很多。

六、程序源代码

    各部分的任务操作在多行代码注释下构造。各段代码含有概念注释模块。

import pandas as pd

from sklearn.decomposition import PCA

from sklearn.preprocessing import StandardScaler

import matplotlib.pyplot as plt

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.cross_decomposition import PLSRegression

from sklearn.metrics import mean_squared_error, r2_score

# 读取数据集

data = pd.read_excel(r"C:\Users\86158\Desktop\LUCAS.SOIL_corr-实验6数据.xlsx")

"""

    任务2:统计各土壤理化指标的最大值、最小值、均值、中位数,并绘制各指标的箱型图。

"""

# 获取理化指标的列(数据最后4列)

physical_chemical_columns = data.columns[-4:]

new_selected = data[physical_chemical_columns]

# 统计各理化指标的最大值max、最小值min、均值mean、中位数median

summary_stats = data[physical_chemical_columns].agg(['max', 'min', 'mean', 'median'])

print("各土壤理化指标的统计信息:")

print(summary_stats)

# 离群点剔除前的箱型图

boxplot1 = new_selected.plot(kind='box',showfliers=True)

plt.title("Box plot when outliers are within")

plt.xlabel("Features")

plt.ylabel("Values")

plt.show()

# 离群点剔除后的箱型图

boxplot2 = new_selected.plot(kind='box',showfliers=False)

plt.title("Box plot when outliers are out")

plt.xlabel("Features")

plt.ylabel("Values")

plt.show()

"""

    任务1:对数据集进行降维处理。

"""

# 选择需要进行PCA降维的特征列

selected_columns = data.columns[:-4].tolist()  # 替换为实际的特征列名称

print("降维前的特征:",selected_columns)

# 数据标准化

scaler = StandardScaler()

X_scaled = scaler.fit_transform(data[selected_columns])

# 输出降维前的维度

print("降维前数据的维度:", X_scaled.shape)

# 使用PCA进行降维

pca = PCA(n_components=500)  # 假设降维到10个主成分,根据需要调整

X_reduced = pca.fit_transform(X_scaled)

# 输出降维后的维度

print("降维后数据的维度:", X_reduced.shape)

"""

    任务3:将数据集划分后训练集、验证集及测试集。使用偏最小二乘回归法预测某一指标含量。

"""

# 选择要预测的指标列

target_column = -4      # 选择最后一列

X = X_reduced

y = data.iloc[:, target_column]

# 划分数据集为训练集、验证集和测试集(比例为811

X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.2, random_state=42)

X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

# 调用最小二乘法,使用的主成分为10

pls = PLSRegression(n_components=500)      

pls.fit(X_train, y_train)

# 预测验证集和测试集

y_val_pred = pls.predict(X_val)

y_test_pred = pls.predict(X_test)

"""

    任务4:打印训练集和验证集的R2 RMSE

"""

# 评估性能

val_rmse = mean_squared_error(y_val, y_val_pred, squared=False)

test_rmse = mean_squared_error(y_test, y_test_pred, squared=False)

val_r2 = r2_score(y_val, y_val_pred)

test_r2 = r2_score(y_test, y_test_pred)

print(f"验证集均方根误差 (RMSE): {val_rmse}")

print(f"测试集均方根误差 (RMSE): {test_rmse}")

print(f"验证集R^2: {val_r2}")

print(f"测试集R^2: {test_r2}")

"""

    任务5:绘制训练集真实标签和模型预测的标签之间的散点图。

"""

y_train_pred = pls.predict(X_train)

# 计算训练集、验证集、测试集的线性拟合

train_slope, train_intercept = np.polyfit(y_train, y_train_pred, 1)

val_slope, val_intercept = np.polyfit(y_val, y_val_pred, 1)

test_slope, test_intercept = np.polyfit(y_test, y_test_pred, 1)

# 辅助线的画线范围

min_val = min(min(y_train), min(y_val), min(y_test))

max_val = max(max(y_train), max(y_val), min(y_test))

x_range = [min_val, max_val]

# 训练集、验证集、测试集散点图(alpha控制透明度)

plt.scatter(y_train, y_train_pred, label='Train', alpha=0.7)

# plt.plot(x_range, train_slope * np.array(x_range) + train_intercept, color='blue', linestyle='--', label='Linear Fit (Train)')

plt.scatter(y_val, y_val_pred, label='Validation', alpha=0.7)

# plt.plot(x_range, val_slope * np.array(x_range) + val_intercept, color='orange', linestyle='--', label='Linear Fit (Validation)')

plt.scatter(y_test, y_test_pred, label='Test', alpha=0.7)

# plt.plot(x_range, test_slope * np.array(x_range) + test_intercept, color='green', linestyle='--', label='Linear Fit (Test)')

# 添加 y=x 的标准预测直线

plt.plot(x_range, x_range, color='red', linestyle='--', label='y=x')

# 图注

plt.xlabel("True Values")

plt.ylabel("Predictions")

plt.legend(loc='best')

plt.title("Scatter plot of True vs. Predicted Values")

plt.show()

# 单独画训练集

plt.scatter(y_train, y_train_pred, label='Train', alpha=0.7)

plt.plot(x_range, train_slope * np.array(x_range) + train_intercept, color='red', linestyle='--', label='Linear Fit (Train)')

plt.xlabel("True Values")

plt.ylabel("Predictions")

plt.legend(loc='best')

plt.title("Train dataset")

plt.show()

# 单独画验证集

plt.scatter(y_val, y_val_pred, label='Validation', alpha=0.7)

plt.plot(x_range, val_slope * np.array(x_range) + val_intercept, color='red', linestyle='--', label='Linear Fit (Validation)')

plt.xlabel("True Values")

plt.ylabel("Predictions")

plt.legend(loc='best')

plt.title("Validation dataset")

plt.show()

# 单独画测试集

plt.scatter(y_test, y_test_pred, label='Test', alpha=0.7)

plt.plot(x_range, test_slope * np.array(x_range) + test_intercept, color='red', linestyle='--', label='Linear Fit (Test)')

plt.xlabel("True Values")

plt.ylabel("Predictions")

plt.legend(loc='best')

plt.title("Test dataset")

plt.show()

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

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

相关文章

(六)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB代码)

一、无人机模型简介: 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献: [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

防火墙补充NAT

目录 1.iptables保存规则 2.自定义链 3.NAT NAT的实现分为下面类型&#xff1a; SNAT实验操作 DNAT实验操作 1.iptables保存规则 永久保存方法一&#xff1a; iptables -save > /data/iptables_rule //输出重定向备份 iptables -restore < /data/iptables_r…

​[Oracle]编写程序,键盘输入n,计算1+前n项之和。测试案例:输入:10 输出:22.47​

编写程序&#xff0c;键盘输入n,计算1前n项之和。 测试案例&#xff1a; 输入&#xff1a;10 输出&#xff1a;22.47 代码如下&#xff1a; set serveroutput on declare v_sum number:0;v_n number;beginv_n:&n;for i in 1..v_n loopv_sum:v_sumsqrt(i); end loop; d…

View绘制

onDraw 绘制 canvas 画布 paint 画笔 坐标系 x y x 0 y 0 则屏幕左上角 y从上往下值增加 像素转换 dp2px 画线line drawLine 圆circle drawCircle drawPath: 在onSizeChanged 时候初始化 addCircle 添加圆 CW顺时针 CCW 逆时针 CW CCW填充规则不同 填充规则: 默认 …

关于项目时间与数据库中的时间不一致问题(少8个小时)

关于项目情况: 1.springboot项目 2.数据库为MySQL 3.数据库时间正常,与实际时间一致. 4.项目获取到的时间比数据库的时间少八个小时 原因是没有给日期格式设置时区,导致其变为世界时,比北京时间少八个小时 在application.yml 配置文件中添加时区属性; 配置文件路径 spri…

【复位与释放(亚稳态)模为60的BCD码计数器_2023.11.22】

复位与释放&#xff08;异步复位&#xff0c;同步释放&#xff09; 同步复位rst、同步置数load&#xff08;置数信号只有在时钟上升沿到来时才能生效&#xff09;、同步清零clr 同步复位&#xff1a; always(posedge clk) if(!rst_n) b<1’b0; else b<a; 同步复位信号rs…

〔005〕虚幻 UE5 像素流多用户部署

✨ 目录 ▷ 为什么要部署多用户▷ 开启分发服务器▷ 配置启动多个信令服务器▷ 配置启动客户端▷ 多用户启动整体流程和预览▷ 注意事项 ▷ 为什么要部署多用户 之前的像素流部署&#xff0c;属于单用户&#xff0c;是有很大的弊端的打开多个窗口访问&#xff0c;可以看到当一…

Linux 命令pwd

命令作用 pwd是Linux中一个非常有用而又十分简单的命令&#xff0c;pwd是词组print working directory的首字母缩写&#xff0c;即打印工作目录&#xff1b;工作目录就是你当前所处于的那个目录。 pwd始终以绝对路径的方式打印工作目录&#xff0c;即从根目录&#xff08;/&am…

百度地图JavaScript API GL获取经纬度,标记,添加文本标注,点击事件,封装

百度地图JavaScript API GL常用方法封装 引入百度js库 <script type"text/javascript" src"https://api.map.baidu.com/api?v1.0&typewebgl&ak自己的百度应用ak"></script>封装方法 <template><div class"map"&…

Vue3生命周期函数(简述题)

1.图示 2.说明 3.补充 1.在vue3组合式API中&#xff0c;我们需要将生命周期函数先导入&#xff0c;然后才能使用。 import {onMounted} from vue2.beforeCreate和created被setup()方法所代替

CTO对生活和工作一点感悟

陌生人&#xff0c;你好啊。 感谢CSDN平台让我们有了隔空认识&#xff0c;交流的机会。 我是谁&#xff1f; 我呢&#xff0c;毕业快11年&#xff0c;在网易做了几年云计算&#xff0c;后来追风赶上了大数据的浪潮&#xff0c;再到后来混迹在AI、智能推荐等领域。 因为有一颗…

增加F110 付款方式的随手记录

随便记录一下&#xff0c;基本上有这些信息可以了 为了保持PRD与测试机一致的银行代码&#xff0c;需要先在DEV&#xff0c;QAS 改成4 外部给号 主要都是在FBZP 开户行维护-FI12_HBANK/FI12 S4hana 里面有的没有办法在FI12 维护只能去NWBC NWBC&#xff1a;维护银行账户并关联…

软件测试简历怎么写?可以参考这份简历

个人简历 基本信息 姓名&#xff1a;名字 性别&#xff1a;男 年龄&#xff1a;25 学历&#xff1a;本科 联系电话&#xff1a…

C++: string的模拟实现

C: string的模拟实现 一.前置说明1.模拟实现string容器的目的2.我们要实现的大致框架 二.默认成员函数1.构造函数2.拷贝构造函数1.传统写法2.现代写法 3.析构函数4.赋值运算符重载1.传统写法2.现代写法 三.遍历和访问1.operator[]运算符重载2.iterator迭代器 四.容量相关函数1.…

【Vue3+Vite】解决build后空白页的问题

目录 Hash 模式 HTML5 模式&#xff08;历史模式&#xff09; 配置Nginx 配置Spring Boot Hash 模式 build后空白页的问题可能是使用的是历史模式&#xff0c;因为Vue是一个单页的客户端应用&#xff0c;如果没有适当的服务器配置&#xff0c;访问会得到一个 404 错误…

智慧水务系统在流域水环境规划中起到什么作用?

智慧水务系统在流域水环境规划中扮演着越来越重要的角色。作为一款集信息化、自动化、智能化、智慧化于一体的水务管理系统&#xff0c;智慧水务系统不仅能够提高水环境规划的效率&#xff0c;还能为水资源的保护和利用提供有力支持。 在流域水环境规划中&#xff0c;智慧水务系…

计算机硬件(一)

1.机箱 计算机的许多硬件,如主板,硬盘和电源等,都安放在固定机箱中。机箱是一个相对封闭的空间&#xff0c;箱体一般由钢和铝合金等金属制成(其他材料亦可用&#xff0c;但不多见),同时设有许多通风口,以促进箱内空气流动,防止内部温度过高&#xff0c;机箱的颜色,大小乃至形状…

c++ 中名空间中using 引入的细节

如果在引入名空间中的特定成员函数的时候&#xff0c; 全局不能定义同名的函数&#xff0c;但是其实只要参数不同就行 namespace a{int x 1;int fun(){return 0;} }using namespace a; using a::fun;void fun(int x) {} int x 10; int main() {fun(10); } 上面就是一个正确…

TZOJ 1378 发工资咯

答案&#xff1a; #include<stdio.h> int main() {int n 0, m 0, i 0, sum 0;while (scanf("%d", &n) && n ! 0) //多组数据输入并且不等于0{for (i 0; i < n; i) //有n名老师就循环n次{scanf("%d", &m); //该名老…

rabbitMQ对消息不可达处理-备份交换机/备份队列

生产者发送消息&#xff0c;在消息不可达指定队列时&#xff0c;可以借助扇出类型交换机&#xff08;之前写过消息回退的处理方案&#xff0c;扇出交换机处理的方案优先级高于消息回退&#xff09;处理不可达消息&#xff0c;然后放置一个备份队列&#xff0c;供消费者处理不可…