当前位置:   article > 正文

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

西储大学轴承数据集

一、全文内容介绍

  1. 简单介绍数据集

  2. 数据简单预处理

  3. 导入简单CNN模型

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

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

二、简单介绍数据集

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

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

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

图1 数据分析图

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

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

1、10分类数据下载

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

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

百度云盘下载:
链接:https://pan.baidu.com/s/1VeBxKK8Rv1CawqNSx-9GSA 
提取码:haha

2、10分类数据处理

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

  • 查看mat文件

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

  1. # 用Python读取第一个数据集IR007_0结果如下
  2. from scipy import io as scio
  3. mat_fileName = '105.mat'
  4. data = scio.loadmat(mat_fileName ) # 读出来的数据是字典dict型
  5. data
  6. # 得出的结果如下(下面是结果展示!这是结果!)
  7. '''
  8. {'__header__': b'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Mon Jan 31 13:49:59 2000',
  9. '__version__': '1.0',
  10. '__globals__': [],
  11. 'X105_DE_time': array([[-0.08300435],
  12. [-0.19573433],
  13. [ 0.23341928],
  14. ...,
  15. [-0.31642363],
  16. [-0.06367457],
  17. [ 0.26736822]]),
  18. 'X105_FE_time': array([[-0.40207455],
  19. [-0.00472545],
  20. [-0.10663091],
  21. ...,
  22. [ 0.31598909],
  23. [ 0.35091636],
  24. [ 0.03307818]]),
  25. 'X105_BA_time': array([[ 0.06466148],
  26. [-0.02309626],
  27. [-0.08852226],
  28. ...,
  29. [ 0.09648926],
  30. [ 0.08405591],
  31. [-0.02015893]]),
  32. 'X105RPM': array([[1797]], dtype=uint16)}
  33. '''

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

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

  1. # 查看一下驱动端数据条数
  2. data['X105_DE_time'].shape
  3. # 将近12万条,也就是采集了近10秒的数据(这也是结果!)
  4. # (121265, 1)
  • 加载10类数据

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

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

  1. import numpy as np
  2. import pandas as pd
  3. from scipy.io import loadmat
  4. # Assuming your filenames are as follows:
  5. file_names = ['097','105', '118', '130', '169', '185', '197', '209', '222', '234']
  6. data_columns = [f'X{filename}_DE_time' for filename in file_names]
  7. # columns_name = [f'de_{filename}' for filename in file_names]
  8. 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']
  9. data_12k_1797_10c = pd.DataFrame() # 名称表示10
  10. for index in range(10):
  11. data = loadmat(f'D:\\work\\Anaconda\\10class\\{file_names[index]}.mat')
  12. dataList = data[data_columns[index]].reshape(-1)
  13. data_12k_1797_10c[columns_name[index]] = dataList[:119808] # 121048 min: 121265
  14. print(data_12k_1797_10c.shape)
  15. data_12k_1797_10c

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

3、10分类数据时序图

  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import warnings
  4. warnings.filterwarnings('ignore')
  5. # 读取CSV文件的前1000
  6. df = pd.read_csv('data_12k_1797_10c.csv', nrows=1000)
  7. # 获取列名
  8. columns = df.columns
  9. # 设置子图布局
  10. fig, axs = plt.subplots(5, 2, figsize=(12, 15), sharex=True)
  11. # 将列名按顺序分配给子图
  12. for i in range(5):
  13. for j in range(2):
  14. index = i * 2 + j
  15. if index < len(columns):
  16. axs[i, j].plot(df[columns[index]])
  17. axs[i, j].set_title(columns[index])
  18. axs[i, j].set_xlabel('Time')
  19. axs[i, j].set_ylabel('Vibration Signal')
  20. plt.savefig('sequence_chart/my_sequence_plot.png')
  21. # 调整布局
  22. plt.tight_layout()

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

三、1D-CNN简单实验

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

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

1、数据处理部分

  1. import pandas as pd
  2. import numpy as np
  3. # 读取 CSV 文件
  4. df = pd.read_csv('data_12k_1797_10c.csv')
  5. # 定义信号间隔长度和每块样本点数
  6. interval_length = 1024
  7. samples_per_block = 1024
  8. # 数据前处理函数
  9. def Sampling(signal, interval_length, samples_per_block):
  10. num_samples = len(signal)
  11. num_blocks = num_samples // samples_per_block
  12. samples = []
  13. for i in range(num_blocks):
  14. start = i * samples_per_block
  15. end = start + interval_length
  16. samples.append(signal[start:end])
  17. return np.array(samples)
  18. def DataPreparation(df, interval_length, samples_per_block):
  19. X, LabelPositional, Label = None, None, None
  20. for count, column in enumerate(df.columns):
  21. SplitData = Sampling(df[column].values, interval_length, samples_per_block)
  22. y = np.zeros([len(SplitData), 10])
  23. y[:, count] = 1
  24. y1 = np.zeros([len(SplitData), 1])
  25. y1[:, 0] = count
  26. # 堆叠并标记数据
  27. if X is None:
  28. X = SplitData
  29. LabelPositional = y
  30. Label = y1
  31. else:
  32. X = np.append(X, SplitData, axis=0)
  33. LabelPositional = np.append(LabelPositional, y, axis=0)
  34. Label = np.append(Label, y1, axis=0)
  35. return X, LabelPositional, Label
  36. # 数据前处理
  37. X, Y_CNN, Y = DataPreparation(df, interval_length, samples_per_block)
  38. print('Shape of Input Data =', X.shape)
  39. print('Shape of Label Y_CNN =', Y_CNN.shape)
  40. print('Shape of Label Y =', Y.shape)
  41. # 结果如下
  42. '''
  43. Shape of Input Data = (1170, 1024) # 1170是样本量,即1198080/1024,样本量除以一个样本的大小等于样本个数
  44. Shape of Label Y_CNN = (1170, 10)
  45. Shape of Label Y = (1170, 1)
  46. '''
  47. # k折交叉验证
  48. from sklearn.model_selection import train_test_split, KFold
  49. kSplits = 5
  50. kfold = KFold(n_splits=kSplits, random_state=32, shuffle=True)
  51. # 大家可以分别输出查看一下 X, Y_CNN, Y 长什么样,下面我展示一下
  52. # X太长了就不放了;
  53. # Y_CNN = array([[1., 0., 0., ..., 0., 0., 0.],
  54. [1., 0., 0., ..., 0., 0., 0.],
  55. [1., 0., 0., ..., 0., 0., 0.],
  56. ...,
  57. [0., 0., 0., ..., 0., 0., 1.],
  58. [0., 0., 0., ..., 0., 0., 1.],
  59. [0., 0., 0., ..., 0., 0., 1.]]) #独热编码,能看出是10分类
  60. # Y = array([[0.],
  61. [0.],
  62. [0.],
  63. ...,
  64. [9.],
  65. [9.],
  66. [9.]])

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

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

  1. # Reshape数据
  2. Input_1D = X.reshape([-1,1024,1])
  3. # 数据集划分
  4. 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)
  5. # 定义1D-CNN模型
  6. class CNN_1D():
  7. def __init__(self):
  8. self.model = self.CreateModel()
  9. def CreateModel(self):
  10. model = models.Sequential([
  11. layers.Conv1D(filters=16, kernel_size=3, strides=2, activation='relu'),
  12. layers.MaxPool1D(pool_size=2),
  13. layers.Conv1D(filters=32, kernel_size=3, strides=2, activation='relu'),
  14. layers.MaxPool1D(pool_size=2),
  15. layers.Conv1D(filters=64, kernel_size=3, strides=2, activation='relu'),
  16. layers.MaxPool1D(pool_size=2),
  17. layers.Conv1D(filters=128, kernel_size=3, strides=2, activation='relu'),
  18. layers.MaxPool1D(pool_size=2),
  19. layers.Flatten(),
  20. layers.InputLayer(),
  21. layers.Dense(100,activation='relu'),
  22. layers.Dense(50,activation='relu'),
  23. layers.Dense(10),
  24. layers.Softmax()
  25. ])
  26. model.compile(optimizer='adam',
  27. loss=tf.keras.losses.CategoricalCrossentropy(),
  28. metrics=['accuracy'])
  29. return model
  30. accuracy_1D = []
  31. # 训练结果
  32. for train, test in kfold.split(X_1D_train,y_1D_train):
  33. Classification_1D = CNN_1D()
  34. history = Classification_1D.model.fit(X_1D_train[train], y_1D_train[train], verbose=1, epochs=12)
  35. kf_loss, kf_accuracy = Classification_1D.model.evaluate(X_1D_train[test], y_1D_train[test])
  36. accuracy_1D.append(kf_accuracy)
  37. CNN_1D_train_accuracy = np.average(accuracy_1D)*100
  38. print('CNN 1D train accuracy =', CNN_1D_train_accuracy)
  39. CNN_1D_test_loss, CNN_1D_test_accuracy = Classification_1D.model.evaluate(X_1D_test, y_1D_test)
  40. CNN_1D_test_accuracy*=100
  41. print('CNN 1D test accuracy =', CNN_1D_test_accuracy)

3、绘制结果-可视化

  1. # 定义混淆矩阵
  2. from sklearn.metrics import confusion_matrix
  3. def ConfusionMatrix(Model, X, y):
  4. y_pred = np.argmax(Model.model.predict(X), axis=1)
  5. ConfusionMat = confusion_matrix(np.argmax(y, axis=1), y_pred)
  6. return ConfusionMat
  7. # 画图
  8. import matplotlib.pyplot as plt
  9. import seaborn as sns
  10. plt.figure(1)
  11. plt.title('Confusion Matrix - CNN 1D Train')
  12. sns.heatmap(ConfusionMatrix(Classification_1D, X_1D_train, y_1D_train) , annot=True, fmt='d',annot_kws={"fontsize":8},cmap="YlGnBu")
  13. plt.show()
  14. plt.figure(2)
  15. plt.title('Confusion Matrix - CNN 1D Test')
  16. sns.heatmap(ConfusionMatrix(Classification_1D, X_1D_test, y_1D_test) , annot=True, fmt='d',annot_kws={"fontsize":8},cmap="YlGnBu")
  17. plt.show()
  18. plt.figure(3)
  19. plt.title('Train - Accuracy - CNN 1D')
  20. plt.bar(np.arange(1,kSplits+1),[i*100 for i in accuracy_1D])
  21. plt.ylabel('accuracy')
  22. plt.xlabel('folds')
  23. plt.ylim([0,100])
  24. plt.show()
  25. plt.figure(4)
  26. plt.title('Train vs Test Accuracy - CNN 1D')
  27. plt.bar([1,2],[CNN_1D_train_accuracy,CNN_1D_test_accuracy])
  28. plt.ylabel('accuracy')
  29. plt.xlabel('folds')
  30. plt.xticks([1,2],['Train', 'Test'])
  31. plt.ylim([0,100])
  32. # plt.show()

可视化结果如下:

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

四、数据路径修改

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/630867
推荐阅读
相关标签
  

闽ICP备14008679号