简介
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 网站