利用英特尔® 数据分析加速库提高 Python* 语言中朴素贝叶斯算法的性能

简介

Netflix 怎么做到向客户推荐视频? 亚马逊如何确定向潜在客户推荐的产品种类? Microsoft Outlook* 如何确定垃圾邮件?

他们如何做到的? Netflix 能够根据过去的观看记录向客户推荐视频。 亚马逊通过浏览历史和购物记录,向购物者推荐可能感兴趣的产品。 微软分析大量的邮件,以确定邮件是否是垃圾邮件。

似乎 Netflix、亚马逊和微软对历史数据库做了一些分析,进而采取相应的措施来满足客户的需求。 社交媒体和互联网产生了大量数据(视频、音频和文本),为了更加了解人们的想法、行为和人与社会、环境的互动,需要在最少的人为干预的情况下,高效地处理这些数据。

这种需求使得机器学习 [1] 应运而生。

本文探讨机器学习,介绍一种机器学习方法/算法 - 朴素贝叶斯 (NB) [2]。 此外,本文还介绍了如何使用英特尔® 数据分析加速库(英特尔® DAAL) [3] 来提高 NB 算法的性能。

什么是机器学习?

机器学习 (ML) 是一种数据分析方法,用于创建基于数据的分析模型库。 当有新的数据输入时,分析模型在没有明确编程的情况下具备学习能力。ML存在已久,但是直到最近才得以应用,原因如下:

  • 社交媒体和互联网产生的数据规模越来越庞大,种类不断增加。
  • 计算机系统更加强大。
  • 数据存储空间越来越大,价格越来越便宜。

两种最常见的 ML 类型是监督式学习 [4] 和无监督学习 [5]。

监督式学习使用一组输入数据和标签(已知结果)训练数据。 每一次通过对比输入数据的结果和标签,算法进行学习,调整机器学习模型。 分类被认为是监督式学习。

和监督式学习不同,无监督学习算法不需要学习标签。 它需要分析输入数据,独立检测模式。 例如,在世界范围内确定某人来自哪个地区,算法需要查看人口数据,识别种族、宗教、语言等等。 

图 1: 机器学习简化图。

图1是一个简化图,显示 ML 的工作原理。 首先,使用训练数据集对 ML 算法训练,创建 ML 模型。 用模型处理测试数据集,最后预测结果。

下一节讨论一种监督式学习算法 - 朴素贝叶斯算法。

朴素贝叶斯算法

朴素贝叶斯 (NB) 算法是基于贝叶斯定理 [6] 的分类方法,假设所有特性彼此独立。

贝叶斯定理的方程如下所示:

X 和 Y 代表特性。

  • P(Y|X) 是在 X 发生的情况下 Y 发生的可能性。
  • P(X|Y) 是在 Y 发生的情况下 X 发生的可能性。
  • P(Y) 是 Y 的先验概率。
  • P(X) 是 X 的先验概率。

 

根据 [2],NB 方程可以按照下例来编写:

X = (x1, x2,… xn) 代表n个特性的矢量。

NB 算法通常用于电子邮件分类检测、文档分类、垃圾电子邮件检测等等。

图2的图表显示NB算法的工作原理:

图 2使用朴素贝叶斯算法的机器学习图。

图2显示,训练数据集可以分为两组:训练标签和训练数据。训练标签是训练数据的正确输出。这两组可以用于创建分类器。然后,测试数据集传输到分类器,等待评估。 

图 3使用朴素贝叶斯算法的垃圾电子邮件检测。

图3显示使用NB法检测垃圾电子邮件的流程图。 已知的垃圾电子邮件利用NB算法来建立电子邮件分类器。随后,未知的电子邮件通过电子邮件分类器,检测是否属于垃圾邮件。

NB的应用

以下列举NB的应用:

  • 出色的性能有助于进行实时预测。
  • 多级/多项分类,如对不同类别的花卉进行分类。
  • 检测垃圾电子邮件
  • 文本分类

NB 的优势和劣势

以下是NB的优势和劣势。

优势

  • 迅速完成模型训练。
  • 多类预测结果准确。

劣势

  • 如果数据在训练数据集中没有标签,NB无法做出预测。
  • 大型数据集处理效果不佳。
  • 特性和事件不会总是完全独立。

大型数据集训练模型所需的时间过长。训练特定模型需要数周甚至数月的时间。为了优化训练步骤,英特尔开发了英特尔 DAAL。

英特尔® 数据分析加速库

英特尔 DAAL 是一个包含众多优化的基本构建模块的库,适合数据分析和机器学习。这些基本构建模块经过高度优化,能适应最新版英特尔® 处理器的最新特性。如欲了解关于英特尔 DAAL 的更多信息,请查看 [7]。多项朴素贝叶斯分类器是一种由 DAAL 提供的分类算法。 本文利用 PyDAAL,即 DAAL 的Python API 来建立基本的朴素贝叶斯分类器。按照 [10] 的说明来安装 PyDAAL。

采用英特尔数据分析加速库中的NB方法

本节展示如何使用英特尔DAAL在 Python [9] 语言中调用多项 NB 算法。

执行以下步骤,从英特尔 DAAL 中调用 NB 算法:

     1) 输入如下命令以导入必要的封装,并导入

           a) 输入如下命令,导入 Numpy:

                      import numpy as np

            b) 输入如下命令,导入英特尔 DAAL 数值表:

                      from daal.data_management import HomogenNumericTable

            c) 输入如下命令,导入 NB 算法:

                      from daal.algorithms.multinomial_naive_bayes import prediction, training

                      from daal.algorithms import classifier

     2) 创建函数,把输入数据集划分为训练数据、标签和测试数据。

输入数据集阵列大体上被分为两个阵列。 例如,把 100 行的数据集分为 80 行和 20行: 对 80% 的数据进行训练,对 20% 的数据进行测试。 阵列输入数据集的前 80 行是训练数据,剩下的 20 行是测试数据。

     3) 重构训练和测试数据集,以便英特尔 DAAL 读取。

输入如下命令以重新格式化数据(我们将 ‘trainLabels’ 和 ‘testLabels’ 视作 n-by-1 表,n 是对应数据集的行数):

                        trainInput = HomogenNumericTable(trainingData)

                        trainLabels = HomogenNumericTable(trainGroundTruth.reshape(trainGroundTruth.shape[0],1))

                        testInput = HomogenNumericTable(testingData)

                        testLabels = HomogenNumericTable(testGroundTruth.reshape(testGroundTruth.shape[0],1))

       其中:

                        trainInput: 训练数据被重新格式化为英特尔 DAAL 数值表。

                        trainLabels: 训练标签被重新格式化为英特尔 DAAL 数值表。

                        testInput: 测试数据被重新格式化为英特尔 DAAL 数值表。

                        testLabels: 测试标签被重新格式化为英特尔 DAAL 数值表。

     4) 创建函数,以训练模型

          a) 首先创建一个算法对象,以训练模型,请输入如下命令:

                        algorithm = training.Batch_Float64DefaultDense(nClasses)                    

           b) 输入如下命令,将训练数据和标签传输到算法:

                        algorithm.input.set(classifier.training.data, trainInput)

                        algorithm.input.set(classifier.training.labels, trainLabels)

            其中:

                        algorithm: 在上述步骤 a 中定义的算法对象。

                        trainInput: 训练数据。

                        trainLabels: 训练标签

          c) 输入如下命令以训练模型:

                         Model = algorithm.compute()

              其中:

algorithm: 在上述步骤 a 中定义的算法对象。

     5) 创建函数来测试模型。

          a) 首先,输入如下命令,创建一个算法对象,以测试/预测模型:

                         algorithm = prediction.Batch_Float64DefaultDense(nClasses)                

          b) 输入如下命令,将测试数据和训练模型传输到模型:

                         algorithm.input.setTable(classifier.prediction.data, testInput)

                         algorithm.input.setModel(classifier.prediction.model, model.get(classifier.training.model))

              其中:

                        algorithm: 在上述步骤 a 中定义的算法对象。

                        testInput: 测试数据。

                        model: 模型对象的名称。

          c) 输入如下命令以测试/预测模型:

                        Prediction = algorithm.compute()

               其中:

                        algorithm: 在上述步骤 a 中定义的算法对象。

                        prediction: 包含测试数据预测标签的预测结果。

结论

由于最新版英特尔® 处理器的最新特性对英特尔 DAAL 算法进行高度优化,英特尔 DAAL 算法能简化并提升 ML 相关应用的性能。 借助英特尔 DAAL,您无需修改代码,便可获得最新英特尔® 处理器的出色特性。 您只需要链接到英特尔 DAAL 的最新版。

下一篇文章将探索另一种英特尔 DAAL 算法 - 支持向量机 (SVM)。

作者

Khang Nguyen

Zhang Zhang

 

参考资料

[1] 机器学习

[2] 朴素贝叶斯

[3] 英特尔® 数据分析加速库

[4] 监督式学习         

[5] 无监督学习

[6] 贝叶斯定理

[7] 英特尔® 数据分析加速库的介绍

[8] 多项朴素贝叶斯

[9] Python 网站

 

 

有关编译器优化的更完整信息,请参阅优化通知