TowardsDataScience 博客中文翻译 2021(七百四十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Python 中静态方法和类方法有什么区别?

原文:https://towardsdatascience.com/whats-the-difference-between-static-and-class-methods-in-python-1ef581de4351?source=collection_archive---------13-----------------------

关于 classmethod 和 staticmethod,您只需要知道

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

照片由克里斯·利维拉尼unsplash.com拍摄

除了实例方法——这是面向对象编程环境中最常见的类成员 Python 中的类也可以有静态和类方法。该语言带有两个装饰器,即@staticmethod@classmethod,它们允许我们在类中定义这样的成员。理解这些概念是很重要的,因为它们将帮助你编写更清晰、结构更合理的面向对象的 Python,并最终使维护变得更容易。

在本文中,我们将探讨这两者的作用,如何创建它们,以及在哪些情况下应该使用其中一个。

花点时间浏览一下下面的代码,因为它将被用作示例 Python 类,我们将使用它来探索一些概念。

class Employee: NO_OF_EMPLOYEES = 0

    def __init__(self, first_name, last_name, salary):
        self.first_name = first_name
        self.last_name = last_name
        self.salary = salary
        self.increment_employees() def give_raise(self, amount):
        self.salary += amount @classmethod
    def employee_from_full_name(cls, full_name, salary):
        split_name = full_name.split(' ')
        first_name = split_name[0]
        last_name = split_name[1]
        return cls(first_name, last_name, salary) @classmethod
    def increment_employees(cls):
        cls.NO_OF_EMPLOYEES += 1 @staticmethod
    def get_employee_legal_obligations_txt():
        legal_obligations = """
        1\. An employee must complete 8 hours per working day
        2\. ...
        """
        return legal_obligations

类方法(@classmethod)

类方法接受类本身作为一个隐式参数和——可选地——定义中指定的任何其他参数。理解一个类方法不能访问对象实例(像实例方法一样)是很重要的。因此,类方法不能用于改变实例化对象的状态,而是能够改变该类的所有实例共享的类状态。

当我们需要访问类本身时,类方法通常是有用的——例如,当我们想要创建一个工厂方法时,这是一个创建类实例的方法。换句话说,classmethods 可以作为可选的构造函数。

在我们的示例代码中,Employee的一个实例可以通过提供三个参数来构造;first_namelast_namesalary

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)'Andrew'
85000

现在让我们假设一个雇员的名字可能出现在一个字段中,其中名和姓用空格隔开。在这种情况下,我们可以使用名为employee_from_full_name的类方法,它总共接受三个参数。第一个是类本身,这是一个隐式参数,意味着在调用方法时不会提供它——Python 会自动为我们做这件事。

employee_2 = Employee.employee_from_full_name('John Black', 95000)
print(employee_2.first_name)
print(employee_2.salary)'John'
95000

注意,也可以从对象实例中调用employee_from_full_name,尽管在这种情况下没有太大意义:

employee_1 = Employee('Andrew', 'Brown', 85000)
employee_2 = employee_1.employee_from_full_name('John Black', 95000)

我们可能想要创建类方法的另一个原因是当我们需要改变类的状态时。在我们的例子中,类变量NO_OF_EMPLOYEES跟踪当前为公司工作的雇员人数。每次创建一个新的Employee实例时都会调用这个方法,并相应地更新计数:

employee_1 = Employee('Andrew', 'Brown', 85000)
print(f'Number of employees: {Employee.NO_OF_EMPLOYEES}')employee_2 = Employee.employee_from_full_name('John Black', 95000)
print(f'Number of employees: {Employee.NO_OF_EMPLOYEES}')Number of employees: 1
Number of employees: 2

静态方法(@staticmethod)

另一方面,在静态方法中,实例(即self)和类本身(即cls)都不会作为隐式参数传递。这意味着这些方法不能访问类本身或它的实例。

现在有人可能会说,静态方法在类的上下文中没有用,因为它们也可以放在助手模块中,而不是作为类的成员添加。在面向对象编程中,将类组织成逻辑块是很重要的,因此,当我们需要在类下添加方法时,静态方法非常有用,因为它在逻辑上属于类

在我们的例子中,名为get_employee_legal_obligations_txt的静态方法简单地返回一个字符串,该字符串包含公司每个员工的法律义务。这个函数既不与类本身交互,也不与任何实例交互。它可以被放入一个不同的助手模块,但是,它只与这个类相关,因此我们必须把它放在Employee类下。

静态方法可以直接从类中访问

print(Employee.get_employee_legal_obligations_txt()) 1\. An employee must complete 8 hours per working day
    2\. ...

或者来自类的实例:

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.get_employee_legal_obligations_txt()) 1\. An employee must complete 8 hours per working day
    2\. ...

结论

在本文中,我们介绍了 Python 中静态方法和类方法的工作原理,以及应该优先使用这两种方法的主要原因。

可以使用@classmethod装饰器创建类方法,它们用于访问类本身,但同时,它们不能访问单个实例。当我们需要创建可选的构造函数时,它们是非常有用的,这是一个创建同一个类的实例的类方法(可能接受稍微不同的参数)。

另一方面,静态方法可以通过@staticmethod装饰器来构造,但是它不同于实例或类方法,它没有任何隐式参数(既不是self也不是cls),因此它们不能访问类或它的实例。当我们需要将一个成员放入一个类中时,它们通常是有用的,因为它在逻辑上属于这个类。

这两种类型的方法都可以帮助您编写易于阅读和维护的代码。

预测准确性指标的隐性成本是多少?-来自 M5 竞赛的见解

原文:https://towardsdatascience.com/whats-the-hidden-cost-of-a-forecast-accuracy-metric-64ee0b86ce25?source=collection_archive---------31-----------------------

行业笔记

有几十种花哨的预测指标,做出正确的选择似乎相当棘手。每一种都有它的特点,它的优点和缺点,它的捍卫者和它的批评者…你的选择真的重要吗?有需要避免的度量标准吗?相反,是否有比其他指标交付更多价值的指标,如果有,交付多少?

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

迈克尔·朗米尔Unsplash 上拍摄的照片

附录

本文于 2021 年 7 月 4 日更新,以反映各种读者评论,这些评论指出了本文第一版中的局限性和潜在偏见。特别感谢 Trixie Tacung(欧莱雅)和 Ivan Svetunkov (CMAF 兰卡斯特大学)。

在前一集里…

这一系列文章主张需要新一代的预测指标,将重点放在预测的业务影响上,而不是仅仅放在准确性/精确度上。

在我们的上一篇文章 [1]中,我们将各种预测与它们引发的商业决策的质量进行了比较。

为此,我们利用了“M5-竞争”[2]数据集(基于沃尔玛的数据)和来自基准和竞争对手的 74 种预测方法。这使得超过 680 万次补货决策的模拟成为可能。

如此大的工作台使得每种方法的成本(从它们触发的决策中测量)和各种性能指标(MAPE、wMAPE、sMAPE、MSLE、MAE、MSE、RMSE、WRMSSE、BIAS、DIao)的公平比较成为可能。

有趣的是,该测试表明传统的预测指标在从业务角度确定最佳方法方面表现不佳。事实上,从商业的角度来看,一个被给定的度量标准确定为“最佳”的方法很可能是最差的。

然而,并非所有指标都是平等的!

例如,新引入的 DIao 指标在优化业务决策方面明显优于任何其他指标。事实上,该指标并不关注预测误差,而是考虑所引发的决策和相关成本。

这篇文章里有什么?

外面有一大堆花哨的度量标准,如果现有的已经“足够好”并且附加值不明确,那么肯定没有必要引入新的。

在第四篇文章中,我们描述并实现了一个测试框架,它回答了以下问题:

  • 所有指标的表现都一样吗?
  • 如何确定满足您需求的最佳预测指标?
  • 有最好避免的度量标准吗?
  • 应用适当的度量标准的投资回报是什么?

那我们就来分享一些实验答案吧!

设置测试工作台

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

路易·里德Unsplash 上拍摄

资料组

在这个实验中,我们使用了我们上一篇文章中提到的“沃尔玛/ M5 竞争”数据集。如果你有兴趣学习,请参考“后来者居上,前来者居上”……M5 竞赛见闻

关于补充政策,我们使用上述文章中描述的假设,除了:

  • 设置为零的初始库存。事实上,我们的目标是评估度量的真实性能,我们不希望现有的清单使我们的度量产生偏差。然后在相同的“无初始库存”假设下分析每个补货决策。
  • 固定成本也设置为零。这是因为固定成本是在订单级别计算的,这在较低级别计算相关性时会添加一些不必要的噪声。

相关性度量

我们在这里感兴趣的是测量各种预测指标和它们触发的决策成本之间的相关性。

相关系数用于衡量变量之间关系的强度。更准确地说,相关系数衡量两个变量之间的线性关系。

然而,给定预测指标的公式(包括权重、对数、平方、平方根、绝对值等等),我们不能期望指标与其成本之间的关系是线性的。

相反,我们可能期望单调性以“当一个指标提高时,成本降低”的形式出现。因此,我们在这个分析中应用了 Spearman 的等级-顺序相关性。

斯皮尔曼的等级-顺序相关性关注的不是价值本身,而是它们的等级。当等级完全相关(rho=1)时,变量向同一方向演化。当等级反向相关(rho=-1)时,变量向相反方向演化。在这两种情况下,从我们的角度来看,指标的演变完全符合成本的演变。

但是,一旦相关系数不等于+1 或-1,变量就不再完全相关。从业务的角度来看,这种情况意味着,**虽然预测指标提高了,但决策的质量可能会下降……**这会增加成本而不是产生价值!

花费如此多的精力和资源来改进预测,却不能为您的业务服务,这是多么可耻的事情啊!

性能指标

在这里,我们重点关注经典的预测指标,包括 MAPE、wMAPE、sMAPE、MSLE、MAE、MSE、RMSE、WRMSSE、BIAS (最后是 BIAS 指标)。

当然,我们在这个列表中添加了新引入的“决策影响”指标。在三个“决策影响”指标(即 DIna、DIno 和 DIao)中,选择 DIao 是因为它关注错误的成本。

关于那些 DIao 和其他两个度量的更多细节,您可以参考:“决策影响”:实现新一代面向业务的度量的 10 个理由 [3]。

聚合级别

大多数从业者在特定的计算级别评估和交流他们的性能指标。例如,一些需求计划员将决定选择一种预测方法,并将其应用于整个(或全局)范围。其他人将决定为不同的子范围选择不同的方法,例如按产品类别。一些需求计划员最多会按物料/商店选择一种预测方法。

评估所选聚合级别的影响不是很有趣吗?然后,让我们向这个测试平台添加各种聚合级别。

以下是所选的 12 个级别(括号中的数字是该级别的节点数) :

  • 全球(1),
  • 状态(3),
  • 类别(3),
  • 部门(7)、
  • 国家/类别(9),
  • 商店(10),
  • 州/部门(21)、
  • 商店/类别(30)、
  • 商店/部门(70)、
  • 项目(3049),
  • 状态/项目(9147),
  • 商店/项目(30490)。

分析相关性

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

照片由 mari lezhavaUnsplash 上拍摄

计算完成后,下面的箱线图显示了 Spearman rho 排名相关性的分布(每个聚集水平的平均值)。

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

作者图片

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

作者图片

这个怎么解读?

下表就如何解释 Spearman rho 的等级相关性给出了一些指导。

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

Spearman rho(分级)相关性解释指南(Prion 和 Haerling,2014 年)

根据上述指南进行测量:

  • MAPE,通常被认为是最常用的预测指标[4],在这种情况下是最差的指标,与成本的相关性可以忽略不计微弱
  • 不出所料,偏差对成本也有一个可以忽略的微弱的相关性。
  • 其他指标的相关性具有较大的 rho 范围,从可忽略中等。
  • 在经典指标中,MAE & wMAPE 明显脱颖而出,相关系数从可忽略中等
  • 再一次,提出的 DIao 指标明显优于其他指标,因为其设计与成本完全相关,无论成本水平如何。

有趣的是,如下图所示,在高聚合级别,指标与成本的相关性往往不同。不幸的是,补货决策必须在商品/商店层面做出,其中每个指标(除了 DIao)与成本都有相同的相关性。

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

作者图片

基于这个测试,刁绝对是一个非常合适的指标。另一方面,在经典的度量中,没有一个度量在决策层是突出的。

毫无疑问,从科学角度来看,相关性是必不可少的。但是,从一个度量转换为 DIao 会产生什么附加价值呢?这个额外的价值是否足够大到可以使这样的改变合法化?

让我们定义另一个测试来检查这一点!

分析有效成本

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

照片由 Jp ValeryUnsplash 上拍摄

对于上述每个指标,让我们选择最佳的 5 个预测(从 74 个可用预测中)。选择几个预测而不是一个预测会使我们的结论更加可靠,因为它避免了传统的陷阱,例如意外选择一个表现不佳的预测。

然后,按指标计算并平均所选预测的成本,以获得每个指标触发的平均成本。这些成本显示在下面的方框图中。

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

作者图片

该图显示:

  • BIAS & MAPE 精选预测比任何其他指标都贵,平均值分别为 3.5 万美元和 3 万美元。
  • 其他指标选择的预测平均成本为 2.6 万美元(比 MAPE 低 13%)。它们从一个到另一个提供了小的额外的改进,但是没有很大的不同。
  • DIao 指标选择了平均成本为 2.4 万美元的预测值(与 MAPE 相比下降了 21%,与上述指标相比下降了 10%)。

这代表了多大的附加值?

让我们客观地看待这些结果,并比较每个聚合级别的每个指标与 DIao 的成本。

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

作者图片

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

作者图片

无论聚合级别如何,DIao 指标始终为给定的决策流程确定最适合的预测。

从高层次来看,由于指标与成本的相关性更好,因此额外的节省是有限的(700 到 3,000 美元)。但是,一旦在更精细的级别(如商品/商店级别)计算指标,节省就会大幅增加,从 1.9 万美元到 9.3 万美元不等

嗯……它很棒还是垃圾?

为了更好地理解这些数字,让我们把它们放在上下文中。

下面,我们将重点关注 MAPE(因为它是应用最广泛的指标)和商品/商店级别(做出补货决策的地方),从而节省 93000 美元。

我们的预测期包括 288 万美元的销售额。沃尔玛 2020 年的年销售额定为 5591.5 亿美元[5]。这意味着我们的分析代表了沃尔玛年收入的 0.00052%。此外,沃尔玛 2020 年的年总收入为 1388.4 亿美元[5]。

考虑到这些数字,93000 美元的节约是多少?

  • 3 周内 10 家商店的 3049 件商品售价 93000 美元
  • 即。总补货成本的 35.2%
  • 即。每个项目和商店每年 5.29 美元
  • 即。沃尔玛规模 18.05 亿美元/年
  • 即。年营业额的 0.32%
  • 即。沃尔玛年度总收入的 1.30%

结论

正如我们所展示的,并非所有预测指标都是一样的!

为您的业务选择正确的指标将极大地提高您的绩效!相反,使用错误的指标(比如 MAPE)会让你的公司损失很多钱。

当然,并不是所有的公司都像沃尔玛那么大!然而,高达 35.2%的总成本降低对任何业务都有实际影响。当您简单地用一个指标替换另一个指标时更是如此。

虽然“决策影响指标”的第一个用例很棒,还有更多用例可以分享。我们将在本系列的后续文章中逐一介绍它们。

承认

特别感谢Manuel Davy(Vekia 创始人&首席执行官)Stefan De Kok(wah upa 联合创始人&首席执行官)hervéLemai(Vekia 首席技术官)。

本文旨在阐明预测性能测量的当前实践、局限性和可能的改进。它肯定不是完美的,并且受到限制。

如果你觉得这很有见地,请分享和评论…但也请随意挑战和批评。如果你想进一步讨论这个问题,请联系我!

无论如何,敬请关注下一篇文章!同时,请访问我们的网站www . vekia . fr了解更多我们在为供应链提供高价值方面的专业知识和经验。

Linkedin:www.linkedin.com/in/johann-robette/
Web:www . vekia . fr

参考

[1] Vekia,Johann ROBETTE,最后将是第一个,第一个最后——来自 M5 竞赛的见解,2021

[2] Kaggle, M5 竞赛网站,2020 年

[3] Vekia,Johann ROBETTE,“决策影响”:实施新一代面向业务的指标的 10 个理由,2021

[4] Gartner,财务堵塞限制预测准确性,2019

[5]《华尔街日报》,沃尔玛公司,2021 年

你能达到的最大 ROC 是多少?(不,答案不是 1)

原文:https://towardsdatascience.com/whats-the-maximum-roc-you-can-achieve-no-the-answer-is-not-1-da11b66c0f28?source=collection_archive---------23-----------------------

无论是准确度、精度,还是 ROC 下面积,大概你的预测模型都无法达到完美(甚至无法接近)。这是(统计上的)原因。

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

[图片由作者提供]

人们普遍认为预测模型的准确性完全取决于两个因素:

  • 你的数据有多完整整洁;
  • 你的分类器有多强大。

当然,这两个方面是最基本的。但是还有第三种,经常被遗忘:

  • 你正在解决的问题有多难?

直觉上,很明显不是所有的问题都一样难。例如,对 MNIST 数字进行分类并不像预测明天的股票市场那样困难。换句话说,每个问题都有一个固有的“硬度”。这对数据科学家有着重要的意义,因为实际上,它意味着:

在给定任务上可以实现的最大 ROC 不一定是 100%,但是可以低得多,这取决于问题的难度。

这只是常识,但在某个时候,我开始问自己:

分类任务的难度有没有量化的衡量标准

我发现这个问题发人深省,因为它触及了一个有趣话题的本质:机器学习的边界,以及——我要说——一般学习的边界。这篇文章介绍了我是如何回答这个问题的。

1.让我们摇摆吧

想想任何分类任务,无论是预测保险欺诈、分类垃圾邮件还是推荐电影。

假设我们能够为该任务生成所有可能的预测模型(这个假设的模型集被称为“模型空间”)。对于它们中的每一个,我们也可以计算其在 ROC 曲线下的面积(从现在开始简称为“ROC”)。

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

模型空间。[图片由作者提供]

正如我们所知,ROC 是衡量模型性能的一个标准。因此,如果我们采用模型空间中具有最高 ROC 的模型,那么这就是正在讨论的任务的最佳可能模型

事实上,

最佳可能模型的 ROC 是任务“难度”的度量。

事实上,根据定义,最好的模型是不可战胜的。因此,最佳可能模型的 ROC 越高,问题越简单;最佳可能模型的 ROC 越低,问题越难

所以,我们所有的工作归结为找到某种方法来定义最佳可能模型的特征。要做到这一点,让我们从基础开始。

2.最好的模型

任何分类任务的结构都可以概括如下:

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

一个二元分类问题的结构。[图片由作者提供]

这个想法是,目标变量是一些“隐藏的”(或不可观察的)概率的实现。预测模型的目的是对这些潜在的概率进行估计(尽可能准确)

但是隐藏的概率和观察到的结果之间有什么联系呢?如果所有样本都是独立的,生成观察结果就像为每个样本投掷一枚(装载的)硬币,硬币的装载与样本的隐藏概率成比例。在 Python 中,投掷一枚装满硬币的等价体是numpy.random.choice,所以生成过程看起来是这样的:

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

数据生成过程的样子。[图片由作者提供]

隐藏概率的随机性是不可分散的。这意味着没有模型能比隐藏概率做得更好。换句话说,

最好的可能模型是能够正确猜测所有隐藏概率的模型。

我们终于有了我们一直在寻找的最佳可能模型的定义!由于我们最初的直觉是计算最佳可能模型的 ROC,这相当于计算隐藏概率的 ROC。

综合我们发现的一切,我们可以得出这样的结论:

在预测问题上可能达到的最高 ROC 是产生目标变量的概率的 ROC。

根据这个定义,现在很容易计算出我们上面看到的玩具问题的最高可实现 ROC:

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

用 Python 计算 ROC 分数。[图片由作者提供]

只有 77%,离 100%还差得很远!

除了这个小例子,我们能不能用这个洞见说点更普遍的?为了回答这个问题,我们需要后退一步,尝试在更一般的背景下理解隐藏概率的特征。

3.隐藏概率的拼图

考虑到隐藏概率是不可观测的,我们对它们了解多少?

至少,我们知道他们的意思。事实上,假设与目标变量的均值重合是合理的。例如,如果您正在尝试对垃圾邮件进行分类,并且您观察到收到的邮件中有 10%是垃圾邮件,您可以得出结论,潜在隐藏概率的平均值也是 10%。

我们还可以说一下它们的方差,至少是上下界。方差的下限当然是零。关于上界,我们可以用 Bathia-Davis 不等式,它说明方差的上界是(mean — min)*(max — mean)。由此,我们可以得出结论:

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

我们所知道的隐藏概率的均值和方差,其中 y 代表目标变量。[图片由作者提供]

但这还不是全部。我们也可以假设隐藏概率是贝塔分布的。事实上,贝塔分布是描述概率的最佳选择,因为:

  • 它仅在区间[0,1]上定义(因此,它主要用于表示百分比和比例,例如在贝叶斯推理中);
  • 它足够通用,可以表示许多不同的“形状”。

贝塔分布由两个正参数决定,称为 αβ

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

贝塔分布的概率密度函数,基于 αβ 的不同值【来源:维基百科

但是即使我们假设隐藏概率遵循贝塔分布,我们如何选择 αβ

贝塔分布的一个方便的特性是均值和方差都可以很容易地从 αβ: 中获得

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

作为参数函数的贝塔均值和方差。[图片由作者提供]

然而,在我们的例子中,我们宁愿做相反的事情,即从均值和方差中得到 αβ 。为了做到这一点,将上面的两个方程表示为均值和方差的函数就足够了。经过一些简单的代数运算,结果是这样的:

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

作为均值和方差函数的β参数。[图片由作者提供]

将我们看到的所有关系放在一起,我们可以编写一个 Python 函数,提供对应于任何(合法的)均值和方差对的 αβ :

**def** get_beta_params(mean, var): **assert** 0 < mean < 1, 'mean must be in ]0 and 1['
    **assert** 0 < var < mean * (1 - mean), 'var must be in ]0, mean * (1 - mean)[' alpha = ((1 - mean) / var - 1 / mean) * mean ** 2
    beta = alpha * (1 / mean - 1) **return** alpha, beta

该函数允许我们绘制具有给定均值(假设为 0.1)和不同方差水平的贝塔分布的 pdf(注意,在这种情况下,方差的上限将是 0.1 * 9 = . 09)。

**from** scipy.stats **import** beta **as** beta_distrib
**import** numpy **as** npmean = .1**for** variance **in** [.000001, .0005, .001, .002, .005, .01, .04, .089999]:
  alpha, beta = get_beta_params(mean, variance)
  pdf = beta_distrib(alpha, beta).pdf(np.linspace(0, 1, 100))

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

均值= .10 且方差不同的贝塔分布的概率密度函数。注意:最小理论方差是 0,而最大理论方差是 0.09[图片由作者提供]

除了绘制概率密度函数,一旦我们知道了 αβ ,我们可以通过函数np.random.beta(alpha, beta, size)抽取一个随机样本,并绘制各自的直方图:

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

直方图:均值= .1 和不同方差的贝塔分布。[图片由作者提供]

4.寻找 ROC 的上界

既然我们已经学会了如何模拟尽可能多的 Beta 分布(对于给定的均值,从最小方差到最大方差),我们终于可以回到我们最初的目的了。

事实上,从每个分布中,我们可以抽取一个概率样本,用于生成目标变量。比较概率和目标值计算出的 ROC 正是我们最初寻找的度量。

这是一个流程图:

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

完整的过程:隐藏概率是从具有指定参数的 Beta 中提取的,然后概率被用于生成目标变量,最后 ROC 分数是根据隐藏概率和观察结果计算的。[图片由作者提供]

在 Python 中,该过程如下所示:

**import** pandas **as** pd
**import** numpy **as** np
**from** sklearn.metrics **import** roc_auc_scoremean = .1
var_min = 0
var_max = mean * (1 - mean)**for** var **in** np.linspace(var_min + 1e-10, var_max - 1e-10, 100):
  alpha, beta = get_beta_params(mean, var)
  proba = pd.Series(np.random.beta(alpha, beta, 100000))    
  y = proba.apply(**lambda** p: np.random.choice([0, 1], p = [1 - p, p]))
  roc_auc_score(y, proba)

让我们看一些例子:

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

贝塔分布及其 ROC 的一些例子。[图片由作者提供]

这是 6 个不同的测试版,平均值为 0.1。但是我们可以生成无穷多个,从最小方差到最大方差。所以让我们取 100 个平均值相同、方差递增的贝塔。然后,让我们在 x 轴上绘制最大方差的百分比,并在 y 轴上绘制各自的 ROC。这是我们得到的结果:

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

贝塔分布的方差与其相关 ROC 的关系。[图片由作者提供]

是不是很迷人?有一个明显的模式:

隐藏概率的方差越低,问题越“难”(即可实现的 ROC 越低)。

毕竟,这很直观。当方差为 0 时,意味着所有样本都具有相同的隐藏概率:不可能对它们进行排序,因此即使是最好的可能模型也不会比随机模型好。这意味着 ROC = .5。

相反,当方差达到最大值时,这个过程实际上没有随机性:最好的可能模型可以完美地区分积极因素和消极因素。这意味着 ROC = 1。

最有可能的是,所有现实世界的分类任务都介于这两个极端之间。

当然,我们所看到的不仅适用于 ROC,也适用于任何性能指标。出于好奇,让我们也画出 F1 的分数,平均精度和准确度:

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

贝塔分布的方差与其相关指标(ROC、F1、平均精度、准确度)之间的关系。[图片由作者提供]

这次旅行让我们发现了为什么有些问题看起来如此“困难”。我们已经证明,对可以达到的最大 ROC 有统计限制:如果生成概率的分布具有低方差,即使是最好的可能模型也不能在物理上达到高 ROC 分数。

这是对我们最初猜测的更严谨的解释。您实现的 ROC 不仅取决于您的数据有多好或您的模型有多强大,还取决于您正在解决的问题有多困难。

感谢您的阅读!我希望这篇文章对你有用。

我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以发短信给我我的 Linkedin 联系人

你最喜欢的机器学习味道是什么?

原文:https://towardsdatascience.com/whats-your-favorite-machine-learning-flavor-3faaf80b37f7?source=collection_archive---------39-----------------------

我们每周精选的必读编辑精选和原创特写

我们发布的文章涵盖了一系列令人眼花缭乱的数据科学主题,但我们发现更令人印象深刻的是,当我们放大某个特定领域时,我们会发现有多少变化。本周的《变量》( Variable)就是一个很好的例子,我们在这里关注最新的一批机器学习必读材料。一个很好的起点是 Josh Poduska 的 T2 维护 ML 模型的综合框架。乔希认为,监控你的模型的表现是一回事;全面地处理它以确保它随着时间的推移表现良好是另一个问题,并且需要不断的迭代和创造力。

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

照片由泰勒·希雷Unsplash 拍摄

关于机器学习的最强大的帖子完成了一件极其困难的事情:将复杂的想法从该领域的前沿转化为既容易理解又令人振奋的叙述。Patrick Huembeli 和他的合著者在探索基于能量的模型和相互作用粒子的物理学之间的联系时就是这样做的,以便更好地理解前者的内部工作方式(本文献给他们已故的合作者彼得·魏特克)。 Felizia Quetscher 设定了一个类似的目标——将密集和不透明的东西转化为吸引人和可接近的东西——当她耐心地解释卷积神经网络(CNN)时,并使用清晰的插图来强调输入和输出阵列与它们之间的卷积核的关系。最后,受生物信息学和计算生物学的启发, Remy Lau 向我们介绍了网络传播背后的理论和直觉,并使用 HotNet2 算法的例子来帮助将事情变得更加具体。

如果你对机器学习的一些更实际、更真实的利害关系感到好奇,你会欣赏赵明杰关于结构化思维的观点,以及它如何产生有效的数据故事。它们涵盖了科学家需要执行的所有大量工作数据,以发现他们创建的数据集的建模可能性。沿着平行的路线, Javier Marin 将学术研究领域的强化学习引入创业场景,强调了武装强盗算法的潜力,以促进更好的商业决策。与此同时,对于 Russo Alessio 来说,机器学习既是一个学术领域又是一个现实世界的问题:作为一名新兴学者,他担心快速增长和该领域的受欢迎程度对会议同行评审过程的质量和公平性的影响

受够了一周的机器学习?*真的吗?*嗯,没关系——我们也为您提供了保障:

我们祝大家阅读愉快,本周休息愉快——感谢对我们作者工作的支持

直到下一个变量,
TDS 编辑器

我们策划主题的最新内容:

入门指南

实践教程

深潜

思想和理论

当一阵狂风卷走我们的记录时,你会怎么做?

原文:https://towardsdatascience.com/when-a-crazy-wind-wipes-away-our-records-what-do-you-do-a9f2aab3dc17?source=collection_archive---------21-----------------------

你应该假设今天的温度会和昨天一样,还是假设全年的平均温度是一个很好的基准?

休伊·费恩·泰

和格雷格·佩奇一起

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

(上图:澳网的拉斐尔·纳达尔; I 法师 by moer schy;创建日期:2012 年 1 月 18 日)

我喜欢澳大利亚墨尔本的一月。

一月是网球之神降临的时候,这是一年中的第一个网球大满贯——澳大利亚网球公开赛。当比赛进行时,墨尔本中央商务区笼罩在派对的气氛中。沿着亚拉河通往罗德拉沃竞技场的道路上挤满了坐在长凳上和豆袋上观看像罗杰费德勒或塞雷娜威廉姆斯这样的明星在大屏幕上比赛的人。罗德·拉沃尔竞技场本身随着每一次胜利而焕发生机。

你们中的一些人可能想徒步到这个东南部城市亲眼看看这里的活动,他们可能想知道墨尔本的夏天会有多热。很有可能你会去谷歌、Weather.com 甚至是墨尔本气象局查询,从而知道会发生什么。

但是如果,只是如果,一股疯狂的风卷走了前一年记录值的五分之一呢?或者,如果墨尔本奥林匹克公园的气象站有 20%的时间发生故障,导致那些丢失的值,该怎么办?你怎么能提前计划呢?

你可能认为这两种情况都不太可能发生——坦率地说,你可能是对的——但为了以防万一,我们决定模拟这样的事件。从墨尔本一整年的日最高温度开始,我们随机选择了其中的 20%进行移除,在那一栏中留下了 73 个 NA 值。

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

现在,假设我们不容易重新获得原始值,我们需要为 max_temp 变量输入数字,这样我们的行将再次成为“完整案例”(完整案例是某些建模算法和可视化技术的要求)。

在这种情况下,解决这个问题的一种方法是使用一种称为“上次观察结转”(LOCF)的统计方法,这意味着用最近的已知值填充空白。对于某些季节性因素,比如墨尔本的每日气温,这是一种合理的方法,尤其是当 NAs 的比例不是非常大的时候。虽然墨尔本全年的天气变化很大,但每天的变化很小。

LOCF 可以通过 na.locf()函数用 R 中的 zoo 包实现。

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

LOCF 用最近记录的观察结果来代替我们的每一个 NAs。对于有两个连续 NAs 的情况——如我们之前看到的 1 月 29 日和 1 月 30 日,两者都被替换为 28 日的观察值。

LOCF 的一种替代方法是采用单一的中心测量值进行插补,例如整个数据集中已知观测值的平均值。这里,这将通过将 2020 年的平均温度(即 19.6 摄氏度,或 67.28 华氏度)分配给每个空记录来实现。我们可以通过 naniar 包中的 impute_mean()函数来实现。

现在,我们将 LOCF 方法和估算方法的结果与原始数据集进行比较。

在整个数据集中,LOCF 值与观察值之间的平均绝对值差为 3.99,中位数差为 3,而平均插补值与真实观察值之间的平均绝对值差为 4.62,中位数为 3.8。

虽然这两种方法都易于实现,易于向受众描述,并且对于相对可预测的数据集是可靠的,但它们也有一些缺点。对于差异很大的数据集,使用中心测量值进行插补特别麻烦。LOCF 不适用于周期性波动的数据,如波动股票的股价。

如果我们处理的数据集的值范围较窄,例如某个热带国家的温度记录、各种玫瑰花瓣的长度或几只吉娃娃的高度,那么这两种方法的缺点就不会那么明显。

也就是说,如果我们使用一月的平均温度来解释该月的差异,估算方法的准确性可能会有所提高。

但那是以后的事了。

数据来源: 澳大利亚气象局

KPI 上升可能是一件坏事

原文:https://towardsdatascience.com/when-a-kpi-going-up-can-be-a-bad-thing-7021e4d27fef?source=collection_archive---------34-----------------------

你的利益相关者应该得到比低垂的果实更好的东西

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

作者照片

…这是一个从来没有人来职业介绍日发表演讲的群体,这是犯罪!”伟大的哲学家伦道夫·杜普利

在处理数据时,问题和想法非常重要。移动数字并只关注 KPI 何时上升或下降可能会很棘手。没有问很好的问题就直接进入分析是犯罪!

我想介绍两个简单的假设场景,并向您解释理解业务需求/目标的重要性,以及生活在数据表的泡沫中可能会出错的地方。

你能看看转化率吗?

在第一个场景中,我们为一家牙科诊所工作。我们的 KPI 之一是“conv 比率”,其中我们使用“conv 数量”列作为分子,使用“考试数量”作为分母。

本质上,每个进来的顾客都要接受某种考试。我们希望跟踪除了标准检查/清洁之外,还有一些牙科工作的顾客的百分比。

我们正在按月查看结果。我们通常会看到 40–45%的转化率。

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

作者照片

每位顾客的平均消费也大幅上升(未图示)。我们要大展身手了!

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

照片由 Claudio Poggio 通过 Unsplash 拍摄

这看起来并不怎么好

让我们从稍微不同的角度来看这个问题。

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

作者照片

这开始讲述一个不同的故事。三月和四月看起来是非常好的月份。这个数据中有些东西很突出。现在是 2020 年!

那时发生了很多事情。作为一种预防措施,牙医只看那些确定需要牙科治疗的病人。要求预期“仅检查/清洁”的客户在稍后日期预订他们的检查。

尽管我们的 KPI 看起来在以天文数字的速度提高,但最终的结果是我们基本上只追逐那些‘灌篮’客户。对于未来的业务,这种策略可能不是最好的。希望我们能在太晚之前取消定制游艇的合同!

有东西在疯狂地推动销售!

在这个场景中,我们为澳大利亚的一家家用发电机公司工作。我们被要求查看电子邮件活动的一些结果。我们开始看到销售的大幅上升,看起来就像是在这些电子邮件发出后才进来的。我们或许应该给这家新的第三方营销公司送去一卡车的现金,以实现更多的未来增长。

“非常成功!”—波拉特

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

作者照片

电子邮件运动的影响有多大?人们认为什么样的事件会促使他们购买更多的发电机?为什么运费也在疯狂上涨?

这些订单中的很大一部分将运往美国,Snovid 在其中扮演了重要角色?!?

该死的魔鬼!—暗黑破坏神的超级巨星,埃利奥特·理查兹

这个场景不一定是一个复杂的 KPI。销量上升很好。焦点是什么会推动上升。这可能属于“相关性不等于因果关系”的范畴。

最后的想法

在数据分析/科学世界中,你不会总是有时间或资源从树顶上摘下最好的果实。只要确保你没有从地上捡起腐烂的水果,并试图把它当作闪亮美味的食物。

在小组中提问会激发更多的问题和思考。当这些问题和想法流动时,指南针上的指针才真正开始指向正确的方向。

一如既往,继续学习!

当时间序列像鸭子一样呱呱叫时

原文:https://towardsdatascience.com/when-a-time-series-only-quacks-like-a-duck-10de9e165e?source=collection_archive---------12-----------------------

运行预测模型之前测试平稳性。用 Python。和一张小鸭子的照片。

ADF、KPSS、OSCB 和 CH 检验平稳性和稳定的季节性模式;以及如果它们提供相互矛盾的结果时如何处理它们。

为了避免可能导致预测模型不完善的陷阱,我们将并行应用 ADF 和 KPSS 检验,以检查时间序列是否不仅像鸭子一样呱呱叫,而且像水鸟一样摇摇摆摆。我们还将运行 OCSB 和 CH 测试,以检查是否需要季节差异。

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

黄色和棕色的小鸭子照片 Unsplash 上的自由动物形象

我们的资料来源包括东达科他马州下泰德马什小镇(完全是虚构的)1200 个月的历史气温记录。下蒂德马什镇档案馆在 20 世纪 80 年代被一场厨房火灾摧毁,之后(或者,正如一些居民告诉我们的那样,因为)志愿消防队前来救援。温度记录必须通过采访两位百岁老人来重建。时间序列是合成的,由正弦季节成分组成,反映了东达科他州的严冬和温和的夏季;过去一个世纪的全球变暖趋势;和表示估计不确定性的白噪声分量。

你可以通过上面的链接从 Google Drive 下载小的 Temp.csv 源文件(大约 33 kB)。Jupyter 笔记本可通过第二个链接获得。

0.属国

1.数据处理

下载源数据文件 Temp.csv。

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

熊猫进口。csv 日期列作为对象/字符串。因此,我们将日期转换为 datetime,设置一个索引,并从索引中导出年份和月份。

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

让我们创建一个 pandas 数据透视表,以表格形式查看源数据。

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

我们使用数据透视表来计算 10 年的滚动平均温度,这将消除季节性高峰和低谷的短期波动,然后创建一个图表来研究长期趋势(如果有的话)。

该图显示了上升趋势——这是我们的时间序列不是稳定的第一个迹象。

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

在我们将温度输入像 SARIMA 这样的预测模型之前,我们需要测试它的稳定性。

我们可能会尝试开始某种网格搜索来寻找合适的超参数,然后让自动调整过程来识别具有最低 Akaike 信息标准的模型。但是这会导致前面提到的预测质量陷阱。

  • 信息标准代表我们希望根据自回归 AR 和移动平均 MA 项最小化的目标;
  • 而差分的顺序必须通过运行平稳性测试来预先确定。

2.平稳性测试

2.1 平稳性和差异

平稳性

“平稳时间序列的特性不依赖于观察时间。”(8.1 平稳性和差分|预测:原理和实践(第二版)(otexts.com))

如果时间序列的均值、方差和自相关结构不随时间变化,则时间序列是稳定的。如果它们不是时不变的,我们今天用来准备预报的属性将不同于我们明天观察到的属性。一个不稳定的过程会避开我们利用过去的观察来预测未来发展的方法。时间序列本身不需要在过去和未来期间保持平坦、恒定的直线才能被认为是平稳的,但决定其随时间变化的模式需要是平稳的,以使其未来行为可以预测。

时间序列需要展示:

  • 非时变均值
  • 非时变方差
  • 非时变自相关

具有先验非平稳观测值的时间序列通常可以被转换以达到平稳性。

变化无常的意思

显示强劲上升或下降趋势的序列没有恒定的平均值。但是如果它的数据点在扰动后趋向于回复到趋势线,时间序列就是趋势-平稳的。像去趋势化这样的变换可能会将它转换成可用于预测模型的平稳时间序列。如果趋势遵循可预测的模式,我们可以将趋势线拟合到观察值,然后在将去趋势序列输入预测模型之前将其减去。或者,我们可以在模型中插入一个日期时间索引作为额外的独立变量。

如果这些去趋势测量不足以实现恒定平均值,我们可以调查一次观察到的差异是否具有恒定平均值。

通过差分时间序列——取观察值 y(t)和早期观察值 y(t-n)之间的差值——我们可以获得变化的平稳(均值回复)序列。

一个时间序列,其中的任何观察只取决于它的一个或多个前导(由几个滞后分开),加上或减去一些随机误差,被称为随机行走。除了误差项之外,观测值之间的差异具有零均值,根据定义,如果误差项不包含对预测有价值信息的信号,则误差项本身具有零均值。随机漫步可能表现出明显趋势的长阶段,上涨或下跌,然后是不可预测的方向变化。恒定的平均趋势需要一阶差分。

相邻观测值之间的差异具有非零均值的时间序列将倾向于向上(正均值)或向下(负均值)漂移。我们将一个时间序列与漂移进行差分,得到一个具有常数均值的序列。

一些时间序列需要两轮差分。观测值之间的变化不是恒定的(观测值之间没有恒定的“速度”),但变化速率可能是稳定的(恒定的“加速”或“减速”)。如果两轮差分不足以使一个时间序列平稳,第三轮很少是合理的。相反,应该更仔细地研究时间序列的特性。

具有季节性的时间序列将显示出在恒定数量的周期之后重复的模式:一月份的温度与七月份的不同,但是一月份的温度在不同年份之间将处于相似的水平。季节差异将观测值与其前一个观测值之间的差异去掉 S 个滞后,S 是一个完整季节的周期数,比如一年 12 个月或一周 7 天。

如果趋势和季节模式都是相对时间不变的,差分时间序列(相对于趋势的第一差分;和相对于季节性的季节性差异)将具有近似恒定的平均值。

非恒定方差

如果时间序列呈现扩大或缩小的漏斗形状,那么它的观测值会随着时间的推移围绕其趋势波动,方差会增大或减小。它的方差不是时不变的。

通过取观察值的对数,它们的平方根,或者应用 Box-Cox 变换,我们可以通过变换稳定方差。预测之后,我们可以逆转这些转变。

非恒定自相关结构

对于任何给定的 t,两个观测值 y(t)和 y(t-1)之间的相关性和协方差不会随时间保持不变。对于平稳性,自相关应该是时不变的。

PSA #1:在拟合模型之前确定平稳性

在将预测模型拟合到数据之前,所需的差分阶数是应该预先确定的参数。调整算法可以根据选定的基准(如 Akaike 信息标准)测试超参数的任何组合。但是一些超参数可能会相互抵消。SARIMA 模型中的超参数搜索会用自回归 AR 和移动平均 MA 项来交换差分顺序的变化。

“重要的是要注意,这些信息标准往往不是选择模型差分(d)的适当阶次的良好指南,而只是选择 p 和 q 的值。这是因为差分改变了计算似然性的数据,使得具有不同差分阶次的模型之间的 AIC 值不可比。所以我们需要使用一些其他方法来选择 d,然后我们可以使用 AICc 来选择 p 和 q”(hynd man, 8.6 估计和顺序选择|预测:原则和实践(第二版)(otexts.com))。

因此,如果超参数搜索试图确定与其他参数并行的差分顺序,我们可能会获得一个较差的预测模型。这个搜索会找到一个明显最小化 AIC 或 BIC 的差分顺序。但它可能错过了一个模型,尽管它的 AIC 更高,但该模型可以导致更准确的预测。搜索算法不知道它的目标,信息标准,不能比较不同阶差分的模型。

调整算法应该在开始对其他超参数进行网格搜索之前应用假设测试来确定适当的差分顺序;或者数据科学家确定差分的顺序,然后将网格搜索限制到剩余的参数,例如 AR 和 MA 项。

PSA #2:对稳定性进行平行测试

为了确定是否需要差异,我们可以运行四个测试来获得客观的结果,这是目视检查图表可能会遗漏的:

  • 扩充迪基-富勒 ADF
  • 科维亚特科夫斯基-菲利普斯-施密特-申·KPSS
  • Osborn-Chui-Smith-Birchenhall OCSB 季节性差异
  • 卡诺瓦-汉森季节差异研究中心

我将跳过其他一些单位根测试,如菲利普斯-庇隆。

在相当多的情况下,这些测试可能会返回相互矛盾的结果。下面的例子将说明 ADF 和 KPSS 应该并行评估,而不是孤立地评估。我们中的许多人——包括我在内,当我准备我的第一份预测时——习惯于依赖 ADF 检验作为我们的平稳性检验的默认;其他人更喜欢 KPSS 测试。我想,我们当中很少有人习惯性地应用这两种测试,然后比较它们来决定差异。

2.2 增强的迪基-富勒试验(pmdarima)——像鸭子一样嘎嘎叫?

  • 零假设:数列包含一个单位根:它是而不是平稳的。
  • 替代假设:没有单位根。
  • 低 p 值是优选的。如果测试返回的 p 值低于所选的显著性水平(例如 0.05),我们拒绝该空值,并推断该系列不包含单位根。
  • 如果 ADF 检验没有找到单位根,但是 KPSS 检验找到了,那么这个序列就是差分平稳的:它仍然需要差分。
  • ADF 和 KPSS 的 pmdarima 测试提供 p 值作为输出;和一个布尔值,它是问题的答案:“我们应该不同吗?”

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

2.3 科维亚特科夫斯基-菲利浦斯-施米特-申试验(KPSS)(pmdarima)——但它不会像鸭子一样走路?

  • 零假设:序列围绕一个确定的趋势是平稳的(趋势平稳)。
  • 请注意,与 ADF 检验相比,KPSS 检验交换了原假设和替代假设。
  • 替代假设:数列有单位根。它是不稳定的。
  • 高 p 值是优选的。如果测试返回的 p 值高于选定的显著性水平(如 0.05),我们得出结论,它似乎是(至少趋势)稳定的。
  • 如果 KPSS 检验没有找到单位根,但是 ADF 检验找到了,那么这个序列就是趋势-平稳的:它需要差分(或者其他变换,比如去趋势)来消除趋势。

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

2.4 比较 ADF 和 KPSS 测试结果(pmdarima)

因此,pmdarima 测试返回相互矛盾的结果。

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

2.5 ADF 和 KPSS 推荐的差分顺序

pmdarima 还提供了一种返回推荐的一阶差分的的方法。

这些建议也是矛盾的,因为同样的 ADF 和 KPSS 测试被用来推导它们。

但是我们稍后将回到这些差异的顺序,那时我们将总结我们的发现并决定如何进行。

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

让我们用 statsmodels.stattools 测试来检查这是否只是 pmdarima 算法中的一个怪癖(提示:它不是)。

2.6 增强的 Dickey-Fuller 测试(stattools)——像鸭子一样嘎嘎叫?

  • 与 pmdarima 测试相比,我们使用 statsmodels.stattools 的 adfuller 测试来获得更多信息。
  • 零假设:数列包含一个单位根,它是而不是平稳的。
  • 替代假设:没有单位根。
  • 低 p 值是优选的。如果测试返回的 p 值低于所选的显著性水平(例如 0.05),我们拒绝该空值,并推断该序列不包含单位根。它看起来是静止的。
  • 如果 ADF 测试没有找到单位根,但是 KPSS 测试找到了,这个序列就是差分-平稳的:它需要差分。

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

2.7 科维亚特科夫斯基-菲利普斯-施米特-申试验(KPSS)(stattools)——走路不像鸭子?

  • 零假设:序列围绕一个确定的趋势是平稳的(趋势平稳)。
  • 替代假设:数列有单位根。它是不稳定的。
  • 高 p 值是优选的。如果测试返回的 p 值高于选定的显著性水平(如 0.05),我们得出结论,它似乎至少是趋势稳定的。
  • 如果 KPSS 检验没有找到单位根,但是 ADF 检验找到了,那么这个序列就是趋势- 平稳的:它需要差分或其他变换来消除趋势。

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

2.8 比较 ADF 和 KPSS 的结果——ADF 像鸭子一样呱呱叫,但 KPSS 不像水鸟一样走路

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

2.9 区别还是不区别?

  • 所以 ADF 测试没有找到单位根,尽管上面的图表显示了明显的上升趋势。
  • KPSS 检验报告说该序列不是平稳的。

我们如何处理冲突?KPSS 检验总是正确的吗?

2.10 视觉真实性检查:分解

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

  • 趋势图没有显示一个恒定的平均值,而是一个上升的趋势。该系列不能是静止的。
  • 自相关图在其 ACF 图和 PACF 图中显示了高度和持续的自相关性,并伴有季节性振荡。如果该序列表现出稳定的季节性,它就不可能是稳定的。

2.11 第一个区别:达到平稳性

我们应用差分法。diff()到原始时间序列;然后检查 ADF 和 KPSS 的平稳性。

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

ADF 和 KPSS 一致认为差分系列是静止的。差异系列不仅叫起来像鸭子,走路也像鸭子。

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

2.12 平稳——但是季节性呢?

我们已经应用了一阶差分,并从 ADF 和 KPSS 获得了良好的测试结果。尽管 ACF 图仍然显示季节性波动。

让我们运行 OCSB 和 CH 测试来决定我们是否也需要季节差异的帮助。

两个测试的 pmdarima 实现返回季节差异的推荐顺序。

奥斯本-楚伊-史密斯-伯兴霍尔 OCSB 试验:

卡诺瓦-汉森季节稳定性检验:

  • 零假设:季节性模式是稳定的

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

2.12 当我们调查原始数据时,我们观察到另一个冲突,这次是关于季节差异:

  • OCSB 没有确定对季节性差异的需求,类似于 ACF 对首次差异的需求。
  • CH 检验推荐一阶季节差异,类似于 KPSS 的一阶差异。

2.12b 当我们对我们在第 2.11 章中生成的一阶差分数据运行 OCSB 和 CH 时,OCSB 和 CH 同意一阶差分已经消除了任何季节差分的需要。

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

相反,如果 OCSB 或 CH 建议进行差分,我们将通过追加。diff(12)方法到原始系列。

pandas 中差分的语法:如果 y 是表示一系列未差分数据的变量,则:

  • y.diff(1)表示一阶差分
  • y.diff(12)表示季节性差异,如果季节性的周期为 12 个月。建议的季节差异顺序将乘以 12 的周期,以告知 pandas 函数。diff()关于从季节周期的末尾跳到前一个末尾应该使用的滞后数。
  • y.diff(1)。diff(12)或 y.diff(12)。diff(1)-用于在一行中结合第一和季节性差异。第一和季节差异的序列是不相关的——结果是一样的。
  • 【duke.edu ARIMA 车型识别规则(T3):
  • “规则 12:如果系列有一个强而一致的季节模式,那么你必须使用季节差异的顺序(否则模型会假设季节模式会随着时间的推移而消失)。
  • 但是,不要使用一个以上的季节差异或
  • 超过 2 阶的总差异(季节性+非季节性)。"

2.13 民主同盟军与 KPSS 的冲突——我们如何处理?

如果 ADF 和 KPSS 测试返回相互矛盾的结果,我们该如何进行:区别还是不区别?

作为一般规则:

  • ADF 检验和 KPSS 检验都不会孤立地证实或破坏平稳性。运行这两个测试来决定你是否应该有所不同。
  • 如果至少有一个测试声称发现了非平稳性,你应该区别对待。对躲避(平稳性)的明确确认要求两种测试都确认嘎嘎叫和摇摆。

更具体的解释是:

KPSS 和 ADF 测试结果有 4 种可能的组合

  • 如果 KPSS 和 ADF 同意序列是平稳的(KPSS 有高 p 值,ADF 有低 p 值):认为它是平稳的。没必要区别它。
  • ADF 找到一个单位根;但是 KPSS 发现这个序列在一个确定的趋势附近是稳定的(ADF 和 KPSS 具有高 p 值)。那么,该序列是趋势稳定的,需要消除趋势。区别它。或者,转型可能会让它摆脱这种趋势。
  • ADF 找不到单位根;但是 KPSS 声称它是不稳定的(ADF 和 KPSS 具有低 p 值)。那么,这个序列是差分平稳的。区别它。
  • 如果 KPSS 和 ADF 一致认为序列是非平稳的(p 值低的 KPSS;具有高 p 值的 ADF):认为它是非平稳的。区别它。

让我们将这个启发转化为 Python:

对于一阶差分,我们采用 ADF 和 KPSS 推荐的高阶差分。

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

对于季节性差异,我们采用 OCSB 和 ch 推荐的较高订单。为了避免过度差分,我们应该检查一阶差分是否已经达到平稳性。

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

在一轮差分后,代码再次运行所有四个测试——ADF、KPSS、OCSB 和 CH——以确认是否需要额外的差分。在我们的例子中,所有四个测试都同意我们在第 2.11 章中应用的一阶差分足以得到一个平稳的时间序列——我们现在可以把它交给一个预测模型。

小鸭子图片:unsplash.com 张铠麟·盖奇;

当统一的阈值不够时

原文:https://towardsdatascience.com/when-a-uniform-threshold-is-not-enough-b16da0fbb4e1?source=collection_archive---------19-----------------------

适应可以走很长的路。

你儿子是阅兵式上唯一一个步调一致的士兵?

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

图一。由马克·德容Unsplash 上拍摄的照片

你立刻就注意到了。不是因为这是你的儿子,而是因为你善于发现规律中的偏差。

如果你的工作是在显微镜下检查平板显示器,以检测异常像素,这种超能力可能会被证明是有用的——只要你能连续几个小时这样做而不会无聊死。

检查常规模式很容易——对任何人来说都是如此——但是非常乏味。这是一项应该用计算机视觉自动完成的任务。

织物中的缺陷

织物是具有规则图案的制成品的一个例子,任何偏差都被认为是缺陷。

让我们站在一位计算机视觉工程师的立场上,他负责设计一个自动系统,用于检测从织机上输出的布条的图像。

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

图二。漂亮的布料图案。在 Unsplash安娜露莎·甘博亚的照片。

在本文中,我们将使用 AITEX 织物图像数据库【1】。它由有缺陷和无缺陷的织物条的灰度图像组成。该数据库还包括指示缺陷位置的掩模。

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

图 3。织物带(上图)及其相应缺陷遮罩(下图)的图像。缺陷显示为黑色。来自 AITEX 织物图像数据库的图像。

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

图 4。织物带(上图)及其相应缺陷遮罩(下图)的图像。缺陷看起来很亮。来自 AITEX 织物图像数据库的图像。

我们将重点关注那些以像素斑点形式出现的缺陷,这些像素的灰度明显高于或低于其周围环境。我们将不描述织物的质地。

你可以在这里找到本文中使用的代码。

一种合理的方法是应用阈值操作来突出亮像素,并应用反阈值操作来突出暗像素。阈值(对于两种操作)将必须单独计算,因为整体灰度级从一幅图像到下一幅图像变化很大。

均匀阈值

一个好的起点是评估图像的中间灰度级,因为中间灰度级不会受到图像左侧的太大影响,在图像左侧,成像系统可能在织物带到达照相机的成像线之前扫描列。然后可以通过将灰度级中值加上(对于标准阈值)或减去(对于逆阈值)一个固定量来设置阈值。这些增量值的大小将决定阈值操作对于亮像素和暗像素的敏感度。

我们将这种方法称为 统一阈值 ,因为单个阈值和逆阈值将统一应用于图像。

我们首先模糊图像以衰减其高频成分,假设缺陷将大于几个相连的像素。OpenCV 函数 cv2.blur() 对中心像素附近的灰度级进行均匀平均。我们选择一个足够大的邻域大小,以使不需要的图案消失,但是足够小,例如足够大的缺陷仍然从背景中清晰地突出。

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

图 5。使用 11x11 的邻域大小进行均匀平均的模糊效果。图片由作者提供。

为了计算中位数,我们调用 NumPy 的函数 np.median()

标准阈值和反阈值操作都由 OpenCV 函数 cv2.threshold() 实现。函数参数中的“类型”标志指定了所需的操作类型。我们通过偏移刚刚计算的中值灰度级来获得两种操作的阈值。

标准和逆阈值。作者代码。

在将暗像素的掩模与亮像素的掩模合并之后,我们得到异常掩模,突出灰度级足够暗或足够亮的像素。如果我们忽略图像的左侧,在某些情况下我们会得到好的结果。看起来我们只差一点点了!

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

图 6。统一阈值成功识别异常的三个例子(红色=明亮;蓝色=深色)。图片由作者提供。

但这并不是故事的结尾!

随着我们测试更多的图像,我们发现织物带的大部分区域被检测为亮或暗,而我们的判断告诉我们这些区域不应被视为异常。

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

图 6。三个示例中,统一阈值突出显示了没有异常的区域。图片由作者提供。

我们达到了统一阈值方法的极限。经过一些研究,我们观察到,在某些情况下,当我们从左向右扫描图像时,平均灰度级缓慢变化。

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

图 8。每列的平均灰度级示例。变化是显著的。图片由作者提供。

原因可能与成像系统有关。也许图像是用线扫描相机拍摄的,并且光照强度或积分时间不是恒定的。这也可能与产品本身有关:织物的颜色可能会随着条纹的变化而变化。我们不知道为什么,但我们必须处理这个问题。

统一的门槛是不够的。

自适应阈值

自适应阈值正是为这种情况而发明的。不是对整个图像使用单个阈值,每个像素都计算其阈值,因此有了限定词自适应

对于给定的中心像素,评估邻域中像素的灰度加权平均值。阈值是平均灰度级,偏移某个常数以提供所需的灵敏度级别。在输出遮罩中,将中心像素灰度级与其自己的个性化阈值进行比较。

自适应阈值处理允许高亮显示与它们的邻域有足够差异的像素,而不是简单地高于或低于统一阈值。

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

图 9。左图:棋盘的原始图像。中心:均匀阈值由于光照不均匀,无法同时分割黑色和白色方块。右图:自适应阈值处理可以同时分割黑色和白色方块。图片由作者提供。

回到均匀阈值处理没有产生良好结果的织物图像情况,我们可以找到一组工作得更好的参数,使用自适应阈值处理(由 OpenCV 函数cv2 . adaptive threshold()实现)。

标准和反向自适应阈值处理。作者代码。

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

图 10。当平均灰度级沿 x 轴缓慢变化时,自适应阈值产生更好的结果。图片由作者提供。

从这一点来看,下一步将是基于维度标准和与其他斑点的接近度(或者机器学习,如果我们有足够的例子)来过滤异常掩模斑点。这将是一个巨大的挑战,但至少,通过这个简单的技术,我们摆脱了与织物缺陷无关的伪像。

结论

在自动化系统检测零件的制造环境中,经常会遇到类似于我们刚刚观察到的图像不一致的情况。照明条件可能不同,被检测的零件可能有不同的颜色或反射率,多个摄像头可能有不同的灵敏度,等等。

设计对这些变化具有鲁棒性的计算机视觉系统是至关重要的,因为它们不是制造工程师和操作员所关心的:找到缺陷而不被大量的错误警报所超载。有时,像使用自适应阈值这样简单的事情会有很大帮助。

[1] AFID:用于缺陷检测的公共织物图像数据库。Javier Silvestre-Blanes,Teresa Albero-Albero,Ignacio Miralles,Rubén Pérez-Llorens,Jorge Moreno,AUTEX 研究杂志,2019 年第 4 期

当人工智能出错时

原文:https://towardsdatascience.com/when-ai-gets-it-wrong-2d561e7d7d73?source=collection_archive---------69-----------------------

人工智能校准和安全

实现人工智能的承诺需要什么样的伦理框架?

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

图片来自 Nick WessaertUnsplash

2020 年 12 月初,蒂姆尼特·格布鲁(Timnit Gebru)在提交了一篇概述使用基于人工智能的语言模型所引发的伦理紧张的论文后,被谷歌解雇。这一事件在科技行业引起了很大的轰动,突显了大型科技公司面临的道德问题以及它们在内部管理这些问题的努力。

正如《麻省理工技术评论》的一篇文章所强调的[1],这些模型的形成是非常消耗二氧化碳的。神经架构研究的变压器模型(213M 参数)的形成消耗了超过纽约-旧金山往返行程的二氧化碳当量的 300 倍**。这些庞大的训练数据集的另一个问题是不可能仔细检查数据集的组成并识别偏见不道德内容。这很容易导致种族主义或非包容性的模式。**

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

来自 Strubell 等人的数据,来自作者的可视化,来自 Good Ware 的图标

这是与人工智能模型不断增长的能力和可扩展性相关的风险的最新例子。如果不仔细考虑,他们很容易在许多方面危及我们的社会。为了让这些新产品获得系统用户的信任和认可,必须定义一个清晰的道德框架,如上所示,内部道德控制可能不是解决方案

人工智能带来的挑战

人工智能的使用引发了许多问题:

  • 当使用人工智能工具做出的决定伤害了某人,并且你无法解释这个决定是如何做出的,会发生什么?
  • 我们能在多大程度上防止算法重现人类行为的错误和偏见?
  • 如何防止人工智能加剧排斥和贫困
  • 人工智能的使用如何适应联合国设定的全球目标框架?
  • 在一些领域,如生命攸关的医疗保健,失败不是一个选项,我们迫切需要了解何时使用和何时不使用模型以及如何获得问责

深度神经网络可能无法推广到非分布输入,包括自然的、非对立的输入,这在实时设置中很常见。(2)

什么是负责任的 AI?

随着模型变得越来越复杂,我们会遇到隐私、T2、可解释性、公平、歧视等问题。负责任的人工智能确保我们与社会价值观保持一致。我们希望我们构建的产品是包容的、无害的。

当向用户呈现数据时,负责任的人工智能最佳实践需要最大可能的透明性:例如为什么用户会看到一个推荐。这将帮助建立信任。此外,需要有一个良好的内部工作流程,人们评估生成的模型的结果,并验证模型正在做它们应该做的事情。最后,我们还希望得到公平(公正)的结果,而不是复制或强化你在数据中看到的偏见。

其他注意事项

当你需要了解模型的局限性,它能做什么,它不能做什么的时候,很多人就把模型下架了。此外,你构建产品的方式也必须是道德的:你是否拥有使用数据的所有必要的许可?你公平对待给数据贴标签的人吗?

当涉及到决策时

今天,在某些情况下,AI 替我们做决定。如果不是,它会影响我们的决定。

人工智能可以造成更大规模的伤害。强化刻板印象的语言模型就是这种情况。即使你的性别不在简历里,也可以通过模型推断出来,作为特征使用[3]。这些模型目前用于招聘、信用评分或由司法系统使用,它们可能导致整个人口类别的机会丧失,因为同样的启发式规则可以应用一百万次

这就是为什么我们需要后退一步,不仅要看性能指标,还要看它实际上如何改变行为。世界上没有多少公司关注他们模型的道德标准。这需要在开发模型和维护模型时进行评估。

那么我们该怎么办呢?

如果你正在构建一个人工智能产品,从哪里开始你的道德之旅是最好的?

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

图像来自 Unsplash 上的 Lili Popper

这些数据需要进行伦理审查

我们通常关心数据质量和数据量。现在我们还需要看看代表性:我们的数据是否公平地代表了所有类别?

我们有需要注意的敏感数据吗,比如性别、种族或国籍?从数据集中移除这些特征通常是不够的。例如,使用高度相关的其他特征(你住在哪里,你的爱好是什么……)来重建种族数据是可能的。

人工智能团队需要接受教育,不仅要追求模型的准确性,还要追求模型背后的责任。

追求数据的多样性和包容性

良好的数据多样性意味着你不仅仅是强化已经很明显的现有趋势。例如,仅基于购买次数的项目推荐系统将突出众所周知的现有项目,并对尚不知名但可以提供更好的原创建议的新兴设计师隐藏新项目。最后,模型不会很有用。

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

寻求多样性需要检查隐藏在系统和流程背后的歧视|图片来自克里斯蒂娜@ wocintechchat.comUnsplash

某些群体得到了更有利的结果吗?

这一努力需要包括来自非常不同地方的人们的声音,以便不重复过去的错误。[2]

“如果我们允许该领域缺乏地理多样性来定义我们自己的努力,我们这些从事人工智能伦理工作的人将弊大于利。” 阿布舍克·古普塔【2】

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

2019 年来自 ArXiv 的每个国家在总 AI 作者中的百分比|来自https://jfgagne.ai/的数据,来自作者的可视化

规格不足

欠规范是指在训练数据上学习了正确的映射,但没有再现自然的因果关系。当观察到的行为是多种原因的结果时,通常会出现这种情况[4]。这导致模型不能很好地概括。

在固定数据集上形成一个模型可以产生几个工作类似的模型。如果没有对模型如何做出预测的解释,它们之间的差异将不会直接可见。只有通过在现实世界中的具体例子上进行测试,我们才能看出其中的区别。

因此,为了避免生产中令人不快的意外,我们应该添加测试和规范,覆盖大量场景,甚至是不可能的场景。

“我们需要更好地准确说明我们对模型的要求。[……]因为通常最终发生的情况是,只有在模型在世界上失败后,我们才发现这些需求。”亚历克斯·达穆尔

构建能够揭示困难情况的场景

当所有的利益相关者都在房间里时,问问谁会受到你的产品的影响。确保你没有强化任何偏见。想想你的产品的用途与最初的意图不同。最后,如果出了问题,最坏的情况是什么,有办法改变吗?

可解释性

我们必须能够给出原因。

为什么我有这么可怕的信用额度?为什么我要多雇 7 个人?你为什么推荐我看这个节目?

它与解释模型预测的能力有关。

让人类参与进来

  • 当您评估模型输出时,在循环步骤中添加一个人
  • 添加手动过程:重新手动注释一些数据(可以随机选择或者使用主动学习策略)

“是的,特斯拉的过度自动化是一个错误。准确地说,是我的错误。人类被低估了。”埃隆·马斯克

Z 检验流程

几个月前,在 Zicari 教授的领导下,我们与来自欧洲和加利福尼亚的多种多样的合作者一起,开始了对两种人工智能产品的伦理检查。前者是一个机器学习系统,用作识别紧急呼叫中心脏骤停的支持工具[4],后者是一个基于深度学习的皮肤病变分类器[5]。

检查的目的是确保接受检查的产品没有表现出不适当的行为,并解决围绕它的道德紧张。

这种检查始于一个多学科专家团队的创建,他们将成为负责检查人工智能产品的伦理影响的外部行动者。

这个过程从与产品的创建者会面开始,以了解产品的规格、目标和限制。通过经历多次迭代,我们已经创建了需要考虑的信息和紧张的积压。这用于创建社会技术场景,将产品置于与演员、用户和系统的交互中。反过来,强调了紧张和困境,如果有必要,将通过建议和道德维护来分析和解决。有关该流程的更多信息,请访问网站[6]。

我将在以后的文章中更详细地描述这个伦理检查的故事。

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

图片来自米切尔罗Unsplash

参考

[1] 凯伦·郝,我们读到了迫使蒂姆尼特·格布鲁离开谷歌的那篇论文。它是这样说的。麻省理工科技评论。链接

[2] 阿比谢克·古普塔&维多利亚·希思档案馆,人工智能伦理组织正在重复社会的经典错误之一。麻省理工科技评论。链接

[3] 古普塔,a .,卢茨,M.J .,拉赫马尼,a .,王,K. ,2019。简历排名工具中隐含的性别偏见。

[3]Will Douglas heave archive,我们训练 AI 的方式从根本上就是有缺陷的。麻省理工科技评论。链接

[4]布隆伯格·SN、福尔克·F、厄斯伯尔·AK、克里斯滕森·HC、托尔普-彼得森·C、塞尔·MR、伯爵 CR、利珀特·FK。机器学习作为识别紧急呼叫中心脏骤停的辅助工具。复苏术。2019 年 5 月;138:322–329.doi: 10.1016/j .复苏. 2019.01.015. Epub 2019 年 1 月 18 日。PMID: 30664917。

[5]卢西耶里,巴杰瓦,M.N .,布劳恩,s .,马利克,m .,登格尔,a .,艾哈迈德,S. (2020)。使用概念激活向量的深度学习皮肤损伤分类器的可解释性。 2020 年国际神经网络联合会议(IJCNN) ,1–10。

http://z-inspection.org/the-process-in-a-nutshell/

机器学习中何时以及如何使用幂变换

原文:https://towardsdatascience.com/when-and-how-to-use-power-transform-in-machine-learning-2c6ad75fb72e?source=collection_archive---------24-----------------------

让我们看看这个强大的数据预处理工具

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

作者图片

专业数据科学家知道,在向任何模型提供数据之前,必须准备好数据。数据预处理可能是机器学习管道中最重要的部分,其重要性有时被低估了。

幂变换是一组在某些情况下非常有用的变换。让我们看看什么时候。

什么是电力转换?

Power transfom 是一系列使用幂定律转换数据的函数。我们的想法是对数据集的每个要素应用变换。

电源转换的目的是什么?想法是增加特征分布的对称性。如果特征不对称,应用幂变换将使其更加对称。

让我们看一个使用 scikit-learn 中的乳腺癌数据集的例子。如果我们绘制前 6 个特征的直方图,我们会发现它们非常不对称。

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

作者图片

如果特征不对称,某些模型可能无法正常工作。例如,如果分布是偏斜的,基于距离的模型如 KNN 或 K-means 可能会失败。为了使这些模型起作用,幂变换将使特征对称化,而不会过多地影响它们的预测能力。

一些能量转换

最常见的幂变换是 Box-Cox 和 Yeo-Johnson 变换。

Box-Cox 变换有这样的公式:

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

如您所见,我们有一个λ参数,可以使用最大似然法进行估计。例如,我们可以尝试最小化偏度,尽可能保持方差稳定。

这个公式必须独立地应用于每个特性。每个特征可能具有不同的λ值。

由于独立变量出现在对数中,这种变换只能应用于严格正的特征。

如果我们对之前的数据集应用 Box-Cox 变换,我们会得到:

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

作者图片

如您所见,新特性比原来的特性更加对称。

Yeo-Johnson 变换有这样的公式:

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

我们仍然有一个λ参数要估计,但现在这种变换甚至可以应用于负面特征。

我们数据集的结果是:

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

作者图片

同样,我们有一组可以被我们的模型使用的对称特征。

何时使用电源转换

根据我的经验,当我们使用像 KNN、K-means、DBSCAN 这样基于距离的模型时,使用幂变换是值得的。有人说它们对线性模型和高斯朴素贝叶斯有用,但我对前者比对后者更有把握。基于树和神经网络的模型不受特征对称性的影响,而如果我们只需要使用线性核,SVM 有时可能需要提前进行幂变换。

python 中的一个例子

让我们看看如何在 Python 中使用幂变换。我们将在乳腺癌数据集上使用 KNN 分类器,并看到使用幂变换将提高模型的性能,这是使用 AUROC 测量的。

这段代码可以在我的 GitHub 库这里找到。

我们先导入一些库。

from sklearn.datasets import load_breast_cancer 
import pandas as pd 
from sklearn.preprocessing import StandardScaler 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.pipeline import Pipeline 
from sklearn.metrics import roc_auc_score,balanced_accuracy_score
from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.preprocessing import PowerTransformer 
import matplotlib.pyplot as plt

为了简单起见,让我们导入数据集的前 6 个特征,并将它们存储到 pandas 数据框架中。

d = load_breast_cancer() 
df = pd.DataFrame(d['data'],columns=d['feature_names']).iloc[:,0:6]

我们现在可以将这个数据集分为训练和测试。

X_train, X_test, y_train, y_test = train_test_split(df, d['target'], test_size=0.33, random_state=42)

现在,我们可以在训练集上训练我们的模型,并在测试集上测试它。我们将使用 scikit-learn 中的 pipeline 对象来应用必要的特征缩放。对于第一个例子,我们将避免使用电源转换

model = Pipeline([ ('scaler',StandardScaler()),('model',KNeighborsClassifier()) ]) model.fit(X_train,y_train) roc_auc_score(y_test,model.predict_proba(X_test)[:,1])

如果不进行功率变换,我们得到的 AUROC 值等于 0.976

现在,让我们试着使用能量转换。在 Python 中,我们有 PowerTransformer 对象,它默认执行 Yeo-Johnson 变换,并自动搜索 lambda 的最佳值。如果我们愿意,我们可以使用 Box-Cox-transform,但是对于这个例子,我们将使用默认设置。缩放是可以避免的,因为 PowerTransformer 自动标准化了特性,但是显式地使用它总是一个好习惯。

如果我们对流水线应用功率变换(在缩放器之前),代码是:

model = Pipeline([ ('power',PowerTransformer()), ('scaler',StandardScaler()), ('model',KNeighborsClassifier()) ]) model.fit(X_train,y_train) roc_auc_score(y_test,model.predict_proba(X_test)[:,1])

使用幂变换,AUROC 值增加到 0.986。因此,该模型比没有幂变换特征的模型执行得更好。

结论

当我们必须处理倾斜的特征并且我们的模型对分布的对称性敏感时,幂变换是非常有用的。重要的是要记住在任何缩放之前使用它们。

如果你想了解更多关于电力转换的知识,请加入我的 Python 在线课程中的机器学习数据预处理。

原载于 2021 年 4 月 21 日 https://www.yourdatateacher.comhttps://www.yourdatateacher.com/2021/04/21/when-and-how-to-use-power-transform-in-machine-learning/

当相关性优于因果关系时

原文:https://towardsdatascience.com/when-correlation-is-better-than-causation-1cbfa2708fbb?source=collection_archive---------33-----------------------

“相关性不等于因果关系”

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

米凯拉·帕兰特拍摄的照片

我不喜欢这个短语。不是因为不准(当然准)。我不喜欢它被用来解除分析师的武装。这句简单的话一出口就能让任何分析嘎然而止。

当一个利益相关者说,“是的…但是相关性不等于因果关系”,那就是“你的见解不足以让我采取行动。”又名节目主持人

这个流行的短语让决策者相信,他们需要因果洞察力,以便根据数据做出决策。是的,在一个完美的世界里,我们只会根据因果洞察力行动。但是在实践中,这个要求是不合理的。通常情况下,当利益相关者需要“因果关系”来做决定时,会花费很长时间,所以他们会失去耐心,最终在没有任何数据的情况下做出决定。

例如,考虑 A/B 测试。这是当今团队处理因果关系需求最常见的方式。但是 A/B 很难正确执行——正如无数统计学家挥手试图让我们承认这一事实所显示的那样(比如这个这个)。可悲的现实是,A/B 测试需要大量的数据、完美的工程实现和高水平的统计严谨性才能正确完成…所以我们最终发布了没有有效结果的新特性。

这种事经常发生!但是,数据团队为了在一天结束时做出一个基于直觉的决定,而敷衍了事地试图证明因果关系,这对他们自己没有任何好处。我们需要改变方法。

因果关系的负面影响

现实是因果关系很难证明。它不仅需要更高水平的统计严谨性,还需要大量精心收集的数据。这意味着你要等很长时间才能做出因果关系的判断。这也适用于其他因果推断方法,不仅仅是 A/B 测试。

最终,当用数据做决策时,因果关系是一个不切实际的要求。所以让我们停止尝试,寻找另一种方式。让我们回到使用相关性。

我并不是建议一场混战。我们不想以“技术上相关”但没有合理解释的荒谬见解告终,就像这些。我说的是在商业环境中使用相关性来最大化我们做出“最佳”决策的机会。并且以这样一种方式去做,我们可以相信洞察力给了我们一个合理的预期,任何给定的决定将如何影响我们所关心的事情。毕竟这是数据的目标。

解决方案:一种使用相关性来通知决策的启发式方法

为了从相关性中获得可信的见解,我们希望最大化我们在数据中看到的相关关系实际上是因果关系的可能性。我们可以通过以下四个最佳实践来做到这一点。

1.测试相关性时要有意识

不要把随机的事情联系起来。搜索足够长的时间,你一定会发现一个真正“令人惊讶”的相关性,就像这个。最有可能的是,这种关系是由于机会,现在你已经浪费了你和其他人的时间。统计学家将这种方法称为“p-hacking”。

相反,把重点放在已经联系在一起的事情上。一个很好的方法是关注顾客的行动。如果你试图关联以客户行为为中心的数据,你肯定只能探索以某种方式实际上关联的行为。听起来很简单,但是很容易被忽略。例如,我们不应该看“我们开设课程的时间”如何影响客户注册的可能性,我们应该看“客户看到课程的时间”如何影响他们注册的可能性。因为我们从客户及其行动的角度看待所有行为,所以我们可以保证这些行动是相互关联的,从而增加了我们看到的相关关系也是因果关系的可能性。

2.关联转换率,而不是总数

在大多数分析中,我们试图判断一个特定的决定或变化将如何影响客户的行为。客户行为最好用转化率来表示,而不是总数。如果我告诉你,10 个人转化了 30 个人,这并不能告诉我太多关于客户的行为心态。如果我告诉你网站上 10%的人转化 vs 30%的人,那么你对客户的转化意愿有所了解。

现在,想象一下试图将电话查询总数与总转化率联系起来。我们可能会发现,电话咨询总量的增加与总转化率的增加高度相关。显然是的,因为我们的漏斗中有更多的人,但是我们直觉地知道更多的电话询问并不会导致更多的转化。它们只是相互关联,因为它们都受到另一个因素(体积)的影响。通过查看转换率,我们可以更容易地梳理出可以用来影响客户行为的见解。

您可能还想关联其他标准化指标(如平均订单值),但如果可能的话,应该避免这样做。这些指标可能会有更多的差异,这意味着您要么需要更多的数据来找到可靠的见解,要么需要对指标进行降维(有效地将其转化为转换率)以减少差异,然后再进行分析。我现在不会在这个问题上讲太多细节,但是我们会在以后的博客文章中涉及到它。与此同时,转换率永远是一个安全的赌注。

3.确保趋势在较长时间内保持一致

您的业务和客户总是在变化,因此了解这一点非常重要。很多时候,我们会以汇总的方式查看相关性,从我们的分析中剥离时间。但是一切都在随时间变化,所以过去存在的相关性今天可能已经消失了,如果你不分析数据,你永远不会知道。

由于历史行为是未来行为的最佳预测者,我们需要了解数据是如何随时间变化的,尤其是当我们正在分析的要素也在变化时。如果有 X 的人一直有更高的 Y,那么我们知道我们可以更容易地相信,当我们让更多的人做 X 时,我们也将有更好的机会增加 Y。只要影响随着时间的推移是一致的,我们就可以更有信心这些趋势在未来也是可靠的。

证明这一点的一个很好的练习是回顾你以前运行的 A/B 测试。当我们这样做的时候,我们发现其中一些在短时间内具有统计学意义,并且随着时间的推移并不一致。这是 A/B 测试中常见的风险,因此,许多专家建议运行 evergreen 测试。但是这带来了很多工程上的复杂性,大多数团队最终都没有设置好。

4.始终监控结果

使用相关性的坏处是,我们可能是错的。尽管当我们遵循上面的最佳实践时,这种可能性降低了,但它仍然是一种风险。但是,如果我们能够对相关的发现迅速采取行动,并警惕地监控结果,我们就可以极大地降低任何错误决策演变成灾难的风险。顺便说一句,这也适用于因果洞见。事情总有不按你预期的方式发展的风险(就像这个警示故事)。

在监控结果的时候,追踪你所做的改变是如何影响你想要达到的结果是很重要的。假设您发现使用折扣代码的客户与平均订单价值之间存在正相关关系。一旦你发现一个相关的趋势,你会想慢慢地将客户量转移到有更好表现的群体中。然后,我们可以使用下图监控结果。

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

作者图片

如果我们能在做出改变的同时跟踪这些数据,我们就能知道我们是否做出了正确的决定,如果没有,我们就会很快失败。

一种可重用的、可靠的方法

我们可以将这种方法自动化,分析将类似于下面的分析,使决策者能够更快地做出更多数据驱动的决策。

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

作者图片

结论

在实践中,我们需要准确的洞察力,我们需要快速行动。等待两个月的因果分析或四周的 A/B 测试是不会成功的。但是,如果我们能够对相关性迅速采取行动,特别是当它们已经使用上述技术进行了严格评估时,我们将能够更快地做出更好的决策。所以,让我们放弃“相关性不等于因果关系”这句话,对相关性本身多一点信心。

原载于 2021 年 8 月 11 日 https://www .叙述者. ai

支持向量机什么时候会失败?

原文:https://towardsdatascience.com/when-do-support-vector-machines-fail-3f23295ebef2?source=collection_archive---------5-----------------------

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

托马斯·索贝克在 Unsplash 上的照片

何时使用和不使用它们,以及如何使用

介绍

你可能碰巧看到了我的上一篇关于介绍支持向量机(SVMs)的文章,在这篇文章中,关键的基本概念在一个高层次上被介绍了。在本文中,我们将讨论在分类和回归用例中,支持向量机何时不适合使用。

1)支持向量机不适合大型数据集

已知最初的 SVM 实现具有具体的理论基础,但它不适合在大型数据集中进行分类,原因很简单-算法训练的复杂性高度依赖于数据集的大小。换句话说,训练时间会随着数据集的增长而增长,直到由于计算限制而变得不可行为止。

从好的方面来看,自 1992 年美国电话电报公司贝尔实验室首次实施以来,SVM 已经取得了一些进展[1]。如今,随着数据集规模的增大,训练支持向量机的可扩展性大大提高。

2)支持向量机在不平衡数据集中表现不佳

这有两个更好的理由。第一个是软利润优化问题的弱点。当不平衡数据用于训练时,这导致超平面偏向少数类。

第二个原因源于不平衡支持向量比率的问题,即正和负支持向量之间的比率变得不平衡,结果,超平面的决策边界处的数据点被分类为负的可能性更高。

然而,有一些方法可以减少这种影响。一种更常用的方法是引入类别权重,因此正面支持的大小将成比例地高于负面支持向量的大小。当使用不平衡数据集进行训练时,类权重也用于其他机器学习算法中。

3)具有“错误”核的支持向量机

这有点直观。对于现在的支持向量机来说,选择正确的核函数是关键。例如,当数据不可线性分离时,使用线性核会导致算法性能不佳。然而,选择“正确的”核本身是另一个问题,在所使用的技术中,流行的技术包括在超参数搜索中改变核函数。

4)当数据中有太多噪声时

在这些有噪声数据的情况下,目标类是重叠的,也就是说,要素可能具有非常相似或重叠的属性。由于优化算法的性质,这可能导致达到几个局部最优,特别是对于高维数据集。

然而,值得注意的是,对于具有高偏差的核,例如线性和多项式核,噪声不应该是问题。噪声问题应该更多地存在于诸如径向基函数(RBF)的低偏差核中。

附加备注

虽然使用原始 SVM 算法有几个众所周知的缺点,但多年来已经进行了大量研究来改进它,使得上述现有影响不太严重,并且可以通过其他方法来减少/减轻。

参考

[1] Boser,b .,Guyon,I .,Vapnik,v .:最优间隔分类器的训练算法。《第五届计算学习理论年度研讨会论文集》,匹兹堡(1992)

[2]巴图维塔和帕拉迪(2013 年)。支持向量机的类别不平衡学习方法。在不平衡的学习中。https://doi.org/10.1002/9781118646106.ch5

当 Google Analytics 和 Data Studio 不够用,是时候转而使用 Google BigQuery 了

原文:https://towardsdatascience.com/when-google-analytics-and-data-studio-arent-enough-and-it-s-time-to-switch-to-google-bigquery-ff286fcdf8d8?source=collection_archive---------23-----------------------

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

来源: Unsplash

让我们弄清楚什么时候应该放弃标准的 Google Analytics 和 Google Data Studio 解决方案,转而考虑选择数据仓库

业务越来越多地转移到网上,2020 年已经表明,许多行业的公司没有网上业务根本无法生存。自然,在线客户越多,在线用户活动就越多,营销分析师就越需要处理数据以获得有用的见解。

这些数据必须存储在某个地方,进行处理(最好是实时处理),并无限期存储。毕竟,对于一个有经验的营销人员来说,历史数据是一笔真正的财富。

让我们弄清楚什么时候应该放弃标准的 Google Analytics 和 Google Data Studio 解决方案,转而考虑选择一个数据仓库。

挑战

许多人都熟悉这样一种哲学:如果一切正常,不要碰它,因为你会弄坏它。一方面,这种说法非常合理,但另一方面,企业的需求往往很快超出定制服务的能力。

如今,游戏规则正以惊人的速度变化着。移动和智能设备使营销变得复杂,并不断增加营销中使用的数据量。从 GlobalWebIndex 的 2020 年全球媒体情报报告中可以看出,这种趋势不会消失。

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

来源: eMarketer

为营销报告生成数据的设备数量每天都在增加。相应地,营销专家处理的数据量也在增长。仅仅使用关于销售和广告活动的信息已经不够了。营销报告应该考虑许多不同来源的数据(广告服务、网站、移动应用程序、在线商店、线下商店、客户关系管理系统和呼叫跟踪系统)。同时,来自不同来源的数据也有不同的组织方式。

几乎所有营销人员使用的标准服务,如谷歌分析和谷歌数据工作室,都有其局限性。它们的灵活性和可扩展性不足以应对不断变化的需求。此外,许多公司根本缺乏处理数据的资源。因此,大多数信息都有未经处理和未被使用的风险。

营销分析师的首要任务是尽可能快、尽可能便宜地为他们的公司提供高质量、有用的见解。云服务和数据仓库在这方面发挥了重要作用,提供了重要的扩展解决方案和设置灵活性。让我们来看看如何理解什么时候该改变你正在使用的工具。

什么时候使用 Google BigQuery 才有意义?

大多数公司使用谷歌的知名和受欢迎的服务。然而,并不是所有的服务都同样有用,也不是所有的服务对所有的公司都合适或必要。这完全取决于企业和行业的规模。从逻辑上讲,只有一个登录页面的初创公司和大型全渠道零售商需要不同的分析工具。为了避免不必要的金钱和时间支出,公司必须清楚地了解自己需要什么。

当您遇到以下服务的局限性时,是时候改变您的分析系统了:

谷歌分析

**注意!**在本文中,当我们谈论谷歌分析时,我们指的是通用分析。谷歌最近推出了名为谷歌分析 4 的新版谷歌分析,这是新用户的默认选项。下一代谷歌分析有其优势和局限性,但目前(截至 2021 年初),该产品仍在完善、改进和更新中。

如果你还没有太多的数据,或者你刚刚推出你的在线商店,那么谷歌分析(即通用分析)非常适合你。一开始,如果你只有几个广告源,你可以很容易地手动下载数据。但是随着广告渠道和活动数量的增加,考虑自动化是值得的。否则,你会发现自己陷入了例行和无聊的数据传输。为了节省时间和避免人为错误,你应该自动化你的营销。

OWOX BI 允许您轻松快速地将不同广告服务的成本数据自动收集到 Google Analytics 和 Google BigQuery 中。此外,OWOX BI 检查 UTM 标签,并自动将所有成本数据转换为您的基础货币。

回到 Google Analytics 的数据收集限制:这项服务是免费的,可以处理世界范围内的大量信息,从逻辑上讲,它对数据收集设置了限制。这些限制适用于所有 Google Analytics 收藏标签、库和 SDK。

如果你有一家小企业或一家初创公司,每年的广告预算高达 10 万美元,你就没什么好担心的。你不太可能超过服务限制。但是那些一年广告预算在 10 万美元或以上的公司应该小心了。您很容易超出限制,并因此丢失有关用户行为的重要信息。您需要非常小心这些限制:

  • 测量协议,Android SDK,iOS SDK,gtag。js 和分析。js —每个用户每天 200,000 次点击,每个会话 500 次点击
  • Web 属性、属性、跟踪 ID —每个属性每月 1000 万次点击
  • 移动片段,遗传算法。js 和任何其他遗留跟踪库——每个会话 500 次点击

当然,很难错过谷歌分析关于超出限制和限制新数据收集的信息。但是我们的目标是不要坐以待毙,然后四处乱跑,惊慌失措。意识到这些限制并在达到这些限制时有一个行动计划是很重要的。事实上,当你达到这些极限时,你可以向三个方向移动:

  1. 转到谷歌分析的付费版本。
  2. 保持免费版本,但是减少了监控参数的数量。
  3. 使用数据收集连接器、云存储和可视化服务,专门为您的企业设计定制的分析系统

数据工作室

Google Data Studio 是一款出色的数据可视化服务,可以与其他 Google 产品进行本地集成,并具有许多优势:

Data Studio 还包括许多过滤器、页面和报表级别的元素、计算字段、简单的共享选项以及许多其他功能。

您可以在两个级别使用此服务:

  • **基础。**根据 Google Analytics 的数据创建报告。
  • **高级。**根据不同数据源的数据创建报告(内部 CRM 系统、广告服务的成本数据)。

如果您需要基于一个或两个数据源设置一个直观易懂且优雅的仪表板,Data Studio 非常适合小公司和初创公司。但是不要忘记这个服务是为数据可视化而设计的。它的缺点包括缺乏对 Excel 文件的支持(来自 Excel 的数据必须手动连接),自动仪表板更新速度慢,以及缺乏使用许多数据源的复杂可视化。

Data Studio 功能对于大多数中型公司来说已经足够了,只要它们使用单一数据源。换句话说,您需要将不同来源的数据上传到同一个数据存储中,在那里对数据进行处理,然后上传到 Data Studio。

但是对于每年广告预算超过 100 万美元的大公司来说,处理的数据量对于这项免费服务来说实在是太大了。为了解决这种数据困境,你可以使用 Google BigQuery,它让公司能够在几分钟甚至几秒钟内处理数 Pb 的数据。

什么是 BigQuery?

不同的企业(即使他们来自相同的细分市场)对营销分析有不同的要求——销售渠道、购买频率以及品牌推广和客户保持的方法。值得注意的是,Google BigQuery 的发展使得市场上的所有公司都可以进行大数据分析,而不仅仅是大公司。

Google BigQuery 是一个完全托管的无服务器数据仓库,能够安全、可扩展地分析数 Pb 的数据。此外,作为谷歌云平台的一部分(根据 Forrester Research 的数据管理领导者),该服务与谷歌产品进行了内置集成。

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

图片由作者提供

Google BigQuery 简单快捷,许多专家都可以使用它。它还带有现成的 SQL 查询集,因此您可以从收集的数据中获得有用的见解。它的其他优势包括:

  • **安全可靠。**控制对加密项目或数据集的访问,实施身份访问管理(IAM)。
  • **可扩展性。**根据贵公司的规模、性能和成本要求定制数据存储。
  • **成本优化。**获得现收现付的定价选项和预测成本的能力。
  • **实现价值的时间。**轻松快速地开始使用 Google BigQuery,探索数据以找到有用的见解,并更快地抓住新的商机。

BigQuery 有助于减轻公司管理、控制、维护和保护数据仓库基础设施的负担。这使得组织能够专注于实现业务目标。

此外,不要忘记,当你为营销部门创建一个分析系统时,你应该始终关注两个因素:

  1. 您的企业应该能够完全访问和控制其数据。
  2. 数据应该呈现在一个方便、熟悉、适合决策者的界面中。

当使用 Google BigQuery 时,您可以确保满足这些条件。虽然我们认为这项服务是营销分析师的一个真正发现,但它不能被称为完美无缺。Google BigQuery 限制传入请求的数量、每天更新表的数量等等。为了避免不必要的例行和繁琐的工作,我们建议设置从所有数据源自动导入数据。

市场认可的大型连接器,如 OWOX BI 已经与 Google BigQuery 合作多年。OWOX BI 收集数据并将数据(来自谷歌分析、广告服务、网站、线下商店、电话跟踪系统和 CRM 系统)合并到谷歌 BigQuery 中。因此,您可以以统一的结构接收所有数据,并可以使用它来创建任何报告。

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

图片由作者提供

用 Google BigQuery 集成数据

如果您决定使用 Google BigQuery 来研究您的数据,那么请注意,这样做的第一步是准确地识别您需要处理的所有数据源。这可能包括各种服务、平台和应用程序,如 Google Analytics、广告服务、网站、线下商店、呼叫跟踪系统和 CRM 系统。对于许多公司来说,这是使用 BigQuery 的主要挑战。

请注意,要从非谷歌产品自动上传数据,您需要一个处理和传输数据的平台,如 OWOX BI Pipeline ,它为每个人提供流行和定制的连接器。

许多营销人员被 BigQuery 吓坏了,因为他们必须等待分析师准备好报告或了解 SQL。OWOX BI 是专门为将数据存储在 Google BigQuery 数据存储中的营销人员设计的。

OWOX BI Smart Data 将您的数据以适合您业务模式的格式进行组合,并允许您在简单的报告设计器中轻松构建报告。数据只有在给你的企业带来优势时才有价值。您可以完全专注于您的业务目标,而智能数据则关心您的数据源和数据结构,并考虑您的业务模型。该产品为营销人员提供了一个解决方案,无需 SQL 查询,只需点击几下鼠标即可构建报告。

无需任何编码即可获得现成的营销报告!通过使用简单的 OWOX BI Report Builder 界面,您无需了解数据的结构或等待分析师的响应。只需选择您希望在报告中看到的维度和指标,智能数据就会以您能够理解的方式即时显示您的数据。

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

图片由作者提供

关键要点

  • 为了应对现代数据驱动营销的复杂性,您需要创建一个适合您业务的营销分析环境。
  • 从小步开始,但要有未来发展的规划。
  • 对于有望使用大数据的成长型企业来说,云存储是最佳选择。
  • 使用像 Google BigQuery 这样的服务可以降低运营和材料成本,确保项目的可扩展性,并利用包括机器学习在内的高级功能。
  • 通过将您的数据工作负载迁移到 BigQuery,您将降低基础设施维护成本,并有时间发挥创造力,寻找强大的见解和想法来实现您的业务目标。

了解数据操作

原文:https://towardsdatascience.com/when-i-was-told-to-lead-the-dataops-initiatives-at-work-i-didnt-know-where-to-begin-489b6aa751ca?source=collection_archive---------33-----------------------

行业笔记

当我被告知在工作中领导数据运营计划时,我不知道从哪里开始。所以我从最容易的地方开始,通过谷歌搜索。

数据操作的定义很无聊。这是:

DataOps 是一种自动化的、面向流程的方法,由分析和数据团队使用,用于提高质量和缩短数据分析的周期时间。—维基百科

好吧,所以任何与流程、政策、框架有关的事情,为了缩短分析周期,提高数据质量,确保数据正确性,强调协作和自动化,都是数据运营。

起初,这听起来让人不知所措。数据操作的定义是如此模糊和宽泛,以至于它似乎涵盖了数据世界下的一切。我过去常常花数小时与我的经理讨论和辩论什么是数据运营,什么不是数据运营。我需要清楚地定义数据运营,否则我该如何为数据运营团队制定计划和路线图?

幸运的是,经过一段时间的研究和与我的经理交流,我对 DataOps 有了更好的理解。我想在这里分享的是我个人对数据操作相关工作的理解。虽然有些细节只适用于我的工作场所,但我相信也有适用于任何地方的普遍经验。

第 1 部分:为什么选择 DataOps?

简而言之,DataOps 是管理日益庞大和复杂的数据的一种方式。如果你只有少量的数据管道,你就不需要数据操作。无论有没有框架,工程师都可以轻松管理管道。

当你有更多的数据时,比如由数百个不同来源创建的数百条管道,管理它们将会变得更加棘手。如果您想快速、高效地扩展,您必须有一个一致的方法来收集、处理和理解数据。你需要某种框架,那就是数据操作。

第二部分:如何做数据操作?

我将尝试通过给你一些数据操作相关工作的常见主题来解释这一点。

1.找到共同的模式,对每个用例进行归纳

是的,这一点也不奇怪。与编码类似,找到一个好的抽象有助于使数据更容易管理,更不容易出错。

在一家高速发展的公司中,数据量和数据管道的数量呈指数级增长。数据工程团队的发展速度赶不上数据的增长速度,那么我们如何处理不断增长的数据需求呢?

虽然对新管道的需求迅速增加,但幸运的是,不同类型的数据问题数量很少。通过标准化,并认识到数据问题的共同模式,我们能够建立通用框架来处理数据。当我们创建一个通用框架来解决一种类型的数据问题时,我们就解决了所有相同类型的数据问题。这可以应用于任何需求不断增长的问题,比如创建新的数据管道、新的数据模型、管理数据访问等。对于每个问题,找出共同的模式,并为其设计解决方案。

这里有一个好的建议,在制定任何规则和设计解决方案之前,先列出用例及例子。列出用例可以帮助你可视化和识别现有问题空间中的模式。将每个模式或用例放在不同的桶中进行分类。列出每个存储桶中项目的属性。然后设计一个规则,定义什么进入同一个桶。如果规则必须变得复杂,以确定哪个用例属于哪个存储桶,那么用例的类别很可能没有被清楚地定义。回去重新设计存储桶,而不是改变规则或创建复杂的分类规则。冲洗并重复。

测试用例是否被清晰定义的一个好方法是尝试把一个新的数据问题分类到一个桶中。如果所有新的数据问题都可以很容易地归入定义的桶中,那么恭喜你!您已经找到了共同的模式,现在您可以着手为它们中的每一个设计解决方案。基本上,它是对数据模式进行切片和切块,直到您达到足够好的折衷:一个足够健壮的解决方案,以满足任何已知数据问题的变化,并高度覆盖所有不同的用例。

这一过程的难点在于正确地构建问题。设计解决方案更加容易。如果你没有解决方案,很有可能互联网上的其他人有。但是,要确保问题得到正确解决,需要更多的考虑和思考。花点时间把这个问题弄清楚是值得的。这是您如何确保在为 it 设计解决方案时,您所付出的努力是值得的。

2.文档文档文档

随着公司的发展,不可避免的是,跨部门的团队越来越分散,越来越难保持相同水平的团队凝聚力。虽然口头交流只能做这么多,但书面和记录的交流是永恒的。文档是组织中最被低估的工作。随着公司规模的扩大和多样化,文档的重要性只会增加。做得好的话,文档可以节省时间,保留知识,并提高用户的生产力。是跨部门同事沟通理解最有效的方式。随着公司员工的来来去去,文档有助于用户快速加入,并确保他们离开时上下文不会丢失。

有了数据,这敲响了更真实的警钟。数据通常很难理解,因为它有许多维度。它不仅仅是您在表格中看到的列和行。要理解数据,用户需要理解数据的 5W1H。它从哪里来的?谁创造的?什么时候产生的?是如何产生的?创建数据的目的是什么?谁使用它?这些问题的答案可能来自几个方面,这取决于我们查询的是数据流的哪一部分。

如果你不想陷入一个恶性循环中,总是问一些关于数据的简单问题并寻找答案,那么数据文档会有很大的帮助。像 Amundsen 这样的数据发现工具是现有的最好的开源工具之一,旨在解决核心的数据理解和发现问题。

在扩展团队时,记录我们的工作方式以及工具在公司中的使用方式是至关重要的。写好文档可以节省大量时间,也许是最大的节省。当新用户加入时,他们可以浏览文档,了解所创建的指南和框架。它简化了与每一个新来者握手和重复的时间。它还可能节省用户花费在从头开始计算和重新发明轮子上的时间。当用户浏览文档时,他们可能会发现更好的做事方法。然后,用户可以向原始文档创建者提供反馈,他们可以就改进流程进行建设性的讨论。可以立即修改文档以反映更好的和改进的过程,并且阅读文档的以下用户将受益于结果。

随着数据工程师设计框架并向公司引入更好、更新的工具,我们也有责任分享关于它们的指导方针和资源。录制的研讨会和有用的阅读材料也记录在案,让用户发现和了解它们。这鼓励了组织内部的知识共享和自我学习。用户可以在自己的时间阅读和学习他们角色之外的新事物。有了更好的知识,用户和工程师就可以按照概述的最佳实践创建更高质量的管道和数据资产。随着数据质量的提高,数据消费者在使用数据时也会获得更好、更顺畅的体验。

记录数据问题也是我们团队采用的一种做法。这种实践帮助我们阐明痛点,评估影响,并允许我们创建一个更清晰的问题描述。如果有什么不同的话,记录可以帮助我们更清晰地思考。每当我们处理一个新问题时,我们都从创建一页纸开始。在这篇一页纸的文章中,作者首先描述了当前的状态,列出了棘手的问题和对用户的影响。作者随后探索了几种解决棘手问题的方法,并为每种方法提供了所需工作量的细节,然后根据影响来衡量其优先级。然后在团队成员中进行讨论,以浏览文档。这个练习有助于团队了解作者的思考过程,并使每个人对问题有相同的看法。它为团队提供了一个框架来评估问题,并随后以系统和科学的方式设计解决方案。它还允许团队在设计最佳解决方案时利用更多观众的意见。问题越复杂,在为其设计解决方案之前,我们记录并与团队交流就越重要。

3.减少与数据的摩擦

数据有生命周期。随着数据的创建,它会随着时间的推移而增长和变化。最后,当数据源被弃用时,数据也会被弃用。在数据中,变化总是意料之中的。因此,传输数据的管道以及对数据的理解也需要随着数据行为的变化而更新。为了管理数据变更,我们设计系统来减少与数据的摩擦。

当引入变化时,它可能会中断管道(仓库中的数据变得陈旧),或者它可能会引入用户没有意识到的行为变化。无论哪种方式,用户都会注意到他们的报告仪表板上发生了一些奇怪的事情,并会去敲数据工程师的门问问题。数据工程师会去敲生产商的门寻找答案。通常需要生产者和用户之间的几轮来回,才能完全理解哪里出了问题。由于缺乏背景,数据工程师通常不能完全理解用户看到的数据中的问题,以及由生产者引入的数据行为的变化。对于用户和数据工程师来说,这个过程通常既耗时又令人沮丧。这打断了他们的日常工作流程。当沟通破裂时,对数据的信任度降低,数据的价值也随之降低。当业务用户不能信任数据时,他们又怎么能信任从数据中产生的洞察力呢?

减轻这种沟通痛苦的尝试之一是设计警报系统,以便在管道事故发生时通知相关的利益相关方。管道警报发布到围绕特定数据主题的公共渠道,生产者和用户都在场。欢迎公司内使用相同数据的任何用户加入该频道并订阅警报。这确保了当管道发生故障时,所有的利益相关者都能得到通知。可以立即讨论 bug 和数据问题,并与渠道内的所有利益相关者透明地共享。这有助于改善生产者和消费者之间的沟通,缩短反馈周期,从而减少数据停机时间。生产者和消费者之间的公开交流也有助于培养一种文化,即数据的变化提前通知数据工程师和下游用户,而不是事后通知。

除了开放数据通道之外,增加数据的元数据,使其易于获取,也有助于减少使用数据时的摩擦。一天中,数据用户经常会问数据工程师一些关于数据的重复问题。管道计划何时运行?管道上次成功运行是什么时候?数据的来源是什么?这些信息和其他有用的元数据可以发布到一个集中的平台上,用户可以在那里自助服务并自己发现。它提高了数据用户的工作效率,因为只需点击一下鼠标就能找到答案,并且它将数据工程师从重复回答问题的工作中解放出来。

4.添加检查器和阻止器来管理数据

现在,我们已经设计了适合常见数据用例、文档资源和沟通指南的框架,并实现了更快的数据反馈循环,下一个挑战是让数据用户实际利用可用的正确框架和工具!

当我们向最终用户提供在数据仓库中执行操作的能力时,我们还希望管理并确保用户安全可靠地使用数据。根据墨菲定律,任何可能发生的事情都会发生。因此,我们实施检查和拦截器来防止未经授权的行为。这使我们能够保护数据资产免受人为错误的影响,确保框架按预期使用,并确保遵循最佳实践。

这就是执行过程的作用所在。我们设计的工作流在流程中嵌入了自动检查,并在用户不使用预期的工作流时阻止操作。

例如,我们实现检查以确保数据资产是根据指导原则集创建的。我们有一个集中的存储库,在那里我们存储和跟踪所有的数据转换逻辑。用户可以提出“拉”请求来创建新的数据资产或对现有的数据资产进行更改。任何变更都将触发自动检查,以确保要执行的变更遵循设定的指导原则和标准。检查失败将阻止用户创建新数据资产的能力。

我们努力在组织内实施数据记录实践。我们从惨痛的教训中学到的一点是,从长远来看,指派数据工程师来定义各个产品生成的数据的数据字典是行不通的。尽管数据工程师将大部分时间花在处理数据和管道上,但我们并不是数据的原始创造者。作为代表每个产品团队收集数据字典并记录它们的中间人,是不可伸缩的。一旦数据工程师离开产品团队去从事其他工作,数据字典就会漂移并变得陈旧。为了确保可持续的数据文档,数据字典需要从它们的合法所有者那里众包,他们是数据的原始创建者。为了实施数据文档,必须将它作为数据创建过程需求的一部分。这确保了通过管道进入仓库的任何数据都被记录在案。

重要的是,数据团队了解现有的框架和系统,并在指导用户通过正确的渠道提出请求方面发挥积极作用。例如,当用户面临一个数据问题时,我们会引导他们在开放的数据渠道中讨论这个问题,所有其他利益相关者都在场。这样就减少了多余的沟通,减少了误传。当用户有数据访问请求时,我们会指导他们通过服务台提出请求,我们会要求他们为请求提供足够的信息,并获得相应所有者的批准。对于任何可自助服务的东西,数据工程师会指引用户找到合适的文档链接,帮助他们快速起步。

为了防止关键数据集发生意外变化,我们还添加了数据测试来监控它们。数据测试的一些例子是数据唯一性检查、无效性检查、分布检查和可接受的范围/值检查。当数据测试失败时,会发送警报通知风险承担者。利益相关者必须澄清数据的变化是否是预期的。数据测试将不时更新,以反映数据行为的变化。

实现的所有检查和阻止程序应该充分覆盖仓库的所有入口点,并嵌入到用户的工作流程中。这确保了数据仓库受到充分保护,并且没有允许用户绕过该过程的漏洞。

结论

DataOps 实际上是确定数据用户工作流程中的常见问题,并加以改进。它是关于缩小差距,加强沟通,提高数据的可靠性和易用性。根据您组织中的数据缺口,数据运营任务可能会有所不同,但很可能围绕以下共同主题:

  1. 找到共同的模式,并对每个用例进行归纳
  2. 文档文档文档
  3. 减少与数据的摩擦
  4. 添加检查器和阻止器来管理数据

希望这篇文章能帮助您了解数据操作的工作方式。😃

什么时候数据才算大数据?

原文:https://towardsdatascience.com/when-is-data-considered-big-data-2f2b38942276?source=collection_archive---------36-----------------------

关于大数据这个流行词,你必须知道什么

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

妮娜·朗在 Unsplash 上拍摄的照片

大数据是指来自互联网、移动电话、金融行业、能源行业、医疗保健等领域的大量数据。以及智能代理、社交媒体、智能计量系统、车辆等来源。使用特殊解决方案对其进行存储、处理和评估[1]。

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

与大数据相关的领域和术语—按作者分类的图片

4v 的

为了处理、存储和分析数据,必须考虑以下四个挑战:

  • 数量(数据总量——2025 年的数据将是 2017 年的八倍[2])
  • 速度(数据生成和处理的速度,例如流媒体、IOT、社交媒体)
  • 多样化(结构化和日益非结构化的数据)
  • 准确性(缺乏数据质量和评估的专业知识)

技术方面

但是我们什么时候谈论大数据呢?必须收集多少数据才能被视为大数据?正常的数据存储技术通常以兆字节/千兆字节工作。**当数据量达到 TB/Pb 时,我们就在说大数据。**这一经验法则的原因是,当处理这种数据量时,传统系统不再足够强大,而且成本也明显更高。

大数据(存储)技术的典型特征是:

  • 分布式存储
  • 数据复制
  • 本地数据处理
  • 高可用性
  • 数据划分
  • 非规范化数据
  • 处理结构化和非结构化数据

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

用谷歌的 BigQuery 在几秒钟内查询大量数据——作者图片

分析和可视化方面

通过使用大数据技术,使用和分析数据有了新的可能性:

  • 通过更多可用的计算能力(关键词:云),可以更快地处理/分析更大量的数据(例如,对于机器学习是必不可少的)
  • 深度学习(基于大量数据,例如图像)
  • 实现实时报告是必要的,例如在物联网领域

但是由于大量的数据,可视化领域也带来了新的方法和挑战。因此,必须创建新的可视化技术,以使数据量对用户来说更加有形。一些示例可视化是树状图、旭日图或文字云。

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

爱荷华州白酒数据的树状图示例—作者图片

未来会带来什么?

虽然就数据量而言,许多公司尚未进入大数据世界,但大数据的一两个特征可能适用于他们的数据。但是有一点是明确的:数据量将不断增长,即使不是指数增长,因此为这个主题做好准备也是有用的。人们在考虑他们的 IT 架构和系统环境时,需要考虑大数据。还有一点,深度/机器学习这个新兴领域,通过更多的数据进行训练,变得越来越高效。因此,该区域是大数据的完美补充。借助功能强大且易于使用的公共云提供商服务,人们能够更快、更轻松地处理、存储和分析大数据。这对于中小型公司来说尤其具有优势[4]。

结论

大数据绝对是一个时髦词,并不是每个公司都需要它。然而,大数据领域提供了巨大的优势和处理细节的新方法。然而,它带来了需要克服的技术挑战。有了公共云服务,这一挑战更容易应对。

“世界是一个大数据问题。”——作者安德鲁·迈克菲(Andrew McAfee),麻省理工学院项目联合主任

来源

[1]谷歌,【https://cloud.google.com/what-is-big-data】T2(2021)

[2]麦肯锡公司,人工智能下一个数字前沿? (2017)

[3] itsvit,https://it svit . com/blog/big-data-information-visualization-techniques/

[4] Bernice M Purce 大数据利用云计算 (2013)

什么时候可以用零来估算缺失值?

原文:https://towardsdatascience.com/when-is-it-ok-to-impute-missing-values-with-a-zero-6d94b3bf1352?source=collection_archive---------11-----------------------

用零代替缺失数据有时是合理的

休伊·费恩·泰

同格雷格·佩奇

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

图片作者:【Pixabay 的安德烈亚斯·百年灵

缺失数据的出现有各种各样的原因。

当调查时间过长或询问非常私人的问题(如年收入、月支出)时,就会出现这种情况。

当机器出故障时就会发生。

有时,这只是记录不一致的结果。

不管是什么原因,在填空之前都应该仔细思考。使用估算数据构建的模型可能会产生受新更改值强烈影响的结果。

在前面的一个例子中,我展示了通过查看售出的日票数量来估算室内游戏中心的收入是合理的,因为这两个因素有很强的线性关系。

但是另一个变量*“降水量”*也包含缺失信息,该怎么办呢?推论在这种情况下不适用,因为降雨量不依赖于我们数据集中的因素,如一周中的天数或 SnackShack 的销售收入。

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

作者图片

处理丢失数据的一个合理的方法是检查数据,看是否大部分时间都在下雨。毕竟,如果缅因州通常是干燥的,那么我们假设记录失败的那一天下雨是不正确的。

为了使用 R 执行这个验证,我们使用了代表“最频繁值”的 mfv()函数

因为那年缅因州很少下雨,我们可以通过在这些单元格中插入零来解决缺失值。

其他时候,简单地使用零作为缺失值的自动替代可能是不合适的。例如,假设我们缺少美国以下几个月的煤炭消耗量:

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

作者图片

首先,用零来计算意味着煤炭神秘地从这个国家的能源组合中消失了四个月!虽然数据集中的 NAs 确实令人沮丧,但我们认为这种消耗根本没有发生,这将会产生一个更大的问题。

其次,这种错误的替代会削弱多元回归模型。请注意当我们从用 0 进行插补切换到用已知月份的平均值进行插补时,模型强度的差异——调整后的 R 平方立即从. 5135 提升到. 8586。

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

作者图片

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

作者图片

虽然这里没有演示,但弱多元回归模型可能会对预测准确性产生负面的连锁效应。根据这些估计做出的不准确计划会在整个供应链中产生负面的“连锁反应”。我们再一次看到了面对缺失数据时谨慎行事的重要性。

归根结底,不存在适用于北美估算的“一刀切”的解决方案。用零替换确实有其优点,但是和其他方法一样,上下文也很重要。最终,建模者需要了解数据集,理解问题,并能够针对特定的环境做出最佳决策。

当逻辑回归不起作用时

原文:https://towardsdatascience.com/when-logistic-regression-simply-doesnt-work-8cd8f2f9d997?source=collection_archive---------15-----------------------

逻辑回归不能正常工作时的一个简单例子

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

蒂姆·高在 Unsplash 上拍摄的照片

逻辑回归是从结构化表格数据中预测目标标签的一种非常常用的方法。虽然有一些更高级的方法通常表现更好,但逻辑回归的简单性使其成为首选。

然而,理解逻辑回归的局限性是很重要的。在这篇文章中,我想通过展示一个非常简单的用例来展示一些局限性,在这个用例中,逻辑回归不能很好地工作。

假设你想根据室外温度和空调是否开着这两个特征来预测室内温度是高是低。

让我们为此任务创建一个模拟数据集:

这是一个非常简单化的“室内温度”模型——空调外面冷就把外面的温度加 10 度,外面热就降低 10 度。热的定义是超过 25 度。而且如果空调关了,室内温度和室外温度是一样的。

将数据分成训练和测试:

训练逻辑回归模型:

以前 10 个测试用例为例,看看模型预测到了什么:

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

正如我们所看到的,10 个案例中,有 4 个被预测错了。

检查模型的准确性:

0.655

尽管生成该数据集背后的想法非常简单,但有大量的数据点,而且完全没有噪声,逻辑回归模型在该数据集上表现不佳。

原因是目标标签与特征没有线性相关性。在这种情况下,逻辑回归(或回归问题的线性回归)无法以良好的准确性预测目标(即使是在训练数据上)。

那么在这种情况下我们能做些什么呢?

我们可以使用另一个模型,一个非常简单的选择可能是决策树。

让我们看看它在测试集的前 10 个案例中的表现如何:

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

正如我们所看到的,决策树正确地预测了所有 10 个例子。

如果我们计算它的精确度:

1.0

这意味着决策树正确地预测了测试集的所有情况。

也许我们应该看看决策树的结构,以了解它是如何表现得如此之好的。

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

我们可以看到,它基本上搞清楚了逻辑——如果外面的温度超过 35.5 度(我们这里只有整数,所以 35 足够了),房间里就会很热。如果外面的温度低于 15.5 度,房间里就会很冷。任何介于两者之间的事情都取决于空调是否开着。

一件有趣的事情是,通过更多一点的特征工程,我们可以使逻辑回归在这里工作。如果我们创建新的特征,以某种方式将室外温度与空调结合起来,让模型知道空调是在加热还是冷却,我们就使这个问题适合于用逻辑回归来解决:

0.99

我希望这篇文章能让你明白什么时候使用逻辑回归是好的,什么时候寻找其他方法更好,或者如何创建新的特性使你的任务更适合逻辑回归。

当一切都不确定时——用神经网络

原文:https://towardsdatascience.com/when-nothings-certain-go-with-neural-networks-54e07516b87a?source=collection_archive---------29-----------------------

试图交付一个完美的软件解决方案并不容易。尤其是当你遇到一个不容易解决的问题时。

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

用 python 打印的我们的一个 docx 文件的字节表示(我是作者的图像)

在开发另一个项目时,我们的团队遇到了一个巨大的挑战——仅通过查看传入的数据来猜测接收的是哪种内容。这个想法来自于对发送给我们的文件内容是否是给定扩展名指定的内容的质疑。

在本文中,我们将详细描述基于文件内容识别不同类型文件的问题、解决此类问题的方法、可能解决方案的初步证明以及对结果的有趣解释。

各种不同的扩展

有这么多不同的文件扩展名,以及随之而来的编码和结构。有些是我们日常使用的。有些非常罕见,并且是特定于工作平台的。你可能对像 pngtxt 这样的扩展名很熟悉,但是对于 1stdiz 呢?这些听起来不是每个人都熟悉的。但最重要的是,它们是以某种特殊的方式被创造出来的,所以认出它们应该不是不可能的。

说到找到合适的解决方案,有很多方法可以尝试。我们的团队正在使用 python,这就是为什么我们首先要寻找 python 模块——但不能就此止步,要走得更远。所有被检查的库都有一些共同点——要么根据文件头(大多数情况下是前 300 个字节)猜测文件的类型,要么在文件中搜索特定类型的短语。不幸的是,它们都不足以满足我们的需求——当 zip archives 遇到 docxxlsx office 文件时,查看标题是有问题的,并且搜索特定类型的短语不能保证这些短语不是出于对文件进行编码以外的目的(例如,演示)。

出现了许多问题:如果归档中有一个未压缩的文档怎么办?如果有人将特定编码序列粘贴到文档中会怎样?如果将许多具有不同扩展名的文件合并成一个文件会怎么样?问了这么多问题,我们不确定如何建立这样一个灵活的解决方案。此外,我们真的希望它是自适应的,能够适应未知的新数据类型。

当谈到处理任何不确定性时,用神经网络武装起来的人工智能已经多次显示出它的优势。没有别的选择,我们决定试一试。

概念的初步证明

首先,因为我们没有太多的时间,无论我们试图实现什么都不能花太长时间,必须给我们足够的论据来决定我们是否在正确的道路上。我们已经定义了关键假设,以避免在流程中迷失方向:

  • 使用卷积神经网络(CNN)
  • 只为两个类准备数据 docxzip
  • 将文件二进制表示转换为图像输入数组(用于 CNN)
  • 为了能够在训练模型之后回顾文件,并查看它对哪些部分感兴趣
  • 要使用最大 32 千字节的文件

输入数据表示

由于使用卷积神经网络,输入数据必须从二进制表示转换为图像阵列表示。每个编码字符由相应像素的亮度表示(从 0-全黑到 255-全白)。输入的形状是 180 x 180 像素,这样我们就可以显示 32,400 个字符。

输入可以用以下几个部分来表征:

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

在我们的一个 docx 文件中标记的部分被翻译成图像(我由作者制作)

A 部分—这是文件的二进制内容所在的位置。

B 部分—填充图像其余部分的黑带,以防文件中的数据少于 32 千字节。

为什么用图像表示而不是顺序数据?

为了进行概念的初步验证,最好首先准备一个易于解释的解决方案,以便任何人都能够理解您实际在做什么,而不是直接跳到任何需要更复杂理解的东西,如递归神经网络或变压器模型。为可解释的人工智能提供了很好的工具 tf-explain 模块,您可以使用它轻松地向其他人展示训练模型的高级神经活动区域(决定性部分)。

为什么黑带是必要的?

当使用卷积神经网络进行数据分类时,必须为神经网络模型使用的所有训练、测试和验证数据确定固定的输入形状。对于这种特殊的概念验证,我们选择处理大小最大为 180 x 180 (~32 千字节)的文件。某些 docx 文档和 zip 归档文件所占用的空间可能会小于大约 32 千字节所确定的最大可能空间。这就是为什么有必要用可能的中性值填充我们输入的其余部分——在我们的例子中,黑带是底部用二进制零填充的结果( \x00 )。

准备好的数据集

我们的小数据集由 115 个 docx 文件和 114 个 T2 压缩文件组成,这些文件是从个人文件和网上找到的。值得一提的是,出于好奇,一些 docx 文件被附加在 zip 档案中,作为额外的复杂性级别(看看这样的实验在没有大型数据集的情况下是否可行)。

下面,你可以看到我们的 docxzip 文件转换成图像的例子:

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

由图像表示的数据集文件的示例网格—使用 matplotlib 库生成(Iimage by author)

神经网络模型

为了让事情变得简单,我们决定使用在官方文件中找到的卷积神经网络模型。如果你开始你的机器学习之旅,这就是你应该做的——只需谷歌必要的东西,检查你已经找到的东西,并根据你的需要进行调整。一开始没什么特别的。

结果及其解释

在训练我们的模型 100 个时期后,我们已经达到了 98.4%的准确率。当试图预测未知文件的类型(两个类中的 16 个文件)时,我们获得了 99.1%的平均准确率。

我们能指望准确性吗?

作为衡量我们所构建的潜力以及结果如何随时间变化的指标之一,这是我们可以使用的指标。但是如果您想要构建生产就绪解决方案,请记住不要忘记准备好您的测试集。如果这不会花费你太多的时间,只需查看数据并一步一步地手动构建您的集合——只有这样,您才能找到任何更可靠的指标。

预测 docx 文件的决定性区域

为了更准确地了解我们的模型所关注的内容,我们使用了前面提到的 tf-explain 模块和 GradCAM explainer,这有助于我们找到高度神经活动的区域——这在决定特定文件是否将被分类为 docxzip 时非常重要。

使用 绿色色图标记活动水平,其中 0 表示特定像素上的最低活动,255 表示最高活动。GradCAM explainer 将此颜色贴图用作默认贴图。

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

用 matplotlib 库生成的 Viridis 颜色图(I 作者的图像

下面你可以看到对一些 docx 文件的解释:

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

TF-解释模型神经活动的 GradCAM 结果,同时对我们的一个 docx 文件进行分类——使用 matplotlib 库创建(Iimage by author)

每张图片代表一个特定的 docx 文件,该文件被转换成图像并标有绿色颜色图。根据文档的内容,活跃度会有很大的不同,例如,在第一个示例中,我们可以看到内容底部的活跃度最高,而在接下来的两张图片中,活跃度最高的是中上部。有趣的是,该模型考虑了相当大的区域来判断它是否是 docx 类型的文件。

填充如何影响结果?

我们选择的表示输入数据的方式有助于做出更准确的预测,但也会因为观察到与特定情况无关的部分而产生干扰。

让我们来看看下图:

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

TF-解释我们的一个 docx 文件的 GradCAM 结果,该文件在图像的中性部分有明显的神经活动

您还记得 model 通过查看背景而不是与分类对象相关的部分来对图像进行高精度分类的案例吗?比如在对动物进行分类时查看树木。

我们的情况没有什么不同——模型确实会查看我们为填充输入形状的其余部分而创建的黑带。

但这有错吗?

回答这个问题时有两个想法需要考虑。

首先浮现在脑海中的其中一个问题提示我们这是不正确的——谁会通过观察一个物体以外的任何东西来对这个物体进行个人分类,尤其是当它是一个在预测时应该保持中立的人工附加部分时?

第二个告诉我们试着去理解——为什么我们会认为这样的部分是相关的?在许多情况下,当涉及到发现未知的数据特征时,重要的是不要将可以看到的内容缩小太多—总有更多的东西是不确定的,可以帮助我们找到一种更简单的方法来执行复杂的分类,只需说一个文件比其他文件小,这在一些抽象的情况下可能是真的。

在我们的情况下,这是第一个。但是记住这一点——它并不总是不相关的。

预测 zip 档案的决定性领域

我们还对 zip 文件执行了相同的活动级别检查:

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

TF-解释模型的神经活动的 GradCAM 结果,同时对我们的一个 zip 存档进行分类——使用 matplotlib 库创建(Iimage by author)

docx 文件相比, zip 文件的活动图彼此更加相似,在图像上的扩散程度也更低(完全集中在特定区域)。

zip 档案中包含的 docx 文件呢?

即使没有使用太多的例子,该模型预测的 zip 类也令人惊讶地好——在每张测试图像上都达到了 98%以上的准确率。

在试图交付一个完美的软件解决方案时处理不确定性并不容易。很多时候,我们每个人都会走到走进死胡同的那一步。在那个时候,记得检查记录良好的机器学习算法。在许多情况下,简单的神经网络是可行的——你不必成为解决问题的数据大师。

敬请期待!

当熊猫不再为我召唤熊时,我知道我已经成为了一名数据科学家

原文:https://towardsdatascience.com/when-pandas-stopped-conjuring-bears-for-me-i-knew-i-had-become-a-data-scientist-8b6142697fd5?source=collection_archive---------4-----------------------

入门

作为一名年轻的数据科学家,有三件事不用担心

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

图片由 Kankanravee Kanyawath 来自 Pixabay

熊一直困扰着我的职业生涯。

当我还是心理学研究生的时候,我们听说过一个叫丹·韦格纳的研究员,他因研究多余的想法而出名。在他臭名昭著的实验中,他将证明如何要求人们不要去想事情,比如白熊,会适得其反,并导致与人们被要求抑制的事情相关的高侵入性想法。“白熊现象”或者更恰当地称为“讽刺过程理论”有助于解释各种心理问题。

离开研究生院后不久,我发现自己又一次面对熊。这次他们是熊猫。我记得我觉得 Python 库的名字很有趣,当我开始学习如何使用它来分析数据时,我的想法被黑白相间的皮毛图像打断了。

但是这些侵扰性的熊的想法并没有持续多久。随着我对数据科学的了解越来越多,也越来越擅长使用熊猫库来操作数据,我的真实熊猫图像慢慢被数据帧和代码行所取代。

随着这些心理图像的改变,我知道我不再是一个压抑白熊想法的绝望的心理学家,而是一个数据科学家,一系列全新的焦虑浮现在我的脑海中。

以免你认为这篇文章仅仅是关于熊的,事实并非如此。相反,这篇文章是关于这些年来那些熊在我身上唤起的东西,主要是焦虑。

因此,我想重点谈谈年轻的发展中的数据科学家面临的 3 个常见焦虑。我也在那里,我也面对他们,但最终胜出。在此,我分享我在这个领域工作了近 15 年后,现在如何看待他们。所以,不要再说白熊和熊猫了,让我们为数据科学的学生介绍一下房间里的其他大象吧!

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

Image by 愚木混株 Cdd20 from Pixabay

数据科学教育和焦虑似乎是相辅相成的。数据科学是许多不同技能的复杂组合。它包含了许多不同的技术,需要对数学模型有所了解,并且最适合批判性思维。由于其复杂性,在学习数据科学时存在许多不确定性。这种不确定性造成了很多焦虑。

焦虑#1:专注

年轻数据科学家最大的担忧之一是知道应该重点学习哪些技能。事实上,就在几天前,我参加了一个由大学主办的会议,会议由一群不同的年轻数据科学家参加。在分组讨论中,一名学生问道:

“你认为哪些技能是我最需要关注的?”

关注的核心是认识到这个领域正在迅速发展,随着任何领域的发展,专业化越来越成为一个问题。当您可以雇佣一位对适用于特定业务问题的有限工具集非常了解的数据科学家时,为什么要雇佣一位对许多数据科学工具略知一二的数据科学家呢?

专家的问题是,一旦他们解决了手头的问题,他们对公司的效用就降低了。多面手的问题是,在处理新用例时,需要多花一点时间进行实验。

归根结底,专业化非常重要,因为它提供了学习数据科学过程的环境。也就是说,专业化不应该是目的,而是学生学习数据科学如何更普遍地工作的一种手段。因此,对于学生来说,重要的是集中精力学习一套专门的技能,同时认识到这些技能如何推广到其他用途。

这里的关键是要认识到,最重要的不是特定的技能组合,而是你能够将复杂的技能组合起来,并解决问题。

少关注你应该学习的具体技能,多关注用你所学做一些有用的事情。你控制着潜在雇主或客户的叙述,所以确保你能证明你知道如何应用一套专门的工具来解决一个专门的问题。更进一步,解释同样的过程如何应用到与他们更相关的用例中。

简而言之,你应该关注的技能是理解你所学的特定技能如何也是适用于大多数数据科学问题的更基本过程的一部分。演示如何快速从学习转向应用。

焦虑#2:自信

第二个焦虑是信心。大多数年轻的数据科学家对自己用新获得的技能解决业务问题的能力缺乏信心。缺乏自信是由两种主要力量激发的:复杂性和自我。

我说的复杂是什么意思?

Python 中最流行的数据科学库之一是 Scikit-Learn (sklearn)。Sklearn 包含了近 200 种不同的模型或“估算器)”这只是一个数据科学库。此外,过多的深度学习模型架构、混合和集成以及模型的选择是压倒性的。更不用说可用于预处理数据和部署解决方案的所有技术,这两者都对整体成功有影响。

所有这些复杂性增加了高度的不确定性,从而降低了信心。

第二种影响自信的力量是自我。将术语“科学”作为其定义的一部分的数据科学伴随着学院科学家的包袱而来。也就是说,这个领域中有一些自大的人,他们乐于评判进入这个领域的新数据科学家的能力。

这些自负会让人觉得数据科学在商业中的应用比实际情况更加僵化。底线是,没有人知道所有的事情,尤其是在数据科学领域。

对你所知道的要有信心,因为你已经成功地应用了它。因为你不断地应用新的东西,所以要对你能够学习的东西建立信心。

焦虑#3:适当性

我要分享的最后一个焦虑是恰当性,我看到很多学生也在经历这个问题。这种焦虑与信心有关,但延伸到对什么是数据科学的“适当”使用的担忧。例如,我过去总是质疑我的解决方案是“正确的”还是“正确的”我从来没有意识到,对于大多数商业问题来说,没有一个单一的“正确的”或“正确的”解决方案。

此外,有太多的可能性让我们无法知道绝对的“最佳”解决方案。所以与其担心你的解决方案是否合适,不如多关注你的解决方案是否通过解决一个问题带来价值。下面是一个向消费者展示价值的简单框架:

考虑一个好的基准,比如一个现有的过程、人为错误(人类每小时大约犯 3-6 个错误,或者一个基线模型。

围绕该基准构建您的解决方案,以展示其价值。

基于业务需求、反馈和使用新数据进行的持续性能评估,从那里进行迭代。

以上只是我职业生涯早期经历过的一些更常见的焦虑,该领域的学生直到今天仍在表达。我希望你发现这有助于设定期望,并为你提供一些帮助克服这些焦虑的见解。

比如参与学习数据科学、职业发展或糟糕的商业决策?加入我

“我应该什么时候收到回信?”以及其他痛苦的问题——用数据回答

原文:https://towardsdatascience.com/when-should-i-hear-back-and-other-painful-questions-answered-with-data-cd06edb1976a?source=collection_archive---------18-----------------------

办公时间

用实际数据讲述的求职故事

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

避免“我什么时候会收到回复”的焦虑,让你自己免于尴尬的去看牙医——图片由 Unsplash 提供

求职过程中最大的问题之一是缺乏可操作的数据。

没有数据,求职者对自己的处境一无所知。是我的简历很糟糕,还是只有这种难得的回音?我现在应该得到一份工作了吗,或者我的经历对这个就业市场来说是正常的吗?这个提议合理吗,或者我应该谈判吗?更一般地说:我的经历是典型的,还是我做错了什么?

一个人对这些问题得不到答案的时间越长,就会越自我怀疑。

我看到市场上一些最有前途的数据科学家公开质疑自己的能力,这都是因为他们在没有正确背景的情况下,在艰难的经济或异常竞争的就业市场中航行。

很难找到合适的上下文。大多数人所能做的最好的事情,就是通过听取新员工的经历,来满足于轶事数据。但是求职是非常随机的,每个人的经历都不一样。为了真正了解就业市场,你需要几千份工作申请的回复率、面试率、回复时间和许多其他参数的大量统计数据(实时更新)。

sharpes minds,我们已经帮助数百名学员找到了数据科学领域的工作。我们处在一个独特的位置,可以从他们求职的大量统计数据中了解就业市场。这是我们的发现。

就这么难得听到回音?

即使是最好的申请人也经常得不到他们申请的公司的回复。但是响应率是非常多变的,并且在很大程度上取决于您决定采用的应用程序策略。以下是我们发现的三种不同申请策略的平均回复率:求职公告板申请、LinkedIn DMs 和冷冰冰的电子邮件(所谓“冷冰冰的电子邮件”,我指的是突然向某人传达一条深思熟虑的定制信息)。

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

我应该在这里补充一点,尽管这些招聘信息看起来很糟糕,但实际上可能更糟糕。这是因为求职公告板的回复率非常不均衡:对于极少数求职者来说,回复率确实很好(在某些情况下,回复率可能高达 30%),但对于大多数人来说,回复率确实很糟糕。回复率中值接近 2%。

这个故事的寓意是:尽量避开求职公告板,除非你有可能被求职者跟踪系统发现的经验——尤其是如果你所在的领域工作机会稀缺,你需要让每一份申请都有价值。

我现在应该收到回复了吗?

很少有什么事情比在申请或面试后怀疑自己是否逾期未得到公司的跟进更让申请者紧张的了。这是可以理解的:如果许多公司不想前进,他们会让你见鬼去,这意味着没有消息往往是坏消息。但是你什么时候应该永远放弃一份申请呢?

以下是我们发现的每种应用策略的平均响应时间:

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

面试真的那么难吗,还是我有什么问题?

收到 LinkedIn DM 或冷冰冰的电子邮件的回复本身就有价值。它可以带来信息交流,甚至是潜在的导师。但是正如我们在上面看到的,这意味着你会很快收到回复,如果没有别的事情的话——拒绝或者其他。

但是得到回音并不是申请的真正目的——你想要的是一次面试。在这一点上,应用策略的表现如何?每个人获得面试机会的可能性有多大?

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

在你看到这些数字并决定求职公告板到底好不好之前,你可能应该知道,尽管 LinkedIn 的申请看起来像是给求职公告板一个类似的面试机会,但根据我们的数据,它们实际上导致获得工作机会的概率高出3 倍。

通过与我们的导师(其中许多人本身就是招聘经理)交谈,我们认为我们知道为什么:向招聘经理发送定制信息,让你有机会在进入正式流程之前,在非正式场合与招聘经理建立联系。这是给人留下好的第一印象的好方法,也是展示你对公司或职位所做的研究的好方法。这种印象会产生持续的积极影响。

这个报价合理吗,或者我应该谈判吗?

SharpestMinds 在美国和加拿大都有业务,我们发现按国家划分我们的工资数据很有用,因为信不信由你,在货币调整的基础上,加拿大的数据科学家、分析师和机器学习工程师的收入大约是美国同行的一半!

以下是我们过去六个月在美国雇佣的学员的薪资数据:

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

这是加拿大学员的相同情况:

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

顺便说一下,“我应该谈判吗?”几乎总是*是的。*只要你合理地提出你的要求(例如,“我认为我们接近一个可行的数字,我真的很想加入这家公司,但还有 3000 美元的加薪空间吗?”),公司能做的最糟糕的事情就是拒绝你的要求,坚持最初的提议。即使是入门级的数据科学家和分析师通常也比他们想象的有更多的谈判空间。

我的求职经历是典型的,还是我做错了什么?

我们从研究这些数据中学到的最大的一个教训是,人们在求职过程中的经历是多么的不同。

一些学员开始找工作,并在几周内被录用。还有的在积极寻找 3 个月、6 个月甚至 12 个月。您的里程可能会有所不同。

但平均而言,我们发现,从他们获得导师的技术支持(意味着他们的导师认为他们已经做好工作准备)开始,学员需要 3 到 6 个月才能找到工作。

做什么?

如果你找工作的时间已经超过 6 个月,那可能只是运气不好——你可能只是在分布的远端。

但这也可能是一个暗示,你需要改进你的简历,改变你的申请策略,或者提高你的面试和技术技能。在一天结束的时候,唯一确定的方法就是努力地跟踪你的申请。一旦你这样做了,你就可以将你的回复率和面试率与我们在这里分享的典型值进行比较,希望能更好地了解你的立场。

如果事实证明你得到的面试机会明显少于正常水平,你可能需要找人来审核你的简历和 Linkedin 个人资料。

如果这不是问题所在,那么你可能需要关注你的面试技巧。模拟面试是一个很好的主意,和那些也在积极面试的同行交流也是一个很好的方法。

如果在那之后,你需要一些额外的支持,我们很乐意帮助

我们什么时候应该使用对数线性模型?

原文:https://towardsdatascience.com/when-should-we-use-the-log-linear-model-db76c405b97e?source=collection_archive---------12-----------------------

线性模型的一个有吸引力的替代方案

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

图片由 Gerd Altmann Pixabay 提供

世界不是线性的。这是一个人人皆知的简单陈述。然而,它给我们的建模方法带来了有意义的结果。学术界和工业界使用的绝大多数模型都是线性模型。

所考虑的现象的线性假设是非常武断的。对于包含少量观测值的研究来说,这通常是必要的,因为它有助于参数估计。当我们有较大的观察样本时,我们可以考虑因变量和自变量之间的非线性相关性。为此,我们可能需要估计一个非线性模型。这些类型的模型需要更先进的估计技术和计算能力。然而,这种方法有一个重要的替代方案。也就是说,我们可以用变换变量的线性模型的平均值来近似非线性关系。

对数线性模型

可以简化为线性模型的广泛使用的模型是由以下函数形式描述的对数线性模型:

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

对数线性模型和线性模型的区别在于,在对数线性模型中,因变量是独立变量的乘积,而不是总和。通过对上述方程的每一侧取对数,可以很容易地将该模型转换成线性模型:

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

只需替换为:

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

其中 n = 1,2,…,k,我们得到一个纯线性模型:

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

什么时候用?

如果我们使用对数线性模型,我们必须记住,我们是在计算因变量和自变量的对数。因此,变量应该只有正值,因为负值的对数不存在。

出现的问题是,在考虑使用对数线性模型时,我们应该观察变量的哪种分布。长话短说:对数正态分布。

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

不同均值和标准差的对数正态分布。来源:https://en.wikipedia.org/wiki/Log-normal_distribution

当我们的误差项等于正态分布误差的指数时,我们得到对数正态分布:

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

我们可以观察到,如果误差项具有对数正态分布,那么它的对数也具有正态分布。我们还知道,正态分布变量的线性组合也具有线性分布。因此,如果对数线性模型中的所有变量都具有对数正态分布,则:

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

正态分布。因此,我们看到,在实践中,当因变量和自变量具有对数正态分布时,我们应该使用对数线性模型。另一方面,当那些变量是正态或接近正态时,我们应该坚持简单的线性模型。

参考

[1]https://en.wikipedia.org/wiki/Log-normal_distribution

[2]迈尔斯基,耶日。 *Ekonometria。*2009 年,UW WNE

什么时候应该考虑用 Datatable 代替 Pandas 处理大数据?

原文:https://towardsdatascience.com/when-should-you-consider-using-datatable-instead-of-pandas-to-process-large-data-29a4245f67c6?source=collection_archive---------9-----------------------

在处理大型数据集时,使用熊猫可能会令人沮丧。数据表可能是解决方案。

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

照片来自 Unsplash

介绍

Pandas 在主要使用 Python 的数据科学家的数据分析工具中脱颖而出,因为它的易用性和它为数据处理提供的灵活性。尽管有这些好处,但不幸的是,在处理非常大的数据集时,它并不那么有效。有工具可以克服这一挑战。

下面是 Datatable ,一个用于处理表格数据的 python 库。它是最有效的工具之一,支持内存不足的数据集、多线程数据处理和灵活的 API。在本文中,我们将介绍数据表的一些基础知识,并与熊猫进行比较分析。

不使用熊猫的理由很少

以下是你不应该使用熊猫的两个主要原因:

  • 内存管理:由于 Pandas 为内存分析提供了一个数据结构,它有时需要 10x 的内存数据集。要做到这一点,您必须确保您的机器上始终有足够的内存。
  • 代码执行的高时间复杂度 : Pandas 的设计并没有有效地利用计算能力。默认情况下,它使用单个 CPU 内核作为单个进程来计算其功能。

什么是数据表,如何设置它

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

图 1:来自 H2O 的数据表徽标/数据表 github

正如简介中所解释的, Datatable 是一个 python 库,用于在单节点机器上以可能的最高速度执行大型数据处理(高达 100GB)。Datatable 项目始于 2017 年,第一个用户是无人驾驶. ai

Datatable 的一个重要特性是它与 Pandas/NumPy/pure python 的互操作性,这使得它为用户提供了轻松转换到另一个数据处理框架的能力。

数据表入门

运行本文的代码有两种选择。

  • 第一个选项 :本文中使用的那个,当你想在自己的机器上运行一切的时候。
  • 第二种选择 :使用我制作的 colab 笔记本,运行不同数值的实验。
  1. 安装数据表库

安装很简单,可以在 macOS、Linux、Windows 上用下面的命令行执行。

对于安装,我建议您首先创建一个环境变量,以防您有一个与 Datatable 不兼容的 python 版本。

确保在激活环境变量后运行以下指令。

最后,您可以在创建新的笔记本文件时选择环境变量,如下所示。

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

图 2:创建新的。ipynb fine(图片由作者提供)

  1. 数据表基础

在开始对 Pandas 和 Datatable 进行比较分析之前,让我们通过运行下面的代码来确保我们的安装一切正常。

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

图 3:代码执行结果(图片由作者提供)

现在我们确信安装过程一切顺利,我们终于可以开始了!

数据表与熊猫——让我们进行比较分析

基准数据集

使用来自 Kaggle 的糖尿病数据集,我将每一行复制了 10 万次,最终得到 76 80 万行(令人震惊🤯不是吗?)以便我们可以有足够大的数据集来执行适当的比较。最终数据集大小为 5.7 GB。

下面是来自基准数据集的 5 个随机样本。

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

图 4:来自基准数据的五个随机样本(图片由作者提供)

1。数据加载

此分析的目标是确定包含 76 800 000 行的同一数据集的加载时间。

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

图 5:熊猫和 Datatable 的数据的内存使用量是 5.7 GB(图片由作者提供)

Pandas 和 Datatable 都使用相同的内存来存储数据。但是它们加载的时间不一样。

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

图 6:熊猫数据加载时间:78 秒,数据表:2.13 秒(图片由作者提供)

从上面的图 6 中,我们可以注意到用 Pandas 加载数据集需要大约 74 秒,而 Datatable 只需要不到 3 秒。总的来说,Datatable 比熊猫快 34 倍。34 是 73.9/2.13 的结果。

2。卸载数据

我们通过加载 Datatable 和 Pandas 格式的数据开始实验。但是,我们可能希望将数据转换成不同的格式。让我们将 Numpy 视为目标格式。

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

图 7:熊猫的数据卸载时间:16.62 秒,数据表:6.56 秒(图片由作者提供)

从上面的图 7 中,我们观察到在将数据卸载到 NumPy 数组方面,Datatable 仍然胜过 Pandas。对于熊猫来说,这个过程需要 16.62 秒,而 Datatable 只需要 6.55 秒。总体数据表比熊猫快 2 倍。

3。分组数据

Datatable 也有分组功能,类似于 Pandas。让我们计算患者的平均年龄,并根据结果值(0 和 1)进行分组。

第五行中的**。f** 变量是 Datatable 的原生变量,它提供了一种方便的方法来引用框架中的任何列。

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

图 8:熊猫数据分组时间:2.15 秒,数据表:0.77 秒(图片由作者提供)

从图 8 中,我们可以注意到 Pandas 在分组数据时比 Datatable 慢 2 倍。

4.分类数据

医生可能希望根据怀孕次数从低到高对患者的数据进行排序,以便进一步分析。这是我们的计算方法。

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

图 9:熊猫的数据排序时间:22.61 秒,数据表:063 秒(图片由作者提供)

Datatable 在相同的列上破坏了熊猫的数据排序!它的运行时间比熊猫快大约 36 倍。

结论

基于前面的比较分析,我们可以观察到 Datatable 库优于 Pandas。然而,当使用非常小的数据集(例如,少于 1000 行)时,使用 Pandas 而不是 Datatable 可能会有所不同,因为时间执行间隔非常小(2 毫秒)。

我希望这篇文章能够帮助您清楚地了解为什么应该在 Pandas 上使用 Datatable,以及它如何通过将您的大数据处理提升到一个新的水平来为您的组织增加价值。您可以在下面找到更多资源。

YouTube 上关注我,了解更多互动环节!

额外资源

数据表文档

再见🏃🏾

当速度很重要时,使用 C

原文:https://towardsdatascience.com/when-speed-matters-use-c-f040d9381680?source=collection_archive---------14-----------------------

C、Python 和 C++之间的 CSV 读取性能测试

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

Unsplash 上的 CHUTTERSNAP 拍摄

介绍

当我使用 C 时,我倾向于感觉自己像一只恐龙。没有人知道 C 了。它不再是主流,它的使用主要与驱动程序或操作系统编程和嵌入式系统有关。

还值得再学 C 吗?我最初以为懂 C++会让 C 变得无关紧要。但是在我学习 C++的过程中,我开始注意到可能是这样的情况,C 仍然有它的位置。

真实测试:阅读大型 CSV

尽管简单,CSV 文件仍然无处不在。解析它们的需求非常普遍,在某些场景中,您可能需要处理数万亿字节的 CSV。

如果是这样的话,实施就很重要。当数据集很小时,一个简单的操作很容易在数据集变大时成为瓶颈;应该观察性能,速度比代码可维护性和代码冗长更重要。

在这篇小文章中,我将使用 Python、C 和 C++17 中逐行读取文件的惯用方法来分析三种不同的行解析器。

特定的测试将解析一个 570 万行的 CSV,其中每行大约有 50 个字符宽(在我的测试中,我使用了 derivates 市场报价,但是该场景适用于任何类型的数据)。我们将测量在每种语言中逐行读取文件需要多长时间。

计算机编程语言

Python 因其简单而被广泛(过度)使用。学习 Python 极其简单。语法简单明了,其垃圾收集器使得编程变得简单明了。它不是一种快速的语言,除非你使用 C 编译的库,比如 Numpy。当你需要做一些用 Numpy 无法完成或难以实现的事情时,性能问题就会到处出现。

上面的代码展示了 Python 中逐行读取文件的惯用方式。测得的运行时间为 22 秒。

C/C++

我最近开始用 C++工作,而不是用 C 或 Java。通过这样做,我可以在需要时拥有 C 的性能和控制,以及 Java 的高级和面向对象的结构来简化代码的编排,特别是集合(C++中的容器),这在数据分析中很有用。

下面的代码片段包括用 C 和 C++编写的逐行读取 CSV 文件的代码。

C++惯用方法的测量时间分别是 300 秒,经典 C 方法的测量时间是 16 秒。

结论

惯用的 C++实现所花费的时间如此之大,令人尴尬。

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

惯用代码例程逐行读取文件所花费的时间

相反,我们观察 Python 是如何对某些函数/库进行了如此多的优化,以至于它们的性能几乎和 C 一样好。这并不意味着 Python 和 C 一样快,因为当你使用定制代码或密集数据分析时,Python 的效率会非常低。但是我惊讶地发现 Python 中有如此优化的例程。

这个简短测试的要点是惯用的并不意味着你的代码将会执行。

不要卖你的 K&R*【C 编程语言】*的拷贝;在 C++中重用那些 1980 年代的 C 方法仍然可以节省一些计算时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值