写在开头:老师给了数据集,主要练习对时间序列的操作,本文内容适合机器学习初学者入门借鉴,有一套较为完整的从数据预处理至模型评价的流程

本文总结了一些风机叶片预测问题中需要解决的问题与部分解决方案(采用的是基础的随机森林模型)。

解决的问题基于ypjbyc/01_叶片结冰预测/train/15文件夹中的39.39万条数据。

数据集的使用说明:

在ypjbyc/01_叶片结冰预测/train/15/中分别由三个csv文件:

  • 15_data.csv:风机叶片数据集,包含time和其他27个特征。其中time是每一条数据的时间,需要依据下面两个时间表,对每一条数据是故障或是正常或是无效数据进行判断。

  • 15_failureInfo:故障风机叶片时间数据,可以据此确定15_data中每一条故障数据的标签。

  • 15_normalInfo:正常工作风机叶片时间数据,可以据此确定15_data中每一条正常工作数据的标签。


叶片预测数据集中需要解决的问题:

  • 样本中存在停机、人为删除数据、无效数据等,会造成某些时间段的数据缺失 ,如何对缺失数据与数据不均匀问题进行处理?此外,叶片正常(normalInfo)与结冰故障(failureInfo)数据不均衡,该如何处理?
  • 选取哪些特征用于模型预测?
  • 何种训练模型比较适合本问题?
  • 针对上述问题,从论文中摘出的一些解决方案:

在建立预测分类模型的时候,需要考虑风机结冰数据的类 不平衡问题。一般来说,对数据进行重采样能够有效降低类不 平衡带来的建模误差。将结冰样本进行过采样,将非结冰样本 进行欠采样,或者两者同时进行,以达到结冰和非结冰样本在 模型训练时有基本相近的比例。

如果我们能从序列数据中提取出易于分类的特征,就能够 准确地检测早期结冰。因此,在设计预测模型时,不仅要提供 瞬态特征,还要利用滑动窗提取给定长度下的统计特征。这些 统计特征能够很好地反映这一段序列数据的演化规律和状态, 因此能够更好的发现早期结冰。

我们根据训练数据中的 group 维度随机 地删除部分非结冰数据以及结冰严重数据,经过剔除数据处理, 正负样本所占比依然存在很大的差异,这种数据不平衡会对模 型最终的叶片结冰预测有非常大的影响,一般处理方式有三种:

欠采样、过采样、在模型 loss 函数中增加惩罚项以及模型集成。由于我们想尽可能的保留原始数据,因此选择第三种方法, 并且选取了更加适合此种情况的评价函数。


问题解决(仅供参考)

Step1 :读取数据并标注每条数据的标签

  • 故障时间区间覆盖的数据行标记为1。
  • 正常时间区间覆盖的数据行标记为0。
  • 无效数据不参与评价。
  • 数据集描述:
sum of data:393886
sum of failure data : 23846 , 6.05 %
sum of normal data : 350255 , 88.92 %
sum of invalid data : 19785 , 5.02 %

Step2:删除无效数据,选取此次要预测的数据(1/10),划分训练(2/3)与测试集(1/3)数据

  • 删除19785条无效数据

  • 剩下374101条有效数据

  • 选取了1/10 39388个数据(乱序)

    • 25064训练集(66.66%)

    • 12346测试集(33.33%)

      训练集中:

      • failure:1627
      • normal:23437

Step3 特征分析

  • 使用RFECV进行特征选择,以交叉验证分数高低决定选取的特征数量
  • 对特征进行排名:
Ranking of features names: Index(['wind_direction', 'pitch1_moto_tmp', 'wind_direction_mean','pitch2_speed', 'environment_tmp', 'pitch2_angle', 'acc_y','pitch1_angle', 'pitch1_speed', 'yaw_speed', 'pitch1_ng5_DC','pitch3_ng5_DC', 'group', 'pitch3_angle', 'pitch3_speed','yaw_position', 'pitch3_moto_tmp', 'pitch2_ng5_DC', 'power','generator_speed', 'acc_x', 'pitch2_moto_tmp', 'pitch3_ng5_tmp','pitch2_ng5_tmp', 'int_tmp', 'pitch1_ng5_tmp', 'wind_speed'],dtype='object')
Ranking of features nums: [ 4 14  5 12 19  9 18  8 11  7 24 26 27 10 13  6 16 25  3  2 17 15 23 2220 21  1]
  • 绘制交叉验证下的特征选择折线

  • 选取得分前三的特征,绘制特征对比图

Step4 建立预测模型

  • 这里选择的是随机森林分类模型
  • 模型参数选择:
    • 选择树的最⼤大深度为146
    • 树的最⼤大节点数 2500
    • 节点拆分最小用力数量:2
    • 叶子结点最少样本数:2
    • 集成决策树个数:2500
    • 最少的叶子节点数:2500
    • Bagging中每个字模型每次放回抽样选取的样本个数
    • 当寻找最佳分割时要考虑的特征数量:sqrt
    • 评价模型标准:Out Of Bag

Step5模型评价

  • accuracy_score:0.9998005106926269(该结果可能与选取训练集的随机度不够高有关)
  • 混淆矩阵:

  • 评分

                   precision    recall  f1-score   support0       1.00      1.00      1.00     115491       1.00      0.99      1.00       797
    avg / total       1.00      1.00      1.00     12346
    

Python代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Aug 19 11:18:38 2018@author: zhaohaibo
"""import os
os.chdir('C:\\Users\\zhaohaibo\\Desktop\\ypjbyc\\01_叶片结冰预测\\train\\15')#运行前更改目录为train/15这个文件夹
import pandas as pd
import numpy as np# Step1 读取数据
data = pd.read_csv("15_data.csv")
total = len(data)
print("sum of data:%d" % total)
des = data.describe()
fail_data = pd.read_csv("15_failureInfo.csv")
normal_data = pd.read_csv("15_normalInfo.csv")# 对时间标签做处理,分类出label:
# label = 1: 故障时间区域
# label = 0: 正常时间区域
# label = -1:无效数据# 转化data时间列为datetime
times = []
for i in range(len(data)):dt = pd.to_datetime(data.ix[i][0])times.append(dt)if(i%10000==0):print("complete %d / %d" % (i,len(data)))
times = pd.Series(times)
data.time = times# 转化normal_data & fail_data时间列为datetime
def to_datetime(obj_pd): Ser1 = obj_pd.iloc[:,0]Ser2 = obj_pd.iloc[:,1]for i in range(len(Ser1)):Ser1[i] = pd.to_datetime(Ser1[i])Ser2[i] = pd.to_datetime(Ser2[i])obj_pd.iloc[:,0] = Ser1obj_pd.iloc[:,1] = Ser2return obj_pdnormal_data = to_datetime(normal_data)
fail_data = to_datetime(fail_data)# 根据datetime创建labels列表
labels = []
for i in range(len(times)):if(i%10000==0):print("complete %d / %d" % (i,len(times)))flag = 0for j in range(len(normal_data)):if((times[i] >= normal_data.startTime[j]) and (times[i] <= normal_data.endTime[j])):labels.append(0)flag = 1breakfor j in range(len(fail_data)):if(flag==1):breakelif((times[i] >= fail_data.startTime[j]) and (times[i] <= fail_data.endTime[j])):labels.append(1)flag = 1breakif(flag == 1):continuelabels.append(-1)
print("complete all")# print 数据信息
def data_judge(labels,total):sum_inv = 0for i in range(len(labels)):if(labels[i] == -1):sum_inv = sum_inv + 1print("sum of invalid data : %d , %.2f %%" % (sum_inv,sum_inv/total*100))sum_nor = 0for i in range(len(labels)):if(labels[i] == 0):sum_nor = sum_nor + 1print("sum of normal data : %d , %.2f %% " % (sum_nor,sum_nor/total*100))sum_fail = 0for i in range(len(labels)):if(labels[i] == 1):sum_fail = sum_fail + 1print("sum of failure data : %d , %.2f %% " % (sum_fail,sum_fail/total*100))
data_judge(labels,total)# 删除无效数据
y = labels
indexes = []
for i in range(len(y)):if(y[i] == -1):indexes.append(i)
data = data.drop(indexes)
data = data.drop('time',axis=1)
for i in range(len(y)-1,-1,-1):if(y[i]==-1):y.pop(i)# Step2 数据预处理,这里为了节约时间,仅使用百分之10的数据作训练和预测(其实更多比例也不会特别费时)
from sklearn.model_selection import train_test_split
# 随机选择百分之10的数据
X_train, X_test, y_train, y_test = train_test_split(data, y, test_size=0.9, random_state=666, shuffle = True)# shuffle默认为True
# 在选择的数据中,选择2/3作为训练集,1/3作为测试集
X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.33, random_state=666, shuffle = False)# shuffle默认为True# 归一化
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
X_train_scaled = min_max_scaler.fit_transform(X_train)
X_test_scaled = min_max_scaler.fit_transform(X_test)# 特征选择
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.feature_selection import RFECV
from sklearn.datasets import make_classification
from sklearn.tree import DecisionTreeClassifier
svc = SVC(kernel="linear")
dt = DecisionTreeClassifier()
rfecv = RFECV(estimator=dt, step=1, cv=StratifiedKFold(2), scoring='accuracy')
rfecv.fit(X_train, y_train)
print("Optimal number of features : %d" % rfecv.n_features_)
print("Ranking of features names: %s" % X_train.columns[rfecv.ranking_-1])
print("Ranking of features nums: %s" % rfecv.ranking_)
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score (nb of correct classifications)")
plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
plt.savefig("feature.jpg")
plt.show()# 特征对比图
import seaborn as sns
sns.pairplot(X_train, vars=["wind_speed","generator_speed", "power"],palette="husl",diag_kind="kde")
plt.savefig("duibi.jpg")# 网格搜索随机森林最佳参数
def GridsearchCV():param_grid = [{'n_estimators':[i for i in range(500,510)],'oob_score':True,'random_state':[i for i in range(30,50)],'min_samples_split':[i for i in range(2,20)],'max_depth': [i for i in range(100,200)], }]rf_clf = RandomForestClassifier(max_depth=146,n_estimators=500,max_leaf_nodes=2500, oob_score=True)grid_search = GridSearchCV(rf_clf, param_grid,n_jobs=-1)grid_search.fit(X,y)grid_search.best_score_grid_search.best_estimator_# 使用随机森林分类器(直接使用网格搜索的最佳参数)
from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(max_depth=146,n_estimators=2500, max_leaf_nodes=2500, oob_score=True, random_state=30, n_jobs=-1)
rf_clf.fit(X_train, y_train)
y_predict = rf_clf.predict(X_test)
print(rf_clf.oob_score_)# 绘制混淆矩阵
def plot_confusion_matrix(cm, classes, normalize=False,title='Confusion matrix',cmap=plt.cm.Blues):"""Normalization can be applied by setting `normalize = True`."""plt.imshow(cm, interpolation='nearest',cmap=cmap)plt.title(title)plt.colorbar()tick_marks = np.arange(len(classes))plt.xticks(tick_marks, classes, rotation=45)plt.yticks(tick_marks, classes)if normalize:cm = cm.astype('float') / cm.sum(axis=1)[:,np.newaxis]print("Normalized confusion matrix")else:print("Confusion matrix, without normalization")print(cm)thresh = cm.max() / 2for i, j in itertools.product(range(cm.shape[0]),range(cm.shape[1])):plt.text(j, i, cm[i,j],horizontalalignment="center",color="white" if cm[i,j] > thresh else "black")plt.tight_layout()plt.ylabel('True label')plt.xlabel('Predicted label')plt.savefig("matrix.jpg")from sklearn.metrics import confusion_matrix
import itertools
import matplotlib.pyplot as pltprediction = rf_clf.predict(X_test)
cm = confusion_matrix(y_test, prediction)
cm_plot_labels = ['normal', 'failure']
plot_confusion_matrix(cm, cm_plot_labels, title='Confusion Matrix')# 评价
#precision & recall & f1-score
from sklearn.metrics import classification_report
print(classification_report(y_true=y_test, y_pred=prediction))

数据集的链接在github主页持续更新:2017-IndustryBigData

2017工业大数据 风机叶片预测练习相关推荐

  1. 数据猿·金猿榜丨2017工业大数据领域最具潜力创业公司

    [数据猿导读] "2017工业大数据领域最具潜力创业公司"盘点源于数据猿推出的"金猿榜"系列内容,旨在通过媒体的方式与原则,发掘大数据领域最具潜力的创新型企业 ...

  2. “智源 — INSPEC 工业大数据质量预测赛” 上线,为硬核工业制造炼就 AI 之心...

    2019 年 12 月,北京智源人工智能研究院联合博世和数据评测平台biendata,共同发布了"INSPEC 工业检测大数据 (Industrial Specification Inspe ...

  3. 工业大数据漫谈3:什么是工业大数据?

    前面两部分我们大概了解了一下大数据的由来和特点,这一部分我们来看看什么是工业大数据,它和传统我们理解的大数据有什么不同? 在了解什么是工业大数据的时候,我觉得我们有必要先了解一下什么是工业以及工业都包 ...

  4. 中国信通院:2018工业大数据白皮书(附下载)

    报告下载:添加199IT官方微信[i199it],回复关键词[2018工业大数据白皮书]即可! 报告下载:添加199IT官方微信[i199it],回复关键词[2018工业大数据白皮书]即可! 更多阅读 ...

  5. BDTC 2017丨大数据在金融、交通、医疗、工业领域落地实践与应用

    BDTC 2017中国大数据技术大会将于12月7日-9日在北京新云南皇冠假日酒店举行,大会为期三天.届时,近百位技术专家将为现场数千名的大数据行业精英.技术专家及意见领袖带来多场技术演讲,分享最新技术 ...

  6. 【2017年第4期】工业大数据技术与架构

    郑树泉,1,3, 覃海焕,2,3, 王倩,1,3 1. 上海计算机软件技术开发中心,上海 201112 2. 上海电机学院电子信息学院,上海 201306 3. 上海产业技术研究院工程大数据服务创新中 ...

  7. 数据驱动创新 融合引领变革 2017中国工业大数据大会·钱塘峰会今日在杭州国际博览中心顺利举行...

    至顶网CIO与应用频道 05月05日 北京消息: 当前,大数据已上升为国家战略,日益成为经济结构调整.转型升级的加速器.在2016年6月国务院正式出台的<关于深化制造业与互联网融合发展的指导意见 ...

  8. 【“工业大数据预测”系列】——第2篇:异常数据处理

    文章目录 前言 1 数据来源 2 数据预处理 2.1 无效数据处理 2.2 异常数据处理 3 数据预处理完整代码 前言   Hi,久等了,这里是工业大数据预测系列的第二篇.   前面我们提到,工业大数 ...

  9. 【工业大数据】 昆仑数据首席科学家田春华:人工智能降低了工业大数据分析的门槛

    机器之心原创 作者:高静宜 在刚刚结束的国际 PHM 数据竞赛中,昆仑数据的 K2 代表队以绝对优势一举夺冠,成为 PHM Data Challenge 十年竞赛史上首个完全由中国本土成员组成的冠军团 ...

最新文章

  1. 经典树型表结构之SORT_NO
  2. 命令行的艺术 (GitHub 星标 6 万多)
  3. 感受野receptive field个人理解
  4. Arduino 端口通信实例
  5. js designMode contentEditable 编辑在线网页
  6. 设计模式学习笔记——外观(Facade)模式
  7. 使用ASP.NET Core和Entity Framework Core实现Angular 7 SPA CRUD
  8. 罗永浩宣布进军电商直播;微博回应用户数据泄露;Android 11 开发者预览版 2 发布 | 极客头条...
  9. 互联网人在硅谷:听 Google 资深产品经理 bigjoe 聊聊职业与热爱
  10. gulp自己主动化任务脚本在HybridApp开发中的使用
  11. Java基础--说集合框架
  12. UE mac版16.10.0.22破解
  13. 电脑硬件名称 中英文对照
  14. 【Tips】如何批量安装和导出Python项目的依赖库?
  15. php怎么写炫彩字,Photoshop打造超酷的炫彩字
  16. mysql 8.0 如何改密码(转载
  17. 电子厂计算机常用英语,电子厂常用英语
  18. JAVA已知圆心经纬度和半径求圆周点的经纬度
  19. 微擎系统操作记实--公众号管理员权限设置
  20. Android进阶知识树——Android Handler消息机制

热门文章

  1. Win10版《芒果TV》获评2016年度Windows Store最佳官方/休闲娱乐应用(LiveSino和微软信仰中心联合评选)...
  2. PG宝洁公司八大经典面试问题(附参考答案)
  3. Linux Command ipmitool
  4. 思科生成树与端口聚合
  5. C# NanoFramework 开发单片机嵌入式之 ESP32
  6. Git的下载安装以及基本操作
  7. 女生做UI设计怎么样?现在学习UI设计还有前景吗?
  8. 用HTML5编写一个课程表界面
  9. 初效过滤器初阻力和终阻力
  10. 浅谈“315期间”呼叫中心班组的情绪管理