专业的编程技术博客社区

网站首页 > 博客文章 正文

基于机器学习的风力涡轮机故障诊断和预测性维护(Python)

baijin 2025-01-17 10:53:12 博客文章 8 ℃ 0 评论
import numpy as np
import pandas as pd


import matplotlib.pyplot as plt
import missingno as msno
import seaborn as sns
from sklearn import linear_model
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split, cross_validate, StratifiedKFold, GridSearchCV
from sklearn.preprocessing import StandardScaler
from lightgbm import LGBMClassifier
scada_df = pd.read_csv('scada_data.csv')
scada_df['DateTime'] = pd.to_datetime(scada_df['DateTime'])
scada_df.head()
status_df = pd.read_csv('status_data.csv')
status_df['Time'] = pd.to_datetime(status_df['Time'])
status_df.rename(columns={'Time': 'DateTime'}, inplace=True)


status_df
fault_df = pd.read_csv('fault_data.csv')
fault_df['DateTime'] = pd.to_datetime(fault_df['DateTime'])


fault_df
fault_df.Fault.unique()
array(['GF', 'MF', 'FF', 'AF', 'EF'], dtype=object)
fault_df.resample('M', on='DateTime').Fault.count().plot.bar()
def line_format(label):
    """
    Convert time label to the format of pandas line plot
    """
    month = label.month_name()[:3]
    if month == 'Jan':
        month += f'\n{label.year}'
    return month
c = ['red', 'orange', 'green', 'blue', 'violet']
fault_df.resample('M', on='DateTime').Fault.value_counts().unstack().plot.bar(stacked=True, width=0.8, figsize=(10,5), color=c, rot=45,
                                                                              title='Wind Turbine Faults', ylabel='Fault Counts')
df_combine = scada_df.merge(fault_df, on='Time', how='outer')
msno.matrix(df_combine)
df_combine['Fault'] = df_combine['Fault'].replace(np.nan, 'NF')


df_combine
pd.set_option('display.float_format', lambda x: '%.3f' % x)
df_summary = df_combine.groupby('Fault').mean().T
df_summary.tail(20)
df_combine.Fault.value_counts()
Fault
NF    48581
FF      254
EF      174
AF       62
GF       43
MF       20
Name: count, dtype: int64
df_nf = df_combine[df_combine.Fault=='NF'].sample(300, random_state=42)


df_nf
df_f = df_combine[df_combine.Fault!='NF']


df_f
df_combine = pd.concat((df_nf, df_f), axis=0).reset_index(drop=True)


df_combine
train_df = df_combine.drop(columns=['DateTime_x', 'Time', 'Error', 'WEC: ava. windspeed', 
                                    'WEC: ava. available P from wind',
                                    'WEC: ava. available P technical reasons',
                                    'WEC: ava. Available P force majeure reasons',
                                    'WEC: ava. Available P force external reasons',
                                    'WEC: max. windspeed', 'WEC: min. windspeed', 
                                    'WEC: Operating Hours', 'WEC: Production kWh',
                                    'WEC: Production minutes', 'DateTime_y'])


train_df
train_df.Fault.value_counts().plot.pie(title='Fault Modes')
X = train_df.iloc[:,:-1]
y = train_df.iloc[:,-1]
print(y)
0      NF
1      NF
2      NF
3      NF
4      NF
       ..
848    AF
849    AF
850    AF
851    AF
852    AF
Name: Fault, Length: 853, dtype: object
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
x_train.head()
x_test.head()
y_train.head()
28     NF
665    EF
193    NF
404    AF
465    FF
Name: Fault, dtype: object
y_test.head()
66     NF
434    FF
198    NF
212    NF
652    FF
Name: Fault, dtype: object

NORMALIZING THE INPUTS

scl = StandardScaler()
X_train = scl.fit_transform(x_train)
X_test = scl.transform(x_test)

LOGISTIC REGRESSION

A = linear_model.LogisticRegression()
A.fit(X_train, y_train)
LogisticRegression()
A_lr = A.predict(X_test)
A_lr
array(['NF', 'EF', 'NF', 'NF', 'FF', 'GF', 'NF', 'NF', 'AF', 'FF', 'NF',
       'EF', 'FF', 'MF', 'AF', 'EF', 'EF', 'EF', 'FF', 'GF', 'NF', 'EF',
       'NF', 'FF', 'FF', 'FF', 'FF', 'FF', 'NF', 'EF', 'EF', 'EF', 'FF',
       'FF', 'FF', 'FF', 'NF', 'EF', 'NF', 'FF', 'NF', 'NF', 'EF', 'NF',
       'NF', 'NF', 'AF', 'GF', 'EF', 'EF', 'EF', 'FF', 'NF', 'FF', 'EF',
       'EF', 'EF', 'NF', 'NF', 'FF', 'NF', 'EF', 'NF', 'EF', 'FF', 'FF',
       'NF', 'FF', 'GF', 'NF', 'NF', 'FF', 'NF', 'FF', 'NF', 'NF', 'EF',
       'AF', 'NF', 'NF', 'FF', 'FF', 'GF', 'FF', 'NF', 'NF', 'EF', 'EF',
       'FF', 'EF', 'NF', 'NF', 'EF', 'NF', 'NF', 'NF', 'NF', 'AF', 'FF',
       'NF', 'NF', 'NF', 'FF', 'NF', 'NF', 'NF', 'EF', 'NF', 'NF', 'NF',
       'FF', 'GF', 'FF', 'NF', 'NF', 'FF', 'NF', 'AF', 'EF', 'EF', 'EF',
       'EF', 'EF', 'EF', 'FF', 'EF', 'NF', 'NF', 'AF', 'EF', 'AF', 'NF',
       'NF', 'FF', 'FF', 'EF', 'FF', 'GF', 'NF', 'NF', 'EF', 'EF', 'EF',
       'NF', 'AF', 'NF', 'FF', 'FF', 'FF', 'GF', 'AF', 'NF', 'EF', 'NF',
       'EF', 'EF', 'FF', 'NF', 'EF', 'FF', 'EF', 'NF', 'FF', 'NF', 'NF',
       'AF', 'NF', 'NF', 'NF', 'NF', 'NF', 'FF', 'NF', 'FF', 'NF', 'EF',
       'EF', 'NF', 'FF', 'FF', 'FF', 'EF', 'FF', 'EF', 'FF', 'GF', 'MF',
       'FF', 'EF', 'EF', 'EF', 'EF', 'EF', 'NF', 'NF', 'AF', 'NF', 'FF',
       'NF', 'EF', 'NF', 'NF', 'NF', 'EF', 'NF', 'EF', 'NF', 'FF', 'EF',
       'EF', 'FF', 'EF', 'NF', 'FF', 'EF', 'NF', 'AF', 'EF', 'NF', 'NF',
       'EF', 'FF', 'EF', 'EF', 'EF', 'EF', 'FF', 'FF', 'EF', 'FF', 'EF',
       'AF', 'FF', 'FF', 'FF', 'NF', 'EF', 'FF', 'FF', 'NF', 'FF', 'MF',
       'NF', 'NF', 'FF', 'NF', 'EF', 'FF', 'AF', 'EF', 'NF', 'NF', 'NF',
       'NF', 'NF', 'NF'], dtype=object)
from sklearn.metrics import classification_report,confusion_matrix,accuracy_score,ConfusionMatrixDisplay
matrix_LR=confusion_matrix(y_test,A_lr)
print(matrix_LR,'\n')
print(ConfusionMatrixDisplay.from_predictions(y_test,A_lr))
accuracy_LR=accuracy_score(y_test,A_lr)
print(accuracy_LR,'\n')
report_LR=classification_report(y_test,A_lr)
print(report_LR)
[[ 9  2  0  0  2  7]
 [ 0 45 10  0  0  2]
 [ 0 21 46  0  1  8]
 [ 0  0  1  9  0  0]
 [ 3  0  0  0  0  4]
 [ 3  1  8  0  0 74]] 

<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay object at 0x0000015360F30350>
0.71484375 

              precision    recall  f1-score   support

          AF       0.60      0.45      0.51        20
          EF       0.65      0.79      0.71        57
          FF       0.71      0.61      0.65        76
          GF       1.00      0.90      0.95        10
          MF       0.00      0.00      0.00         7
          NF       0.78      0.86      0.82        86

    accuracy                           0.71       256
   macro avg       0.62      0.60      0.61       256
weighted avg       0.70      0.71      0.70       256
A.score(X_test,y_test)

0.71484375

K - NEAREST NEIGHBOR

B = KNeighborsClassifier(n_neighbors=5)
B.fit(X_train,y_train)
B_knn= B.predict(X_test)
B_knn
array(['NF', 'EF', 'NF', 'NF', 'FF', 'GF', 'NF', 'NF', 'AF', 'FF', 'FF',
       'EF', 'FF', 'MF', 'AF', 'EF', 'EF', 'EF', 'EF', 'GF', 'NF', 'EF',
       'NF', 'FF', 'FF', 'FF', 'FF', 'FF', 'NF', 'EF', 'EF', 'EF', 'EF',
       'EF', 'FF', 'FF', 'AF', 'EF', 'NF', 'FF', 'FF', 'NF', 'EF', 'NF',
       'AF', 'NF', 'NF', 'GF', 'EF', 'EF', 'EF', 'EF', 'NF', 'FF', 'EF',
       'EF', 'EF', 'NF', 'NF', 'FF', 'NF', 'EF', 'NF', 'EF', 'NF', 'AF',
       'NF', 'FF', 'GF', 'NF', 'NF', 'FF', 'NF', 'FF', 'FF', 'NF', 'FF',
       'EF', 'NF', 'NF', 'FF', 'FF', 'GF', 'FF', 'FF', 'FF', 'EF', 'EF',
       'FF', 'EF', 'NF', 'NF', 'EF', 'FF', 'NF', 'NF', 'NF', 'AF', 'FF',
       'NF', 'NF', 'FF', 'FF', 'EF', 'FF', 'NF', 'FF', 'NF', 'NF', 'NF',
       'FF', 'GF', 'FF', 'NF', 'FF', 'FF', 'FF', 'NF', 'EF', 'FF', 'EF',
       'EF', 'EF', 'EF', 'FF', 'EF', 'NF', 'NF', 'NF', 'EF', 'AF', 'NF',
       'NF', 'FF', 'FF', 'FF', 'FF', 'GF', 'NF', 'FF', 'EF', 'FF', 'EF',
       'NF', 'AF', 'NF', 'NF', 'FF', 'FF', 'GF', 'NF', 'NF', 'EF', 'NF',
       'FF', 'EF', 'FF', 'NF', 'EF', 'FF', 'FF', 'FF', 'FF', 'NF', 'NF',
       'AF', 'NF', 'NF', 'FF', 'NF', 'NF', 'FF', 'NF', 'FF', 'FF', 'EF',
       'EF', 'FF', 'AF', 'EF', 'EF', 'EF', 'FF', 'EF', 'FF', 'GF', 'AF',
       'EF', 'EF', 'FF', 'EF', 'FF', 'FF', 'NF', 'NF', 'AF', 'NF', 'FF',
       'AF', 'EF', 'FF', 'NF', 'NF', 'EF', 'AF', 'EF', 'NF', 'EF', 'EF',
       'EF', 'FF', 'EF', 'AF', 'EF', 'EF', 'NF', 'AF', 'FF', 'NF', 'FF',
       'EF', 'FF', 'EF', 'EF', 'EF', 'FF', 'FF', 'FF', 'EF', 'FF', 'EF',
       'NF', 'FF', 'FF', 'FF', 'NF', 'FF', 'EF', 'FF', 'NF', 'NF', 'MF',
       'NF', 'NF', 'EF', 'NF', 'EF', 'FF', 'AF', 'FF', 'NF', 'NF', 'NF',
       'NF', 'NF', 'AF'], dtype=object)
matrix_KNN=confusion_matrix(y_test,B_knn)
print(matrix_KNN,'\n')
print(ConfusionMatrixDisplay.from_predictions(y_test,B_knn))
accuracy_KNN=accuracy_score(y_test,B_knn)
print(accuracy_KNN,'\n')
report_KNN=classification_report(y_test,B_knn)
print(report_KNN)
[[ 9  3  1  0  2  5]
 [ 0 38 19  0  0  0]
 [ 1 26 47  0  0  2]
 [ 0  0  1  9  0  0]
 [ 2  0  0  0  0  5]
 [ 6  1 12  0  0 67]] 

<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay object at 0x000001536416ED50>
0.6640625 

              precision    recall  f1-score   support

          AF       0.50      0.45      0.47        20
          EF       0.56      0.67      0.61        57
          FF       0.59      0.62      0.60        76
          GF       1.00      0.90      0.95        10
          MF       0.00      0.00      0.00         7
          NF       0.85      0.78      0.81        86

    accuracy                           0.66       256
   macro avg       0.58      0.57      0.57       256
weighted avg       0.66      0.66      0.66       256
B.score(X_test,y_test)
0.6640625

DECISION TREE

C=DecisionTreeClassifier(criterion='entropy')
C.fit(X_train,y_train)
DecisionTreeClassifier(criterion='entropy')
C_dt=C.predict(X_test)
C_dt
array(['NF', 'EF', 'NF', 'NF', 'FF', 'GF', 'NF', 'NF', 'AF', 'FF', 'FF',
       'EF', 'FF', 'MF', 'AF', 'EF', 'EF', 'EF', 'EF', 'GF', 'NF', 'EF',
       'NF', 'FF', 'FF', 'FF', 'FF', 'FF', 'AF', 'NF', 'EF', 'EF', 'EF',
       'NF', 'FF', 'FF', 'AF', 'FF', 'NF', 'FF', 'NF', 'AF', 'EF', 'NF',
       'MF', 'NF', 'AF', 'GF', 'EF', 'EF', 'EF', 'FF', 'NF', 'FF', 'EF',
       'EF', 'EF', 'NF', 'NF', 'FF', 'NF', 'EF', 'NF', 'EF', 'FF', 'NF',
       'NF', 'FF', 'GF', 'NF', 'NF', 'FF', 'NF', 'FF', 'FF', 'AF', 'EF',
       'FF', 'AF', 'NF', 'FF', 'NF', 'GF', 'FF', 'FF', 'FF', 'EF', 'FF',
       'FF', 'FF', 'NF', 'NF', 'EF', 'FF', 'NF', 'NF', 'NF', 'AF', 'FF',
       'NF', 'NF', 'FF', 'FF', 'EF', 'NF', 'NF', 'FF', 'NF', 'NF', 'NF',
       'FF', 'GF', 'FF', 'NF', 'NF', 'FF', 'AF', 'EF', 'EF', 'EF', 'EF',
       'EF', 'EF', 'FF', 'NF', 'NF', 'AF', 'NF', 'AF', 'EF', 'NF', 'NF',
       'NF', 'FF', 'FF', 'FF', 'FF', 'GF', 'NF', 'NF', 'EF', 'EF', 'EF',
       'NF', 'AF', 'NF', 'NF', 'FF', 'FF', 'GF', 'AF', 'NF', 'NF', 'AF',
       'FF', 'EF', 'FF', 'NF', 'FF', 'FF', 'FF', 'FF', 'FF', 'NF', 'EF',
       'AF', 'NF', 'NF', 'NF', 'NF', 'NF', 'FF', 'NF', 'FF', 'FF', 'EF',
       'EF', 'FF', 'NF', 'FF', 'EF', 'EF', 'FF', 'EF', 'FF', 'GF', 'NF',
       'EF', 'EF', 'EF', 'EF', 'FF', 'FF', 'NF', 'NF', 'AF', 'NF', 'FF',
       'NF', 'FF', 'FF', 'NF', 'NF', 'EF', 'NF', 'EF', 'NF', 'EF', 'EF',
       'EF', 'FF', 'EF', 'AF', 'NF', 'EF', 'NF', 'AF', 'FF', 'NF', 'AF',
       'EF', 'FF', 'EF', 'EF', 'FF', 'FF', 'FF', 'FF', 'EF', 'FF', 'EF',
       'AF', 'FF', 'NF', 'FF', 'NF', 'EF', 'EF', 'FF', 'NF', 'NF', 'MF',
       'AF', 'NF', 'EF', 'AF', 'EF', 'GF', 'AF', 'EF', 'FF', 'AF', 'AF',
       'NF', 'AF', 'AF'], dtype=object)
matrix_DT=confusion_matrix(y_test,C_dt)
print(matrix_DT,'\n')
print(ConfusionMatrixDisplay.from_predictions(y_test,C_dt))
accuracy_DT=accuracy_score(y_test,C_dt)
print(accuracy_DT,'\n')
report_DT=classification_report(y_test,C_dt)
print(report_DT)
[[10  2  1  0  3  4]
 [ 0 29 24  0  0  4]
 [ 0 27 46  1  0  2]
 [ 0  0  1  9  0  0]
 [ 5  0  0  0  0  2]
 [13  3  3  0  0 67]] 

<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay object at 0x0000015364138620>
0.62890625 

              precision    recall  f1-score   support

          AF       0.36      0.50      0.42        20
          EF       0.48      0.51      0.49        57
          FF       0.61      0.61      0.61        76
          GF       0.90      0.90      0.90        10
          MF       0.00      0.00      0.00         7
          NF       0.85      0.78      0.81        86

    accuracy                           0.63       256
   macro avg       0.53      0.55      0.54       256
weighted avg       0.64      0.63      0.63       256
C.score(X_test,y_test)
0.62890625

知乎学术咨询:

https://www.zhihu.com/consult/people/792359672131756032?isMe=1

担任《Mechanical System and Signal Processing》《中国电机工程学报》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测。

分割线分割线分割线

一维神经网络的特征可视化分析-以心电信号为例(Python,Jupyter Notebook)

包括Occlusion sensitivity方法,Saliency map方法,Grad-CAM方法


完整代码可通过知乎付费咨询获得:

https://www.zhihu.com/consult/people/792359672131756032

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表