利用xgboost算法对液压系统的状态进行预测并分析影响因素重要性

液压系统的状态监测

算法-xgboost

关于xgboost的原理网络上的资源很少,大多数还停留在应用层面,通过学习陈天奇博士的PPT地址和xgboost导读和实战 地址,希望读者可以对xgboost原理进行深入理解。

xgboost算法:用来评价各传感器之间的相关性,并且分析影响液压系统各部分(冷却系统、阀门状况、泵泄漏、液压蓄能器状况)的重要因素。本文利用xgboost算法对液压系统状态进行预测并进行分析,找出影响液压系统各功能正常运行的重要因素。

数据集

数据集信息

数据集通过液压试验台实验获得。该试验台由一个主要工作和一个二次冷却过滤回路组成,它们通过油箱连接。系统循环重复恒定负载循环(持续时间60秒)并测量过程值,例如压力,体积流量和温度,同时定量改变四个液压部件(冷却器,阀门,泵和蓄能器)的状态。

属性信息

数据集包含原始过程传感器数据(即没有特征提取),这些数据被构造为矩阵(制表符分隔),其中行表示数据在循环内的循环和列。涉及的传感器有:

传感器名称传感器
压力棒PS1、PS2、PS3、PS4、PS5、PS6
电机功率EPS1
振动VS1
效率系数SE
体积流量FS1、FS2
温度TS1、TS2、TS3、TS4
冷却效率CE、CP

目标条件值在“profile.txt”(制表符分隔)中以循环方式注释。和以前一样,行号代表循环数。

列数含义
冷却器条件3:接近总故障 20:效能降低 100:全效能
阀门条件100:最佳的切换状态 90:小滞后 80:重度滞后 73:接近完全失效
内部泵泄漏0:无泄漏 1:弱泄漏 2:严重泄漏
液压蓄能器/杆130:最佳压力 115:轻微减压 100:严重减压 90:接近完全失效
稳定标志0:条件稳定 1:可能尚未达到静态条件

数据分析

加载数据

__author__ = "fpZRobert"
​
"""
    Hydraulic_system_status_monitoring-xgboost
"""
import os
import datetime
import numpy as np
import pandas as pd
import seaborn as sns
import xgboost as xgb
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelBinarizer
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import confusion_matrix, classification_report, f1_score
​
"""
    加载数据
"""
base_dir = r"Hydraulic_system_status_monitoring\data"
​
# 读取文件
def get_files(dir_path, filename):
    return pd.read_csv(os.path.join(dir_path, filename), sep="\t", header=None)
​
​
# 平均周期数据
def mean_conversion(df):
    df1 = pd.DataFrame()
    df1 = df.mean(axis=1)
    return df1
​
​
# 加载所有压力传感器数据(sensor data)
pressureFile1 = get_files(dir_path=base_dir, filename='PS1.txt')
pressureFile2 = get_files(dir_path=base_dir, filename='PS2.txt')
pressureFile3 = get_files(dir_path=base_dir, filename='PS3.txt')
pressureFile4 = get_files(dir_path=base_dir, filename='PS4.txt')
pressureFile5 = get_files(dir_path=base_dir, filename='PS5.txt')
pressureFile6 = get_files(dir_path=base_dir, filename='PS6.txt')
​
# 加载卷流数据(volume flow data)
volumeFlow1 = get_files(dir_path=base_dir, filename='FS1.txt')
volumeFlow2 = get_files(dir_path=base_dir, filename='FS2.txt')
​
# 加载温度传感器数据(temperature data)
temperature1 = get_files(dir_path=base_dir, filename='TS1.txt')
temperature2 = get_files(dir_path=base_dir, filename='TS2.txt')
temperature3 = get_files(dir_path=base_dir, filename='TS3.txt')
temperature4 = get_files(dir_path=base_dir, filename='TS4.txt')
​
# 加载其余数据:泵效率,振动,冷却效率,冷却功率,效率因数
pump1 = get_files(dir_path=base_dir, filename='EPS1.txt')
vibration1 = get_files(dir_path=base_dir, filename='VS1.txt')
coolingE1 = get_files(dir_path=base_dir, filename='CE.txt')
coolingP1 = get_files(dir_path=base_dir, filename='CP.txt')
effFactor1 = get_files(dir_path=base_dir, filename='SE.txt')
​
# 从配置文件导入标签数据(profile data)
profile = get_files(dir_path=base_dir, filename='profile.txt')
​
# 将配置文件拆分为相关传感器的标签
y_coolerCondition = pd.DataFrame(profile.iloc[:, 0])
y_valveCondition = pd.DataFrame(profile.iloc[:, 1])
y_pumpLeak = pd.DataFrame(profile.iloc[:, 2])
y_hydraulicAcc = pd.DataFrame(profile.iloc[:, 3])
y_stableFlag = pd.DataFrame(profile.iloc[:, 4])
​
PS1 = pd.DataFrame(mean_conversion(pressureFile1))
PS2 = pd.DataFrame(mean_conversion(pressureFile2))
PS3 = pd.DataFrame(mean_conversion(pressureFile3))
PS4 = pd.DataFrame(mean_conversion(pressureFile4))
PS5 = pd.DataFrame(mean_conversion(pressureFile5))
PS6 = pd.DataFrame(mean_conversion(pressureFile6))
​
PS1.columns = ['PS1']
PS2.columns = ['PS2']
PS3.columns = ['PS3']
PS4.columns = ['PS4']
PS5.columns = ['PS5']
PS6.columns = ['PS6']
​
FS1 = pd.DataFrame(mean_conversion(volumeFlow1))
FS2 = pd.DataFrame(mean_conversion(volumeFlow2))
​
FS1.columns = ['FS1']
FS2.columns = ['FS2']
​
TS1 = pd.DataFrame(mean_conversion(temperature1))
TS2 = pd.DataFrame(mean_conversion(temperature2))
TS3 = pd.DataFrame(mean_conversion(temperature3))
TS4 = pd.DataFrame(mean_conversion(temperature4))
​
TS1.columns = ['TS1']
TS2.columns = ['TS2']
TS3.columns = ['TS3']
TS4.columns = ['TS4']
​
P1 = pd.DataFrame(mean_conversion(pump1))
VS1 = pd.DataFrame(mean_conversion(vibration1))
CE1 = pd.DataFrame(mean_conversion(coolingE1))
CP1 = pd.DataFrame(mean_conversion(coolingP1))
SE1 = pd.DataFrame(mean_conversion(effFactor1))
​
P1.columns = ['P1']
VS1.columns = ['VS1']
CE1.columns = ['CE1']
CP1.columns = ['CP1']
SE1.columns = ['SE1']
​
# 合并所有dataframes
X = pd.concat([PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, TS1, TS2, TS3, TS4, P1, VS1, CE1, CP1, SE1], axis=1)

数据可视化

"""
    传感器数据可视化
"""
# 绘制每个传感器的直方图
X.hist(bins=50, figsize=(20, 15))
plt.show()

数据分析

传感器相关性分析

"""
    各种传感器参数之间的相关矩阵
"""
corr_matrix = X.corr()
mask = np.zeros_like(corr_matrix, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
f, ax = plt.subplots(figsize=(11, 9))
​
# 绘制热图并校正纵横比
cmap = sns.diverging_palette(220, 10, as_cmap=True)
sns.heatmap(corr_matrix, mask=mask, cmap=cmap, vmax=.3, center=0, annot=True,
            square=True, linewidths=.5, cbar_kws={"shrink": .5})
plt.show()

一些传感器似乎高度相关。 让我们规范化这些参数并进行PCA。应用PCA来对集群中的数据进行可视化, 找到解释的方差和n_components。

"""
    数据归一化
"""
X_normalize = StandardScaler().fit_transform(X)
# 应用PCA可视化集群中的数据
from sklearn.decomposition import PCA
​
# 找到解释的方差和n_components
pca = PCA()
pca.fit(X_normalize)
plt.figure(figsize=(15, 10))
plt.plot(pca.explained_variance_, linewidth=2)
plt.axis('tight')
plt.xlabel('n_components')
plt.ylabel('explained_variance_')
plt.ylim(-0.5, 2)
plt.title('PCA explained variance vs. n componets')
plt.show()

# 当n_components = 2时观察分布
pca_2 = PCA(2)
projected = pca_2.fit_transform(X_normalize)
print(X.shape)
print(projected.shape)
plt.figure(figsize=(15, 10))
plt.scatter(projected[:, 0], projected[:, 1])
plt.xlabel('PCA (Dim=1)')
plt.ylabel('PCA (Dim=2)')
plt.title('Clustering of data when PCA dimension =2')
plt.show()

预测液压系统各部分(冷却系统、阀门状况、泵泄漏、液压蓄能器状况)状态

def predict_pump_performance(X, y, predictType):
    x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=24)
​
    x_test, x_val, y_test, y_val = train_test_split(x_test, y_test, test_size=0.5, random_state=24)
​
    # 使用xgboost进行分类
    seed = 24
    xgb1 = xgb.sklearn.XGBClassifier(learning_rate=0.1, n_estimators=100, max_depth=5, min_child_weight=11, gamma=0.1, subsample=0.8, colsample_bytree=0.7, objective='multi:softprob', n_jobs=-1, scale_pos_weight=1, seed=seed)
​
    xgb1.fit(x_train, y_train)
    y_pred = xgb1.predict(x_val)
​
    # 混淆矩阵和分类结果
    cm = confusion_matrix(y_val, y_pred)
    print("混淆矩阵(confusion_matrix): ", classification_report(y_val, y_pred))
​
    fig, ax = plt.subplots(figsize=(15, 10))
    ind = np.arange(17)
    width = 0.15
    feature_importtance = xgb1.feature_importances_
    rect1 = ax.bar(ind + width, feature_importtance)
    ax.set_xticks(ind + width / 2)
    ax.set_xticklabels(('PS1', 'PS2', 'PS3', 'PS4', 'PS5', 'PS6', 'FS1', 'FS2', 'TS1', 'TS2', 'TS3', 'TS4', 'P1', 'VS1', 'CE1', 'CP1', 'SE1'))
    ax.set_ylabel('Importance')
    ax.set_xlabel('Measurements')
    ax.set_title('Relative importance of various measurements to predict ' + predictType)
    plt.show()
​
​
# 预测冷却系统状态
predict_pump_performance(X_normalize, y_coolerCondition, 'cooling failure')
​
# 预测阀门状况
predict_pump_performance(X_normalize, y_valveCondition, 'valve condition')
​
# 预测泵泄漏
predict_pump_performance(X_normalize, y_pumpLeak, 'pump leaks')
​
# 预测液压蓄能器状况
predict_pump_performance(X_normalize, y_hydraulicAcc, 'hydraulic accumulator condition')

分析影响液压液压系统各部分(冷却系统、阀门状况、泵泄漏、液压蓄能器状况)的重要因素评价

  • 冷却系统影响因素分析

  • 阀门状况影响因素分析

  • 泵泄漏影响因素分析

  • 液压蓄能器影响因素分析

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值