超级小白级入门—凯斯西储大学(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文件,看看究竟是个啥样子

# 用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、复制数据所在路径,蓝色部分就要所要的路径啦!

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

  • 45
    点赞
  • 191
    收藏
    觉得还不错? 一键收藏
  • 58
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值