本文共享自华为云社区《根据随机森林算法进行硬盘毛病猜测》,作者:HWCloudAI 。

试验目标

  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中,运转如下代码即可下载这部分数据。

import os
import moxing as mox
if not os.path.exists('./dataset_2020'):
    mox.file.copy('obs://modelarts-labs-bj4-v2/course/ai_in_action/2021/machine_learning/hard_drive_disk_fail_prediction/datasets/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
INFO:root:Using MoXing-v1.17.3-
INFO:root:Using OBS-Python-SDK-3.20.7
total 102M
-rw-r--r-- 1 ma-user ma-group  51M Mar 21 11:56 2020-12-08.csv
-rw-r--r-- 1 ma-user ma-group  51M Mar 21 11:56 2020-12-09.csv
-rw-r--r-- 1 ma-user ma-group 1.2M Mar 21 11:55 dataset_2020.csv
-rw-r--r-- 1 ma-user ma-group 3.5K Mar 22 15:59 prepare_data.py

数据解说:
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.日志数据的状况

import pandas as pd
df_data = pd.read_csv("./dataset_2020/2020-12-08.csv")
type(df_data)
pandas.core.frame.DataFrame

2.2 检查单个csv文件数据的规划

print('单个csv文件数据的规划,行数:%d, 列数:%d' % (df_data.shape[0], df_data.shape[1]))
单个csv文件数据的规划,行数:162008, 列数:149

2.3 检查头5行数据

运用pandas加载csv后,得到的是一个DataFrame目标,能够理解为一个表格,调用该目标的head()函数,能够检查表格的头5行数据

df_data.head()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }

基于随机森林算法进行硬盘故障预测

5 rows 149 columns

如上所示是表格的头5行数据,表头是特色名,特色名下面是特色值,backblaze网站解说了特色值的意义,翻译为如下:

基于随机森林算法进行硬盘故障预测
2.4 检查数据的计算目标

检查完表格的头5行数据,咱们再调用DataFrame目标的describe()函数,计算表格数据的计算目标

df_data.describe()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }

基于随机森林算法进行硬盘故障预测
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个,类别极度不均衡。

valid = df_data[df_data['failure'] == 0]
failed = df_data[df_data['failure'] == 1]
print("valid hdds:",len(valid))
print("failed hdds:",len(failed))
valid hdds: 162000
failed hdds: 8

因为大多数机器学习办法的学习进程都是根据计算学的思路来进行学习的,假如直接运用上面这样类别不均衡的数据进行练习,那么模型的能力或许会显着偏向于类别多的样本,类别少的样本就会被“淹没”掉了,在学习进程中发挥不了作用,因而咱们需求平衡不同类别的数据。
为了取得更多的毛病样本数据,咱们能够从backblaze公司发布的2020年全年S.M.A.R.T.日志数据中将一切的毛病样本都挑选出来,一起也随机挑出相同数量的正常样本,能够经过下面的代码来完结。
这段代码已被注释掉,如需运转,需求20G的本地存储空间。您也能够不用运转这段代码,因为本事例最初现已下载了dataset_2020.zip,这个压缩包中现已供给了dataset_2020.csv,该csv便是运转下面这段代码得到的文件

# if not os.path.exists('./dataset_2020/dataset_2020.csv'):
#     os.system('python ./dataset_2020/prepare_data.py')
import gc
del df_data   # 删除 df_data 目标
gc.collect()  # 回收内存
2655

2.7 加载类别均衡的数据集

dataset_2020.csv是现现已过类别均衡处理的硬盘S.M.A.R.T.日志数据,下面咱们加载该文件,再承认一下类别均衡状况

df_data = pd.read_csv("./dataset_2020/dataset_2020.csv")
valid = df_data[df_data['failure'] == 0]
failed = df_data[df_data['failure'] == 1]
print("valid hdds:", len(valid))
print("failed hdds:", len(failed))
valid hdds: 1497
failed hdds: 1497

能够看到,正常样本和毛病样本都是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, www.backblaze.com/blog/what-s…
[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
Seagate SSD                             2
ST8000DM004                             2
ST18000NM000J                           2
ST4000DM005                             2
WDC WD5000LPCX                          1
ST8000DM005                             1
DELLBOSS VD                             1
HGST HDS5C4040ALE630                    1
TOSHIBA HDWF180                         1
HGST HUS726040ALE610                    1
ST16000NM001G                           1
Name: model, dtype: int64

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

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

3.3 特征挑选

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

features_specified = []
features = [5, 9, 187, 188, 193, 194, 197, 198, 241, 242]
for feature in features:
    features_specified += ["smart_{0}_raw".format(feature)]
X_data = df_data_model[features_specified]
Y_data = df_data_model['failure']
X_data.isnull().sum()
smart_5_raw      1
smart_9_raw      1
smart_187_raw    1
smart_188_raw    1
smart_193_raw    1
smart_194_raw    1
smart_197_raw    1
smart_198_raw    1
smart_241_raw    1
smart_242_raw    1
dtype: int64

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

X_data = X_data.fillna(0)
print("valid hdds:", len(Y_data) - np.sum(Y_data.values))
print("failed hdds:", np.sum(Y_data.values))
valid hdds: 325
failed hdds: 339

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函数即可开端练习

rfc.fit(X_train, Y_train)
/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库中有这四种目标的函数,直接调用即可。

关于四种目标的理论解说,可参阅此视频

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
print("Model used is: Random Forest classifier") 
acc = accuracy_score(Y_test, Y_pred) 
print("The accuracy is {}".format(acc)) 
prec = precision_score(Y_test, Y_pred) 
print("The precision is {}".format(prec)) 
rec = recall_score(Y_test, Y_pred) 
print("The recall is {}".format(rec)) 
f1 = f1_score(Y_test, Y_pred) 
print("The F1-Score is {}".format(f1)) 
Model used is: Random Forest classifier
The accuracy is 0.8270676691729323
The precision is 0.8548387096774194
The recall is 0.7910447761194029
The F1-Score is 0.8217054263565892

每次进行随机森林模型的练习,会得到该模型不同的测验准确率目标,这是因为随机森林算法的练习进程具有必定的随机性导致的,是正常现象。但是同一模型、同一样本的猜测结果是确定不变的。

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)

模型再猜测

new_Y_pred = new_rfc.predict(X_test)
new_prec = precision_score(Y_test, new_Y_pred)
print("The precision is {}".format(new_prec))
The precision is 0.8548387096774194

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)本事例运用了随机森林算法来练习模型,您能够测验运用其他的机器学习算法;

至此,本事例完结。

点击关注,第一时刻了解华为云新鲜技能~