超级小白级入门—凯斯西储大学(CWRU)滚动轴承数据中心

超级小白级入门—凯斯西储大学(CWRU)滚动轴承数据中心

一、全文内容介绍

简单介绍数据集

数据简单预处理

导入简单CNN模型

全文就是突出一个简单。。。๑乛◡乛๑

注:下文会备注一些相关的帖子,感谢很多人的分享,让我个菜鸡能摸索弄清楚。大家如果有问题,可以问在评论区提一下,如果我会肯定尽力解答;如有侵权我会迅速删除;内容可能会在后面的帖子中持续补充,正在入门ing。

二、简单介绍数据集

第一次看到数据集的时候很懵(..•˘_˘•..) 啥啥啥这都是啥

关于实验平台就那个经典绿图

关于故障,故障有很多种分法,比如内外圈、直径大小、3点钟或6点钟位置等等。。。大家可以看一下别人的详细帖子,这里不多介绍,不然偏题了。如图1所示,是我完全能理解的一个示意图,初次看到的时候简直整个人豁然开朗。

图1 数据分析图

注:图来源链接为【凯斯西储大学数据集介绍(CWRU)】-CSDN博客

看完这个图,第一眼记下来,过了几秒我又忘记了。。。所以我直接找了个10分类数据来做。

1、10分类数据下载

可以看一下在文件夹中的样子,我是直接下载的mat文件,下面是我改名字之后的文件,应该用的就是1797那个。。。可以不在意名字是什么,只要知道是个10分类就好了,等过一遍回头花时间琢磨就通了,来,继续往下走。

我给大家放一个百度云盘链接,大家需要可以下载,当然也是第一次在帖子里放链接,要是有啥问题或者过期了,评论发消息我看了就回复哈。为防意外,我把整理好的csv文件也放在网盘里,如果这一步暂时遇到问题,大家还可以往下继续(..•˘_˘•..)

百度云盘下载: 链接: https://pan.baidu.com/s/13zSF6ZfWaIcvovi8r2djew?pwd=gSx9 提取码:gSx9

2、10分类数据处理

来了来了,要上代码的时刻来了!这块代码主要参考如下链接:Python-凯斯西储大学(CWRU)轴承数据解读与分类处理-CSDN博客

查看mat文件

首先咱们查看一个mat文件,看看究竟是个啥样子

# 用Python读取第一个数据集IR007_0结果如下

from scipy import io as scio

mat_fileName = '105.mat'

data = scio.loadmat(mat_fileName ) # 读出来的数据是字典dict型

data

# 得出的结果如下(下面是结果展示!这是结果!)

'''

{'__header__': b'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Mon Jan 31 13:49:59 2000',

'__version__': '1.0',

'__globals__': [],

'X105_DE_time': array([[-0.08300435],

[-0.19573433],

[ 0.23341928],

...,

[-0.31642363],

[-0.06367457],

[ 0.26736822]]),

'X105_FE_time': array([[-0.40207455],

[-0.00472545],

[-0.10663091],

...,

[ 0.31598909],

[ 0.35091636],

[ 0.03307818]]),

'X105_BA_time': array([[ 0.06466148],

[-0.02309626],

[-0.08852226],

...,

[ 0.09648926],

[ 0.08405591],

[-0.02015893]]),

'X105RPM': array([[1797]], dtype=uint16)}

'''

如果看不懂,好,我们跳过去。我看array也晕,小问题,下面看数据量。

12w,是个很敏感的数字,记住它!

# 查看一下驱动端数据条数

data['X105_DE_time'].shape

# 将近12万条,也就是采集了近10秒的数据(这也是结果!)

# (121265, 1)

加载10类数据

下面就是转为CSV文件的代码辣!

敲黑板!你要做的就是修改一个文件的位置,大家努力一下,比如我的文件位置是这样D:\\work\\Anaconda\\10class\\{file_names[index]}.mat,你的就不一定是了,如果巧了那就好巧,记得改哦๑乛◡乛๑

import numpy as np

import pandas as pd

from scipy.io import loadmat

# Assuming your filenames are as follows:

file_names = ['097','105', '118', '130', '169', '185', '197', '209', '222', '234']

data_columns = [f'X{filename}_DE_time' for filename in file_names]

# columns_name = [f'de_{filename}' for filename in file_names]

columns_name = ['de_normal','de_7_inner','de_7_ball','de_7_outer','de_14_inner','de_14_ball','de_14_outer','de_21_inner','de_21_ball','de_21_outer']

data_12k_1797_10c = pd.DataFrame() # 名称表示10类

for index in range(10):

data = loadmat(f'D:\\work\\Anaconda\\10class\\{file_names[index]}.mat')

dataList = data[data_columns[index]].reshape(-1)

data_12k_1797_10c[columns_name[index]] = dataList[:119808] # 121048 min: 121265

print(data_12k_1797_10c.shape)

data_12k_1797_10c

好了,文件已经出来了,下面咱们绘制一下时序图。

3、10分类数据时序图

import pandas as pd

import matplotlib.pyplot as plt

import warnings

warnings.filterwarnings('ignore')

# 读取CSV文件的前1000行

df = pd.read_csv('data_12k_1797_10c.csv', nrows=1000)

# 获取列名

columns = df.columns

# 设置子图布局

fig, axs = plt.subplots(5, 2, figsize=(12, 15), sharex=True)

# 将列名按顺序分配给子图

for i in range(5):

for j in range(2):

index = i * 2 + j

if index < len(columns):

axs[i, j].plot(df[columns[index]])

axs[i, j].set_title(columns[index])

axs[i, j].set_xlabel('Time')

axs[i, j].set_ylabel('Vibration Signal')

plt.savefig('sequence_chart/my_sequence_plot.png')

# 调整布局

plt.tight_layout()

当当当,好了,得到十张图,大家好好欣赏一下啦!我的长这样,大家应该都一样哈哈哈

三、1D-CNN简单实验

先上代码,代码来源是知乎大佬的帖子(膜拜大佬),帖子如下:基于1D-CNN、2D-CNN,LSTM和SVM的一维信号分类 - 知乎 (zhihu.com)

关于CNN的介绍大家去看其他帖子。利用CNN做故障的分类预测,主要有两种方法,①是做信号切割后直接输入CNN模型,②是做时频分析,将时频谱图输入CNN。1D-CNN是属于前一种。

1、数据处理部分

import pandas as pd

import numpy as np

# 读取 CSV 文件

df = pd.read_csv('data_12k_1797_10c.csv')

# 定义信号间隔长度和每块样本点数

interval_length = 1024

samples_per_block = 1024

# 数据前处理函数

def Sampling(signal, interval_length, samples_per_block):

num_samples = len(signal)

num_blocks = num_samples // samples_per_block

samples = []

for i in range(num_blocks):

start = i * samples_per_block

end = start + interval_length

samples.append(signal[start:end])

return np.array(samples)

def DataPreparation(df, interval_length, samples_per_block):

X, LabelPositional, Label = None, None, None

for count, column in enumerate(df.columns):

SplitData = Sampling(df[column].values, interval_length, samples_per_block)

y = np.zeros([len(SplitData), 10])

y[:, count] = 1

y1 = np.zeros([len(SplitData), 1])

y1[:, 0] = count

# 堆叠并标记数据

if X is None:

X = SplitData

LabelPositional = y

Label = y1

else:

X = np.append(X, SplitData, axis=0)

LabelPositional = np.append(LabelPositional, y, axis=0)

Label = np.append(Label, y1, axis=0)

return X, LabelPositional, Label

# 数据前处理

X, Y_CNN, Y = DataPreparation(df, interval_length, samples_per_block)

print('Shape of Input Data =', X.shape)

print('Shape of Label Y_CNN =', Y_CNN.shape)

print('Shape of Label Y =', Y.shape)

# 结果如下

'''

Shape of Input Data = (1170, 1024) # 1170是样本量,即1198080/1024,样本量除以一个样本的大小等于样本个数

Shape of Label Y_CNN = (1170, 10)

Shape of Label Y = (1170, 1)

'''

# k折交叉验证

from sklearn.model_selection import train_test_split, KFold

kSplits = 5

kfold = KFold(n_splits=kSplits, random_state=32, shuffle=True)

# 大家可以分别输出查看一下 X, Y_CNN, Y 长什么样,下面我展示一下

# X太长了就不放了;

# Y_CNN = array([[1., 0., 0., ..., 0., 0., 0.],

[1., 0., 0., ..., 0., 0., 0.],

[1., 0., 0., ..., 0., 0., 0.],

...,

[0., 0., 0., ..., 0., 0., 1.],

[0., 0., 0., ..., 0., 0., 1.],

[0., 0., 0., ..., 0., 0., 1.]]) #独热编码,能看出是10分类

# Y = array([[0.],

[0.],

[0.],

...,

[9.],

[9.],

[9.]])

这块数据基本转化为清晰的分类数据后,接下来导入CNN模型

2、一维卷积神经网络1D-CNN

# Reshape数据

Input_1D = X.reshape([-1,1024,1])

# 数据集划分

X_1D_train, X_1D_test, y_1D_train, y_1D_test = train_test_split(Input_1D, Y_CNN, train_size=0.75,test_size=0.25, random_state=101)

# 定义1D-CNN模型

class CNN_1D():

def __init__(self):

self.model = self.CreateModel()

def CreateModel(self):

model = models.Sequential([

layers.Conv1D(filters=16, kernel_size=3, strides=2, activation='relu'),

layers.MaxPool1D(pool_size=2),

layers.Conv1D(filters=32, kernel_size=3, strides=2, activation='relu'),

layers.MaxPool1D(pool_size=2),

layers.Conv1D(filters=64, kernel_size=3, strides=2, activation='relu'),

layers.MaxPool1D(pool_size=2),

layers.Conv1D(filters=128, kernel_size=3, strides=2, activation='relu'),

layers.MaxPool1D(pool_size=2),

layers.Flatten(),

layers.InputLayer(),

layers.Dense(100,activation='relu'),

layers.Dense(50,activation='relu'),

layers.Dense(10),

layers.Softmax()

])

model.compile(optimizer='adam',

loss=tf.keras.losses.CategoricalCrossentropy(),

metrics=['accuracy'])

return model

accuracy_1D = []

# 训练结果

for train, test in kfold.split(X_1D_train,y_1D_train):

Classification_1D = CNN_1D()

history = Classification_1D.model.fit(X_1D_train[train], y_1D_train[train], verbose=1, epochs=12)

kf_loss, kf_accuracy = Classification_1D.model.evaluate(X_1D_train[test], y_1D_train[test])

accuracy_1D.append(kf_accuracy)

CNN_1D_train_accuracy = np.average(accuracy_1D)*100

print('CNN 1D train accuracy =', CNN_1D_train_accuracy)

CNN_1D_test_loss, CNN_1D_test_accuracy = Classification_1D.model.evaluate(X_1D_test, y_1D_test)

CNN_1D_test_accuracy*=100

print('CNN 1D test accuracy =', CNN_1D_test_accuracy)

3、绘制结果-可视化

# 定义混淆矩阵

from sklearn.metrics import confusion_matrix

def ConfusionMatrix(Model, X, y):

y_pred = np.argmax(Model.model.predict(X), axis=1)

ConfusionMat = confusion_matrix(np.argmax(y, axis=1), y_pred)

return ConfusionMat

# 画图

import matplotlib.pyplot as plt

import seaborn as sns

plt.figure(1)

plt.title('Confusion Matrix - CNN 1D Train')

sns.heatmap(ConfusionMatrix(Classification_1D, X_1D_train, y_1D_train) , annot=True, fmt='d',annot_kws={"fontsize":8},cmap="YlGnBu")

plt.show()

plt.figure(2)

plt.title('Confusion Matrix - CNN 1D Test')

sns.heatmap(ConfusionMatrix(Classification_1D, X_1D_test, y_1D_test) , annot=True, fmt='d',annot_kws={"fontsize":8},cmap="YlGnBu")

plt.show()

plt.figure(3)

plt.title('Train - Accuracy - CNN 1D')

plt.bar(np.arange(1,kSplits+1),[i*100 for i in accuracy_1D])

plt.ylabel('accuracy')

plt.xlabel('folds')

plt.ylim([0,100])

plt.show()

plt.figure(4)

plt.title('Train vs Test Accuracy - CNN 1D')

plt.bar([1,2],[CNN_1D_train_accuracy,CNN_1D_test_accuracy])

plt.ylabel('accuracy')

plt.xlabel('folds')

plt.xticks([1,2],['Train', 'Test'])

plt.ylim([0,100])

# plt.show()

可视化结果如下:

好,补充完毕,我继续打羽毛球去啦!

四、数据路径修改

大家如果不明白如何修改路径,可以参考一下操作,理解过程后就可以重新把数据放在需要的位置了!

1、在你的电脑某盘里放一个名为10calss的文件夹,当然名字可以随意改

2、双击进入文件夹,鼠标单击蓝色箭头所指位置

3、复制数据所在路径,蓝色部分就要所要的路径啦!

希望能对大家有所帮助 慢慢来就好啦 ^_^

相关推荐

无线路由器模式选哪个好?功能与性能解析
365bet娱乐网站

无线路由器模式选哪个好?功能与性能解析

📅 07-02 👁️ 4817
漫漫长夜存档位置介绍_漫漫长夜怎么保存游戏进度
365bet体育线上

漫漫长夜存档位置介绍_漫漫长夜怎么保存游戏进度

📅 07-17 👁️ 4408
多地可见日环食,错过再等十年!就在明天这个时间
游戏直播虎牙和斗鱼哪个好 全方位对比分析:内容、主播、体验大揭秘