专注于工业智能预警系统研发, 通过机理算法和数据驱动算法分析振动信号、音频、DCS、PLC信号、SCADA信号等设备运行状态数据对机器设备进行看病预诊,为机器设备健康运行保驾护航。 网站正在不断建设和完善过程中,欢迎大家给予建议和参与社区建设
52phm,专注于预测性维护知识学习和交流,欢迎广大从事预测性维护行业人员投稿,投稿请联系管理员(wx: www52phmcn),投稿内容可以是:
- date: 2020-12
- author:小知
- describe:电机状态.txt数据集中最后一列是`电机状态`标签,其余列是特征。本数据集可以作为学习工业数据的分类算法使用,(1)分析不同电机状态的特征分布情况;(2)建立分类模型体验分类算法的应用。
数据集下载:http://www.52phm.cn/blog/detail/64
import pandas as pd
DATA_PATH = '../database/电机状态.txt'
SAVE_PATH = '../database/motor.csv'
fp = open(DATA_PATH)
data = [i.strip().split(' ') for i in fp.readlines()]
df = pd.DataFrame(data)
df = df.rename(columns={48: "label"})
df.to_csv(SAVE_PATH, index=False)
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn import metrics
from sklearn import tree
%matplotlib inline
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 路径参数
DATA_PATH = '../database/motor.csv'
SAVE_PATH = ''
# 模型参数
model_params = {"criterion": "gini",
"splitter": "best",
"max_depth": None,
"min_samples_split": 2,
"min_samples_leaf": 1
}
df = pd.read_csv(DATA_PATH)
print(df.shape)
df.head()
(58509, 49)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | label | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | -3.014600e-07 | 8.260300e-06 | -0.000012 | -0.000002 | -1.438600e-06 | -0.000021 | 0.031718 | 0.031710 | 0.031721 | -0.032963 | ... | -0.63308 | 2.9646 | 8.1198 | -1.4961 | -1.4961 | -1.4961 | -1.4996 | -1.4996 | -1.4996 | 1 |
1 | 2.913200e-06 | -5.247700e-06 | 0.000003 | -0.000006 | 2.778900e-06 | -0.000004 | 0.030804 | 0.030810 | 0.030806 | -0.033520 | ... | -0.59314 | 7.6252 | 6.1690 | -1.4967 | -1.4967 | -1.4967 | -1.5005 | -1.5005 | -1.5005 | 1 |
2 | -2.951700e-06 | -3.184000e-06 | -0.000016 | -0.000001 | -1.575300e-06 | 0.000017 | 0.032877 | 0.032880 | 0.032896 | -0.029834 | ... | -0.63252 | 2.7784 | 5.3017 | -1.4983 | -1.4983 | -1.4982 | -1.4985 | -1.4985 | -1.4985 | 1 |
3 | -1.322600e-06 | 8.820100e-06 | -0.000016 | -0.000005 | -7.282900e-07 | 0.000004 | 0.029410 | 0.029401 | 0.029417 | -0.030156 | ... | -0.62289 | 6.5534 | 6.2606 | -1.4963 | -1.4963 | -1.4963 | -1.4975 | -1.4975 | -1.4976 | 1 |
4 | -6.836600e-08 | 5.666300e-07 | -0.000026 | -0.000006 | -7.940600e-07 | 0.000013 | 0.030119 | 0.030119 | 0.030145 | -0.031393 | ... | -0.63010 | 4.5155 | 9.5231 | -1.4958 | -1.4958 | -1.4958 | -1.4959 | -1.4959 | -1.4959 | 1 |
5 rows × 49 columns
df.shape
(58509, 49)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 58509 entries, 0 to 58508
Data columns (total 49 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 0 58509 non-null float64
1 1 58509 non-null float64
2 2 58509 non-null float64
3 3 58509 non-null float64
4 4 58509 non-null float64
5 5 58509 non-null float64
6 6 58509 non-null float64
7 7 58509 non-null float64
8 8 58509 non-null float64
9 9 58509 non-null float64
10 10 58509 non-null float64
11 11 58509 non-null float64
12 12 58509 non-null float64
13 13 58509 non-null float64
14 14 58509 non-null float64
15 15 58509 non-null float64
16 16 58509 non-null float64
17 17 58509 non-null float64
18 18 58509 non-null float64
19 19 58509 non-null float64
20 20 58509 non-null float64
21 21 58509 non-null float64
22 22 58509 non-null float64
23 23 58509 non-null float64
24 24 58509 non-null float64
25 25 58509 non-null float64
26 26 58509 non-null float64
27 27 58509 non-null float64
28 28 58509 non-null float64
29 29 58509 non-null float64
30 30 58509 non-null float64
31 31 58509 non-null float64
32 32 58509 non-null float64
33 33 58509 non-null float64
34 34 58509 non-null float64
35 35 58509 non-null float64
36 36 58509 non-null float64
37 37 58509 non-null float64
38 38 58509 non-null float64
39 39 58509 non-null float64
40 40 58509 non-null float64
41 41 58509 non-null float64
42 42 58509 non-null float64
43 43 58509 non-null float64
44 44 58509 non-null float64
45 45 58509 non-null float64
46 46 58509 non-null float64
47 47 58509 non-null float64
48 label 58509 non-null int64
dtypes: float64(48), int64(1)
memory usage: 21.9 MB
df.isnull().sum()
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 0
33 0
34 0
35 0
36 0
37 0
38 0
39 0
40 0
41 0
42 0
43 0
44 0
45 0
46 0
47 0
label 0
dtype: int64
label_counts = df['label'].value_counts().to_frame().reset_index()
plt.bar(label_counts['index'], label_counts['label'], label='各标签数量', color='r')
plt.legend()
X, Y = df.iloc[:, :-1], df['label'].values
x_train, x_valid, y_train, y_valid = train_test_split(X, Y, test_size=0.3)
print(x_train.shape, x_valid.shape)
(40956, 48) (17553, 48)
from sklearn import tree
m = tree.DecisionTreeClassifier()
m.fit(x_train, y_train)
imp = m.feature_importances_
print(">>> 特征重要性:", imp)
plt.figure(figsize=(16,4))
plt.bar(np.arange(len(imp)), imp, 0.9, label='FeatureImportances', color='r')
plt.xticks(np.arange(len(imp)), np.arange(1, len(imp)1).astype(str), rotation=90)
plt.xlabel('Features')
plt.ylabel('Importances')
plt.legend()
>>> 特征重要性: [5.98440225e-04 3.08229107e-04 1.79175577e-04 1.38681841e-03
4.76279751e-04 1.64382030e-04 1.63175566e-01 1.42651633e-02
9.49281490e-02 2.27506770e-01 3.14778801e-02 2.20768156e-01
1.99832800e-02 1.64328257e-03 3.79598939e-04 4.09215028e-02
2.95897557e-04 6.24109633e-04 1.06046500e-02 6.31802097e-03
1.44326689e-02 1.74156237e-02 5.58853781e-03 6.33530587e-03
4.25448464e-02 2.51972101e-04 1.57817267e-04 1.22483584e-02
1.23145170e-04 1.46994902e-04 1.71503682e-02 2.49675915e-03
1.35631032e-03 8.04364163e-03 1.86114910e-02 3.98997444e-03
3.14444030e-03 2.12384190e-04 8.10758828e-05 3.74770769e-03
5.02345318e-04 2.75927645e-04 3.57242162e-04 9.54643152e-04
1.91576281e-03 5.65266378e-04 1.13399277e-03 2.10044738e-04]
def train(model):
model.fit(x_train, y_train)
train_acc = model.score(x_train, y_train)
y_pred = model.predict(x_valid)
valid_acc = metrics.accuracy_score(y_valid, y_pred)
valid_mat = metrics.confusion_matrix(y_valid, y_pred)
valid_report = metrics.classification_report(y_valid, y_pred)
print(">>> 训练集准确率:{}".format(train_acc))
print(">>> 验证集准确率:{}".format(valid_acc))
print(">>> 验证集混淆矩阵:\n{}".format(valid_mat))
print(">>> 验证集分类评价:\n{}".format(valid_report))
print(">>> 训练和评估完毕....")
return model
dc = tree.DecisionTreeClassifier(**model_params)
model = train(model=dc)
>>> 训练集准确率:1.0
>>> 验证集准确率:0.9835355779638808
>>> 验证集混淆矩阵:
[[1542 0 0 0 0 26 0 0 8 0 0]
[ 0 1630 0 0 0 0 0 0 0 38 0]
[ 1 0 1548 2 14 0 0 1 1 0 0]
[ 0 0 3 1572 3 0 2 3 0 0 0]
[ 0 1 16 4 1523 0 0 29 0 0 0]
[ 27 0 3 0 0 1552 0 0 17 0 0]
[ 0 0 0 2 0 0 1618 0 0 0 0]
[ 0 0 0 4 24 0 0 1538 0 0 0]
[ 4 2 0 0 1 30 0 0 1595 3 0]
[ 0 20 0 0 0 0 0 0 0 1618 0]
[ 0 0 0 0 0 0 0 0 0 0 1528]]
>>> 验证集分类评价:
precision recall f1-score support
1 0.98 0.98 0.98 1576
2 0.99 0.98 0.98 1668
3 0.99 0.99 0.99 1567
4 0.99 0.99 0.99 1583
5 0.97 0.97 0.97 1573
6 0.97 0.97 0.97 1599
7 1.00 1.00 1.00 1620
8 0.98 0.98 0.98 1566
9 0.98 0.98 0.98 1635
10 0.98 0.99 0.98 1638
11 1.00 1.00 1.00 1528
accuracy 0.98 17553
macro avg 0.98 0.98 0.98 17553
weighted avg 0.98 0.98 0.98 17553
>>> 训练和评估完毕....
2021-12-09 11:26:41
博客笔记
7200
分类:边缘感知
专栏:故障诊断
2021-12-13 17:29:41
互联网
7320
分类:算法开发
专栏:故障诊断
2021-12-19 15:22:38
互联网
1153
分类:算法开发
专栏:风电机组
关注公众号进群
让志同道合读者学习交流
机电设备故障诊断
2021-12-09 11:27:13
博客笔记
5953
分类:边缘感知
专栏:故障诊断
液压装置状态评估
2021-12-05 10:27:37
博客笔记
2110
分类:边缘感知
专栏:未分组
一、赛题背景(一)背景风能是一种环境友好且经济实用的可再生能源。中国是世界排名第一的风力发电国家、新装风力发电设备装机容量最大的国家,并且保持快速增长。由于风力发电正处于飞速发展阶段,风电场数量和规模不断扩大,然而受地理条件和环境因素限制,风电场多位于偏僻遥远的平原、山区或海上,因此为风电公司引入SCADA系统(数据采集与监视控制系统)对风电场群的日常运行进行集中监控、调度和管理,但风电机组受设备、环境、运行状态等因素影响,SCADA系统实时采集的风机运行数据会存在有大量异常值和缺失值,这些“脏数据”的
2021-12-19 01:00:15
互联网
1264
分类:算法开发
专栏:风电机组
风力发电机组由风轮、叶片、主轴承、齿轮箱、发电机、电气系统、液压系统、刹车系统和偏航系统等组成[#],其结构如图1所示。风电机组通过叶轮捕获风能,通过齿轮箱传递到发电机,发电机将机械能转化为电能,通过变频器接入电网。风力发电机由风轮及变桨距系统、轮毅、结构(机舱、地基和塔架)、传动装置、齿轮箱、发电机、电气系统、控制系统、传感器、刹车系统、液压系统和偏航系统等构成。风电机组首先将风能通过风轮转换...
2021-12-19 01:12:13
互联网
561
分类:算法开发
专栏:风电机组
齿轮箱的常见故障有齿轮损伤、轴承损坏、断轴和渗漏油、油温高等。一、 齿轮损伤齿轮损伤的影响因素很多,包括选材、设计计算、加工、热处理、安装调试、润滑和使用维护等。常见的齿轮损伤有齿面损伤和轮齿折断两类。(一) 轮齿折...
2021-12-19 01:20:59
互联网
586
分类:算法开发
专栏:风电机组
异常检测3——常见方法分类基于统计学极值分析对数据分布进行假设基于线性分析基于时空空间关系造成的异常时间序列上的异常基于相似性分析建立在距离度量上的异常检测建立在密度分析上的异常检测基于聚类的异常检测基于偏差高维方法其他集成异常检测监督异常检测,半监督异常检测,主动学习图中的异常检测、网络中的异常检测基于统计学极值分析往往只对单独纬度进行研究,使用上有很大的局限性【1】对数据分布进行假设...
2021-12-19 14:43:14
互联网
1514
分类:算法开发
专栏:工业异常检测
传统统计学习方法: naive approach, moving average, Holt linear, exponential smoothing, ARIMA, and Prophet现代机器学习方法: 树模型等深度学习方法: LSTM、Seq2seq、Transform-XL等树模型需要人为构建特征,同时预测值不可超越区间内取值的上限。深度学习网络,可以发现输入数据之间的交互关系,同时可以发现趋势。根据数据可以尝试不同的方法,选择较优的方法。下面是树模型的构造特征的方法。1. 时间戳特
2021-12-21 11:53:05
互联网
1040
分类:算法开发
专栏:时间序列预测
时间序列算法time series data mining 主要包括decompose(分析数据的各个成分,例如趋势,周期性),prediction(预测未来的值),classification(对有序数据序列的feature提取与分类),clustering(相似数列聚类)等。时间序列的预测常用的思路:1、计算平均值2、exponential smoothing指数衰减...
2021-12-25 19:42:49
互联网
471
分类:算法开发
专栏:时间序列预测
时间序列预测基于历史数据对其后某段时间内的数据进行预测,例如通过对菜品以往的销售数据,预测未来7天不同菜品的销售量,以减少菜品脱销或备货不足。时间序列与常见的回归问题的不同点在于:1、时间序列是跟时间有关的,而线性回归模型中观察结果是独立的;2、随着上升或者下降的趋势,更多的时间序列出现季节性趋势的形式。常用按时间序列排列的一组随机变量X_1,X_2,…,X_t来表示一个随机事件序列,记为{X_t};用x_1,x_2,,...,x_n或{x_t,t=1,2,...,n}表示该随机序列的n个有序观察
2021-12-25 19:45:22
互联网
649
分类:算法开发
专栏:时间序列预测
倒谱分析可检测频谱中的重复模式,使其对区分多个故障非常有用,该故障在不同的主要频谱(即FFT、阶次、包络和增强频谱)中很难看到。 最重要的行业应用与机械诊断相关,如齿轮箱分析,以及其他应用,如:1 回声检测和去除2 以及语音分析 在以下网站中:http://www.bksv.cn/Products/analysis-software/signal-a
2021-12-26 13:31:12
互联网
1017
分类:算法开发
专栏:振动信号预处理
从事设备故障预测与健康管理行业多年的PHM算法工程师(机器医生)、国际振动分析师, 实践、研发和交付的项目涉及“化工、工业机器人、风电机组、钢铁、核电、机床、机器视觉”等领域。专注于工业智能预警系统研发, 通过机理算法和数据驱动算法分析振动信号、音频、DCS、PLC信号、SCADA信号等设备运行状态数据对机器设备进行看病预诊,为机器设备健康运行保驾护航。