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
本文暂时没有评论,来添加一个吧(●'◡'●)