从头开始摸索,从完全没学过python和强化学习相关知识,到最终实现SVM分类的一路艰辛,记录一下!
1月13号补档:已经实现了基于QT软件的SVM和CNN模型训练和分类
具体功能详见:支持深度学习的数据采集软件2.0版本,它来了!_哔哩哔哩_bilibili
一、数据集准备
关于数据集的介绍可以看这两篇文章
超级小白级入门—凯斯西储大学(CWRU)滚动轴承数据中心_西储大学轴承数据集-优快云博客
通过网盘分享的文件:CWRU
链接: https://pan.baidu.com/s/1YTrrqP8sYN8S2rfJ48h6dw?pwd=jup6 提取码: jup6
二、数据集处理
这个地方涉及到python的语法,以及一些库函数的调用方法
这里分享以下思路吧(个人觉得思考的过程比较重要):
1.拿到数据集后,知道数据的类型是mat格式,如何去读取这种格式的数据?
这里不详细介绍如何去搭建自己的pytorch环境,可以去b站上找教程。
首先读入数据,看看里面是什么样的,找一下mat文件的读取方式,打印一下看看
file_path = r'D:\download\CWRU\Data\CWRU\NormalBaseline\1730\Normal.mat'
# 读取 .mat 文件
data = scipy.io.loadmat(file_path)
# DE是驱动端,FE是风扇端
X100_DE_time = data['X100_DE_time']#X100_DE_time 的形状: (485643, 1)
X100_FE_time = data['X100_FE_time']
X100RPM = data['X100RPM']# 转速1725
# print("X100_DE_time 前 10 行:")
# print(X100_DE_time[:10])
# print("\nX100_FE_time 前 10 行:")
# print(X100_FE_time[:10])
# print("\nX100RPM 前 10 行:")
# print(X100RPM[:10])
# # 打印读取的数据结构
# print(data.keys())
2.读取数据后,先用简单的代码测试一下,数据有没有问题,先来个FFT变换看看,使用的是normal部分的数据集,因为是FFT变换,变换后的横坐标和你的采样点数是一样的,FFT这个函数会默认归一化[-0.5,0.5],因此需要设置采样频率,并且需要去掉负频率。有条件的朋友可以用其他软件验证一下,FFT是否正确,我这里用的是自己开发的数采软件测试的,结果一样
3、数据读取进来没问题后,下一步就是提取特征,因为SVM是强化学习有监督的,需要人为打上标签。有以下几个部分需要处理:
(1)将数据分段处理,一组数据采样率是48k,转速1725,一秒转28.75圈,每一圈可以采到1,723.5个数据,因此将数据分为1500份以下的时候,都可以采集到完整的一圈的数据,但是这样不太好,建议一组数据含有多圈数据,分为100段既可。
(2)特征值的选取:计算数据的特征向量,包括均值、方差、峰值、有效值、峰值因子、脉冲因子、波形因子、裕度因子和峭度。将这些参数都作为(1)中每一段信号的特征,组成一个向量,还要打上标签。eg:我有一个normal信号,分成100份,每一个都要计算这些参数,作为特征拼成一个数组,存放起来
def calculate_features(data):
"""
计算数据的特征向量,包括均值、方差、峰值、有效值、峰值因子、脉冲因子、波形因子、裕度因子和峭度。
:param data: 输入数据
:return: 特征向量
"""
mean_val = calculate_mean(data)
variance_val = calculate_variance(data)
peak_val = calculate_peak(data)
rms_val = calculate_rms(data)
peak_factor_val = calculate_peak_factor(data)
pulse_factor_val = calculate_pulse_factor(data)
waveform_factor_val = calculate_waveform_factor(data)
margin_factor_val = calculate_margin_factor(data)
kurtosis_val = calculate_kurtosis(data)
features = np.array([
mean_val,
variance_val,
peak_val,
rms_val,
peak_factor_val,
pulse_factor_val,
waveform_factor_val,
margin_factor_val,
kurtosis_val
])
return features
4.如何划分数据进行训练,python的语法比较灵活,主要是两个嵌套
def prepare_dataset(file_paths, labels, num_groups=500):
"""
准备用于 SVM 训练的数据集。
:param file_paths: 文件路径列表
:param labels: 对应的类别标签列表
:param num_groups: 分割成的组数
:return: 特征向量矩阵和标签向量
"""
for path, label in zip(file_paths, labels):
for i in range(num_groups):
5、如何训练的,首先要知道SVM的原理,可以看一下下面的课程:
6.机器学习课程(六)支持向量机(线性模型)问题_哔哩哔哩_bilibili
SVM知道原理后,主要使用库,没有太多操作
def train_and_evaluate_svm(X, y):
"""
训练和评估 SVM 模型。
:param X: 特征向量矩阵
:param y: 标签向量
"""
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建 SVM 分类器
svm_classifier = SVC(kernel='rbf', random_state=42)
# 训练模型
svm_classifier.fit(X_train, y_train)
# 预测
y_pred = svm_classifier.predict(X_test)
# 评估模型
print("准确率:", accuracy_score(y_test, y_pred))
print("分类报告:\n", classification_report(y_test, y_pred))
效果展示:正常和故障的二分类的准确率高达100%,故障之间的分类混淆严重,特征选取有问题(猜测)