数据科学的统计学(二)

原文:annas-archive.org/md5/c1775cf5add79c3a9b0f4e83a2b2229d

译者:飞龙

协议:CC BY-NC-SA 4.0

第七章:数据库改进的正则化

在本章中,我们将介绍统计正则化的概念,以改善数据模型,并帮助理解统计正则化是什么、为什么它很重要,并且让您对各种统计正则化方法感到熟悉。

本章中,我们将信息组织成以下几个方面:

  • 统计正则化

  • 使用数据理解统计正则化

  • 改进数据或数据模型

  • 使用 R 进行统计正则化

统计正则化

那么,什么是统计正则化呢?

在正则化中,无论我们讨论的是数学、统计学还是机器学习,本质上是在讨论通过添加额外信息来解决问题的过程。

正则化一词被描述为管理复杂系统的抽象概念(根据一套规则或公认的概念)。这些规则定义了如何添加或修改值,以满足要求或解决问题。

添加或修改值是否意味着改变数据?(本章稍后将深入研究这一问题。)

各种统计正则化方法

在统计学界,最流行的统计正则化方法可能包括以下几种:

  • 套索

  • 最小角度

脊回归是一种统计技术,通常用于分析回归数据或模型,这些数据或模型存在一个被称为多重共线性的问题。当出现多重共线性时,估计值可能是无偏的,但其方差通常很大,且远离真实值。此技术通过向回归估计添加一定的偏差来减少标准误差(以产生更可靠的估计值)。

多重共线性是统计学中的一种现象,在这种情况下,多元回归模型中的一个预测因子可以通过其他预测因子线性地预测,并且预测准确度较高。

套索

最小绝对收缩和选择算子Lasso)是一种统计技术,既执行变量选择,又进行正则化,以提高模型中的预测准确性。

在统计模型中选择或挑选变量的过程显然会导致变量数量的减少,这也被称为变量收缩。

最小角度

最小角度回归LARS)是一种统计技术,数据科学家在处理高维数据时会使用此技术。如果怀疑某响应变量是由特定的预测因子子集决定的,那么 LARS 技术可以帮助确定应将哪些变量纳入回归过程。

正则化机会

那么,作为数据科学家,您何时会考虑使用任何类型的正则化方法?

事实上,没有绝对的规则规定何时使用正则化;然而,有一些指标可以观察,当这些指标出现时,你应该考虑使用正则化。例如:

  • 如果数据中包含较高的变量计数

  • 如果数据中观测值的数量与变量数量的比率很低

在第六章,从数据库发展到数据库回归(统计回归),我们回顾了一些包含咨询项目结果的示例数据。在该示例中,我们探讨了项目的总开票小时数、项目管理的总小时数和项目假定的盈利能力之间的关系。

仔细观察相同的数据,也许我们现在会看到更多的变量,例如:

  • 分配到项目的全职顾问数量

  • 分配到项目的兼职顾问数量

  • 分配到项目的分包商数量(全职或兼职)

  • 分配到项目的全职客户资源数量

  • 分配到项目的兼职客户资源数量

  • 分配到项目的本地资源数量

  • 在项目核心技术方面的经验年数

  • 总项目管理小时数

  • 总开发小时数

  • 每小时账单费率

  • 总开票小时数

  • 项目中使用的技术数量

  • 项目风格(时间和材料、不可超出预算或人员增补)

在这里,我们可以看到超过十二个可能的自变量或预测变量——这显然是一个可管理的数量——特别是考虑到文件中的观测值(记录)数量超过 100 个(变量与观测值的比例约为 12%)。

自变量(或实验变量或预测变量)是在模型中被操控的变量,目的是观察它对因变量或结果变量的影响。

当数据科学家谈到高变量计数时,实际上他们指的是过多的变量数,或者当变量数接近观测数时(在这个例子中不是如此),假设我们在只有 100 个观测值的数据中有超过 50 个可能的预测变量?这就是所谓的过于复杂的模型,并需要考虑使用常见的正则化方法。

什么构成过于复杂的模型通常是一个争议话题,且往往根据数据和统计模型的目标不同而有所不同。

经验证明,当模型过于复杂时,模型可能会拟合数据,但预测性能较差(最终目标是预测)。当这种情况发生时,数据科学家会认识到过拟合。

正则化是数据科学家用来避免或解决过拟合问题的统计技术。正则化的基本思想是,过拟合数据的模型是复杂的统计模型,这些模型例如具有过多的参数。

正则化的其他已知应用包括以下内容:

  • 涉及高共线性的实例

  • 当项目目标是稀疏解时

  • 考虑高维数据中的变量分组

  • 分类

共线性

共线性一词描述了统计学中的一种情况,即选定的预测变量可以通过其他变量线性预测,且具有相当高的准确度。

线性预测是一种程序,其中根据先前样本的线性函数估算变量的未来值。

这通常会导致数据的微小变化产生关于个别预测变量的不可靠结果。也就是说,具有共线性预测变量的多元回归模型可以指示整个预测变量组如何预测结果变量,但可能无法提供关于任何单个预测变量的有效结果,也无法指示哪些预测变量在与其他变量的关系中是冗余的。

稀疏解

稀疏解近似解是一个稀疏向量,它大致解决了一组方程。寻找稀疏近似解的技术在图像处理和文档分析等应用中得到广泛应用。

你应该记得,向量是由相同基本类型的数据点组成的序列。向量的成员正式称为分量

高维数据

高维统计学是研究数据维度大于经典多元分析MVA)中考虑的维度的数据的学科。

在统计研究中,多元随机变量(或随机向量)是一个由变量组成的列表,每个变量的值都未知。多元分析(MVA)被定义为研究这一情况的学科。

高维统计学依赖于随机向量理论。在许多应用中,数据向量的维度可能大于样本大小。

分类

分类是根据已知类别成员的数据训练集,识别新观察值属于哪些类别或组的过程。

正则化是一种常见的统计技术,用于解决上述(以及其他)情境。在下一节中,我们将介绍每种情境的一些简单示例。

使用数据理解统计学正则化

变量选择是统计学领域中的一个重要过程,因为它旨在通过消除与输出无关的变量,使模型更易理解、更易训练,并避免误关联。

这(变量选择)是解决过拟合问题的一个可能方法。通常,我们不期望模型完全拟合我们的数据;实际上,过拟合问题通常意味着如果我们过度拟合训练或测试数据,它可能会对我们预测模型在未见数据上的准确性造成不利影响。

与其使用变量选择,不如说正则化过程是一种减少数据中变量数量的替代方法,用来解决过拟合问题,本质上是通过在模型训练过程中引入有意的偏差或约束(希望)防止我们的系数出现非常高的方差。

当参数的数量(在总体中)被认为非常大——尤其是与可用观察值的数量相比——线性回归往往允许少数观察值的微小变化导致系数发生剧烈变化(或者,如我们所说,表现出非常高的方差)。

岭回归是一种统计方法,通过对模型的回归估计引入受控偏差(通过或使用约束),但它在减少模型方差方面非常有效。

岭回归有时在数据科学社区中被称为一种惩罚回归技术。

有许多不同的 R 函数和包实现了岭回归,例如来自MASS包的lm.ridge()函数和来自genridge包的ridge()函数。

你可能熟悉MASS R 包,但可能不太了解genridgegenridge包引入了岭回归和相关方法中使用的标准单变量岭迹图的推广,并值得进一步研究。

在第六章《从数据库进阶到数据库回归》中,我们提出了一个例子,使用一个咨询公司项目结果的数据创建了一个线性回归模型,旨在预测项目的盈利能力。我们使用了 R 函数:lm(),该函数接受两个主要参数:formula(一个公式类的对象)和data(通常是一个data.frame),如下所示的 R 代码:

# --- build linear regression model using all the
# --- project results data
alinearMod <- lm(ProjectManagement ~ Profit, data=MyData)

在本章中,我们将使用lm.ridge()函数,尝试通过岭回归来合理地拟合前述线性模型。前面的代码使用我们的 R 对象MyData,并通过ProjectManagment变量来预测Profit,从而生成了一个线性模型。

lm.ridge函数使用以下语法:

lm.ridge(formula, data, subset, na.action, lambda = 0, model = FALSE,
x = FALSE, y = FALSE, contrasts = NULL, ...)

参数在此列出,供后续参考:

  • formula:这是一个回归模型的公式表达式,形式为response ~ predictors

  • data:这是一个可选的数据框,用来解释公式中出现的变量

  • subset:这是一个表达式,用于指定在拟合过程中应使用数据的哪些行子集。默认情况下,所有观察值都会被包含在内。

  • na.action:这是一个函数,用于过滤缺失数据

  • lambda:这是一个标量或向量,表示岭常数

  • model:是否返回模型框架?

  • x:是否返回设计矩阵?

  • y:是否返回响应值?

  • contrasts:一组对比列表,用于公式中的某些或所有因子项

lambda 这个术语(在此,指的是 lm.ridge 函数中的一个参数)通常定义为在一组依赖变量的组合上对组均值的比较。

为了设定我们下一个示例,让我们回顾一下,我们的项目数据的变量与观测值的比例为 12%。假设我们已经获得了一个新的数据文件,这个文件只有 50 个观测值。现在,我们的变量与观测值的比例上升到 24%。

那么,只有 12 个观测值的文件呢?再假设我们被告知,管理层认为这 12 个观测值基于关键的高可见性项目,因此不愿意提供更多的数据样本给数据科学家(至少目前是这样)?对这些数据建模是否还有意义?结果会有任何价值吗?

通常来说,人们会说回归模型中变量越多,模型就越灵活,或者说它会变得更加灵活。很可能,这种类型的模型会通过拟合训练数据中的随机波动来获得较低的误差,但结果或结论并不能代表数据中变量的真实潜在分布,换句话说,当该模型在从相同分布中提取的未来数据上运行时,性能会较差。(如果我们关于项目盈利能力的预测是基于错误的逻辑,管理层可不会高兴!)

在上述情境下,数据科学家应该如何处理?好吧,尽管数据点少于变量时,确实有可能拟合出好的模型,但这必须非常小心地进行。

通常情况下,当数据中的变量数量超过观测值时,结果可能看起来会表现良好,但正如我们之前提到的,解决方案可能在训练数据上取得有利结果,甚至是零误差。这样的模型肯定会在实际数据上发生过拟合,因为它对于训练数据的数量来说过于灵活。(这种情况称为病态欠定。)

这个问题通常通过仔细设定限制或施加约束来解决,可以通过显式的方式或逻辑过程来实现。模型成为了在很好地拟合数据和满足这些设定的限制或约束之间的权衡。岭回归约束或惩罚数据参数,并通过限制模型的灵活性来提高预测性能,从而减少过拟合的倾向。

然而,简单地设定限制或施加约束并不意味着得到的解决方案会是好的或可接受的。只有当这些约束真正适合当前问题或目标时,它们才会产生好的解决方案。

回到我们在本节前面提到的 lm.ridge 函数。与 lm 函数的使用稍有不同,我们可以通过以下的使用示例看到其中的差异。

和大多数示例一样,我们可以利用runifrnom这两个 R 函数来生成一些随机数数据集(用于插图),我们可以看到执行lmlm.ridge之间的区别:

# -- create a uniform random number series as X1, X2 and X3
# --- using runif
x1 <- runif(n=20)
x2 <- runif(n=20)
x3 <- runif(n=20)
# --- Create a new variable from x1 and x2
x3c <- 10*x1 + x3
# --- create a random number
ep <- rnorm(n=20)
y <- x1 + x2 + ep

既然我们知道了我们要探索的内容(例如,估计线性回归模型中的参数),我们就可以在创建测试数据时进行一些自由发挥。以下是一个使用我们三个人造变量生成线性回归模型的 R 代码示例:

# --- using the R lm function to create an ordinary least squares (OLS) # -- fit of 3-variable model using x3 as an independent x3 variable
ols <- lm(y~ x1 + x2 + x3)
summary(ols)

以下是从前面的代码生成的输出:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/14a32907-43d6-400a-b36a-e6a0ef9f84dd.png

现在,让我们继续。

使用我们相同的虚拟示例数据和类似的思路,我们可以使用 R 函数lm.ridge来尝试通过岭回归拟合线性模型:

# --- Fit model using ridge regression using independent variables
ridge <- lm.ridge (y ~ x1 + x2 + x3, lambda = seq(0, .1, .001))
summary(ridge)

以下是生成的输出(请注意summary函数生成的输出差异):

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/b40c4f50-dc12-4ffe-acf7-87ea1a6da8f5.png

你会发现,summary函数在使用线性回归模型时与在使用岭回归方法的模型中生成的输出不同。然而,有多种包可以生成岭回归模型的充分输出。

改善数据或数据模型

有多种参数可用于改善数据或数据模型。在本节中,我们将研究其中的一些。

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/161afca5-347a-4159-8d3b-8154f2c3cf63.png

数据科学家可以采用许多其他可接受的或至少是广为人知的方法或策略,以期改进统计模型(除了正则化之外),值得花些时间提到其中一些最流行的方法:

  • 简化

  • 相关性

  • 速度

  • 转换

  • 系数的变化

  • 因果推断

  • 回到正则化

  • 可靠性

简化

第一个可能只是常识。一个简单的模型更容易解释和理解。算法在简单模型上运行得更高效,允许数据科学家有更多的迭代次数以及更多的时间来评估结果。

然而,请记住,更复杂的模型在某种程度上更具可信性,因此要小心过度简化。寻找复杂与简单之间正确平衡的方法可以双向进行;可以从简单开始并逐步增加复杂性,或者更常见的是,从复杂开始,然后逐步剔除模型中的内容,进行测试、评估并重复,直到成功理解(拟合)过程。

相关性

这一点也似乎显而易见。换句话说,不要浪费时间在统计噪声上。使用常见的统计回归包,你将有可视化图(如分位数-分位数图、影响图、箱形图等)来研究并理解。花时间从模型或数据中剔除无关项将带来回报。关键是能够识别什么是相关的。

速度

数据科学家能够更快地拟合模型,就能评估和理解更多的模型(和数据)(这就是最终目标!)。模型优化的方式和手段可能是昂贵的——无论是在时间上还是在专业技能上——并且可以集中在模型、数据或两者上。

变量变换

这是一种可能对模型产生重大影响的方法,但并非没有风险。变量的转换可以创建看似合理的模型(然后可以拟合并与数据进行比较),并且包括所有相关信息,但如果做得不理性,可能会引入偏差并导致错误的结果。

系数的变异

测试系数,以确定某个系数是否应该随组别变化,以及变化的估计规模,是改善模型的可行方法。非常小的变动系数(在不同类别之间)有可能被排除在考虑之外。

因果推断

你可能会想设置一个大的回归模型来回答模型或数据中存在的多个因果问题;然而,在观察性设置中(包括在某些感兴趣的条件下的实验),这种方法可能存在偏差的风险。关键是,不要对任何感知到的关系(或系数)做出假设,尤其是不要假设一个系数可以因果解释。然而,因果推断可以在适当的情况下作为一种方法,用来改善统计模型。

回到正则化

直接切入主题——正则化的核心主题是试图改善统计模型或方法的结果或性能。换句话说,就是通过直接和间接的观察来改进学习过程(当然是通过数据)。

试图从有限的数据集获取知识或学习(也称为经验学习)被认为是一个欠定问题,因为通常情况下,它是试图推断一个函数x {\displaystyle x},仅给定一些数据观察的例子。

改进统计模型的另一种可能方法是,在模型训练过程中使用加法平滑(也称为拉普拉斯平滑)。这是一种正则化形式,通过在模型训练过程中将一个固定的数字添加到所有特征和类别组合的计数中来工作。

有一种普遍的观点认为,加法平滑在一些检索任务中(如基于语言模型的应用)比其他概率平滑方法更有效。

正则化从根本上来说是通过引入额外的信息、故意的偏差或约束来解决一个不适定的问题——防止系数取大值——这是一种试图收缩系数的方法,也称为收缩方法。引入的信息通常表现为对复杂度的惩罚,例如平滑性限制或向量空间范数的约束。换句话说,正则化 A 的作用正如其名称所示,它调节你可以在统计模型或其数据中如何以及多大程度上改变一个参数。没错,实际上,你可以改变数据本身!

什么时候改变数据的值是合理的?

统计学界认为,正则化的理论依据可能是它试图施加一种信念:在多个竞争假设中,假设最少的那一个将是最有效的(因此应当是被选中并使用的)。这种信念被严格称为奥卡姆剃刀(或称“简约法则”)。

可靠性

是否应该总是在统计模型中尝试实施正则化方法呢?(当然,我们指的是本章“正则化机会”部分中所讨论的那些情况。)它是否总能改善模型或数据集?

在考虑如何回答这个问题之前,记住正则化不会改善算法最初用来学习模型参数(特征权重)的数据集上的表现。然而,它可以改善模型的泛化性能(即在新的、未见过的数据上的表现,这正是你所追求的)。

可以把在统计模型中使用正则化看作是对过拟合的反制措施,类似于加入偏差;但另一方面,加入过多的偏差几乎总是导致欠拟合,模型表现会很差。

答:正则化并不总是有效,可能导致模型表现不佳(甚至比之前更差!)。《Python 机器学习》一书的作者 S. Raschka 提出了一个有趣的评论:

从直观角度来看,可以将正则化理解为对模型复杂度的惩罚。增加正则化强度会惩罚大权重系数。因此,你的目标是防止模型捕捉到异常或噪声,并确保模型能很好地泛化到新的、未见过的数据。

使用 R 进行统计正则化

有许多不同的函数和包实现了岭回归,例如来自MASS包的lm.ridge()和来自genridge包的ridge()。对于套索回归,还有lars包。在本章中,我们将使用 R 的glmnet()函数(来自glmnet包),因为它文档完善,接口一致且友好。

使用正则化的关键是确定一个合适的lambda值。glmnet()函数使用的方法是使用不同的lambda值组成的网格,为每个值训练一个回归模型。然后,可以手动选择一个值,或者使用某种技术估计出最佳的lambda

你可以指定尝试的值的序列(通过lambda参数);否则,将使用包含 100 个值的默认序列。

参数设置

glmnet()函数的第一个参数必须是特征矩阵(我们可以使用 R 函数model.matrix()创建该矩阵)。第二个参数是包含输出变量的向量。最后,alpha参数是用来在岭回归(0)和 lasso(1)之间切换的。以下代码为我们的示例设置了环境:

# --- load the package 
library(glmnet) 
# --- create our parameter data 
cars_train_mat <- model.matrix(Price ~ .-Saturn, cars_train)[,-1] 
lambdas <- 10 ^ seq(8, -4, length = 250) 

model.matrix是一个 R 函数,通过扩展因子为一组汇总变量(取决于对比)并类似地扩展交互作用来创建矩阵。


 # --- create regression model 
cars_models_ridge <-  
  glmnet(cars_train_mat, cars_train$Price, alpha = 0, lambda = lambdas) 

# --- create a lasso model 
cars_models_lasso <-  
  glmnet(cars_train_mat, cars_train$Price, alpha = 1, lambda = lambdas) 

我们在此示例中用于设置数据的前述代码(具体为length = 250)提供了一个包含 250 个值的序列。这意味着(在前述代码中)实际上训练了 250 个岭回归模型和另外 250 个 lasso 模型!

我们可以查看glmnet()生成的cars_models_ridge对象的lambda属性值,然后应用coef()函数来提取第 100^(th)模型的相应系数,方法如下:

# --- print the value of the lambda object of the 100th model 
# --- generated by glmnet 
cars_models_ridge$lambda[100] 
[1] 1694.009 

# --- use coef to see 100th model's coefficient values 
coef(cars_models_ridge)[,100] 
  (Intercept)       Mileage      Cylinder         Doors  
 6217.5498831    -0.1574441  2757.9937160   371.2268405  
       Cruise         Sound       Leather         Buick  
 1694.6023651   100.2323812  1326.7744321  -358.8397493  
     Cadillac         Chevy       Pontiac          Saab  
11160.4861489 -2370.3268837 -2256.7482905  8416.9209564  
  convertible     hatchback         sedan  
10576.9050477 -3263.4869674 -2058.0627013 

最后,我们可以使用 R 的plot()函数生成一张图,显示随着对数值变化,系数值如何变化。

如以下代码所示,将岭回归和 lasso 的图表并排显示是非常有用的:

# --- visualize our model data 
# --- set matrix column-widths and the row-heights 
layout(matrix(c(1, 2), 1, 2)) 

# --- create ridge regression plot 
plot(cars_models_ridge, xvar = "lambda", main = "Ridge  
   Regression\n")

以下是前述 R 代码生成的图形:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/966624e3-2d01-46cd-a46d-bf473ac56cc6.png

这是生成lasso图的 R 代码:

# --- create lasso plot 
plot(cars_models_lasso, xvar = "lambda", main = "Lasso\n") 

这是相应的输出:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/ce26b845-7e47-48f0-839c-b26deda890ed.png

上述两个图的显著区别在于,lasso会强制许多系数精确地降到零,而在岭回归中,系数通常会平滑地下降,只有在极端值时才会完全降到零。请注意,两个图的上方水平轴上的数值,显示了随着值的变化,非零系数的数量。

除了应用正则化以最小化过拟合问题外,lasso函数通常用于执行特征选择,因为具有零系数的特征将不会被包含在模型中。

作为glmnet包的一部分,predict()函数可以在多种情境中使用。例如,我们可以确定模型在一个原始列表中未包含的lambda值下的系数方差CV)百分比(两个变量之间线性关系的强度和方向)。

Predict是一个通用函数,用于从各种模型拟合函数的结果中进行预测。

让我们尝试在之前创建的lasso模型上使用predict

我们可以在之前创建的lasso模型cars_models_lasso上编写以下 R 代码:

# --- use predict function on the lasso model 
predict(cars_models_lasso, type = "coefficients", s = lambda_lasso) 

Below is the generated output, a list of the coefficient values: 

 (Intercept)  -521.3516739 
Mileage        -0.1861493 
Cylinder     3619.3006985 
Doors        1400.7484461 
Cruise        310.9153455 
Sound         340.7585158 
Leather       830.7770461 
Buick        1139.9522370 
Cadillac    13377.3244020 
Chevy        -501.7213442 
Pontiac     -1327.8094954 
Saab        12306.0915679 
convertible 11160.6987522 
hatchback   -6072.0031626 
sedan       -4179.9112364 

从前面的输出可以看出,lasso没有将任何系数强制为零,这表明在这种情况下,应该保留所有特征(即不应从数据中删除任何特征)。

总结

在本章中,我们提供了统计正则化的解释,并使用示例数据进行了演示,以便更好地理解统计正则化。之后,我们讨论了如何通过正则化来改进数据或数据模型的多种方法。最后,我们看到了 R 语言如何很好地支持正则化的概念和方法。

在下一章,我们将介绍数据模型评估的概念,并使用统计学进行评估。我们将比较数据评估和数据质量保证的概念,最后,应用统计评估的思想,并通过 R 语言对数据进行评估。

第八章:数据库开发与评估

本章将介绍数据(数据库)评估的实践。我们将解释什么是统计评估,为什么它对数据科学家非常重要,并通过使用 R 提供一些示范性的例子,展示如何执行各种统计评估方法。

正如我们在本书中一直努力做的那样,我们将对某些数据开发人员和数据科学家的概念进行类比,比较数据或数据库开发与数据(数据库)评估之间的区别,并对数据评估和数据(质量)保证的实践进行比较。

我们已将本章信息组织成以下几个部分:

  • 评估与统计评估的比较

  • 开发与评估的对比

  • 数据评估是否能保证数据质量?

  • 使用 R 应用统计评估方法对数据进行评估

让我们开始吧!

评估与统计评估

Merriam-Webster 将评估定义为:

做出判断的行为或实例。

下图展示了评估统计数据的流程:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/c78bdd2b-3cc2-4748-9fab-e4edddcd725b.png

我们需要记住一些统计评估的要点。它们如下所列。

目标

牢记这一点,要能够做出合理的评估——也就是说,做出判断——首先必须设定目标。评估目标帮助数据科学家确定如何评估数据、数据库或统计数据模型。没有明确的目标,你会浪费宝贵的时间,并且可能对一个不符合业务需求的模型产生信任,甚至可能导致错误的假设(预测)。

基准线

接下来,(根据你设定的目标)需要建立标准、最低可接受的性能或基准,以便对所评估的内容形成意见。换句话说,你评估的内容与所认可的可接受标准相比,表现如何?

尽管我们在这里不会花太多时间讨论数据库评估的过程(而是着重于统计数据或统计数据模型评估),但我们会提到使用特定的性能度量(性能指标或度量标准)。

数据科学家在评估统计模型的预测准确性时,通常会使用非常具体的(性能)度量标准。这些度量标准取决于所评估问题的类别或类型,并要求采用略有不同的方式来评估(模型的)性能。这一方法也同样适用于评估标准的非统计数据和数据库。例如,用于评估在线事务处理OLTP)数据模型的性能度量标准与用于评估企业数据仓库EDW)模型的标准将会非常不同。

更深入地看,在评估、性能测试或评估(非统计性)数据库时,需要关注不同基准的识别(即基准测试)、容量的确定与规划、执行浸泡测试或测试、峰值-休息间隔(仅举几个例子)作为努力的一部分。

评估规划

正如非统计性数据库(例如 OLTP、EDW 等)的类型决定了用于评估的测试类型,统计模型的类型(例如回归、分类、二分类等)也会决定数据科学家用来评估统计模型的适当评估技术或方法(稍后将在本章中详细讲解)。

一旦你设定了评估目标并建立了基准,就会制定执行计划。该计划通常概述了整个执行过程。计划中会列出要执行的测试以及测试目标、需要比较的基准,甚至包括预期结果。

评估

在统计学中,性能通常与模型的准确性互换使用。当谈到非统计性数据库或模型时,性能可能更多与速度有关——查询返回值所需时间、提交事务所需时间等——以及准确性,通常围绕质量保证的概念,而不是预测值的能力!

在评估统计模型时,数据科学家会查看模型的错误率、模型所做的错误分类数量、正确预测的数量与总预测数量的比例(由模型预测)等。此外,所有这些都取决于统计模型的类型和目标。

最后,一旦完成,数据库和统计数据模型评估的结果通常会以多种方式进行可视化,以便于评估,采用常见的方法(同样,如何呈现或可视化过程结果将取决于准备可视化的人或模型的目标)。应当理解,一旦评估结果被评估后,评估过程的各个部分(甚至整个评估过程)进行重复是很常见的。这可能是为了进一步澄清在呈现结果中识别的某些内容,或重新验证某些结果。在某些情况下,可能会制定并执行新的项目目标、基准,甚至新的计划。

总结来说,执行数据库或(统计)数据模型评估的过程,在广义上是相似的,都需要以下内容:

  • 设定目标(数据库或数据模型的目标)

  • 建立基准(用于比较性能)

  • 确定评估计划

  • 评估结果

开发与评估

尽管评估过程会产生输出,最终可能只是一个决策(也就是说,观察的数据、数据库或统计数据模型是否达到了基于目标的可接受性能限度?),但开发意味着构建。

开发也可以意味着通过扩展、扩大或精细化来改进。这意味着(或至少暗示)任何人所开发的东西可能永远不会完全完成。事实上,开发和评估是并行进行的。

开发任何事物的行业公认实践建议如下:

  • 构建(或开发)

  • 测试

  • 评估

  • 重复

在开发关系型数据模型时,可能会使用create SQL 语句,如以下代码所示:

mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY (a), KEY(b))
-> ENGINE=MyISAM SELECT b,c FROM test2;

分析前面的代码,我们可以看到,结果是生成了一个表对象test。也许,保持相同的思路,评估一个(关系型)数据库或数据模型可能会使用以下代码示例的某种形式:

USE AdventureWorks;
GO
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID
SET STATISTICS IO OFF
SET STATISTICS TIME OFF

像前面那样的语句执行性能工具,返回相关的统计数据,可以进行可视化和分析。

一个类似的(尽管简单的)统计开发(或创建)示例可能看起来像以下 R 代码(摘自第七章,数据库改进的正则化):

# --- using the R lm function to create an ordinary least squares (OLS) # -- fit of 3-variable model using x3 as an independent x3 variable
ols <- lm(y~ x1 + x2 + x3)
summary(ols)

同样来自第七章,数据库改进的正则化,我们使用 R 函数 summary 开始对生成的线性回归模型的性能进行评估:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/3bef23e9-cbf9-4318-a0c3-c662ca52409d.png

如前所述,根据统计问题的类别,数据科学家将使用不同的方法或手段来评估(模型的)性能(包括 R 函数 summary)。

规划

在本章的上一节中,我们比较并找出了评估与统计评估之间的相似之处,并指出,作为任何评估项目的一部分(或者至少是你希望其成功的项目),你需要制定一个计划。

进入这一部分,我们将开发与评估联系起来,我们再次看到,开发过程中的第一步可能是制定一个计划。

作者认为,制定计划是生活中任何事业的基本要求,甚至是早晨起床!

当你在考虑数据库开发时所制定的计划可以在实施时作为指南(在此情况下为数据库或统计数据模型),并且在实施后作为功能规范(对于数据库)。

那么,评估一个数据库(或在统计学中,评估一个数据模型)的任务呢?嗯,同样的道理。第一步是制定一个详细的评估计划,这个计划不仅可以指导整个评估过程,评估完成后,还可以作为一个功能规范参考。

计划总是会自我付出回报。一个好的开发或评估计划可以成为详细的项目计划、验收测试计划、部署文档,并且如前所述,还可以作为功能规范的参考。

数据库设计是数据或数据库开发过程的一部分。设计一个数据库可能是一个复杂的任务。设计过程的一部分是数据建模师(或经验丰富的数据开发者)研究数据、其来源、需求等,然后生成详细的数据模型。该数据模型将包含所有必要的逻辑设计和物理设计选择,以及生成数据定义语言DDL)所需的物理存储参数,这样就可以实际创建数据库。

一个全面的数据库开发计划应包括数据库设计阶段(从建模到创建),并在过程中指明多个测试和评估步骤。

统计建模(实际上被认为是数学建模的一种形式)涉及整合或汇集一组假设,这些假设涉及或关于生成某些样本数据和来自(希望是)更大数据集的类似数据。

生成统计模型的计划(类似于生成数据库模型的计划)应包括对(样本)数据、其来源、所有需求等的检查。同样,和前述计划一样,统计建模计划应包括提及数据科学家计划在统计模型上使用的每次评估和评估。

通常,统计模型评估计划还会包括数据科学家在每次评估测试后,计划用来阐明观点或总结结果的可视化参考。

统计建模被描述为研究一个系统或过程,以预测其未来的行为,正如 Madhuri Kulkarni 所说:

在拥有系统的观察数据的情况下,模型可以帮助推断系统的各种替代方案。

所有可用于统计建模(以及理解和操作数据)的通用工具中,R 似乎是最强大且最流行的。

从非统计建模的角度看,数据建模定义并分析支持业务流程的需求(在组织中某些信息系统的范围内)。在这里,像 Erwin Data Modeler 和 MySQL Workbench 这样的工具似乎是最常成功使用的工具。

最后,尽管开发和评估是两个独立的工作,但它们是紧密相关的,无论是统计还是非统计,一个都离不开另一个的存在。

数据评估和数据质量保证

为了系统地讨论,我们来看一下数据评估如何与数据质量(保证)进行比较或对比。

数据质量保证,或者通常由数据科学家称为整理数据,是解决(可能是感知的)数据问题或担忧的过程。这些问题会影响数据库或数据模型的使用、质量和结果(性能)——当然,数据质量相对于预期使用目的(数据、数据库或数据模型的使用)来说是相对的。

质量分类

通常,数据质量问题可以归类为以下几个领域之一:

  • 准确性

  • 完整性

  • 更新状态

  • 相关性

  • 一致性(跨来源)

  • 可靠性

  • 适当性

  • 可访问性

你会发现统计数据和非统计数据之间有很多数据质量分类的重叠。有时,数据质量问题可能看起来仅适用于某一特定类别——统计数据与非统计数据——但经过进一步调查或至少对数据或领域的更多经验,你可能会发现质量是质量。

数据的质量会影响结果,且数据的质量可能受到数据输入、存储和管理方式的影响,解决数据质量问题的过程(通常被称为质量保证,数据质量保证DQA))需要定期的例行审查和评估数据,并进行名为“分析”和“清洗”的持续过程。(即使数据存储在多个不同的系统中,这些过程也至关重要,这使得这些过程变得更加困难。)

尽管数据质量保证(DQA)和整理数据的概念在许多方面相似,但 DQA 通常更侧重于可重复的过程,而整理数据通常是根据需要进行的,并且由数据科学家根据统计模型的目标自由决定(尽管有经验的数据科学家很可能会努力创建可重用的例程或脚本,以便以后在当前或其他项目中使用这些脚本来操作或整理数据)。

相关性

很多值得注意的重点都放在统计相关性上。统计信息的相关性反映了它满足特定项目实际需求的程度。它关心的是现有信息是否能解决项目中重要问题的相关性。评估相关性是主观的,并依赖于用户不断变化的需求。

确定和衡量数据相关性的一个关键方法是通过一个叫做添加上下文分析的过程。

我们来看一下,这个概念是什么?

一般来说,看似相似的数据实际上可能意味着截然不同的事情。例如,平均每分钟转速RPM)的含义,如果数据代表的是跑车与经济型汽车,甚至卡车,便会有不同的涵义。

对于数据,应该通过我们提到的分析过程来发展背景线索,这个过程被称为数据分析,以便数据使用者在使用数据时能更好地理解它。此外,了解你正在处理的数据的背景和视角,是确定应进行何种评估的关键步骤,或者对于非统计模型而言,可能需要进行哪种性能评估。

添加背景到数据的另一个动机可能是为了从数据中获得新的视角。例如,认识到并检查数据中存在的比较。例如,住宅或房价可以根据邮政编码或其他标准进行比较。

将背景添加到数据中(无论是统计的还是其他形式的),作为开发和评估过程的一部分(回想一下,我们提到过这两者是紧密结合的),确实可以使数据更加相关,但背景仍然无法替代数据的价值。

在考虑数据中的任何变量之前,例如平均转速、扭矩、最高速度、轴距、重量(或其他),最重要的是,评估测试需要使那些将要使用数据的人受益,或者换句话说,无论数据科学家希望预测什么。举例来说,如果我们扩展这个车辆数据的例子,期望的每加仑英里数(MPG)就是其中之一,因此建立适当的背景要求至关重要。

对于数据分析(或为项目中使用的数据添加背景),规则如下:

在考虑背景之前,思考−> 价值

类似于我们如何分类数据质量问题的类型一样,也有几个背景类别,可以用来论证或提升数据的价值与理解,以便进行可视化:

  • 定义与解释

  • 比较

  • 对比

  • 趋势

  • 离散度

评估值和数据质量,甚至数据或数据模型的价值,虽然可能有重叠的部分,但其目标是不同的。

交叉验证

如果一本书的章节集中在统计学(以及评估统计模型)上,而没有至少一节关于交叉验证的内容,那是不可行的。你可能听到一些数据科学家将交叉验证称为旋转估计,或者仅仅视为一种评估模型的通用技术。

交叉验证是数据科学家常用的一种方法,用来评估统计模型的准确性。交叉验证的关键概念是测试一个模型的泛化能力,或者更具体地说,测试该模型如何将从训练数据样本中推断的结果应用于整个数据集或人群。

交叉验证有两个目标——使用一个算法从可用数据中估算模型的性能,以及比较两种或更多不同算法的性能,并找出最适合可用数据的算法**。**

从高层次来看,交叉验证的过程是识别一个已知数据集,称为验证数据集,然后在该数据集上进行训练,接着使用第二个数据集(未知数据或首次出现的数据)进行测试(这被称为测试数据集)。这里的目标是尽量确保控制过拟合等问题(避免不包括信息影响结果),并且提供一些对模型如何概括实际问题或真实数据文件的理解。

准备数据

要执行交叉验证,数据科学家必须准备数据。这项工作将包括通过概况分析(我们在本章的前面部分提到过)来了解数据,以便将数据分为几个可比的子集。然后,确定其中一个子集为训练集并对其进行分析。接下来,一旦分析(或训练)完成,就会使用另一个子集(称为验证集测试集)来验证结果(或性能)。

为了减少变异性,使用不同的数据分区执行多轮交叉验证(也称为折叠回合),并在回合之间对验证结果进行平均。

通常,数据科学家会使用模型的稳定性来确定应该执行的交叉验证轮次:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/593151c3-a6b3-484c-8c15-7fc4568abd40.png

如前图所示,交叉验证方法可以通过将数据科学家将数据群体组织成两个子集来更好地理解:已知数据未知数据(你将在本章下一节看到如何实现这一点)。然后,数据科学家对数据进行分析并手动计算结果。一旦确定了预期的或正确的结果,就可以将其与统计模型生成的结果进行比较(使用那个独立的未知数据子集)。

上述是一次循环。将进行多次循环,比较结果后进行平均并复审,最终提供一个公平的模型预测性能估计。

让我们考虑一个实际应用场景。

在第六章《数据库改进的正则化》中,我们再次回顾了一些由咨询项目结果组成的示例数据。在这个例子中,我们探讨了项目总计费用、项目管理总小时数与项目预期盈利之间的关系。

回顾那份数据以说明一个观点,我们可以考虑不同的项目特征(而非变量):

  • 该项目是否在组织的核心技术强项范围内?

  • 是否有全职项目经理被分配到该项目?

  • 项目是否有全职客户资源分配?

  • 项目工作是否外包了?

  • 这个项目是时间和材料型的项目吗?

  • 项目是否属于不超支类型的项目?

  • 项目是否有正式的质量保证 (QA) 部分?

  • 工作是否主要在现场进行?

  • 工作是否主要是远程进行(来自客户现场)?

再次,我们的预测模型旨在预测一个有利可图的咨询项目具有什么特征。

以下是使用五轮交叉验证过程预测我们模型预期准确度的结果表示:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/2ae6f612-eabc-419b-81a9-2ecd551ca059.png

根据前面的图示,我认为我们的预测模型预计将非常准确!

总结来说,交叉验证结合了(平均)拟合度(预测误差)度量,以得出更准确的模型预测性能估计。这个方法通常在数据不足以进行测试而不损失显著建模或测试质量的情况下使用。

现在让我们进入本章的最后一节,来看一些使用 R 编程语言进行评估的示例。

R 和统计评估

那么,让我们开始一些统计评估工作吧!

正如我们在上一节中讨论的那样,交叉验证不是使用所有数据(整个观察集)来训练统计模型(然后使用其中一些数据进行测试),而是将数据分为训练集和测试集。

数据科学家在使用交叉验证评估统计模型性能时,首先需要做的步骤是将数据组织(或拆分)成两个独立的子集。

实际上,交叉验证有几种方法:

  • 留一法交叉验证 (LOOCV)

  • 保留法

  • k 折交叉验证和重复 k 折交叉验证

  • 重新代入(大多数人认为这是最简单的方法)

这些交叉验证方法都集中在如何拆分数据以进行训练、测试和验证。每种方法都有其优点(优缺点)。

编程问题总是有许多解决方法。以下是其中一种简单的方法。这个例子通过 70 对 30 的比例随机拆分总文件:

# --- setting seed so we get same data split each time
# --- we'll use 100 for seed
set.seed(100)
# --- determine the total number of rows in the data
# --- using nrow function
nall = nrow(MyData)
# --- number of rows for train subset is 70%
# --- of the total rowsntrain = floor(0.7 * nall)
# --- number of rows for test subset is 30%
# --- of the total rows
ntest = floor(0.3* nall)
index = seq(1:nall)
# --- create the train data subsettrainIndex = sample(index, ntrain)
testIndex = index[-train]
train = mydata[trainIndex,]
test = mydata[test,]

一旦我们创建了所需的文件,我们就可以继续训练并验证我们的统计模型。

正如我们在本书中时不时提到的,经过验证的做法是保存前面的代码,以便在新的数据集上反复使用。

需要问的问题

在本章的前几节中,我们讨论了交叉验证的各种方法或途径、交叉验证的轮次(实际上,我们展示了五轮交叉验证的结果),以及如何组织和拆分数据以便对统计模型进行交叉验证。

在继续进行交叉验证过程之前,需要考虑一些要点。(一个计划已被制定!)这带出了以下问题:

  1. 我应该使用哪种交叉验证方法?答案是最好的方法。然后又有一个新问题——“最好”是什么意思?每种方法都有其优缺点。最佳的交叉验证方法是最适合你的数据和目标的方法。通常,直到尝试了其他方法之后,你才会发现应该使用哪种方法。

  2. 应该执行多少轮或折叠?通常,越多越好!然而,这将由你选择使用的交叉验证方法、可用数据和时间的多少等因素决定。

  3. 创建每轮数据的方法是什么?这将由你选择使用的交叉验证方法、可用数据和时间的多少以及数据科学家的能力等因素决定!

学习曲线

评估统计模型性能的另一种方法是通过评估模型的学习增长或模型在更多经验(例如更多轮交叉验证)下改善学习的能力(获得更好的分数)。

术语随着额外经验在统计学中至关重要,因为我们不仅仅希望统计模型在给定数据集上表现良好,我们还希望随着模型在更多数据上进行训练和测试,其性能能不断改善。

表示模型性能、结果或分数的信息通常会与其他分数结合,显示为一条线或曲线——这就是统计模型的学习曲线。

这意味着学习曲线是学习增长(在纵轴上显示的分数)与实践(在横轴上显示的各个数据文件或轮次)之间的图形表示。

这也可以用以下方式来概念化:

  • 在一系列中重复相同的任务

  • 随时间积累的知识

学习曲线示例

举个例子,假设我们想要可视化一个统计模型在多轮表现结果中的学习增长速度,比较测试数据与训练数据在某一特征上的表现。

这在本章的前面部分已有展示:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/98aed56b-2606-4146-bcab-7d10d472c76e.png

以下是一个可视化,显示了使用前述交叉验证轮次的结果分数所表示的预测模型学习速度:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/907f4198-ee8b-41ba-84f3-5285859883d3.png

核心技术

以下是生成前述可视化的示例 R 代码:

# --- load scores from 5 rounds of testing
v <-c(90,80, 89,72, 90)
# -- plot the model scores round by round
plot(v, type = "o", col = "red", xlab = "Round", ylab = "Score", main = "Core Technology")

再次提到,学习曲线将统计模型的表现与经验联系起来,通常在进行模型评估时使用,尤其是在进行多轮测试(或分析工作,以确定用于统计模型的正确交叉验证方法)时。

到目前为止,仅仅进行测试轮次然后查看结果还不够。一个经验丰富的数据科学家会确保正确地记录每一次测试的迭代过程,以及相应的结果和结论。

再次查看前面的示例,我们可以添加对 R 函数png的使用,它可以用来自动创建并保存你在评估过程中创建的任何可视化的图像文件。如果你预先定义了一个文件结构来保存你的评估结果,并使用这种或类似的方法,它将为你节省大量的时间。

R 函数png可以轻松地转换为许多其他位图格式,并且它们都可以在现代的网页浏览器中显示!

以下是我们的示例 R 代码语句,展示了数据的设置、图像文件的创建以及绘图可视化的生成:

# --- load scores from 5 rounds of testing
v <-c(90,80, 89,72, 90)
# -- create an image file for the visualization for later use
png(file = "c:/provenpratice/learning curve.png", type = c("windows", "cairo", "cairo-png"))
# -- plot the model scores round by round
plot(v, type = "o", col = "red", xlab = "Round", ylab = "Score", main = "Learning Curve")
# -- close output
dev.off()

你需要注意的是,如果你期望得到交互式结果,你将不会收到!前面的代码使用了png,这只是将输出(来自plot函数的结果)写入那个文件。

好的实践建议:使用dev.off()确保文件已关闭。

这将创建以下图形文件:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/f093697c-ffb6-427c-b5ad-d907cda34f2d.png

总结

在本章中,我们定义了评估,并且考察了评估与统计评估之间的相似性和差异。接着,我们讨论了开发与评估之间的关系,并解释了数据评估与数据质量保证之间的部分重叠,二者是并行的,但目标不同。最后,我们应用了使用编程工具 R 进行统计评估的概念。

在下一章中,我们将定义神经网络模型,并借助开发人员对数据模型的理解来帮助理解神经网络在数据科学中的目的和应用。

第九章:数据库与神经网络

在本章中,我们将定义人工神经网络ANN),并结合数据开发人员对数据、数据库和数据模型的知识,帮助他们理解神经网络的目的和用途,以及为什么神经网络对数据科学和统计学如此重要。

我们已将本章内容整理为以下几个关键领域:

  • 神经网络的定义

  • 将神经网络模型与数据库模型联系起来

  • 查看基于 R 的神经网络

  • 用例

问问任何数据科学家

今天,如果你问任何数据科学家关于统计方法的问题(即便是几个问题),你很可能会发现如今在数据科学和统计行业中,最著名的两种统计方法就是用于预测建模的这两种方法。我们在第六章数据库发展到数据库回归中介绍了这两种方法。

这两种方法如下:

  • 线性回归

  • 逻辑回归

线性回归方法可能被认为是预测数值量时问题的经典或最常见的起点。线性回归(或LR)模型基于输入特征的线性组合。

逻辑回归方法使用对这种线性特征组合的非线性变换,以将输出的范围限制在区间[0, 1]内。这样,它预测输出属于两个类别之一的概率。因此,它是一个非常著名的分类技术。

记住,分类是根据训练数据集,识别新的或不同的观察结果属于哪一类别(或子人群)的过程。

这两种方法各有其独特的优势,但它们也有相同的缺点,即在面对大量输入特征的情况时,它们的预测效果并不好。

在本章中(作为线性回归和逻辑回归的替代方法),我们希望介绍人工神经网络(ANN)的概念,这实际上是一种非线性的方法,用于解决回归和分类问题。

当处理更高维的输入特征空间时(ANNs)具有显著更强的鲁棒性,并且在分类问题中,它们具有一种自然的方式来处理多于两个输出类别的问题。我们将在本章后面详细讨论 ANN 的优势。

人工神经网络是一种生物启发式统计方法或模型(基于生物神经网络的结构和功能),其根源可以追溯到 20 世纪 40 年代。

另一个有趣的观点:

神经网络是一种机器学习框架,试图模仿自然生物神经网络的学习模式。

  • Jose Portilla,Udemy 数据科学讲师。

自那时以来,人工神经网络的兴趣变化很大——主要是因为最早的人工神经网络模型非常初步,因此与当时的预期相比,实践中发现其局限性。

神经网络并不总是受欢迎,部分原因是它们计算上昂贵,且在某些情况下仍然如此;另外,部分原因是与更简单的方法如支持向量机SVMs)相比,它们似乎并没有带来更好的结果。然而,神经网络再次引起了关注并变得流行。

-Michy Alice, 2015 年 9 月。

此外,训练一个大型人工神经网络确实需要大量的计算资源。最近,由于分布式按需计算资源的普及,人工神经网络的兴趣重新激增,并且被称为深度学习的机器学习领域已经非常流行,且展现出巨大潜力。

时机恰到好处!

因此,现在是数据开发者开始学习 ANNs 模型的好时机。

深度学习(也称为深度结构学习层次学习深度机器学习)是一类使用多个非线性处理单元层级来进行特征提取和转换的机器学习算法 (en.wikipedia.org/wiki/Deep_learning)。

开始吧!

定义神经网络

我们的方法是始终从一个明确的定义开始。那么——什么是人工神经网络呢?或许是:

一个模拟人脑和神经系统的计算机系统。

一个常见的理解,或者如果我们在线查找定义的话:

在机器学习和认知科学中,人工神经网络(ANNs)是一类受生物神经网络启发的模型(尤其是动物的中央神经系统,特别是大脑),用于估计或近似那些可能依赖大量输入并且通常是未知的函数。

所以有许多不同的定义,但总体来说,你会发现所有关于 ANNs 的定义都围绕着一个共同的主题:它被定义为基于人脑工作原理的计算机数据模型。

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/12fda3d1-48fb-47aa-87ad-2d26010bf6b6.jpg

ANN 模型表示

正如前面的截图所示,典型的人工神经网络的构建基于以下几个要素:

  • 节点

  • 连接

节点

每一层由若干互相连接的节点组成——每个节点包含所谓的激活函数

输入层中将至少有一个节点用于每个数据中的预测变量。输入节点将输入值(待解决的问题)传递给(下一个)隐藏层中的每个节点。

每个节点的输入会被求和,得到一个单一的值,x。然后,这个值会被输入到节点的激活函数中,节点的输出就是其激活函数的输出,f(x)。

人工神经网络节点中可以使用多种函数,包括径向基函数或简单的线性函数,但最常见的是 Sigmoid 函数或逻辑函数。

Sigmoid 函数通常是最常见且也许最容易理解的。Sigmoid 函数是一个数学函数,具有特征的 S 形曲线或 Sigmoid 曲线。Sigmoid 函数的定义域为所有实数,返回值通常单调递增,从 0 到 1,或者根据约定,从-1 到 1。(en.wikipedia.org/wiki/Sigmoid_function

人工神经网络中的节点总是会产生或计算一个介于 0 和 1 之间的值,因此一个节点的输出只能在 0 到 1 之间。

是一个通用术语,用来定义在人工神经网络中按特定深度协同工作的节点集合。

隐含层将有一个可变数量的节点(由使用的训练算法决定)。每个节点将包含多个逻辑函数,用来处理输入并计算结果。最终结果将被传递到下一层。

层的总结如下:

  • 输入层:该层包含你的数据,每个变量对应一个节点。

  • 隐含层:每一层通过最小化误差/成本函数,尝试学习关于数据的不同方面。

  • 输出层:这是最简单的一层,通常由一个用于分类问题的输出组成。

训练

回忆上一节描述的人工神经网络节点,如果所有节点的工作方式相同,或者至少产生相同的结果(0 或 1),那么网络如何区分不同的类别呢?

它将权重分配给每个节点的输入。这是一个特征(或数据中的变量),其权重可以大也可以小,进而导致变量或特征对任何节点的的贡献有所不同。

实际上,一个变量可以被赋予一个较大的权重,传递到一个节点,而传递到另一个节点的权重几乎为零,这意味着该变量对第一个节点的影响很大,对第二个节点几乎没有影响。

Sigmoid 函数(我们在上一节也提到了)表明,当节点的x值跨越一个阈值时,节点的输出会从 0 变为 1。这可以通过多种方式发生,例如当一个高权重的输入具有较高的值,或者一组中等权重的输入具有较高的值时。

训练人工神经网络的过程是系统地发现最优权重值,以最大化分类的准确性。

解决方案

隐藏层中某个节点的输出值会与进行计算的节点的权重相乘,并加到其他节点的加权值中。这一求和结果成为人工神经网络模型的输出或解决方案。(需要注意的是,这个术语在数据科学家之间有所不同,有些人称之为输出,有些人称之为解决方案、结果,甚至是结果值)。

再次强调,问题被呈现给人工神经网络(通过模型的输入层),该网络会传递到一个或(更可能)多个隐藏层,实际的处理通过加权连接的系统完成。然后,隐藏层与输出层相连接,给出解决方案。

大多数人工神经网络模型包含某种形式的算法,决定模型如何学习。这个算法就是我们之前讨论的,通过它根据提交给模型的(输入)问题来调整节点连接的权重

这种调整节点权重(有些人称之为右调节)类似于基于经验(在这种情况下,经验可能是反复查看示例)来识别图像(或确定解决方案)的想法。

理解这些概念

要理解一个新概念,通常有助于将熟悉的内容与新知识进行对比。

为了更好地理解人工神经网络的概念,比较 ANNs 与传统数据库算法如何处理数据和信息(或它是如何工作的)将会是有帮助的。

在下一节中,我们将比较人工神经网络模型的概念与常见的数据或数据库模型。

神经网络模型和数据库模型

正如我们在本章前面部分所指出的那样,神经网络模型是一个处理节点系统,跨越不同层级互联,这些层级不会以顺序的方式处理数据。那么,这种结构与传统的数据库模型或程序有什么不同呢?

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/2370e20b-d11c-4195-a1c3-82bfa4fe1780.png

传统数据库模型表示

正如我们在本章前面部分所指出的那样,神经网络模型是一个处理节点系统,跨越不同层级互联,这些层级不会以顺序的方式处理数据。那么,这种结构与传统的数据库模型或程序有什么不同呢?

在技术行业中,传统的(数据库)模型有时被称为串行处理组件,这意味着这种类型的模型拥有一个中央处理单元或 CPU(或许你可以将其理解为一个大型的中央处理节点),用于访问存储在内存中的原始数据和指令。

在传统的数据库模型中,中央处理器对输入或选定的数据进行计算或逻辑处理(算法),存储计算结果(在指定的内存位置),然后继续执行下一个指令(和数据),依此类推——直到达到解决方案或结果。

这个概念有点类似于神经网络中单独处理的概念:

  • 一个节点接受或消耗数据

  • 一个节点应用逻辑

  • 一个节点输出它的结果

虽然相似,但请记住,传统数据库模型是串行的,因为它们按线性或一个接一个的方式执行每个任务(或指令),而人工神经网络模型中的多个节点流则并行执行任务。

因此,在一个串行系统中,计算步骤是确定性的、顺序的和逻辑的,并且可以从一个操作到另一个操作追踪给定变量的状态。相比之下,人工神经网络(ANNs)既不是顺序的,也不一定是确定性的。

还有其他一些关键的不同之处,包括以下在接下来的子部分中解释的概念。

没有单一或主要节点

不是一个复杂的中央处理器(或节点),而是许多简单的节点——它们通常只做一件事,即将它们从其他节点接收到的加权和进行计算。

不是串行的

人工神经网络并不按顺序或串行执行编程指令;它们并行响应(无论是模拟的还是实际的)提供给它们的输入。

没有内存地址来存储结果

在人工神经网络模型中,也没有单独的内存地址来存储数据。

相反,信息包含在模型的整体激活状态中。因此,知识由人工神经网络模型本身表示,它字面上是其各个组成部分的总和之外。

最后,对于数据开发者来说,人工神经网络的概念可以想象为启动并异步运行多个 SQL 查询。试想创建一个简单分支任务流的 SQL DTS数据转换服务)或SQL Server 集成服务SSIS)包,这样 DTS 将会在单独的spids服务器进程 ID)中启动任务。每个 spid 随后将与神经网络节点流的概念相对齐,所有节点并行工作以创建结果或解决方案。

一个非常好的神经网络工作原理的解释——通过一个数据开发者类型的实际例子——可以在线找到,作者是 Sunil Ray。

理解和从头编写神经网络的 Python 和 R 代码,在撰写本文时,可以在www.analyticsvidhya.com上找到,链接为:/blog/2017/05/neural-network-from-scratch-in-python-and-r

他提到以下引述:

“如果你曾经是开发人员,或者看过开发人员的工作,你会知道在代码中搜索 bug 是什么感觉。你会通过改变输入或环境来运行不同的测试用例,查看输出。输出的变化会给你一些提示,告诉你应该查找哪个模块,阅读哪些行。找到问题后,你会进行修改,然后继续这个过程,直到你有了正确的代码/应用。”

神经网络的工作方式非常相似。它接受多个输入,通过多个隐藏层的多个神经元处理数据,然后通过输出层返回结果。这个结果估算过程在技术上被称为前向传播

接下来,我们将结果与实际输出进行比较。任务是将神经网络的输出尽可能接近实际(期望的)输出。每个神经元都会对最终输出贡献一定的误差。如何减少这些误差?

我们试图最小化那些对误差贡献较大的神经元的值/权重,而这发生在神经网络反向传播过程中,找出误差所在的地方。这个过程被称为反向传播

好的,这确实有点多——但现在,幸运的话,我们已经对人工神经网络是什么以及它如何工作有了一个相对清晰的理解。接下来,让我们看看 ANN 和 R 编程语言的结合。

基于 R 的神经网络

现在我们已经了解了一些人工神经网络的工作原理,让我们回顾一些实现 ANN 的基本信息,特别是使用 R 编程语言时。

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/0798f4c1-d3a5-4031-966e-cb4336004936.png

基于 R 的 ANN 包

这里的目的是不是提供一个详细的步骤指南,告诉你如何创建一个复杂且强大的 ANN,而是展示如何通过 R 语言轻松创建一个 ANN 模型——实际上只需要基本的 R 技能或经验。

参考文献

是的,你会发现,互联网上有大量尊重且易于理解的、关于人工神经网络的有价值信息和示例,值得一读。

一个这样的资源由 Gekko Quant 提供,(gekkoquant.com/author/gekkoquant/),值得花时间查找并阅读。

这段信息提供了一个非常好的教程,展示了如何创建一个人工神经网络,该网络接受一个输入(你想计算平方根的数字)并输出一个结果(该数字的平方根)。

这个人工神经网络示例模型的输出以易于理解的格式展示,我将在这里展示它作为一个很好的示例,说明 ANN 模型的输出应如何呈现:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/1cb8d94b-329a-4072-b8b4-4d4c41afd8f4.jpg

人工神经网络的结果

从这里显示的输出信息可以看出(正如作者所声明的),神经网络在求平方根(每个输入数值)的任务中表现得相当不错。

在数据科学家开始拟合人工神经网络之前,必须完成一些节省时间的重要准备工作,我们将在接下来的几节中讨论这些内容。

需要明确的是,人工神经网络并不容易理解、训练和调优;因此,强烈建议先进行一些预处理。

数据准备和预处理

让我们从显而易见的开始——我们的数据!

数据科学家在使用 ANN 模型时经验越丰富,就越能理解正式审查和准备数据的重要性,在开始尝试训练或拟合模型之前,提前做好数据准备是至关重要的。

我们在第三章*,开发者的数据清理方法*中讨论了数据清理,因此到此为止,你应该对数据清理和净化的过程有一个较好的理解,在这里我们将重点关注一些更具体的与人工神经网络模型相关的数据准备工作。

数据科学家普遍认为,在训练人工神经网络之前,对数据进行归一化可能是一个好的做法。根据你的数据,如果不进行任何数据归一化,可能会导致不可用的结果,或者至少是非常困难的训练过程;大多数情况下,算法在达到最大迭代次数之前不会收敛——换句话说,它会用尽所有尝试!

根据行业经验,如果数据没有经过归一化,人工神经网络可能会在达到最大迭代次数之前难以收敛。

尽管有许多方法可以实现数据归一化,但最常用的一种是 R 语言内置的scale()函数,它可以轻松完成这一任务。

scale()函数是一个通用的 R 语言函数,其默认方法会为你居中和/或缩放(归一化)数值矩阵的列。

我喜欢使用简单的 R 代码语句来演示以下缩放示例,因为这可以明显看出scale()函数正确工作(是否如预期?),而且比手动缩放(即编写 R 代码语句来缩放值)要有效得多。

快速看一下:

Setting up the sample data, in the object named "x":
# --- set up the data
Set.seed(1)
X <- runif(7)
Next, here is the manual scaling approach, using mean and sd:
#---manual scale method
(x - mean(x)) /sd(x)
And then the use of the R scale function:
# --- scale using the function
Scale(x)

最后,这是输出,显示了手动缩放方法和缩放函数所产生的相同结果:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/6b7c3f65-d1bc-41a9-a137-a6da235050b3.png

太棒了!

数据拆分

我们预处理的下一步是拆分数据。我们在第八章,数据库开发与评估中详细讨论了数据拆分,所以在这里我们不会再重提这个话题。

然而,请记住,数据拆分的过程旨在从原始数据集或来源中创建训练子集和测试子集(基于适当的逻辑)。

例如,我们可以通过随机将数据拆分为训练集和测试集,接着拟合线性回归模型,并在测试数据集上进行测试(或者使用我们在上一章中使用的拆分方法,创建一个 70/30 的拆分)。

模型参数

没有最佳实践或推荐规则能够告诉数据科学家在人工神经网络模型中应该使用多少层和/或节点(尽管有几条或多或少被业界接受的规则)。

通常,如果需要的话,一个隐藏层对于大多数或大量的人工神经网络统计应用已经足够(尽管你可能注意到,我们在本章开始时的图形图像中展示了三个隐藏层)。

就节点数而言,节点数通常应介于输入层大小和输出层大小之间,通常是输入大小的 2/3。

归根结底——当数据科学家确定在其人工神经网络模型中应该有多少层和节点时,他们将不断测试、测试、再测试(一次又一次),以找到最佳或最优化的解决方案,以满足当前的需求,因为无法保证任何过去的经验或规则能最适合你的统计模型。

交叉验证

交叉验证是我们在第二章中介绍的一个重要话题,目标声明,我们再次提醒它是构建任何预测模型时的一个非常重要的步骤。

虽然有很多不同种类的交叉验证方法,但基本的思路是数据科学家重复以下过程若干次:

训练我,测试我,拆分我

  1. 进行训练-测试拆分。

  2. 将模型拟合到训练集。

  3. 在测试集上测试模型。

  4. 计算并回顾预测误差。

  5. 重复(n次)。

通过多次执行上述过程,数据科学家将能够计算出平均误差,并用其来评估统计模型的表现(性能是另一个重要话题,我们在第八章*,数据库开发与评估*中进行了讨论)。

用于 ANN 开发的 R 包

那么,数据科学家如何创建自己的人工神经网络ANN)呢?

R 编程语言(截至本文编写时)提供了多种创建不同类型人工神经网络的包。这些包目前包括以下内容。

ANN

本包提供了一个由遗传算法GA)优化的前馈人工神经网络。

ANN2

这提供了使用梯度下降训练一般的分类和回归神经网络。

NNET

Ripley 创建的 NNET 包提供了用于单层隐藏层前馈神经网络和多项式对数线性模型的方法。具体来说,本书的这一章节将介绍 NNET 方法。在这里,我们简要描述了所使用的方法和参数。

请注意,我是这样拆分数据的:以随机方式将 90%的数据作为训练集,10%作为测试集,重复 10 次。

我还使用plyr库初始化了一个进度条,因为我希望在神经网络的拟合过程中保持对状态的关注,毕竟这一过程可能会花费一些时间。

黑箱

人工神经网络(ANNs)非常难以理解(即使是对于最先进或经验丰富的数据科学家)。解释它们的结果(或输出)比解释简单模型(如线性模型)的结果要复杂得多。

有时,数据科学家对人工神经网络模型的理解仅停留在非常高层次。虽然仅有这样的理解水平也能保持生产力,但如果无法完全理解人工神经网络模型的内部工作原理,可能会导致一种情况,即所谓的BBU模型或黑箱理解模型或方法。

黑箱模型、方法或系统是指仅能从其输入和输出角度来看待,而无法了解其内部工作原理的模型、方法或系统。

因此,根据你需要的应用类型,你可能需要记住,在模型结果能够有用之前,你必须能够恰当地解释模型的结果(而不仅仅是运行模型并产生结果),因此需要投入时间去深入理解所使用的模型和方法。

一个使用案例

有人说过(很可能不是数据科学家!):

神经网络模型无法学习任何一个合理聪明的人,在相同数据上经过足够时间学习后无法学到的东西。

这一声明中的关键术语是“足够的时间”。数据科学家(以及人类通常)几乎从未拥有足够的时间——时间可能就是决定你所在组织能否超越竞争对手的关键。

支持使用人工神经网络(而非合理聪明的人类)的理由之一是,人工神经网络模型的一些额外优势如下:

  • 发现别人甚至从未想象过的东西

  • 在比一团队还短的时间内找到解决方案

  • 以更低的成本产生结果

  • 在经过训练的输入下,产生一致的结果,并且如果适当调整,应该能够很好地泛化

  • 神经网络永远不会感到厌倦或分心。

有了这些优势后,我们来看看人工神经网络模型的一些实际应用场景。

流行的应用案例

人工神经网络有许多应用。通过调查行业,最成熟的人工神经网络应用案例包括以下几种。

字符识别

神经网络可以用于识别手写字符,将手写内容实时转换为控制计算机,或用于自动车牌识别ANPR),自动读取车辆注册号牌。

图像压缩

神经网络能够一次性接收并处理巨量信息,这使它们在图像压缩中具有重要作用。随着大数据的爆炸式增长,应用人工神经网络(ANN)于数字图像,以降低存储或传输的成本,已成为一个日益增长的机会。

股票市场预测

股票市场的实时波动极为复杂,受到众多因素的影响。许多因素如最高价、最低价、开盘价、收盘价、交易量、其他证券的价格以及经济指标都会对其产生影响。由于神经网络能够快速分析大量信息,它们可以用于预测股价。

欺诈检测

近年来,新技术的发展也为犯罪分子实施欺诈提供了更多方式。神经网络可以通过从样本中学习可疑模式,识别近似的类别、聚类或可疑行为模式,并利用这些模式来进行欺诈检测。

神经科学

理论与计算神经科学是生物神经系统的理论分析与计算建模的研究领域。由于神经系统试图复制认知过程和行为,因此该领域与认知与行为建模密切相关。

总结

本章中,我们定义了神经网络,并从数据开发者对数据库和数据模型的知识出发,逐步理解了神经网络的目的和用途,以及神经网络为何对数据科学如此重要。我们还介绍了基于 R 的 ANN,并列出了几个流行的应用案例。

在下一章中,我们将介绍使用统计提升方法,更好地理解数据库中的数据。

第十章:提升你的数据库

本章中,我们将解释什么是统计提升,它如何运作,并介绍如何利用统计提升更好地理解数据库中的数据。

我们已经将本章的主题分解为以下重要领域以便更清晰:

  • 统计提升的定义与目的

  • 你可以从提升(帮助)你的数据库中学到什么

  • 使用 R 来说明提升方法

定义与目的

首先,我们可以考虑一个你可能在网上找到的常见定义:

提升是一种机器学习集成元算法,主要用于减少偏差,同时也减少监督学习中的方差,是一类将弱学习器转化为强学习器的机器学习算法。

-维基百科

en.wikipedia.org/wiki/Boosting_(machine_learning)

提醒:在统计学中,集成方法使用多个学习算法,目的是获得比任何基础学习算法更好的预测性能(尽管结果因数据和数据模型而异)。

在我们深入了解统计学提升的细节之前,首先必须花些时间理解偏差、方差、噪声,以及什么是弱学习器和强学习器。

接下来的章节将涵盖这些术语和相关概念。

偏差

让我们从讨论统计偏差开始。

如果统计量的计算方式使其在分析上与被估计的总体参数不相似,那么该统计量就存在偏差。

我遇到过的关于偏差的最佳解释是一个偏离零的小刻度的概念。在这种情况下,刻度会给出略微高估的结果。换句话说,当某人站上秤时,总体体重可能被高估或低估(这可能让那个人觉得他们的饮食比实际效果更好)。

在统计学中,数据科学家需要认识到,实际上有多个常用的类别来定义统计偏差。下一节将列出这些偏差类别并提供示例。

偏差的分类有些主观,因为某些类别可能会有重叠的情况。

偏差的分类

偏差有许多类别,包括以下具体示例:

  • 选择偏差:指的是某些个体观察值比其他观察值更可能被选中进行研究。

  • 谱偏差:当数据科学家在偏倚的样本上评估结果时,导致对测试的敏感性和特异性估计过高。

  • 估计器偏差:指的是估计器的期望值与被估计参数的真实值之间的差异。

  • 遗漏变量偏差:在回归分析中估计参数时,如果假设的模型忽略了某个自变量,就会出现这种偏差。

  • 检测偏差:当某个特征或事件在特定研究对象组中更容易被观察到时,就会发生这种偏差。

  • 抽样偏差:当由于抽样数据的错误而导致统计误差时,就会发生这种偏差。

  • 测量偏差:当测试内容、测试管理和/或评分程序存在系统性问题时,就会发生这种偏差。

  • 资金偏差:这种类型的偏差可能导致选择特定的结果、观察、测试样本或测试程序,这些都偏向于研究的资金赞助者。

  • 报告偏差:这种类型的偏差涉及数据可用性的偏差,这导致某种类型或集合的观察结果更有可能被报告为结果,或影响表现。

  • 分析偏差:这种偏差发生在用于评估某些观察结果或统计模型整体表现的方法或过程上。

  • 排除偏差:这种偏差类别可能由于某个过程或程序而产生,该过程或程序有可能系统性地排除某些样本或观察结果,导致统计研究中的样本或观察缺失。

  • 脱落偏差:当研究或统计项目中的参与者离开程序或过程时。换句话说,一个项目的某个组或类别可能会离开或被移除,并且不再被数据科学家考虑。

  • 回忆偏差:当研究参与者的准确性或完整性由于对过去事件或研究对象特征的错误记忆而不一致时。这会导致结果的高估或低估。

  • 观察者偏差:这种偏差发生在研究人员由于认知偏差无意识地影响数据时,判断可能会改变观察或研究的进行方式/结果的记录方式。

  • 混杂偏差:当影响研究中相同信息的因素使研究者或数据科学家感到误导或困惑时,就会发生这种偏差。

  • 负面偏差:当数据科学家倾向于对负面的特征、事件或结果赋予更多的权重或价值,仅仅因为它们是负面的时,就会发生这种情况。

  • 代表性偏差:当数据科学家根据群体中识别出的某些观察特征将某些事情视为理所当然时,就会发生这种偏差。

  • 近期偏差:这种偏差类别发生在数据科学家使用最近的经验和观察(或赋予更多的价值)来预测未来结果时。

而我最喜欢的其中一种类型是:

  • 数据窥探偏差:当数据科学家形成错误的意见或提出假设,并随后挖掘数据以特别支持该观点时,就会发生这种情况。

偏差的原因

偏差 是一个你会在统计学领域常常听到的术语,几乎总是与负面或不良事件相关。事实上,甚至在统计学的领域之外,偏差几乎总是导致麻烦或某种形式的困扰。

将偏差视为偏袒。举例来说,在数据收集过程中存在的偏袒通常会导致误导性结果或错误的假设。

偏差可以以各种方式出现,作为数据科学家,必须熟悉这些情况。事实上,偏差可以在任何时间或阶段进入统计项目。

引入偏差最常见的时机之一就是项目一开始的数据收集或选择时。这个时候是最糟糕的,因为几乎所有后续的工作和努力都会受到怀疑,或者很可能是错误的。

偏差数据收集

偏差的一个主要来源是数据的收集方式。坦率地说,经验不足的研究人员,或者有某种特定结果期望的研究人员,可能会使用低劣的数据收集方法或实践,甚至以一种强调某种特定倾向或导致预期结果的方式收集数据。

数据收集方法中需要注意的事项:

  • 带有特定倾向或强调的调查

  • 选择一个已知的、具有特定背景的群体来回答调查

  • 以误导性分类方式报告数据

  • 非随机的样本选择

  • 系统性测量误差

偏差样本选择

样本选择或抽样过程同样容易引入偏差。当样本不能准确代表总体时,就会出现样本偏差。由不具代表性的样本引发的偏差被称为选择偏差

可能导致在统计样本中引入偏差的问题包括:

  • 采样的时机

  • 样本的长度或大小

  • 问题的难度级别

  • 低覆盖率(对于总体)

  • 非回应错误地用于样本中

  • 自愿回应错误地用于样本中

  • 样本中被联系的方式(电话、邮件、上门等),或观察数据的划分方式

偏差说得够多了。让我们进入下一部分,讨论统计方差。

方差

在统计学理论中(en.wikipedia.org/wiki/Statistics),方差的概念定义如下:

随机变量与其均值的平方偏差的期望值(en.wikipedia.org/wiki/Expected_value),换句话说,它是衡量一组随机数相对于其平均值的分散程度。

方差分析的实践(或简称方差分析)涉及数据科学家评估两个数值之间的差异。通常,这一过程应用于财务或运营数据,试图识别并确定方差的原因。在应用统计学中,方差分析有不同的形式。

方差和方差分析是统计学领域中的一个重要话题,它在以下统计实践中发挥着关键作用:

你会发现方差分析有以下规律:

  • 每当需要进行数据的统计分析时,数据科学家很可能会首先进行方差分析。

  • 统计方差为数据科学家提供了一个衡量数据如何分布(围绕均值或预期值)的标准。

  • 与范围(仅看极端值)不同,方差会考虑所有数据点,并得出它们的分布结论。

方差分析(ANOVA)

作为数据科学家,当你谈论方差分析的过程或实践时,你实际上是在谈论ANOVA。ANOVA 可以理解为一系列方法,用于研究群体均值之间发现或潜在的差异(方差)及其相关过程。

方差分析(ANOVA)在统计学领域有三种不同的研究和应用方式。这些方式由数据科学家处理或感兴趣的独立变量的数量来决定和定义:

  • 单因素方差分析(只处理一个独立变量)

  • 双因素方差分析(使用或关注两个独立变量)

  • 多因素方差分析(当数据科学家感兴趣的不止两个独立变量时)

当数据科学家或研究人员进行 ANOVA 时,他们的目的是判断其群体内部是否存在统计学上显著的差异。如果他们发现存在差异,他们将继续确定这些群体差异的具体位置。

噪声

噪声,或者对数据科学家来说,统计噪声,是指在样本、群体或数据源中公认的无法解释的变化量或变异性。

噪声一词的实际应用可以追溯到早期的信号处理,当时它被用来指代那些被发现会降低信号和数据质量的、不希望出现的(电磁)能量。

对于数据或数据库开发人员来说,考虑这样一个例子:运行一个简单的数据库查询,来确定某个特定销售区域的业绩。如果你的 SQL 查询返回所有销售区域的销售数据,那么在这个练习的背景下,你可能会把其他的销售区域看作噪声,这些噪声使得销售信息变得无用(再说一次,是在试图关注某个特定销售区域的背景下)。当然,为了解决这个问题,你可以重新构造查询,以过滤掉不需要的区域,或者修改查询结果,以去除不需要区域的噪声。请记住,在统计学中,重建数据源可能不现实。

噪声数据

在统计学之外,人们常常使用“统计噪声”这一术语来抛开他们不感兴趣的数据。一个例子是职业足球队的体育场,球迷的欢呼声干扰了客队的沟通能力。噪声成了不便。

然而,在统计学中,当数据科学家意识到样本中存在噪声时,意味着任何来自统计抽样的结果,如果重复这个过程,可能无法再现。在这种情况下,样本可能变成噪声数据,并因为过多的变异而变得毫无意义。

揭示噪声与真实信号之间的关系,几乎一直是统计学中的一个重要议题(以便研究人员能够使用有意义的数据),然而,噪声数据中有意义的数据比例通常太小,以至于难以派上用场。

随着时间的推移,噪声数据这个术语也被用来指代任何机器无法读取的数据,例如非结构化文本,甚至是任何在某种程度上被修改,导致不再与创建它的程序兼容的数据。幸运的是,分析工具的进步正在稳步克服这些统计障碍(比如 IBM Watson 分析工具,当然还有许多其他工具)。

一些最常见的统计噪声示例包括高斯噪声、散射噪声和白噪声。好了,够了,我们不再谈论(统计)噪声了!

让我们继续讨论学习者。

弱学习者和强学习者

一个很好的过渡(回到)提升方法的主题,是统计算法或模型在时间推移中的预测能力的提升,也就是其性能的提高。

如果你正在阅读这本书,并且已经到达了这一章节的这一部分,那么假设你已经理解了与统计预测相关的机器学习概念。学习是指计算机或模型能够学习(如何根据数据做出预测),而不需要明确的编程指令。

我们使用术语显式地来表示基于数据值的硬编码选择。

如果你基于这一概念进一步思考,你可以理解,计算机或模型的目标是基于数据做出良好预测(正确猜测结果),其表现或结果会介于不正确(差)和正确(好)之间。

也可以说,计算机或模型或许能通过更多经验(更多数据)来提高其表现,并且能以某个速率改善学习。

因此,数据科学家会根据计算机或模型的表现(或其预测或猜测结果的能力)将其标记为弱学习器或强学习器。

在统计学和数据科学领域,人们也可以将学习器称为分类器或预测器。

那么,如何界定一个学习器是弱还是强呢?

弱学习器是指无论数据呈现何种形式(意味着模型训练数据中的值分布),在尝试标记数据时,总能比随机猜测表现得更好。

我们将做得比随机猜测好定义为始终具有小于一半的错误率。

从弱到强

比随机 猜测 好,基本上是弱学习器的唯一先决条件。因此,只要算法或模型能始终优于随机猜测,应用提升算法将能提高模型预测的准确性(其表现),从而将模型从弱学习器转变为强学习器。

请注意,数据科学家一致认为,将模型的预测能力或表现提高,即使只是略微优于随机猜测,也意味着成功。

当数据科学家考虑提升模型表现(或将弱学习器转变为强学习器)时,需要考虑许多因素。

这些因素包括模型偏差、处理时间和复杂性。让我们稍微解释一下每一个。

模型偏差

我们在本章的早期部分讨论了统计偏差。在统计模型中识别的偏差水平需要被考虑。通常,偏差越小越好,因为一些改善弱学习器的方法——例如提升(boosting)——可能会导致过拟合,从而产生误导性的结果。

训练和预测时间

无论如何,提升弱学习器表现的方法是否显著增加了模型学习、训练或在数据子集上预测的时间。通常,训练得越多,结果越好,因此如果你预期需要进行数百次训练迭代,你需要考虑如果改进使训练迭代增加 100%,这一过程或努力将需要多长时间。

复杂性

通常会假设弱学习者在设计上计算上比较简单(它是一个弱学习者,对吧?),但情况并不总是如此。在选择提升性能的方法之前,理解算法或模型的复杂程度对决策过程至关重要。

哪种方式?

数据科学家为了提升模型性能,将其从弱学习者转变为强学习者,最终选择哪种方式(方法)将取决于许多因素,但归根结底,所采取的方法依赖于具体问题。

AdaBoost(也称为自适应提升)是一个迭代算法,使用指定次数的迭代或回合来提升一个弱学习者。该算法从在数据上训练/测试一个弱学习者开始,为每个示例赋予相等的权重。那些被错误分类的示例,其权重将在下一轮(回合)中增加,而正确分类的示例则会减小其权重。

我们将在本章稍后了解 AdaBoost。

回到提升

到此为止,我们已经涵盖了与提升(boosting)最相关的所有话题,现在让我们回到重点,统计提升。

我们已经描述了统计提升是什么以及它的用途(即旨在减少偏差和方差,并将弱学习者转变为强学习者的学习算法)。

这个概念的关键在于学习者的行为方式,其中弱学习者被定义为与真实分类仅有轻微相关性的学习者(它比随机猜测更能正确标记示例)。相对地,强学习者则是与真实分类有良好相关性的学习者。

它是如何开始的

尝试通过提升算法来提高性能,实际上是一个假设问题。也就是说,这是每个数据科学家都应该问自己在其统计算法或模型中的问题。

这在统计学中被称为假设提升问题,核心是数据科学家寻找一种方法,即使是稍微改进学习过程(将弱学习者转变为更强的学习者)。

强学习者的概念仅仅意味着稍微改进的学习者——实际上,它仅比随机猜测略好。

在数据科学或统计学领域,假设提升问题也暗示着存在一个高效的算法,它能输出一个针对所解决问题的任意准确度的假设。这些(能够改善学习者的)算法迅速被称为提升

一如既往,数据科学家交替使用不同术语来表示相同的概念,提升也不例外,一些数据科学家会将提升称为重采样组合

AdaBoost

回到我们之前提到的一个名为AdaBoost的包,它是自适应增强(adaptive boosting)的缩写。AdaBoost 是一种增强方法,通常被称为集成学习算法。集成学习是指通过结合多个学习器来构建一个更强大的学习算法。

AdaBoost 的工作原理是选择一个基础算法,然后通过考虑训练数据集中的错误分类样本,迭代地改进它。

在线可以找到对增强和 AdaBoost 的精彩解释:通过 AdaBoost 实现更好的生活 bbacon.org/Better-Living-Through-AdaBoost

上述文章描述了 AdaBoost 的工作原理:

  • AdaBoost 在数据子集上训练一个模型

  • 弱学习器(基于性能)被加权

  • 这个过程会重复进行

从叙述的角度来看,AdaBoost 增强逻辑可以通过以下方式来解释:

  • 该过程通过在训练数据上构建模型,然后衡量结果在训练数据上的准确性,接着:

    • 在模型中那些错误的个体结果会被赋予更大的权重(或赋予更多的权重),而正确的结果则不会,然后模型会使用这些新的权重进行再训练。这个逻辑会重复多次,每次根据上一次迭代中是否正确分类来调整个体观察的权重!

AdaBoost 算法最初由FreundSchapire在 1997 年发表于《计算机与系统科学杂志》上的一篇论文中提出,论文标题为在线学习的决策理论推广及其在增强中的应用

你可以从增强(以帮助)你的数据库中学到什么

从数据库开发者的角度思考,你可能正在尝试构思增强的过程。正如我们在本书中所做的那样,在这里,我们将尝试使用一个面向数据库的示例来帮助我们理解增强:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/afc226d4-457b-4aeb-a77b-10357eac5485.png

我们的示例从一个关系数据库开始。在那里,有效的索引是提高数据库应用程序性能的最佳方式之一。如果没有有效的(强大的)索引,数据库引擎就像是一个读者,试图通过检查每一页来找到参考书中的某个短语。但如果读者使用参考书的索引,那么读者就能在更短的时间内完成任务(更好的性能 = 更好的结果)。

在数据库术语中,当没有可用的索引来提升数据库查询性能时,就会发生表扫描。在表扫描中,数据库引擎检查表中的每一行,以满足查询结果。

数据库开发者最重要的工作之一是找到生成执行计划时使用的最佳索引(针对查询)。大多数主要数据库都提供工具来显示查询的执行计划,并帮助优化和调优查询索引。

前述情况可以与在数据库中反复测试查询、评分每个查询结果的表现(即返回查询结果)直到确定一个高效(或强大的)索引进行比较。

这会改善数据库查询的性能,使其成为强大的响应者(或者,如果你愿意,可以说是强大的学习者)。

使用 R 语言展示提升方法

为了进一步说明提升方法的使用,我们应该有一个示例。

在本节中,我们将从Mastering Predictive Analytics with R, Second Edition, James D. Miller 和 Rui Miguel Forte,2017 年 8 月(www.packtpub.com/big-data-and-business-intelligence/mastering-predictive-analytics-r-second-edition)中引入一个发人深思的预测问题,做一个高层次的回顾。

在这个原始示例中,分析了望远镜相机上辐射形成的图案,试图预测某一特定图案是来自大气中泄漏的γ射线还是来自常规的背景辐射。

γ射线会留下具有独特椭圆形状的图案,因此我们可以创建一组特征来描述这些图案。使用的数据集是MAGIC Gamma Telescope Data Set,由UCI Machine Learning Repository 提供,网址为archive.ics.uci.edu/ml/datasets/MAGIC+Gamma+Telescope

该数据集包含 19,020 个观测值,具有以下属性列表:

列名类型定义
FLENGTH数值型椭圆的主轴(毫米)
FWIDTH数值型椭圆的次轴(毫米)
FSIZE数值型所有像素内容总和的十进对数
FCONC数值型两个最高像素之和与FSIZE的比率
FCONC1数值型最高像素与FSIZE的比率
FASYM数值型从最高像素到中心的距离,投影到主轴上(毫米)
FM3LONG数值型沿主轴的三次矩的三次根(毫米)
FM3TRANS数值型沿次轴的三次矩的三次根(毫米)
FALPHA数值型主轴与指向原点的向量之间的角度(度)
FDIST数值型从原点到椭圆中心的距离(毫米)
CLASS二元γ射线(g)或背景哈德龙辐射(b)

数据准备

首先,需要对我们的示例数据执行多个步骤。

数据首先加载到一个名为magic的 R 数据框对象中,并将CLASS输出变量重新编码,分别使用1-1表示伽马射线和背景辐射:

> magic <- read.csv("magic04.data", header = FALSE) 
> names(magic) <- c("FLENGTH", "FWIDTH", "FSIZE", "FCONC", "FCONC1", 
  "FASYM", "FM3LONG", "FM3TRANS", "FALPHA", "FDIST", "CLASS") 
> magic$CLASS <- as.factor(ifelse(magic$CLASS =='g', 1, -1)) 

接下来,将数据分成两个文件:训练数据和测试数据框,采用 80-20 的拆分方式:

> library(caret) 
> set.seed(33711209) 
> magic_sampling_vector <- createDataPartition(magic$CLASS,  
                             p = 0.80, list = FALSE) 
> magic_train <- magic[magic_sampling_vector, 1:10] 
> magic_train_output <- magic[magic_sampling_vector, 11] 
> magic_test <- magic[-magic_sampling_vector, 1:10] 
> magic_test_output <- magic[-magic_sampling_vector, 11] 

用于提升的模型是一个简单的多层感知机,具有一个单隐藏层,利用 R 的nnet包。

神经网络(在第九章,数据库与神经网络中讨论)通常在输入数据标准化时能产生更高的准确性,因此在本例中,在训练任何模型之前,首先执行此预处理:

> magic_pp <- preProcess(magic_train, method = c("center",  
                                                 "scale")) 
> magic_train_pp <- predict(magic_pp, magic_train) 
> magic_train_df_pp <- cbind(magic_train_pp,  
                             CLASS = magic_train_output) 
> magic_test_pp <- predict(magic_pp, magic_test) 

训练

提升(Boosting)旨在与弱学习者一起最佳工作,因此在模型的隐藏层中使用非常少量的隐藏神经元。

具体来说,我们将从最简单的多层感知机开始,使用一个隐藏神经元。为了理解提升的效果,通过训练一个单一的神经网络并测量其性能来建立基准性能。

这将完成以下任务:

> library(nnet) 
> n_model <- nnet(CLASS ~ ., data = magic_train_df_pp, size = 1) 
> n_test_predictions <- predict(n_model, magic_test_pp, 
                                type = "class") 
> (n_test_accuracy <- mean(n_test_predictions ==   
                           magic_test_output)) 
[1] 0.7948988 

这表明我们有一个大约 79.5%的基准准确率。还不错,但是否可以通过提升来改善这个得分呢?

为此,使用如下的AdaBoostNN()函数。该函数将接受数据框输入、输出变量的名称、要构建的单层隐藏神经网络模型数量,最后是这些神经网络将包含的隐藏单元数量。

然后,该函数将实现 AdaBoost 算法,并返回一个包含相应权重的模型列表。

这是该函数:

AdaBoostNN <- function(training_data, output_column, M,   
                       hidden_units) { 
  require("nnet") 
  models <- list() 
  alphas <- list() 
  n <- nrow(training_data) 
  model_formula <- as.formula(paste(output_column, '~ .', sep = '')) 
  w <- rep((1/n), n) 
  for (m in 1:M) { 
    model <- nnet(model_formula, data = training_data,  
                size = hidden_units, weights = w) 
    models[[m]] <- model 
    predictions <- as.numeric(predict(model,  
                    training_data[, -which(names(training_data) == 
                    output_column)], type = "class")) 
    errors <- predictions != training_data[, output_column] 
    error_rate <- sum(w * as.numeric(errors)) / sum(w) 
    alpha <- 0.5 * log((1 - error_rate) / error_rate) 
    alphas[[m]] <- alpha 
    temp_w <- mapply(function(x, y) if (y) { x * exp(alpha) }  
                    else { x * exp(-alpha)}, w, errors) 
    w <- temp_w / sum(temp_w) 
  } 
  return(list(models = models, alphas = unlist(alphas))) 
} 

上述函数使用以下逻辑:

  1. 首先,初始化空的模型和模型权重(alphas)列表。计算训练数据中的观测值数量,并将其存储在变量n中。然后,使用提供的输出列名称创建一个公式,描述将构建的神经网络。

  2. 在所使用的数据集中,该公式将是CLASS ~ .,意味着神经网络将计算CLASS作为所有其他列(输入特征)的函数。

  3. 接下来,初始化权重向量并定义一个循环,该循环将运行M次迭代,以构建M个模型。

  4. 在每次迭代中,第一步是使用当前的权重向量设置来训练神经网络,使用输入中指定的隐藏单元数量hidden_units

  5. 然后,使用predict()函数计算模型在训练数据上生成的预测向量。通过将这些预测与训练数据的输出列进行比较,计算当前模型在训练数据上的误差。这将允许计算误差率。

  6. 该错误率被设置为当前模型的权重,最后,观察权重将根据每个观察是否被正确分类,更新以便在下一次迭代中使用。

  7. 然后,权重向量将被归一化,接下来我们就可以开始下一次迭代了!

  8. 完成M次迭代后,输出模型列表及其对应的模型权重。

准备进行提升

现在有一个函数可以使用 AdaBoost 训练我们的集成分类器,但我们还需要一个函数来进行实际的预测。该函数将接受由我们训练函数AdaBoostNN()产生的输出列表,以及一个测试数据集。

该函数是AdaBoostNN.predict(),其表现如下所示:

AdaBoostNN.predict <- function(ada_model, test_data) { 
  models <- ada_model$models 
  alphas <- ada_model$alphas 
  prediction_matrix <- sapply(models, function (x)  
             as.numeric(predict(x, test_data, type = "class"))) 
  weighted_predictions <- t(apply(prediction_matrix, 1,  
             function(x) mapply(function(y, z) y * z, x, alphas))) 
  final_predictions <- apply(weighted_predictions, 1, 
              function(x) sign(sum(x))) 
  return(final_predictions) 
} 

该函数首先提取模型和模型权重(来自前一个函数产生的列表)。然后创建一个预测矩阵,其中每列对应于某个特定模型所做的预测向量。因此,这个矩阵的列数将等于我们用于提升的模型数量。

然后,我们将每个模型产生的预测与其对应的模型权重相乘。例如,第一个模型的每个预测值都位于预测矩阵的第一列,并将其值乘以第一个模型的权重α[1]

最后,通过对每个观察的加权预测求和,并取结果的符号,将加权观察矩阵减少为一个单一的观察向量。这个预测向量将由函数返回。

作为实验,我们将训练十个带有单个隐藏单元的神经网络模型,并观察提升是否提高了准确率:

> ada_model <- AdaBoostNN(magic_train_df_pp, 'CLASS', 10, 1) 
> predictions <- AdaBoostNN.predict(ada_model, magic_test_pp,  
                                    'CLASS') 
> mean(predictions == magic_test_output) 
 [1] 0.804365 

在这个例子中,提升十个模型仅显示了微小的准确率提高,但或许训练更多的模型可能会带来更大的变化。

正如我们在本章中多次提到的,即使是性能上的微小提升,也足以将一个弱学习器转化为强学习器!

示例结果

从上面的例子中,你可能得出结论,对于具有一个隐藏单元的神经网络,随着提升模型数量的增加,我们看到准确度有所提高,但在达到 100 个模型后,这种提升开始减缓,甚至在 200 个模型时稍微下降。与单一模型的基准相比,这些网络的提升是显著的。当我们通过添加一个包含三个隐藏神经元的隐藏层来增加学习器的复杂度时,性能的提升就变得非常小。在 200 个模型时,两个集成模型表现相似,这表明此时我们的准确度受限于训练的模型类型。

总结

在本章中,我们发现了统计提升,首先提供了与提升主题相关的统计学关键概念的解释,从而有助于定义提升算法本身。

我们还考虑了使用统计提升来更好地理解几乎每个数据库中的数据的概念。

在下一章中,我们将再次努力使用开发者术语,这次旨在定义支持向量机,识别其各种应用,并通过一个简单的 SVM 示例,演示如何使用支持向量机对数据库中的数据进行分类。

第十一章:使用支持向量机进行数据库分类

本章我们将探讨支持向量机SVMs),识别它们的各种应用,并通过一个使用简单 SVM 对数据库中的数据进行分类的示例来说明。

本章中,我们将再次将主题组织成以下几个主要领域:

  • 数据库分类

  • SVM 的定义和用途

  • 常见的支持向量机(SVM)应用

  • 使用 R 语言和支持向量机对数据库中的数据进行分类

让我们从一些关于通用数据分类的对话开始本章内容。

数据库分类

正如我们在本书中所提到的,如果读者是数据或数据库开发人员,或者有类似的背景,那么读者很可能听说过并且熟悉数据建模的过程。可以简单地将其描述为分析和理解某些数据的构成和细节的努力。然后,这些数据被组织或分类,目标是使其能够被用户社区轻松理解和使用,无论是已命名的(如组织中的财务分析师)还是匿名的(如互联网用户)。下图展示了根据需求进行的数据分类:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/023409d2-a36f-4311-9c03-3475dab957a6.png

匿名访问是最常见的系统访问控制方法,至少在网站方面是如此。

作为几乎任何数据建模开发项目的一部分,可能会要求创建类图。这个(类)图详细说明了如何将数据(或数据库)拆分为离散的对象,这些对象之间的关系,以及它们可能拥有的任何已知接口或连接。类图中的每个类既可以包含数据,也可以包含其用途。

因此,数据分类是将数据按照不同的类型、形式或任何其他不同类别进行排序和分类的过程。

数据分类使得根据数据的既定要求,将数据进行分离和归类,以满足多个业务或其他目标,从而可以制定数据计划或数据模型:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/09afdc24-eafc-4d77-9583-92b911a30e22.png

也许一个现实世界的例子,一个数据库或数据开发人员可能会认同或有一定了解的例子,是对财务账户进行分类或重新分类的工作,以便进行报告。

例如,在财务报告项目中(或者可能是在典型的会计期间结算时),你可能会发现一个典型的、反复进行的操作是对每个账户进行详细审查,并对正在使用的账户进行合并,以报告一个组织的财务结果或表现。

对会计部门而言,术语分类(或重新分类)通常用于定义将金额从一个总账GL)账户转移到另一个账户。例如,如果某项费用(例如税务准备)被错误地记入了市场营销用品账户而不是行政用品账户,那么更正分录可能是:

从市场营销用品账户重新分类到行政用品账户

在这里,从会计部门的角度来看,我们讨论的是一笔实际交易,即从一个 GL 账户中扣除金额并将该金额加到另一个账户。对于数据开发者而言,虽然没有进行账户交易,但可能会运行一个编程变更或流程,移除某个账户(或将多个账户合并)并转移到另一个账户。这通常被称为更新账务科目报告层级,或科目表COA)维护。

我们会发现这些相同的概念在统计学领域也适用吗?

在本章的以下部分,我们将回答这个问题。

统计学中的数据分类

一些数据科学家或统计学家将统计数据分类定义为:

将数据划分为有意义的类别以进行分析。

阅读此内容的数据库开发人员应该能够理解这一点:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/3b7038bc-2721-4550-9fef-3c0582632f47.png

在数据科学和统计学中,分类被定义为根据包含已验证类别成员的训练数据集,确定一个新的观察值应归入哪个类别(有时称为子群体)。

数据科学家通常会自动将统计公式应用于数据,允许在进行统计分析准备时处理大数据。

通常情况下,未组织或未分类的人群数据(通常称为原始数据),这些数据是在实际情况下收集并且无序排列的,并不会为数据科学家提供任何清晰的理解,只能得到基于不充分意见的直觉。

数据分类的过程试图在数据中找到相似性,并通过去除不必要的细节或噪音(我们在第十章中讨论过,提升你的数据库)来简化数据。分类有助于对不同数据集之间进行比较,清晰地显示一致与不一致的点。

数据分类还可以帮助确定数据使用的基准线。

分类使数据科学家能够研究多个特征之间的关系,并进行进一步的统计处理,如制表等。

一个非常好的统计数据分类受益的例子是年度人口普查,其中人口根据性别、年龄、婚姻状况等进行分类。

数据分类指南

指南(或政策)的目的是为执行某个任务建立框架。对于统计分类,存在许多不同的思维流派,关于最佳方法或最有效的方法。

在统计数据分类中,数据科学家将通过分配限制或边界来对数据进行分类。这些通常被称为类别限制。任何两个类别限制之间的组被称为类别类别区间

在你的统计学旅程中,你可能也遇到过术语决策边界。数据科学家经常使用不同或相似的术语来指代某个概念。在涉及两个类别的统计分类问题中,他们可能会使用决策 边界决策 来定义一个超平面(超平面是超平面概念的广义化),它将基础向量空间划分为两个集合,每个集合对应一个类别。分类器会将决策边界一侧的所有点归为一个类别,另一侧的所有点归为另一个类别。

常见指南

分类的指南通常会遵循以下内容:

  • 对类别的定义应该毫无疑问

  • 所有类别最好具有相同的宽度或长度

  • 类别的限制应当选择使得原始数据中的任何项都不与限制值重合

  • 类别的数量最好在 10 到 20 之间,即既不太大也不太小

  • 类别应该是详尽无遗的,也就是说,每个原始数据的值都应该包含在其中。

  • 类别应当是互斥且不重叠的,也就是说,原始数据中的每一项应该只适合一个类别

  • 分类必须适用于研究对象

  • 分类应该是灵活的,每个类别中包含的项目必须保持一致

  • 类别区间的宽度由首先固定类别区间的数量,然后将总范围除以该数量来决定

指南适用于数据科学家用于分类的任何指导方针或政策。这些指导方针或政策必须适用于统计项目开始到完成期间所有被观察到的数据。

定义

数据科学家必须了解的几个关键术语,因为这些术语可能会影响分类方法的选择,分别是:

  • 机密数据通常指的是任何被分类为受限的数据,且常与敏感数据互换使用

  • 数据管理员通常是一个高级资源,负责监督一个或多个数据集的生命周期,以便进行分类

  • 超平面子空间;一个 n 维欧几里得空间是平坦的,n 到该空间的一维子集将空间分为两个不相连的部分

  • 特征选择是选择用于构建统计模型的相关特征(变量、预测因子)子集的行为。

  • 特征空间简单来说是指用于描述数据的特征集合。

  • 统计分类是识别新观察值应属于哪一类类别(子群体)的问题。

  • 软边界分类是一种分类方法,其中数据科学家允许在定义或创建分类器时出现一些错误。

  • 机构数据被定义为由大学维护或许可的所有数据。

  • 边界分类器是一种能够为数据中的每个示例提供决策边界的伴随距离的分类器。

  • 非公开信息是根据指南、政策或法律规定的私密或受限信息。

  • 敏感数据通常指被归类为受限的数据,并且常常与机密数据交替使用。

  • 属性描述符;有时分类系统会使用描述符来传达给定分类的原因;例如,中年或城市化是常见的描述符。

  • 互操作性;当不同的应用程序使用不同的描述符,并且对哪些属性是必需的,哪些是可选的有不同的规则时(对于特定分类),这如何支持互操作性?

读者应该花时间研究与统计数据分类相关的许多术语——在统计学领域中,还有许多其他数据定义的术语。

SVM 的定义和目的

我支持支持向量机,你呢?

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/fa53bba4-b572-4d3c-b670-fc639011578c.png

在机器学习领域,SVM 也被称为支持向量网络,并被定义为有监督学习模型,伴随的学习算法分析用于分类的数据。

关于 SVM 的一个重要说明是,它们完全是关于成功执行模式识别的能力。换句话说,SVM 促进了在数据中扩展找到的模式的能力,这些模式是:

通过对原始数据进行变换来映射到新空间时,不能线性分离。

再次强调,你所了解的所有关于 SVM 的内容都会与 SVM 是一个有监督的机器学习算法这一观念相符合,这种算法最常用于统计学中的分类或回归问题。

这个技巧

你今天会听到大多数数据科学家提到技巧或 SVM 技巧;他们指的就是支持向量机算法使用一种称为核心技巧的方法。

核心技巧通过对数据进行变换,然后基于这些变换来发现可能输出或数据点之间的最优边界(记住,我们在本章前面定义了分类边界)。

在统计学中,核方法是一种用于模式分析的算法。执行模式分析的总体任务是找到并研究数据中普遍的关系类型。

基本上,SVM 执行的变换是一些极其复杂的数据变换(对你的数据进行处理),然后通过这些变换有效地找出如何根据数据科学家事先定义的标签或输出(有时被认为是数据科学家定义的特征)来分离数据。

另一个需要注意的重要(并且引人深思)点是,数据科学家在 SVM 执行变换时,并不需要担心保持数据的原始维度。

因此,核技巧将原始数据和一些事先定义的特征进行处理,执行其变换,并生成你可能无法识别的输出——有点像揭开一个巨大的迷宫!

以下内容摘自 www.yaksis.com/posts/why-use-svm.html为什么使用 SVM?

“你从这一个看似无害的数据向量开始,经过核技巧处理后,它被展开并且自我组合,直到它变成一个更大的数据集,单纯从电子表格中是无法理解的。”

“但魔法在这里,随着数据集的扩展,你的类别之间现在有了更明显的边界,SVM 算法能够计算出一个更加优化的超平面。”

特征空间和低成本计算

理解 SVM 如何工作的一个重要部分,就是理解我们刚才提到的技巧。这个技巧,正如我们所说,使用核方法(即使用核函数),并且能够在高维特征空间中表现良好。

特征空间是一个 n 维空间,其中包含你的数据变量。核函数能够在这个高维空间内操作,而无需计算数据在该空间中的坐标,而只需计算特征空间中所有数据对的图像之间的内积。

这个核技巧可以比显式计算坐标更快、更高效地处理数据。这被称为计算开销小

对于数据或数据库开发者来说,由于数据库视图可以隐藏复杂性;可以想象将数据库中的数据划分为多个编译视图(而不是对所有数据作为单一源运行查询)这一概念,类似于支持向量机(SVM)如何定义和使用向量。

画出分割线

描述支持向量机在分类数据时所执行的功能性(或实际)步骤的一种好方法是,想象 SVM 不断努力寻找 最佳分割线 ,以最优地分离两类数据点:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/f38c6c4b-15de-4689-8086-94d71ee47297.png

在这里,最佳的线是指通过最大化两个分类之间的边界来定义的直线。位于此边界上的点即为支持向量。

认识到这些(支持)向量的好处在于,我们可以将寻找最大边界超平面(即最能分离两个类别的直线)的问题,表述为一个优化问题,该问题仅考虑 SVM 所确定的支持向量。

这意味着 SVM 处理可以忽略绝大多数数据,从而使得分类过程更加高效。

更重要的是,通过将问题呈现为支持向量(即所谓的对偶形式),我们可以利用本章之前定义的核技巧,将支持向量机有效地转化为一个非线性分类器。

线性方法只能解决线性可分的问题(通常通过超平面)。非线性方法的特点是对输入数据集进行某种类型的转换。

不仅仅是分类

另一个关键点是,除了分类,SVM 还可以进行回归。

使用非线性核算法的 SVM 意味着算法计算出的边界不必是直线;这意味着 SVM 可以捕捉到数据点之间更为复杂的关系,而无需数据科学家手动进行那些复杂的转换。

缺点

那么,我们能否找到使用支持向量机的缺点或不足之处?

是的,有时候 SVM 所需的训练时间要长得多,而且计算开销也要大得多(我们在本章之前提到过计算成本的问题)。

参考资源

一本非常易懂的关于 SVM 的书籍是 NelloChristiani 和 John Shawe-Taylor 的An Introduction to Support Vector Machines and Other Kernel-based Learning Methods

另一个值得参考的资料是《Neural Networks and Learning Machines》一书,作者为 Simon Haykin,书中提供了对支持向量机(SVM)与一种称为径向基函数网络的神经网络类型之间的深入关联的解析,我们也在第五章《神经网络》中引用了这本书。

预测信用评分

在本章的剩余部分,我们将尝试像数据开发者一样,通过 R 语言回顾一个 SVM 示例。

这个示例可以在线访问,并在《Mastering Predictive Analytics with R, Second Edition》一书的第六章中详细引用。

www.packtpub.com/big-data-and-business-intelligence/mastering-predictive-analytics-r-second-edition

如果你是数据开发者,可能不知道以下网站提供了非常好的测试数据集资源:archive.ics.uci.edu/ml/index.php

本示例使用的特定数据集是Statlog(德国信用数据)数据集,可以在以下网址找到:archive.ics.uci.edu/ml/datasets/statlog+(german+credit+data)

网站如下所示:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/f0490a06-ef25-46ae-a400-f3e6b0273e80.png

该数据集来自银行和金融领域。数据集中的观察是个人在银行申请的贷款。

该数据的目标是确定贷款申请是否构成高信用风险。

数据或数据库开发人员很可能会注意到,与其下载一个数据集,不如创建查询来提取数据作为记录或交易,而不是实例(或观察)。

如果从数据库中提取这些数据,最有可能的情况是,提取不会像仅查询一个表那样简单,因为贷款申请可能以交易的形式存在,需要从多个数据库表中提取数据点。

数据开发人员应考虑的其他事项包括:

  • 数据集特征——字段名称

  • 属性特征——数据类型

  • 捐赠日期——最后更新或添加日期

网站 https://archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/提供了两个关键文件:一个是实际数据,另一个是数据模式:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/3adc97ec-25ef-4939-b926-1ed0f78b8e23.png

数据模式是 MS Word 文档格式(german.doc),用于创建以下矩阵:

列名类型定义
支票账户分类现有支票账户的状态
持续时间数值型以月为单位的贷款期限
信用历史分类申请人的信用历史
目的分类贷款的目的
信用数值型信用金额
储蓄分类储蓄账户/债券
就业分类目前就业自
分期利率数值型分期利率(占可支配收入的百分比)
个人分类个人状况和性别
债务人分类其他债务人/担保人
现居住地数值型目前居住地自
财产分类财产类型
年龄数值型申请人年龄(以年为单位)
其他计划分类其他分期付款计划
住房分类申请人的住房状况
现有银行信贷数值型在此银行的现有信贷数量
职业分类申请人的工作状况
赡养人数值型赡养人数量
电话分类申请人电话状态
外国人分类外籍工人
风险二进制信用风险(1 = 良好,2 = 差)

原始数据如下所示:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/a98b7f80-e769-4c5c-bb55-7cdf69dfa935.png

使用 R 和 SVM 在数据库中分类数据

现在我们已经理解了数据,接下来可以继续进行这个特定的统计学示例。

首先,数据科学家需要将数据加载到 R 的数据框对象中。这个示例中将其命名为 german_raw.

# --- load the data 
german_raw<- read.table("german.data", quote = "\"") 

下一步是提供与我们数据模式表格匹配的列名,如前所示:

names(german_raw) <- c("checking", "duration", "creditHistory", 
 "purpose", "credit", "savings", "employment", "installmentRate", 
 "personal", "debtors", "presentResidence", "property", "age", 
 "otherPlans", "housing", "existingBankCredits", "job", 
 "dependents", "telephone", "foreign", "risk") 

从数据模式(描述数据特征的表格)中可以注意到,我们有许多分类特征需要处理。因此,数据科学家可以使用 R 的 dummyVars() 函数(用于创建一整套虚拟变量)来创建用于分析的虚拟二元变量。此外,他或她还会将输出变量 risk 记录为一个因子变量,使用以下方式:

  • level 0 = 良好信用

  • level 1 = 不良信用

library(caret) 
dummies <- dummyVars(risk ~ ., data = german_raw) 
german<- data.frame(predict(dummies, newdata = german_raw),  
                       risk = factor((german_raw$risk - 1))) 
dim(german) 
[1] 1000   62 

经过之前的工作后,结果将得到一个包含 61 个特征的 R 数据框对象(因为一些分类输入特征具有多个级别)。

接下来,数据科学家会将数据分成两个子集:

  • 训练数据集

  • 测试数据集

这种数据划分可以通过以下 R 语句实现:

set.seed(977) 
german_sampling_vector<- createDataPartition(german$risk,  
                                      p = 0.80, list = FALSE) 
german_train<- german[german_sampling_vector,] 
german_test<- german[-german_sampling_vector,] 

对于数据开发人员,采取类似的方法,如可能使用 from 子句中的 TABLESAMPLE 选项。使用 TAMPLESAMPLE 选项,你可以从表中获取数据的样本集,而无需读取整个表或为每一行数据分配临时随机值。

继续

在(之前提到的)网站上提到,这个数据集的一个特殊性是,数据来自于一个场景,在这个场景中,定义的两种错误类型具有不同的相关成本。

具体而言,将高风险客户误判为低风险客户的成本是银行将低风险客户误判为高风险客户的五倍。这是可以理解的,因为在第一种情况下,银行可能会因无法偿还的贷款而损失大量资金,而在第二种情况下,银行错失了一个可以带来利息收入的贷款机会。

这是一个实际的例子,其中预测分析直接影响了组织的盈利。

svm() R 函数具有一个 class.weights 参数,之后该参数用于指定误分类(每个类别的观察值)成本。这就是数据科学家如何将不对称的错误成本信息纳入模型。

首先,创建一个类别权重向量,并注意需要指定与输出因子水平对应的名称。

然后,数据科学家使用 R 的 tune() 函数训练多个具有径向核函数的 SVM 模型:

class_weights<- c(1, 5) 
names(class_weights) <- c("0", "1") 
class_weights 
0 1  
1 5 

set.seed(2423) 
german_radial_tune<- tune(svm,risk ~ ., data = german_train,  
  kernel = "radial", ranges = list(cost = c(0.01, 0.1, 1, 10, 100),  
  gamma = c(0.01, 0.05, 0.1, 0.5, 1)), class.weights = class_weights) 
german_radial_tune$best.parameters 
   cost gamma 
9  10  0.05 

german_radial_tune$best.performance 
[1] 0.26 

这里推荐的最佳模型成本为 10,gamma 为 0.05,并且训练准确率达到 74%。

接下来,我们查看模型在测试数据集上的表现:

german_model<- german_radial_tune$best.model 
test_predictions<- predict(german_model, german_test[,1:61]) 
 mean(test_predictions == german_test[,62]) 
[1] 0.735 

table(predicted = test_predictions, actual = german_test[,62]) 
         actual 
predicted   0   1 
        0 134  47 
        1   6  13 

测试集上的表现为 73.5%,与模型训练时的结果非常接近。如预期所示,该模型倾向于产生更多错误,将低风险客户误分类为高风险客户。

不出所料,这对整体分类准确度造成了影响,准确度仅仅计算正确分类的观察结果与总观察结果的比例。事实上,如果我们去除这种成本不平衡,我们实际上会为模型选择一组不同的参数,从无偏分类准确度的角度来看,性能会更好:

set.seed(2423) 
german_radial_tune_unbiased<- tune(svm,risk ~ .,  
  data = german_train, kernel = "radial", ranges = list(  
cost = c(0.01, 0.1, 1, 10, 100), gamma = c(0.01, 0.05, 0.1, 0.5, 1))) 
german_radial_tune_unbiased$best.parameters 
  cost gamma 
3    1  0.01 
german_radial_tune_unbiased$best.performance 
[1] 0.23875 

当然,最后这个模型会倾向于将更多高风险客户误分类为低风险客户,而这种错误分类是非常不希望发生的。我们将在本节结束时提出两个最后的想法。首先,我们为gammacost参数使用了相对较小的范围。

最初,当这个示例呈现时,它被作为“留给读者的练习”,让读者使用更广泛的数值范围重新运行分析,以查看我们是否能获得更好的性能,这很可能会导致更长的训练时间。

其次,那个特定数据集相当具有挑战性,因为它的基准准确度实际上是 70%。这是因为数据中有 70%的客户是低风险客户(两个输出类别是不平衡的)。

呼!

总结

在本章中,我们通过一些数据开发者可能熟悉的示例定义了数据库和数据分类的概念。接下来,我们介绍了统计数据分类,并将这一概念与前者进行了比较。

提供了分类指南以及几个重要的相关术语。

最后,我们讨论了支持向量机、它们的工作原理以及它们为数据科学家提供的优势。

在下一章中,我们旨在解释机器学习的类型,并向开发者展示如何利用机器学习过程来理解数据库映射并识别数据中的模式。

第十二章:数据库结构与机器学习

在本章的最后,我们将专注于机器学习的概念和类型。

根据本书的总体主题,我们将首先解释统计机器学习及相关概念,然后将继续分析统计机器学习与具有数据或数据库开发背景的读者可能相关的基本概念之间的一些相似之处。

本章分为以下几个部分:

  • 数据结构就是数据模型吗?

  • 机器学习概念概述

  • 机器学习的类型

  • 数据开发人员与机器学习

  • 使用 R 将机器学习技术应用于数据库

数据结构与数据模型

当你拥有大量数据,却不知道该如何处理时,结构化数据、分析数据并将其有效利用是非常重要的(无论在何处需要)。在这一部分,我们将重点讲解数据结构和数据模型,并理解它们之间的差异。

数据结构

数据开发人员会同意,每当处理大量数据时,数据的组织结构至关重要。如果数据没有有效地组织,将很难对其进行任何操作,或者至少无法高效地完成任务。如果数据得到有效组织,那么几乎任何操作都可以轻松地在数据上执行。

数据或数据库开发人员会将数据组织成所谓的数据结构。下面的图像展示了一个简单的二叉树,在这种结构中数据得到了高效的组织:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/84c90422-84f3-4170-97ad-7878723da117.png

数据结构可以定义为一种更高效地组织大量数据的方法,以便对数据执行的任何操作变得容易。

数据结构的创建方式是为了实现一个或多个特定的抽象数据类型ADT),而这些抽象数据类型将规定可以对数据结构执行哪些操作,以及这些操作的计算复杂度。

在统计学领域,ADT 是数据类型的模型,其中数据类型是通过用户视角POV)定义的,明确显示该数据类型的可能值、对这种类型数据可以进行的操作以及所有操作的行为。

数据库设计是使用已定义的数据结构来生成详细数据模型的过程,最终形成数据库。这个数据模型必须包含所有所需的逻辑和物理设计选择,以及生成数据定义语言DDL)设计所需的物理存储参数,从而可以用来创建实际的数据库。

数据模型有不同的层次,例如,一个完全属性化的数据模型还会包含模型中每个实体的详细属性。

那么,数据结构就是数据模型吗?

不,数据结构是用来创建数据模型的。那么,这个数据模型是否与统计学中使用的数据模型相同呢?让我们在接下来的部分看看。

数据模型

你会发现统计数据模型是统计分析的核心。

简单来说,统计数据模型定义如下:

我们希望理解并推理的状态、过程或系统的表示

在前述定义的范围内,数据或数据库开发人员可能会同意,在理论上或概念上,可以使用相同的术语来定义财务报表数据库,因为它被设计用来包含商业交易,并且以数据结构的形式组织,使得商业分析师能够高效地审查数据,从而理解或推理他们可能对商业有特定兴趣的方面。

数据科学家开发统计数据模型,以便从中得出推论,更重要的是,做出关于关注话题的预测。数据开发人员开发数据库,以便同样从中得出推论,更重要的是,做出关于关注话题的预测(尽管在某些组织中,数据库可能更关注过去和当前的事件(交易),而非前瞻性的预测)。

统计数据模型有多种不同的格式和类型(数据库也是如此)。这些模型可以是将我们可以观察或测量的数量联系起来的方程式;它们也可以是简单的规则集合。

数据库可以设计或格式化,以简化在线交易的输入——例如,在订单输入系统中,或用于财务报表,当会计部门必须为股东生成资产负债表、利润表或损益表时。

我找到了一个简单的统计数据模型的例子:牛顿第二定律,它指出,作用在物体上的合力会使物体朝着力的方向加速,且加速的速率与合力的大小成正比,与物体的质量成反比。

有什么区别?

读者在哪里或如何能找到数据结构或数据库与统计模型之间的区别呢?从高层次来看,正如我们在前述部分推测的那样,可以得出结论:数据结构/数据库实际上与统计数据模型是相同的,如下图所示:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/ded56d04-54ef-402e-8032-04baa4e5974c.png

从高层次来看,正如我们在前述部分推测的那样,可以得出结论:数据结构/数据库实际上与统计数据模型是相同的。

当我们深入探讨这个话题时,应该考虑以下关键点:

  • 尽管数据结构/数据库和统计模型都可以被认为代表一组假设,但统计模型通常会更加聚焦于一组关于生成某些样本数据的假设,及类似数据从更大群体中产生的假设,而数据结构/数据库通常会更加广泛。

  • 统计模型通常处于一种理想化的形式,而数据结构/数据库则可能在追求特定假设的过程中显得不那么完美

  • 数据结构/数据库和统计模型都是围绕变量之间的关系构建的

  • 数据结构/数据库的关系可能专注于回答某些问题,例如:

    • 特定客户的总订单量是多少?

    • 某个客户从某个销售员那里购买的总订单量是多少?

    • 哪个客户下单最多?

  • 统计模型的关系通常非常简单,且专注于证明特定问题:

    • 女性比男性矮一个固定的高度

    • 体重与身高成正比

  • 任何给定的人参与某项运动的概率是年龄、性别和社会经济地位的函数

  • 数据结构/数据库完全是基于变量之间关系对数据进行总结的过程

关系

统计模型中变量之间的关系可能比简单的直观认识和理解要复杂得多。一个例子是效应统计的概念。效应统计是显示或展示某个值的差异,而这个差异与一个或多个其他变量的差异相关联。

你能想象出你会使用什么 SQL 查询语句来基于一个或多个效应统计量建立两个数据库变量之间的关系吗?

在这一点上,你可能会发现,数据结构/数据库通常旨在表征变量之间的关系,而在统计模型中,数据科学家则试图通过拟合模型来证明某个观点或对模型中的群体做出陈述。也就是说,数据科学家努力对描述模型的效应统计量的估计准确性做出声明!

另一个值得注意的点是,数据结构/数据库和统计模型都可以看作是旨在对一个群体进行概括的工具或载体;数据库使用 SQL 来聚合或总结数据,而统计模型则使用效应统计来总结其数据。

好的,希望我们已经成功地表达了这样一个观点:数据结构/数据库和统计数据模型在许多方面是非常相似的。

现在,让我们继续讨论机器学习。

机器学习

统计机器学习有很多深奥的定义,但让我们从最简单或最基本的版本开始:

机器学习是旨在教计算机根据某些数据流或数据源做出现实预测(或改进预测)的过程。

读者应该注意到,数据源明确依赖于数据科学家正在解决(或尝试解决)的具体问题。例如,Netflix 这一订阅娱乐服务不会使用患者的牙科记录数据作为输入来预测订阅者的观看行为!

可以提供一个稍微深入的解释:

机器学习是计算机科学的一个子领域,起源于人工智能中的模式识别和计算学习理论的研究。1959 年,Arthur Samuel 将机器学习定义为“让计算机在没有明确编程的情况下学习的研究领域。”

; -scratch.mit.edu/studios/3475398/activity

在机器学习中,数据科学家将花费时间探索、研究并构建他们可以从中学习并对数据源做出预测的过程。

这些机器学习过程或算法实际工作的方式是通过使用示例数据源输入构建统计模型。这不同于典型的计算机算法(即传统的计算机编程),后者通过遵循一组由开发团队编写的静态程序指令来工作。

你会发现在设计和编程明确程序指令不可行的地方,机器学习被广泛应用,例如图像识别和计算机视觉等应用。

在本章的后续部分,我们将花些时间列举更多今天机器学习应用的例子。

机器学习概念概述

在本章的前一部分,我们提到了传统编程的概念。使用传统编程时,数据和程序在计算机上运行以产生所需的输出。而在机器学习中,数据和输出在计算机上运行以创建一个程序。然后,这个程序可以在传统编程中使用。

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/b7f0e20c-5ef8-4920-99e6-76d8a2e7271d.png

一个稍为流行的、可能有趣的类比来描述机器学习是农业

在这里,人们可能会把机器学习算法看作是种子,数据源看作是肥料,数据科学家则是农民,他们种植和滋养这些种子,最终收获成果!

机器学习的关键元素

当前数据科学家使用了大量的机器学习算法。实际上,一些研究表明,可能有成千上万种。此外,每年都有数百种新的算法被提出用于实践。

根据大众观点,今天所有的机器学习算法都由三个组成部分构成。它们如下:

  • 表征

  • 评估

  • 优化

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/197e5f06-e6f6-46e0-b715-ae49ad16ac4a.png

表示

这就是信息的表示方式。示例包括决策树、规则集合、实例、图形模型、神经网络、支持向量机、模型集成等。

评估

这就是候选程序(假设)将如何评估。示例包括准确率、预测和召回率、平方误差、似然性、后验概率、成本、边际、熵、Kullback-Leibler(KL 散度)等。

优化

这就是候选程序生成的方式,也叫做搜索过程,例如组合优化、凸优化和约束优化。

机器学习的类型

今天,机器学习有四种类型或类别。

这些类型如下:

  • 监督学习

  • 无监督学习

  • 半监督学习

  • 强化学习

理解每种学习类型非常重要。

监督学习

这种类型的学习也被称为归纳学习。此时,训练数据将包括期望的输出;算法从标记或分类的训练数据中推断。训练数据是一组训练示例。

无监督学习

与监督学习不同,在这里,训练数据不包括期望的输出。这是机器学习任务的一个范畴,即从未标记或未分类的数据中推断出一个描述隐藏结构的函数。由于提供给学习者的示例是未标记的,因此没有错误或奖励信号来评估潜在的解决方案。

半监督学习

在这种机器学习类型中,训练数据包含一些期望的输出样本。半监督学习实际上被认为是一种监督式机器学习,它利用未标记或未分类的数据进行训练,通常是少量标记数据与大量未标记数据结合。

强化学习

来自一系列动作的奖励,人工智能AI)类型喜欢这种方式,因为它是最雄心勃勃的学习类型。强化学习RL)是一种机器学习,允许机器和软件代理在特定环境中自动确定理想的行为,以最大化其性能。

最受欢迎的

监督学习是最成熟的,因为它存在的时间最长。它是研究最多的,也是大多数机器学习算法所使用的学习类型。

有监督的学习比没有监督的学习要容易得多。

在我们继续进行一个机器学习示例之前,先来回顾一下几个机器学习应用。

机器学习的应用

如果你还不清楚机器学习这一主题为何如此重要,或许回顾一下真实世界中的机器学习使用案例会有所帮助。

在本节中,我们将占用您一些时间列举一些真实世界的机器学习应用。

当前机器学习的示例应用程序包括以下内容(实际上几乎每天都在使用):

搜索你可能每天在多个设备上使用此功能。机器学习结果被用于开发网页搜索排名页面。排名页面是个人最可能感兴趣并点击的内容列表。
数字识别给定手写在信封上的邮政编码,识别每个手写字符对应的数字。该问题的模型将允许计算机程序读取和理解手写的邮政编码,并按地理区域对信封进行排序。
生物学基于过去的实验,理性设计计算机上的药物。
银行与金融用于确定向谁发送哪些信用卡优惠。评估信用优惠的风险。如何决定将钱投资于哪里。
电子商务预测客户流失、欺诈检测和机器人检测。
理解语音给定用户的发声,识别用户所做的具体请求。这个问题的模型将允许程序理解并尝试满足该请求。iPhone 配有 Siri,具备此功能。
人脸识别给定一个包含数百张数字照片的数字相册,识别其中包含某个特定人物的照片。该决策过程的模型允许程序按人物组织照片。一些相机和软件,如 iPhoto,具备此功能。
太空探索太空探测器和射电天文学。
形状识别给定用户在触摸屏上绘制形状,以及已知形状的数据库,确定用户试图绘制的形状。该决策模型将允许程序显示用户绘制的形状的柏拉图版本,从而制作清晰的图表。
机器人技术如何处理新环境中的不确定性;自动驾驶汽车。
信息提取能够在互联网上的数据库上提问。
社交网络关于关系和偏好的数据。机器学习从数据中提取价值。
产品推荐给定客户的购买历史和大量产品库存,识别客户可能感兴趣并可能购买的产品。该决策过程的模型将允许程序向客户推荐产品并激励购买。Amazon 具备此功能。还可以考虑 Facebook 和 GooglePlus,它们在用户注册后推荐与其连接的用户。
调试用于计算机科学问题,例如调试。劳动密集型过程。可以提示错误可能的位置。

机器学习的实际应用

如果我们继续比较数据/数据库开发与机器学习,专注于一个典型项目,我们将看到相似之处。

在这一点上,Jason Brownlee 提供的一个相当不错的示例很好地说明了这一点。在 Jason 的文章中,他提醒我们,机器学习项目不仅仅是运行算法:

机器学习算法只是数据分析师或数据科学家在实践中使用机器学习的一小部分。

你可以在线查阅 Jason 的文章,网址是 machinelearningmastery.com/basic-concepts-in-machine-learning

实际上,Jason 指出,典型的涉及机器学习的统计项目中遵循的各个阶段很可能是迭代的,并且大致如下所示:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/7abcd736-5e03-46f6-a0ae-6f6cdcdd5fc3.png

理解

项目的初始阶段将涉及建立对所需领域知识和项目目标的良好理解。数据科学家将与领域专家(或主题专家)交流,以明确项目目标。在项目开始时,目标模糊或不清晰是很常见的。你往往有更多的事情要测试,但无法全部实现。

项目的这一阶段与数据/数据库开发项目的第一阶段直接相关,因为数据开发人员总是需要从领域专家那里收集信息,以便在设计数据结构或数据库模型之前,详细了解项目目标。

准备

在此阶段,进行数据集成、选择、清洗和预处理。这通常是最耗时的部分,但也许是最重要的步骤,因为高质量的数据至关重要。数据量越大,数据就越

再次强调,这一阶段与数据库开发项目非常相似。系统集成、查询与选择、清洗和其他数据预处理步骤(以便能够在新的数据库模型中使用)是预期的内容。这通常涉及到数据聚合、建立主外键关系、清洗等操作。

学习

这一阶段是最有趣的部分,机器学习算法被应用到数据中。

项目的这一阶段与数据库开发项目中的数据建模或数据模型设计阶段最为相关。请记住,在机器学习统计项目中,学习更多偏向机器方向,而在数据库开发项目中,建模则更多偏向人类方向。

解释

在此阶段,数据科学家和统计团队会回顾并解释之前阶段的结果。有时候,模型的工作原理并不重要,只要它能够提供好的结果。在某些项目中,要求结果易于理解。专家们会对结果提出挑战。

这一阶段与数据库开发项目的验收测试阶段相似,在数据库构建完成后,领域专家将审查和测试模型,并解释结果,以确定数据库是否提供了符合项目要求的可接受结果。

部署

在最后阶段,前几个阶段的结果(发现的知识)将被整合并部署。

在实验室中成功的机器学习项目,往往并未完全投入实践。通常情况下,项目会进入“另一个阶段”,通常会使用更多或更新的数据。

在这个阶段,我们看到数据库正式上线,或者被部署到生产环境中,由数据拥有者使用。

迭代

最后,Jason 还指出:

这不是一次性的过程,而是一个循环。数据科学家可能需要重复执行这个循环(可能重新执行第 1 至第 5 阶段),直到得到一个可以实际应用的结果。此外,数据可能会发生变化,需要进行新的循环,等等。

这可能是数据库开发项目与机器学习统计项目的区别所在。虽然数据库项目可能会经历多个迭代阶段(例如为了应对在验收测试中发现的某些问题),但大多数数据库项目通常会以一个实际被数据拥有者使用的数据库作为结束。

使用 R 将机器学习技术应用于数据库

从本书的始至终,我们几乎都使用了 R 编程语言,因为它被大多数数据科学家使用,而且对于刚刚接触统计学的人来说,非常易于理解。在本章中,我们将再次使用 R,这次是为了探讨机器学习技术如何应用于数据或数据库开发者。

我们将使用数据科学家 Will Stanton 提供的一篇文章作为起点。在他的文章中,他展示了如何使用 caret 包在 R 中创建一个简单的分类模型的巧妙示例。

R caret 包是 Will 在他的示例中使用的,非常易于使用,包含包装函数,允许你使用相同的函数进行训练和预测,适用于数十种不同的算法。除此之外,它还包括用于评估从模型中获得的预测效果的复杂内建方法。

在这个示例中(尽管有点令人不适),任务是建立一个统计模型,能够分析在泰坦尼克号上乘坐的个体的特征,然后预测他们生还的可能性。

理解数据

提供的数据包含关于谁幸存和谁遇难的信息:

https://github.com/OpenDocCN/freelearn-ds-pt5-zh/raw/master/docs/stat-ds/img/f7dad86d-436e-4222-a891-2a885928f42e.png

这些数据以可下载的文本 CSV 文件形式提供,其中包含每个人的几个有用变量:

  • Pclass: 乘客等级(头等舱、二等舱或三等舱)

  • 性别

  • 年龄

  • SibSp: 登船的兄弟姐妹/配偶的数量

  • Parch: 登船的父母/子女的数量

  • 票价: 乘客支付的金额

  • 登船地点: 他们登船的地点(C = 瑟堡;Q = 皇后镇;S = 南安普敦)

所需的逐步 R 代码,用于安装和加载 R 包,以及加载前述数据集,可以在线找到,链接为will-stanton.com/machine-learning-with-r-an-irresponsibly-fast-tutorial

给出的示例在概述所需的创建简单分类模型的每个步骤时做得非常出色,旨在说明一种机器学习的形式。

所使用的方法与我们在本章的机器学习实战部分之前提到的内容一致。

第一步是理解问题或挑战,并做好准备,以便能够进行实际的机器学习。

准备工作

在 R 示例中,我们了解到挑战是预测乘客幸存的可能性;然后我们进行准备,加载数据以便进行审查,识别出合适或最佳的变量(以供学习算法使用):

这篇文章提供了读取train.csv文件的 R 命令,使用,分隔符,包括将标题行作为列名,并将其分配给 R 对象。它还读取了testSet.csv文件,最后使用 R 的Head函数显示数据集的前几行,读者可以看到每行都有一个Survived列,该列值为 1 表示该人幸存,为 0 表示未幸存(你可以在本节之前提供的数据文件图片中看到这部分信息)。

接下来,示例解释了比较训练集和测试集,展示了训练集和测试集之间的显著差异;训练集是带标签的,而测试集是无标签的。当前的任务是对无标签的测试集进行预测,并根据正确标记的乘客百分比进行评分。

文章还告知读者,大部分机器学习实际上是关于选择模型中最合适的特征。在机器学习中,特征实际上就是一个变量或某些变量的组合(例如两个变量的和或积)。

在统计分类模型示例中,泰坦尼克号挑战,通过使用交叉表和条件箱型图,选择最有用的变量来进行建模。

交叉表以一种非常易于理解的方式展示了两个变量之间的相互作用。在此示例中,为了确定哪些变量是生存的最佳预测因子,使用了 R 的 table 函数来查看生存与其他每个变量之间的交叉表。

箱形图对于识别有用的连续变量非常有用。给出的 R 示例使用条件箱形图比较数据中每个连续变量的分布,条件是乘客是否幸存。

在进行的分析中,可以看到 Pclass 对于根据指示的生存率预测某人是否生存具有强大的预测价值:

乘客等级结果生存率
1 班136 幸存,80 死亡63%
2 班87 幸存,97 死亡47%
3 班119 幸存,372 死亡24%

数据开发者

前述示例与数据或数据库开发者有何异同?可能有何相关示例?

从顶部开始,假设您负责一家游戏公司拥有的数据库。该公司购买并在其赌场和俱乐部的地板上放置各种类型的老虎机。

老虎机是一种赌场博彩机,具有三个或更多个卷轴,在按下按钮时旋转。机器由插入硬币操作。

数据库包含每种类型的游戏机的许多有用变量:

  • 主题:传统的老虎机以水果和条形符号为特色,但主题正在成为老虎机游戏的主要特征

  • 面额:五分、十分、二十五分、五十分等等

  • 支付频率:松散、中等或紧密

  • 玩家位置:低级或直立

  • 卷轴类型:机械或虚拟

  • 玩家数量:独立或社区

在这里,我们的挑战是根据机器的特征或已知变量来预测特定机器是否会成为游戏公司的热门机器。

在 R 示例中,数据科学家很幸运有提供的数据文件。但是,作为数据或数据库开发者,我们通常不会那么幸运,尽管这并不是什么大问题。

熟悉数据结构/数据库模型(正如我们在本章开始时讨论的),数据开发者可以构建适当的 SQL 查询来定位我们项目中感兴趣的数据(有些人称这一过程为挖掘数据)。

数据挖掘是发现数据模式的过程,涉及人工智能、机器学习、统计学和数据库系统的交集方法。

此外,一旦数据已经在数据库中定位,将信息写入 CSV 文本文件以供我们的统计项目消耗是常规工作:

select * into outfile 'd:/report.csv' fields terminated by ',' from tableName;

但事实上,数据开发者可能会进行数据分析、变量审查和特征选择,而数据仍在数据库中;这样一旦确定了最强大的预测因子,其他(在我们的挑战环境中可能被视为噪声的因素)就不必提取到我们的文件中。这样可以节省时间,使数据可能更易管理。

噪声 在第十章中进行了讨论,提升和你的数据库

理解挑战

在完全理解当前的挑战后,也许我们已经得知,如果一台游戏机的平均硬币投入(即老虎机上投币的总美元金额)每天超过一万美元,它就会被组织认为是受欢迎的游戏机。

有了这些信息,我们可以构建一个查询(或很可能是几个查询),用来计算并提取每个机器观察值的该变量数值。

到那时,我们将拥有每台公司运营的机器的观察数据(记录),以及每台机器的特征列表(我们想要检查的变量),以及已确定的结果(是否受欢迎)。

听起来熟悉吗?应该是的!

假设在我们的数据库示例中,我们发现面额是判断一台游戏机是否受欢迎的最强预测因子:

面额结果/平均硬币投入值流行度
10 美分$7,500
25 美分$18,000
50 美分$9,000

从这些例子的比较中,我们可以看到数据开发人员有很多机会定位并利用存储在数据库中的信息,作为统计模型的输入。

交叉表和图表绘制

我们之前提到过,交叉表用于以非常易读的格式展示两个变量之间的交互关系。为了查看Survived与其他每个变量之间的交叉表,使用了 R 函数 table。

数据开发人员有类似的工具,PIVOT。PIVOT 是 SQL Server 2005 中引入的一种新的关系操作符。它为 SQL Server 提供了一个简单的机制,可以将行转换为列。

我们这里关注的 R 示例也使用了箱线图可视化来识别数据中的连续变量。虽然原生 SQL 并没有直接提供绘图功能,但数据开发人员可以考虑利用像SQL Server 报告服务SSRS)之类的工具来绘制从数据库中提取的数据;不过,由于下一阶段将需要我们创建一个分类模型,我建议利用 R 的可视化功能来创建我们的图表和图形。

网上有一个非常好的资源,值得读者花时间阅读,内容涉及主题使用 SQL 和 R 创建图表和绘图(操作指南)

docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/walkthrough-create-graphs-and-plots-using-r

此时,你可以继续进行之前讨论过的学习、评估和部署阶段。

总结

在本章中,我们首先回顾了数据结构、数据模型和数据库的概念,并找到了它们之间的相似性和差异。

接下来,我们概述了机器学习及相关概念,并将机器学习统计项目的实践与数据库开发项目进行了比较。

最后,我们介绍了 R 语言的概念性应用,并将机器学习技术应用于来自数据库的数据。

本书旨在帮助典型的数据或数据库开发人员过渡到统计学领域,因此我们希望读者已经对统计学和数据科学中的相关主题有了扎实的理解。

祝你好运!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值