Python环境下基于机器学习(决策树,随机森林,KNN和SVM)的轴承故障诊断

news2024/9/22 4:22:30

故障特征提取就是从振动信号中提取时、频域统计特征,并利用能量值、谱峭度、幅值等指标,提取出故障特征集。对故障特征值进行全面准确地提取,是提高诊断精度的关键,也是整个滚动轴承故障诊断过程中较困难的部分。

一些常见的时域特征和频域特征计算如下:

图片

图片

此外:

时域特征
时域特征提取 - Data螺丝钉的文章 - 知乎
https://zhuanlan.zhihu.com/p/398752292
频域特征:
信号进行频域分析,能提取哪些特征,有什么物理意义呢? - Xinquan的回答 - 知乎
https://www.zhihu.com/question/60550840/answer/177778560
能量特征(小波包子频带能量)
分形特征
熵特征
XSpecEn:两个序列之间的交叉谱熵(cross-spectral entropy)
XSampEn:两个序列之间的交叉样本熵(cross-sample entropy)
参考论文:Physiological time-series analysis using approximate entropy and sample entropy
XPermEn:两个序列之间的交叉排列熵(cross-permutation entropy)
参考论文:The coupling analysis of stock market indices based on cross-permutation entropy
XMSEn:两个序列之间的多尺度交叉熵(multiscale cross-entropy)
参考论文:Multiscale cross entropy: a novel algorithm for analyzing two time series
XK2En:两个序列之间的交叉Kolmogorov熵(cross-Kolmogorov (K2) entropy)
XFuzzEn:两个序列之间的交叉模糊熵(cross-fuzzy entropy)
参考论文:Cross-fuzzy entropy: A new method to test pattern synchrony of bivariate time series
XDistEn:两个序列之间的交叉分布熵(cross-distribution entropy)
参考论文:Analysis of financial stock markets through the multiscale cross-distribution entropy based on the Tsallis entropy
XDistEn:两个序列之间的交叉条件熵(corrected cross-conditional entropy)
参考论文:Conditional entropy approach for the evaluation of the coupling strength
XApEn:两个序列之间的交叉近似熵(cross-approximate entropy)
参考论文:Randomness and degrees of irregularity
SyDyEn:符号动力熵(symbolic dynamic entropy)
参考论文:A fault diagnosis scheme for planetary gearboxes using modified multi-scale symbolic dynamic entropy and mRMR feature selection.
SpecEn:单一序列的谱熵(spectral entropy)
参考论文:A spectral entropy method for distinguishing regular and irregular motion of Hamiltonian systems.
SlopEn:斜率熵(Slope Entropy)
SampEn2D:数据矩阵的二维样本熵(bidimensional sample entropy of a data matrix)
SampEn:单一序列的样本熵(sample entropy)
rXMSEn:细化多尺度交叉熵(refined multiscale cross-entropy)
PhasEn:相位熵(phase entropy)
PermEn2D:二维排列熵( bidimensional permutation entropy)
IncrEn:增量熵(increment entropy)
hXMSEn:两个序列的层次交叉熵(hierarchical cross-entropy)
GridEn:网格分布熵(gridded distribution entropy)
EspEn2D:二维Espinosa 熵(bidimensional Espinosa entropy)
DispEn2D:二维色散熵(bidimensional dispersion entropy)
cXMSEn:复合多尺度交叉熵(composite multiscale cross-entropy)
CoSiEn:余弦相似熵(cosine similarity entropy )
BubbEn:气泡熵(bubble entropy)
AttnEn:注意力熵( attention entropy)
时频域特征
多分辨分析在信号处理中的应用-第1篇
https://zhuanlan.zhihu.com/p/55

鉴于此,本项目在Python环境下采用基于机器学习(决策树,随机森林,KNN和SVM)对轴承进行故障诊断,并利用网格搜索算法对机器学习进行调优,项目所使用的数据非原始数据,是经过特征提取的(峭度等特征),训练集如下:

图片

测试数据如下:

图片

代码如下:

#导入相关模块
import numpy as np 
import pandas as pd 
import seaborn as sns
from pylab import rcParams
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.preprocessing import OrdinalEncoder
from sklearn.preprocessing import StandardScaler

#加载训练数据importing training data
train_data = pd.read_csv(r'training set.csv')


#对故障类型进行编码encoding type of faults
ord_enc = OrdinalEncoder()
train_data[["fault", "fault_code"]]

train_data['fault_code'].unique()

#每个故障类型的数据点个数
train_data[['fault_code', 'fault']].value_counts()
#特征标准化Scaling
scaler = StandardScaler()
scaled_df = pd.DataFrame(scaler.fit_transform(train_data.iloc[:,:-2]))
scaled_df.head()

#替换列名称
scaled_df.columns = train_data.drop(['fault', 'fault_code'],1).columns

scaled_train_data  = pd.concat([scaled_df, train_data[['fault', 'fault_code']]], 1)
scaled_train_data


## 探索性数据分析
#协相关矩阵
rcParams['figure.figsize'] = 12, 10
sns.heatmap(scaled_train_data.iloc[:,:-2].corr(),annot=True,cmap='RdYlGn')
fig=plt.gcf()
plt.show()

#两两关系图pairplot
rcParams['figure.figsize'] = 6, 5
sns.pairplot(scaled_train_data.drop('fault_code',1),hue='fault',palette='Dark2')
plt.show()

#处理测试数据
#加载测试数据
test_data = pd.read_csv(r'testing set.csv')
test_data

test_data['fault'].value_counts()

#编码
test_data["fault_code"] = ord_enc.transform(test_data[["fault"]])

#数据标准化
scaled_df = pd.DataFrame(scaler.transform(test_data.iloc[:,:-2]))
scaled_df.head()

#替换列名称
scaled_df.columns = test_data.drop(['fault', 'fault_code'],1).columns

scaled_test_data  = pd.concat([scaled_df, test_data[['fault', 'fault_code']]], 1)
scaled_test_data


#X_train训练数据
X_train = scaled_train_data.drop(['sd', 'skewness','fault','fault_code'],1)
X_train.head()
#y_train训练标签
y_train = scaled_train_data['fault_code']
y_train.head()

#X_test测试数据
X_test = scaled_test_data.drop(['sd','skewness','fault','fault_code'],1)
X_test.head()

#y_test测试标签
y_test = scaled_test_data['fault_code']
y_test.head()

##############决策树分类
from sklearn.tree import DecisionTreeClassifier
dt_clf = DecisionTreeClassifier().fit(X_train, y_train)

#预测
dt_predictions = dt_clf.predict(X_test)
print(dt_predictions)

#Train Score Vs Test Score
print('Train Score:',dt_clf.score(X_train, y_train), 'Test Score:',dt_clf.score(X_test, y_test))

#混淆矩阵Confusion Matrix
fig, ax = plt.subplots(figsize=(5,5))
from sklearn.metrics import plot_confusion_matrix
plot_confusion_matrix(dt_clf, X_test, y_test, ax=ax)

#性能分数
from sklearn.metrics import classification_report
labels= ['outer race', 'inner race', 'healthy']
print(classification_report(y_test, dt_predictions, target_names=labels))

# 根据随机搜索的结果创建参数网格
params = {
    'min_samples_leaf': [1, 2, 3, 4, 5, 10],
    'criterion': ["gini", "entropy"],
    'max_depth':[1, 2, 3, 4,6,8],
    'min_samples_split': [2, 3, 4]    
}

# 实例化网格搜索模型
from sklearn.model_selection import GridSearchCV

dt_best_clf = GridSearchCV(estimator=dt_clf, 
                           param_grid=params, 
                           cv=4, n_jobs=-1, verbose=1, scoring = "accuracy")
dt_best_clf.fit(X_train, y_train)


#最优估计参数
dt_best_clf.best_estimator_

dt_best_clf = DecisionTreeClassifier(max_depth=2,min_samples_split=4 , random_state=42).fit(X_train, y_train)

#预测
dt_best_predictions = dt_best_clf.predict(X_test)
print(dt_best_predictions)

#Train Score Vs Test Score
print('Train Score:',dt_best_clf.score(X_train, y_train), 'Test Score:',dt_best_clf.score(X_test, y_test))

#混淆矩阵
fig, ax = plt.subplots(figsize=(5,5))
plot_confusion_matrix(dt_best_clf, X_test, y_test, ax=ax)

#性能分数
print(classification_report(y_test, dt_best_predictions, target_names=labels))

#绘制决策树
from sklearn import tree
fig = plt.figure(figsize=(10,10))
_ = tree.plot_tree(dt_best_clf,
                   feature_names=X_train.columns,
                   class_names=['inner race', 'outer race', 'healthy'],
                   filled=True)

########################################随机森林分类
#导入随机森林分类器importing Random Forest Classifier
from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(random_state = 2)

#随机森林训练
rf_clf.fit(X_train, y_train)
#测试集预测
rf_predictions = rf_clf.predict(X_test)

#Train score Vs Test score
print('Train score:',rf_clf.score(X_train, y_train), 'Test Score:',rf_clf.score(X_test, y_test))


#混淆矩阵
fig, ax = plt.subplots(figsize=(5,5))
plot_confusion_matrix(rf_clf, X_test, y_test, ax=ax)

#性能分数
print(classification_report(y_test, rf_predictions, target_names=labels))

#搜索参数
n_estimators = [1, 5, 10, 20, 100, 120] 
max_depth = [1, 2, 3] 
min_samples_split = [2, 3, 4, 6, 8] 
min_samples_leaf = [ 1, 2, 3] 

random_grid = {'n_estimators': n_estimators,'max_depth': max_depth,'min_samples_split': min_samples_split,
'min_samples_leaf': min_samples_leaf,}

#使用随机搜索算法using RandomizedSearchCV
from sklearn.model_selection import RandomizedSearchCV
rf_best_clf = RandomizedSearchCV(estimator = rf_clf,param_distributions = random_grid,
               n_iter = 1000, cv = 10, verbose=5, n_jobs = -1)

#训练集拟合fitting train set
rf_best_clf.fit(X_train, y_train)

print ('Random grid: ', random_grid, '\n')
#输出最优参数print the best parameters
print ('Best Parameters: ', rf_best_clf.best_params_, ' \n')

#测试
rf_best_clf = RandomForestClassifier(n_estimators:=100, min_samples_split= 4, min_samples_leaf=2, max_depth= 1, 
                                     random_state=90).fit(X_train, y_train)
rf_best_predictions = rf_best_clf.predict(X_test)
print(rf_best_predictions)

#Train score Vs test score
print('Train score:',rf_best_clf.score(X_train, y_train), 'Test score:',rf_best_clf.score(X_test, y_test))

#混淆矩阵onfusion Matrix
fig, ax = plt.subplots(figsize=(5,5))
plot_confusion_matrix(rf_best_clf, X_test, y_test, ax=ax)

#性能分数
print(classification_report(y_test, rf_best_predictions, target_names=labels))


########################################KNN分类
#导入KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier()

#训练集进行拟合
knn_clf.fit(X_train, y_train)
#进行预测
knn_predictions = knn_clf.predict(X_test)
print(knn_predictions)
#Train score vs test score
print('Train score:',knn_clf.score(X_train, y_train), 'Test score:',knn_clf.score(X_test, y_test))

#混淆矩阵Confusion Matrix
fig, ax = plt.subplots(figsize=(5,5))
plot_confusion_matrix(knn_clf, X_test, y_test, ax=ax)
#性能分数
print(classification_report(y_test, knn_predictions, target_names=labels))
#要微调的超参数列表
leaf_size = [1, 2, 3, 4, 5]
n_neighbors = [1, 2, 3, 4, 5]
p=[1, 2, 3]

#转换为字典
hyperparameters = dict(leaf_size=leaf_size, n_neighbors=n_neighbors, p=p)
#使用网格搜索算法GridSearch
knn_best_clf = GridSearchCV(knn_clf, hyperparameters, cv=10)
knn_best_clf.fit(X_train, y_train)
#输出最优超参数
print('Best leaf_size:', knn_best_clf.best_estimator_.get_params()['leaf_size'])
print('Best p:', knn_best_clf.best_estimator_.get_params()['p'])
print('Best n_neighbors:', knn_best_clf.best_estimator_.get_params()['n_neighbors'])
#预测
knn_best_predictions = knn_best_clf.predict(X_test)
print(knn_best_predictions)
#Train score Vs Test score
print('Train score:',knn_best_clf.score(X_train, y_train), 'Test score:',knn_best_clf.score(X_test, y_test))
#混淆矩阵Confusion Matrix
fig, ax = plt.subplots(figsize=(5,5))
plot_confusion_matrix(knn_best_clf, X_test, y_test, ax=ax)
#性能指标分数
print(classification_report(y_test, knn_best_predictions, target_names=labels))


############################################SVM分类器
#导入SVM分类器并进行训练
from sklearn.svm import SVC
svm_clf = SVC(kernel='rbf')
svm_clf.fit(X_train,y_train)
#预测
svm_predictions = svm_clf.predict(X_test)
print(svm_predictions)
#train score vs test score
print('Train score:',svm_clf.score(X_train, y_train), 'Test score:',svm_clf.score(X_test, y_test))
#混淆矩阵Confusion Matrix
fig, ax = plt.subplots(figsize=(5,5))
plot_confusion_matrix(svm_clf, X_test, y_test, ax=ax)
#性能指标分数
print(classification_report(y_test, svm_predictions, target_names=labels))

#超参数调优
param_grid = {'C': [0.02,0.021,0.022],
              'gamma': [0.8,0.7,0.6, 0.65],
              'kernel': ['rbf']}

grid = GridSearchCV(SVC(), param_grid, refit = True, verbose = 3, cv=10)

#利用网格搜索算法进行拟合训练
grid.fit(X_train, y_train)

#输出最优超参数
print(grid.best_params_)
 
print(grid.best_estimator_)
#最优SVM分类器
best_svm_clf = SVC(kernel = 'rbf', C=0.021, gamma=0.6).fit(X_train, y_train)
#最优预测
best_svm_predictions = best_svm_clf.predict(X_test)
print(best_svm_predictions)
#Train score Vs Test score
print('Train score:',best_svm_clf.score(X_train, y_train), 'Test score:',best_svm_clf.score(X_test, y_test))
#混淆矩阵Confusion Matrix
fig, ax = plt.subplots(figsize=(5,5))
plot_confusion_matrix(best_svm_clf, X_test, y_test, ax=ax)

#性能指标分数
print(classification_report(y_test, best_svm_predictions, target_names=labels))

出图如下:

完整代码:Python环境下基于机器学习(决策树,随机森林,KNN和SVM)的轴承故障诊断

擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

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

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

相关文章

Redis 过期删除策略和内存淘汰策略有什么区别?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都是做删除的操作,但是触发的条件和使用的策略都是不同的。 今天就跟大家理一理&…

如何将OpenCV Java 与Eclipse结合使用

返回目录:OpenCV系列文章目录 上一篇:OpenCV-Java 开发简介 下一篇: 正文: 警告:本教程可以包含过时的信息。 从 2.4.4 版本开始,OpenCV 支持 Java。在本教程中,我将解释如何设置开发环境&a…

信息系统项目管理师019:存储和数据库(2信息技术发展—2.1信息技术及其发展—2.1.3存储和数据库)

文章目录 2.1.3 存储和数据库1.存储技术2.数据结构模型3.常用数据库类型4.数据仓库 记忆要点总结 2.1.3 存储和数据库 1.存储技术 存储分类根据服务器类型分为:封闭系统的存储和开放系统的存储。封闭系统主要指大型机等服务器。开放系统指基于包括麒麟、欧拉、UNIX…

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

文章作者:ajun 随着文档处理需求的增加,格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性,将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件,提供了这样的转换功…

Verilog——信号类型

Verilog HDL 的信号类型有很多种,主要包括两种数据类型:线网类型 (net type) 和寄存器类型 ( reg type )。在进行工程设计的过程中也只会使用到这两个类型的信号。 4.1 信号位宽 定义信号类型的同时,必须定义好信号…

【C#语言入门】22. 接口、依赖反转、单元测试

【C#语言入门】22. 接口、依赖反转、单元测试 一、接口与单元测试 接口的产生:自底向上(重构),自顶向下(设计)C#中接口的实现(隐式,显式,多接口)语言对面向…

java的成员变量和局部变量

1、什么是成员变量和局部变量? 2、成员变量和局部变量区别 区别 成员变量 局部变量 类中位置不同 类中方法外 方法内或者方法声明上 内存中位置不同 堆内存 栈内存 生命周期不同 随着对象的存在而存在,随着对象的消失而消失 随着方法的调用而…

【目标检测】YOLOv2 网络结构(darknet-19 作为 backbone)

上一篇文章主要是写了一些 YOLOv1 的原版网络结构,这篇文章一样,目标是还原论文中原版的 YOLOv2 的网络结构,而不是后续各种魔改的版本。 YOLOv2 和 YOLOv1 不一样,开始使用 Darknet-19 来作为 backbone 了。论文中给出了 Darkne…

RK3568平台 多点触摸电容屏

一.input事件 对于所有的input设备,报告input事件时候都分这么几部分,首先在probe函数中设置设备发送的事件类型、按键类型,设置设备一些属性信息。然后在发送事件时候要根据probe的设置来发送事件,否则就会被判为无效忽略掉。  …

冒泡与二分法的爱恨纠葛

冒泡排序与二分法查找 前言一、冒泡排序?二分法查找?二、冒泡排序的原理及使用1.原理2.手写冒泡排序思路及实现代码讲解效果演示/运行结果 三、二分法查找的原理及使用1.原理2.二分法查找思路及实现运行结果 总结 前言 冒泡排序,编程中&…

怎么做好独立站的SEO优化

随着全球贸易的蓬勃发展,越来越多的企业开始关注外贸市场,并将目光投向了外贸网站。然而,在竞争激烈的外贸市场中,如何写出吸引人的文章,以及如何优化网站以在搜索引擎中脱颖而出,成为了外贸独立网站必须面…

基于spring boot的汽车4s店管理系统

摘 要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,汽车4s店管理系统当然不能排除在外。汽车4s店管理系统是在实际应用和软件工程的开发原理之上,运用java语言以及SpringBoot框架…

【Windows 常用工具系列 15 -- VMWARE ubuntu 安装教程】

文章目录 安装教程镜像下载 工具安装 安装教程 安装教程参考链接:https://blog.csdn.net/Python_0011/article/details/131619864 https://linux.cn/article-15472-1.html 激活码 VMware 激活码连接:https://www.haozhuangji.com/xtjc/180037874.html…

研究人员发现 OpenAI ChatGPT、Google Gemini 的漏洞

自 OpenAI 推出 ChatGPT 以来,生成式 AI 聊天机器人的数量及其在企业中的采用率在一年多时间里呈爆炸式增长,但网络安全专业人士的担忧也随之增加,他们不仅担心威胁组织对新兴技术的使用,还担心大型网络的安全性及模型&#xff08…

开设新量子计算中心!IonQ 全力加速量子商业化

内容来源:量子前哨(ID:Qforepost) 编辑丨慕一 编译/排版丨浪味仙 沛贤 深度好文:1000字丨8分钟阅读 近日,量子计算公司IonQ对外宣布,将在华盛顿开设一家新量子中心。公告里还提出&#xff0c…

【随笔】汇编(寄存器、内存模型、常用指令、语法)

文章目录 一、简介二、寄存器三、内存模型3.1 Heap3.2 Stack 四、指令4.1 示例4.2 语法4.3常用指令 一、简介 汇编语言(英语:assembly language)是任何一种用于电子计算机、微处理器、微控制器,或其他可编程器件的低级语言。在不…

HUAWEI Pocket 2外屏实时查看App动态,小小窗口大便捷

当我们点外卖、等候飞机时,不少人习惯频繁点亮手机查看外卖配送进度、值机时间。 这时候,手机亮屏、解锁、打开对应App查看状态对于我们来说就显得非常繁琐。而华为Pocket 2结合HarmonyOS 4系统的实况窗功能,与常显外屏的搭配使用&#xff0…

PTA黑暗料理

小明最近正开发一个料理手游。游戏中仓库里有一些原材料,每个原材料都不相同。在游戏后台,每个原材料由两个不同整数构成。当烹饪锅有至少N(N≥2)个原材料且其中有N个原材料正好包含N个不同的整数(即这N个整数每个出现…

【Java 数据结构】Map和Set的介绍

目录 1、Map 和 Set 的概念 2、模型 3、Map 的学习 3.1 关于 Map.Entry 3.2 Map 的常用方法 4、Set 的常用方法 5、 Map 和 Set 的注意点 1、Map 和 Set 的概念 Java 提供了 Map 和 Set 的接口,是一种专门用来进行搜索的容器或数据结构,而他搜索…

【Maven篇】解锁 Maven 的智慧:依赖冲突纷争下的版本调停者

缘起 软件开发世界是一个充满无限可能的领域,但同时也伴随着诸多挑战。其中之一,就是依赖冲突的问题。在这篇文章中,我们将揭开 Maven 这位“版本调停者”的神秘面纱,深入探讨如何在版本纠纷的盛宴中解决依赖问题。 Maven&#…