12. BI - 可视化在项目蒸汽量预测的过程及应用

本文为 「茶桁的 AI 秘籍 - BI 篇 第 12 篇」

在这里插入图片描述

文章目录

    • 工业蒸汽量预测

Hi, 你好。我是茶桁。

我们今天继续来看数据可视化做数据探索,今天我们还是来看相关项目。来看看可视化 EDA 在项目中的应用。

工业蒸汽量预测

接下来这个项目,是在阿里天池上的一个工业蒸汽量的预测项目。

首先我们来看一下一些前提知识点。我们知道,火力发点的原理是:燃料加热水 -> 生成蒸汽 -> 推动汽轮机旋转 -> 带动发电机旋转 -> 产生电能。

在这里插入图片描述

在这个过程中,影响发电效率的核心是锅炉的燃烧效率。影响锅炉燃烧效率的主要因素包括:

  1. 锅炉的可调参数,如燃烧给量,一二次风,引风,返料风,给水水量。
  2. 锅炉的工况,比如锅炉床温、床压,炉膛温度、压力,过热器的温度等。

很明显,我们要通过调节的锅炉的参数以及锅炉工况的参数来去预测它的蒸气量会是多少。

这个项目的训练集为zhengqi_train.txt,测试集为zhengqi_test.txt,数据都是脱敏后的传感器采集数据(采集频率为分钟级)。训练集大概 38 个字段。

先大概来看一下这个数据,现在要做的事情是根据锅炉的情况来预测它的蒸汽量,蒸汽量这个特征是在最后,也就是要去预测target这个值。

在这里插入图片描述

今天主要不是要做建模,而是去看一看数据的分析以及可视化。看看能帮我们得到怎样的一个结论。对于我们预测来说也是有一定的帮助的,至少前期的数据探索是很有帮助。

当我们看到这样一个数据之后,思路会是怎样的?怎么去做这个可视化的分析?

首先,我们需要将数据加载出来,每一个特征都可以做一个异常值的处理。还记得咱们之前将图形可视化的时候,可以用箱线图来找出异常值的情况。

首先,我们还是 Download 数据,在你的命令行内先进入一个目录,然后进行下载:

curl -o zhengqi_train.txt http://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/Industrial_Steam_Forecast/zhengqi_train.txt

curl -o zhengqi_test.txt http://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/Industrial_Steam_Forecast/zhengqi_test.txt

下载之后进行加载,直接使用 read_csv 就可以

train = pd.read_csv(path + 'Zhengqi/zhengqi_train.txt', sep='\t')
train

因为读取之后的数据格式不对,会发现有很多的\t

在这里插入图片描述

所以我们需要在读取数据的后面加上一个sep='\t'。这样,就不是以逗号被分割了,默认是以逗号。现在的数据因为是\t,所以就写成 separator 等于\t

这个数据基本都是数值类型,我们想要看它的特征可以用 describe 来做判断。这样就把这 38 个特征的统计量一目了然了,画箱线图就拿它来画的。

train.describe()

接下来当然是要导入 matplotlib 和 seaborn,用于后面的图形展示。第一张图我们要看一下 V0 和 target 之间的一些关系,那先用箱线图呈现。

plt.figure(figsize=(4, 6))
sns.boxplot(train['V0'])

在这里插入图片描述

除了 V0 还有其它的列,列数有多少呢?我们可以看一下 columns,用一个 len 方法来查看它到底有多少个。

len(train.columns)

---
39

一共是有 39 列。我们直接用 columns 做个遍历。每一个要设置 index,一共 39 个特征,你的画布可以设置为多少?比如说我们设成 5 ∗ 8 5 * 8 58,这是 40 个特征。我们就尝试这样设置下:

# 39 个特征,画布设置为 5*8
cols = train.columns
i = 0 # 子图的下标

for col in cols:
    i = i + 1
    plt.subplot(5, 8, i)
    # 绘制箱线图
    sns.boxplot(train[col])

我们首先用 cols 将 train.columns 拿到,然后对它进行遍历,其中 i 设置从 0 开始,作为它的下标。一开始,就需要进行+1, 然后按照之前我们想好的设置,subplot设置为5, 8, i 就是当前那个图。接着,我们用boxplot将当前的 col 绘制出来。

在这里插入图片描述

不过这样明显看不出所以然出来,我们需要将图像设置的大一点。这个太密集了。所以再设置一下figure:

plt.figure(figsize=(40, 30))

在这里插入图片描述

这样就清晰很多,V0 是有异常值的,似乎很多都有异常值。我们来找找看哪些没有,大部分都有。V14 没有,V22 没有。这就是查看异常值的检测。

接下来,咱们可以看看直方图和概率密度图。它是用特征在训练集里面和测试集里面同时做一个呈现。

跟刚才的逻辑一样,先把画布大小做一个设置, 然后循环的时候去掉最后一个目标特征target

plt.figure(figsize=(40, 30))
i = 0
for col in cols[:-1]: # 不包括 target
    i = i + 1
    plt.subplot(5, 8, i)
    # 绘制直方图
    sns.distplot(train[col], color='red', label='Train')
    sns.distplot(test[col], color='blue', label='Test')

最后是将traintest两个数据集都绘制了出来,赋予不同的颜色

在这里插入图片描述

之前我们的课程中有说到 distplot 这个方法,默认是将直方图和 kde 结合在一起。其实我们使用 kde 会显得更清爽一点,只要将 distplot 换成 kdeplot 方法就行了。

在这里插入图片描述

这样看起来虽然清爽了,但是总觉得还缺点什么,其实可以将阴影加上就明显很多。我们可以在方法名后面设置 shade 为 True

for ...
    ...
    sns.kdeplot(train[col], color='red', label='Train', shade=True)

在这里插入图片描述

因为 kde 比较平滑,它没有这么多的像乐高一样的方块。这个就看起来比较直观一点。

看 kde 能发现哪些问题呢?我们现在要找那种测试集和训练集不太一致的,可以把它去掉。比如说第一个,我们认为应该是一样的。可以把这张图里面的轴向上的 label 也给它呈现出来,因为一会儿要数个数,不如直接给它标记出来。顺便,我们之前设置了图例label但是没有正常显示,也一起来解决一下。

# 使用 kdeplot
plt.figure(figsize=(40, 30))
i = 0
for col in cols[:-1]: # 不包括 target
    i = i + 1
    fig = plt.subplot(5, 8, i)
    # 绘制直方图
    sns.kdeplot(train[col], color='red', ax=fig, label='Train', shade=True)
    sns.kdeplot(test[col], color='blue', ax=fig, label='Test', shade=True)
    plt.legend()
    fig.set_xlabel(col)
    fig.set_ylabel('Frequency')

在这里插入图片描述

set 一下 x 和 y 轴的 label,并且加上plt.legend()让图例正常显示。

现在我们可以一起来看看,有哪些是不太一样的?前几个虽然有一点差别但实际上还是可以判断的,如果这个蓝色和红色差了几个位置可以给它做一个调整,给他做一个特征变换,用新的特征代替原有的特征,这样预测起来可能会更准一点。

V5 差别比较大,所以 V5 有可能不太行,好,咱们先记住一个。往后看,V9 差别也是比较大。咱们就需要去这张图上去找。5、9、11、17、21、22、28,这几个图中可以看到,这些特征在训练集和测试集中的分布差别就比较大的。这一步其实没有一个完全的标准,看你自己感觉上哪个差别比较大,可以给它去掉。

去掉的目的是降维,不是说要得到更精确的方法。如果更精确的话,你不去可能效果会更好。

现在可以给它写个方法来去掉这几个特征,先来个列表将特征名放进去:

drop_cols = ['5', 'V9', 'V11', 'V17', 'V21', 'V22', 'V28']

就是这些 column,我们写一个 list 放进来,这样稍后数据处理会更加少一点,不是所有的数据都会有。

train2 = train.drop(drop_cols, axis=1)
test2 = test.drop(drop_cols, axis=1)
train2

在这里插入图片描述

这样我们处理之后,就剩下 32 个特征。test 也是一样要进行处理。

通过训练集和测试集的分布我们找到了一些分布不太一样的给它去掉,剩下的这些特征哪些跟 target 之间的相关性是比较高的?

接下来看相关性的话,就要用到regplot, 方法还是类似的。设置一张大图,然后将特征进行循环,把数据扔进去以后进行绘制:

这里为了让相关性更明显一点,我们将线设置成不同的颜色:

# 绘制所有特征和 target 之间的回归关系
plt.figure(figsize=(40, 30))
i = 0
for col in cols[:-1]:
    i = i + 1
    fig = plt.subplot(5, 8, i)
    sns.regplot(x=col, y='target', data=train, ax=fig, line_kws={'color':'red'})

在这里插入图片描述

这样可以知道它的相关性,有些相关性是比较好的,有些相关性是不太好的,这张图上就可以一目了然。

也可以专门做相关性的系数,这次我们使用之前去掉特征之后的train2来做一个相关性系数的呈现,绘制它的热力图帮你判断。

# 绘制相关性系数的热力图
plt.figure(figsize=(20, 16))
sns.heatmap(train2.corr(), annot=True)

在这里插入图片描述

现在咱们用了热力图把相关性系数呈现出来,系数非常多,因为维度很多。即使咱们之前已经去掉一些特征,比如说 28 就去掉了,22 也去掉了,但是这个维度还是很多。那该怎么看呢?我们可以筛选出来重要的特征,g 大于 0.5 的,绝对值大于 0.5 的,我们要找跟 traget 的之间相关性大于 0.5 的。

我们首先设置一下 threshold, 然后将之前 train2 里的相关性系数都存下来

# 筛选出来重要的特征,即绝对值 > 0.5
threshold = 0.5
corrs = train2.corr()

然后需要筛选一下保存的这个系数里,target的系数,并且它需要是大于 threshold 的

corrs[abs(corrs['target']) > threshold]

我们只需要它的 index,来喂给我们新建立的一个 filter

# 找到重要的特征
features_filter = corrs.index[abs(corrs['target']) > threshold]
features_filter

---
Index(['V0', 'V1', 'V2', 'V3', 'V4', 'V8', 'V12', 'V16', 'V27', 'V31', 'V37',
       'target'],
      dtype='object')

这样,我们就拿到了相关性系数比较高的一些特征。咱们把这些特征再去做一个呈现的可视化。

plt.figure(figsize=(10, 6))
sns.heatmap(train[features_filter].corr(), annot=True)

在这里插入图片描述

刚才是一张很大的图,看起来比较密密麻麻。那现在找出来那些最关键的特征,看这张图是不是比较清爽一点了?

这张图里都是和 target 相关性比较高的,要么是正相关比较大,要么是负相关比较大。这就是我们筛出来的特征。

这个做完之后,咱们前期的数据探索基本就差不多了。现在咱们可以快速的来做一版预测。

咱们要预测的是它的蒸汽量,咱们一起思考下,可以用什么样的方法?是不是可以建一个回归模型?简单一点的模型用线性回归。所以我们从 sklearn 里面用 liner_model, 导入 LinearRegression, 回归模型。

然后,因为需要用到的是线性回归,肯定这样将数据喂给模型是不行的,需要先做一个归一化处理,所以还需要导入一个StandardScaler,当然,你用其他的 Scaler 也可以

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler

需要的包咱们有了,当然第一步是需要训练集中的target去掉,做一个新的特征列表:

features_filter = features_filter.tolist()
features_filter.remove('target')
print(features_filter)

---
['V0', 'V1', 'V2', 'V3', 'V4', 'V8', 'V12', 'V16', 'V27', 'V31', 'V37']

接下来,咱们就需要将数据做一个处理,做一个归一化处理,测试集和数据集都要做。做的时候注意,train 训练集我们需要 fit,测试集就不需要了:

# 数据归一化处理
ss = StandardScaler()
# 训练集的数据归一化
train[features_filter] = ss.fit_transform(train[features_filter])
# 训练集的数据归一化
test[features_filter] = ss.transform(test[features_filter])

接着就是创建模型,引用模型对数据进行训练:

# 模型创建,线性回归
model = LinearRegression()
# 模型训练
model.fit(train[features_filter], train['target'])

再然后就是预测了

# 模型预测
y_pred = model.predict(test[features_filter])
y_pred

咱们将这个预测结果保存一下,存成 DataFrame 格式,整个数据是不需要表头的,我们可以设置 header 为 None

y_pred = pd.DataFrame(y_pred)
y_pred.to_csv('dataset/baseline.txt', index=False, header=None)

看看这个baseline.txt

在这里插入图片描述

发现里面是有一些负数的,我们需要回过头去看一下咱们的源数据 train, 观察一下它里面是不是也有负数,原来那个数据的 target 如果没有负数那你预测出来负数可能也不太对。

train['target'].value_counts()

---
target
 0.451    7
         ..
-0.658    1
         ..
-3.005    1
         ..

好,也是有负数的。那说明咱们预测的没有问题。这样,就把这个例子给大家写完了。这个模型只是做简化版,并没有说一定要去做一个精确版的。

这个例子就把一个蒸汽量的预测问题给大家写完了,这章重点看的是前面的可视化的过程,而不是训练。训练之前给大家讲了太多了。可视化过程可以让你对特征会比较熟悉和了解,有没有异常值、分布是不是一致,你看到它就会有后续的一些想法,idea 就会产生。哪个特征是比较关键的,这些特征之间的相关性系数是如何,重要特征,最重要的那几个是哪些等等就可以拿出来了。

如果你想要做更精确的预测的话可以用复杂模型,比如说你可以用 XGBoost,用 LightGBM,树模型都是一些非线性模型。它的模型就会比较复杂。

咱们上面这个数据也没有对异常值做处理,如果你想要 drop 异常值的话也是可以做一些处理的。但是异常值其实不是所有的情况下都一定需要 drop,它只是给你判断出来有异常值。我们需要观察测试集里面有没有异常值,如果你的测试集里面有异常值的话那么就需要在训练集里有异常值。有点像它的分布情况是一样的。所以异常值只是给你提醒,说这样的数据跟其他的分布之间差别比较大而已。很多时候还是要看测试集里面有没有,要去做一个判断才可以。

咱们花了三节课的时间来做数据可视化探索,方便你对数据的异常值检测,数据的一些特征的情况做一些了解。这样你对数据的字段就更加的清楚。

咱们讲了几个图形,这其中饼图其实可以用直方图来呈现,领导有可能会看,但一般来说我们自己也要去做分析,打比赛的时候,做项目的时候用的更多的是散点图,折线图和直方图。

好,预告一下内容,下一节课,咱们会进行一些产品型的一些内容。那咱们下节课再见。

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

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

相关文章

c++之说_12|模板

关于模板&#xff0c;至少我们要先了解几个概念 一&#xff1a;函数模板 二&#xff1a;类模板 三&#xff1a;模板特化 四&#xff1a;形参参数包 模板覆盖的东西太多 我目前也不了解太多 函数模板 语法 template<typename 类型名,typename 类型名,typename ...多参…

006集——where语句进行属性筛选——arcgis

在arcgis中&#xff0c; dBASE 文件除了 WHERE 语句以外&#xff0c;不支持 其它 SQL 命令。选择窗口如下&#xff1a; 首先&#xff0c;我们了解下什么是where语句。 WHERE语句是SQL语言中使用频率很高的一种语句。它的作用是从数据库表中选择一些特定的记录行来进行操作。WHE…

uniapp小程序端使用计算属性动态绑定style样式踩坑

踩坑点: 使用uniapp编译小程序端动态绑定复杂style使用计算属性方式&#xff0c;return必须返回json字符串格式&#xff0c;不能返回object&#xff0c;否则会不起作用。 代码总览 视图层 逻辑层&#xff08;注意这里是使用的计算属性哈&#xff09; 这里我封装成了一个个性化…

安全名词解析-水坑攻击、鱼叉攻击、钓鲸攻击

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 水坑攻击02 鱼叉攻击03 钓鲸攻击 01 水坑攻击 水坑攻击&#xff08;Watering Hole Attack&#xff09;是一种针对特定目标的网络攻击方式。顾名思义&#xff0c;是在受害者必经之路设置了一个“水坑…

PyTorch 2.2大更新!集成FlashAttention-2,性能提升2倍

【新智元导读】新的一年&#xff0c;PyTorch也迎来了重大更新&#xff0c;PyTorch 2.2集成了FlashAttention-2和AOTInductor等新特性&#xff0c;计算性能翻倍。 新的一年&#xff0c;PyTorch也迎来了重大更新&#xff01; 继去年十月份的PyTorch大会发布了2.1版本之后&#…

Octave实现位置式PID算法

由于Matlab不让用&#xff0c;只能“你不让爷用&#xff0c;爷就用别的”&#xff0c;选择开源的Octave以及scilab进行相关领域的学习。Octave的代码和Matlab几乎是100%相同的&#xff0c;只有一些专用的包的函数&#xff0c;可能有些还没来得及写&#xff0c;或者有些差异。但…

NLP_语言模型的雏形 N-Gram 模型

文章目录 N-Gram 模型1.将给定的文本分割成连续的N个词的组合(N-Gram)2.统计每个N-Gram在文本中出现的次数&#xff0c;也就是词频3.为了得到一个词在给定上下文中出现的概率&#xff0c;我们可以利用条件概率公式计算。具体来讲&#xff0c;就是计算给定前N-1个词时&#xff0…

Redis篇之redis是单线程

一、redis是单线程 Redis是单线程的&#xff0c;但是为什么还那么快&#xff1f;主要原因有下面3点原因&#xff1a; 1. Redis是纯内存操作&#xff0c;执行速度非常快。 2. 采用单线程&#xff0c;避免不必要的上下文切换可竞争条件&#xff0c;多线程还要考虑线程安全问题。 …

硬件大熊原创合集(2024/01更新)

则2024-01月份更新篇章&#xff1a; NFC芯片WS1850的9个典型问题-篇章1 凡夫畏果&#xff0c;菩萨畏因 赶在春节前&#xff0c;做个红包封面&#xff0c;一轮操作下来&#xff0c;发现自己在美工设计这块实在是太欠缺&#xff0c;还好图像处理AI出来了&#xff0c;用Midijourne…

软考 系统分析师系列知识点之信息系统战略规划方法(3)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之信息系统战略规划方法&#xff08;2&#xff09; 所属章节&#xff1a; 第7章. 企业信息化战略与实施 第4节. 信息系统战略规划方法 7.4.1 企业系统规划法 7. 确定管理部门对系统的要求 BSP的出发点是管理部门对系统的要…

WordPress如何实现随机显示一句话经典语录?怎么添加到评论框中?

我们在一些WordPress网站的顶部或侧边栏或评论框中&#xff0c;经常看到会随机显示一句经典语录&#xff0c;他们是怎么实现的呢&#xff1f; 其实&#xff0c;boke112百科前面跟大家分享的『WordPress集成一言&#xff08;Hitokoto&#xff09;API经典语句功能』一文中就提供…

Tomcat之虚拟主机

1.创建存放网页的目录 mkdir -p /web/{a,b} 2.添加jsp文件 vi /web/a/index.jsp <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <html> <head><title>JSP a page</title> </head> …

BUUCTF-Real-[Tomcat]CVE-2017-12615

目录 漏洞描述 一、漏洞编号&#xff1a;CVE-2017-12615 二、漏洞复现 get flag 漏洞描述 CVE-2017-12615&#xff1a;远程代码执行漏洞 影响范围&#xff1a;Apache Tomcat 7.0.0 - 7.0.79 (windows环境) 当 Tomcat 运行在 Windows 操作系统时&#xff0c;且启用了 HTTP P…

力扣面试题 05.06. 整数转换(位运算)

Problem: 面试题 05.06. 整数转换 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.通过将两个数进行异或操作求出两个数中不同的位(不同的位异或后为二进制1); 2.统计异或后不同的位的个数(即异或后二进制为1的个数) 复杂度 时间复杂度: O ( 1 ) O(1) O(1) 空间…

《Git 简易速速上手小册》第9章:Git 工作流程定制(2024 最新版)

文章目录 9.1 选择合适的工作流9.1.1 基础知识讲解9.1.2 重点案例&#xff1a;为中等规模的 Python 项目选择 Feature Branch 工作流9.1.3 拓展案例 1&#xff1a;适应 Gitflow 工作流的大型项目9.1.4 拓展案例 2&#xff1a;使用 Forking 工作流的开源 Python 项目 9.2 定制化…

94.网游逆向分析与插件开发-游戏窗口化助手-地图数据获取的逆向分析与C++代码还原

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级经验数据获取的逆向分析 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;c4351a5b346d8953a1a8e3ec…

Hgame week1 web

1.Bypass it 不准注册&#xff0c;禁用一下js成功注册登录拿到flag 2.ezHTTP 跟着提示走就行 jwt解析一下 3.点击选课发包时候显示已满 一直发包就会选上 每个都一直发包最后就可以全选课成功 后来得知是后天每隔一段时间会放出一些课&#xff0c;一直发包就能在放课的时候选到…

CDN相关和HTTP代理

CDN相关和HTTP代理 参考&#xff1a; 《透视 HTTP 协议》——chrono 把这两个放在一起是因为容易搞混&#xff0c;我一开始总以为CDN就是HTTP代理&#xff0c;但是看了极客时间里透视HTTP协议的讲解&#xff0c;感觉又不仅于此&#xff0c;于是专门写下来。 先说结论&#xf…

计算机组成原理——计算机系统概述

文章目录 概要计算机硬件的基本组成早期冯诺依曼的结构介绍特点 现代计算机的结构介绍五大部件的归属 五大部件存储器&#xff1a;存储体 MAR、MDR运算器控制器 运行原理 计算机软件系统软件和应用软件三种级别的语言编译程序与解释程序的区别 软件硬件功能程序的等价性指令集体…

LLaMA 模型中的Transformer架构变化

目录 1. 前置层归一化&#xff08;Pre-normalization&#xff09; 2. RMSNorm 归一化函数 3. SwiGLU 激活函数 4. 旋转位置嵌入&#xff08;RoPE&#xff09; 5. 注意力机制优化 6. Group Query Attention 7. 模型规模和训练超参数 8. 分布式模型训练 前置归一化与后置…