借助英特尔® 数据分析加速库改进支持向量机

借助英特尔® 数据分析加速库改进支持向量机的性能

简介

在互联网广泛普及的情况下,文本分类已成为处理和管理文本数据的重要方式。文本分类用于对新闻报道分类和查找 Web 上的信息。例如,为搜索 Web 上的照片或区分马和狮子,必须采用相关机制对图片进行识别和分类。对文本或图片分类非常耗时。这种分类是一种出色的机器学习功能。[1]

本文描述了一种名为支持向量机的分类机器学习算法[2],以及英特尔® 数据分析加速库(英特尔® DAAL)[3]可如何帮助优化该算法,使其以更高性能在搭载英特尔® 至强® 处理器的系统上运行。

什么是支持向量机?

支持向量机 (SVM) 是一种监督式机器学习算法。它可用于分类和回归。

在实施分类时,SVM 会查找分离不同类别的一组对象的超平面[4]。超平面选择应最大限度增加两个类别之间的边际,以减少噪音和提高结果的准确性。边际上的向量称为支持向量。支持向量指边际上的数据点。

图 1 显示了 SVM 进行对象分类的过程:

Improving Performance - Fig 1
图 1:借助支持向量机进行对象分类。

类别有两种:绿色和紫色。超平面能够分离这两个类别。位于超平面左侧的对象被归为绿色类别,位于超平面右侧的对象属于紫色类别。

如上所述,我们需要最大限度增加差数 H(两个边际之间的距离),以减少噪音,提高预测的准确性。

Improving Performance - Equation

为最大限度增加差数 H,我们需要最大限度减小 |W|。

我们还需要确保两个边际之间没有数据点。为此,需满足下列条件:

xi •w+b ≥ +1 when yi =+1

xi •w+b ≤ –1 when yi =–1

上述条件可重写至:

yi (xi •w) ≥ 1

到目前为止,我们将超平面作为二维空间中的平面或线条进行了讨论。然而,在现实中,情况并不总是这样。多数情况下,超平面为曲线而非直线状态,如图 2 所示。

Improving Performance - Fig 2
图 2:曲线超平面。

为便于说明,假设我们在二维空间中工作。此时,超平面为曲线。如需将曲线转变为直线,我们可以提高整个空间的维度。通过引入第三维 z 将空间转变为三维空间怎么样?

Improving Performance - Fig 3
图 3:引入第三维 z。

将数据置于更高维度空间以在更高维度下创建直线或平面的技术称为核技巧[5]。

Improving Performance - Fig 4
图 4:使用核技巧在更高维度下创建直线或平面

SVM 的应用

SVM 可用于:

  • 对文本和超文本分类。
  • 对图像分类。
  • 识别手写字符。

SVM 的优势和劣势

使用 SVM 有优势也有劣势:

  • 优势
    • 借助清晰的分离边际高效运行。
    • 高维度空间可提升效率。
    • 将训练点子集用于决策函数(称为支持向量),因此还可节省内存。
  • 劣势
    • 花费大量时间训练大型数据集。
    • 目标类别之间未清晰分离,因此无法高效运行。

英特尔® 数据分析加速库

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

在英特尔数据分析加速库中使用支持矢量机算法

本节展示如何使用英特尔 DAAL 在 Python [9] 中调用 SVM 算法 [8]。

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

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

    1. 执行如下命令以导入 Numpy:
      import numpy as np
    2. 执行如下命令,导入英特尔 DAAL 数值表:
      from daal.data_management import HomogenNumericTable
    3. 输入如下命令,导入 SVM 算法:
      from daal.algorithms.svm import training, prediction
      from daal.algorithms import classifier, kernel_function
      import daal.algorithms.kernel_function.linear
  2. 创建函数,把输入数据集划分为训练数据、标签和测试数据。

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

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

    输入如下命令以重新格式化数据(我们将 trainLabelstestLabels 视为 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. 创建函数,以训练模型。

    1. 首先创建一个算法对象,以训练模型,请输入如下命令:
      algorithm = training.Batch_Float64DefaultDense(nClasses)

    2. 输入如下命令,将训练数据和标签传输到算法:
      algorithm.input.set(classifier.training.data,trainInput)
      algorithm.input.set(classifier.training.labels,trainLabels)

      其中
      algorithm:在上述步骤 a 中定义的算法对象。
      trainInput:训练数据。
      trainLabels:训练标签。
    3. 输入如下命令以训练模型:
      Model = algorithm.compute()
      其中
      algorithm:在上述步骤 a 中定义的算法对象。
  5. 创建函数,以测试模型。

    1. 首先,输入如下命令,创建一个算法对象,以测试/预测模型:
      algorithm = prediction.Batch_Float64DefaultDense(nClasses)
    2. 输入如下命令,将测试数据和训练模型传输到模型:
      algorithm.input.setTable(classifier.prediction.data, testInput) algorithm.input.setModel(classifier.prediction.model, model.get(classifier.training.model))
      其中
      algorithm:在上述步骤 a 中定义的算法对象。
      testInput:测试数据。
      model:模型对象的名称。

    3. 输入如下命令以测试/预测模型:Prediction = algorithm.compute()
      其中
      algorithm:在上述步骤 a 中定义的算法对象。
      prediction:包含测试数据预测标签的预测结果。

结论

SVM 是一种强大的分类算法。借助清晰的分离边际,它可高效运行。英特尔 DAAL 优化了 SVM 算法。通过使用英特尔 DAAL,开发人员可充分利用未来更多代英特尔® 至强® 处理器中的全新特性,无需费心修改他们的应用。他们只需将其应用链接到英特尔 DAAL 的最新版。

 

参考资料

  1. 维基百科 —— 机器学习

  2. 支持矢量机

  3. 英特尔 DAAL 简介

  4. 超平面简介

  5. 核技巧

  6. 英特尔数据分析加速库简介

  7. 支持矢量机算法

  8. Python 网站

  9. 如何在 Linux* 中安装英特尔 DAAL 的 Python 版本。

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