2022第二届中国高校大数据竞赛A题(实时更新)

news2024/10/7 14:28:45

题目

制造业是国民经济的主体,近十年来,嫦娥探月、祝融探火、北斗组网,一大批重大标志性创新成果引领中国制造业不断攀上新高度。作为制造业的核心,机械设备在工业生产的各个环节都扮演着不可或缺的重要角色。但是,在机械设备运转过程中会产生不可避免的磨损、老化等问题,随着损耗的增加,会导致各种故障的发生,影响生产质量和效率。

实际生产中,若能根据机械设备的使用情况,提前预测潜在的故障风险,精准地进行检修维护,维持机械设备稳定运转,不但能够确保整体工业环境运行具备稳定性,也能切实帮助企业提高经济效益。

某企业机械设备的使用情况及故障发生情况数据见“train data.xlsx”,用于设备故障预测及故障主要相关因素的探究。数据包含 9000 行,每一行数据记录了机械设备对应的运转及故障发生情况记录。因机械设备在使用环境以及工作强度上存在较大差异,其所需的维护频率和检修问题也通常有所不同。

数据提供了实际生产中常见的机械设备使用环境和工作强度等指标,包含不同设备所处厂房的室温(单位为开尔文K),其工作时的机器温度(单位为开尔文K)、转速(单位为每分钟的旋转次数rpm)、扭矩(单位为牛米Nm)及机器运转时长(单位为分钟min)。除此之外,还提供了机械设备的统一规范代码、质量等级及在该企业中的机器编号,其中质量等级分为高、中、低(H\M\L)三个等级。对于机械设备的故障情况,数据提供了两列数据描述——“是否发生故障” 和“具体故障类别”。其中“是否发生故障”取值为 0/1,0 代表设备正常运转,1 代
表设备发生故障;“具体故障类别”包含 6 种情况,分别是NORMAL、TWF、HDF、PWF、OSF、RNF,其中,NORMAL代表设别正常运转(与是否发生故障”为 0相对应),其余代码代表的是发生故障的类别,包含 5 种,其中TWF代表磨损故障,HDF代表散热故障,PWF代表电力故障,OSF代表过载故障,RNF代表其他故障。

题目

基于赛题提供的数据,自主查阅资料,选择合适的方法完成如下任务:
任务 1:观察数据“train data.xlsx”,自主进行数据预处理,选择合适的指标用于机械设备故障的预测并说明原因。
任务 2:设计开发模型用于判别机械设备是否发生故障,自主选取评价方式和评价指标评估模型表现。
任 务 3 : 设 计 开 发 模 型 用 于 判 别 机 械 设 备 发 生 故 障 的 具 体 类 别(TWF/HDF/PWF/OSF/RNF),自主选取评价方式和评价指标评估模型表现
任务 4:利用任务 2 和任务 3 开发的模型预测“forecast.xlsx”中是否发生故障以及故障类别。数据“forecast.xlsx”。与数据“train data.xlsx”格式类似,要求在“forecast.xlsx”第 8 列说明设备是否发生故障(0 或 1),在第 9 列标识出具体的故障类型(TWF/HDF/PWF/OSF/RNF)
任务 5:探究每类故障(TWF/HDF/PWF/OSF/RNF)的主要成因,找出与其相关的特征属性,进行量化分析,挖掘可能存在的模式/规则。

做题解析

读完题目,其实我想到了今年长三角数学建模中的齿轮箱故障监测,基本很像。难度不大,注意一些细节,随便拿二等,论文好好优化就一等奖了。

第一问

观察数据“train data.xlsx”,自主进行数据预处理选择合适的指标用于机械设备故障的预测并说明原因。

首先读取数据:

import pandas as pd

data=pd.read_excel('train data.xlsx')

data.head(10)

得到如下:
在这里插入图片描述
查看数据基本信息:

data.info()

如下:
在这里插入图片描述
看起来是没有缺失值的,再用isnull来查看一下是否又缺失值:

data.isnull().sum()

如下:
在这里插入图片描述
可以看到数据肯定是没有缺失值的。

查看数据有哪些特征:

data.columns

得到如下:

Index(['机器编号', '统一规范代码', '机器质量等级', '室温(K)', '室温(K).1', '转速(rpm)', '扭矩(Nm)',
       '使用时长(min)', '是否发生故障', '具体故障类别'],
      dtype='object')

很明显,与机器真正相关的特征中,‘机器编号’, '统一规范代码’这两个是无关的,所以可以删除这两个特征。第一问和第二问都属有一个目标,预测是否发生预测,因此在第一问和第二问中,“具体故障类别”也不是我们需要用的指标。所以也要删除。

data2=data.drop(['机器编号', '统一规范代码','具体故障类别'],axis=1)
data2.head()

得到新的数据如下:
在这里插入图片描述

继续回到目标:数据预处理,并选择合适的指标用于机械设备故障的预测。指标我们已经选取好了,那就是:“机器质量等级 室温(K) 室温(K).1 转速(rpm) 扭矩(Nm) 使用时长(min)”

接下来就说做数据预处理了,我们可以看到:机器质量等级,这个特征属于离散变量而且是字符型,所以需要进行编码处理。先查看这一列有多少等级:

data2['机器质量等级'].unique()

如下,只有三个等级:

array(['L', 'M', 'H'], dtype=object)

大多数人可能会想到通过映射的方式对它们进行编码:

mapping = {
           'L': 3,
           'M': 2,
           'H': 1}
data2['机器质量等级'] =data2['机器质量等级'].map(mapping)
data2.head()

如下:
在这里插入图片描述
这样进行映射也不是不可以,只是这样的方式效果不是最好的,因此我建议使用独热编码,独热编码很适合用来解决类别型数据的离散值问题。

data3=pd.get_dummies(data2,columns=['机器质量等级'])
data3.head()

得到如下:
在这里插入图片描述
接着我们还需要对什么进行处理呢,数据的变化范围不一样,所以我们可以做归一化处理,但是这个并不是必须的,因为第二问我们才可能会用,这取决于我们选择什么样的算法,所以就暂时处理完了。

第二问

提取自变量和因变量:

X = data3.drop('是否发生故障',axis=1)# 特征
y = data3['是否发生故障'] # 目标变量
X

如下:
在这里插入图片描述
分割数据:

from sklearn.model_selection import train_test_split 
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=100)

使用逻辑回归模型:

# 导入模型
from sklearn.linear_model import LogisticRegression

# 初始化模型,使用默认参数
logreg = LogisticRegression()


# 用数据训练模型
logreg.fit(X_train,y_train)

# 使用模型预测
y_pred=logreg.predict(X_test)
y_pred

评估:

from sklearn import metrics
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
print("Precision:",metrics.precision_score(y_test, y_pred))
print("Recall:",metrics.recall_score(y_test, y_pred))

如下:

Accuracy: 0.9711111111111111
Precision: 0.8181818181818182
Recall: 0.2727272727272727

准确率97%挺高了吧,还可以了。为了提升准确率,还可以对数据做归一化,自行尝试。

这里我再用决策树进行尝试:

from sklearn.tree import DecisionTreeClassifier # 导入决策树
# 选择基尼系数作为判断标准,树深度为3
clf_gini = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=0)

clf_gini.fit(X_train, y_train) #训练模型

y_pred_gini = clf_gini.predict(X_test) # 预测模型
y_pred_gini[0:5] # 预测前五个结果

如下:

array([0, 0, 0, 0, 0], dtype=int64)

接着做评估:

from sklearn import metrics
print("Accuracy:",metrics.accuracy_score(y_test, y_pred_gini))
print("Precision:",metrics.precision_score(y_test, y_pred_gini))
print("Recall:",metrics.recall_score(y_test, y_pred_gini))

如下:

Accuracy: 0.9716666666666667
Precision: 0.8260869565217391
Recall: 0.2878787878787879

可视化一下:

import matplotlib.pyplot as plt

plt.figure(figsize=(12,8))
from sklearn import tree
tree.plot_tree(clf_gini.fit(X_train, y_train))

如下:
在这里插入图片描述
可视化混淆矩阵:

# 可视化混淆矩阵
from sklearn.metrics import plot_confusion_matrix
plot_confusion_matrix(clf_gini , X_test, y_test)  
plt.show()

如下:
在这里插入图片描述

这个结果好吗?不,我们来寻优找到最佳参数。
1)确定max_depth最优

## 确定最佳深度
import numpy as np
from sklearn.tree import DecisionTreeClassifier # 导入决策树
score_all=[]
# range(start, stop[, step])
for i in range(1,100,1):
    # 选择基尼系数作为判断标准,树深度为3
    clf_gini = DecisionTreeClassifier(criterion='gini', max_depth=i, random_state=0)
    clf_gini.fit(X_train, y_train) #训练模型
    y_pred_gini = clf_gini.predict(X_test) # 预测模型
    y_pred_gini[0:5] # 预测前五个结果
    from sklearn.metrics import accuracy_score
    acc=accuracy_score(y_test, y_pred_gini)
#   print(acc)
    score_all.append([i,acc])
ScoreAll = np.array(score_all)
max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] #找出最高得分对应的索引
print("最优参数以及最高得分:",ScoreAll[max_score])  
plt.figure(figsize=[20,5])
plt.plot(ScoreAll[:,0],ScoreAll[:,1])
plt.show()

如下,我们的树深度为9的时候最佳分数为0.985:
在这里插入图片描述
2)确定min_samples_split最优

# 分割内部节点所需的最小样本数
## 确定最佳深度max_depth
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier # 导入决策树
score_all=[]
# range(start, stop[, step])
# 带入最佳深度后,再遍历220的内部最小样本数
for i in range(2,20,1):
    # 选择基尼系数作为判断标准,树深度为3
    clf_gini = DecisionTreeClassifier(criterion='gini', max_depth=9, min_samples_split=i,random_state=0)
    clf_gini.fit(X_train, y_train) #训练模型
    y_pred_gini = clf_gini.predict(X_test) # 预测模型
    y_pred_gini[0:5] # 预测前五个结果
    from sklearn.metrics import accuracy_score
    acc=accuracy_score(y_test, y_pred_gini)
#   print(acc)
    score_all.append([i,acc])
ScoreAll = np.array(score_all)
max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] #找出最高得分对应的索引
print("最优参数以及最高得分:",ScoreAll[max_score])  
plt.figure(figsize=[20,5])
plt.plot(ScoreAll[:,0],ScoreAll[:,1])
plt.show()
# 结果显示默认的2就是最佳

如下,可以看到内部节点所需的最小样本数为5的时候,最佳准确度为 0.98611111了:
在这里插入图片描述
3)确定min_samples_leaf参数

# 确定
# 分割内部节点所需的最小样本数min_samples_split
## 确定最佳深度max_depth
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier # 导入决策树
score_all=[]
# range(start, stop[, step])
# 带入最佳深度=12,min_samples_split=2,遍历min_samples_leaf = i
for i in range(1,20,1):
    # 选择基尼系数作为判断标准,树深度为3
    clf_gini = DecisionTreeClassifier(criterion='gini', max_depth=9, min_samples_split=5,min_samples_leaf = i,random_state=0)
    clf_gini.fit(X_train, y_train) #训练模型
    y_pred_gini = clf_gini.predict(X_test) # 预测模型
    y_pred_gini[0:5] # 预测前五个结果
    from sklearn.metrics import accuracy_score
    acc=accuracy_score(y_test, y_pred_gini)
    score_all.append([i,acc])
ScoreAll = np.array(score_all)
max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] #找出最高得分对应的索引
print("最优参数以及最高得分:",ScoreAll[max_score])  
plt.figure(figsize=[20,5])
plt.plot(ScoreAll[:,0],ScoreAll[:,1])
plt.show()
# 最佳参数还是2

如下,min_samples_leaf最佳值为2,此时准确度为0.98666667:
在这里插入图片描述
根据我们前边的一系列操作,我们确定因为max_depth在9附近,min_samples_split在5附近,min_samples_leaf在2附近是最优参数,所以我们分别在这个附近利用网格搜索得到最优参数。因为要涉及到三个参数联调,这里就要用到网格搜索函数。代码如下:

# 网格搜索确定内联最佳
from sklearn.model_selection import GridSearchCV
param_grid = {
    'max_depth':np.arange(6, 12),
    'min_samples_leaf':np.arange(3, 7),
    'min_samples_split':np.arange(1, 4)}

rfc = DecisionTreeClassifier(random_state=66)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(X_train, y_train)
print(GS.best_params_)
print(GS.best_score_)
#这里三个参数和我们前边所暂定的参数都不一样。证明三者之间确实是相互影响的。最终确定还是选取开始的三个。

如下:

{'max_depth': 8, 'min_samples_leaf': 4, 'min_samples_split': 2}
0.9827777777777778

经过对比,最终确定决策树最佳参数为:‘max_depth’: 9, ‘min_samples_leaf’: 5, ‘min_samples_split’: 2},此时准确率为0.98666667

其余还要很多模型,大家可以去尝试。

第三问

设 计 开 发 模 型 用 于 判 别 机 械 设 备 发 生 故 障 的 具 体 类 别
(TWF/HDF/PWF/OSF/RNF),自主选取评价方式和评价指标评估模型表现

第三问跟第一二问不一样了,这里是个多分类问题。所以重新建立一个文件,读取数据,同时还需要删除是否发生故障,因为我认为这个不叫作特征了:

import pandas as pd

data=pd.read_excel('train data.xlsx')

data2=data.drop(['机器编号', '统一规范代码','是否发生故障'],axis=1)
data2.head()

如下:
在这里插入图片描述

查看具体工作类别有哪些:

data2['具体故障类别'].unique()

如下:

array(['PWF', 'Normal', 'OSF', 'TWF', 'RNF', 'HDF'], dtype=object)

查看质量等级有哪些:

data2['机器质量等级'].unique()

如下:

array(['L', 'M', 'H'], dtype=object)

对质量等级映射编码:

mapping = {
           'H': 3,
           'M': 2,
           'L': 1
}
data2['机器质量等级'] =data2['机器质量等级'].map(mapping)
data2.head()

如下:

在这里插入图片描述
查看每个故障类型数量:

df1=data2['具体故障类别'].value_counts()
df1

如下:

Normal    8699
HDF         95
OSF         85
PWF         74
TWF         41
RNF          6
Name: 具体故障类别, dtype: int64

可以看到类型6个,即Normal数量很多,可视化一下更明显:

df1.plot.barh()

如下:
在这里插入图片描述

为了便于处理,我们对目标变量直接进映射编码即可:

mapping = {
           'PWF': 6,
           'Normal': 5,
           'OSF': 4,
           'TWF':3,
           'RNF':2,
           'HDF': 1
}
data2['具体故障类别'] =data2['具体故障类别'].map(mapping)
data2.head()

如下:
在这里插入图片描述

接着开始建立模型,我们首先提取自变量因变量:

from sklearn.model_selection import train_test_split
x=data2.drop(columns='具体故障类别')
y=data2['具体故障类别']

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1)
X_train

如下:
在这里插入图片描述

建立xgboost模型:

#分类器使用 xgboost
from xgboost import XGBClassifier
model = XGBClassifier()

model.fit(X_train, y_train)
y_pred = model.predict(X_test)

y_pred

评估:

from sklearn.metrics import classification_report

print(classification_report(y_test, y_pred))

如下:

 precision    recall  f1-score   support

           1       1.00      0.92      0.96        26
           3       0.50      0.20      0.29         5
           4       0.81      0.87      0.84        15
           5       0.99      0.99      0.99      1739
           6       0.71      0.80      0.75        15

    accuracy                           0.99      1800
   macro avg       0.80      0.76      0.77      1800
weighted avg       0.99      0.99      0.99      1800

第四问

分别把第二问和第三问的模型带进去,分别预测两列数据即可。

第五问

主要就说探索故障类型和其它特征之间的一个规律关系,可以通过相关性热力图、多元回归、反差分析,来找到影响最大的特征,以及相关规律,就是主要成因。

更容易看到更新,请看:实时更新

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FTP工具】FileZila安装以及使用详解

一、FTP概念 安装FTP主要是为了传输文件,FTP是持久的,只有一次认证过程,传输多个文件都是使用同一个连接。因为FTP就是为远程文件交互而设计的,有些时候只是为了单纯做一个文件传输,往往搭建FTP服务更省时和节约成本。…

【每日刷题】之【Z字形变换】

✨✨hello,愿意点进来的小伙伴们,你们好呐! 🐻🐻系列专栏:【力扣刷题篇】 🐲🐲本篇内容: 每日刷题 🐯🐯作者简介:一名现大二的三非编程小白&#…

BI设计上篇 - 像设计师一样思考

形式服从功能。这句产品设计的箴言也适用于数据可视化。就数据可视化的形式和功能而言,我们首先考虑的是我们希望受众能用数据做什么(功能),然后才是用可视化(形式)来简化这个过程。在本文中,我…

总结flutter玩转之-安卓view 承载flutter 的页面

1.假设你已经熟悉flutter 开发熟悉dart 语言 android 原生开发技能 一、在安卓原生项目添加代码 1.创建示例布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…

【Linux修炼】6.gcc/g++及Makefile【工具篇】

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 Linux-gcc/g及Makefile本节目标程序的翻译过程1.程序的翻译过程2. 理解选项的含义3. 动态链接和静态链接Linux项目自动化构建工具-make/Makefile1. 背景2. “见见猪跑”3. makefile原理及语法3.1 Makefile原理3.2 Makefile…

pytorch初学笔记(二):TensorBoard之add_scale()的使用

目录 一、SummaryWriter类的介绍 1. 定义 2. SummaryWriter初始化 2.1 初始化 2.2 帮助文档给出的使用范例 2.3 常用方法 二、add_scale()方法介绍 1. 常用参数介绍 2. 绘制图形 2.1 安装tensorboard 2.2 对应代码 2.3 打开tensorboard窗口 2.3 注意事项 三、a…

kubernetes学习笔记

参考 Cloudman 老师的《每天5分钟玩转Kubernetes》&#xff0c;记录如何使用 Kubernetes &#xff0c;由于版本变化&#xff0c;一些命令也有相应的变化&#xff0c;本文对应 Kubernetes 1.25.3 5. 运行应用 010.123 用 Deployment 运行应用 原文使用kubectl run命令&#x…

JS(Dom对象的属性和方法)第十六课

Dom对象的属性和方法自定义的熟悉操作上面是今天博客要讲述的内容 一个案例回顾上次课讲的内容 下面是Html中的元素布局结构 <div>我是div审查元素<p>我是p标记的元素</p><span>我是span的元素信息</span></div><div class"one&…

搭建ftp服务器注意事项

很早之前写过一篇关于FTP服务器相关博客&#xff1a;FTP服务器主动被动模式详解。直到最近生产环境需要搭建一个FTP服务&#xff0c;才发现一些细节还需注意。 生产环境搭建ftp服务器&#xff0c;如果有外部用户需要连接ftp服务器下载文件&#xff0c;一般用的是Passive (PASV&…

[深度学习] 名词解释--正则化

正则化 花书的定义&#xff1a;凡是可以减少泛化误差&#xff08;过拟合&#xff09;而不是减少训练误差的方法&#xff0c;都叫正则化方法。 目的&#xff1a;拟合训练数据&#xff0c;防止模型过拟合&#xff0c;通常使用L2正则化.用各种方法规范模型参数的方法. 什么是神经网…

408 | 【2012年】计算机统考真题 自用回顾知识点整理

选择题 T2&#xff1a;后缀表达式&#xff08;逆波兰表达式&#xff09;—— 注意 操作数的顺序&#xff01; 中缀转后缀 运算顺序不唯一&#xff0c;因此对应的后缀表达式也不唯一“左优先”原则&#xff1a;只要左边的运算符能先计算&#xff0c;就优先算左边的用栈实现中缀…

JS(DOM)第十五课

Dom的全称是Document Object Model DOM 定义了访问 HTML 和 XML 文档的标准 Dom的定义 DOM 文档对象模型 DOM是针对XML的基于树的API。描述了处理网页内容的方法和接口&#xff0c;是HTML和XML的API&#xff0c;DOM把整个页面规划成由节点层级构成的文档。 DOM本身是与语言无…

基于simulink的超级电容,电池及DC motor充放电系统仿真

目录 一、理论基础 二、核心程序 三、测试结果 作者ID &#xff1a;fpga和matlab CSDN主页&#xff1a;https://blog.csdn.net/ccsss22?typeblog 擅长技术&#xff1a; 1.无线基带,无线图传,编解码 2.机器视觉,图像处理,三维重建 3.人工智能,深度学习 4.智能控制,智能优…

【C ++基础】迭代器(iterator)在string里面的简单使用

【C 基础】迭代器(iterator)在string里面的简单使用 前言 本文是为了扫清后面学习的难点&#xff0c;而特意写的文章&#xff0c;只是介绍迭代器如何在string中使用。 迭代器的详细解释请看这里&#xff1a; [点击跳转&#xff08;这里还没有写哦&#xff09;] C专栏主页&am…

【Node.JS】事件的绑定与触发

往期文章 【Node.JS】写入文件内容 【Node.JS】读取文件内容 目录 简介 绑定事件 on&#xff08;&#xff09; addListener&#xff08;&#xff09; once&#xff08;&#xff09; 监听事件emit&#xff08;&#xff09; 传参 删除事件 removeListener&#xff08;&am…

【无人机】基于蚁群算法的无人机航路规划研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【笔试题】【day14】

目录 第一题&#xff08;哪些成员变量需要在初始化列表初始化&#xff09; 第二题&#xff08;多态的条件&#xff09; 第三题&#xff08;多态的条件&#xff08;通过父类对象调用的全部都是父类的方法&#xff09;&#xff09; 第四题&#xff08;菱形继承&#xff0c;虚…

猴子也能学会的jQuery第一期——什么是jQuery

#1024程序员节&#xff5c;用代码&#xff0c;改变世界 &#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引入jQuery 未完待续 目录 &#x1f4da;系列文章—目录&#x1f525; &#x1f4c4;需要具备的…

【最佳实践】瀚高数据库 Windows企业版v6.0.4 的安装

Windows7、Windows10 一、安装 解压缩文件“hgdb6.0.4-enterprise-windows10-x86-64-20220127.zip”&#xff0c;以【管理员】身份运行 setup.exe。 安装过程基本上是下一步下一步即可&#xff0c;注意步骤如下。 1.1 安装主目录 注意安装路径&#xff0c;不要包含中文&am…

【创作中心】自定义模板的使用

个人主页&#xff1a;天寒雨落的博客_CSDN博客-初学者入门C语言,数据库,python领域博主 &#x1f4ac; 刷题网站&#xff1a;一款立志于C语言的题库网站蓝桥杯ACM训练系统 - C语言网 (dotcpp.com) 特别标注&#xff1a;该博主将长期更新c语言内容&#xff0c;初学c语言的友友们…