关于算法:动手实操丨基于随机森林算法进行硬盘故障预测

314次阅读

共计 9802 个字符,预计需要花费 25 分钟才能阅读完成。

摘要: 业界冀望应用机器学习技术来构建硬盘故障预测的模型,更精确地提前感知硬盘故障,升高运维老本,晋升业务体验。本案例将应用随机森林算法来训练一个硬盘故障预测模型。

本文分享自华为云社区《基于随机森林算法进行硬盘故障预测》,原文作者:山海之光。

试验指标

  1. 把握应用机器学习办法训练模型的根本流程;
  2. 把握应用 pandas 做数据分析的根本办法;
  3. 把握应用 scikit-learn 进行随机森林模型的构建、训练、保留、加载、预测、统计准确率指标和查看混同矩阵的办法;

案例内容介绍

随着互联网、云计算的倒退,数据的存储需要与日倍增,大规模海量数据存储核心是必不可少的基础性设施。尽管新的存储介质例如 SSD,曾经很多方面领有了比磁盘更好的性能,但就目前来讲,其昂扬的破费依然使大部分数据中心难以累赘,因而,大型数据中心仍然会采纳传统的机械硬盘作为存储介质。

机械硬盘生命周期通常为 3 到 5 年,在 2 到 3 年后故障率显著升高,导致换盘量陡增。据统计,在服务器硬件故障中,硬盘故障占比达到 48%+,是影响服务器运行可靠性的重要因素。早在上个世纪九十年代,人们就意识到数据的贵重性远胜于硬盘本身价值,渴望有种技术能对硬盘故障进行预测并实现绝对平安的数据保护,因而 S.M.A.R.T. 技术应运而生。

S.M.A.R.T.,全称为“Self-Monitoring Analysis and Reporting Technology”,即“自我监测、剖析及报告技术”,是一种主动的硬盘状态检测与预警系统和标准。通过在硬盘硬件内的检测指令对硬盘的硬件如磁头、盘片、马达、电路的运行状况进行监控、记录并与厂商所设定的预设安全值进行比拟,若监控状况将或已超出预设安全值的平安范畴,就能够通过主机的监控硬件或软件主动向用户作出正告并进行轻微的主动修复,以提前保障硬盘数据的平安。除一些出厂工夫极早的硬盘外,当初大部分硬盘均装备该项技术。对于该技术的更多介绍,请查看 S.M.A.R.T.- 百度百科。

尽管硬盘厂商采纳了 S.M.A.R.T. 技术来监测硬盘的衰弱状态,然而大多数厂商都是基于设计规定制订的故障预测伎俩,预测成果十分差,不能满足日渐严格的提前预测硬盘故障的需要。因而,业界冀望应用机器学习技术来构建硬盘故障预测的模型,更精确地提前感知硬盘故障,升高运维老本,晋升业务体验。

本案例将带大家应用一份开源的 S.M.A.R.T. 数据集和机器学习中的随机森林算法,来训练一个硬盘故障预测模型,并测试成果。
对于随机森林算法的实践解说,可参考此视频。

注意事项

  1. 如果你是第一次应用 JupyterLab,请查看《ModelAtrs JupyterLab 应用领导》理解应用办法;
  2. 如果你在应用 JupyterLab 过程中碰到报错,请参考《ModelAtrs JupyterLab 常见问题解决办法》尝试解决问题。

试验步骤

1. 数据集介绍

本案例应用的数据集是来自于 Backblaze 公司的开源数据集,它是一家计算机备份和云存储服务提供商。自 2013 年以来,Backbreze 每年都会公开公布他们的数据中心所应用硬盘的 S.M.A.R.T. 日志数据,无效地推动了应用机器学习技术进行硬盘故障预测的倒退。
因为 Backblaze 公司公布的 S.M.A.R.T. 日志数据量较大,本案例为疾速演示应用机器学习构建硬盘故障预测模型的过程,仅应用了该公司公布的 2020 年的数据,相干数据曾经筹备好,放在 OBS 中,运行如下代码即可下载这部分数据。

留神:本步下载数据的代码须要在华为云 ModelArts Codelab 上运行

import os
import moxing as mox
if not os.path.exists('./dataset_2020.zip'):
    mox.file.copy('obs://modelarts-labs-bj4/course/ai_in_action/2021/machine_learning/hard_drive_disk_fail_prediction/dataset_2020.zip', './dataset_2020.zip')
    os.system('unzip dataset_2020.zip')

if not os.path.exists('./dataset_2020'):
    raise Exception('谬误!数据不存在!')

!ls -lh ./dataset_2020

数据解释:

2020-12-08.csv:从 backblaze 公司公布的 2020 Q4 数据集中抽取进去的 2020-12-08 这天的 S.M.A.R.T. 日志数据
2020-12-09.csv:从 backblaze 公司公布的 2020 Q4 数据集中抽取进去的 2020-12-09 这天的 S.M.A.R.T. 日志数据
dataset_2020.csv:曾经解决过的 2020 年全年 S.M.A.R.T. 日志数据,下文中“第 2.6 节 类别平衡度剖析”会解释如何失去这部分数据
prepare_data.py: 运行该脚本,会下载 2020 年全年 S.M.A.R.T. 日志数据,并进行解决,失去 dataset_2020.csv。运行该脚本须要 20G 的本地存储空间

2. 数据分析

应用机器学习构建任何模型之前,都须要先对数据集进行剖析,理解数据集的规模、属性名、属性值、各类统计指标及空值状况。因为咱们要先理解数据,能力用好数据。

2.1 读取 csv 文件

pandas 是罕用的 python 数据分析模块,咱们先用它来加载数据集中的 csv 文件。以 2020-12-08.csv 为例,咱们先加载该文件来剖析 S.M.A.R.T. 日志数据的状况

2.2 查看单个 csv 文件数据的规模

2.3 查看头 5 行数据

应用 pandas 加载 csv 后,失去的是一个 DataFrame 对象,能够了解为一个表格,调用该对象的 head() 函数,能够查看表格的头 5 行数据

df_data.head()



5 rows × 149 columns

如上所示是表格的头 5 行数据,表头是属性名,属性名上面是属性值,backblaze 网站解释了属性值的含意,翻译为如下:

2.4 查看数据的统计指标

查看完表格的头 5 行数据,咱们再调用 DataFrame 对象的 describe() 函数,计算表格数据的统计指标

df_data.describe()



8 rows × 146 columns

如上所示是表格数据的统计指标,describe() 函数默认对数值类型的列进行统计分析,因为表格的前三列’date’、‘serial_number’、’model’是字符串类型,所以这三列没有统计指标。

各行统计指标的含意解释如下:
count: 该列有多少个非空值
mean: 该列的均值
std: 该列数值的标准差
min: 该列数值的最小值
25%: 该列数值的 25% 中位值
50%: 该列数值的 50% 中位值
75%: 该列数值的 75% 中位值
max: 该列数值的最大值

2.5 查看数据空值状况

从下面的输入能够察看到,某些属性的 count 指标比拟小,比方 smart_2_raw 的 count 数就比 df_train 的总行数要小很多,因而咱们要再进一步看看各列属性的空值状况,执行如下代码能够查看空值状况

df_data.isnull().sum()

date                         0
serial_number                0
model                        0
capacity_bytes               0
failure                      0
smart_1_normalized         179
smart_1_raw                179
smart_2_normalized      103169
smart_2_raw             103169
smart_3_normalized        1261
smart_3_raw               1261
smart_4_normalized        1261
smart_4_raw               1261
smart_5_normalized        1221
smart_5_raw               1221
smart_7_normalized        1261
smart_7_raw               1261
smart_8_normalized      103169
smart_8_raw             103169
smart_9_normalized         179
smart_9_raw                179
smart_10_normalized       1261
smart_10_raw              1261
smart_11_normalized     161290
smart_11_raw            161290
smart_12_normalized        179
smart_12_raw               179
smart_13_normalized     161968
smart_13_raw            161968
smart_15_normalized     162008
                         ...  
smart_232_normalized    160966
smart_232_raw           160966
smart_233_normalized    160926
smart_233_raw           160926
smart_234_normalized    162008
smart_234_raw           162008
smart_235_normalized    160964
smart_235_raw           160964
smart_240_normalized     38968
smart_240_raw            38968
smart_241_normalized     56030
smart_241_raw            56030
smart_242_normalized     56032
smart_242_raw            56032
smart_245_normalized    161968
smart_245_raw           161968
smart_247_normalized    162006
smart_247_raw           162006
smart_248_normalized    162006
smart_248_raw           162006
smart_250_normalized    162008
smart_250_raw           162008
smart_251_normalized    162008
smart_251_raw           162008
smart_252_normalized    162008
smart_252_raw           162008
smart_254_normalized    161725
smart_254_raw           161725
smart_255_normalized    162008
smart_255_raw           162008
Length: 149, dtype: int64

这种显示方式不太不便查看,咱们把能够空值的数量绘制成曲线图,看起来更直观

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

df_data_null_num = df_data.isnull().sum()
x = list(range(len(df_data_null_num)))
y = df_data_null_num.values
plt.plot(x, y)
plt.show()

从下面的后果能够看出,表格中的某些属性有大量的空值。

在机器学习畛域中,数据集中存在空值是很常见的景象,引起空值的起因有很多种,比方一份用户画像中有很多个属性,但又不是所有用户都有对应的属性值,这时就产生了空值。或者某些数据因为传输超时,导致没有采集上来,也可能会呈现空值。

2.6 类别平衡度剖析

咱们要实现的工作是“硬盘故障预测”,即预测某个硬盘在某个工夫是失常还是损坏,这就是一个故障预测问题或异样检测问题,这类问题有个特点就是:失常样本十分多,故障样本非常少,两类样本的数量差别十分大。
比方,执行如下代码,能够看到 df_data 中硬盘失常的样本有 16 万个以上,故障的样本却只有 8 个,类别极度不平衡。

因为大多数机器学习办法的学习过程都是基于统计学的思路来进行学习的,如果间接应用下面这样类别不平衡的数据进行训练,那么模型的能力可能会显著偏差于类别多的样本,类别少的样本就会被“吞没”掉了,在学习过程中施展不了作用,因而咱们须要均衡不同类别的数据。
为了取得更多的故障样本数据,咱们能够从 backblaze 公司公布的 2020 年全年 S.M.A.R.T. 日志数据中将所有的故障样本都筛选进去,同时也随机挑出雷同数量的失常样本,能够通过上面的代码来实现。

这段代码已被正文掉,如需运行,须要 20G 的本地存储空间。您也能够不用运行这段代码,因为本案例结尾曾经下载了 dataset_2020.zip,这个压缩包中曾经提供了 dataset_2020.csv,该 csv 就是运行上面这段代码失去的文件

import gc
del df_data   # 删除 df_data 对象
gc.collect()  # 因为接下来的代码将加载日志数据到 df_data 对象中,为防止内存溢出的危险,能够在此处先手动回收内存,因为 jupyterlab 在运行过程中不会主动回收环境中的内存 

2.7 加载类别平衡的数据集

dataset_2020.csv 是曾经通过类别平衡解决的硬盘 S.M.A.R.T. 日志数据,上面咱们加载该文件,再确认一下类别平衡状况

能够看到,失常样本和故障样本都是 1497 个

3. 特色工程

筹备好可用的训练集之后,接下来要做特色工程,艰深地讲,个性工程就是要抉择表格中的哪些属性来构建机器学习模型。人工设计特色的好坏,很大水平上决定了机器学习模型成果的好坏,所以机器学习畛域的钻研人员需消耗大量精力在人工设计特色上,是一项比拟耗时、耗力,且须要专家教训的工程。

3.1 SMART 属性与硬盘故障的相干钻研

(1)BackBlaze 剖析了其 HDD 故障和 SMART 属性之间的相关性,并发现了 SMART 5、187、188、197、198 与 HDD 故障的相干率最高,这些 SMART 属性还与扫描谬误,重新分配计数和试用计数无关 [1];
(2)El-Shimi 等发现在随机森林模型中除了以上 5 个特色外,还有 SMART 9、193、194、241、242 这 5 个属性有最大权重 [2];
(3)Pitakrat 等人评估了 21 种用于预测硬盘故障的机器学习算法,发现在测试的 21 种机器学习算法中,随机森林算法在 ROC 曲线下有最大面积,而 KNN 分类器具备最高的 F1 值 [3];
(4)Hughes 等人也钻研用于预测硬盘故障的机器学习办法,他们剖析了 SVM、奢侈贝叶斯的体现,SVM 实现了最高性能,检测率为 50.6%,误报率为 0%[4];

[1] Klein, Andy.“What SMART Hard Disk Errors Actually Tell Us.”Backblaze Blog Cloud Storage & Cloud Backup,6 Oct. 2016, http://www.backblaze.com/blog…
[2] El-Shimi, Ahmed.“Predicting Storage Failures.”VAULT-Linux Storage and File Systems Conference.VAULT-Linux Storage and File Systems Conference, 22 Mar. 2017, Cambridge.
[3] Pitakrat, Teerat, André van Hoorn, and Lars Grunske.“A comparison of machine learning algorithms for proactive hard disk drive failure detection.”Proceedings of the 4th international ACM Sigsoft symposium on Architecting critical systems. ACM, 2013.
[4] Hughes, Gordon F., et al.“Improved disk-drive failure warnings.”IEEE Transactions on Reliability 51.3 (2002):350-357.

如上就是前人的一些研究成果,本案例打算采纳随机森林模型,因而能够依据下面第 2 条研究成果,抉择 SMART 5, 9, 187, 188, 193, 194, 197, 198, 241, 242 这些属性来作为特色,它们的含意别离是:
SMART 5: 重映射扇区计数
SMART 9: 通电工夫累计
SMART 187: 无奈校对的谬误
SMART 188: 指令超时计数
SMART 193: 磁头加载 / 卸载计数
SMART 194: 温度
SMART 197: 期待被映射的扇区数
SMART 198: 报告给操作系统的无奈通过硬件 ECC 校对的谬误
SMART 241: 逻辑块寻址模式写入总数
SMART 242: 逻辑块寻址模式读取总数

另外,因为不同硬盘厂商的不同型号硬盘记录 SMART 日志数据的规范可能不一样,所以咱们最好将同一型号的硬盘数据挑出来作为训练数据,专门训练一个预测该型号硬盘是否故障的模型。如果须要预测多个不同型号的硬盘是否故障,则可能须要别离训练多个模型。

3.2 硬盘型号抉择

执行上面的代码,看一下每种型号的硬盘数据量有多少

df_data.model.value_counts()

ST12000NM0007                         664
ST4000DM000                           491
ST8000NM0055                          320
ST12000NM0008                         293
TOSHIBA MG07ACA14TA                   212
ST8000DM002                           195
HGST HMS5C4040BLE640                  193
HGST HUH721212ALN604                  153
TOSHIBA MQ01ABF050                     99
ST12000NM001G                          53
HGST HMS5C4040ALE640                   50
ST500LM012 HN                          40
TOSHIBA MQ01ABF050M                    35
HGST HUH721212ALE600                   34
ST10000NM0086                          29
ST14000NM001G                          23
HGST HUH721212ALE604                   21
ST500LM030                             15
HGST HUH728080ALE600                   14
Seagate BarraCuda SSD ZA250CM10002     12
WDC WD5000LPVX                         11
WDC WUH721414ALE6L4                    10
ST6000DX000                             9
TOSHIBA MD04ABA400V                     3
ST8000DM004                             2
ST18000NM000J                           2
Seagate SSD                             2
ST4000DM005                             2
ST8000DM005                             1
ST16000NM001G                           1
DELLBOSS VD                             1
TOSHIBA HDWF180                         1
HGST HDS5C4040ALE630                    1
HGST HUS726040ALE610                    1
WDC WD5000LPCX                          1
Name: model, dtype: int64

能够看到 ST12000NM0007 型号的硬盘数据量最多,因而咱们把该型号硬盘的数据过滤出来

df_data_model = df_data[df_data['model'] == 'ST12000NM0007']

3.3 特征选择

选取上文提到的 10 个属性作为特色

有空值存在,所以先要填充空值

3.4 划分训练集和测试集

应用 sklearn 的 train_test_split 即可划分训练集和测试集,test_size 示意测试集的比例,个别取值为 0.3、0.2 或 0.1

from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X_data, Y_data, test_size=0.2, random_state=0) 

4. 开始训练

4.1 构建模型

筹备好训练集和测试集之后,就能够开始构建模型了,构建模型的步骤非常简单,间接调用机器学习框架 sklearn 中的 RandomForestClassifier 即可

from sklearn.ensemble import RandomForestClassifier 

rfc = RandomForestClassifier()

随机森林算法的超参数有很多个,取不同的参数值构建模型会失去不同的训练成果,对于初学者,能够间接应用库中提供的默认参数值,在对随机森林算法的原理有肯定的理解之后,能够尝试批改模型的参数来调整模型的训练成果。

4.2 数据拟合

模型训练的过程,也就是拟合训练数据的过程,实现也非常简单,调用 fit 函数即可开始训练

/home/ma-user/anaconda3/envs/XGBoost-Sklearn/lib/python3.6/site-packages/sklearn/ensemble/forest.py:248: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22.
  "10 in version 0.20 to 100 in 0.22.", FutureWarning)

RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=None,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False)

5 开始预测

调用 predict 函数即可开始预测

Y_pred = rfc.predict(X_test)

5.1 统计预测准确率

在机器学习中,分类问题的性能指标,罕用的有四种:accuracy(精度)、precision(查准率)、recall(查全率)、F1-Score,四种指标越靠近 1,示意成果越好。sklearn 库中有这四种指标的函数,间接调用即可。

对于四种指标的实践解释,可参考此文章

每次进行随机森林模型的训练,会失去该模型不同的测试准确率指标,这是因为随机森林算法的训练过程具备肯定的随机性导致的,是失常景象。然而同一模型、同一样本的预测后果是确定不变的。

5.2 模型保留、加载、再预测

模型保留

import pickle
with open('hdd_failure_pred.pkl', 'wb') as fw:
    pickle.dump(rfc, fw)

模型加载

with open('hdd_failure_pred.pkl', 'rb') as fr:
    new_rfc = pickle.load(fr)

模型再预测

5.3 查看混同矩阵

要剖析分类模型的成果如何,还能够应用混同矩阵来查看,混同矩阵的横轴示意预测后果的各个类别,纵轴示意实在标签的类别,矩阵方格中的值就代表对应横纵坐标重叠的测试样本数量。

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix 

LABELS = ['Healthy', 'Failed'] 
conf_matrix = confusion_matrix(Y_test, Y_pred) 
plt.figure(figsize =(6, 6)) 
sns.heatmap(conf_matrix, xticklabels = LABELS,  
            yticklabels = LABELS, annot = True, fmt ="d"); 
plt.title("Confusion matrix") 
plt.ylabel('True class') 
plt.xlabel('Predicted class') 
plt.show() 

6. 改良模型的思路

如上内容是应用随机森林算法构建硬盘故障预测模型的过程演示,模型精度并不算高,有如下几个思路能够晋升模型的精度:
(1)本案例只应用了 Backblaze 公司 2020 年的数据,您能够尝试应用更多的训练数据;
(2)本案例只应用了 10 个 SMART 属性作为特色,您能够尝试应用其余办法来构建特色;
(3)本案例应用了随机森林算法来训练模型,您能够尝试应用其余的机器学习算法;

点击进入华为云 ModelArts Codelab 可间接运行本案例代码

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0