为了提高销量,公司应该如何预测今后在广告中投入的资金总额?同样,为了提高效率,未来公司应该在培训项目方面花费多少资金?
在这两个案例中,两家公司通过不同变量之间的历史关系预测未来的结果,第一个案例中使用的销售额和广告支出之间的关系就是其中一个变量。
这是一个典型的回归问题,机器学习1是解决这个问题的最好方法。
本文描述了一种名为线性回归2的常用回归分析类型,以及英特尔® 数据分析加速库(英特尔® DAAL)3如何帮助优化该算法,使其以更高的性能在搭载英特尔® 至强® 处理器的系统上运行。
什么是线性回归?
线性回归 (LR) 是用于预测分析的最基本的回归类型。LR 展示了变量之间的线性关系以及一个或多个变量对某个变量的影响。受其它变量影响的变量被称为因变量、响应变量或结果变量,影响因变量的变量被称为自变量、解释变量或预测变量。
使用 LR 分析前,需要检查它是否适合该数据集,首先观察数据的分布模式。我们看一下以下两个图表:
图 1:数据点基本沿一条直线分布
图 2:数据点不沿直线分布。
图 1 中的数据点沿一条直线分布;图 2 中的数据点不沿直线分布,而是沿着一条曲线(非线性)分布。因此,可以对图 1 中的数据集进行线性回归分析,但是该方法不适用于图 2 中的数据集。
根据自变量数量的不同,LR 分为两类:一元线性回归 (SLR) 和多元线性回归 (MLR)。
只有一个自变量的 LR 被称为 SLR;MLR 包含一个以上的自变量。
最简单的线性回归只包含一个因变量和一个自变量,它的方程式被定义为:
y = Ax + B (1)
此处:
y:因变量
x:自变量
A:回归系数或直线斜率
B:常数
问题是如何找到最适合的直线,最大限度地缩减因变量 (y) 的观测值和预测值之间的差异。也就是说,找到方程(1) 中的 A 和 B,计算 |yobserved– ypredicted| 的最小值。
可以利用最小二乘法4找到最适合的直线, 通过计算每个数据点到直线的竖直分异(y 的观察值和预测值之间的差值)的最小平方和,找出最适合的直线。竖直分异也被称为残差。
图 3:线性回归图。
图 3 中的绿点代表了实际数据点。黑点表示将数据点竖直(而非垂直)投射至回归线(红线)。黑点也被称为预测点。实际数据点和预测数据点之间的竖直差异被称为残差。
线性回归的应用
以下领域充分了利用线性回归:
- 预测未来销量
- 分析营销效果和定价对产品销量的影响。
- 评估金融服务或保险领域的风险。
- 根据汽车中的测试数据研究引擎性能。
线性回归的优势和劣势
LR 的某些优势和劣势:
- 优势
- 自变量和因变量的关系几乎呈线性时,结果最为准确。
- 劣势
- LR 对异常值非常敏感,
- 不适合模拟非线性关系。
- 线性回归仅限于预测数值输出。
英特尔® 数据分析加速库
英特尔 DAAL 是一个包含众多优化的基本构建模块的库,适合数据分析和机器学习。这些基本构建模块经过高度优化,能适应最新版英特尔® 处理器的最新特性。LR 是英特尔 DAAL 提供的一种预测算法。在本文中,我们利用英特尔 DAAL 的 Python* API 来构建基本的 LR 预测器。请按照如何在 Linux* 中安装英特尔 DAAL 的 Python版本5中的说明安装 DAAL。
在英特尔数据分析加速库中使用线性回归算法
本节展示了如何利用英特尔 DAAL 在 Python6中调用线性回归方法。
参考部分提供了一个链接7,通过这个链接可以免费获取用于测试应用的数据库。
执行如下步骤,从英特尔 DAAL 中调用该算法:
- 利用 from 和 import 命令导入必要的封装。
- 执行如下命令以导入 Numpy:
import numpy as np
- 执行如下命令,导入英特尔 DAAL 数值表:
from daal.data_management import HomogenNumericTable
- 导入必要的函数至数值表,以存储数据:
from daal.data_management import ( DataSourceIface, FileDataSource, HomogenNumericTable, MergeNumericTable, NumericTableIface)
- 输入如下命令,导入 LR 算法:
from daal.algorithms.linear_regression import training, prediction
- 执行如下命令以导入 Numpy:
- 如果数据输入来自 .csv 文件,初始化文件数据来源:
trainDataSet = FileDataSource( trainDatasetFileName, DataSourceIface.notAllocateNumericTable, DataSourceIface.doDictionaryFromContext )
- 面向训练数据和因变量创建数值表:
trainInput = HomogenNumericTable(nIndependentVar, 0, NumericTableIface.notAllocate) trainDependentVariables = HomogenNumericTable(nDependentVariables, 0, NumericTableIface.notAllocate) mergedData = MergedNumericTable(trainData, trainDependentVariables)
- 加载输入数据:
trainDataSet.loadDataBlock(mergedData)
- 创建函数,以训练模型。
- 首先利用如下命令创建一个算法对象,以训练模型:
algorithm = training.Batch_Float64NormEqDense()
注:该算法利用正规方程解决线性最小二乘法问题。DAAL 还支持 QR 分解。 - 输入如下命令,将训练数据集和因变量传输至算法:
algorithm.input.set(training.data, trainInput) algorithm.input.set(training.dependentVariables, trainDependentVariables)
此处
algorithm
:在上述步骤 a 中定义的算法对象。train
Input
:训练数据。trainDependent
Variables
:训练因变量 - 输入如下命令以训练模型:
trainResult = algorithm.compute()
此处
algorithm
:在上述步骤 a 中定义的算法对象。
- 首先利用如下命令创建一个算法对象,以训练模型:
- 创建函数以测试模型。
- 和上述第 2、3 和 4 步类似,需要创建测试数据集,以进行测试:
i.testDataSet = FileDataSource( testDatasetFileName, DataSourceIface.doAllocateNumericTable, DataSourceIface.doDictionaryFromContext )
ii.testInput = HomogenNumericTable(nIndependentVar, 0, NumericTableIface.notAllocate) testTruthValues = HomogenNumericTable(nDependentVariables, 0, NumericTableIface.notAllocate) mergedData = MergedNumericTable(testDataSet, testTruthValues)
iii.testDataSet.loadDataBlock(mergedData)
- 输入如下命令,创建一个算法对象,以测试/预测模型:
algorithm = prediction.Batch()
- 输入如下命令,将测试数据和训练模型传输到模型:
algorithm.input.setTable(prediction.data, testInput) algorithm.input.setModel(prediction.model, trainResult.get(training.model))
此处
algorithm
:在上述步骤 a 中定义的算法对象。
testInput
:测试数据。 - 输入如下命令以测试/预测模型:
Prediction = algorithm.compute()
- 和上述第 2、3 和 4 步类似,需要创建测试数据集,以进行测试:
结论
线性回归是一种非常常用的预测算法,英特尔 DAAL 优化了线性回归算法。通过使用英特尔 DAAL,开发人员可充分利用未来更多代英特尔至强处理器的全新特性,无需费心修改他们的应用。他们只需将其应用链接到最新版英特尔 DAAL。