TowardsDataScience 博客中文翻译 2016~2018(八十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

数据科学简化第 2 部分:统计学习的关键概念

原文:https://towardsdatascience.com/data-science-simplified-key-concepts-of-statistical-learning-45648049709e?source=collection_archive---------2-----------------------

在本系列的第一篇文章中,我已经谈到了数据科学的关键概念和过程。在这篇文章中,我将深入探讨一下。首先,我将定义什么是统计学习。然后,我们将深入研究统计学习中的关键概念。相信我;很简单。

什么是统计学习?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据维基百科,统计学习理论是从统计学和功能分析领域汲取的机器学习框架。

机器学习是通过软件应用实现的统计学习技术的一种表现形式。

这在实践中意味着什么?统计学习指的是使我们能够**更好地理解数据的工具和技术。**让我们回到这里。我们理解数据是什么意思?

在统计学习的背景下,有两种类型的数据:

  1. 可以直接控制的数据,又称独立变量。
  2. 不能直接控制的数据,也称为因变量。

无法控制的数据,即需要预测或估计的因变量。

更好地理解数据是从自变量的角度更好地了解因变量。让我用一个例子来说明:

假设我想根据分配给电视、广播和印刷品的广告预算来衡量销售额。我可以控制预算,我可以分配给电视,广播和印刷。我不能控制的是它们将如何影响销售。我想把我不能控制的数据(销售额)表达成我能控制的数据(广告预算)的函数。我想揭开这种隐藏的关系。

统计学习揭示隐藏的数据关系。非独立数据和独立数据之间的关系。

参数和模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运营管理中一个著名的商业模式是 ITO 模式。代表输入-转换-输出模型。很简单。有输入。这些输入经历一些转换。产生一个输出。

统计学习也应用类似的概念。有输入数据。输入数据被转换。需要预测或估计的输出就产生了。

转换引擎被称为**模型。**这些是估计输出的函数。

这种转换是数学上的。数学成分被添加到输入数据中以估计输出。这些成分被称为参数。

让我们看一个例子:

是什么决定了一个人的收入?说收入是由一个人一年的教育和多年的经验决定的。估计收入的模型可以是这样的:

收入= c + β0 x 学历+ β1 x 经验

β0 和β1 是将收入表示为教育和经验的函数的参数。

学历和经历是可控变量。这些可控变量有不同的同义词。它们被称为独立变量。它们也被称为特征

收入是不可控的变量。他们被称为目标

培训和测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们必须准备考试的时候,我们做什么?学习。学习。喝点酒。记笔记。练习模拟试卷。这些是学习的工具,也是为未知的考验做准备的工具。

机器学习也使用类似的概念进行学习。数据是有限的。现有数据需要谨慎使用。建立的模型需要验证。验证它的方法如下:

  • 将数据分成两部分。
  • 用一部分进行训练。让模型从中学习。让模型看到数据。这个数据集被称为训练数据。
  • 使用另一部分测试模型。用看不见的数据对模型进行“测试”。这个数据集被称为测试数据。

在竞争性考试中,如果准备充分,如果学习扎实,那么在考试中的表现也会令人满意。同样,在机器学习中,如果模型从训练数据中学习得很好,它将在测试数据中表现良好。

类似地,在机器学习中,一旦在测试数据集上测试了模型,就评估了模型的性能。根据估计的输出与实际值的接近程度进行评估。

方差和偏差

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

英国著名统计学家乔治·博克斯曾经引用过:

“所有型号都是错的;有些是有用的。”

没有模型是 100%准确的。所有模型都有误差。这些误差有两个来源:

  • 偏见
  • 差异

让我尝试用一个类比来解释这一点。

Raj,一个七岁的孩子,刚刚开始学习乘法的概念。他已经掌握了表 1 和表 2。他的下一个挑战是学习三表。他非常兴奋,开始练习 3 的乘法表。他的桌子是这样的:

  • 3 x 1 = 4
  • 3 x 2 = 7
  • 3 x 3 = 10
  • 3 x 4 = 13
  • 3 x 5 = 16

拉吉的同学鲍勃也在同一条船上。他的桌子看起来像这样:

  • 3 x 1 = 5
  • 3 x 2 = 9
  • 3 x 3 = 18
  • 3 x 4 = 24
  • 3 x 5 = 30

让我们从机器学习的角度来研究 Bob 和 Raj 创建的乘法模型。

  • 拉吉的模型有一个无效的假设。它假设乘法运算意味着在结果后加一。这个假设引入了偏差误差。假设是一致的,即输出加 1。这意味着拉吉的模型有一个低偏差。
  • Raj 的模型得出的结果总是与实际相差 1 个数字。这意味着他的模型有一个低方差。
  • 鲍勃的模型的输出到处都是。他的模型输出与实际值相差很大。偏离没有一致的模式。Bob 的模型有高偏差高变化。

上面的例子是对方差和偏差这一重要概念的粗略解释。

  • 偏差是模型由于没有考虑数据中的所有信息而不断学习错误的东西的倾向。
  • 方差是模型获取随机事物的趋势,与真实信号无关。

偏差-方差权衡

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我有一个学校的朋友,他是一个很棒的学生。他的数学相对较差。他过去学习数学的方法是死记硬背。他学会并记住了数学问题。他能很好地“背诵”它们。

挑战如下:考试问题与他记忆的问题不同。这些问题是数学概念的一般应用。显然,他很难通过考试。

机器学习问题遵循同样的模式。如果模型学习了太多关于特定数据集的知识,并试图将相同的模型应用于看不见的数据,它将具有很高的误差。从给定的数据集中学习太多被称为过拟合。它还没有推广对看不见的数据有效应用的学习。另一方面,学习太少会导致不适应。模型太差了,甚至无法从给定的数据中学习。

阿尔伯特·爱因斯坦简洁地总结了这个概念。他说:

“一切都应该尽可能简单,但不能再简单了。”

机器学习问题中的一个持续努力是取得正确的平衡。创建一个不太复杂也不太简单的模型。创建一个通用模型。创建一个相对不准确但有用的模型。

  • 过度拟合的模型是复杂的。它在训练数据上表现非常好。它在测试数据上表现不佳。
  • 一个低于的模型太简单了。它不会对训练和测试数据都执行 will。
  • 一个好的模型能平衡欠拟合和过拟合。它概括得很好。这是尽可能简单,但不简单。

这种平衡行为被称为偏差-方差权衡。

结论

统计学习是复杂机器学习应用的构建模块。这篇文章介绍了统计学习的一些基本概念。这篇文章的 5 大要点是:

  1. 统计学习揭示隐藏的数据关系。非独立数据和独立数据之间的关系。
  2. 模式是变革的引擎。参数是实现转换的要素。
  3. 模型使用训练数据进行学习。模型使用测试数据进行评估。
  4. 所有型号都是错的;有些是有用的。
  5. 偏差-方差权衡是一种平衡行为。平衡以找到最佳模式。找到最佳平衡点。

我们将在本系列的后续文章中更深入地研究机器学习模型的细节。

数据科学简化版第 10 部分:分类模型介绍

原文:https://towardsdatascience.com/data-science-simplified-part-10-an-introduction-to-classification-models-82490f6c171f?source=collection_archive---------1-----------------------

韦伯斯特对分类的定义如下:

根据已建立的标准在组或类别中的系统安排。

周围的世界充满了量词。分类器有助于防止垃圾邮件。分类器有助于识别可能流失的客户。分类器有助于预测是否会下雨。这种监督学习方法在商业应用中无处不在。我们认为这是理所当然的。

在这篇博文中,我将讨论分类模型的关键概念。

分类类别

回归模型估计数值变量,也称为因变量。对于回归模型,目标总是一个数字。分类模型有一个定性目标。这些目标也称为类别。

在大量的分类问题中,目标被设计成二元的。二进制意味着目标将只取一个 0 或1值。这些类型的分类器被称为二元分类器。让我们举个例子来理解这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回归模型估计数值变量,也称为因变量。对于回归模型,目标总是一个数字。分类模型有一个定性目标。这些目标也称为类别。

在大量的分类问题中,目标被设计成二元的。二进制意味着目标将只接受 0 或 1 值。这些类型的分类器被称为**二元分类器。**让我们举个例子来理解这一点。一家银行的贷款审批部门希望使用机器学习来识别潜在的贷款违约者。在这种情况下,机器学习模型将是一个分类模型。根据模型从输入的数据中获得的信息,它会将贷款申请人分为两类:

  • 第一桶:潜在违约者。
  • 第二桶:潜在的非违约者。

在这种情况下,目标将是一个类似于“ will_default_flag”的属性。 “这个目标将适用于每一个贷款申请人。它的值为 0 或 1。如果模型预测为 1,则意味着申请人很可能违约。如果模型预测它为 0,这意味着申请人可能不会违约。一些分类器还可以将输入分类到许多桶中。这些分类器被称为多类分类器。

线性和非线性分类器

假设我们想要建立一个分类器,对潜在的贷款违约者进行分类。收入和信用评级的特征决定了潜在的违约者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图描述了这个场景。为了简单起见,让我们说特征空间是收入和信用评级的交集。绿点表示未违约,粉点表示违约。分类器基于数据的输入特征(收入和信用评级)进行学习。分类器创建一条线。这条线将特征空间分成两部分。分类器创建一个模型,以下列方式对数据进行分类:

  • 任何落在线左侧的人都是潜在的违约者。
  • 任何落在线左侧的人都是潜在的非违约者。

分类器可以用一条线分割特征空间。这种分类器称为线性分类器。

在这个例子中,只有两个特征。如果有三个特征,分类器将适合将平面分成两部分的平面。如果有三个以上的特征,分类器创建一个超平面。

这是一个过于简单的场景。一条线或一个平面可以将数据点分成两个桶。如果数据点以下列方式分布会怎样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,线性分类器无法施展它的魔法。分类器需要绘制一条曲线来区分违约者和非违约者。这种分类器被称为非线性分类器。

有很多算法可以用来创建分类模型。像逻辑回归这样的算法是很好的线性分类器。其他如神经网络是良好的非线性分类器。

分类器的直觉如下:

用函数(线性或非线性)划分特征空间。对其进行划分,使特征空间的一部分包含来自一个类的数据。特征空间的另一部分具有来自其他类别的数据

我们对分类器如何工作有一种直觉。我们如何衡量一个分类器做得好不好?这里出现了的概念混乱矩阵。

让我们举个例子来理解这个概念。我们建立了一个贷款违约分类器。这个分类器接受输入数据,对其进行训练,然后是它学习的内容。

  • 分类器将 35 名申请人归类为违约者。
  • 分类器将 65 名申请人归类为非违约者。

基于分类器执行的方式,又导出了四个度量:

  1. 在那些被归类为违约者 的 中,只有 12 人是实际违约者。这个度量被称为真阳性(TP)。****
  2. 在被归类为违约者 的 中,有 23 人实际上没有违约。这个指标被称为假阳性(FP)。****
  3. 在那些被归类为非违约者 的 中,只有 57 人是真正的非违约者。这个度量被称为真负值(TN)。****
  4. 在被归类为非违约者的中,有 8 人是实际违约者。这个指标被称为假阴性(FN)。

这四个指标可以列表成一个矩阵,称为 混淆矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这四个度量中,我们将为分类器导出评估度量。让我们来讨论这些评估指标。

精确度:

准确性衡量分类器对真阳性和真阴性情况的正确率。数学上,它被定义为:

准确率=(真阳性+真阴性)/总预测。

在这个例子中,贷款违约分类器的精度是:(12+57) / 100 = 0.69 = 69%。

敏感性或回忆:

回忆测量分类器获得正确真值的次数。数学上,它被定义为:

召回=真阳性/(真阳性+假阴性)

在示例中,贷款违约分类器的召回率是:12/(12+8) = 0.60 = 60%。

特异性:

特异性衡量分类器获得正确否定的次数。数学上,它被定义为:

特异性=(真阴性)/(真阴性+假阳性)

在示例中,贷款违约分类器的特异性为:57/(57+23) = 0.7125 = 71.25%。

精度:

精度衡量预测为正的总数中实际为正的有多少。数学上,它被定义为:

精度=(真阳性)/(真阳性+假阳性)

在这个例子中,贷款违约分类器的精度是:12/(12+23) = 0.48 = 48%。

这些是很多指标。我们应该依赖哪些指标?这个问题在很大程度上取决于业务环境。在任何情况下,一个单独的度量标准都不能给出分类器有多好的全貌。让我们举一个例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们建立了一个识别欺诈交易的分类器。该分类器确定交易是否真实。历史模式显示,每 100 笔交易中就有两笔欺诈交易。我们构建的分类器具有以下混淆矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 准确率为 98%
  • 召回率是 100%
  • 精确度为 98%
  • 特异性为 0%

如果这种模型是基于准确性、召回率和精确度的标准来部署的,那么公司肯定会完蛋。虽然这个模型表现很好,但事实上,它是一个愚蠢的模型。它没有做它应该做的事情,即标记欺诈交易。这个模型最重要的指标是特异性。其特异性为 0%。

因为不能依赖单一的度量来评估分类器,所以创建了更复杂的度量。这些复杂的指标是上述所有指标的组合。这里解释几个关键的。

F1 分数:

F1 分数是精确度和召回率之间的调和平均值。常规平均值平等对待所有值。调和平均值对较低值给予更大的权重。因此,只有在召回率和精确度都很高的情况下,分类器才会得到高的 F1 分数。它被定义为:

F1 = 2x(精度 x 召回)/(精度+召回)

受试者工作特征(ROC)和曲线下面积(AUC):

接收机工作特性又名 ROC 是一个视觉指标。这是一个二维的情节。它在 X 轴上具有假阳性率或 1-特异性,在 Y 轴上具有真阳性率或灵敏度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 ROC 图中,有一条线测量一个 随机分类器 将如何预测 TPR 和 FPR。它是直的,因为它有相等的概率预测 0 或 1。

如果一个分类器做得更好,那么与 FPR 相比,它应该具有更大比例的 TPR。这将把曲线推向西北方向。

曲线下面积(AUC)是 ROC 曲线的面积。如果 AUC 是 1,即 100%,这意味着它是一个完美的分类器。如果 AUC 是 0.5,即 50%,这意味着分类器不比掷硬币好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有很多评估指标来测试一个分类器。分类器需要根据业务环境进行评估。需要根据上下文选择正确的指标。没有一个神奇的标准。

结论

在这篇文章中,我们已经看到了分类器的基础知识。分类器在数据科学中无处不在。有许多实现分类器的算法。各有各的优缺点。我们将在本系列的后续文章中讨论一些算法。

原载于 2017 年 9 月 18 日datascientia . blog*。*

数据科学简化版第 11 部分:逻辑回归

原文:https://towardsdatascience.com/data-science-simplified-part-11-logistic-regression-5ae8d994bf0e?source=collection_archive---------4-----------------------

在本系列的最后一篇博文中,我们讨论了分类器。讨论了分类器的类别以及如何对它们进行评估。我们还深入讨论了回归模型。在这篇文章中,我们将深入探讨回归模型如何用于分类任务。

Logistic 回归 是一种广泛用于分类任务的回归模型。像往常一样,我们将通过例子来讨论。

没有一家货币银行向我们提出问题。该银行希望建立一个模型,预测他们的哪些客户会拖欠贷款。提供的数据集如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有助于我们构建模型的功能包括:

  • 客户 Id:唯一的客户标识
  • 信用评分:介于 0 和 800 之间的数值,表示借款人信用历史的风险。
  • 贷款金额:这是完全还清的贷款金额或违约金额。
  • 当前工作年限:一个分类变量,表示客户在当前工作中已经工作了多少年。
  • 信用记录年数:自客户信用记录第一次录入以来的年数
  • 月债务:客户现有贷款的月付款额
  • 信用问题的数量:客户记录中信用问题的数量。
  • IsDefault:这是目标。如果客户违约,那么它将 1 否则它 0。

这是一个分类问题。

逻辑回归是回归模型的化身。它将回归模型转换为分类器。让我们首先理解为什么普通回归模型不能作为分类器。

默认情况下,目标值为 0 或 1。我们可以把它重新定义为一种概率。重新架构如下:

  • 如果违约概率> = 0.5,则客户将违约,即 IsDefault = 1
  • 如果违约概率< 0.5 then the customer will not default i.e. IsDefault = 0

Recall our discussion on Linear Regression Model. In the regression model, we had defined an dependent variable y 是自变量的函数。为了简单起见,让我们假设我们只有一个自变量 x 。等式变成了。

y = β0 + β1.x

  • β0 是截距。
  • β1 是 x 的系数。

在贷款违约模型的例子中,Tim 使用信用评分作为自变量。因变量(y)是客户违约概率的估计值,即 P(违约)

该等式可以写成:

p(违约)= β0 + β1 .信用评分

Tim 在统计软件包上运行回归模型。统计软件包为β0 和β1 提供了以下系数:

  • β0 = 0.73257
  • β1 = -9.9238e-05

估计违约概率的等式现在变成了:

p(默认值)= 0.73257 + -9.9238e-05。信用评分

如果某人有很高的信用评分,比如 8000,那么他会不会违约?让我们引入一些值并检查一下。

0.73257±9.9238 e-05 x 8000 =-0.06134。

如果我们用信用评分和回归线绘制 p(违约),我们会得到以下曲线:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

传统回归模型面临挑战。数字-0.06334,一个负概率,没有意义。从图表中也可以明显看出。对于信用分高的,概率小于零。概率需要介于 0 和 1 之间。

怎么做才能把等式转换成概率总是在 0 和 1 之间?

这就是 T2 乙状结肠 T3 的用武之地。

sigmoid 或逻辑 函数是具有特征“S”形曲线或 sigmoid 曲线的数学函数。数学上,它定义如下:

sigmoid = ey/(1+ey)

乙状结肠的形状如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它转换 0 和 1 之间的所有值。假设我们有一组从-5 到 10 的数字。当使用 sigmoid 函数对这组数字进行变换时,所有值都在 0 和 1 之间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这变得有趣了。使用 sigmoid,任何数字都可以转换成等价的概率分数。

既然我们有了将目标转化为概率的方法,让我们看看它是如何工作的。使用 sigmoid 函数转换后的回归方程如下:

y = β0 + β1 .信用评分

p(默认值)= ey/(1 + ey)

p(默认值)= sigmoid(y)

让我们来看看当信用评级较高(即 8000)时,sigmoid 模型的表现如何

y = 0.73257±9.9238 e-05 x 8000 =-0.06134。

p(默认值)= sigmoid(y)= sigmoid(-0.06134)= 0.4846

p(默认值)= 48.46% => IsDefault = 0

可以通过添加更多的变量来增强逻辑回归模型。我们需要做的就是把简单的线性回归模型提升为多元回归模型方程。这种模型的一个例子如下:

y2 = β0 + β1 .信用评分+ β2。贷款金额+ β3。信用问题数+ β4。月负债+ β5。自上次拖欠后的月数+ β6。信用卡数量

p(默认)= sigmoid(y2)

让我们试着用这个模型来预测潜在的违约者。贷款数据集按 80:20 的比例分为训练集和测试集(80%训练,20%测试)。

回想一下,有许多度量来评估分类器。我们将使用 AUC 作为模型评估的指标。让我们看看新型号的性能如何。机器学习程序用于评估测试数据上的模型性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新型号性能不太好。测试数据的 AUC 分数约为 60%。

我们现在了解逻辑回归模型的工作原理。我们现在知道它是如何构建分类器的。分类器的 AUC 分数不好。我们需要寻找更好的模型。在本系列的下一篇文章中,我们将研究交叉验证。

原载于 2017 年 10 月 2 日datascientia . blog

数据科学简化第 5 部分:多元回归模型

原文:https://towardsdatascience.com/data-science-simplified-part-5-multivariate-regression-models-7684b0489015?source=collection_archive---------1-----------------------

在这个系列的上一篇文章中,我们讨论了费尔南多的故事。一个想买车的数据科学家。他使用简单的线性回归模型来估计汽车的价格。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fernando 创建的回归模型根据发动机尺寸预测价格**。** 用一个自变量预测一个因变量。

简单线性回归模型的公式为:

价格= β0 + β1 x 发动机尺寸

统计软件包计算了参数。线性方程估计为:

价格= -6870.1 + 156.9 x 发动机尺寸

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该模型从两个方面进行了评估:

  • 鲁棒性——使用假设检验
  • 准确度——使用决定系数,即 R 平方

回想一下,度量 R 平方解释了模型预测值与实际值的平均值之间的方差分数。该值介于 0 和 1 之间。它越高,模型就越能解释方差。Fernando 创建的模型的 R 平方是 0.7503,即训练集的 75.03%。这意味着该模型可以解释 75%以上的变异。

然而,费尔南多想让它变得更好。

他沉思道:

  • 如果我能给模型输入更多的信息会怎么样?会提高准确率吗?

Fernando 决定通过向模型提供更多输入数据(即更多独立变量)来增强模型。他现在已经进入了多元回归模型的世界。

概念:

线性回归模型为监督学习提供了一种简单的方法。它们简单而有效。

回想一下,linear 有如下含义:排列成直线或者沿着直线延伸。线性表明因变量和自变量之间的关系可以用直线表示。

这条线的方程是 y = mx + c。一个维度是 y 轴,另一个维度是 x 轴。可以在二维平面上绘制。它看起来像这样:

线的方程是 y = mx + c. 一个维度是 y 轴,另一个维度是 x 轴。可以在二维平面上绘制。它看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种关系的概括可以表示为:

y = f(x)。

没有任何花哨的意思。它的意思是:

定义 y 为 x 的函数 即定义因变量为自变量的函数。

如果因变量需要用多个自变量来表示呢?广义函数变成:

y = f(x,z) 即把 y 表示成 x 和 z 的某种函数/组合

现在有三维 y 轴,x 轴和 z 轴。它可以绘制为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们有不止一个维度(x 和 z)。我们有一个额外的维度。我们想把 y 表示成 x 和 z 的组合。

对于一个简单的回归线性模型,一条直线将 y 表示为 x 的函数。现在我们有了一个额外的维度(z)。如果在一条线上增加一个额外的维度会怎么样?它变成了一架飞机。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平面是将 **y 表示为 x 和 z 的函数的函数。**外推线性回归方程,现在可以表示为:

y = m1.x + m2.z+ c

  • y 是因变量,即需要估计和预测的变量。
  • x 是第一个自变量,即可控变量。这是第一个输入。
  • m1 是 x1 的斜率。它决定了线的角度(x)。
  • z 是第二个自变量,即可控变量。这是第二个输入。
  • m2 是 z 的斜率。它决定了线(z)的角度。
  • c 是截距。当 x 和 z 为 0 时,确定 y 值的常数。

这就是多元线性回归模型的起源。有一个以上的输入变量用于估计目标。具有两个输入变量的模型可以表示为:

y = β0 + β1.x1 + β2.x2

让我们更进一步。如果我们有三个变量作为输入会怎么样?人类的可视化能力在这里是有限的。它只能可视化三维。**在机器学习的世界里,可以有很多维度。**具有三个输入变量的模型可以表示为:

y = β0 + β1.x1 + β2.x2 + β3.x3

多元回归模型的通用方程可以是:

y = β0 + β1.x1 + β2.x2 +……+ βn.xn

模型公式:

现在我们已经熟悉了多元线性回归模型的概念,让我们回到费尔南多。

费尔南多向他的朋友寻求更多的数据。他要求他提供更多关于汽车其他特征的数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下是他已经掌握的数据点:

  • 品牌:汽车的品牌。
  • 燃料类型:汽车使用的燃料类型。
  • nDoor:门的数量。
  • 引擎大小:汽车引擎的大小。
  • 价格:汽车的价格。

他获得了额外的数据点。它们是:

  • 马力:汽车的马力。
  • peakRPM:峰值功率输出附近的每分钟转数。
  • 长度:汽车的长度。
  • 宽度:汽车的宽度。
  • 高度:汽车的高度。

Fernando 现在想要建立一个模型,根据额外的数据点预测价格。

他建立的多元回归模型是:

估计价格作为引擎大小、马力、峰值转速、长度、宽度和高度的函数。

= >价格= f(发动机尺寸、马力、峰值转速、长度、宽度、高度)

= >价格= β0 + β1。发动机尺寸+ β2 .马力+ β3。峰值转速+ β4 .长度+ β5 .宽度+ β6 .高度

模型构建:

费尔南多将这些数据输入他的统计包。该包计算参数。输出如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多元线性回归模型为价格估算提供了以下等式。

**价格= -85090 + 102.85 *发动机尺寸+ 43.79 *马力+ 1.52 *峰值转速- 37.91 *长度+ 908.12 宽度+ 364.33 高度

模型解释:

多元模型的解释提供了每个自变量对因变量(目标)的影响。

记住,这个等式提供了对价格平均值的估计。 每个系数在所有其他预测值保持不变的情况下进行解释。

现在让我们来解释这些系数。

  • 引擎大小:在所有其他预测因素保持不变的情况下,如果引擎大小增加一个单位,平均价格将增加102.85 美元。
  • 马力:在所有其他预测因素保持不变的情况下,如果马力增加一个单位,平均价格将增加43.79 美元。
  • 峰值转速:在所有其他预测因素保持不变的情况下,如果峰值转速增加一个单位,平均价格将增加1.52 美元。
  • 长度:在所有其他预测因素保持不变的情况下,如果长度增加一个单位,平均价格就会减少37.91 美元(长度有一个-ve 系数)。
  • 宽度:在所有其他预测因素保持不变的情况下,如果宽度增加一个单位,平均价格就会增加908.12 美元
  • 身高:在所有其他预测因素保持不变的情况下,如果身高增加一个单位,平均价格就会增加364.33 美元

模型评估

模型已经建立。它被解释了。所有的系数都重要吗?哪些更有意义?这个模型解释了多少变化?

统计包提供了评估模型的指标。现在让我们来评估一下这个模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回忆一下关于 t-stat、p 值和决定系数定义的讨论。这些概念也适用于多元回归模型。该模型的评估如下:

  • **系数:**所有系数都大于零。这意味着所有的变量都对平均价格有影响。
  • **t 值:**除了长度,所有系数的 t 值都显著大于零。对于长度,t-stat 是-0.70。这意味着汽车的长度可能不会对平均价格产生影响。
  • **p 值:**对于除长度以外的所有变量,完全偶然观察到 p 值的概率相当低。长度的 p 值为 0.4854。这意味着观察到的 t-stat 是偶然的概率是 48.54%。这个数字相当高。

回想一下关于 R 平方如何帮助解释模型中的变化的讨论。当更多的变量被添加到模型中时,r 平方不会减小。只会增加。然而,必须有一个平衡。调整后的 R 平方努力保持这种平衡。调整的 R 平方是 R 平方的修改版本,已经针对模型中的预测器数量进行了调整。调整后的 R 平方补偿变量的增加,并且仅在新项增强模型时增加。

  • **调整后的 R 平方:**R 平方值为 0.811。这意味着该模型可以解释训练数据中出现的 81.1%的变异。优于上一款(75.03%)。

基于这些评估,Fernando 得出以下结论:

  • 除了汽车的长度之外的所有变量都对价格有影响。
  • 汽车的长度对价格没有显著影响。
  • 该模型解释了 81.1%的数据变化。

结论:

费尔南多现在有了更好的车型。然而,他有些不知所措。他知道汽车的长度不会影响价格。

他想知道:

如何为模型构建选择最佳的变量集?有没有选择最佳变量子集的方法?

在本系列的下一部分,我们将讨论变量选择方法。

数据科学简化第 6 部分:模型选择方法

原文:https://towardsdatascience.com/data-science-simplified-part-6-model-selection-methods-2511cbdf7cb0?source=collection_archive---------6-----------------------

在本系列的上一篇文章中,我们已经讨论了多元线性回归模型。Fernando 创建了一个基于五个输入参数估算汽车价格的模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

费尔南多确实有一个更好的模型。然而,他想选择最好的输入变量。

本文将详细阐述 的选型方法

概念

模型选择方法的思想是直观的。它回答了以下问题:

如何为最优模型选择正确的输入变量?

最佳模型是如何定义的?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最佳模型是将数据与评估指标的最佳值相匹配的模型。

可以有很多评估指标。 调整后的 r 平方是多元线性回归模型所选择的评价指标。

有三种方法可以选择最佳的变量集。它们是:

  • 最佳子集
  • 向前逐步
  • 向后逐步

让我们深入了解这些方法的内部工作原理。

最佳子集

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设我们有 k 个变量。最佳子集法的过程如下:

  1. 从零模型开始,即没有预测值的模型。让我们称这个模型为 M0。
  2. 找到有 1 个变量的最优模型。这意味着该模型是一个只有一个独立变量的简单回归变量。让我们称这个模型为 M1。
  3. 找到有两个变量的最优模型。这意味着该模型是一个只有两个自变量的回归变量。让我们称这个模型为 M2。
  4. 找出有 3 个变量的最优模型。这意味着该模型是一个只有三个独立变量的回归变量。让我们称这个模型为 M3。
  5. 以此类推……我们得到了钻头。重复这个过程。测试最佳模型的所有预测值组合。

对于 k 个变量,我们需要从以下一组模型中选择最佳模型:

  • M1:单预测器的最优模型。
  • M2:有两个预测因子的最优模型。
  • M3:有 3 个预测因子的最优模型。
  • Mk:具有 k 个预测值的最优模型。

从 M1…Mk 中选择最佳型号,即最适合的型号

最佳子集是一个复杂的过程。它梳理了整个预测列表。它选择可能的最佳组合。然而,它也有自己的挑战。

最佳子集为每个预测值及其组合创建一个模型。这意味着我们正在为每个变量组合创建模型。模型的数量可以是非常大的数量。

如果有 2 个变量,那么就有 4 个可能的模型。如果有 3 个变量,那么就有 8 个可能的模型。一般来说,如果有 p 个变量,那么就有 2^p 可能模型。可供选择的型号很多。假设有 100 个变量(相当常见)。假设有 100 个变量(相当常见)。会有 2^100possible 模特。令人难以置信的数字。

在 Fernando 的情况下,只有 5 个变量,他必须从 2^5models 创建和选择,即 32 个不同的模型。

向前逐步

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管最佳子集是详尽的,但它需要大量的计算能力。这可能非常耗时。逐步向前尝试减轻痛苦。

假设我们有 k 个变量。向前步进的过程如下:

  1. 从零模型开始,即没有预测值的模型。我们称之为 M0。向模型中添加预测值。一次一个。
  2. 找到有 1 个变量的最优模型。这意味着该模型是一个只有一个独立变量的简单回归变量。我们称这个模型为 M1。
  3. 给 M1 再加一个变量。找出有两个变量的最优模型。请注意,附加变量被添加到 M1。我们称这个模型为 M2。
  4. 给 M2 再加一个变量。找出有 3 个变量的最优模型。请注意,附加变量被添加到 M2。我们称这个模型为 M3。
  5. 等等…我们拿到钻头了。重复此过程,直到 Mk,即只有 k 变量的模型。

对于 k 个变量,我们需要从以下一组模型中选择最佳模型:

  • M1:单预测器的最优模型。
  • M2:有两个预测因子的最优模型。这个模型是 M1 +一个额外的变量。
  • M3:有 3 个预测因子的最优模型。这个模型是 M2 +一个额外的变量。
  • Mk:具有 k 个预测值的最优模型。这个模型是 Mk-1 +一个额外的变量。

再次选择 M1 Mk 中的最佳模型,即具有最佳拟合度的模型

与最佳子集方法相比,向前逐步选择创建更少的模型。如果有 p 个变量,那么将有大约 p(p+1)/2 + 1 个模型可供选择。远低于从最佳子集方法中选择模型。想象有 100 个变量;基于向前逐步方法创建的模型的数量是 100 * 101/2 + 1,即 5051 个模型。

在 Fernando 的案例中,只有 5 个变量,他必须创建 5*6/2 + 1 模型,即 16 种不同的模型,并从中进行选择。

向后逐步

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既然我们已经理解了模型选择的向前逐步过程。让我们讨论一下向后的逐步过程。这是向前逐步过程的逆过程。向前逐步从没有变量的模型开始,即零模型。相反,反向逐步从所有变量开始。向后步进的过程如下:

  1. 假设有 k 个预测器。从完整模型开始,即包含所有预测因素的模型。我们称这个模型为 Mk。从完整模型中去除预测因子。一次一个。
  2. 找到 k-1 个变量的最优模型。从 Mk 中移除一个变量。计算所有可能组合的模型性能。选择具有 k-1 个变量的最佳模型。我们称这个型号为 Mk-1。
  3. 找出 k-2 变量的最优模型。从 Mk-1 中删除一个变量。计算所有可能组合的模型性能。选择具有 k-2 个变量的最佳模型。我们称这个型号为 Mk-2。
  4. 等等…我们拿到钻头了。重复这个过程,直到 M1,即只有一个变量的模型。

对于 k 个变量,我们需要从以下一组模型中选择最佳模型:

  • Mk:具有 k 个预测值的最优模型。
  • Mk-1:具有 k — 1 个预测值的最优模型。这个模型就是 Mk——一个附加变量。
  • Mk-2:具有 k — 2 个预测值的最优模型。这个模型是 Mk——两个额外的变量。
  • M1:单预测器的最优模型。

模型结构

既然车型选择的概念已经很清楚了,让我们回到费尔南多身上。回想一下这个系列的上一篇文章。费尔南多有六个变量发动机尺寸、马力、峰值转速、长度、宽度和高度。他想通过创建多元回归模型来估算汽车价格。他想保持平衡,选择最好的模式。

他选择应用向前逐步模型选择方法。统计软件包计算所有可能的模型,并将 M1 输出到 M6。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们解释一下输出。

  • 模型 1:它应该只有一个预测器。最佳拟合模型仅使用发动机尺寸作为预测值。调整后的 R 平方为 0.77。
  • 模型 2:它应该只有两个预测器。最佳拟合模型仅使用发动机尺寸和马力作为预测指标。调整后的 R 平方为 0.79。
  • 模型 3:它应该只有三个预测器。最佳拟合模型仅使用发动机尺寸、马力和宽度作为预测值。调整后的 R 平方为 0.82。
  • 模型 4:它应该只有四个预测器。最佳拟合模型仅使用发动机尺寸、马力、宽度和高度作为预测值。调整后的 R 平方为 0.82。
  • 模型 5:它应该只有五个预测器。最佳拟合模型仅使用发动机尺寸、马力、峰值转速、宽度和高度作为预测指标。调整后的 R 平方为 0.82。
  • 模型 6:它应该只有六个预测器。最佳拟合模型仅使用所有六个预测值。调整后的 R 平方为 0.82。

回想一下关于创建最简单而有效的模型的讨论。

所有的模型都应该尽可能的简单,但是不能再简单了

Fernando 选择了性能最佳的最简单型号。**在这种情况下,它是模型 3。**该模型使用发动机尺寸、马力和宽度作为预测值。该模型能够得到 0.82 的调整后的 R 平方,即该模型可以解释训练数据中 82%的变化。

统计软件包提供以下系数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

估计价格作为引擎大小,马力和宽度的函数。

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

模型评估

费尔南多选择了最好的型号。该模型将使用引擎大小、马力和汽车宽度来估算价格。他想评估模型在训练和测试数据上的性能。

回想一下,他将数据分成了训练集和测试集。Fernando 使用训练数据训练模型。测试数据是看不见的数据。Fernando 根据测试数据评估模型的性能。这是真正的考验。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在训练数据上,该模型表现得相当好。 调整后的 R 平方为 0.815 = >该模型可以解释训练数据 81%的变异。然而,要使模型被接受,它还需要在测试数据上表现良好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fernando 在测试数据集上测试模型性能。模型根据测试数据计算出调整后的 R 平方为 0.7984。这意味着即使在看不见的数据上,模型也能解释 79.84%的变化。

结论

费尔南多现在有了一个简单而有效的模型来预测汽车价格。但是发动机大小,马力,宽度的单位不一样。他沉思着。

  • 如何使用通用的比较单位来估计价格变动?
  • 发动机尺寸、马力和宽度的价格弹性如何?

本系列的下一篇文章即将发表。它将讨论转换多元回归模型以计算弹性的方法。

原载于 2017 年 8 月 9 日datascientia . blog

数据科学简化版第 7 部分:对数回归模型

原文:https://towardsdatascience.com/data-science-simplified-part-7-log-log-regression-models-499ecd1495f0?source=collection_archive---------3-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在本系列的最后几篇博文中,我们讨论了简单线性回归模型。我们讨论了多元回归模型选择正确模型的方法。

费尔南多现在创造了一个更好的模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

费尔南多考虑了以下几点:

  • 如何使用通用的比较单位来估算价格变化?
  • 发动机尺寸、马力和宽度的价格弹性如何?

在这篇文章中将会解决这个问题。本文将详细介绍双对数回归模型。

概念:

为了解释对数回归模型的概念,我们需要后退两步。首先让我们了解导数、对数、指数的概念。然后我们需要理解弹性的概念。

衍生品:

让我们回到高中数学。遇见衍生品。高中数学和物理中教授的最迷人的概念之一。

导数是表示变化的一种方式,即函数在某一给定点的变化量。

变量 y 是 x 的函数,定义 y 为:

y = f(x)

我们对 y 相对于 x 求导,表示如下:

dy/dx = df(x)/dx = f’(x)

这意味着:

  • y 相对于 x 的变化,即如果 x 改变,y 会改变多少?

难道不是费尔南多想要的吗?他想知道价格(y)相对于其他变量(cityMpg 和 highwayMpg)的变化。

回想一下,多元回归模型的一般形式如下:

y =β0+β1 . x1+β2 . x2+…+βn . xn+𝛆

假设 Fernando 构建了以下模型:

价格= β0 + β1。发动机尺寸,即将价格表示为发动机尺寸的函数。

费尔南多对价格和引擎大小进行了求导。他不应该能够根据发动机尺寸的变化来表达价格的变化吗?

唉,事情没那么简单。线性回归模型假设线性关系。线性关系定义为:

y = mx + c

如果计算 y 对 x 的导数,则得出以下结果:

dy/dx = m . dx/dx + dc/dx

  • 某物相对于自身的变化总是 1,即 dx/dx = 1
  • 常数相对于任何事物的变化总是 0。这就是为什么它是一个常数。不会变的。即 dc/dx = 0

等式现在变成了:

dy/dx = m

对发动机尺寸的价格应用导数只会产生发动机尺寸的系数。

一定有办法改变它。又来了两个数学字符。满足指数和对数。

指数:

现在让我们看看指数。这个字符又是高中数学中的一个常见字符。指数是一个有两个算子的函数。底数(b)和指数(n)。它被定义为 b^n 。它的形式是:

f(x) = b^x

基数可以是任何正数。欧拉数(e)也是统计学中常用的基数。

几何上,指数关系具有以下结构:

  • x 的增加不会导致 y 的相应增加,直到达到一个阈值。
  • 在阈值之后,对于 x 的小幅度增加,y 的值迅速上升。

对数:

对数是一个有趣的字符。让我们只了解它适用于回归模型的个性。对数的基本性质是它的底。对数的典型底数是 2、10 或 e。

让我们举一个例子:

  • 我们乘多少个 2 得到 8?2 x 2 x 2 = 8,即 3
  • 这也可以表示为:log2(8) = 3

以 2 为底的 8 的对数是 3

对数还有另一个共同的基础。它被称为“欧拉数(e)”其近似值为 2.71828。它在统计学中被广泛使用。以 e 为底的对数称为自然对数。

它还具有有趣的变革能力。它将 指数关系转化为线性关系。 让我们看一个例子:

下图显示了 y 和 x 之间的指数关系:

如果对数同时应用于 x 和 y,则 log(x)和 log(y)之间的关系是线性的。它看起来像这样:

弹性:

弹性是衡量一个经济变量对另一个经济变量变化的反应程度。

假设我们有一个函数:Q = f§那么 Q 的弹性定义为:

E = P/Q x dQ/dP

  • dq/dP 是 Q wrt 变化在 p 中的平均变化。

将所有这些整合在一起:

现在让我们把这三个数学特征放在一起。导数、对数和指数。他们的交战规则如下:

  • e 的对数是 1,即 log(e) = 1
  • 指数的对数是指数乘以底数。
  • log(x)的导数是:1/x

让我们举一个例子。想象一个函数 y,表示如下:

  • y = b^x.
  • => log(y) = x log (b)

那么对于线性回归模型意味着什么呢?我们可以利用导数、对数和指数来玩数学杂耍吗?能不能改写线性模型方程,求 y 的变化率 wrt 在 x 的变化率?

首先,让我们把 y 和 x 之间的关系定义为指数关系

  1. y = α x^β
  2. 我们先把这个表示成 log-log 的函数: log(y) = log(α) + β。log(x)
  3. 方程#1 看起来不像回归模型吗:Y= β0 + β1。x1?其中β0 = log(α);β1 = β.这个方程现在可以改写为: log(y) = β0 + β1。log(x1)
  4. 但是它是如何代表弹性的呢?让我们对 log(y) wrt x 求导,我们得到如下结果:
  • d. log(y)/ dx = β1。log(x1)/dx。
  • => 1/y . dy/dx = β1。1/x => β1 = x/y . dy/dx。
  • β1 的方程就是弹性。

模型构建:

现在我们理解了这个概念,让我们看看费尔南多是如何建造模型的。他建立了以下模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

log(价格)= β0 + β1。log(发动机尺寸)+ β2。log(马力)+ β3。原木(宽度)

他想估计汽车价格的变化,作为发动机尺寸、马力和宽度变化的函数。

Fernando 在其统计包中训练该模型,并获得以下系数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该模型的方程式为:

log(价格)= -21.6672 + 0.4702.log(引擎大小)+ 0.4621.log(马力)+ 6.3564。原木(宽度)

以下是对模型的解释:

  • 所有系数都是重要的。
  • 调整后的 r 平方为 0.8276 = >该模型解释了 82.76% 的数据变异。
  • 如果发动机尺寸 增加 4.7% 那么汽车价格增加 10%。
  • 如果马力增加 4.62% 那么汽车价格增加 10%。
  • 如果汽车宽度增加 6% ,那么汽车的价格就会增加 1 %。

模型评估:

Fernando 现在已经建立了双对数回归模型。他评估模型在训练和测试数据上的性能。

回想一下,他将数据分为训练集和测试集。训练数据用于创建模型。测试数据是看不见的数据。测试数据的性能才是真正的考验。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在训练数据上,该模型表现得相当好。调整后的 R 平方为 0.8276 = >该模型可以解释训练数据的 82.76%的变化。要使模型可以接受,它还需要在测试数据上表现良好。

Fernando 在测试数据集上测试模型性能。该模型根据测试数据计算出调整后的 r 平方为 0.8186。这很好。这意味着即使在看不见的数据上,模型也能解释 81.86%的变异。

请注意,该模型估计的是日志(价格),而不是汽车的价格。要将估算的 log(价格)转换成价格,需要有一个转换。

该转换将对数(价格)视为 e 的指数。

e^log(price)=价格

结论:

最近的几篇帖子是一段相当长的旅程。统计学习奠定了基础。假设检验讨论了无效假设和替代假设的概念。简单的线性回归模型使回归变得简单。然后我们进入了多元回归模型的世界。接着讨论型号选择方法。在这篇文章中,我们讨论了对数回归模型。

到目前为止,建立的回归模型只有数字自变量。下一篇文章我们将讨论交互作用和定性变量的概念。

原载于 2017 年 8 月 14 日datascientia . blog

数据科学简化版第 8 部分:回归模型中的定性变量

原文:https://towardsdatascience.com/data-science-simplified-part-8-qualitative-variables-in-regression-models-d1817d56245c?source=collection_archive---------4-----------------------

本系列的最后几篇博文讨论了回归模型。费尔南多选择了最佳车型。他建立了一个多元回归模型。该模型采用以下形状:

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

该模型预测或估计价格(目标),作为发动机尺寸、马力和宽度(预测值)的函数。该模型将所有预测值作为数值。

如果有定性变量呢?如何使用定性变量来增强模型?定性变量是如何解释的?

这是这篇博文将要回答的几个问题。

费尔南多得到两个这样的定性变量:

  • 燃料类型:使用的燃料类型。该值可以是天然气或柴油。
  • 驱动轮:驱动轮的类型。它有三个值 4 轮(四轮驱动),后轮(RWD)和前轮(前轮)。

数据集是这样的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

费尔南多想找出这些定性变量对汽车价格的影响。

概念

定性变量是非数值变量。它将数据分类。它们也被称为分类变量因子。

因素有层次。水平只不过是特定定性变量的唯一值。

  • 燃料类型有两个唯一的值。汽油还是柴油。这意味着燃料类型有两个因素。
  • 驱动轮有三个独特的价值。四轮驱动,后轮驱动和前轮驱动。这意味着驱动轮有三个因素。

当回归模型使用定性变量时,统计引擎会创建虚拟变量。虚拟变量的概念很简单。它只需要两个值 0 或 1。

让我们看一个例子。样本数据有 5 辆汽车,每辆汽车都有柴油或气体燃料类型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

燃料类型是一个定性变量。它有两个级别(柴油或天然气)。统计软件包创建一个虚拟变量。它创建了一个名为 fuelTypegas 的伪变量。此变量采用 0 或 1 值。如果燃料类型是气体,则虚拟变量为 1,否则为 0。

数学上,它可以写成:

  • 如果燃料类型是气体,xi = 1
  • xi = 0 表示燃料类型为柴油

回归模型创建的虚拟变量的数量比定性变量中的数字因子值少一个。

让我们来看看它是如何在回归模型中表现出来的。仅将价格和燃料类型作为输入的简单回归模型提供了以下系数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

只有一个系数和一个截距。回归模型为定性变量(本例中为气体)的因子值创建一个虚拟变量。

上面写着:

  • 如果虚拟变量为 0,即汽车的燃料类型为柴油,则价格= 18348 + 0 x (-6925) = $18348
  • 如果虚拟变量为 1,即汽车的燃料类型为天然气,则价格= 18348 + 1 x (-6925) = $11423

具有两个因素水平的定性变量的处理方式是清楚的。两级以上的变量呢?让我们检查另一个例子来理解它。

驱动轮是一个有三个因素的定性变量。在这种情况下,回归模型创建了两个虚拟变量。让我们看一个例子。样本数据有 4 辆汽车。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建了两个虚拟变量:

  • 驱动轮前进:如果驱动轮类型是前进,则为 1,否则为 0
  • 如果驱动轮类型是 rwd,则为 1,否则为 0

数学上,它可以写成:

  • 如果驱动轮向前,xi1 = 1;如果驱动轮不向前,则为 0。
  • 如果驱动轮是后轮,xi2 = 1;如果驱动轮不是后轮,则为 0。

请注意,4WD 没有虚拟变量。

它们在回归模型中是如何体现的?回归模型处理它们的方式如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 首先,它为价格估算创建了一个 基线 。基线是没有创建虚拟变量的定性变量的平均价格。这是截距值。基线方程适用于 4WD。这是一辆四轮驱动汽车的平均价格。
  • 对于前轮驱动:前轮驱动的平均价格估计为**基线+1×前轮驱动系数。**即价格= 7603+1×1405+0×10704 = 9008 美元。这意味着平均来说,一辆四轮驱动汽车比一辆四轮驱动汽车贵 1405 美元。
  • 对于 RWD:后轮驱动(红色)的价格估计为**基线+1 x RWD 系数。**即价格= 7603+0×1405+1×10704 = 18307 美元。这意味着平均而言,一辆后轮驱动汽车比一辆四轮驱动汽车贵 10704 美元。

所有具有两个以上因子值的定性变量都以类似方式处理。

模型结构

既然定性变量的处理机制。让我们看看费尔南多是如何将其应用到他的模型中的。他最初的模型如下:

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

他增加了两个定性变量。燃料类型和车轮驱动。该模型的一般形式写为:

价格= β0 + β1 .发动机尺寸+ β2 .马力+ β3 .宽度+ β4 .燃油类型+β5 .驱动轮 fwd + β6 .驱动轮 rwd

Fernando 在其统计包中训练该模型,并获得以下系数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该模型的方程式为:

*价格= -76404.83 + 57.20 *发动机尺寸+ 23.72 *马力+ 1214.42 *宽度— 1381.47 *燃油类型气-344.62 *驱动轮 fwd + 2189.16 驱动轮 rwd

这里混合了定量和定性变量。变量是相互独立的。现在让我们来解释这些系数:

  • β0:注意,没有为柴油汽车和 4WD 汽车创建虚拟变量。 *β0 代表柴油和 4WD 汽车的平均价格。*是负值。这意味着,如果有柴油四轮驱动,平均价格将是负值。这是不可能的。该模型可能违反了线性回归假设。
  • β1:这种解释与多元回归的解释相同。 发动机尺寸增加 1 个单位,解释为汽车价格平均增加。 发动机尺寸每增加 1 个单位,汽车价格平均增加 57 美元。
  • β2:这种解释与多元回归的解释相同。 马力增加 1 个单位,解释为车价平均增加。 马力增加 1 个单位,汽车价格平均增加 23.72 美元。
  • β3:这种解释与多元回归的解释相同。 宽度增加 1 个单位,解释为车价平均增加。 宽度增加 1 个单位,汽车价格平均增加 1214.42 美元。
  • β4:该系数是虚拟变量(燃料型气体)的结果。 它解释为柴油汽车和燃气汽车的平均价格差。 这意味着,平均而言,一辆燃油型汽车比一辆柴油车便宜 1381.47 美元。
  • β5:该系数是虚拟变量(驱动轮向前)的结果。 它解释为四轮驱动和四轮驱动汽车之间的平均价格差。这意味着平均来说,一辆四轮驱动汽车要比一辆四轮驱动汽车便宜 344.62 美元。
  • β6:该系数是虚拟变量(驱动轮 rwd)的结果。 它被解释为一辆四轮驱动汽车和一辆 RWD 汽车之间的平均价格差。这意味着平均来说,一辆 RWD 轿车要比一辆四轮驱动轿车贵 2189.16 美元。
  • 调整后的 r 平方为 0.8183。这意味着该模型解释了训练数据中 81.83%的变异。
  • 请注意,并非所有系数都很重要。 事实上,在这种情况下,定性变量对模型表现没有意义。

结论

这个模型并不比最初创建的模型更好。然而,它已经完成了它的工作。 我们了解回归模型中定性变量的解释方式。 很明显,原来的型号配 马力,引擎尺寸和宽度比 要好。然而,他想知道:马力、发动机尺寸和宽度是分开处理的。

马力、发动机尺寸、宽度有关系怎么办?这些关系可以建模吗?

本系列的下一篇博文将回答这些问题。它将解释互动的概念。

原载于 2017 年 8 月 19 日datascientia . blog

数据科学简化版第 9 部分:回归模型的相互作用和局限性

原文:https://towardsdatascience.com/data-science-simplified-part-9-interactions-and-limitations-of-regression-models-4702dff03820?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在本系列的最后几篇博文中,我们详细讨论了回归模型。费尔南多建立了一个多元回归模型。该模型采用以下形状:

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

该模型预测或估计价格(目标),作为发动机尺寸、马力和宽度(预测值)的函数。

回想一下,多元回归模型假设独立预测因子之间是独立的。它将马力、发动机尺寸和宽度视为不相关。

实际上,变量很少是独立的。

如果马力、发动机尺寸和宽度之间有关系呢?这些关系可以建模吗?

这篇博文将回答这个问题。它将解释互动的概念。

概念:

预测值之间的独立性意味着如果一个预测值发生变化,它会对目标产生影响。这种影响与其他预测因子的存在或变化无关。目标和预测值之间的关系是加性和线性的。

让我们举个例子来说明一下。费尔南多的方程式是:

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

它被解释为发动机尺寸的单位变化使价格变化 87.34 美元。

这种解释从来没有考虑到发动机的尺寸可能与汽车的宽度有关。

难道不能是车越宽,发动机越大吗?

第三个预测值捕捉引擎和宽度之间的相互作用。这个第三预测值被称为 相互作用项。

由于发动机尺寸和宽度之间的相互作用项,回归模型具有以下形状:

价格= β0 + β1。发动机尺寸+ β2。马力+ β3。宽度+ β4。(发动机尺寸。宽度)

方程的部分 *(β1。发动机尺寸+ β3。宽度)*称为主效果。

术语发动机尺寸 x 宽度是相互作用术语。

这个术语如何描述发动机尺寸和宽度之间的关系?我们可以将这个等式重新排列为:

价格= β0 + (β1 + β4。宽度)发动机尺寸+ β2。马力+ β3。宽度

现在,β4 可以解释为宽度增加 1 个单位对发动机尺寸的影响。

模型构建:

费尔南多将这些数据输入他的统计包。该包计算参数。输出如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式变为:

价格= 51331.363–1099.953 x 发动机尺寸+ 45.896 x 马力— 744.953 x 宽度+ 17.257 x 发动机尺寸:宽度

价格= 51331.363—(1099.953–17.257 x 宽度)发动机尺寸+ 45.896 x 马力— 744.953 x 宽度

让我们来解释这些系数:

  • 发动机尺寸、马力和发动机尺寸:宽度(交互项)是重要的。
  • 汽车的宽度并不重要。
  • 发动机尺寸增加 1 个单位,价格降低 1099.953 美元。
  • 马力增加 1 单位,价格增加 45.8 美元。
  • 相互作用项是重要的。这意味着真正的关系不是相加的。
  • 发动机尺寸增加 1 个单位,价格也会增加(1099.953–17.257 x 宽度)。
  • 测试数据的校正 r 平方为 0.8358 = >该模型解释了 83.5%的变化。

注意,汽车的宽度并不重要。那么将其纳入模型有意义吗?

这里出现了一个叫做的等级原则。

分层原则: 当交互包含在模型中时,主特效也需要包含在模型中。即使单个变量在模型中不显著,也需要包括主要影响。

Fernando 现在运行模型,并根据测试数据测试模型性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该模型在测试数据集上表现良好。测试数据的调整后 r 平方为 0.8175622 = >该模型解释了 81.75%的未知数据变化。

费尔南多现在有一个最优模型来预测汽车价格和购买汽车。

回归模型的局限性

回归模型是数据科学的主力。这是数据科学家工具箱中的一个神奇工具。当被有效利用时,他们在解决许多现实生活中的数据科学问题方面表现惊人。然而,它们也有其局限性。简单解释了回归模型的三个局限性:

非线性关系:

线性回归模型假设变量之间是线性的。如果关系不是线性的,那么线性回归模型可能不会如预期的那样执行。

实用提示:使用 log 等变换将非线性关系转换为线性关系

多重共线性:

共线性是指两个预测变量相互关联的情况。当有许多预测因子并且这些预测因子之间存在相关性时,称为多重共线性。如果预测值彼此相关,那么特定预测值对目标的影响就很难被隔离。

实用提示:通过仔细选择预测器使模型更简单。限制选择过多的相关预测因子。或者,使用像主成分这样的技术来创造新的不相关变量。

异常值的影响:

异常值是指远离模型预测值的点。如果目标变量中有异常值,模型会被拉伸以适应它们。对少数异常点进行了过多的模型调整。这使得模型偏向异常值。这对大多数人来说都没有什么好处。

实用提示:去除建模中的离群点。如果目标中有太多的异常值,可能需要多个模型。

结论:

这是一段不平凡的旅程。在最近几篇博文中,简单线性回归模型被解释。然后我们又涉猎了多元回归模型对型号选择方法进行了探讨。处理定性变量和交互作用也进行了讨论。

在本系列的下一篇文章中,我们将讨论另一种监督学习模型:分类。

原载于 2017 年 8 月 27 日datascientia . blog*。*

数据科学简化版第 4 部分:简单线性回归模型

原文:https://towardsdatascience.com/data-science-simplified-simple-linear-regression-models-3a97811a6a3d?source=collection_archive---------1-----------------------

在本系列之前的文章中,我们讨论了统计学习假设检验的概念。在本文中,我们深入线性回归模型。

在我们开始之前,让我们回忆一下统计学习的一些重要方面。

自变量和因变量:

在统计学习的背景下,有两种类型的数据:

  • 自变量:可以直接控制的数据。
  • 因变量:不能直接控制的数据。

无法控制的数据,即需要预测或估计的因变量。

型号:

模型是一个转换引擎,帮助我们将因变量表达为自变量的函数。

参数:

参数是添加到模型中用于估计产量的成分。

概念

线性回归模型为监督学习提供了一种简单的方法。它们简单而有效。

等等,我们说的线性是什么意思?

Linear 含有如下含义:沿着直线或近似直线排列或延伸。线性表明因变量和自变量之间的关系可以用直线表示。

回忆一下高中的几何课。一条线的方程是什么?

y = mx + c

线性回归不过是这个简单方程的一种表现形式。

  • y 是因变量,即需要估计和预测的变量。
  • x 是自变量,即可控变量。它是输入。
  • m 是斜率。它决定了线的角度。它是表示为β的参数。
  • c 是截距。当 x 为 0 时,决定 y 值的常数。

英国著名统计学家乔治·博克斯曾经引用过:

“所有的模型都是错的;有些是有用的。”

线性回归模型并不完美。它试图用一条直线来近似因变量和自变量之间的关系。近似导致误差。可以减少一些误差。有些错误是问题的本质所固有的。这些错误无法消除。它们被称为不可约误差,真实关系中的噪声项,任何模型都无法从根本上减少。

同一条直线的等式可以改写为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

β0 和β1 是代表截距和斜率的两个未知常数。它们是参数。

ε 是误差项。

制定

让我们通过一个例子来解释线性回归模型的术语和工作原理。

费尔南多是一名数据科学家。他想买一辆汽车。他想估计或预测他将要支付的汽车价格。他有一个朋友在汽车经销公司。他询问了各种其他汽车的价格以及该车的一些特性。他的朋友向他提供了一些信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下是向他提供的数据:

  • 品牌:汽车的品牌。
  • 燃料类型:汽车使用的燃料类型。
  • nDoor:门的数量。
  • 引擎大小:汽车引擎的大小。
  • 价格:汽车的价格。

首先,Fernando 想要评估他是否真的可以根据引擎大小预测汽车价格。第一组分析寻求以下问题的答案:

  • 汽车价格与发动机大小有关吗?
  • 关系有多牢固?
  • 关系是线性的吗?
  • 我们能根据发动机尺寸预测/估算汽车价格吗?

费尔南多做了相关分析。相关性是两个变量相关程度的度量。它是通过一种叫做相关系数的度量来衡量的。其值介于 0 和 1 之间。

如果相关系数是一个大的(> 0.7) +ve 数,这意味着当一个变量增加时,另一个变量也增加。大的 ve 值表示一个变量增加,另一个变量减少。

他做了相关分析。他绘制了价格和发动机尺寸之间的关系。

他将数据分为训练集和测试集。75%的数据用于训练。剩余的用于测试。

他建立了一个线性回归模型。他使用统计软件包来创建模型。该模型创建了一个线性方程,将汽车的价格表示为发动机尺寸的函数。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下是问题的答案:

  • 汽车价格与发动机大小有关吗?
  • 是的,有关系。
  • 关系有多牢固?
  • 相关系数为 0.872 = >有很强的相关性。
  • 关系是线性的吗?
  • 一条直线可以拟合= >使用发动机尺寸可以做出合理的价格预测。
  • 我们可以根据发动机尺寸预测/估算汽车价格吗?
  • 是的,汽车价格可以根据发动机的大小来估算。

Fernando 现在想要建立一个线性回归模型,根据发动机的大小来估算汽车的价格。将方程式叠加到汽车价格问题上,Fernando 为价格预测制定了以下方程式。

价格= β0 + β1 x 发动机尺寸

模型建立和解释

模型

回想一下早先的讨论,关于数据需要如何被分成训练测试集合。训练数据用于了解数据。训练数据用于创建模型。测试数据用于评估模型性能。

Fernando 将数据分为训练集和测试集。75%的数据用于训练。剩余的用于测试。他建立了一个线性回归模型。他使用统计软件包来创建模型。该模型产生一个线性方程,该方程将汽车的价格表示为发动机尺寸的函数。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

他将数据分为训练集和测试集。75%的数据用于训练。剩余的用于测试。

他建立了一个线性回归模型。他使用统计软件包来创建模型。该模型创建了一个线性方程,将汽车的价格表示为发动机尺寸的函数。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该模型估计参数:

  • β0 估计为-6870.1
  • β1 估计为 156.9

线性方程估计为:

价格= -6870.1 + 156.9 x 发动机尺寸

解释

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该模型提供了在给定特定发动机尺寸的情况下预测平均汽车价格的方程式。该等式的含义如下:

发动机尺寸每增加一个单位,汽车均价就会增加 156.9 个单位。

估价

模型已经建立。需要评估模型的稳健性。我们怎么能确定这个模型能够预测出令人满意的价格呢?这一评估分两部分进行。首先,测试以建立模型的稳健性。第二,测试评估模型的准确性。

Fernando 首先根据训练数据评估模型。他得到了以下统计数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

里面有很多统计数据。让我们把重点放在关键的(用红色标记的)。回想一下关于假设检验的讨论。使用假设检验评估模型的稳健性。

需要定义 H0 和 Ha。它们的定义如下:

  • H0(零假设):x 和 y 之间没有关系,即价格和发动机尺寸之间没有关系。
  • Ha(替代假设):x 和 y 之间存在某种关系,即价格和发动机尺寸之间存在某种关系。

**β1:**β1 的值决定了价格和发动机大小的关系。如果β1 = 0,则没有关系。在这种情况下,β1 为正。这意味着价格和发动机尺寸之间有某种关系。

**t-stat:**t-stat 值是系数估计值(β1)远离零多少个标准差。此外,价格和发动机尺寸之间的关系越远离零越强。系数是显著的。在这种情况下,t-stat 是 21.09。离零足够远了。

p 值: p 值是一个概率值。它表示在假设零假设为真的情况下,看到给定 t 统计量的机会。如果 p 值很小,例如< 0.0001,这意味着这是偶然的且没有关系的概率很低。在这种情况下,p 值很小。这意味着价格和引擎之间的关系不是偶然的。

有了这些指标,我们可以安全地拒绝零假设,接受替代假设。 价格和发动机尺寸之间有着密切的关系

关系就建立了。准确性怎么样?模型有多精确?为了感受模型的准确性,一个名为 R 平方或决定系数的度量是很重要的。

**R 平方或决定系数:**为了理解这些指标,让我们把它分解成它的组成部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 误差(e) 是实际 y 和预测 y 之间的差值。预测 y 表示为ŷ.对每个观察值评估该误差。这些误差也被称为残差。
  • 然后将所有剩余值平方并相加。这一项称为**残差平方和(RSS)。**RSS 越低越好。
  • R 平方的等式还有另一部分。为了得到另一部分,首先,计算实际目标的平均值,即估计汽车价格的平均值。然后计算平均值和实际值之间的差异。然后将这些差值平方并相加。它是总平方和(TSS)。
  • R 平方 a.k .决定系数计算为 1- RSS/TSS。此指标解释了模型预测值与实际值的平均值之间的差异分数。该值介于 0 和 1 之间。它越高,模型就越能解释方差。

让我们看一个例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上面的例子中,RSS 是基于三辆汽车的预测价格计算的。RSS 值是 41450201.63。实际价格的平均值是 11021。TSS 计算为 44,444,546。r 平方计算为 6.737%。对于这三个特定的数据点,模型只能解释 6.73%的变化。不够好!!

然而,对于费尔南多的模型,这是一个不同的故事。训练集的 R 平方为 **0.7503,即 75.03%。**这意味着该模型可以解释 75%以上的变异。

结论

瞧啊。!费尔南多现在有一个很好的模型。它在训练数据上的表现令人满意。但是,有 25%的数据无法解释。有改进的余地。增加更多的独立变量来预测价格怎么样?当添加一个以上的自变量来预测因变量时,会创建一个多元回归模型,即一个以上的变量。

本系列的下一期将更深入地研究多元回归模型。敬请关注。

数据科学技能:使用 python 进行网页抓取 javascript

原文:https://towardsdatascience.com/data-science-skills-web-scraping-javascript-using-python-97a29738353f?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 python 有不同的抓取网页的方法。在我的上一篇文章中,我通过使用库:requestsBeautifulSoup介绍了 web 抓取。然而,许多网页是动态的,并且使用 JavaScript 来加载它们的内容。这些网站通常需要不同的方法来收集数据。

[## 数据科学技能:使用 python 进行网络搜集

作为一名数据科学家,我在工作中接受的第一批任务之一就是网络搜集。这完全是…

towardsdatascience.com](/data-science-skills-web-scraping-using-python-d1a85ef607ed)

在本教程中,我将介绍几种收集包含 Javascript 的网页内容的不同方法。使用的技术如下:

  1. selenium与 Firefox 网络驱动一起使用
  2. 使用带phantomJS的无头浏览器
  3. 使用 REST 客户端或 python requests库进行 API 调用

TL;DR 关于用 python 抓取 javascript 网页的例子,你可以在 GitHub 上找到本教程涵盖的完整代码。

2019 年 11 月 7 日更新:请注意,被抓取的网页的 html 结构可能会随着时间的推移而更新,本文最初反映的是 2018 年 11 月发布时的结构。这篇文章现在已经更新,可以在当前网页上运行,但将来可能会再次改变。

第一步

开始教程,我首先需要找到一个网站刮。在继续使用 web scraper 之前,务必检查您计划抓取的网站上的条款和条件以及隐私政策,以确保您没有违反他们的任何使用条款。

动机

当试图找到一个合适的网站来演示时,我首先看到的许多例子都明确表示禁止使用网络爬虫。直到看了一篇关于酸奶含糖量的文章,想知道在哪里可以找到最新的营养信息,激发了我在哪里可以找到合适的网站的另一个思路;网上超市。

在线零售商通常有使用 javascript 加载内容的动态网页,因此本教程的目的是从在线超市的网页中抓取酸奶的营养信息。

设置您的环境

由于我们将使用一些新的 python 库来访问网页内容和处理数据,这些库将需要使用您常用的 python 包管理器pip来安装。如果你还没有beautifulsoup,那么你也需要在这里安装它。

pip install selenium
pip install pandas

要使用selenium作为网络驱动程序,还有一些额外的要求:

火狐浏览器

我将使用 Firefox 作为我的网络驱动程序的浏览器,所以这意味着你要么需要安装 Firefox 来跟随这个教程,要么你可以使用 Chrome 和 Chrome。

壁虎

要使用 web 驱动程序,我们需要安装一个 web 浏览器引擎 geckodriver。您需要为您的操作系统下载 geckodriver ,提取文件并设置可执行路径位置。

您可以通过几种方式来完成此操作:
(i)将 geckodriver 移动到您选择的目录中,并在您的 python 代码中定义此可执行路径(参见后面的示例),

(ii)将 geckodriver 移动到一个已经设置为可执行文件所在目录的目录中,这就是您的环境变量 path。
您可以通过以下方式找到您的$PATH中有哪些目录:

窗口 转到:

控制面板>环境变量>系统变量>路径

Mac OSX / Linux
在你的终端中使用命令:

echo $PATH

(iii)将壁虎驱动程序位置添加到您的PATH环境变量中

窗口
窗口
转到:

控制面板>环境变量>系统变量>路径>编辑

Mac OSX / Linux 给你的.bash_profile (Mac OSX)或者.bash_rc (Linux)加一行

# add geckodriver to your PATH
export PATH="$PATH:/path/to/your/directory"

重新启动您的终端,并使用(ii)中的命令检查您的新路径是否已经添加。

幻象

类似于 geckodriver 的步骤,我们也需要下载 PhantomJS 。下载完成后,按照上述相同的说明,解压文件并移动到选择的目录或添加到可执行文件路径。

REST 客户端

在这篇博客的最后一部分,我们将使用 REST 客户端向 API 发出请求。我将使用失眠,但是你可以随意使用你喜欢的任何一个客户端!

使用 BeautifulSoup 抓取网页

按照我的web 抓取入门教程中概述的标准步骤,我检查了网页,并想要提取重复的 HTML 元素:

<div data-cid="XXXX" class="listing category_templates clearfix productListing ">...</div>

作为第一步,您可以尝试使用 BeautifulSoup 通过以下脚本提取这些信息。

# import libraries
import urllib.request
from bs4 import BeautifulSoup# specify the url
urlpage = '[https://groceries.asda.com/search/yogurt'](https://groceries.asda.com/search/yoghurt') 
print(urlpage)
# query the website and return the html to the variable 'page'
page = urllib.request.urlopen(urlpage)
# parse the html using beautiful soup and store in variable 'soup'
soup = BeautifulSoup(page, 'html.parser')
# find product items
# at time of publication, Nov 2018:
# results = soup.find_all('div', attrs={'class': 'listing category_templates clearfix productListing'})# updated Nov 2019:
results = soup.find_all('div', attrs={'class': 'co-product'})
print('Number of results', len(results))

没想到的是,在运行 python 脚本时,即使我在网页上看到很多结果,返回的结果数也是 0!

[https://groceries.asda.com/search/yoghurt](https://groceries.asda.com/search/yoghurt)
BeautifulSoup - Number of results 0

当进一步检查页面时,网页上有许多动态特征,这表明 javascript 用于呈现这些结果。
右键单击并选择View Page Source有许多<script>元素在使用中,搜索上面包含我们感兴趣的数据的元素不会返回匹配结果。

抓取该网页的第一种方法是使用 Selenium web driver 调用浏览器,搜索感兴趣的元素并返回结果。

使用 Selenium 抓取网页

1.硒配壁虎

由于我们无法使用 Beautiful Soup 访问 web 页面的内容,我们首先需要在 python 脚本中设置一个 web 驱动程序。

# import libraries
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import pandas as pd# specify the url
urlpage = '[https://groceries.asda.com/search/yogurt'](https://groceries.asda.com/search/yoghurt') 
print(urlpage)
# run firefox webdriver from executable path of your choice
driver = webdriver.Firefox(executable_path = 'your/directory/of/choice')

正如在安装 geckodriver 时提到的,如果可执行文件不在可执行路径中,我们可以在 python 脚本中定义路径。如果它在一个可执行路径中,那么上面的行变成:

# run firefox webdriver from executable path of your choice
driver = webdriver.Firefox()

设置完成后,我们现在可以连接到网页并找到感兴趣的元素。当在浏览器中加载网页时,结果通常需要一段时间来加载,甚至可能直到我们向下滚动页面时才加载。
考虑到这一点,我们可以为 web 驱动程序添加一些 javascript 来执行这些操作。下面是一个让页面滚动的简单例子,有更有效的方法可以做到这一点,为什么不在这里测试你自己的 javascript,让我在评论中知道什么最适合你!

我们还添加了一个睡眠时间,作为等待页面完全加载的另一种方法。

# get web page
driver.get(urlpage)
# execute script to scroll down the page
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage;")
# sleep for 30s
time.sleep(30)
# driver.quit()

如果我们现在运行脚本(你也可以在最后取消对driver.quit()的注释以确保浏览器关闭),当你的 python 脚本运行时,Firefox 将打开指定的 url 并向下滚动页面。希望在脚本运行完成之前,您应该已经加载了许多产品。

接下来,我们要获取感兴趣的元素。以前,我们使用 Beautiful Soup 试图根据标签和类属性查找所有元素,但是,在本例中,我们将使用一种稍微不同的方法来访问产品信息。相反,我们可以基于 XML 结构或 css 选择器,通过 xpath 搜索元素。

我们可以检查感兴趣的元素,在工具栏中,右键单击突出显示的元素,然后复制>复制 xpath(或复制选择器)。这是理解 html 结构的另一种有趣的方式。在这种情况下,我们将使用 xpath 来查找元素,然后我们可以打印匹配的结果数:

# find elements by xpath# at time of publication, Nov 2018:
# results = driver.find_elements_by_xpath("//*[[@id](http://twitter.com/id)='componentsContainer']//*[contains([@id](http://twitter.com/id),'listingsContainer')]//*[[@class](http://twitter.com/class)='product active']//*[[@class](http://twitter.com/class)='title productTitle']")# updated Nov 2019:
results = driver.find_elements_by_xpath("//*[@class=' co-product-list__main-cntr']//*[@class=' co-item ']//*[@class='co-product']//*[@class='co-item__title-container']//*[@class='co-product__title']")
print('Number of results', len(results))

使用 xpath 而不是使用元素的一个主要原因是结果有一些元素,其中 id 的词干是带有一些附加单词的listingsContainer,所以contains函数被用来选择所有结果,但也排除了容器中的任何其他div元素,例如广告。

Firefox Webdriver - Number of results 38

现在我们已经有了页面的一些结果,我们可以循环每个结果并保存感兴趣的数据。在这种情况下,我们可以保存产品名称和链接。

注意,网页上实际上有 38 个以上的结果。根据连接到页面时加载的结果数量,这个数字也可能会有所不同。所有的结果都可以通过改变我们执行的 javascript 来收集,或者其他的方法将在下面的章节中探讨。

# create empty array to store data
data = []
# loop over results
for result in results:
    product_name = result.text
    link = result.find_element_by_tag_name('a')
    product_link = link.get_attribute("href")
    # append dict to array
    data.append({"product" : product_name, "link" : product_link})

在这个循环之外,我们可以关闭浏览器,因为我们导入了pandas库,我们可以通过将我们抓取的数据保存到 dataframe 来利用它。我们可以打印数据帧来查看内容。

# close driver 
driver.quit()
# save to pandas dataframe
df = pd.DataFrame(data)
print(df)

在这种格式下,我们可以非常简单地将数据写入 csv。

# write to csv
df.to_csv('asdaYogurtLink.csv')

将 Selenium 与 geckodriver 一起使用是一种快速抓取使用 javascript 的网页的方法,但也有一些缺点。我发现有时页面无法加载(我确信通过改变我们如上所述执行的 javascript 可以更有效,但是我是 JS 新手,所以这可能需要一些时间),但是加载浏览器和等待页面加载也需要时间。

另一个选择,我们可以使用无头浏览器。这将加快抓取速度,因为我们不必每次都等待浏览器加载。

2.带无头浏览器的 Selenium

当使用 PhantomJS 代替 geckodriver 作为无头浏览器时,唯一的区别是 web 驱动程序是如何加载的。这意味着我们可以遵循上面的方法,但是改变初始化 web 驱动程序的行,变成:

# run phantomJS webdriver from executable path of your choice
driver = webdriver.PhantomJS(executable_path = 'your/directory/of/choice')

这里要注意的是,对 PhantomJS 的 Selenium 支持已经贬值,并提供了一个警告。

通过使用 headless 选项,还可以对 geckodriver 使用 headless 模式:

from selenium import webdriver
from selenium.webdriver.firefox.options import Optionsoptions = Options()
options.headless = True
driver = webdriver.Firefox(firefox_options=options, executable_path = 'your/directory/of/choice')

通过使用无头浏览器,我们应该看到脚本运行时间的改进,因为我们没有打开浏览器,但不是所有的结果都以类似于在正常模式下使用 firefox webdriver 的方式收集。

发出 API 请求

我们将在本教程中讨论的最后一种方法是向 API 发出请求。当检查网页 XHR 文件时,当页面加载时,该页面显示正在进行的请求。在这个列表中有一个/search请求,它调用一个 API 端点来获得页面上显示的结果。

我们可以使用 REST 客户机或几行 python 来发出同样的请求。

如果我们检查search文件,查看文件头、包含关键字的请求 url 以及发出请求所需的其他参数。在一般细节下面是我们以后可能需要的响应和请求头。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Inspect tool showing the search request headers

为了获得响应,我们可以获取请求 url,并作为测试将它输入到浏览器的地址栏中。因为参数是在字符串中添加的,所以我们也可以尝试删除除关键字参数之外的所有参数,以测试是否还需要其他参数。在这种情况下,关键字查询在浏览器中返回结果,因此我们也可以使用 REST 客户机或 python 来执行相同的请求。

失眠休息客户

使用失眠症,我们可以输入请求 url 并发送请求。

这将返回一个包含我们正在寻找的数据的 JSON 响应!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Preview of JSON response in Insomnia

这个例子非常简单,不需要头或安全令牌。对于其他情况,REST 客户机允许您输入任何附加的响应参数,这些参数可以在收集请求细节时从 inspect 工具获得。

Python 请求

我们也可以使用urllib.request库从 python 发出同样的请求,就像我们在抓取之前连接到网页一样。

通过添加一些参数来缩进和排序关键字,可以使 JSON 响应更具可读性,这样我们现在就可以打开文件,并在进行搜索时看到提供给网页的响应数据。

# import json library
import json# request url
urlreq = '[https://groceries.asda.com/api/items/search?keyword=yogurt'](https://groceries.asda.com/api/items/search?keyword=yogurt')# get response
response = urllib.request.urlopen(urlreq)# load as json
jresponse = json.load(response)# write to file as pretty print
with open('asdaresp.json', 'w') as outfile:
    json.dump(jresponse, outfile, sort_keys=True, indent=4)

目前,我们将保留所有数据。我的下一篇教程将更详细地介绍数据结构和输出,这样我们就可以操作 JSON 并找到相关的数据。

摘要

本教程概述了一些我们可以用来抓取使用 javascript 的网页的方法。这些方法包括:

使用 web 驱动程序抓取内容

  • 使用 selenium web 驱动程序连接到带有 Firefox web 驱动程序、PhantomJS 和 headless 浏览器的网页
  • 使用 web 驱动程序查找感兴趣的元素
  • 循环结果并保存感兴趣的变量
  • 将数据保存到数据帧
  • 写入 csv 文件

发出 HTTP 请求

  • 检查网页以查找 HTTP 请求的详细信息
  • 使用浏览器、REST 客户端或 python 发出 GET 请求

虽然 HTTP 请求方法在本教程中实现起来更快,并且从一个请求中提供了我们需要的所有数据,但情况并不总是这样。并非所有网站都会显示它们的请求,过期的身份验证令牌可能会带来额外的安全性,或者输出数据可能需要大量清理,这比使用带有一些 javascript 的 web 驱动程序来加载所有结果并在所有页面上循环需要更多的工作。本教程提供了一些不同的选择,你可以尝试使用它们来抓取 javascript。

在我的下一个教程中,我们将探索数据结构,操作数据和写入输出文件或数据库。

感谢您的阅读!如果你喜欢我的文章,那么订阅我的每月简讯,在那里你可以将我的最新文章和顶级资源直接发送到你的收件箱,或者在我的网站上了解更多关于我正在做的事情。

如果您是 python 的新手或者想要提高,请查看我的文章,其中包含学习资源列表,包括数据科学课程:

[## 学习编码。学习 Python。

你想学习编码但是不知道从哪里开始吗?开始您的编码之旅,并决定 python 是否…

towardsdatascience.com](/learn-to-code-learn-python-efb037b248e8)

数据科学技能:使用 python 进行网络搜集

原文:https://towardsdatascience.com/data-science-skills-web-scraping-using-python-d1a85ef607ed?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作为一名数据科学家,我在工作中接受的第一批任务之一就是网络搜集。这在当时对我来说是一个完全陌生的概念,使用代码从网站收集数据,但这是最符合逻辑和最容易获得的数据来源之一。经过几次尝试,网页抓取已经成为我的第二天性,也是我几乎每天都要使用的技能之一。

在本教程中,我将通过一个简单的例子来说明如何从快速通道中抓取一个网站来收集 2018 年前 100 家公司的数据。使用 web scraper 自动完成这一过程避免了手动收集数据,节省了时间,还允许您将所有公司数据保存在一个结构化文件中。

TL;关于 python 中一个简单的 web scraper 的快速例子,你可以在 GitHub 上找到本教程中的完整代码。

入门指南

在开始使用任何 python 应用程序之前,首先要问的问题是“我需要哪些库?”

对于 web 抓取,有几个不同的库可以考虑,包括:

  • 美味的汤
  • 要求
  • Scrapy

在这个例子中,我们将使用美丽的汤。使用 Python 包管理器pip,您可以用以下代码安装 Beautiful Soup:

pip install BeautifulSoup4

安装好这些库之后,让我们开始吧!

检查网页

要知道 python 代码中需要哪些元素,首先需要检查网页。

要从技术跟踪 100 强公司收集数据,您可以通过右键单击感兴趣的元素并选择 inspect 来检查页面。这将显示 HTML 代码,从中我们可以看到包含每个字段的元素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Right click on the element you are interested in and select ‘Inspect’, this brings up the html elements

因为数据存储在一个表中,所以只需几行代码就可以轻松完成。如果你想熟悉抓取网站,这是一个很好的例子,也是一个很好的起点,但是要记住,事情不会总是这么简单!

所有 100 个结果都包含在<tr>元素的行中,这些结果都可以在一个页面上看到。情况并非总是如此,当结果跨越多个页面时,您可能需要更改网页上显示的结果数量,或者循环所有页面以收集所有信息。

在排行榜网页上,显示了包含 100 个结果的表格。当检查页面时,很容易看到 html 中的模式。结果包含在表的行中:

<table class="tableSorter">

重复的行<tr>将通过使用 python 中的循环查找数据并写入文件来保持我们的代码最少!

补充说明:另一个可以完成的检查是检查网站上是否发出了 HTTP GET 请求,该请求可能已经以结构化响应(如 JSON 或 XML 格式)的形式返回了结果。您可以在 inspect tools 的 network 选项卡中检查这一点,通常在 XHR 选项卡中。页面刷新后,将显示加载的请求,如果响应包含格式化的结构,使用 REST 客户端(如 失眠症 )返回输出通常会更容易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Network tab of the page inspect tool after refreshing the webpage

使用美汤解析网页 html

现在你已经看到了 html 的结构,并且熟悉了你所抓取的内容,是时候开始使用 python 了!

第一步是导入将用于 web scraper 的库。我们已经在上面谈到了 BeautifulSoup,它帮助我们处理 html。我们要导入的下一个库是urllib,它连接到网页。最后,我们将把输出写到一个 csv 文件中,所以我们还需要导入csv库。作为替代,这里可以使用json库。

# import libraries
from bs4 import BeautifulSoup
import urllib.request
import csv

下一步是定义您正在抓取的 url。如前所述,此网页在一页上显示所有结果,因此地址栏中的完整 url 在此给出。

# specify the url
urlpage =  '[http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/'](http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/')

然后,我们连接到网页,我们可以使用 BeautifulSoup 解析 html,将对象存储在变量“Soup”中。

# query the website and return the html to the variable 'page'
page = urllib.request.urlopen(urlpage)
# parse the html using beautiful soup and store in variable 'soup'
soup = BeautifulSoup(page, 'html.parser')

我们可以在这个阶段打印 soup 变量,它将返回我们所请求的网页的完整解析的 html。

print(soup)

如果有错误或变量为空,则请求可能没有成功。此时,您可能希望使用[urllib.error](https://docs.python.org/3/library/urllib.error.html)模块实现错误处理。

搜索 html 元素

因为所有的结果都包含在一个表中,所以我们可以使用find方法搜索表的 soup 对象。然后我们可以使用find_all方法找到表中的每一行。

如果我们打印行数,结果应该是 101,这 100 行加上标题。

# find results within table
table = soup.find('table', attrs={'class': 'tableSorter'})
results = table.find_all('tr')
print('Number of results', len(results))

因此,我们可以循环结果来收集数据。

打印 soup 对象中的前 2 行,我们可以看到每一行的结构是:

<tr>
<th>Rank</th>
<th>Company</th>
<th class="">Location</th>
<th class="no-word-wrap">Year end</th>
<th class="" style="text-align:right;">Annual sales rise over 3 years</th>
<th class="" style="text-align:right;">Latest sales £000s</th>
<th class="" style="text-align:right;">Staff</th>
<th class="">Comment</th>
<!--                            <th>FYE</th>-->
</tr>
<tr>
<td>1</td>
<td><a href="[http://www.fasttrack.co.uk/company_profile/wonderbly-3/](http://www.fasttrack.co.uk/company_profile/wonderbly-3/)"><span class="company-name">Wonderbly</span></a>Personalised children's books</td>
<td>East London</td>
<td>Apr-17</td>
<td style="text-align:right;">294.27%</td>
<td style="text-align:right;">*25,860</td>
<td style="text-align:right;">80</td>
<td>Has sold nearly 3m customisable children’s books in 200 countries</td>
<!--                                            <td>Apr-17</td>-->
</tr>

表格中有 8 列,包括:排名、公司、地点、年末、年销售额上升、最新销售额、员工和评论,所有这些都是我们可以保存的有趣数据。

这种结构在网页的所有行中都是一致的(并非所有网站都是如此!),因此我们可以再次使用find_all方法将每一列分配给一个变量,我们可以通过搜索<td>元素将该变量写入 csv 或 JSON。

遍历元素并保存变量

在 python 中,将结果附加到列表中,然后将数据写入文件,这很有用。我们应该在循环之前声明列表并设置 csv 的头,如下所示:

# create and write headers to a list 
rows = []
rows.append(['Rank', 'Company Name', 'Webpage', 'Description', 'Location', 'Year end', 'Annual sales rise over 3 years', 'Sales £000s', 'Staff', 'Comments'])
print(rows)

这将打印出我们添加到包含标题的列表中的第一行。

您可能会注意到有几个额外的字段WebpageDescription,它们不是表中的列名,但是如果您仔细查看我们打印上面的 soup 变量时的 html,第二行包含的不仅仅是公司名称。我们可以使用一些进一步的提取来获得这些额外的信息。

下一步是遍历结果,处理数据并添加到可以写入 csv 的rows

要在循环中查找结果:

# loop over results
for result in results:
    # find all columns per result
    data = result.find_all('td')
    # check that columns have data 
    if len(data) == 0: 
        continue

由于表中的第一行只包含标题,我们可以跳过这个结果,如上所示。它也不包含任何<td>元素,因此当搜索该元素时,不会返回任何内容。然后,我们可以通过要求数据长度不为零来检查是否只处理包含数据的结果。

然后我们可以开始处理数据并保存到变量中。

 # write columns to variables
    rank = data[0].getText()
    company = data[1].getText()
    location = data[2].getText()
    yearend = data[3].getText()
    salesrise = data[4].getText()
    sales = data[5].getText()
    staff = data[6].getText()
    comments = data[7].getText()

上面的代码只是从每一列中获取文本,并保存到变量中。然而,这些数据中的一些需要进一步清理,以移除不需要的字符或提取进一步的信息。

数据清理

如果我们打印出变量company,文本不仅包含公司名称,还包含描述。如果我们打印出sales,它包含了不需要的字符,比如脚注符号,删除这些字符会很有用。

 print('Company is', company)
    # Company is WonderblyPersonalised children's books          
    print('Sales', sales)
    # Sales *25,860

我们想把company分成公司名称和描述,这可以用几行代码来完成。再次查看 html,对于该列,有一个仅包含公司名称的<span>元素。本专栏中还有一个链接,链接到网站上的另一个页面,该页面有关于该公司的更多详细信息。我们稍后会用到它!

<td><a href="[http://www.fasttrack.co.uk/company_profile/wonderbly-3/](http://www.fasttrack.co.uk/company_profile/wonderbly-3/)"><span class="company-name">Wonderbly</span></a>Personalised children's books</td>

为了将company分成两个字段,我们可以使用find方法保存<span>元素,然后使用stripreplacecompany变量中删除公司名称,这样就只剩下描述了。
为了从sales中删除不想要的字符,我们可以再次使用stripreplace方法!

 # extract description from the name
    companyname = data[1].find('span', attrs={'class':'company-name'}).getText()    
    description = company.replace(companyname, '')

    # remove unwanted characters
    sales = sales.strip('*').strip('†').replace(',','')

我们希望保存的最后一个变量是公司网站。如上所述,第二列包含到另一个页面的链接,该页面包含每个公司的概述。每个公司页面都有自己的表格,大部分时间都包含公司网站。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Inspecting the element of the url on the company page

要从每个表中抓取 url 并将其保存为变量,我们需要使用与上面相同的步骤:

  • 在快速通道网站上查找包含公司页面 url 的元素
  • 向每个公司页面 url 发出请求
  • 使用 Beautifulsoup 解析 html
  • 找到感兴趣的元素

查看一些公司页面,如上面的截图所示,URL 位于表格的最后一行,因此我们可以在最后一行中搜索<a>元素。

 # go to link and extract company website
    url = data[1].find('a').get('href')
    page = urllib.request.urlopen(url)
    # parse the html 
    soup = BeautifulSoup(page, 'html.parser')
    # find the last result in the table and get the link
    try:
        tableRow = soup.find('table').find_all('tr')[-1]
        webpage = tableRow.find('a').get('href')
    except:
        webpage = None

也可能有公司网站不显示的情况,因此我们可以使用try except条件,以防找不到 url。

一旦我们将所有数据保存到变量中,仍然在循环中,我们可以将每个结果添加到列表rows

 # write each result to rows
    rows.append([rank, companyname, webpage, description, location, yearend, salesrise, sales, staff, comments])print(rows)

然后在循环之外打印变量是很有用的,在把它写到文件之前,检查它看起来是否像你期望的那样!

写入输出文件

您可能希望保存这些数据以供分析,这可以在 python 中从我们的列表中非常简单地完成。

# Create csv and write rows to output file
with open('techtrack100.csv','w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerows(rows)

运行 python 脚本时,将生成包含 100 行结果的输出文件,您可以进一步查看详细信息!

摘要

这篇关于使用 python 进行 web 抓取的简短教程概述了:

  • 连接到网页
  • 使用 BeautifulSoup 解析 html
  • 遍历 soup 对象以查找元素
  • 执行一些简单的数据清理
  • 将数据写入 csv

这是我的第一个教程,所以让我知道你是否有任何问题或意见,如果事情不清楚!

感谢您的阅读!如果你喜欢我的文章,那么订阅我的每月简讯,在那里你可以将我的最新文章和顶级资源直接发送到你的收件箱!

你可以在 Medium 上关注我以获取更多文章,在 Twitter 上关注我,或者在我的网站上了解更多我正在做的事情。

数据科学承担公共教育

原文:https://towardsdatascience.com/data-science-takes-on-public-education-f432910ea9f0?source=collection_archive---------15-----------------------

使用机器学习帮助分析教育问题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“high-angle photography of group of people sitting at chairs” by Mikael Kristenson on Unsplash

“教育是你可以用来改变世界的最强大的武器”——纳尔逊·曼德拉

介绍

纳尔逊·曼德拉是对的。教育是强大的武器,也是人生最大的礼物之一。在美国,有各种各样的儿童教育项目可供选择,如公立学校、特许学校和私立学校。虽然有几种教育途径可供选择,但它们都是为了实现学生成功的相同目标吗?

问题

我在 Kaggle 上遇到了一个挑战,叫做 PASSNYC:为了好的数据科学。这项挑战是由 PASSNYC 创建的,这是一个非营利组织,旨在帮助纽约市的公立学校学生,通过使用公开可用的数据来量化他们在学校面临的挑战,以及如何鼓励学生参加专门高中入学考试(SHSAT) 来评估学生的需求。PASSNYC 想找到哪些学校需要帮助来增加参加考试的学生人数。虽然这个挑战本身很有趣,但我想用机器学习的方法来解决一个不同的问题:我们如何帮助公立学校提高学生的成功率?

目的:我们能预测公立学校的学生成绩等级吗?

在数据中,有一个字段对每所学校的学生成绩进行评级,我用它来确定学校是否达到了学生成功的目标。学生成绩评定有 4 个不同的等级:未达到目标、接近目标、达到目标、超过目标。这将使我们的分析成为监督的多分类机器学习任务:

监督:我们得到了训练数据的目标数据

多类分类:目标数据有 4 个不同的分类值(我后来把它们变成了 3 个,以提高模型的性能)

探索性数据分析

与任何数据科学项目一样,第一种方法是理解数据。数据集中有 160 个特征/列,包括数值和分类值。基于这些特征,我能够发现 4 种不同类型的组:经济组、种族组、教育评级组和测试组。例如,属于经济组的特征包括学校收入估计(数值)和经济需求指数(数值),它们用于识别公立学校的经济状态。

在最终的模型中,我删除了最多的特性是测试。这些特征包括参加**专门高中入学考试(SHSAT)的学生总数。**在第一次分析中,我包括了所有这些功能,但后来发现它们并不能帮助我们解决问题,也不能提高模型的性能。我将只包括测试的平均分数(ELA 和数学测试),但不包括参加测试的学生人数。

  • 学生成绩等级的分布最初是什么样子的?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过查看学生成绩等级的分布,我意识到需要做一些清理工作。数据中只有 6 所学校没有达到学生成绩的目标,相比之下,超过 600 所学校达到了目标。由于只有少数学校没有达到目标*,模型很难做出预测。因此,我决定将未达到目标的值改为接近目标,因为在现实中,它们都是:A)未达到学生成绩的目标,B)努力达到目标(嗯,至少我希望是这样)。其他特性也有 4 个评级等级(未达到目标、接近目标、达到目标、超过目标)、,因此也对这些值进行了更改。做出这些改变后,学生成绩的分布如下所示:*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目标和特征之间的关系

分析的下一步是寻找目标和特征之间的关系。为此,我绘制了一些密度图。通过按目标(学生成绩等级)给密度曲线着色,这显示了分布如何基于等级而变化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我看来,经济需求指数和学生成绩之间的关系是意料之中的。经济需求指数的值介于 0 和 1 之间,值越接近 1,意味着学校的经济需求越大。在这里,与其他评级相比,有更多经济需求指数值高的公立学校被评为接近目标*。在这里,许多具有高经济价值指数(超过 0.8)的公立学校的学生成绩评级接近目标*。换句话说,需要经济支持的学校没有良好的学生成绩。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

学校收入估计与学生成绩的关系与经济需求指数相同。许多估计收入较低(低于 5 万美元)的公立学校的学生成绩评级接近目标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在进一步调查后,我发现学校预计收入超过 10 万美元的公立学校要么达到目标,要么超过目标。基于这些观察,我推测学校的收入/经济状况将在分析中发挥重要作用。

特征工程/选择

流程的下一步是对功能进行更改,以优化模型的性能。使用 one hot encoding ,具有百分比值的列从数值变为序数值,从 0 变为 3。例如,特征百分比西班牙裔的值为 23% (0.23)的观察值被更新为序数值 1,而相同特征的值为 88% (0.88)的观察值被更新为值 3。对所有具有百分比(数值)值的要素执行此操作可提高模型的准确性!

对于评分值为、*的特性,我还使用了一个热编码:*接近目标:1,达到目标:2,超过目标:3。该程序还包括目标,即学生成绩评定。

分析的另一部分是查看特征之间的关系。经济需要指数和种族之间的关系显示出一种显著的模式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,我注意到经济需求指数因特定种族的学校而异。例如,西班牙裔人口较多的公立学校(3 分)被认为更需要财政援助。另一方面,白人比例较高(3 分)的公立学校似乎不太需要财政援助。

模型选择和测试

由于这是一个受监督的多分类机器学习分析,我创建了四个分类模型:

  • 随机森林分类器
  • 线性支持向量分类(LSVC)
  • 高斯朴素贝叶斯(GNB)
  • 线性判别分析(LDA)

公制

为了评估模型的预测,我使用了微 F1 分数。由于这是一个多类问题,我必须平均每个类的 F1 分数。同时也考虑到标签的不平衡。平均计算所有类别的假阳性、假阴性和真阳性的总数,然后使用这些计数计算精度、召回和 f 值

对数据进行 10 重交叉验证,对模型进行 10 次训练和测试,结果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 10 重交叉验证,线性判别分析(LDA) 模型具有最高的微观 F1 分数,为 0.66(越高越好)。随机森林(RF)模型排名第二,得分为 0.62。(令人惊讶的)表现不佳的模型是高斯朴素贝叶斯(GNB),其得分大大低于其他模型。

使用随机森林模型,我对功能的重要性进行了排序,以查看顶级功能在分析中的帮助程度:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ELA 和数学考试的平均分数是最重要的特征。这是有道理的,因为学校的平均考试成绩越高,学校的学生成绩等级就越高。特征重要性的一个方面是两个基于经济的特征的高排名:经济需求指数和学校收入估计。种族特征在分析中很重要,但没有我想象的那么重要。

结论

以下是我从分析中学到的一些东西:

  • 收入水平较低的学校似乎需要改进。如果 PASSNYC 想要为学校提供资金/援助,他们应该关注经济困难的学校和少数族裔(黑人/西班牙裔)比例较高的学校
  • 学校的经济地位对学生的成就起着重要的作用:学校越需要经济,学校的成就越低
  • 学校的经济地位因学校的主要种族而异:学校的少数民族(黑人/西班牙裔)学生越多,其经济需求就越大
  • 与其他模型相比,线性判别分析(LDA)在这种多类机器学习分析中得分较高。

尽管最佳模型在预测纽约公立学校的学生成绩评级方面做得很好,但我在这个过程中了解到的一些问题可能会在未来的项目中帮助我:

  • 去更新型号选择/工程总是很棒的!尽管这个建议在几乎所有数据科学相关的资料中都有推荐,但我完全理解它的价值。Kaggle 提供的数据有 100 多个特征,我在最初的几个模型中使用过,但在回到选择/工程流程后,我删除了其中的大部分。这些功能可用并不意味着它们会有用。
  • 更多(非冗余)功能。提供的数据本可以有更有用的特征,如学校规模或师生比。这种类型的数据可能会提高我们模型的准确性。

请随时给予反馈或建设性的批评!:)还有,跟我上 推特

这篇文章使用的所有代码都可以在 GitHub 上找到,组织在这个笔记本上。

数据科学:诗人和官僚

原文:https://towardsdatascience.com/data-science-the-poet-and-the-bureaucrat-581fb9aeb649?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们都知道一个伟大的讲故事的人。这个人能够吸引他们的观众,引导他们进行一次愉快的冒险,吸引他们的喘息和不屈的关注。

但这是一种技能,它不仅仅是向你的朋友清楚地表达凌晨 3 点在麦当劳的那个疯狂的无家可归的人。在我的领域,数据科学,从数据中创造故事的能力是必不可少的。

在评论故事在数据科学中的重要性之前,我们先绕道。

故事的起源

从理性的管理者到放荡不羁的人,每个人都从他们所听到的故事中成长。为什么我们对他们如此崇拜?这种喜爱从何而来?

“小说是关于作为一个该死的人是什么样的。”——戴维·福斯特·华莱士

华莱士的断言是准确的,但不完整。

人类通过因果关系寻求解释。在我们对解释性理性的渴望中,我们经常犯下编造故事来解释现象的错误。太阳为什么会升起?因为赫利俄斯和你我一样醒来。为什么今年的庄稼比去年更丰收?因为今年我们为德米特里牺牲了更多的羔羊。

因此,小说和非小说之间的差异可能会变得模糊不清。有意识到自己是虚构的虚构,也有被描述为非虚构的虚构。希腊神(以及其他神)被认为是非虚构的,拥有支配自然的力量的实体。当人类为太阳升起的原因设计了一个更合理的故事——地球绕着太阳旋转——古代的神被嘲笑,一个新的故事诞生了。

在非虚构小说的情况下,由叙事墨水构成的“真相”在某种程度上远比冰冷事实中呈现的那些更有力量,无论所说的“真相”是否真实,尽管现代试图让我们的头脑更倾向于统计思维,但本能地,故事似乎更引人注目。

因此,是我们内在的对答案的渴望驱动了我们对故事的热情吗?部分是,但华莱士的断言仍然成立。回想一下你的成长经历。大多数健康的童年被认为伴随着大量的小说,这是有充分理由的。故事可以作为一种机制,教会我们这个世界是如何运转的;对手如何克服不祥的困境,尽管困难重重,但最终还是学到了一些东西。这样的故事有助于构建一种情感基础设施,通过这种基础设施,可以储存与情境相适应的反应,为未来与他人的互动创造先例。或者通俗地说,就是做一个该死的人。[注意:对于数据科学,性格发展和情感能力并不重要,但构建情节的能力至关重要]

那么它是从哪里开始的呢?故事从来没有源自任何特定的文化或文明,或者疯狂的吉姆·琼斯式的传教士。它们存在于整个人类历史进程中,从地球树的所有独立分支,我们不用交叉路径就可以讲述和重复故事——亚马逊部落的人就像阿拉斯加的爱斯基摩人一样讲述故事。

我们是一个高度社会化的物种,因此从进化的角度来看,讲故事在生理上根植于我们是有益的。对叙事的关注有助于我们了解这个世界和彼此。这种对故事的热爱说明了为什么故事占据中心舞台的媒介,如书面小说和通常的电影,几乎得到了普遍的赞赏(每个人都喜欢哈利波特),而音乐等媒介,大多数通过声音表达的故事都让位于旋律,则更加小众。

在实践中

那么,如何在数据科学领域将它付诸实践呢?答案很容易理解:表达从讲故事中提取的见解,你猜对了。

作为一名数据科学家,我的部分工作是试图将统计模型的输出及其见解翻译给利益相关者。从数据中提取真知灼见的能力只有在它们能够被清晰地表达出来,能够被理解并有希望付诸行动时才变得有用。

不管你有多兴奋,告诉一个没有 STEM 学位的人调整后的 R 为 log。注册。你刚才测试的模型超过 95%就像试图向一个五岁的孩子解释迪伦的《荒凉山庄》和艾略特的《荒原》之间的相似之处;用露骨的言语是做不到的。

为了向外行人呈现统计概念,你必须结合有说服力的叙述和见解来解释这些见解的含义以及它们为什么重要。正如我们所看到的,仅仅数字证据不足以影响人们——例如,西方世界对叙利亚战争看法的转变,不是因为被迫离开家园的难民人数而是因为一个库尔德儿童(艾伦·库尔迪)的形象,他和他的家人试图到达欧洲时,他的身体面朝下躺在沙滩上。尽你所能通过逻辑和推理来说服人们,但是除非你有好的叙述,否则你的工作通常是徒劳的。

像其他技能一样,讲故事是可以学习和提高的。一些你可能已经听过一百遍或者更多的高层次的建议:多读,多写,了解你的听众,多做报告。

要知道,在现代,很少有人有足够的注意力去阅读,视频是表达想法的主要媒介,所以要确保你的故事是视觉化的。如果他们做得好,他们会被记住。

记忆。说服力。订婚。

TL;博士:做一个诗人,而不是一个官僚。

评估 ico 的数据科学

原文:https://towardsdatascience.com/data-science-to-evaluate-icos-f5d59948f05a?source=collection_archive---------3-----------------------

投资 ICO 游戏

我最喜欢的一句话是约翰·梅纳德·凯恩斯的:*“市场保持非理性的时间,可以超过你保持偿付能力的时间”。*投资者可以在动荡的加密货币市场中赚(或赔)很多钱,并将他们的成功归功于技能。

因为我不投机,也不自称有任何“阅读”或把握市场时机的技能,所以我寻找区块链平台或应用程序的长期技术潜力。最终,该平台的成功取决于开发人员对该协议的采用,以及它支持广泛应用的能力。

因此,首要标准是技术的实力,以及团队在执行长期愿景方面的技术实力。由于这些协议需要被开发人员采用,一个公共 github 提供了大量的验证。我已经收集了一些顶级令牌的数据,并计算了质量分数。*这表明了开发者社区的力量。*我还为他们的白皮书打分,作为平台长期生存能力的指标。综合起来,我计算出“技术质量得分( TQS )”将 TQS 与市值进行比较,以了解市值是由基本面因素驱动还是由市场炒作驱动。

*TQS 方法:*TQS 是从 Github 中提取的统计数据的加权分数计算出来的:提交、贡献者、明星和观察者的数量,以及分叉和问题的数量。我手动评估了白皮书的分数,但我可以看到将来如何实现自动化,至少可以达到一级。最好的论文描述了协议、融合和安全性的理论证明、合理的治理和现实的技术实现。平庸的论文通常只是描述实现,没有声音证明或设计选择的优雅的理由。更糟糕的只是描述了一种意识形态或未来的路线图。

我使用机器学习方法来计算验证数据集的权重。在没有可用数据的情况下,例如当成员不是公共成员时,模型会考虑缺少的值(未设置为 0)。由于明显的原因,我没有公开确切的方法或验证集。权重经常被重新计算,以防止对统计数据的任何操纵。

我不太重视网络形象。这可能意味着一场强大的营销活动,以促进代币的购买,尤其是在技术基础薄弱的情况下。正如 Kevin Mehrabi 在他的文章中描述的那样,这些有时是诈骗 ico 的迹象。

我希望未来在模型中包含并自动化的内容:

  • *评分技术白皮书:*自然语言处理可用于检查一个良好的协议描述,该协议描述具有收敛性和安全性、治理和技术实现细节的理论证明。此外,我们可以检查真正的创新,而不是从过去的白皮书中借鉴思想。
  • 用定理证明器和解算器验证数学证明
  • *对代码质量评分:*这可以通过两种方式来完成,a)通过贡献者的 github 档案来查看他们的实力,b)检查代码创新,或者如果创建者只是对其他项目进行增量改进。

这种数据收集和评分可以自动进行,为注重价值的投资者提供实时更新。对于那些真正相信自己产品及其长期影响的有才华的技术人员,以下几点让我对他们的 ICO 更有信心:

  • *智力诚实:*一个协议,从设计上来说,需要做出一些权衡。因此,它不能声称对每个应用程序都是好的。确保事务健壮性的协议将牺牲可伸缩性。例如,Tangle (IOTA)协议预先说明了其对物联网的假设和适用性。
  • *关于可伸缩性的基准:*伸缩性能测试,以及性能下降的点。区块链开发者知道,显示 10 万 TPS 的结果,并声称它因此是稳健的 100 万 TPS,是不成立的。
  • *模拟:*模拟多智能体系统是简单的,其中每个异构智能体遵循具有不同效用函数的协议。与可伸缩性基准一样,社区需要为协议开发人员创建开源平台来运行这些模拟。

奖励积分:

  • *经验证据:*理论结果以及模拟结果并不遵循现实世界的轨迹,尤其是在交易涉及人员的情况下。由于行为偏差和有界计算,收敛和安全属性可能不成立。来自真实用例的经验结果更有分量。
  • *样本应用:*以太坊在此大放异彩。他们使得用示例代码开发应用程序变得很容易,这使得许多开发人员来到他们的平台上。

2019 年数据科学趋势

原文:https://towardsdatascience.com/data-science-trends-for-2019-11b2397bd16b?source=collection_archive---------6-----------------------

发生了很多事情,2018 年发生了什么,2019 年看起来有什么前景?

这一年可以被认为是人工智能(AI)的蓬勃发展。看看那些标语中带有人工智能的创业公司的数量就知道了;大公司的收购集中在哪里;以及最大的科技会议的主题。人工智能无处不在——即使只是作为一个的流行语。但是人工智能到底是什么?那是一个相当难回答且有争议的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hype bag-of-words. Let’s not focus on buzzwords, but on what the beneath technologies can actually solve.

明确的是,数据科学正在解决问题。数据无处不在,我们对数据的利用越来越多,对社会的影响也越来越大。让我们关注数据科学,而其他人则对人工智能的最佳定义进行哲学思考。

当其他流行语保持繁荣时,数据科学怎么样了?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Interest for “data science” term since December 2013 (source: Google Trends)

兴趣一点都不差!我一直坚持认为数据科学不是一个时髦的词。即使对于现在加入数据科学的人来说——他们有很多——你只需要在 LinkedIn 上快速搜索工作,你会惊讶于提供的数量。让我们先来看看 2018 年发生了什么,然后关注 2019 年的热点话题。

今天

去年,我发表了一篇文章,阐述了我对 2018 年数据科学趋势的预期。我提到的主要发展是:工作流的自动化、可解释性、公平性、数据科学的商品化以及特征工程/清理工具的改进。

关于自动化,数据科学家的工作通常是他们自己工作的自动化。如今,公司开源自己的自动化管道非常普遍。其他的,只是继续卖,但是每天都有更多的竞争(例如,微软 AzureH2O数据机器人谷歌)。幸运的是,数据科学是一门横向学科,医疗保健中使用的相同算法经过一些调整也可以用于农业。因此,如果一家公司在一个垂直领域失败了,他们的发展可以很快适应另一个领域。

这些工具正成为常规的商品,你甚至不需要知道如何编码就能使用它们。其中一些诞生于几年前数据科学人才的匮乏,后来变成了有利可图的产品。这让人想起了返工书的原则之一——卖掉你的副产品。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ways to make humans trust machines are being paved (image by rawpixel)

可解释性公平性在 2018 年有了很大的发展。现在有更多的可用资源。仅仅是 Python alpha 版本的工具已经成熟(例如 SHAP )。此外,你可以很容易地找到关于这个主题的结构化和支持性的书籍,如 Christoph Molnar 的可解释机器学习书。通过减少障碍,理解高度复杂的模型正朝着正确的方向前进——谷歌的 假设工具 就是一个很好的例子。

特征工程仍然是数据科学解决方案的主要秘密武器之一——看看 Kaggle 中关于家庭信用违约风险获胜解决方案的描述。虽然许多最好的特征仍然是手工创建的,但是特征工具成为今年主要的特征工程库之一,为懒人(聪明?)数据科学家。这些工具的问题是,您需要在整个业务中有数据标准,也就是说,如果您的一个客户端以一种格式交付数据,您应该确保第二个客户端遵循相同的过程,否则,您将有许多不希望的手工工作。

最后,如果我们给编程语言颁发奥斯卡奖, Python 可能会收到其中一些。根据 Stack Overflow 的说法,连续第二年成为增长最快的主要编程语言和最受欢迎的语言。按照这种速度,它正迅速成为使用最多的编程语言。

明天

那么,下一步是什么?还能做什么?

上述主题大有可为。在 2019 年和接下来的几年里,它们将继续成为数据科学家的一些主要关注点。重点将放在成熟的技术上,同时回答以下问题:

  • 我们如何最大限度地减少数据科学家在数据清理和功能工程上花费的时间?
  • 我们如何在机器学习的背景下定义信任
  • 如果说一个机器模型是公平的,那么它的特点是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

What are the principles according to which we can say that we trust a robot? (image by Andy Kelly)

但是,除了这些难以回答的元问题之外,还有什么有希望的话题呢?

强化学习在它的一生中可能经历了许多寒冬。然而,看起来我们正在接近另一个春天。一个很好的例子就是 Dota 2 中的精彩表现。有很多事情要做,需要大量的计算能力……但是,无论如何,强化学习是我们目前最像人类的学习行为,看到它的应用令人兴奋。

我们很可能会看到这些概念验证变成实际的产品。如果你有时间,看看它们,用 OpenAI gym 来开发它们。

GDPR 的叙文 71:数据主体应该“有权……获得对所作决定的解释……并对决定提出质疑。”

通用数据保护法规 (GDPR)自 2018 年 5 月 25 日起在欧盟生效,并直接影响数据科学。问题是:企业仍在理解这一新规定的局限性。两个主要的开放主题是:

  • 数据隐私。错误处理个人数据的公司现在面临巨额罚款的威胁。这是否意味着获取数据对于研究来说将变得更加困难?我们会看到数据综合的新发展吗?我们能真正做到匿名化数据吗?
  • 解释权 。完全自动化的决策必须是可解释的。嗯,那很好…但是“可解释的”实际上是什么意思呢?我们会看到机器学习可解释性算法的标准化吗?欧盟实体对此没有给出答案——我们可能只是在等待有史以来最大的一笔罚款被执行。

可信的人工智能有两个组成部分:(1)它应该尊重基本权利、适用的法规以及核心原则和价值观,确保“道德目的”,以及(2)它应该在技术上强大和可靠,因为即使有良好的意图,缺乏技术掌握也可能造成无意的伤害[ 欧盟人工智能伦理 ]

随着算法对社会的影响越来越大,我们有权确保偏见得到缓解,并且它们的使用是为了整体而不是少数人的利益。幸运的是,公司和机构正在致力于此。欧盟人工智能伦理草案和谷歌人工智能原则就是很好的例子。伦理还有很长的路要走,但它现在是一个经常讨论的话题——这很好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

EU’s draft on AI ethics is an example on how governmental institutions are tackling the subject.

随着算法变得越来越复杂,更多的数据随时可用(现在每个小工具都会产生数据,对吧?),使用笔记本电脑进行数据科学研究的人会越来越少。我们将使用基于云的解决方案,即使是最简单的项目(例如 Google Colab )。时间是稀缺的,GPU 不是…笔记本电脑的发展速度不够快,无法跟上所需的计算能力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Google Colab: making it easier to share notebooks and using more computational power.

现在,假设你看到一家公司有一个“工程师”的职位空缺——就是这个。那太好了…但是现在有 100 种工程师。是机械工程师吗?航天?软件?“工程师”太通才了。

一两年前,公司会发布一个“数据科学家”的职位空缺。嗯,开始觉得不完整。如果你在这个领域刚刚起步,成为一名普通数据科学家可能会太难了。在掌握了这个领域之后,你最好专注于一个特定的主题。以网飞为例,它有九个数据角色:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Netflix data roles (source: Netflix Tech Blog)

有许多以前不存在的专业领域,数据科学家专注于一个领域来表明立场,这对于 T2 来说变得越来越重要。如果你还没有找到你自己的,现在是时候了。在我看来,数据工程技能是未来几年最有趣的技能。如果你的团队中没有他们,你可能只是在 Jupyter 笔记本上玩数据科学。公司也意识到了这一点。

2019 年将再次成为令人惊叹的一年。有很多事情要做,这不仅仅是技术和书呆子!真正需要解决的问题正在等待着。

作为结束语,记住时间是我们最大的财富。你花在做无价值的事情上的每一秒钟,都是你没有做伟大的事情而失去的一秒钟。选择你的话题,不要认为你的工作是一切照旧。

雨果·洛佩斯

使用无监督学习的数据科学&天文学数据的可视化

原文:https://towardsdatascience.com/data-science-using-unsupervised-learning-visualization-of-astronomy-data-b6b1c61f6922?source=collection_archive---------23-----------------------

复杂数据的简单可视化使其背后的科学变得显而易见。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图是埃德温·哈勃爵士在 1929 年绘制的数据图,显示星系越远,离我们越远,也就是红移。

随着我们绘制更多已知宇宙区域的地图,我们发现了最大尺度的惊人结构。在 2 或 3 维地图中可视化这种结构让我们直观地掌握宇宙中星系的组成和性质,以及创造这种结构的力量。

有大量的公共数据可用于科学研究,如斯皮策 S4G 数据——星系内恒星结构的调查。这是一些星系的斯皮策数据集片段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SPITZER S4G Data of Galaxy Clusters

  • mstar(太阳质量):log10(恒星质量)
  • 在 Eskew 等人(2012 年)的校准中使用单克隆抗体 1 和单克隆抗体 2
  • c31 _ 1:3.6 微米时的 r75/r25 浓度指数
  • c42 _ 1:3.6 微米时的 5*log10(r80/r20)浓度指数
  • phys_size:单位为 KPC(千秒差距)。1 秒差距= 3.26 光年
  • mabs1 和 mabs 2:3.6 和 4.5 微米处光波长的绝对幅度。

注:R75 和 R25 分别是封闭光度为 75%和 25%时的半径

如需更多参考资料,请查阅:

[## S4G 目录定义

S4G 目录提供了来自 IRAC 图像的光度学和模型参数,以及一个到摘要的链接…

irsa.ipac.caltech.edu](https://irsa.ipac.caltech.edu/data/SPITZER/S4G/gator_docs/s4g_colDescriptions.html)

这些星系的样本描述可以在维基百科上找到:

[## NGC 4725 -维基百科

NGC 4725 是一个中等棒旋星系,有一个突出的环状结构,距离我们大约 4000 万光年

en.wikipedia.org](https://en.wikipedia.org/wiki/NGC_4725) [## NGC 4707 -维基百科

NGC 4707 具有 Sm 或 Im 的形态类型,这意味着它大部分是不规则的或具有非常弱的旋臂。的…

en.wikipedia.org](https://en.wikipedia.org/wiki/NGC_4707)

做一个散射矩阵图可以快速给出上述参数之间的关系,如星系的物理大小和恒星质量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用像 PCA 和 t-SNE 这样的无监督学习可以进一步帮助评估这些数据。

这是该数据与 6 个参数的 PCA 图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果是双峰的。主成分分析根据椭圆型(红色)和螺旋型(蓝色)对星系进行聚类

另一种方法是绘制具有各种困惑值的 t-SNE 无监督学习算法。这里尝试的不同值是 5、10、15、30、40 和 50。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些绘图与主成分分析相一致。我们可以进一步放大以选择该数据中的一个口袋。选择一部分数据用于进一步分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

绘制 30 个星系的选择性数据的 mstar & phys_size,对照它们的形态类型代码“t”(参考:https://en . Wikipedia . org/wiki/Galaxy _ morphologic _ class ification))显示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论显示,我们在 30 个星系中发现的星系高度集中,并且具有较低的恒星质量。

今年 4 月 25 日,盖亚公布了它的 DR2 档案。我在浏览这个档案时,无意中发现了这个视频。

基于以上学习的一些快速绘图给出了以下可视化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于有限弧数据的造父变星可视化。造父变星是测量空间距离的烛台。由于每种造父变星的光度都是恒定的,因此很容易推断它们离地球的距离。赤经和赤纬是位置坐标。赤经是从太阳三月分点开始,沿着天赤道向东测量的特定点的角距离。赤纬是天赤道以北或以南一点的角距离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Above visualization shows the placement of various Cepheid between 73 & 80 RA and -65 and -67 Decl.

使用 python 中的 Bokeh plot 绘制 GAIA 系外行星数据,包括相对于地球的半径和质量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有许多其他参数,如亮度、温度等,可以从这些数据中可视化。在我的下一篇文章中,我计划通过从这些数据中创建一些可视化和推论来向开普勒致敬,并在 2019 年迎接苔丝。

一个更一致和更深入的倡议可以促进天文学家、统计学家、数据科学家和信息与计算机专业人员之间的合作,从而有助于加快我们对周围空间的了解。

#数据科学#天文学#盖亚

Dhaval Mandalia 喜欢数据科学、项目管理、培训高管和撰写管理战略。他也是古吉拉特邦管理协会社区的贡献成员。在推特和脸书上关注他。

参考资料:

盖亚档案:【https://gea.esac.esa.int/archive/

斯皮策数据:https://irsa.ipac.caltech.edu

Python 数据科学:Matplotlib 数据可视化简介

原文:https://towardsdatascience.com/data-science-with-python-intro-to-data-visualization-and-matplotlib-5f799b7c6d82?source=collection_archive---------1-----------------------

介绍

当数据科学家处理数据时,数据通常存储在 CSV 文件、excel 文件、数据库和其他格式中。此外,这些数据通常作为熊猫数据帧加载。为了简化示例,我将使用包含我们数据的 Python 列表。我假设您对 Python 数据类型、函数、方法和包有所了解。如果你没有这方面的知识,我建议你阅读我之前的文章,它涵盖了这些话题。

数据可视化

数据可视化是数据分析中非常重要的一部分。您可以使用它来浏览您的数据。如果你很好地理解你的数据,你将有更好的机会找到一些见解。最后,当你发现任何见解时,你可以再次使用可视化来与他人分享你的发现。

比如看下面好看的剧情。这张图显示了 182 个国家在 2015 年的预期寿命和收入。每个泡泡代表一个国家,颜色代表一个地区,大小代表那个国家的人口。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Life Expectancy vs Income in the 2015 year. Source: https://www.gapminder.org/downloads/updated-gapminder-world-poster-2015/

如果你对使用的数据来源感兴趣,你可以在这里找到更多信息。此外,这张图表还有一个很棒的互动版本在这里,你可以玩历史时间序列,搜索某个国家,改变轴上的数据等等。这里的是一个展示如何使用这个交互式图表的视频。

然而,这里的想法是学习数据可视化和 Matplotlib 的基础知识。所以,我们的情节会比那个例子简单得多。

基本可视化规则

在我们看一些类型的情节之前,我们将介绍一些基本规则。这些规则帮助我们做出好的、有信息的情节,而不是令人困惑的。

  • 第一步是选择合适的绘图类型。如果有各种选项,我们可以尝试比较它们,选择最符合我们模型的一个。
  • 第二,当我们选择你的绘图类型时,最重要的事情之一是标记你的轴。如果不这样做,剧情信息量就不够。当没有轴标签时,我们可以试着查看代码,看看使用了什么数据,如果幸运的话,我们可以理解这个图。但是如果我们只是将情节作为一个图像呢?如果我们把这个情节给你那个不懂 Python 制作情节的老板看呢?
  • 第三,我们可以加一个标题,让我们的剧情更加翔实
  • 第四,需要时为不同类别添加标签
  • 五、可选地,我们可以在有趣的 数据点添加文本或箭头。
  • 六、在某些情况下我们可以使用一些数据的大小颜色来使情节更具信息性。

Matplotlib 的可视化类型和示例

有许多类型的可视化。最著名的有:线图散点图柱状图箱线图条形图饼图。但是在这么多选择中,我们如何选择正确的可视化呢?首先,我们需要做一些探索性的数据分析。在我们知道数据的形状、数据类型和其他有用的统计信息之后,选择正确的可视化类型将会更加容易。顺便说一下,当我使用“绘图”、“图表”和“可视化”这些词时,我指的是同一个意思。在这里,我发现了一个对图表建议有用的图片。

Python 中有很多可视化包。其中最著名的是 Matplotlib。它可以用在 Python 脚本、Python 和 IPython shells、Jupyter 笔记本和 web 应用服务器中。

在我们开始定义和例子之前,我想向您展示一下matplotlib.pyplot子包的一些基本功能,我们将在下面的例子中看到。这里,我假设matplotlib.pyplot子包是用别名plt导入的。

  • plt.title(“My Title”)将为您的剧情添加一个标题“我的标题”
  • plt.xlabel(“Year”)会在你的 x 轴上加一个标签“年份”
  • plt.ylabel(“Population”)将在您的 y 轴上添加一个标签“人口”
  • plt.xticks([1, 2, 3, 4, 5])将 x 轴上的数字设置为 1,2,3,4,5。我们也可以传递和标签作为第二个参数。例如,如果我们使用这个代码plt.xticks([1, 2, 3, 4, 5], ["1M", "2M", "3M", "4M", "5M"]),它将在 x 轴上设置标签 1M、2M、3M、4M、5M。
  • plt.yticks() -与plt.xticks()相同,但针对 y 轴。

线形图 : 一种类型的图,将信息显示为一系列由直线连接的数据点称为“标记”。在这种类型的绘图中,我们需要测量点按排序**(通常按其 x 轴值)。这种类型的绘图通常用于可视化时间间隔内的数据趋势,即时间序列
用 Matplotlib 做一个线图,我们调用plt.plot()。第一个参数用于横轴上的数据,第二个参数用于纵轴上的数据。该函数生成您的图,但不显示它。为了显示绘图,我们需要调用plt.show()函数。这很好,因为我们可能想在显示它之前给我们的图添加一些额外的定制。例如,我们可能想要为绘图的轴和标题添加标签。**

Simple Line Plot

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

散点图:这种类型的图显示所有单个数据点。在这里,它们不用线连接。每个数据点都有 x 轴值和 y 轴值。这种类型的图可用于显示趋势或相关性。在数据科学中,它显示两个变量如何比较。
要用 Matplotlib 制作散点图,我们可以使用plt.scatter()函数。同样,第一个参数用于横轴上的数据,第二个参数用于纵轴上的数据。

Simple Scatter Plot

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

直方图:数值数据分布的精确表示。要创建直方图,首先,我们将整个数值范围分成一系列区间,然后,我们计算每个区间内有多少数值。间隔也被称为。箱是变量的连续且不重叠的区间。它们必须相邻,并且通常大小相等。
要用 Matplotlib 制作直方图,我们可以使用plt.hist()函数。第一个参数是数字数据,第二个参数是箱的数量。bins参数的默认值是 10。

Simple Histogram

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Simple Histrogram Ouput

从上面的直方图中我们可以看到:

  • 5 个介于 0 和 3 之间的值
  • 3 介于 3 和 6 之间的值(包括 3 和 6)
  • 2 介于 6(不含)和 9 之间的值

盒图,也叫****盒须图:一种显示基于五位数汇总的数值分布的方式:最小值第一个四分位数中值第三个四分位数最大值**。**

  • ****最小值最大值只是我们数据中的最小值和最大值。
  • 中位数是将数据的上半部分与下半部分分开的值。按以下步骤计算:对你的值排序,找到中间的那个。在我们的数值计数是偶数的情况下,我们实际上有 2 个中间数,因此这里的中值是通过将这 2 个数相加并将和除以 2 来计算的。例如,如果我们有数字1, 2, 5, 6, 8, 9,你的中值将是(5 + 6) / 2 = 5,5
  • ****第一个四分位数数据值的中值,位于有序值中值的左侧。例如,如果我们有数字1, 3, 4, 7, 8, 8, 9,第一个四分位数是1, 3, 4值的中值,所以是3
  • ****第三个四分位数数据值的中间值,在我们的有序值中间值的右边。例如,如果我们再次使用这些数字1, 3, 4, 7, 8, 8, 9,第三个四分位数是8, 8, 9值的中值,所以是8
  • 这里我还想再提一个统计。那就是 IQR(四分位间距)IQR 近似于数据中间 50%的扩散量。公式第三个四分位数——第一个四分位数。****
  • 这种类型的图也可以显示异常值。离群值是位于总体模式之外的数据值。它们被可视化为。当我们有异常值时,最小值最大值被视为非异常值的最小值和最大值。有许多方法可以识别什么是异常值。一个常用的规则是,如果一个值比第一个四分位数****小**-1.5 * IQR或比第三个四分位数1.5 * IQR,那么这个值就是异常值。**************

哇!那可是强大的剧情不是吗?让我们看一个例子来更好的理解剧情。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Box Plot. Source: http://www.physics.csbsju.edu/stats/box2.html

现在,当我们有了一些关于盒图的知识,我们可以看到用 Matplotlib 创建这个图是非常容易的。我们需要的只是函数plt.boxplot()。第一个参数是数据点。

Simple Box Plot

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Simple Box Plot Output

在这个例子中,值1, 2,21异常值,最大值10,最小值5。并且,的意思是就是7。****

如果不是什么都懂也不用担心。我写了很多关于这个的信息。我还想分享一个免费可汗学院课程叫做“汇总量化数据”。本课程涵盖了箱线图的许多细节。当你完成这门课程后,你会更容易理解这种类型的情节。

条形图:用矩形条表示分类数据。每个条形的高度与其代表的值相对应。当我们想要比较不同类别的给定数值时,这很有用。它也可以与 2 个数据系列一起使用,你可以在这里找到更多信息
要用 Maplotlib 制作条形图,我们需要plt.bar()函数。

Simple Bar Chart

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Simple Bar Chart Output

从这个例子中,我们可以看到不同编程语言的用法是如何比较的。请注意,一些程序员可以使用多种语言,因此这里的百分比总和不是 100%。

饼状图:圆形图,分成若干片以显示数字比例。它们在商界被广泛使用。然而,许多专家建议避开它们。主要原因是很难比较给定饼图的各个部分。此外,很难跨多个饼图比较数据。在许多情况下,它们可以用条形图代替**。**

我们在看饼状图的时候会做角度判断,但是角度判断的不太好。-娜奥米·罗宾斯

作为一个例子,我们将看到饼状图和条形图上的数据,代表每种特定类型的葡萄酒的收入百分比。查看饼图,并尝试按照从大到小的顺序排列切片。你有什么麻烦吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Wines revenue using a pie chart. Source: http://www.perceptualedge.com/articles/08-21-07.pdf

现在,我们可以看到同样的数据显示在条形图上。这乘以收入百分比很容易比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Wines revenue using a bar chart. Source: http://www.perceptualedge.com/articles/08-21-07.pdf

你可以找到更多关于“为什么饼图不好?”来自本文档的问题。

用 Matplotlib 做饼状图,可以用plt.pie()函数。autopct参数允许我们使用 Python 字符串格式显示百分比值。

Simple Pie Chart

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我的其他博客文章

你也可以看看我以前的博文。

时事通讯

另外,如果你想在我发表新的博客文章时得到通知,你可以订阅我的最新时事通讯。当我找到一些额外的资源时,我会很乐意在整个过程中与您分享。

商务化人际关系网

这是我在 LinkedIn 上的简介,如果你想和我联系的话。我将很高兴与你联系在一起。

最后的话

谢谢你的阅读。我希望你喜欢这篇文章。如果你喜欢,请按住拍手键,分享给你的朋友。我很高兴听到你的反馈。如果你有什么问题,尽管问。😉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值