TowardsDataScience-博客中文翻译-2019-三十六-
TowardsDataScience 博客中文翻译 2019(三十六)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
针对文本分类微调 ERNIE 2.0
原文:https://towardsdatascience.com/https-medium-com-gaganmanku96-fine-tune-ernie-2-0-for-text-classification-6f32bee9bf3c?source=collection_archive---------13-----------------------
如何微调 ERNIE 2.0,百度最新的文本分类模型
Photo by Caspar Camille Rubin on Unsplash
百度发布了连续自然语言处理框架 ERNIE 2.0。ERNIE 主张通过知识整合增强代表性。百度在其研究论文中声称,ERNIE 2.0 在中文和英文的 16 个自然语言处理任务中的表现优于 BERT 和最近的 XLNet 。
source
ERNIE 2.0 是一个持续的预培训框架。持续学习旨在用几个任务按顺序训练模型,以便它在学习新任务时记住以前学习的任务。连续预训练的架构包含一系列共享的文本编码层来编码上下文信息,这些信息可以通过使用递归神经网络或由堆叠的自我关注层组成的深度转换器来定制。编码器的参数可以在所有预训练任务中更新。
基本模型包含 12 层,12 个自关注头和 768 维的隐藏尺寸,而大模型包含 24 层,16 个自关注头和 1024 维的隐藏尺寸。XLNet 的型号设置和 BERT 一样。
对于进一步的阅读,我建议查看这些文章——这和这,以深入了解这种模式是如何工作的。
现在,让我们看看代码
安装和导入必要的包—
- 安装必要的软件包
$ !pip install paddlepaddle-gpu
你也可以安装它的 CPU 版本,但它是高度计算的任务,所以我建议在 GPU 上训练它。
ERNIE 2.0 接受了 48 个英伟达 v100 GPU 卡(用于基本型号)和 64 个英伟达 v100 GPU 卡(用于大型型号)的英语和中文培训。
2.克隆它的 git 存储库并下载模型。我在这里使用基本模型。
$ wget [https://ernie.bj.bcebos.com/ERNIE_Base_en_stable-2.0.0.tar.gz](https://ernie.bj.bcebos.com/ERNIE_Base_en_stable-2.0.0.tar.gz)$ gunzip ERNIE_Base_en_stable-2.0.0.tar.gz$ tar -xvf ERNIE_Base_en_stable-2.0.0.tar$ git clone [https://github.com/PaddlePaddle/ERNIE.git](https://github.com/PaddlePaddle/ERNIE.git)
准备数据
数据集必须采用特殊的格式化方式。这些列应该是 text_a 和 标签。 必须是 tsv 文件。
- 下载数据集
!wget !wget [https://archive.ics.uci.edu/ml/machine-learning-databases/00462/drugsCom_raw.zip](https://archive.ics.uci.edu/ml/machine-learning-databases/00462/drugsCom_raw.zip)!unzip 'drugsCom_raw.zip'
你会得到 2 个文件-训练和测试。
2.现在,让我们处理数据并更改标签
a)创建培训和开发数据
preprocessing data
我们以 80:20 的比例将数据分成两部分。
b)创建测试数据
将数据放在正确的位置
- 创建 2 个文件夹
$ mkdir -p dataset/SST-2
$ mkdir -p parameters/params
2.将培训、开发和测试文件移入 SST-2 文件夹
$ mv train.tsv dataset/SST-2/
$ mv dev.tsv dataset/SST-2/
$ mv test.tsv dataset/SST-2/
3.将参数内容移动到参数/参数中
$ mv params/ parameters/params/
4.将文件夹数据集和参数都移动到 ERNIE
$ mv dataset ERNIE/
$ mv parameters ERNIE/
开始模型训练
- 将目录更改为 ERNIE
$ cd ERNIE/
2.为模型路径和数据集设置环境变量
3.开始训练
sh script/en_glue/ernie_base/SST-2/task.sh
如果您遇到任何错误,说找不到培训文件或 init_parameter 丢失,请尝试检查您的当前目录。你应该在 ERINE 文件夹里。
全部代码可在这里获得。
你也可以试试 colab 笔记本上的代码。
结论
随着诸如 BERT、ERNIE、XLNET、OPEN-AI 等新方法的出现。我们已经看到每个 NLP 任务都有巨大的改进,但代价是高昂的计算成本。XLNET 的培训成本约为 245,000 美元,这是一笔惊人的金额。由于计算需求很高,初创公司越来越难以适应这些新模式。
参考文献
- https://github.com/PaddlePaddle/ERNIE
- https://hub . packtpub . com/Baidu-open-sources-Ernie-2-0-a-continuous-pre-training-NLP-model-that-performs-Bert-and-XL net-on-16-NLP-tasks/
你的供应链预测有多聪明?
原文:https://towardsdatascience.com/https-medium-com-h-javedani-how-smart-are-your-supply-chain-predictions-daf5a154ac6d?source=collection_archive---------16-----------------------
深入分析
这些需求预测最佳实践降低了成本
简介
为了说明准确需求预测的重要性,考虑一下 2014 年令人震惊的头条新闻“沃尔格林首席财务官因 10 亿美元的预测错误而离职”[1]以及耐克 2001 年导致 1 亿美元销售额损失的需求规划软件实施失败[2]。有几个由于需求预测错误而造成巨大财务损失的例子,但也有许多成功的案例,其中提高需求预测的准确性带来了巨大的财务收益。例如,Kimberly-Clark 多年来依赖基本预测模型,但当他们实施更高级的实时需求趋势分析时,他们将面向客户的发货地点从大约 80 个减少到 20 个,并将年销售额平均提高了 5%[3]。
本文研究了提高需求预测准确性的方法,以增加企业利润和避免损失。它还解释了这种改进的先决条件。最后,介绍了 AC Forecast [4],Avenue Code 的稳健需求预测解决方案。
需求预测和供应链管理
在讨论准确需求预测的具体模型之前,有必要了解与供应链管理(SCM)相关的基本需求预测概念。需求预测是供应链管理的一部分,与所有供应链管理流程相关,包括客户关系管理(CRM)、订单履行(of)、制造流程管理(MFM)、供应商关系管理(SRM)、产品开发和商业化(PDC)以及退货管理(RM)。
- CRM: CRM 涉及规划和管理有效且有利可图的长期客户关系,通常是在客户需要时向他们提供他们想要的产品。准确的需求预测提高了客户满意度。
- OF:可靠的需求预测对 OF 也有直接影响,因为高效的订单履行需要高效的供应链运作。
- MFM:这一过程包括在生产环境中转移产品以及在供应链中获得、实施和管理制造多样性的所有必要行动。目前,一家公司的生存能力很大程度上取决于其对消费者需求不断变化的灵活应变能力,因此准确的需求预测至关重要。
- SRM: SRM 致力于促进与供应商的互利关系,尤其是那些被认为对品牌最具战略意义的供应商,以增加通过交易、绩效、现代化等实现的价值。自然,需求预测会对 SRM 产生重大影响。
- PDC: PDC 涉及生产新产品并将其运输到市场。该流程的适当实施使管理层能够通过准确的需求预测来控制供应链上新产品的动态流动。
- RM: RM 使管理员能够有效地管理逆向产品流,克服不希望的退货,并管理可重用的资产。稳健的需求预测对于减少退货量至关重要,退货量会直接影响利润。
总之,准确的需求预测能够:提高盈利能力、提高客户满意度、减少库存缺货、降低安全库存要求和降低产品淘汰成本。
需求预测模型
从最先进的到经典的再到基于人工智能的模型,供应链管理有几种需求预测算法[5]。每种方法都有其优点和缺点。尽管每种模型类型中使用的复杂性、假设和数据类型不同,但基本组件是相似的。因此,很难确定哪些模型在特定情况下表现最佳。本文评估了一些常用方法类别,包括简单历史平均值、经典时间序列以及机器学习和深度学习方法论的新类别,以帮助公司发现哪种模型最适合需求预测。
临时需求预测
一种主要的方法是临时需求预测。该模型认为,时间序列模型不会产生很好的结果,因为它们大多使用预测(和预测误差的度量)来参数化需求模型。然而,需求不仅取决于时间和需求历史,还取决于其他因素,如销售价格、价格变化、天气条件等。因此,临时需求预测的用户在不同的目标和服务水平约束下应用回归模型或某种线性规划来优化外生变量的(线性)目标函数[6]。这组模型的主要缺点是线性假设,这不适用于许多非线性问题。(线性预测模型使用线性函数作为其预测函数或预测函数的重要部分。)
数学高级线性预测
另一方面,供应链需求预测的数学线性模型(如 ARIMA)提供了关于供应链动态的非常实用的见解。这些模型导致了对牛鞭效应的理解[7],这是一种在供应链的连续阶段订单和库存变化增加的现象。这些模型用于许多需求预测场景[8]。
然而,在使用它们之前,应该做出许多假设,如数据的稳定性、线性和质量。例如,ARIMA 模型假设当前需求是过去需求的线性函数。事实上,ARIMA 模型是回归分析的一种形式,它测量一个因变量相对于其他变化变量的强度。其目的是通过检查时间序列中的值之间的差异而不是实际值来预测时间序列的未来状态。因此,在真实情况下,大多数数据是非线性的,基于 ARIMA 的模型无法产生非常好的结果。
其他一些方法,如 SARIMA(ARIMA 的季节性版本),试图检测每个时期内的日内和周内季节性影响。除了萨瑞玛之外,还有其他技术可以做到这一点。例如,可以基于使用不同季节性获得的组来定义一族函数线性回归模型[9]。使用这种模型的另一个问题是确定季节性参数,这通常是一个复杂的过程。尽管在构建预测模型时使用季节性信息是一个好方法,但这还不够。
机器学习和深度学习
机器学习模型是一套广泛的非线性方法,采用更复杂的数学技术来挑选变量,并在特征之间可能存在复杂交互的情况下优化拟合。这就是为什么机器学习解决方案通常更稳定,更适合需求预测。但是,其中一个主要的复杂因素是高维的需求历史数据。有两种常见的方法可以解决这个问题。第一种方法是选择一些重要的因素(特征选择),第二种方法是将一个问题分解成更小的问题,并使用多阶段方法解决它们[10]。这两种方法既昂贵又复杂。
对整个供应链有负面影响的另一个问题是数据不稳定/波动。需求预测的微小变化会造成库存和订单的波动,这种波动会随着供应链的上升而放大(再次出现牛鞭效应)。然而,事实证明,准确的需求信息和良好的预测模型可以显著降低牛鞭效应[11]。
最近,出现了几种深度学习技术,可以解决几乎任何类型的预测问题。深度学习是使用神经网络构建的机器学习的一个流行子类。神经网络获取输入,然后使用训练期间调整的权重在隐藏层中使用这些输入。那么该模型可以用于预测。几种深度学习方法目前正用于需求预测[12,13]。然而,需要注意的是,深度学习模型只有在数据量足够大的情况下才能很好地工作,并且它们也需要比上述更简单的模型更多的计算资源。
最好的需求预测模型是什么?
如上所述,作为机器学习模型的子类的机器学习模型或深度学习模型的使用已经被学术界和商业界用于需求预测。然而,每个 ML 预测模型家族都有其优点和缺点,并且对于需求预测没有单一的最佳模型。每家公司都有自己的数据,这些数据有特定的模式,这些模式更适合某些模型。确定哪种模式最适合给定的组织需要时间和专业知识。然而,人工智能的最新进展已经引入了一种为特定组织寻找正确预测模型的自动化方法。这种方法被称为自动机器学习。
自动化机器学习
使用单一方法构建需求预测的机器学习引擎不是一个好主意,因为一个模型可能不够灵活,无法在所有情况下都工作良好。此外,组织提供的每种产品和服务都有自己的数据和数据模式。由于一个组织中产品和服务的多样性,手工开发用于预测每种产品需求的单个模型几乎是不可能的。在这种情况下,应该有一种自动算法,它在许多机器学习模型中迭代搜索,选择适当的模型,调整每个模型,然后评估最终创建的模型。这种建模方式被称为自动机器学习(Auto ML),它是目前解决预测问题(如需求预测)的最重要的模型类型之一。
Auto ML 是一系列迭代过程,包括算法选择、模型训练、超参数优化、模型调整和性能评估。如果数据已准备就绪,可以进行训练,Auto ML 会尝试应用许多模型,这些模型包含定义范围内的大量超参数。然后,它在验证集上测试准确性和其他性能指标,以查看模型和估计权重的哪个组合给出了最佳结果。换句话说,Auto ML 是一种算法,它选择具有最佳参数和超参数的预测器的最佳组合来解决特定的预测问题,例如需求预测。
因此,与其评估需求预测的最佳模型,不如通过使用生成自动 ML 模型的服务来评估开发良好需求预测模型的最佳方法。
需求预测数据管道的最佳实践
在使用预测模型之前,数据必须采用特定的格式。但是,在此之前,数据应该是可访问的。由于需求预测所需数据的敏感性,获取数据并不总是容易的。数据应该从许多独立的数据集中获取,尤其是在遗留系统中。由于没有遵循标准程序将数据合并到一个地方,许多开发人员错过了改进预测的机会。此外,公司通常不愿意完全出于安全考虑而利用内部或外部数据。毫无疑问,使用内部销售数据、指标和历史数据有助于提高需求预测的准确性。使用外部数据也可以帮助企业提高预测的准确性,但外部数据往往没有得到充分利用。因此,应该有明确的阶段来组合各种数据,并为预测引擎做好准备。
将原始数据转换成所需的格式需要一系列称为数据流水线的操作。由于一些内部和外部因素,如假期影响、客户数据等,用于需求预测的数据管道非常复杂。在不断变化的商业环境中,制造商必须解决不断发展的挑战,这影响了数据管道。本文的后续部分解释了需求预测应遵循的常见数据管道阶段。
使用开源解决方案准备大数据
处理大数据需要选择正确的工具、库和技术。这些工具应该足够强大,能够清理杂乱的数据并将其从一种格式转换为另一种格式,尤其是对于大数据。有很多付费和开源的解决方案可用,开源的解决方案应用更广泛。作为数据管道工具和技术的一个例子,这是 AC Forecast 采用的解决方案,Avenue Code 的内部需求预测模型:
如上所示,需要非常复杂的数据流水线过程来从多个源摄取数据,并准备将它们输入到机器学习流水线。选择开源工具对于产品的可移植性至关重要,因为这些工具可以在以后部署在许多云服务提供商以及本地基础设施上。
组合多个数据集
如前所述,许多数据源必须组合成单个数据集才能输入到机器学习管道中。主要问题是,合并和连接数据的最佳策略是什么?如果我们关注需求预测所需的数据格式,我们知道每个数据源都应该表示为
将时间序列问题转化为机器学习问题
将成对的
使用时间序列模型的另一个限制是可用的模型较少。如前所述,这些模型中的大多数只能解决具有非常清晰的时间框架和非常干净的数据的线性问题,这通常不是大公司需求预测的情况。将时间序列问题转化为机器学习模型允许从广泛的 ML 模型中选择更多的自由,并且它还允许我们建立自动 ML 模型。为此,我们建议应用时间戳编码,如下所示:
有些数据,比如时间,本来就是周期性的。例如,秒、分、小时、天、周、月、季等等都遵循周期。问题是如何在数据中编码时间,以便在机器学习模型中有用,同时避免受到考虑时间序列的限制。一个好的解决方案是使用循环时态建模。在这种方法中,我们将每个循环变量(如时间戳)映射到一个圆上,使得该变量的最小值紧挨着最大值出现。我们使用 sin 和 cos 三角函数计算该点的 x 和 y 分量,如下所示:x 处的时间戳可以由另外两个特征表示为(Sin(x),Cos(x))。
处理缺失值和空值
在将许多数据源合并到单个数据集中并将时间序列转换为机器学习问题之后,对于在数据集中的特定记录中没有任何信息的因子,可能存在空值。这个问题的一些标准解决方案是:
- 如果某一行有很多缺失值,可以完全忽略该数据行;
- 如果数值数据中有空值/缺失值,则数据列的平均值是替换的合理值;
- 在分类信息的情况下,使用每一列中的数据模式是一个好的选择。
然而,最佳实践之一是使用尽可能多的历史数据来估计缺失值。这需要更先进的预测模型。例如,回归插补是一种基于其他变量预测某个变量的观察值的模型。更准确地说,完整和不完整案例的可用信息用于预测特定因素的值。回归模型的拟合值稍后用于估算缺失值[14,15]。值得一提的是,处理缺失值的最佳方法在很大程度上取决于数据的性质。询问值缺失的原因总是很有帮助的,因为处理缺失数据的不同方式会对模型的性能产生不同的后果。
将分类数据转换为数字
为预测模型准备数据的一个主要步骤是处理分类数据。对此有几种方法。虽然一些算法可以直接处理分类数据,但大多数机器学习算法要求它们的输入是数字,因此,分类特征在使用前必须转换为数字特征。将分类数据转换为数值数据包括两个步骤:
- 整数编码:当分类数据具有自然的有序关系,使得某个值更重要或处于更高的位置时,只需用较高的整数对其进行编码,并为不太重要/较低的值选择较低的整数。
- 独热编码:独热编码是将分类变量表示为二进制向量。首先,分类值必须映射到整数值。接下来,任何整数值都被描述为一个二进制向量,除了用 1[16]标记的整数索引之外,其他值都是 0。
交流预测
AC Forecast 是由 Avenue Code 开发的一种易于使用、准确、可靠且强大的需求预测模型,它试图通过使用上述所有最佳实践来解决本文中概述的复杂性。
AC 预测的数据管道
AC Forecast 数据管道的第一步是接收数据。从多个来源获取数据需要一个高度复杂的过程,该过程使用多个开源工具来实现 AC Forecast 的可移植性。该项目可以部署在谷歌云平台上,实现所有需要的项目资源。Apache AirFlow data scheduler 用于将数据从一个大型查询表导出到另一个查询表。基于配置文件预处理输入文件的 AirFlow DAG 托管在 Google 云存储上,以便开发人员可以开始配置和运行预定的预处理作业。
作为数据处理任务的一部分,如果需要,数据应按照给定的时间因子进行汇总。此外,有一个适当的警报过程,以便开发人员可以立即知道数据管道中是否出现了故障。数据管道使用来自 Spark、Hadoop、Kafka 和 Hive 等开源工具的非常灵活和强大的架构。例如,Hadoop MapReduce jar 用于预处理具有长值的文件,并以优化行列(ORC)文件的格式输出文件,供下游使用(有关更多详细信息,请参考第 7 页的数据管道图)。
AC 预测的深度学习引擎
如上所述,AC Forecast 采用自动 ML 方法来自动选择最佳引擎,并为每个预测用例设置最佳参数。Avenue Code 的机器学习团队最近通过结合卷积神经网络和模糊时间序列开发了一个非常准确和强大的需求预测引擎,作为其 Auto ML 方法的一部分[17]。这种组合方法将基于时间的预测模型转换为一系列图像。通过使用这些从多变量问题的序列值创建的图像,引擎可以以隐含和自动的方式确定和提取相关的重要参数,而不需要任何专家知识或人工干预,证明这种方法比其他一些传统模型更容易。这是 AC 预测和其他先进方法的主要区别。
此外,使用模糊逻辑通过在光谱和阴影中用模糊空间表示时间序列的一个维度,而不是用精确的数字表示它,极大地有助于控制过拟合。几个实验证明了所提出的方法对于非常复杂的需求预测的有效性,给了我们对结果准确性的信心。下面的流程图显示了此模型如何工作的一个示例:
结论
本文阐述了准确需求预测的财务重要性,并介绍了与需求预测相关的供应链管理基础知识。Auto ML 被证明是开发需求预测模型的最佳方式,因为它消除了与人力和人才相关的成本。其次,本文解释了数据管道的最佳实践。
最后,AC Forecast 是 Avenue Code 的内部机器学习模型,用于稳健而准确的需求预测,它提供了本文中概述的所有策略和最佳实践的真实示例。
参考文献
- 《华尔街日报》:沃尔格林首席财务官因 10 亿美元预测误差离职。路透社。
- 耐克反弹:耐克如何(以及为什么)从供应链灾难中恢复,克里斯托弗·科赫。首席信息官。
- 金佰利了解需求,希瑟·克兰西。消费品。
- 注意:尚未公开发布。
- 选择“正确的”需求预测模型, Alloy 客户解决方案。中等。
- 因果需求预测下的安全库存计划, Anna-Lena Beutel 和 Stefan Minner。科学指导。
- 供应链中的信息失真:牛鞭效应, Hau L. Lee 等。
- 一个 ARIMA 供应链模型, Kenneth Gilbert。informsPubsOnLine。
- 峰值负荷预测的功能聚类和线性回归, Aldo Goia 等人,ScienceDirect。
- 利用高维数据进行需求预测:利用品类内和品类间促销信息进行零售额预测的案例,马等.科学指导。
- 减少供应链波动和牛鞭效应的需求预测和共享策略。斯普林格链接。
- 基于 GPU 深度学习元启发式的时间序列预测模型 Igor M. Coelho 等 ScienceDirect。
- 用于能源负荷预测的深度神经网络,Kasun Amarasinghe 等,IEEE Xplore 数字图书馆。
- 缺失数据的多重插补:警示故事。圣人杂志。
- 处理缺失数据,朱迪·谢弗。梅西大学。
- 用于学习分子指纹的图上卷积网络,戴维·杜文瑙德等康乃尔大学。
- 采用卷积神经网络和模糊时间序列相结合的方法进行短期负荷预测。 Hossein Javedani Sadaei 等人。
寻找贝叶斯乐高玩具-第 1 部分
原文:https://towardsdatascience.com/https-medium-com-hankroark-finding-bayesian-legos-part1-b8aeb886afba?source=collection_archive---------22-----------------------
Photo credit: Frédérique Voisin-Demery/Flickr (CC BY 2.0)
乔是我们家的好朋友,本周早些时候来过。就像我们经常做的那样,我们讨论天气(在太平洋西北部这里似乎比正常情况下更热)、新闻(主要是关于我们如何采取行动避免新闻)和我们的孩子。我们都有孩子,他们真的很喜欢玩乐高。乐高玩具不可避免地会带来踩在乐高玩具上的剧烈疼痛,通常是在半夜或早上去冲咖啡的路上。尽管乔和我都跟在我们的孩子后面,捡起我们能找到的孩子们留下的所有乐高玩具,但踩在挥之不去的乐高玩具上似乎还是会发生。
乔和我一直在想办法减少踩到乐高积木的机会。过了一段时间,我建议我们可以用概率和统计学来估计在孩子们之后的清扫中没有移走乐高玩具的概率。乔说他在船上,“任何东西,我的脚不能再承受了!”。
我启动了我最喜欢的估算概率的工具,乔和我开始想办法,在我们清理完孩子们遗漏的乐高玩具后,我们可能能够估算出剩余的乐高玩具的可能性。
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-darkgrid')
np.random.seed(42) # It's nice to replicate even virtual experimentsimport pymc3 as pm
import scipy.stats as stats
print('Running on PyMC3 v{}'.format(pm.__version__))> Running on PyMC3 v3.6
实验者做二十次
每个人似乎都有不同的方法来拿起乐高。对乔来说,他说他会跟在孩子后面打扫卫生,捡剩下的乐高玩具。
我给乔的第一个建议是,如果我们知道他在每次清扫中捡起乐高积木的能力,那么我们就可以确定每次清扫后留下乐高积木的概率。数学上这是
其中 p_Pickup Lego per sweep 是单次扫描中拾取乐高的概率, n_sweeps 是乔执行的扫描次数, p_Lego remaining 是乔完成所有扫描后剩余乐高的累积概率。
我向乔建议做一个实验,以确定他在捡乐高玩具方面有多好:我会去他的孩子玩乐高玩具的房间,在地板上随意铺上一个数字的乐高玩具,代表乔的孩子留下来让他寻找的乐高玩具的数量。乔会跟在我后面,像往常一样打扫房间,捡起他找到的乐高玩具。
我们需要重复这个实验很多次,我估计有 20 次,来估计乔捡起乐高积木的效率。这时,Joe 说,“嘿,我说过我正在寻找解决方案,但是重复二十次拿起乐高玩具并不是我的乐趣所在。你需要向我证明这是值得我花时间的。”我同意这个实验看起来可能会伤害受试者,Joe,所以我决定在我们进行实际的实验之前向 Joe 演示这可能是如何工作的。
我设计了(虚拟的)实验,每个实验都用了随机数量的乐高积木。根据 Joe 的一些估计,为了最好地代表 Joe 的孩子留下的乐高玩具数量的实际情况,我选择了一个乐高玩具的正态分布(即高斯分布),每个实验的平均值为 100 个乐高玩具,标准差为 20 个:
其中 N₀ 是乔留下的待发现的乐高积木的数量。
mean = 100
standard_deviation = 20
experiments = 20
N_0 = (np.random.randn(experiments)*standard_deviation+mean).astype(int)
N_0> array([109, 97, 112, 130, 95, 95, 131, 115, 90, 110, 90, 90, 104, 61, 65, 88, 79, 106, 81, 71])
拿起乐高玩具
然后,如果我们在进行一个实际的实验,每次我把乐高积木四处铺开后,Joes 就会跟在我后面捡起来。为了在虚拟实验中模拟这一点,我使用二项式分布对 Joe 捡起的乐高积木的数量进行了建模。想想看,对于地面上的每个乐高积木,乔要么捡起来,要么不捡起来,这是基于乔捡起一个乐高积木的未知概率。
其中 X 是乔找到的乐高积木的数量,而 p 是乔捡起一块乐高积木的未知概率。这也假设了 Joe 在拿起乐高积木时相当一致,并且模型具有单一概率 p 。
X = np.random.binomial(N_0, actual_prob)
X> array([ 87, 66, 80, 110, 76, 65, 95, 92, 61, 83, 57, 76, 77, 46, 49, 75, 54, 75, 61, 54])
直方图显示了在虚拟实验的每一次尝试中,乐高积木 Joes 的百分比分布。
plt.hist(X / N_0, range=(0,1), bins=20)
plt.xlabel("Percentage Legos Picked Up")
plt.ylabel("Number of Times Observed")
plt.show();
模特乔
在这一点上,我们有了一个模型,使用二项式分布,显示了 Joe 在他的试验性清扫中捡了多少个乐高积木;我们知道 N₀在每次实验中留下了多少乐高积木,我们也知道乔在每次实验中捡了多少乐高积木。我们不知道乔捡起乐高积木的概率,所以我们需要对概率建模。
概率分布的常见模型是贝塔分布。在这个例子中有很多理由使用 beta 分布。贝塔分布是二项分布的共轭先验;这个原因是代数上的方便,对于这个例子来说不太重要,因为我们将使用数值积分。更重要的是,beta 分布是将百分比或比例建模为随机变量的合适分布。
在我们的例子中,我们将使用弱信息先验,它估计 Joe 捡起乐高的概率在范围[0,1]内,更有可能接近该范围的中心。这表示我们对 Joe 捡起乐高积木的技巧有所了解,并将其融入到模型中。贝塔分布由两个值参数化,通常称为α (alpha)和β (beta)。我选择与弱信息先验目标匹配的值,模式为 0.5。
alpha_prior=2
beta_prior=2
x_locs = np.linspace(0, 1, 100)
plt.plot(x_locs, stats.beta.pdf(x_locs, alpha_prior, beta_prior), label='Probability Distribution Function');
plt.legend(loc='best');
模型拟合
现在我们有了一个完整的模型,可以解释是什么产生了观察到的数据(即使到目前为止这只是一个思想实验):
我同意 Joe 的观点,现在是 2010 年,使用 PyMC3 进行计算统计是“酷”的。有很多文档和很好的介绍可用;我不会在这里重复这些信息,而是直接跳到模型拟合。
首先,我们构建模型对象:
basic_model = pm.Model()
with basic_model:
p = pm.Beta('p', alpha=alpha_prior, beta=beta_prior)
x = pm.Binomial('x', n=N_0, p=p, observed=X)
然后,我将使用默认的不掉头采样器(NUTS)来拟合模型:
with basic_model:
trace_basic = pm.sample(50000, random_seed=123, progressbar=True)> Auto-assigning NUTS sampler...
> Initializing NUTS using jitter+adapt_diag...
> Multiprocess sampling (2 chains in 2 jobs)
> NUTS: [p]
> Sampling 2 chains: 100%|██████████| 101000/101000 [00:55<00:00, 1828.39draws/s]
现在我们可以看看模型拟合的一些结果。在这种情况下,根据数据和给定的模型(也称为后验概率),我的朋友乔在一次传球中捡起一个乐高玩具的估计实际概率为 75%,95%的置信区间为[73%,77%]。我还绘制了先验概率(使用 beta 分布的弱信息先验)与后验分布的比较图。
plt.hist(trace_basic['p'], 15, histtype='step', density=True, label='Posterior');
plt.plot(x_locs, stats.beta.pdf(x_locs, alpha_prior, beta_prior), label='Prior');
plt.legend(loc='best');
basic_model_df = pm.summary(trace_basic)
basic_model_df.round(2)
又是模特乔
乔和我花了一些时间研究这个模型,看看它是否符合我们对现实的感觉。毕竟,为了实现这一点,Joe 需要进行大约 20 次实验,并且他希望确信这是值得他花费时间的。
假设 Joe 经常在 95%置信区间的低端执行任务,我们了解到的第一件事是,在对房间进行 4 次扫描后,有不到 1%的机会会有剩余的乐高积木需要拾取。
(1-basic_model_df.loc['p','hpd_2.5'])**4> 0.0052992694812835335
总的来说,Joe 和我对这个模型很满意,但是我们怀疑有些东西需要改进。乔说,他经常四次捡起乐高,但似乎仍然总是在下一次穿过房间时踩到乐高。乔和我聊得更多了,我了解到他有时会很快地打扫房间,有时会很详细地打扫房间。
当我们最初为 Joe 建模时,我们假设 Joe 捡起乐高积木的概率是连续的。所有的统计模型都会遗漏一些东西,我们的原始模型也不例外。我们现在知道的是,捡起一个散落的乐高积木的概率是不同的。这种对观测数据产生原因的新理解现在需要包含在模型中。
对此有一个模型,叫做贝塔二项分布。Beta-二项式分布放宽了每个二项式试验只有一个概率的假设,模拟了每个二项式试验有一个不同的概率参数。这与 Joe 描述的他的过程相匹配,有些扫描很快,有些非常详细。我们的新模型看起来像这样:
我们可以直接在 PyMC3 中建模。为此,我们提供半柯西分布作为β-二项式分布的α和β参数的弱正则化先验。我们使用半柯西分布作为一种方式来“鼓励”α和β值比先验被设置为均匀分布时更接近于零。在[0,∞)的范围上支持半柯西分布。至此,我们有了一个完整的模型:
model_bb = pm.Model()
with model_bb:
alpha_bb = pm.HalfCauchy('alpha_bb', beta = 2.)
beta_bb = pm.HalfCauchy('beta_bb', beta = 2.)
X_bb = pm.BetaBinomial('X_bb', alpha=alpha_bb, beta=beta_bb, n=N_0, observed=X)with model_bb:
trace_bb = pm.sample(50000, tuning=5000, random_seed=123, progressbar=True)> Auto-assigning NUTS sampler...
> Initializing NUTS using jitter+adapt_diag...
> Multiprocess sampling (2 chains in 2 jobs)
> NUTS: [beta_bb, alpha_bb]
> Sampling 2 chains: 100%|██████████| 101000/101000 [03:05<00:00, 544.28draws/s]
有了这个新的参数化,我们就失去了与概率参数的直接联系。这是必要的,这样 Joe 可以确定他需要通过多少次才能达到他期望的水平,确信所有的 Legos 都已被移除,并且他的脚在晚上走在地板上是安全的。
在 PyMC3 中,我们可以通过基于拟合模型生成数据来确定总体概率后验估计。PyMC3 有一个简单的方法来做到这一点,使用后验预测检查。我会产生 1000 个后验概率的例子。
with model_bb:
p_bb = pm.Beta('p_bb', alpha=alpha_bb, beta=beta_bb)
ppc = pm.sample_posterior_predictive(trace_bb, 1000, vars=[p_bb])> 100%|██████████| 1000/1000 [00:24<00:00, 41.64it/s]
据此,Joe 和我比较了使用 beta-二项式假设(每个二项式试验的不同概率,或者乐高扫地)和二项式假设(所有二项式试验的单一概率)的结果。正如我们所了解和预期的那样,与二项式假设相比,beta-二项式模型假设中的概率分布更广。
plt.hist(trace_basic['p'], 15, histtype='step', density=True, label='Posterior Binomial');
plt.hist(ppc['p_bb'], 15, histtype='step', density=True, label='Posterior BetaBinomial');
plt.plot(x_locs, stats.beta.pdf(x_locs, alpha_prior, beta_prior), label='Prior');
plt.legend(loc='best');
bb_quantiles = np.quantile(ppc['p_bb'], [0.025, 0.5, 0.975])
bb_quantiles> array([0.59356599, 0.74900266, 0.86401046])
再一次,安全地假设 Joe 经常在 95%置信区间的低端执行,我们学到的第一件事是,在房间扫了 7 次之后,有不到 1%的机会有剩余的乐高积木要被拾起。
(1-bb_quantiles[0])**7> 0.0018320202853132318
总结:模型与生成函数的比较
请记住,在开始的时候,所有这一切都是一个思考练习,看看是否值得乔进行 20 次实验,这样我们就可以确定乔在一次扫描中捡起一块乐高积木的概率。在这个思考练习中,我们生成了数据,即乔在 20 次实验性清扫中每次捡了多少个乐高积木。既然我们已经完成了建模,我们可以研究实际的数据生成函数,并将其与模型进行比较。生成数据,然后恢复参数,以验证建模方法,至少恢复原始参数,这是计算统计学中的最佳实践。
这个生成函数的参数可以在 Jupyter 笔记本中找到,在靠近开头的一个隐藏的单元格中。
从下面可以看出,在一次通过中捡起乐高积木的概率的原始生成函数是由乔每次扫过的概率生成的 beta 分布。由此我们可以看出,与二项式模型相比,beta-二项式模型在从生成的数据中重新创建原始生成函数方面做得更好。二项式模型没有考虑到乔通过的工作质量的变化,而贝塔二项式模型考虑到了。
plt.hist(actual_prob, label='Observed Probabilities')
plt.plot(x_locs, stats.beta.pdf(x_locs, alpha, beta), label='Generating Distribution');
plt.hist(trace_basic['p'], 15, histtype='step', density=True, label='Posterior Binomial');
plt.hist(ppc['p_bb'], 15, histtype='step', density=True, label='Posterior BetaBinomial');
plt.legend(loc='best');
乔不想做二十次
Joe 和我对虚拟实验很满意,并且相信通过进行实验,我们可以了解 Joe 在一次通过中捡起乐高的概率。但乔还是不想做实验,“二十次也不行,一次也不行。我讨厌拿起乐高玩具,为什么我要一遍又一遍地做,只是为了了解自己的一个参数。汉克,肯定会有更好的办法的。”
乔和我开始探索不同的方法,我们可以帮助他获得信心,所有的乐高积木都被捡起来了,而不必在乔身上做实验。敬请期待下一期。
本帖 全 Jupyter 笔记本可用 。
通过 AWS 中的数据日志分析进行云风险评估
原文:https://towardsdatascience.com/https-medium-com-hari-santanam-cloud-audits-and-risk-assessment-data-log-analysis-in-aws-bf04579d0c1e?source=collection_archive---------15-----------------------
使用 EMR 集群、HiveQL 和 S3 分析云数据日志
Photo by rm in on Unsplash.
随着企业、政府和教育实体越来越多地迁移其技术基础架构和流程,云和 IT 审计已成为大多数组织的一种必需。出于成本、硬件和软件的持续更新、规模和效率等方面的原因,他们将全部或部分迁移到云中。
由于 IT 云的复杂性和更大的规模,除了相对较新且快速变化之外,自动化数据收集和分析可能成为云审计和风险控制自我评估(RCSA) 的重要组成部分。随着云系统和流程变得越来越复杂,针对云合规性的自动化和交钥匙项目将变得越来越重要。
云审计可以涵盖广泛的领域,但最常见的是云安全、云应用程序使用、云治理和风险以及 IAM(身份和访问管理)。另外,还可以进行成本和使用审计。
背景和背景
随着基础架构、平台、应用程序和软件越来越多地迁移到云中,其中大多数迁移到公共云中,一些迁移到私有云,还有一些迁移到混合模式中,对审计、风险和控制评估以及合规性的需求也随之增长。因为用户(以及系统间的功能和过程)在云中所做的一切都会被记录下来(如果没有,那么就有一个更大的风险问题——为什么不呢?),理所当然地,云相关审计和风险/控制评估的起点和流程也是通过日志进行的——收集、分组、分析、评估和评价以及发现/结束。
本文提供了一个日志分析的工作示例,改编自 Amazon 云文档,以适应审计和控制框架——收集 Amazon Web Services (AWS)云数据日志,在同一个框架中的一个 EMR (Elastic Map Reduce)集群中分析它们,并将结果存储在同一个云框架中——在 S3 中,这是 AWS 中的存储区域。
Cloud Control Framework. Diagram credit: https://www.opensecurityarchitecture.org/
这是一种审计大量基于云的日志的方法,以分析和搜索日志中的细节并找到答案。在企业环境中,现有的云容量可以用来初始化这种云审计。
在下面的审计设置中,脚本从数据日志中查找并聚合每个操作系统的请求。正如您所想象的,可以从数据日志中收集到许多可能与云审计相关的其他细节(浏览器、URI、位置等)。
注意:这个例子改编自 AWS 项目,使用亚马逊 EMR (AWS Hadoop 集群) S3 (AWS 存储)和 HiveQL 脚本(用于数据仓库和分析的类似 SQL 的脚本)来分析日志文件。
我们为什么要使用这样的项目来分析审计或 RCSA 的云数据?
- 因为云数据日志的大小和规模可能非常庞大,很难用标准工具进行分析。
- 从标准 pc 或其他桌面工具收集数据、分析数据和编写输出可能更复杂,在许多情况下简直太慢了。
- 由于不同公司和不同规模的定制云设置,标准工具可能有帮助,也可能没有帮助,或者可能需要大量的购买/订阅预算。
- 从设置、探测、收集和评估来自云基础设施、服务和应用的数据日志中收集的知识将增加内部专业知识,以提供对公司 IT 云环境和风险偏好的持续评估和预测。
履行
https://aws.amazon.com/getting-started/projects/analyze-big-data/
这些是高级步骤:
(注意:AWS 帐户设置是先决条件。如果您尝试这样做,请确保在使用后删除集群和存储桶,以避免额外费用)。
- 样本数据已加载;在现实生活中的项目,相关的数据集将取代这一点。
- 使用Amazon EMR[Elastic Map Reduce]启动 Hadoop 集群,这是一种托管服务,可以轻松快速地启动集群。 集群需要准备数据(大概是企业云环境中的大量数据),创建 Hive 表并查询数据。这些表和查询针对大数据进行了优化。 集群是一组计算机,它们可以分配任务,以更快、更高效地处理大型复杂任务。
- 将数据结果加载到亚马逊 S3 上的数据集输出桶中,这是亚马逊的云存储服务。 把它想象成一个存放文件的文件夹空间。
- 结果可以迁移或下载到 Tableau 等数据可视化工具中,以便进一步分析和演示。
***#Example data log***
2014-07-05 20:00:00 LHR3 4260 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-1.jpeg 200 - Mozilla/5.0%20(MacOS;%20U;%20Windows%20NT%205.1;%20en-US;%20rv:1.9.0.9)%20Gecko/2009040821%20IE/3.0.9 ***#Example of another log...note information on ACLs***
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/mnt/yarn/usercache/livy/filecache/13/__spark_libs__2061181110188298748.zip/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See [http://www.slf4j.org/codes.html#multiple_bindings](http://www.slf4j.org/codes.html#multiple_bindings) for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
19/07/18 02:34:42 INFO SignalUtils: Registered signal handler for TERM
19/07/18 02:34:42 INFO SignalUtils: Registered signal handler for HUP
19/07/18 02:34:42 INFO SignalUtils: Registered signal handler for INT
19/07/18 02:34:42 INFO SecurityManager: Changing view acls to: yarn,livy
19/07/18 02:34:42 INFO SecurityManager: Changing modify acls to: yarn,livy
19/07/18 02:34:42 INFO SecurityManager: Changing view acls groups to:
19/07/18 02:34:42 INFO SecurityManager: Changing modify acls groups to:
19/07/18 02:34:42 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(yarn, livy); groups with view permissions: Set(); users with modify permissions: Set(yarn, livy); groups with modify permissions: Set()
19/07/18 02:34:43 INFO ApplicationMaster: Preparing Local resources
19/07/18 02:34:44 INFO ApplicationMaster: ApplicationAttemptId: appattempt_1563416155364_0001_000001
19/07/18 02:34:44 INFO RMProxy: Connecting to ResourceManager at ip-0.us-west-2.compute.internal/
19/07/18 02:34:44 INFO YarnRMClient: Registering the ApplicationMaster
19/07/18 02:34:44 INFO TransportClientFactory: Successfully created connection to 0.us-west-2.compute.internal/0 after 94 ms (0 ms spent in bootstraps)
19/07/18 02:34:44 INFO ApplicationMaster:
(1)在 AWS 中创建 EMR 集群
My EMR cluster being provisioned and prepped in AWS
(2)创建并运行 HiveQL 步骤。在本例中,AWS 步骤中已经存在创建 EMR 集群的脚本。
***# From AWS documentation*** [*https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-gs-process-sample-data.html*](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-gs-process-sample-data.html)
***#Summary: This script shows you how to analyze CloudFront logs stored in S3 using Hive***-- Create table using sample data in S3\. Note: you can replace this S3 path with your own.
CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs (
DateObject Date,
Time STRING,
Location STRING,
Bytes INT,
RequestIP STRING,
Method STRING,
Host STRING,
Uri STRING,
Status INT,
Referrer STRING,
OS String,
Browser String,
BrowserVersion String
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]([^\;]+).*\%20([^\/]+)[\/](.*)$"
) LOCATION '${INPUT}/cloudfront/data';***-- Total requests per operating system for a given time frame*****INSERT OVERWRITE DIRECTORY** '${OUTPUT}/os_requests/' **SELECT** os, **COUNT(*) count** **FROM** cloudfront_logs **WHERE** dateobject BETWEEN '2014-07-05' AND '2014-08-05' **GROUP BY os**;
My EMR cluster script step: The script run step in queue
(3)检查指定输出文件的 S3 存储文件夹
My specified output file with query results in S3.
(4)查看结果,并可能根据需求进行评估
Result file detail: Count of requests by O/S
结束:结束是[一个新过程]的开始
现在想象一下,在针对特定部门云或功能区域的数千个数据日志上使用非常特定的查询来复制这些类型的脚本,或者跨越应用程序的共享服务。以下是此过程的一系列可能步骤:
- 可以在 AWS S3 地区启动日志数据仓库,为审计或风险评估做准备。
- 然后,包含日志的特定区域要么将它们全部复制到“日志中心”空间,要么只对来自风险/控制/审计组的查询脚本启用权限。
- 基于审计/控制目标和要求,控制小组将指定确切的查询和顺序(我们在寻找什么?用户数量?查询中央数据库的应用程序 API 数量?用户位置的细分?调用系统/应用程序的客户的角色?他们属于哪一类政策?哪些传入端口对哪些应用开放,为什么?他们是太少,刚刚好还是太多?)
- 准备区域:云工程师/审计专家将绘制设计和工作流,也就是说,绘制步骤并记录细节。
- 将创建一个 EMR 集群(经理注意:确保集群成本在本练习的预算内,除非它是集中分配的!).设定严格的时间表,在此之后集群将被删除,以避免额外的成本。如果同一个集群可以重新用于管道中的下一个控制练习,则不需要删除它。
- HiveQL 脚本将被启用和测试。
- 将根据主要目标查看、分析和评估结果:
(1)结果是否符合演习中设定的目标?
(2)如果是这样,我们能使它们更好吗——更好的质量或更全面,如果适用的话?也许,通过从查询中寻找更多的细节来收集更多的见解?
(3)这些问题是否揭示了意料之外的事情,或者不是练习中提出的主要问题?
(4)如果不是,哪些是正确的日志?它们存在于我们所寻找的框架内吗?如果不是,要么问题太复杂,要么太宽泛。也许缩小范围或重新提出问题是恰当的。
如果结果与目标一致,可以通过 Tableau 或 Excel 或其他可视化工具对数据指标进行汇总、格式化和呈现。
存在更复杂的审计脚本和收集工具,甚至更多的工具正在开发中。这些工具可能是企业风险管理和控制系统的一部分,虽然全面且可定制,但运行起来会很昂贵。其他的是云管理系统本身的一部分,作为一个付费选项,由云提供商提供。与此同时,如果你所在的领域或公司已经有了云系统和一些云专家,这可能是一种自我评估的试水方式。关键问题是到底需要评估什么。要求越具体,回答就越有益。
云风险评估、控制和审计跨越 IT 和风险的许多领域,在未来很长一段时间内仍将是一个备受关注的主题。
感谢阅读!
人工智能去神秘化
原文:https://towardsdatascience.com/https-medium-com-josef-bajada-demystifying-artificial-intelligence-6f5f7a8dd1b0?source=collection_archive---------9-----------------------
人工智能是今年整个科技行业的热门词汇,关于这个领域能取得什么成就的猜测已经开始盛行。让我们将事实与虚构分开,并对所有的炒作做出一些解释。
Photo by Rock'n Roll Monkey on Unsplash
当我们开始新的一年时,技术宣传机器已经在加速其下一代流行语,承诺范式转变和银弹,将使整个行业过时,实现巨大的效率收益,并使世界变得更美好。曾经引领关键词搜索趋势和社交媒体帖子的区块链,遭遇了兴趣的显著下降,部分原因是其最初的炒作是比特币泡沫的残余。看来今年的热门词汇将会是人工智能。
这是一个新的肥缺,每个人都因为害怕错过机会而跟风。另一方面,一些非常杰出的人已经表达了对人工智能在社会上大规模扩散的风险的严重担忧,导致了许多误解、猜测和严重的似是而非的担忧。
要求我帮助他们理解这一切的人越来越多。以下是一些常见问题,以及我对这些问题的回答。
人工智能是新技术吗?
不。人工智能已经存在几十年了。自从第一台计算机建成以来,研究人员就一直在思考如何利用这些机器的快速计算能力来自动化人类大脑的各种智能特征。人工智能本身甚至不是一种技术,它是计算机科学的一个学术子领域,引入了各种数字技术,如微积分、概率、统计和线性编程。
Photo by Antoine Dautry on Unsplash
由于过于雄心勃勃的承诺,人工智能实际上经历了很长一段不受欢迎的时期,通常被称为人工智能的冬天。目前的炒作确实可能导致类似的情况。
近年来,随着成功登上主流媒体,它重新受到欢迎,例如自动驾驶汽车和深度思维的 AlphaGo 在围棋比赛中击败人类冠军选手。1997 年,当 IBM 的深蓝击败国际象棋冠军加里·卡斯帕罗夫(尽管他指责 IBM 作弊)和 2011 年沃森击败两名处于危险中的冠军时,人工智能也曾获得类似的媒体关注。
但是人工智能不是在以指数速度前进吗?
是也不是。核心人工智能技术不是。你要做的就是看看严肃的期刊和研究会议。在过去的几十年里,算法的进步一直稳定但缓慢。在媒体中制造最大噪音的算法只是早在 50 年代和 60 年代开发的技术的微调版本。
EDSAC, one of the first general purpose computers.
然而,改变的是这些算法现在运行的技术环境。例如, 人工神经网络 在最初构思的时候就走在了时代的前面,并且由于缺乏数据可用性而限制了其应用范围。如今,一个固态硬盘存储芯片,不到信用卡的一半大小,可以存储数兆字节的数据。处理器速度更快,几乎可以在每个人的口袋里找到。海量数据集可在线获得,基于云的基础设施提供按需计算资源。传感器很便宜,几乎嵌入在每一个移动设备或智能手表中,高速无线宽带网络覆盖了大多数发达国家或发展中国家,实现了实时数据传输。这使得数百种应用成为可能,从预测道路交通到预测健康分析。
随着更多的数据集和实时数据流变得可用,以及算法被微调以处理这些数据,我们一定会在未来几年看到各种领域中的大量新应用。
为什么叫人工智能?
据信,人工智能这个术语早在 1955 年就被创造出来,当时有人提议在第二年举办一个跨学科的研讨会(T2)。它的目的是把不同领域的不同专家聚集在一起,提出不同的方法来模拟人类的思维。
人工智能从更广泛的计算机科学领域中脱颖而出的地方在于,它试图解决已知很难通过计算解决的问题,有时甚至难以用传统方式建模。这可能是由于纯粹的组合爆炸、缺失信息,或者输入信号的模糊性。
Photo by Olav Ahrens Røtne on Unsplash
人类(还有动物)似乎天生就有解决这类问题的能力,我们将其归因于智力。事实上,这是遗传预编程、后天技能、知识、经验、上下文信息、带外线索、推理能力以及有时仅仅是直觉的综合结果。例如,我们似乎有一种天生的识别面孔的能力,尽管语言含糊不清,但我们理解语言的能力比计算机强得多。
人工智能和机器学习是一样的吗?
不要!当所谓的领域专家互换使用这两个术语时,实际上是令人沮丧的。机器学习只是一个非常广泛的人工智能技术领域中算法的子集。
你只需要看看事实上的标准教科书,人工智能:一种现代方法,就会发现它涵盖了许多其他主题,如基于搜索的问题解决和约束满足、基于知识的推理、规划、概率推理和自然语言处理。每一套技术对某些类型的问题有效,而对其他问题无效。
The de-facto standard A.I. textbook.
将一些领域模型作为输入并利用搜索和逻辑推理的技术被归类为符号人工智能。另一方面,利用输入和样本输出数据来推断世界模型的技术被分类为连接主义人工智能,这是因为这种算法依赖于连接节点的网络,例如人工神经网络的神经元。
An Artificial Neural Network.
虽然 Connectionist 人工智能似乎得到了所有媒体的大肆宣传,但事实是现实世界的应用程序通常需要一种混合解决方案。即使是 AlphaGo Zero,这是深度学习成功的一个主要例子,也利用搜索(蒙特卡罗树搜索)和强化学习从成千上万个可能的步骤中找到最好的步骤。
什么是深度学习?
人工智能似乎对“深度”这个词有着深厚的感情。IBM 的国际象棋计算机叫做深蓝。它的原名实际上是 Deep Thought,可能是为了向《银河系漫游指南》中的虚构计算机致敬。沃森在《危险边缘》(Jeopardy)中获胜使用的软件被称为 DeepQA ,AlphaGo 背后的公司被称为 Deep Mind(2014 年被谷歌收购)。所以难怪深度学习这个词比任何强烈的技术意义承载了更多的营销内涵。
深度学习主要与人工神经网络配置的特定风格相关联,由隐藏的处理层组成,这些处理层捕捉多个级别的特征抽象,并实现更丰富的非线性分类功能。深度神经网络在图像识别和输入为位图的问题上特别成功。
那么机器真的可以学习吗?
机器学习与人类学习有很大不同。监督机器学习通常涉及某种回归机制,它调整数学模型的参数以适应训练数据集。它更准确的名字应该是自动模型拟合,,但它听起来不够酷,不足以吸引同等水平的投资和创新兴趣。
机器实际上正在学习的是最佳的数学模型,该模型在训练数据点上以最小的误差拟合数据。它不吸收任何知识,不理解概念,也不像人类那样获得任何技能。计算机仍然是那些完全按照指令行事的愚蠢机器,在这方面“人工智能目前非常非常愚蠢”。
Photo by Franck V. on Unsplash
强化学习的工作原理是奖励好的行为,惩罚坏的行为。在某种意义上,这有点类似于人类如何通过试错来获得某些运动技能,或调整自己的行为以更容易被社会接受。这种机器学习有一些有趣的成功故事,比如斯坦福的自主直升机控制。但这仍然是一个为所遇到的情况找到最合适的解决方案的过程。
人工智能真的无处不在吗?
可以,但这取决于你认为什么是智能。当你打开网飞或浏览亚马逊的产品时,推荐系统会使用机器学习算法来分析你的个人资料,将其与其他用户进行匹配,并推荐与你有很大关联的商品。谷歌等搜索引擎多年来一直在应用自然语言处理技术,Siri、Cortana 和 Alexa 等个人助理通过语音识别将这一技术提升到了另一个水平。脸书使用面部识别来帮助你标记照片中的人。
Photo by Piotr Cichosz on Unsplash
当你在智能手机上启用位置服务时,谷歌将收集你周围的所有信息,如 GPS 坐标、蜂窝信息和 WiFi 热点,以训练自己的模型,不仅为其他用户提高定位精度,还可以预测那个地方在一天不同时间的繁忙程度。
或许你使用更简单的人工智能组件的时间比你想象的要长。像空调、洗衣机和照相机这样的电器已经使用模糊逻辑控制器很久了。
人工智能革命不可避免吗?
是的。这已经在发生了,并且将随着研究和技术创新的发展而加快。这不仅是不可避免的,而且在我看来,如果我们想保持和提高我们的生活水平,这是我们作为一个物种在不诉诸战争的情况下进一步发展的唯一希望。
人工智能是自动化的另一个层次,就像它之前的各种工业革命一样。我们不能为了降低生产成本而不断将工厂转移到生产成本更低的国家。最终,这些国家将发展经济,改善基础设施和生活水平,并变得更加昂贵。如果我们希望这种现代奴隶制结束,同时仍然以可承受的价格满足我们对消费品的需求,我们需要想出更聪明的方法来自动化我们的制造过程。中国已经在赛跑中领先。
危险的工作也需要高度自动化。石油和天然气的开采和钻探等活动是高风险作业,会造成生命损失,一旦出现问题,还会对环境造成巨大影响。一台机器不仅可以更加一致地执行任务,不会出现人为错误,而且如果需要封锁现场,可以简单地将其废弃。就在我们说话的时候,在过去的三周里,15 名男子被困在印度的一个煤矿里。人工智能还将使深空探索和卫星维护变得更容易,并在更遥远的未来,帮助商业太空活动,如月球和小行星采矿。
Photo by NASA on Unsplash
人工智能也将对我们的生活方式产生直接的积极影响。自动驾驶汽车可能会彻底改变我们目前的个人交通方式。你不需要拥有一辆车,因为你可以预定一辆你需要的车,几分钟内就可以从你家门口把你接走。一旦技术足够成熟,交通事故的数量应该会大幅减少,杜绝酒后驾车伤亡和人为失误造成的死亡事故。在繁忙时间寻找停车位所浪费的时间也可以节省下来。
一个个人医疗保健助理设备可以在你的家中使用,随时检查所有的生命指标,分析症状,并推断出最可能的原因。你不需要因为你的孩子生病而在半夜叫醒你的全科医生,或者等到早上诊断病情,开处方,在药房排队购买急需的药物。这种设备可以访问更广泛的症状和原因中央数据库,甚至可以分析最近的趋势,并确定特定地理区域的传染病爆发。它可以为你生成处方,带有一个独特的二维码,可以用来从 24/7 自动配药器中赎回药物,甚至可以通过药房的无人机送到你手中。然后自动记录病人的生命体征、疾病和治疗史,以备将来参考(当然是在区块链上)。
我们会面临机器人起义吗?
Photo by Franck V. on Unsplash
你不能责怪任何人问这个问题,特别是在一些政府和虚假的技术会议试图通过一个叫做索菲亚的木偶来完成这个游戏之后。然而,这个问题的答案是不会很快。
虽然最近的所有进步会让人认为进步如此之快,机器人将控制我们的生活并与我们作对的反乌托邦未来即将到来,但这与事实相去甚远。
到目前为止,我们拥有的人工智能算法非常简单,只专注于它们被设计或训练去做的一项任务。自动驾驶汽车只知道如何从点 a 行驶到点 b 以及它设计处理的各种道路、障碍物和周围环境。改变一些围棋规则,或者简单地改变棋盘的网格大小,你可能需要为新的配置重新训练 AlphaGo(这需要几个小时)。
我们离人工通用智能(T1)还很远,在人工通用智能中,机器人会像人类或动物一样,以自主、自我实现的方式进行推理、适应和行为。对于机器人来说,甚至考虑接管社会,他们不仅需要有解决问题的技能,而且还需要有主动性。他们需要有某种中央意识、自我意识和自由意志,以便有一天“醒来”,决定用自己的机器人之手来处理事情。我们对这些过程在我们自己的大脑中是如何工作的知之甚少,尽管并非不可能解决(大自然通过数百万年的进化成功实现了这一点),但这一直是认知科学最具挑战性的问题之一。正如吴恩达教授所说,担心这一点就像“担心火星人口过剩”。
这并不意味着人工智能的扩散不会带来任何威胁。
关于每个人的如此多的数据的可用性可能会落入坏人的手中,有意地或无意地。在最好的情况下,它将用于商业目的,如定向广告。但在最坏的情况下,它可能会严重侵犯个人的隐私和自由。我们最终可能会陷入这样一种局面:公司和政府对每个人都了如指掌,从他们在社交媒体上与谁交谈,到他们每天喜欢在哪里吃午饭。甚至在公民做错事之前,他们就可能被定性为潜在的罪犯。由于安全漏洞,你的数据可能会出现在黑市上,并被用来冒充你,玷污你的名声,或者进行勒索。
一些工作显然会被取代或变得多余。这不是什么新鲜事,伴随着人类成功实现的所有形式的自动化。马车被汽车取代,在装配线上工作的人被机械臂取代。人工智能的与众不同之处在于它对社会各阶层的各种工作都有广泛的影响。
Photo by Franki Chamaki on Unsplash
只要工作依赖数据或先验知识,人工智能就很有可能做得更好,因为它可以访问更大更全面的数据库,可以更快地处理数据,并且不受人为错误的影响。只要工作需要重复、控制或持续关注,比如开车、火车调度或空中交通管制,人工智能就会更有效率,事故发生率也会低很多。新的工作岗位将会被创造出来,教育系统将会适应并减少多余的工作岗位,社会也将最终进行调整,但这种转变将会是痛苦的。
揭开人类最黑暗的先天秘密也带来了伦理问题。强大的数据分析技术可以用来分析 DNA 模式和基因之间的关系。个人的特质、长处和短处是可以预测的。像多基因评分这样的技术可能会导致一个社会,在这个社会中,个人在出生时就被预先分配了他们的角色,或者更糟糕的是,重新开启关于种族优越性的争论。当与 DNA 测序和编辑技术的其他进步相结合时,它可以帮助消除遗传疾病,但也可能导致这样一个世界:根据父母的偏好设计后代,甚至更糟,根据政府认为对社会最“必要”的东西。
Josef Bajada 拥有计算机科学博士学位,专门研究计划和调度的人工智能技术。他是一名技术顾问,为物流和油田技术应用开发人工智能解决方案。上述文章中表达的任何观点纯属其个人观点,不一定代表任何附属机构的观点。
用 Vaex 飞得更高:用 Python 分析 30 多年的飞行数据
原文:https://towardsdatascience.com/https-medium-com-jovan-veljanoski-flying-high-with-vaex-analysis-of-over-30-years-of-flight-data-in-python-b224825a6d56?source=collection_archive---------10-----------------------
guvendemir/iStockPhoto
航空旅行对我们的社会产生了深远的影响。这是全球化的主要驱动力之一。航空旅行的商业化使我们的世界变得更小,联系更紧密。人们可以很容易地探索地球上遥远的角落,并与远离自己的文化建立联系。企业可以发展并相互联系,货物可以在几个小时内运往世界各地。
在本文中,我们将对美国各航空公司在过去 30 年中进行的近 2 亿次航班进行探索性数据分析。这些数据是经过整理的,可以从美国运输部下载。它包含每个记录的航班的各种信息,例如始发地、目的地和它们之间的距离、出发和到达的日期和时间、关于延误或取消的细节、关于运营航空公司的信息等等。
这个数据集并不大,也就是说,大小不到 100 TB。尽管如此,它确实包含了近 2 亿个样本和 29 个列,占用了大约 23GB 的磁盘空间。您可能认为全面的数据分析可能需要一个强大的云实例,甚至一个小型集群,以避免遇到内存问题并加快计算速度。或者,人们可以采取二次抽样的方法,也许把重点放在最近几年的飞行数据上。然而,这些实际上都不是必需的。事实上,我要展示的整个分析是在我的 2013 年 13 英寸 MacBook Pro 上进行的,并且使用了标准的 Python 工具。你想知道什么?
输入 Vaex。 Vaex 是一个开源的数据框架库(类似于熊猫)。使用 Vaex,用户可以处理任意大小的表格数据集,而不会遇到内存问题。只要你的硬盘能装下这些数据,你就可以开始了。诀窍是将数据转换成内存可映射文件格式,如 Apache Arrow、 Apache Parquet 或 HDF5 。一旦完成,Vaex 将使用其快速核外算法来计算各种统计数据,或任何与预处理和探索表格数据集相关的任务。
完整的分析可在这款 Jupyter 笔记本中找到,在这里您可以看到原始数据文件(压缩 CSV)是如何被转换成内存可映射的 HDF5 文件格式的。
准备起飞
让我们从阅读我们将要分析的数据集开始:
用 Vaex 打开一个内存可映射文件是即时的,不管文件是 1GB 还是 1TB 大。
每当我面对一个我不熟悉的数据集时,我通常的第一步是获得其内容的高级概述。describe
方法给出了数据帧的概述,并显示了每一列的数据类型、条目数和缺失值。此外,对于每个数字列,它还显示平均值、标准偏差、最小值和最大值。所有这些都是通过一次数据传递完成的!
Fig. 1: The output of the describe()
method in a Jupyter notebook.
基于describe
方法的输出,我们可以对数据进行初步过滤。也就是说,去除非物理的负持续时间和距离:
这是停下来欣赏 Vaex 做事方式的绝佳时机。其他常用的数据科学工具需要大约 23 GB 的 RAM 才能加载和检查这个数据集。如上所示的过滤操作将需要大约 20GB 的 RAM 来存储过滤后的数据帧。Vaex 对于检查和与任意大小的数据集交互所需的 RAM 量可以忽略不计,因为它从磁盘中缓慢地读取数据集。此外,上面的过滤操作创建了一个浅拷贝,它只是对应用了二进制掩码的原始数据帧的引用,选择显示哪些行并用于进一步的计算。Vaex 立即为我们节省了超过 40 GB 的内存!这确实是 Vaex 的主要优势之一:可以进行大量的选择、过滤、分组和各种计算,而不必担心 RAM,我将在本文中通篇展示这一点。
无论如何,让我们从统计每年的飞行次数开始分析。用value_counts
方法很容易做到。说到可视化,我喜欢建立在matplotlib
之上的seaborn
库,所以在整个分析中我会经常使用它。
Fig. 2: Number of flights per year
我们看到,在 20 世纪 80 年代末和 90 年代,航班数量稳步上升,在 2000 年代中期达到顶峰。2002 年的突然下降是由于 2001 年悲剧之后制定的新的安全条例。随后在 2010 年出现下降,2018 年航班数量突然回升。
人们可以采用类似的方法来确定美国最常见的起点和终点。图 3 显示了过去 30 年中最常见的 11 个始发和目的地机场。这两个面板几乎相同,这是有道理的——去程航班的数量应该与来程航班的数量相匹配。亚特兰大国际机场(ATL)的客流量最大,其次是奥黑尔国际机场(ORD)和达拉斯/沃斯堡国际机场(DFW)。
Fig. 3: Top 11 most common origins and destinations
接下来,让我们找到热门的起飞日期和时间。使用 Vaex,这非常简单:
首先,我们从Month
和DayOfWeek
列中减去-1
,使它们从 0 开始。由于这些列包含离散的整数,我们将它们标记为“分类的”。最后,我们可以使用plot
方法来可视化特定日期和月份起飞数量的二维直方图。通常,plot
方法在给定网格分辨率和边界的情况下,生成连续数据的二维直方图。但是,由于绘制的列被标记为分类,该方法将自动设置条块,并计算每个日/月组合的离散值。结果如下图所示:
Fig. 4: Number of flights per month vs day of the week.
似乎七月和八月是乘飞机旅行最受欢迎的月份,而二月是空中交通最少的月份。周六起飞的飞机数量最少,二月的周六起飞的飞机数量也最少。
类似地,我们还可以探索一周中每天任何给定小时的出发次数:
Fig. 5: Number of departures per hour vs day of week.
早上 6 点到 9 点之间的时间段出发的人最多,另一个高峰出现在下午 5 点。与白天相比,夜间(晚上 10 点至凌晨 5 点)的航班数量明显减少。与工作日相比,周末的起飞量较少,如图 3 所示。
现在让我们把注意力转向飞行本身的一些基本性质。让我们绘制飞行时间、距离和速度分布图:
Fig. 6: Distributions of the air-time(left), distance (middle) and average speed(right) for each flight.
看着图 5,我很好奇:哪些是最短和最长距离的常规路线。所以让我们来看看。为了找出短途飞行的频繁航班,让我们计算以下任何给定距离的航班数量,比如 20 英里:
> 11 2710
17 46
18 5
16 3
12 2
10 2
19 1
8 1
6 1
dtype: int64
看起来在相距仅 11 英里的两个机场之间发生了近 3000 次航班!对 Origin 列应用与上面代码块中相同的过滤器的value_counts
方法,告诉我们有哪些航线:旧金山国际机场—奥克兰国际机场在过去 30 年中有超过 2600 次航班,而约翰·肯尼迪国际机场—拉瓜迪亚机场在同一时期只有少量航班。让我们更详细地了解一下,统计一下这两个机场对之间每年的航班数量:
Fig. 7: Number of flights per year on the shortest routes over the past 30 years.
从上图的左图我们可以看到,旧金山国际机场和奥克兰国际机场之间的定期航线至少存在了 5 年。距离只有 11 英里的乌鸦文件,这只是疯狂的。根据谷歌地图,人们可以在 30 多分钟内驾车往返于这两个机场。事实上,根据航班数量,我们可以推断,1988 年这两个机场之间平均每天有近 4 个航班,在随后的 4 年里减少到大约每天一个航班。从 1993 年开始,只有少数几个航班进行了登记。另一方面,在过去 30 年中,约翰·肯尼迪国际机场和拉瓜迪亚机场之间只有 53 次航班记录在案,很可能是私人航班或特殊服务。
Fig. 8: Google Maps screen-shot showing the proximity between San Francisco and Oakland airports.
为了确定最长的常规路线,我们可以做类似的练习。通过查看图 5 的中间部分,让我们来计算一下飞行里程超过 4900 英里的航班数量:
> 4962 13045
4983 4863
4963 2070
dtype: int64
看起来有 3 组固定距离,表明至少有 3 对机场。请注意,其中两个距离组仅相差一英里。为了确定哪些机场是有问题的,我们可以根据航班的始发地、目的地和距离对数据进行分组,然后对数据进行过滤,只选择距离非常远的机场:
> # Origin Dest Distance count
*0* HNL JFK 4983 2432
*1* HNL EWR 4962 6528
*2* HNL EWR 4963 1035
*3* EWR HNL 4962 6517
*4* EWR HNL 4963 1035
*5* JFK HNL 4983 2431
groupby
行动的结果告诉我们,事实上只有两条航线:纽瓦克自由国际机场(EWR)和约翰·肯尼迪国际机场(JFK)都往返于火奴鲁鲁国际机场(HNL)。如果遵循标准航线,檀香山国际机场和纽瓦克自由国际机场之间的飞行距离应该正好是 4962 英里。然而,由于 2001 年的悲剧,航线被临时改变了几年,这就是为什么我们在相同的机场之间观察到两个几乎相同的飞行距离。让我们看看这两个机场之间每年的航班数量:
Fig. 9: Number of flights between Honolulu International and Newark Liberty International airports.
上图显示,从 1999 年开始,纽瓦克自由国际机场和檀香山国际机场之间几乎每天都有两班航班。另一条长途定期航线是在檀香山国际机场和约翰·肯尼迪国际机场之间。与之前类似,我们可以绘制每年发生的航班数量,如下所示。2012 年开始了频繁的服务,平均每天一个航班。从 2013 年开始,这两个机场之间平均每天有两个航班。
Fig. 10: Number of flights between Honolulu International and John F. Kennedy International airports.
让我们更加专注
我们正在分析的数据集不仅包括我们最初可能想到的较大的通勤枢纽,还包括许多不太常用的地方机场,以及货运、运动和军用机场。事实上,在数据中出现的 441 个机场中,10 个最频繁的机场占 33%,而 50 个最频繁的机场占我们数据集中所有起飞的 80%。因此,在随后的分析中,我将只考虑大型商业机场。一个机场进入这一选择的“经验法则”是在过去 30 年中有超过 20 万次的离港。基本原理是这样一个机场应该有大约 20 个定期目的地,每天一个航班。为了进行这样的选择,我们将根据起点对航班进行分组,然后计算每组中的航班数量。由于我们已经在进行groupby
操作,我们可以计算额外的综合统计数据,如平均滑行时间、飞行距离和航班延误:
从这组数据中,我们可以得到一些有趣的见解。例如,让我们检查平均航程最长的 10 个机场,即出发航班平均飞行距离最长的机场:
我们发现这些机场要么位于美国偏远地区,如夏威夷群岛(HNL、OGG)、波多黎各(SJU)、阿拉斯加州(ANC),要么附属于大陆沿海较大城市(三藩市、洛杉机、纽约州、迈阿密)。事实上,如果我们取每个机场始发航班的平均距离的中间值,我们得到的值是 600 英里。该值代表大城市或包含常用商业机场的热门目的地之间的典型距离。
我们还可以调查每个机场的滑行进入和滑行退出时间,这是飞机在起飞前和着陆后分别处于运动或等待状态的时间,同时所有乘客仍在飞机上。这可以让我们了解一个机场有多“忙”,或者它的运行效率有多高。让我们画出机场平均滑行时间的分布图:
Fig. 11: Average taxi times for the main airports
平均来说,一架飞机起飞前滑行的时间比着陆后多 5-10 分钟。对于一些机场来说,平均滑行时间可能会超过 20 分钟。起飞前最长的等待时间发生在约翰肯尼迪机场,平均滑行时间为 28 分钟!在这方面,拉伯克国际机场是最好的,平均滑行时间刚刚超过 8 分钟。
延误和取消
现在让我们做一些更有趣的事情,看看航班延误和取消。因为我们只想考虑最常使用的机场,所以我们可以在我们用于此分析的主数据帧df_filtered
和df_group_by_origin
数据帧之间进行内部连接,我们从这些数据帧中筛选出起飞人数少于 20 万的机场:
为了标记航班是否延误,我们可以添加一个虚拟列:
回想一下,这不占用任何内存,只是存储在数据帧中的一个数学表达式,仅在必要时才进行计算。数据集中已经存在一个类似的列,但用于已取消的航班。让我们看看每年延误和取消的次数:
Fig. 14: Number of delays per year
Fig. 15: Number of cancellations per year
自 2003 年以来,该数据库还包含航班取消的原因,如果知道的话。因此,我们可以创建一个图表,显示每个取消代码每年的取消次数,即航班被取消的原因。seaborn
库对于这样的可视化特别有用:
Fig. 16: The reason behind flight cancellations per year, if known.
看到由于安全原因取消的数量最近有所上升,这有点令人担忧。希望这只是相对的高峰,这样的取消在将来会少得多。现在让我们看看哪些机场的航班最常被延误或取消:
Fig. 17: Airports at which outgoing flights experience the most delays (left) and cancellations (right).
在匹兹堡国际机场(PIT ),超过 45%的离港航班都经历过某种程度的延误!芝加哥中途国际公司(MDW)和达拉斯国际公司(DFW)也紧随其后。威彻斯特县机场(HPN)、拉瓜迪亚机场(LGA)和波特兰国际机场(PWM)是取消航班比例最大的三大机场。
现在让我们开始指责,看看哪些航空公司经历了最多的延误和取消,而不考虑起点。我们正在使用的数据集已经包含一个列,其中包含每个航班的主要承运商的代码。要将实际的航空公司名称附加到该代码上,我们可以使用中的表。请注意,该表已经编译了一段时间,因此可能有点过时。让我们将实际的航空公司名称映射到数据集中的航空公司代码:
Fig. 18: Airline carriers which experience the most delays (left) and cancellations (right).
我希望你在上图中没有看到你最喜欢的航空公司!令人难以置信的是,有些航空公司的航班延误时间超过 50%。但别再指指点点了。让我们看看光谱的另一端,看看哪些航空公司经历的延误和取消最少:
Fig. 19: Airline carriers which experience the fewest delays (left) and cancellations (right).
取消航班最少的航空公司是那些通常长途运营的航空公司,比如夏威夷航空公司或那些环太平洋飞行的航空公司。这是有道理的:这些机场没有太多的“交通堵塞”,这些航班通常距离很远,不太频繁,因此可能被赋予更高的优先级。
比以往任何时候都更加紧密
最后,让我们看看不同机场之间的连接数量是如何随时间变化的。让我们计算每个常用机场连接的唯一连接的平均数量,并绘制每年的图表:
Fig. 20: The mean number of unique destinations that can be reached from each airport.
从上图我们可以看到,在经历了几年的“停滞”之后,2018 年美国的机场比以往任何时候都更加互联互通。
感谢您乘坐我们的航班
美国的飞行数据是一个非常有趣的数据集。它提供了许多可以分析这些数据的角度,比本文所描述的要多得多。也请查看完整的笔记本,因为它包含了更多关于上述情节是如何创作的细节,以及一些额外的见解。
我希望这能激励你更深入地研究这个问题,甚至更大的数据集,尤其是现在你已经知道用 Vaex 来做这件事是多么容易。事实上,我认为这个数据集有点小,至少就 Vaex 而言。Vaex 是免费的开源软件,我鼓励你在工作流程中尝试一下,尤其是当你遇到内存问题的时候。
数据科学快乐!
用决策树进行分类和回归分析
原文:https://towardsdatascience.com/https-medium-com-lorrli-classification-and-regression-analysis-with-decision-trees-c43cdbc58054?source=collection_archive---------1-----------------------
通过理解决策树背后的基本概念和数学,学习构建分类和回归决策树!
决策树是一种受监督的机器学习模型,用于通过从特征中学习决策规则来预测目标。顾名思义,我们可以把这个模型看作是通过提出一系列问题来做出决定,从而分解我们的数据。
让我们考虑下面的例子,其中我们使用决策树来决定某一天的活动:
基于我们训练集中的特征,决策树模型学习一系列问题来推断样本的类别标签。正如我们所见,如果我们关心可解释性,决策树是有吸引力的模型。
虽然上图说明了基于分类目标的决策树的概念(分类),但是如果我们的目标是实数(回归),同样的概念也适用。
在本教程中,我们将讨论如何用 Python 的scikit-learn
库构建决策树模型。我们将涵盖:
- 决策树的基本概念
- 决策树学习算法背后的数学原理
- 信息增益和杂质测量
- 分类树
- 回归树
我们开始吧!
本教程改编自 Next Tech 的 Python 机器学习系列,带你从 0 到 100 的机器学习和深度学习算法。它包括一个浏览器内沙盒环境,预装了所有必要的软件和库,以及使用公共数据集的项目。这里可以开始!
决策树的基础
决策树是通过递归划分构建的——从根节点(称为第一个父节点)开始,每个节点可以拆分成左右子节点。然后,这些节点可以被进一步拆分,并且它们自己成为其结果子节点的父节点。
例如,看上面的图片,根节点是Work to do?
,并根据是否有工作要做而分成子节点Stay in
和Outlook
。Outlook
节点进一步分成三个子节点。
那么,我们如何知道每个节点的最佳分裂点是什么呢?
从根开始,数据在导致最大信息增益 ( IG )的特征上被分割(下面更详细地解释)。在迭代过程中,我们然后在每个子节点处重复该分裂过程,直到叶子是纯的——即,每个节点处的样本都属于同一类。
在实践中,这会导致树非常深,有很多节点,这很容易导致过度拟合。因此,我们通常希望通过设置树的最大深度来修剪树。
最大化信息增益
为了在最具信息性的特征处分割节点,我们需要定义一个目标函数,我们希望通过树学习算法来优化该目标函数。这里,我们的目标函数是最大化每次分裂的信息增益,我们定义如下:
这里, f 是执行拆分的特征, Dp , Dleft 和 Dright 是父节点和子节点的数据集, I 是杂质度量, Np 是父节点的样本总数, Nleft 和 Nright 是
我们将在下面的例子中更详细地讨论分类和回归决策树的杂质度量。但就目前而言,只要明白信息增益简单来说就是父节点杂质和子节点杂质之和的差——子节点杂质越低,信息增益越大。
注意,上面的等式是针对二元决策树的——每个父节点只被分成两个子节点。如果你有一个有多个节点的决策树,你可以简单地将所有节点的杂质相加。
分类树
我们先来说说分类决策树(又称分类树)。对于这个例子,我们将使用机器学习领域的经典产品 Iris 数据集。它包含了来自三个不同物种 Setosa 、 Versicolor 和 Virginica 的 150 朵鸢尾花的尺寸。这些将是我们的目标。我们的目标是预测一朵鸢尾花属于哪一类。以厘米为单位的花瓣长度和宽度存储为列,我们也称之为数据集的特征。
让我们首先导入数据集,并将特征指定为X
,将目标指定为y
:
使用scikit-learn
,我们现在将训练一个最大深度为 4 的决策树。代码如下:
注意,我们将criterion
设置为“熵”。这一标准被称为杂质测量(在前一节中提到)。在分类中,熵是最常见的杂质测量或分裂标准。其定义如下:
这里, p(i|t) 是属于特定节点 t 的类别 c 的样本的比例。因此,如果一个节点上的所有样本都属于同一个类别,则熵为 0,如果我们具有均匀的类别分布,则熵最大。
为了更直观地理解熵,让我们为类别 1 的概率范围[0,1]绘制杂质指数。代码如下:
可以看到,如果 p(i=1|t) = 1 ,熵就是 0。如果类以 p(i=1|t) = 0.5 均匀分布,熵为 1。
现在,回到我们的虹膜例子,我们将可视化我们训练过的分类树,看看熵是如何决定每个分裂的。
scikit-learn
的一个很好的特性是,它允许我们在训练后将决策树导出为一个.dot
文件,例如,我们可以使用 GraphViz 将其可视化。除了 GraphViz,我们将使用一个名为pydotplus
的 Python 库,它具有与 GraphViz 类似的功能,允许我们将.dot
数据文件转换为决策树图像文件。
您可以通过在终端中执行以下命令来安装pydotplus
和graphviz
:
pip3 install pydotplus
apt install graphviz
以下代码将创建一个 PNG 格式的决策树图像:
tree.png
查看保存在图像文件tree.png
中的结果决策树图,我们现在可以很好地追溯决策树从我们的训练数据集确定的分裂。我们从根处的 150 个样本开始,使用花瓣宽度截止值≤ 1.75 cm,将它们分成 50 个和 100 个样本的两个子节点。第一次拆分后,我们可以看到左边的子节点已经是纯的,只包含来自setosa
类的样本(熵= 0)。右侧的进一步分割用于从versicolor
和virginica
类别中分离样本。
查看最终的熵,我们看到深度为 4 的决策树在分离花类方面做得非常好。
回归树
我们将使用 波士顿住房 数据集作为我们的回归示例。这是另一个非常受欢迎的数据集,包含波士顿郊区的房屋信息。共有 506 个样本和 14 个属性。出于简单和直观的目的,我们将只使用两个目标值— MEDV
(以千美元计的自有住房的中值)和LSTAT
(人口中较低地位的百分比)作为特征。
让我们首先将必要的属性从scikit-learn
导入到pandas
数据框架中。
让我们使用在scikit-learn
中实现的DecisionTreeRegressor
来训练一个回归树:
请注意,我们的criterion
与我们用于分类树的不同。熵作为杂质的量度是分类的有用标准。然而,为了使用决策树进行回归,我们需要适用于连续变量的杂质度量,因此我们使用子节点的加权均方误差 ( MSE )来定义杂质度量:
这里, Nt 为节点 t 的训练样本数, Dt 为节点 t 的训练子集, y(i) 为真实目标值, ŷt 为预测目标值(样本均值):
现在,让我们对MEDV
和LSTAT
之间的关系进行建模,看看回归树的直线拟合看起来像什么:
正如我们在结果图中看到的,深度为 3 的决策树捕捉到了数据的总体趋势。
我希望你喜欢这个关于决策树的教程!我们讨论了决策树的基本概念,最小化杂质的算法,以及如何为分类和回归构建决策树。
在实践中,知道如何为树的深度选择一个合适的值以避免数据过拟合或欠拟合是很重要的。了解如何组合决策树以形成集合随机森林也很有用,因为由于随机性,它通常比单个决策树具有更好的泛化性能,这有助于减少模型的方差。它对数据集中的异常值也不太敏感,并且不需要太多的参数调整。
我们在我们的 Python 机器学习 系列中涵盖了这些技术,以及其他机器学习模型,如感知器、Adaline、线性和多项式回归、逻辑回归、支持向量机、核支持向量机、k 近邻、情感分析模型、k 均值聚类、DBSCAN、卷积神经网络和递归神经网络。
我们还关注其他主题,如正则化、数据处理、特征选择和提取、降维、模型评估、集成学习技术以及部署机器学习模型。
这里 可以入门 !
BigQuery:嵌套数据上的 SQL
原文:https://towardsdatascience.com/https-medium-com-martin-weitzmann-bigquery-sql-on-nested-data-cf9589c105f4?source=collection_archive---------3-----------------------
在 BigQuery 中运行分析可能非常强大,因为嵌套数据和数组基本上意味着处理预连接的表。查询它们可能非常有效,但许多分析师不熟悉半结构化、嵌套的数据,并努力利用其全部潜力。
“半结构化”到底是什么意思?
这意味着我们可以定义一个复杂的嵌套结构,但它必须在整个表中保持一致。要创建它,我们需要两样东西:结构和数组。定义结构的一种方法是使用 struct()函数:
SELECT
STRUCT(42 as answer, 'Hello World!' as greeting) as info
结果的 JSON 表示如下:
{
"info": {
"answer": "42",
"greeting": "Hello World!"
}
}
定义数组也相当容易。请注意,在定义结构时,您只需要在第一个实例中定义字段名称。所有其他结构都继承这些名称。
SELECT
[1, 4, 832] as integers,
['a', 'b', 'c', 'xyz', 'Hallo!'] as strings,
[true, true, false, true ] as booleans,
[
STRUCT(1 as int, false as bools),
STRUCT(25, false),
STRUCT(620, true)
] as structs1,
[
STRUCT( [5, 2, 9] as arr ),
STRUCT( [7, 2] ),
STRUCT( [15, 0, 94] )
] as structs2
A couple of arrays … and arrays in an array — everything in one row! (screenshot by author)
正如你在structs2
中看到的,为了在一个数组中列出数组,你需要将它们放入一个结构中。这样他们可以有一个名字,也可以在以后得到解决。
但是这些数组是如何预先连接到表中的呢?
请这样想:通常信息分布在多个表中以节省存储空间,只有在需要时才组合在一起,如下例所示:
WITH t1 AS (
SELECT 1 AS id, 'spaghetti napoli' AS meal
UNION ALL
SELECT 2, 'soljanka'
),
t2 AS (
SELECT 1 AS id, 'spaghetti' AS ingredient
UNION ALL
SELECT 1, 'tomatoes'
UNION ALL
SELECT 2, 'pickles'
UNION ALL
SELECT 2, 'lecsó'
)
SELECT * FROM t1 LEFT JOIN t2 USING(id)
Yummy result of a join (screenshot by author)
现在,在嵌套数据中,相同的场景看起来更像这样:
WITH t1 AS (
SELECT 'spaghetti napoli' as meal, ['spaghetti', 'tomatoes'] as ingredient
UNION ALL
SELECT 'soljanka', ['pickles', 'lecsó']
)
SELECT * FROM t1
Nested result in two rows (screenshot by author)
我们将两个表合并为一个—数据放在一起,节省了存储空间,并且不需要 id。
好的,但是我如何查询数组呢?
公平的问题—让我们看看选项…
Unnest 阵列
允许我们查询数组的神奇函数叫做UNNEST()
。它将一个数组作为输入,并将它的内容作为表行作为输出。如果数组由结构组成,它会很方便地将它们转换成列。
SELECT id, name FROM UNNEST( [
STRUCT(12 as id, 'Hannah' as name),
(13, 'Simone'),
(14, 'Ada')
] )
3 important personalities in 3 rows from one array (screenshot by author)
使用UNNEST()
有两种方法:展平表格或者使用子查询。这在很大程度上取决于您的用例。
- 扁平化大大增加了表格的大小
- 子查询聚集数组
这意味着,如果你能避免扁平化,那么尽一切办法避免它!
子查询未嵌套数组
如果要聚合数组,应该使用子查询。只需将您的查询括在括号中并选择FROM UNNEST()
:
WITH t1 AS (
SELECT 'spaghetti napoli' AS meal, ['spaghetti', 'tomatoes'] AS ingredient
UNION ALL
SELECT 'soljanka', ['pickles', 'lecsó']
)
SELECT
meal,
(SELECT COUNT(*) FROM UNNEST(ingredient)) AS numIngr,
(SELECT STRING_AGG(i, '; ' ORDER BY i) FROM UNNEST(ingredient) AS i) AS listIngr,
(SELECT i FROM UNNEST(ingredient) i ORDER BY LENGTH(i) DESC LIMIT 1) AS longestIngr
FROM t1
Go ahead and add your own sub-query! (screenshot by author)
就像嵌套在 for 循环中的 for 循环一样,子查询在每行执行。您可以使用 SQL 提供的大多数东西。无论是排序、分组、开窗还是甚至与当前行中的其他数组相结合。
您甚至可以通过将子查询输出反馈给函数ARRAY()
来准备数据和创建自己的数组。如果您想用多列的结构填充它,只需SELECT AS STRUCT
。
WITH t1 AS (
SELECT 'spaghetti napoli' AS meal, ['spaghetti', 'tomatoes'] AS ingredient
UNION ALL
SELECT 'soljanka', ['pickles', 'lecsó']
)
SELECT
meal,
ARRAY(
SELECT AS STRUCT
i,
substr(upper(i),1,3) as ui,
length(i) as len
FROM UNNEST(ingredient) i
) myIngred
FROM t1
在 BigQuery 中试试吧!添加您自己的子字段!
Write your own sub-tables! (screenshot by author)
子查询也非常适合快速查看非常大的表。在 Google Analytics 数据上尝试这个查询——它只显示特定事件的选定字段。
SELECT
event_name,
-- Create an array with selected columns only (literally)
array(
select as struct item_id, item_name, item_category, item_list_index, promotion_name
from unnest(items)
order by item_list_index
) as items
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_20210131`
WHERE
ARRAY_LENGTH(items)>1
AND event_name='view_item'
LIMIT 1000
Better exploration with less sub-columns (screenshot by author)
我提到过你可以在WHERE
子句中运行子查询吗?不要混淆哪个WHERE
适用于整个桌子,哪个适用于UNNEST(hits)
。每个WHERE
都有它的FROM
!小心瞄准镜!
SELECT
event_name,
items
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_20210131`
WHERE
-- Only show events with "Charcoal" in their product name
exists(select 1 from unnest(items) where item_name like '%Charcoal%')
Filter events with conditions on items (screenshot by author)
通过在非嵌套数组上使用联接来拼合表格
由于UNNEST()
为我们提供了表格行,我们不仅可以查询它们,还可以在JOINs
中使用它们!
WITH t1 AS (
SELECT 'spaghetti napoli' AS meal, ['spaghetti', 'tomatoes'] AS ingredient
UNION ALL
SELECT 'soljanka', ['pickles', 'lecsó']
)
SELECT
meal,
i
FROM t1 CROSS JOIN UNNEST(ingredient) AS i
This is called lateral joining — a separate join per row (screenshot by author)
事情是这样的:
- 将数组转换成表格行
- 将它们与数组父行交叉连接
我们有效地为来自未嵌套数组的每一行重复父行。
但这也意味着,从技术上讲,我们也在重复数组。因此,如果我们没有选择正确的列,整个事情看起来会有点混乱。试着用*
替换meal, i
:
Not so flat anymore … (screenshot by author)
如果你对“扁平化”表格有更深的了解,你可以充分利用这个事实。例如,在这个查询中,我们使用展平的子行的信息在该行所在的数组中进行查找!
SELECT
event_name,
itm.item_name,
-- Count Google items within the duplicated items array!
(select COUNT(1) from unnest(items) where item_name like '%Google%') anzahl_Google_items_im_elternevent
-- Cross Join with the items array!
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_20210131` t, t.items as itm
WHERE
-- Only show items whose event-products have "Charcoal" in their product name
exists(select 1 from unnest(items) where item_name like '%Charcoal%')
Items that are “adjacent” to charcoal items (screenshot by author)
在关系表中,这相当于连接两个表 t1 和 t2,但仍然编写子查询来检查 t2 中的某些内容。
使用非嵌套数组的高效查询
让我们回顾一下:
- 子查询有利于集合数组
- 交叉连接有利于根据表中包含的数组的大小来加长表
但是交叉连接也意味着大量的计算——所以如果你能避免它们:避免它们。
作为一般准则:
如果您需要通过数组中的值来扩展您的表,请使用cross join
。例如,您想要group by
我们示例表中的成分。
WITH t1 AS (
SELECT 'spaghetti napoli' AS meal, ['spaghetti', 'tomatoes'] AS ingredient
UNION ALL
SELECT 'soljanka', ['pickles', 'lecsó', 'tomatoes']
)
SELECT
i, count(*) qty
FROM t1 CROSS JOIN UNNEST(ingredient) AS i
GROUP BY 1
Group by ingredient from the array — no way around cross joining (screenshot by author)
如果您只需要来自数组的聚合值,使用子查询。当然,您也可以在聚合中使用它们:
WITH t1 AS (
SELECT 'spaghetti napoli' AS meal, ['spaghetti', 'tomatoes'] AS ingredient
UNION ALL
SELECT 'soljanka', ['pickles', 'lecsó', 'tomatoes']
)
SELECT
-- sum the length-sums over all meals
SUM(
-- sum lengths of all ingredients in this meal/array
(SELECT SUM(LENGTH(i)) FROM UNNEST(ingredient) AS i)
) AS sumLenIngred
FROM t1
Aggregations all the way down (screenshot by author)
这意味着您应该避免这个版本的查询以节省金钱、资源和时间:
SELECT
SUM(length(i)) AS sumLenIngred
FROM t1 cross join unnest(ingredient) i
-- Please don't do this
我知道它比较短——但只供你阅读。特别是对于 BigQuery,这个版本是对结果的更长的方式 ,因为它必须先扩展表,然后才聚合它。而在子查询版本中,它只是聚合而没有额外的cross join
步骤。
我希望这对您有所帮助,并让您开始使用嵌套数据中的 SQL!让我知道,如果你有问题或需要更多的阐述!
编辑于 2023 年 2 月。
阅读如何主动创建嵌套数据 BigQuery 中数据清理和数据准备所需的技能:
[## BigQuery:使用 SQL 创建嵌套数据
在 BigQuery 中对嵌套数据使用 SQL 是非常高效的。但是,如果您的数据出现在平面表中,比如…
towardsdatascience.com](/bigquery-creating-nested-data-with-sql-727b761f1755) [## 通过我的推荐链接加入 Medium-Martin Weitzmann
阅读马丁·威茨曼(以及媒体上成千上万的其他作家)的每一个故事。您的会员费直接…
medium.com](https://medium.com/@martin.weitzmann/membership)
美国刑事司法系统对大数据算法的滥用
原文:https://towardsdatascience.com/https-medium-com-mfingerhood-the-misuse-of-big-data-algorithms-in-the-united-states-criminal-justice-system-e9053d947aa?source=collection_archive---------18-----------------------
尽管(风险需求评估测试)是出于好意,但我担心它们可能会无意中破坏我们确保个性化和平等司法的努力。通过将量刑决定建立在静态因素和不可改变的特征(如被告的教育水平、社会经济背景或居住环境)的基础上,他们可能会加剧不必要和不公正的差异,而这种差异在我们的刑事司法系统和社会中已经太普遍了。
—埃里克·霍尔德,美国前司法部长
美国拥有世界上最多的监狱人口。美国有 230 多万囚犯,关押着世界监狱人口的 25%以上,而其总人口仅占 5%。虽然大约 1%的美国人口被监禁,但没有哪个群体比黑人更容易成为目标。三分之一的美国黑人将在监狱服刑在一些州,黑人因毒品指控入狱的比率是白人的 20 到 50 倍。
近年来,这种制度化的种族主义做法和大规模监禁的现实并没有被完全忽视。事实上,许多执法机构和联邦机构已经找到了消除种族偏见和提高效率的方法。或许并不令人意外的是,在大数据时代,算法已经成为所谓的解决方案。这些算法主要采取风险需求评估测试(RNAs)和地理空间预测监管技术的形式(后者我不会在本文中讨论)。理论上,这些技术是出于诚实的目的而实施的,但在实践中,它们最终强化了它们想要消除的偏见,并披上了客观的外衣。
什么是 RNA?
Sample RNA Score Sheet
早在 20 世纪 70 年代,早期版本的计算性 RNAs 就已经存在,作为一种工具,帮助执法部门识别再犯风险较低的囚犯,以便他们有资格获得提前假释。简而言之,这些测试利用静态风险因素,如首次被捕时的年龄、性别或种族,结合动态风险因素,如婚姻和就业状况以及教育水平,根据以前罪犯的数据确定相对风险得分。虽然这些项目最初旨在帮助通知假释等审后决定,但管理人员此后对 RNA 的应用变得过于自信和过度热情,将他们的触角延伸到了审前决定,如保释金额或刑期。在这样做的时候,刑事司法机构忽略了大数据算法的关键现实。具体来说,他们忽略了这样一个事实,即数据集可能天生就有偏差,即使被的客观吸引力和数字的简单性所迷惑,异常值也是存在的。
为什么 RNA 的使用有问题?
2007 年,首席大法官会议和州法院行政人员会议呼吁使用 RNA 测试来协助判决刑期,因为它们在预测累犯方面很有效。这意味着 RNA 算法将在审判过程中实施,以根据被告未来犯罪可能性的预测告知法官建议的刑期。因为这个应用程序有严重的后果,所以管理员必须假设可以忽略不计的假阴性(如果有的话),以及数据集的完全客观性。事实上,情况并非如此。
宣判期间使用 RNA 的含义
RNA 测试在一个充满偏见的社会中进行。因此,这些测试使用的数据是有偏差的。举个例子,在 RNA 算法中使用逮捕历史。据统计,一名警察逮捕一名黑人的可能性是逮捕一名白人的三倍多,即使他们后来没有被定罪。不考虑定罪,逮捕历史在某些算法中被用作进一步预测风险的输入,从而证明了数据的主观性。
Data From ProPublica
2016 年,当 ProPublica 对 NorthePointe 的算法 COMPAS 进行外部分析时,RNA 测试中有偏见数据的后果被揭示出来。ProPublica 分析了佛罗里达州布劳沃德县 7000 名在 2013 年至 2014 年期间被判刑的人的 RNA 结果。评估发现,COMPAS 只能准确预测 61%的个人的累犯率。此外,该算法更有可能“错误地将黑人被告标记为未来的罪犯,错误地将他们标记为白人被告的比例几乎是白人被告的两倍。白人被告比黑人被告更容易被误贴上低风险的标签。”该研究继续说道,“黑人被告仍有 77%的可能性被认定为未来实施暴力犯罪的风险较高,45%的可能性被预测为未来实施任何形式的犯罪。”这些结果意义重大,无论是在计算误差方面,还是在它们不可逆转地、不成比例地针对和损害真实的、活着的美国人的生活方面。
具体来说,来自佛罗里达州劳德代尔堡的 18 岁黑人妇女 Brisha Borden 在偷了一辆价值 80 美元的自行车后,在 RNA 测试中得了 8 分。弗农·普拉特,一名 41 岁的白人男子,从一家家得宝商店偷了价值相当的货物。Prater 之前有几项指控,并在过去服刑,但他仍然获得了 3 分的风险评分。最终,这些分数被用来确定两个被告的保释金数额,并不成比例地负担波登。此外,在实施分数管理两年后,Prater 因另一项罪行再次入狱,而获得更高风险分数的 Borden 没有被指控任何新的罪行。
最终,在判决和其他审前决定中使用 RNA 测试是不道德的。很多时候,社会接受一个数字或分数仅仅是因为它看起来是定量的,因此也必须是客观的。也就是说,大数据算法有潜力有效地对社会的许多方面产生积极影响。然而,为了让这成为现实,我们必须首先合理解释并真正理解我们的数据、模型和结果的含义,然后再将它们广泛应用于强大而有影响力的机构。
数据科学,从何入手?课程回顾。
原文:https://towardsdatascience.com/https-medium-com-mirko-mastrelli-data-science-where-to-start-a-course-review-978094d3de5b?source=collection_archive---------32-----------------------
过多的在线课程会造成严重后果
在这篇综述中,我将谈谈让我接触到 ML 和 DL 的课程。
I went medieval on this one..
肯定有许多人正在考虑在数据科学领域工作或转行,因此肯定有许多人心中有两个问题。
1)网络课程报价巨大,我该从哪里入手?
答案是,这里https://www.coursera.org/learn/machine-learning
我放心推荐。这门课程激发了我的热情和求知的欲望,我相信它也会对其他人产生同样的影响。
首先要提到的是,在课程结束时,你还没有做好工作准备,但另一方面,很少有课程能让你做好准备。
这些材料相当旧,如果我没记错的话,可以追溯到 2007 年。
其次,你不会使用 python,所以你不会学习 pandas、seaborn 或 scikit-learn。该课程基于 Octave/Matlab,不会吸引招聘人员关注你的 Linkedin 个人资料。
还在吗?好吧,那你为什么要选这门课呢?
因为它为你开始积累知识提供了最好的基础,它介绍了一些概念并给出了清晰的解释,这些概念将在以后的其他课程中扩展,并且现在在就业市场上需求量很大。
吴恩达老师提供了非常有价值的课程,用一种让学生更容易理解的方式呈现了一些(有时非常)复杂的概念。
第二个问题可能是:
2)我需要多少数学或编程经验才能熟练地学习这门课程?还是希望在 ML 里干出一番事业?
为了回答这个问题,我决定提供一个按周细分的列表,我将对数学和编程部分的难度进行评分。这些分数是基于我对一个对微积分和编程有些生疏概念的新手在接近这门课程时可能会经历的事情的看法。
我会用愚蠢但不言自明的分数(容易、中等、困难)来给每个星期留下第一印象。
第一周数学难度:中等,编程难度:无。
我们介绍了监督和非监督学习的概念,以及单变量线性回归。一些数学和微积分知识从一开始就是必要的。我们还介绍了成本函数和梯度下降。
我承认我喜欢这部分。我于 2005 年毕业,相当于意大利的工程学博士,这意味着我已经超过 10 年没有接触一些严肃的微积分了,重新使用它就像在熟悉的水域航行一样。
微积分被很多课程刻在我脑子里,用在工程的不同学科。它留下的不仅仅是伤疤,还有一些持久的知识,让我能够轻松地理解吴恩达先生的推理。如果你的线性代数是新的,你也会对这里介绍的内容感到轻松。
Vignette effect to provide dramatization.
如果你不是很擅长,不要害怕。导师会不断提供很有帮助的好例子(他称之为直觉),还有你需要的代数复习介绍。
如果你对微积分毫无概念,我建议你仔细阅读线性代数复习课。这应该给你足够的信息来继续。
从好的方面来看,在这一点之后,数学不会变得更糟。
八度简要介绍。
第二周数学难度:中等,编程难度:低。
在这里,我们将开始使用一些很好的旧线性代数,我们将学习更多关于线性回归和梯度下降,我们将有第一个参数的雏形。
它开始变得紧张,因为编程方面也引入了第一个线性回归和 Octave 梯度下降的练习。一切都有很好的解释,练习也有指导,所以试着从一开始就尽可能吸收,不要跳过可选的练习。
你也会看到一些很酷的情节。
亲提示:尽量对预先写好的代码有充分的理解。
第三周数学难度:中等,编程难度:低。
逻辑回归是本周的重点。
引入了 sigmoid 函数、决策边界以及一些用于防止过拟合的正则化技术。
数学在这里仍然很重要,但现在应该更熟悉了。
在编码方面,我们有一个关于逻辑回归和正则化的练习。
如果你上周做了很好的家庭作业,你会有优势,因为这个练习和上一个有一些相似之处。
第四周数学难度:中等,编程难度:中等。
当我们第一次看到神经网络时,事情开始升温。
我们直觉地知道它们是如何工作的,然后开始努力学习数学部分。
至此,我们应该对如何处理矩阵和向量有了很好的理解。
编码部分将包括一对一逻辑回归和神经网络,以识别手写数字。
这是一个很好的方式开始体验神经网络的力量与实际练习。
第五周数学难度:中高,编程难度:中。
本周课程的中心是初学者最难理解的概念之一。反向传播是一种有点违反直觉的算法,在这节课中,老师对教学的热爱真的闪闪发光。艰难的概念解释清楚,并举例说明,使其更容易理解。
编程练习将是一个数字识别神经网络的实现。
难度与上周的练习相当。
第六周数学难度:中高,编程难度:中。
作为现在通常的大量代数的一部分,我们也将不得不在这里使用大量的逻辑。
我们将学习为你要做的工作选择正确算法的方法,以及一些性能评估。
练习练习是对偏差和方差调整的研究。
第七周数学难度:中低,编程难度:中难。
本周数学不会特别复杂!
将会用到很多逻辑,编程练习也很难。
我们将使用支持向量机创建一个垃圾邮件分类器,请注意,这个练习可能有点棘手。
老实说,这是你可能想要放弃的部分。不要!后来就好了。
第八周数学难度:中等,编程难度:中等难度。
这是提出一些挑战的一周,因为我们开始了解一些无监督学习。
我们看到了一个名为 K-means 的算法,我发现它非常简单,并且有降维和 PCA 这样的概念。
还有两个相当有挑战性的编码练习。
在第一部分中,你将使用我们在 K-means 中学到的知识,应用随机初始化来完成一个图像压缩任务。这是激励工作在一个有形的任务,像这样的一个,因为图像处理将直接可见。不要跳过未评分的练习。
在第二部分中,我们致力于 PCA 降维,首先将一些数据投影到低维空间,然后投影到人脸图像数据集。这是一个有益的练习,因为我们将开始看到这些算法如何影响图像处理。
第九周数学难度:中难,编程难度:难。
本周围绕异常检测展开。
我们将处理一些统计的原始概念,但是它永远不会变得太疯狂,如果你知道我的意思。
我们还将研究推荐系统,这是网飞和 Spotify 等公司首次使用情感分析向你推荐下一个电视节目或艺术家。
虽然是编码练习,但这也是你最后要做的,因为课程接近尾声时会开始“对话”。
第十周数学难度:中低,编程难度:无。
我们将看到当存在大量数据时,ML 学习如何扩展,就像我们现在拥有的一样。
像小批量和随机梯度下降这样的技术是本周的一部分,也是在线学习和 map reduce。
没有编码练习。
第 11 周数学难度:低/无,编程难度:无。
这可能是最酷的一周。你学到了很多概念,可怕的数学已经成为过去,你驯服了 Octave。
现在,您将看到如何解决光学字符识别的问题,或者如何在图片中找到文本。本质上,当你给谷歌翻译应用程序输入图片时,它会做什么。
我们将看到如何人工增加数据集和上限分析。本周也没有编程作业。
结尾是一段来自吴恩达的鼓舞人心的视频,标题是“总结和感谢”,只有在你打算观看的时间观看,你才能完全欣赏它:在课程结束的时候。
在简短回顾了所有材料后,吴恩达在视频的最后两分钟发表了我听过的最真诚、最激励人心的演讲。好好享受吧。
总之,如果你和我一样,你最终会爱上这个人,爱上学习的内容和领域,希望这门课程能成为你新职业生涯的垫脚石。
使用分类算法预测 Kickstarter 上的活动成功
原文:https://towardsdatascience.com/https-medium-com-natashaborders-predicting-campaign-outcome-on-kickstarter-17e71b5e7ac9?source=collection_archive---------13-----------------------
型号选择、功能重要性讨论和 Flask 应用程序试用。
作为我探索创意产业的数据科学探索的一部分,使用分类算法来尝试和预测 Kickstarter 活动的结果似乎是一个完美的项目想法。当我写这篇文章的时候,Kickstarter 已经帮助 182,897 个项目获得成功,他们的使命是帮助将创意项目带入生活。随着向 Kickstarter 项目承诺了 4,284,585,270 美元,这对于新的和有经验的创作者来说都是一个强大的平台。
An example of a Kickstarter campaign page.
Kickstarter 活动采用全有或全无的融资模式。如果一个活动失败了,没有钱转手,这就把失败的更沉重的负担放在了活动创造者身上,他们可能已经把自己的时间和金钱投入到了活动中。
Photo by Kobu Agency on Unsplash
出于我的分析目的,我专注于开发一个整体健壮的预测算法,同时确保创作者得到照顾。为了实现这一点,我选择将重点放在 AUC ( 曲线下面积 ) ROC ( 接收器工作特性)曲线上作为主要评估指标,同时注意我的分析中“成功”类别的精度分数,以确保我们不会预测到太多的成功结果是失败(从而最大限度地降低假阳性率)。
这项分析的数据来自 Web Robots 网站,该网站持续汇编 Kickstarter 数据,我检查了 2018 年 4 月至 2019 年 3 月期间全年成功和失败的活动。
An example of a wildly successful Kickstarter campaign.
所使用的信息类型是活动启动时可用的数据,例如:
- 活动的描述(用作文字长度)
- 活动持续时间(天数)
- 无论该活动是否得到 Kickstarter 的支持
- 以美元为单位的目标
- 活动的地点(无论是否在美国)
- 活动的类别
在我的数据集中,略多于一半的活动是成功的(54%的成功,46%的失败),所以这些类别相当平衡。
作为对几种分类算法的初步评估结果,并基于曲线下面积(AUC)作为我的主要评估指标,XGBoost 和 Logistic 回归表现最佳。
The Receiving Operating Characteristic (ROC) Curves for the models used in the analysis.
仔细检查营销活动成功类别的精确度分数,以确保我们没有预测到太多会导致失败的成功,总体表现最佳的是 XGBoost,精确度分数为 0.71。
Results for the XGBoost model performance on the test dataset.
在对测试数据运行 XGBoost 之后,它表现一致,这意味着数据中没有过度拟合或欠拟合。success 类的精度分数略有增加,从 0.71 增加到 0.72。
在为这一分析选定最佳模型后,我回顾了哪些特性对成功的营销活动最为重要。
使用名为 SHAP 值的指标,我们可以检查哪些属性对营销活动的成功更重要。
Feature importance for XGBoost Kickstarter model.
颜色表示特征的大小,方向表示对模型结果的正面或负面影响。污点外观来自于聚集在这些区域的许多数据点。例如,有一个小目标会对许多活动产生积极影响,而有一个大目标会对较小比例的活动产生不利影响。得到 Kickstarter 的支持对那些拥有它的活动来说有很大的不同,但没有得到它也没那么痛。
这里的类别与艺术进行了比较,因此我们可以得出结论,设计和游戏比艺术获得了更高的吸引力,而新闻和手工艺似乎对该活动的成功几率产生了负面影响。
My app demo page — take it for a spin!
为了演示这种预测算法的工作,我使用逻辑回归模型开发了一个 Flask 应用程序,这是第二高性能的算法,被证明比 XGBoost 更容易、更快部署。
应用程序本身可以在这里找到——请随意玩你最喜欢的 Kickstarter 活动,并让我知道结果如何!
总之,建议创作者采取以下措施来增加活动成功的机会:
- 设定一个符合活动范围的小目标(美元)
- 不要将活动延长超过 30 天
- 仔细考虑类别
- 如果可能的话,获得 Kickstarter 的支持
展望未来,我想开发一个 XGBoost Heroku 应用程序,增加功能和视觉吸引力,了解成功的活动筹集了多少资金,设置延伸目标是否有益,并深入研究活动实现的持续挑战以及如何改进。
这个项目的所有资料都可以在我的 GitHub 页面找到。
娜塔莎·鲍德斯,MBA
链接于:@natashaborders
自学很难,坦白说,很孤独。以下是如何让它变得更简单的方法。
原文:https://towardsdatascience.com/https-medium-com-nityeshagarwal-difficulties-with-self-learning-and-3-systems-to-solve-them-a14f4c9a64c6?source=collection_archive---------6-----------------------
让自学变得更容易的 3 个系统,在 Twitter 上关注的导师和学习的酷项目想法
Photo by Atlas Green on Unsplash
MOOCs(大规模开放在线课程)对我们这些自学者来说是个福音。无论你住在地球的哪个角落,世界上最好的教授的讲座都会直接送到你的手中——
这难道不是破坏世界一流教育并使其在全世界民主化的秘诀吗?
2019 年的一项研究使用了 edX (麻省理工学院和哈佛大学提供的一个受欢迎的 MOOC 平台)提供的 MOOC 数据,表明—
不,可能不是 :
- 学习者几乎全部集中在世界上最富裕的国家和地区,
- 平均每 100 个注册课程的人中只有 6 个真正完成课程
- 这些数字没有改善。
这项研究可以总结为,MOOCs 并不像 2012 年首次引入这一理念时世界所预期的那样具有破坏性。
那么,我们如何将更多的学生纳入我们的教育民主化目标呢?
MOOCs 帮助需要帮助的自学者找到学习某个科目的资源。如果我们从更广阔的角度看问题,解决那些需要帮助找到学习这些科目的动机的自学者的需求,也许我们可以使教育更加民主化。
激励学生是无组织的。
我相信,在自学这门学科的概念的同时,自学者也在努力应对我们在传统教育方式中认为理所当然的事情——方向感(由竞争引导)、学习环境和同伴群体。
因为这些正是促使人们自我激励的东西,缺乏这些东西对自学者来说是一个非常现实的问题。对于来自非传统背景和处于不利环境(如发展中国家)的人来说,这个问题尤其严重。他们正在进行一场艰苦的战斗。
我的目标是通过这篇文章给它带来一些结构。以下是我的建议,如果在线课程似乎对你的情况不够有帮助,你可以如何进行自学。
帮助自学的 3 个系统
在做了两年自学者,自学了所有他想学的东西,又过了一年迷茫、没有动力、有点沮丧之后,我开始意识到——
- 自学任何东西都可能是困难的、耗费精力的、相当孤独的过程
- 但是当你关心你正在学习的东西时,你会把它从消耗你能量的东西变成提升你的精神和让你更自信的东西
- 有几个同龄人会让事情变得简单很多
考虑到所有这些,我已经能够提出 3 个系统来帮助你学习 X,当你的物理环境不能的时候
- 在你尝试学习它之前,认真努力爱上它
- 创造一个激励你的环境
- 激励自己完成学习 X 的细节
请记住,它们是长期的系统,而不是一次性的提示和技巧。从长远来看,它们是增加你学习 X 的几率的常规练习。
下面我将详细描述这些系统,告诉你为什么我认为它们都很重要,并给你一些个人建议/技巧来开始使用它们。
1.在你尝试学习 X 之前,认真努力爱上它
如果你爱一样东西,你就会在乎它。当这种情况发生时,学习不再是一项“任务”;它变成了一次冒险。你会渴望更多地了解它,你会有精力去寻找你疑惑的答案。
但是这里有一个陷阱:
当你第一次想知道如何学习 X 的时候,并不是因为你爱 X 甚至觉得它很刺激。你可能对爱 X 的想法更感兴趣..也许,b 因为你已经看到一个同事完全疯狂地谈论 X,或者因为你已经听/读了足够多遍,X 是一个“热门”技能,可以放在你的简历中。
尽管这些理由是一个很好的起点,但还不够。如果你因为这些原因而投身于做 X,你将只是从众。如果有人问你“你为什么这么关心 X?”,你大概不会有一个能让你骄傲的答案。
所以,在你去寻找教授 X 的最佳课程之前,认真地、有意识地努力去寻找痴迷 X 的理由。
"如果我试着跳过这一步,继续学习会怎么样?"
每当你强迫自己仅仅为了学习而学习某样东西的时候,你就创造了一个非常不令人满意的学习经历。
为你真正感兴趣的事情努力工作是激情,但为你并不真正关心的事情努力工作是 T21 压力。
这样做可能会让你陷入以下三种情况之一——
- 发现自己无法关心这个主题,中途停止
- 完成一门课程,获得证书,就是这样
- 陷入“教程炼狱”:没完没了地学习一系列课程,看讲座和教程,却没有实际运用它们
这些都不理想。
个人建议和入门技巧:
- 有意识地寻找理由,让你确信学习 X 是绝对最好地利用你现在的时间。
- 在你问别人“如何学习 X”之前,先问“X 有什么让你兴奋的地方”。
- 去 Twitter 或 Reddit,逛逛喜欢 X 的人的社区,深入到与那里的人产生最大共鸣的东西——最受喜欢/投票最多的帖子。去兔子洞。
这就把我们带到了下一个系统。
2.创造并置身于激励你的环境中
我们都钦佩有上进心的人。这就像是一种超能力,让他们无法阻挡。
Much like the Juggernaut!
但是没有人生来就有自我激励的能力,对吗?那么是什么给了他们这种“动力”呢?更重要的是,我们如何培养自己的这种能力?
我相信你需要自我激励的是一个充满激励你做更多事情的人和想法的环境。当你和珍视一件东西的人在一起时,你自己更有可能珍视它。
如果你利用互联网的力量,不管你身在何处,你也可以拥有一个激励的环境。
创造一个激励的在线环境
你知道你的 newsfeed 是如何帮助你发现所有那些令人愉悦、令人垂涎、难以想象和疯狂的美食视频,因为它知道你是一个美食家。
现在想象一下,如果它知道你对机器学习或区块链技术或开源软件感兴趣,它会推荐什么。
你可以利用社交媒体最消极的一面——一个令人上瘾的、可以无限滚动的订阅源——并把它变成你的优势。
“如果我跳过这个呢?”
还记得这样一句话吗——“你是和你相处时间最长的 5 个人的平均值”?
所以,如果你周围有一群谈论并经常与你分享 X 的酷事的人,你可以跳过这一步。但即使这样,如果你能接触到你自己的新的、酷的东西的来源,并与他们分享,你会感觉更好。
但是我们大多数自学者并没有被这样的人包围。我们是来自非传统背景或不太好的大学的人,或是来自发展中国家的人,在那里我们没有机会接触到有相似志向的同龄人。这可能是我们解决“个人环境问题”最简单的方法。
个人建议和入门技巧:
我经常使用 Twitter。我建议你也加入。为了进一步说服你,我推荐你阅读 Alexey Guzey 的这篇文章— 为什么(以及如何)你应该现在就加入 Twitter。
让它的推荐系统知道你喜欢 X 很简单:
- 追随那些对 X 感兴趣的人——那些可能成为你榜样的人和对 X 充满热情的学习者
- 从他们的个人资料里偷偷溜走
- 花(有限的)时间浏览你的精彩新闻提要!
这样做,看看 Twitter 的新闻提要如何让你发现所有那些不可思议的事情,并帮助你自我激励。
“但如果我刚刚开始使用 Twitter,我怎么知道该关注谁,不该关注谁?”
没错,对于平台新人来说,这确实是个问题。因此,如果你需要帮助进入编程生态系统,我创建了几个 Twitter 帐户列表。这里列出了喜欢
- 机器学习
- 数据科学
- 区块链/密码
- 网页开发
- 脑机接口
你可以点击查看更多此类列表。
3.激励自己去完成学习 X 的细节
尽管有所有正确的学习理由,但很多时候自学真的会让人精疲力尽。这时你可能会卡在一些较小的 X 上,而这些较小的 X 组成了我们较大的 X。
你需要激励自己,这样你就能不断度过这段低迷期。
激励自己的一个简单方法是在你学习教程/课程的同时,兼职做一个项目。制作一些看起来很酷很有趣的东西是欺骗自己专心学习 X 的好方法。
个人建议和入门技巧:
我知道这很可怕。我知道你可能会有一些严重的不安全感,尤其是如果你是第一次这样做:
不安全感#1:“我很想自己做点什么,但是我没有任何新的有趣项目的想法。”
是的,这可能是阻止大多数人做项目的最狭窄的瓶颈。甚至超过了建造这个东西的实际难度。
我认为浏览其他人在devpost.com上的黑客马拉松项目是获得这些想法的一个很好的途径,因为—
- 它们只是小的、舒适的、温暖的宠物项目:作为年轻程序员在大约 12、24 或 48 小时内完成的个人项目,它们是非常可行的
- 你可以知道你正在建造一些有价值的东西:他们中的大多数都是黑客马拉松获奖项目
如果你能创造出这样的东西,那该有多酷啊
- 一个简单的通知应用,当通知频率超过每 3 秒 1 次时,你可以选择想要阻止通知的消息应用。
骗自己学 —安卓开发 - 一个网络应用程序,可以让你在 YouTube 视频中搜索,并让你找到说出那个词的地方——视频的 Ctrl-F 功能
并欺骗自己学习——Python,基本网络开发(HTML/CSS,Javascript) - 一款短信应用,自动给你爱的人发短信,让他们知道你已经到达了一个特定的目的地,因为你经常忘记这么做
并欺骗自己学习——安卓应用开发 - 一个工具,用来分析你的 Whatsapp 聊天,并显示诸如——发送的消息数、发送的字数、每条消息的平均字数、最常用的单词、最长的双发短信记录、聊天时间模式、最常分享的网站链接和更多的信息
,并欺骗自己学习——Python,甚至是 web 开发,如果你决定为它建立一个网站的话 - 一个浏览器扩展,将你引向一个与你正在阅读的政治观点相反的故事(这将打击新闻订阅的效果,新闻订阅只允许人们看到社交媒体和新闻网站上与他们观点一致的帖子)
并欺骗自己学习——基本的 web 开发(HTML/CSS、Javascript、jQuery),也许是一些机器学习 - 一个脚本,用于分析《权力的游戏》各季推文的情绪,以了解上一季有多糟糕(😜)
骗自己学 — Python,机器学习,NLP - Kaggle 有一些非常酷的资源,你可以用它们来学习机器学习和数据科学。
How cool would it be if you could get into ML/Data Science by analysing these datasets!? (1, 2, 3, 4, 5)
记住你的目标是自我提升。这就是为什么,我相信,你可以问心无愧地简单模仿和重新实现别人的想法。(尽管如果您能找到一种方法来赋予重新实现您的个人风格,那就太棒了!)
不安全感#2:“但是我没有任何经验。我怎么会知道该学什么,如何建造,如何经历这一切?”
我相信你不需要任何神秘的“真实世界的经验”来构建有用的东西。互联网上充满了这样的故事:有些人只是构建了他们想要的,学到了他们需要的技能,并在这个过程中自学了编程。
我在这里写了更多关于它的内容:如何(以及为什么)在没有经验的情况下开始构建有用的、真实的软件。
“你认识的每一个伟大的开发人员都是通过解决他们没有资格解决的问题而获得成功的,直到他们真正做到了。”
帕特里克·麦肯齐
但即便如此,我也意识到这说起来容易做起来难。
所以我想帮你。
简介,为学习而构建
我创建了Build To Learn来帮助你的自学需求。在这里,我将围绕做项目和教你必要的编程技巧创建一系列教程。
It’ll be like a story — You be the hero, the project our adventure and me, Gandalf, your guide
我会注意学习动机的需要(和缺乏),将上述 3 个系统记在心里,并尝试帮助你——
- 一个“爱 X 的理由”系列,它将作为各个领域的起点
- 我上面介绍的“Twitter 上喜欢 X 的人的名单”系列
- 激励你做更多事情的项目本身
你可以注册这个简讯,这样我就可以给你发送一个更广泛的项目想法列表,让你知道 Build To Learn 的更新。
我还成立了一个 Slack 小组,为那些想学习的人建立一个社区。我们的社区每天都在变大(已经有 350 名成员)。你可以点击这里的链接加入!
感谢阅读!
如果你喜欢我写的东西,你可以通过 Twitter 或者 LinkedIn 或者普通的电子邮件联系我
PS :如果你觉得我的建议有用,我很乐意了解你的故事,你的学习挣扎,给你更多个性化的建议。使用上述任何服务联系我,与我进行 10 分钟通话【T13:)
分级分类的搭便车指南
原文:https://towardsdatascience.com/https-medium-com-noa-weiss-the-hitchhikers-guide-to-hierarchical-classification-f8428ea1e076?source=collection_archive---------3-----------------------
如何像专家一样对分类数据进行分类?
数据科学领域有一个固有的不协调性:当人类思维以层级结构感知周围的世界时,我们构建的模型接收的输入是平面的。
例如,当想到动物时,我们脑海中有一个清晰的分类:德国牧羊犬和金毛寻回犬都属于“狗”类,属于“哺乳动物”类;另一方面,普通的绿色鬣蜥属于“蜥蜴”类,属于“爬行动物”——与“哺乳动物”同属一类。虽然类层次树对人类来说非常直观,但如何向机器学习算法表示这些关系并不总是很清楚。
那么我们应该如何处理分类数据呢?弥合这一差距的最佳方式是什么?通常情况下,没有一个明确的答案,但有几种方法来应对这一挑战。我在这里告诉你关于他们的一切。
在这篇文章中,我将使用常见宠物的分类法来说明不同的层次分类方法:
平面分类
一种简单、直接的分类方法是平面分类法。在这里,您不必为那些讨厌的父类别而烦恼,只需将每个示例分类到其最终的叶级标签即可。暹罗猫对法国牛头犬来说就像对 Sphynx 猫一样(也被称为“奇怪的,没有毛的那种”)。
Flat classification: the dashed rectangle stands for one multi-class classifier
平级分类的利弊
- 这种方法的明显优点是简单。你来,你看,你分类。这是一个简单的解决方案,可以用一个现成的分类器轻松实现。
- 不利的一面是,你显然会丢失一些重要的信息。数据的自然层次结构可能具有很高的分类价值,忽略这些父子类关系可能会降低性能。
大爆炸方法
接下来,我们有了全球分类器****——,或者用他们更吸引人的名字“大爆炸方法”。这些是各种各样的一堆,它们都共享同一个概念:一个单一的、相对复杂的模型,它在一次运行中把整个类层次结构作为一个整体来考虑。
除此之外,他们几乎没有共同之处。全局分类器可以走向非常不同的方向。一些使用聚类方法,一些将问题重新定义为多标签问题,一些是现有算法的修改版本,手工定制以适合手头非常具体的数据层次结构。
例如,您可以使用决策树算法,但是更改熵计算公式,以包含所讨论的数据层次结构特有的信息。或者修改模型,使其更喜欢较深的节点而不是较浅的节点,从而提供更具体的类别预测。这只是一个例子。说到全球分类器,世界是你的。
The Big Bang approach: one global classifier for the entire class hierarchy
大爆炸方法的利与弊
自然,这些各不相同。与半通用多标签算法相比,定制算法具有不同的优缺点,对于全局分类器池中的每一个其他独特的雪花也是如此。不过,一般来说,这种方法的高度复杂性是一个主要缺点,也可能是它很少被使用的原因。
分层结构局部分类器
最后但同样重要的是,我们有我个人最喜欢的:使用分层结构 局部分类器。这种方法使用预定义的数据分类法来创建分类器的层次结构。有三种标准方法可以做到这一点:
- 每个父节点的局部分类器:为每个父节点训练一个多类分类器,以区分其子节点。
在我们的例子中,这意味着第一层有一个分类器(确定“猫”、“狗”或“独角兽”),然后再有三个分类器来确定具体的品种。
为了防止不同级别的预测不一致,您可以设计系统,使被第一个分类器分类为“猫”的示例只能被第二个级别的“猫”分类器看到。这样,你可以避免创造新的、奇异的混血儿,比如狮子狗独角兽(尽管这听起来不可思议)。
Local classifier per parent node (each dashed rectangle represents a multi-class classifier)
- 每个节点的局部分类器:为层次结构中的每个节点训练一个二元分类器(“Pets”节点除外)。这是一只猫吗?这是一只法国斗牛犬吗?这是彩虹独角兽吗?每个问题都有一个分类器。
Local classifier per node (each dashed rectangle represents a binary classifier)
- 每级局部分类器:为每个级训练一个多级分类器。在我们的例子中,这意味着两个分类器:一个用于确定种族(猫、狗或神奇的独角兽),另一个用于品种(波斯猫、拉布拉多、独角鲸等)。).这种方法很不受欢迎,可能是因为它提出了不一致的问题:很可能的结果是“狗”是种族,而“飞马”是品种,而且没有好的方法来避免它。
Local classifier per level (each dashed rectangle represents a multi-class classifier)
局部分类器的利弊
局部分类器方法非常直观,使用数据中的层次信息,同时保持简单性和通用性(它可以用于任何基本分类器)。然而,根据分类法和选择的方法,您可能会得到一个相当庞大的最终模型。
还有一个错误传播的问题,其中一个级别的错误可能会影响所有后续级别。不过,这是可以控制的——稍后会详细介绍。
思考这三种方法各自独特的优缺点?敬请关注。
我自己选择分类器的个人分类器
那么,你应该选择什么方法呢?以下是我在讨论这个问题时的考虑:
个人最爱?地方量词,这是毫无疑问的。它直观、聪明,可与任何基本算法一起工作,并设法保留关于数据层次结构的自然信息。同时保持合理的设计和维护简易性。在我看来,这应该是你处理所有层次结构的首选方法。
不过,可能会有特殊情况。也许你的项目是一个快速和肮脏的项目,你愿意牺牲一点准确性来获得更快的胜利。或者也许你有限制,简单是关键。如果是这样的话,直截了当的扁平分类可能最适合你。
当你需要你的模型提供快速预测而不牺牲准确性时,一个全局分类器可能是一个很好的选择,这取决于特定的算法。毕竟,它只需要运行一次。然而,这种出色的表现是有代价的:做好付出高复杂性的准备。
或者也许你是那种超级有创造力的人,你有第四个更好的想法,我在这里没有提到。如果是这样的话,为什么不和班上其他人分享一下呢?下面的评论区等着你。
一些最后的调整
好吧,我决定使用强大的本地分类器,但是……
- 我应该使用每个节点、每个父节点还是每个级别的分类器?
- 我应该对每个分类器使用相同的特征,还是应该改变它们?
- 对于这种奇怪的模型结构,我使用了哪些性能指标?
- 以神圣的名义,我该如何定义我的正面和负面训练范例?
的确,所有重要的问题都将得到解答——但不是在此时此刻。在我的下一篇文章中,我将深入探讨局部分类器方法的所有优点。
与此同时,我希望你充分利用你新发现的关于分类数据分类的知识,并记住:独角兽是一种有效的家养宠物,不要让任何人告诉你不同。
Noa Weiss 是特拉维夫的一名自由数据科学家。
资料来源 : C.N. Silla & A.A. Freitas, 跨不同应用领域的层次分类综述 (2011),数据挖掘与知识发现,22(1–2):182–196
使用 Python 和 BigQuery 在 Kaggle 上开始使用比特币数据
原文:https://towardsdatascience.com/https-medium-com-nocibambi-getting-started-with-bitcoin-data-on-kaggle-with-python-and-bigquery-d5266aa9f52b?source=collection_archive---------21-----------------------
什么是区块链
逐步概述
Photo by André François McKenzie on Unsplash
在我的上一篇文章中,我研究了 Python 在 Kaggle 上研究 BigQuery 数据的可用性。在那里,我得出结论,就目前而言,我们无法避免比我最初设想的更广泛地使用 BigQuery。
(本文是用 Python 分析 BigQuery 区块链数据系列文章的一部分。关于项目和帖子的概述,见此链接。)
在这篇文章中,我展示了一种简单直接的方法,在pandas
和谷歌的bigquery
Python 模块的帮助下,在 Kaggle 上运行 BigQuery 比特币数据集的查询。你可以看到并分支我写这篇文章所基于的笔记本,你可以在它的 BigQuery 页面上阅读更多关于数据集的信息。
虽然有其他方法可以访问比特币数据,但谷歌的 BigQuery 数据集集合是关于比特币的最详尽和最新的数据源,它还包含了更多加密货币的数据。另一方面,通过 Google 云平台使用 BigQuery 是一套完全独立的技能,您需要掌握这些技能才能开始分析。相比之下,使用 Kaggle 可以给你一个快速的开端,尽管——正如我在上一篇文章中指出的——你确实需要了解一些 BigQuery SQL。此外,通过 Google Cloud,在免费计划中,你一个月只能处理 1TB 的数据,而使用 Kaggle 的许可证可以为你提供 5tb 的处理能力。
概述
- BigQuery
Client
对象 - BigQuery 数据集和表的一般结构
- 一个示例查询
- 运行查询并生成数据帧
- 情节
首先,我将介绍 BigQuery Client
对象,我们将使用它来访问数据。在这个对象的帮助下,我们将对 BigQuery 数据集的高层结构有所了解。接下来,我们将编写一个简单的查询来访问比特币数据。
由于比特币数据集非常庞大,并且使用 BigQuery 的成本非常高(无论是在内存使用还是时间方面),我们还将评估查询的大小以及产生的数据帧。虽然这不是我们在这里的主要焦点,但最后,我们将生成一些关于熊猫的情节。
🔧BigQuery“客户端”对象
这里我们使用 Google 的官方 Python 库,特别是它的bigquery
模块。导入库之后,我们初始化一个Client
对象,这将是我们访问和处理数据的主要工具。
因为我们会经常检查我们创建和使用的对象,所以我们创建一个助手函数来简化这个过程。
我们在我们的client
物体上进行试验。这让我们知道它处理的是什么类型的其他对象(例如,'表','数据库','模式','模型','行','作业'),以及它应该执行什么操作(例如,'列表','获取','更新','删除')。
(如果您对client
对象的细节感兴趣,您可以在它的文档或它的 API 描述中了解更多信息)
📩访问 BigQuery 数据集和表
为了理解下面的步骤,如果我们从概览图像开始会有所帮助。
(图片来自 Kaggle 的教程。它使用了 Hackernews 数据集的例子,但是它的逻辑也适用于这里)。
结构相对简单。一个客户可以有多个项目,这些项目的数据集由不同的表组成。我们已经创建了一个客户端对象,因此,在本节中,我们继续执行以下步骤:
- 定义项目和数据集
- 获取表名
- 定义表引用
- 获取表模式
- 检查前几行
在演示这些步骤时,我们将经常检查我们创建的对象的属性。希望这能让这个过程更好理解,更有可复制性。
除了仅仅访问数据之外,每当我们想要做其他事情,或者每当我们事先需要一些信息时,我们需要能够在数据集和表之间导航。以下步骤向我们展示了实现这一点的基本方法。
获取有关数据的信息
client
对象的主要用途之一是获取我们试图访问的数据对象的信息。例如,查找术语“列表”,我们的函数返回以下属性。
为了符合我们的意图,我们将使用list_tables
和list_rows
。
(我们也可以尝试列出数据集,但 Kaggle 许可证不允许这样做)。我们可以在页面上找到数据集名称
首先,我们要列出表格。然而,在此之前,我们需要定义一个项目,通过它我们可以访问一个 BigQuery 数据集。因为我们通过 Kaggle 的许可工作,所以我们使用‘big query-public-data’项目。数据集的名称是“crypto_bitcoin”。
我们将这些参数传递给list_tables
方法,该方法又返回一个迭代器。
为了看得更清楚,我们列出了它返回的第一个项目的属性。
该列表显示数据集中表对象的属性。基于它,我们将使用table_id
属性,该属性将返回数据集中的表的名称。
让我们检查一下transactions
表。我们可以通过Client
对象再次做到这一点。这里我们列出了与表相关的客户机属性和方法。
其中,我们使用了get_table
方法。这样做将创建一个对表的引用,我们可以访问它来检查它的内部。
首先,我们检查表的模式。
这个列表显示了关于表的列的信息,比如它的名称和数据类型。我们还可以看到,inputs
和outputs
表本身包含更多的SchmeaField
对象,这表明在列中嵌套了更多的表。
为了更好地理解,我们列出了表的前五行,并将其转换成 pandas 数据帧。
最后,我们看一下第一个的outputs
值。因为——正如我们注意到的——它是一个嵌套表,该“单元格”的内容是第一个事务的相应输出相关信息。
至此,我们达到了 BigQuery client
对象操作的极限。这对于了解被检查的数据集和表很有用,但是要做任何更实质性的事情,我们需要运行实际的 SQL 查询。
🔍该查询
假设我们对 2017 年 9 月期间比特币交易的频率和价值感兴趣。我们希望有一个事务的标识符,它们的时间(至少大约),以及输入和输出的计数和值。
下面的 SQL 查询就是这样做的。
这是一个简单的查询,但是让我们做一些解释:
FROM
:从crypto_bitcoin
数据集中通过bigquery-public-data
项目访问transactons
表。
SELECT
:选择以下栏目:
hash
(因为hash
是 BigQuery 中的一个遗留 SQL 关键字,我们需要将这个列名放在反斜杠中),block_timestamp
,binput_count
,binput_value
,boutput_count
,boutput_value
WHERE
:过滤数据,只显示数据块时间戳在 2017 年 9 月的记录。(正如这篇文章解释的,比特币交易没有时间戳,因为它们被捆绑在一起,所以这是我们可以用来作为时间指示器的最接近的东西)
由于我们需要处理的资源有限,所以在运行查询之前估计它的大小是一个很好的做法。我们可以通过打开dry run
作业配置参数来实现。为此,我们编写了一个助手函数。
该查询将需要处理大约 53gb 的数据。当我们通过 Kaggle 的许可工作时,我们有 5TB 的每月预算,所以我们会很好。然而,这是一个有限的查询,例如,在transactions
表上运行一个SELECT *
将需要处理 1TB 的数据。
🕒运行查询
现在,是时候运行查询了。因为默认情况下,一个作业被限制为 1gb,以防止意外处理太多数据,所以我们需要手动设置一个新的限制。我们通过在初始化 BigQuery QueryJobConfig
对象时传递一个maximum_bytes_billed
作业配置参数来实现这一点。
之后,我们将这个对象传递给client
对象的query
方法。
下一步是得到工作的结果。我们还将其转换为 pandas 数据框架,因为在这一步之后,我们希望以这种形式继续处理数据。
(对于那些考虑运行这段代码的人,请注意:这一步大约需要 15 分钟来运行。)
拥有数据帧格式的数据是一个很好的里程碑。尽管如此,我们也想评估结果的大小。
产生的数据帧非常大,超过 700 万行,占用将近 2.5,这取决于预期的工作,会影响处理时间。
然而,正如详细视图所示,大部分大小来自三列:hash
、input_value
和output_value
。虽然我们在这里不会这样做,但如果需要,并且不影响我们的分析目标,我们可以通过对数值进行脱壳并将散列信息转换为分类信息来减小对象的大小。
然而,为了以后的使用,我们可以将数据帧保存到 csv 中,这样我们下次就可以避免从云中查询数据。
📈情节
最后,让我们做一些基本的数据可视化。因为我们有事务的输入和输出值和计数以及块时间戳,所以我们可以很容易地检查它们是如何随时间变化的,以及它们的值是否有明显的时间模式。(以下是精选,可以在笔记本里找到所有情节)
然而,要做到这一点,我们需要将时间戳转换成 pandas datetime
格式。
总交易产值
这里,我们将实际事务输出值的值绘制在它们的块的时间戳上。
由于这是一个过于精细的图,很难看到整体模式,但它确实显示了一些异常值事件。例如,从 9 月 12 日左右开始,产值开始上升,随后几天逐渐下降。在这一个月里,比特币价格经历了大幅下跌,例如14 日,其价值下跌了 500 多美元。
按工作日划分的总产值
下一幅图向我们展示了总产量是如何在一周中的每一天分布的。
根据该图,周二和周四的交易量较多,周日的交易量最少。尤其是周日价值似乎遵循一个不令人惊讶的模式(即,人们在周末交易较少)。但是,为了使其他值有意义,我们可能希望删除异常值(例如,9 月 14 日是星期四)。
一天中每小时的输出值
最后一个情节与前一个情节相似;只是它显示了一天中各小时之间的分布。
分布似乎告诉我们,比特币交易在 1800–0100 期间的产值最小,在 0800–1000 和 1300–1400 左右的产值最高。然而,该图使用原始时间戳数据,没有对时区进行任何处理,因此,为了更好地理解,我们还应该考虑地理差异。
正如我们所看到的,在我们成功地提取数据之后,用 python 生成图是很容易的。然而,为了使这些图有意义,我们确实需要更深入地研究数据维度规范并进行预处理。
🌔结论
综上所述,在本帖中,我们回顾了一个借助 Python 和 BigQuery 在 Kaggle 上分析比特币数据的简单入门方法。特别是,我们从 Google 的bigquery
Python 模块中引入了Client
对象,并展示了如何使用它来处理数据集和表。我们还编写了一个简单的 SQL 查询并估计了它的大小。我们提取数据,将其转换成数据帧,保存,并从中生成一些图表。
这篇文章的一个目的是帮助其他人进入区块链分析,所以如果有任何不清楚的地方,或者如果你错过了什么,请在评论中告诉我。同样,你可以随意地将的内核放在 Kaggle 上,并将其用于你的研究。
录像带!
原文:https://towardsdatascience.com/https-medium-com-orian-sharoni-videothat-6849277c301b?source=collection_archive---------27-----------------------
自动为您的输入音频生成音乐视频
第二名 DataHack 获胜者🥈,2019 年 9 月
VideoThat 会自动生成完美的视频剪辑,与你选择的主题曲完美契合。该算法的默认选择是从泰勒·斯威夫特的视频到北极猴子的歌曲创建一个视频剪辑。
点击此处观看结果演示🎬
每个好的算法都需要一个用例
这是你最好朋友的婚礼,你想为他们做点什么。你召集了所有共同的朋友,录制了一首充满内部笑话和难忘故事的个人歌曲。一切都差不多准备好了!现在你所要做的就是手动编辑所有你需要的派对视频,使之与歌曲完美契合!
现在说什么??
是的,听起来像是一个相当乏味的任务…嗯,幸运的是,不再需要手动操作了!
来救援了!
前提
这个项目的基本假设是,输入视频已经有一个完全适合它们的音频。因此,通过找到相关的音频模式,我们可以在视频片段和主题曲的音频片段之间进行匹配。
拍特征提取:光谱新颖性
我们的前提是,匹配源素材和目标歌曲之间的节拍将产生与目标歌曲配合良好的视频。问题是如何定义节拍匹配,我们的选择是尽量对齐尽可能多的音符开始。
当演奏一个音符时,直觉上,我们是在添加声音。量化这一点的简单方法是查看添加到信号中的能量(RMSE)。或者,用算法的术语来说,计算短时间窗内的能量,然后计算能量总量之间的差异(δRMSE),并且只保留正值,因为我们在寻找音符开始(能量新奇)。
Audio and its corresponding RMSE, delta-RMSE and energy-novelty
如果我们一次只有一种乐器演奏一个音符,这种方法效果很好。幸运的是,在真正的音乐中通常不会出现这种情况,所以我们扩展了这一原理,通过查看不同频段的能量:如果我们在旧音符仍在逐渐消失的时候演奏一个新音符,我们可能会保持歌曲中的总能量不变,但新音符的频率更高或更低,所以我们现在能够检测到正在增加的能量。
Librosa 将这一逻辑打包到lib Rosa . onset . onset _ strength中,这为检测音符开始的任务提供了一个良好的信号。如果你想在聚会上玩得开心,你可以把它描述为计算半波整流光谱通量。
更多资源:参考代码示例,【onset _ strength 的源代码
管道
在我们匹配输入视频片段和音频片段之前,我们首先需要找到这些片段…
使用 scenedetect python 包可以自动分割视频。
然后,为了为手头的每个音频片段生成指纹,我们使用 librosa python 包来发现开始模式。
Spectral Novelty
评分功能或:如何将声音与场景最佳匹配
最后,我们以贪婪的方式工作,通过找到音频与主题曲中的下一个片段最相关的未使用的视频,将视频片段与主题曲匹配。为了计算相关性,我们使用了一个评分函数。
我们选择的评分函数是基于每个剪辑的频谱新颖性和目标歌曲的频谱新颖性之间的相关性。然而,选择原始相关性在实践中是一个糟糕的选择,因为频谱新奇度是一个非负量,这使我们偏向于较长的片段,因为即使节拍不匹配,它们也有更多的机会使音符对齐。
为了解决这个问题,我们可以通过将总相关性除以我们相关的剪辑的长度来查看相关率,或“每秒相关度”。这也不是最好的,因为它使我们偏向于完美对齐的短剪辑,而我们确实希望更长的匹配不是 100%准确的,以获得更令人满意的结果。
最后,我们选择使用一种平衡的方法,将相关性除以片段长度的平方根,这仍然偏向于较长的片段,但给了短而好的匹配一个战斗的机会:
Our scoring function
替代解决方案
你可能会问自己,为什么贪婪?一定有更好的方法来做这件事!确实有。事实上有有。很多更好的方法。正如您在下一节所看到的,这个项目时间很紧,快速成功是预期的结果。但是,我们确实尝试了一些不同的方法,并考虑了未来的方法:
更智能的搜索
贪婪搜索做出局部良好的决策,但可能是全局不佳的。解决这个问题的一个简单方法是使用波束搜索,以便考虑更多选项。另一种选择是使用不连续的搜索策略。例如,尝试找到全局良好匹配的剪辑(例如,“剪辑 7 匹配歌曲井的中间”),然后填充剩余的空格。
更好的分数
有足够的空间来篡改分数(例如,从光谱新鲜感中减去少量,这样与沉默相比的音符将积极地惩罚分数,沉默上的沉默将增加分数)
在幕后
这个项目是在每年在耶路撒冷举行的名为 DataHack 的 40 小时数据科学黑客马拉松(或者我们喜欢称之为数据科学的年度实地考察)中构思、诞生和成熟的,2019 年是第五届🤓
我们的团队是由以前随机的松散联系组成的,我们都抱着一种信念,希望这将是一场伟大的比赛。幸运的是,这种化学反应很快就显现出来了!我们度过了一段美好的时光,从“我们要做什么”到“天哪,这太棒了”再到“好了,这是我们应该采取的步骤”。''
为了展示 VideoThat 的能力,我们在 YouTube 上选取了泰勒·斯威夫特的前 30 个视频来代表我们的视频数据集,并且作为主题曲,我们选择了北极猴子乐队的“我想知道吗”。
在这 40 个小时里,我们每个人都学到了很多东西,享受了交流想法的时光,进行了富有成果和深刻见解的谈话,实现了良好的工作生活平衡,甚至获得了第二名!
Practicing work-life balance at a brunch during the hackathon
Winning 🥈
这是我们:
雅艾尔·戴赫斯吉图布 LinkedIn 雅阿拉·阿金吉图布 LinkedIn 奥瑞安·沙罗尼吉图布 LinkedIn 罗伊·申伯格吉图布 LinkedIn 达尔亚·加兹曼吉图布 LinkedIn
由 Dalya Gartzman 、 Orian Sharoni 、 Roee Shenberg 、 Yaara Arkin 和 Yael Daihes 撰写和编辑
This is here for a nice cover photo. infinite gear by Roee Shenberg
原载于https://www.meimadix.com
使用 Optuna 进行超参数优化
原文:https://towardsdatascience.com/https-medium-com-perlitz-hyper-parameter-optimization-with-optuna-1c32785e7df?source=collection_archive---------13-----------------------
5 分钟指南
现在,为您的模型寻找最佳超参数变得轻而易举。
在这篇文章中,我们将采用一个简单的 pytorch 神经网络训练脚本,并使用Optuna包(此处为文档)对其进行增强。这将允许将智能 超参数调整和试验修剪轻松融入您的 ML 工作流,只需最少的代码修改。
就个人而言,寻找最适合我目标的超参数是我 ML 工作流程中最糟糕的部分。到目前为止,我的选择有两个:(1)牺牲我的时间和理智,使用优秀的老研究生血统,或者(2)实现一个复杂的框架来搜索参数空间,找到最佳值,记录和可视化过程。
好消息是:这样一个框架已经存在,它被称为 Optuna ,使用起来很简单也很有趣。
我们的起点是 Pytorch 教程中的 MNIST 分类脚本。为了完整起见,这里给出了完整的脚本,但是,由于其他部分都与我们的观点无关,我推荐浏览所有部分,直到主函数。
如果你想看代码的运行,下面是一个工作的 google colab 笔记本的链接。
[## 谷歌联合实验室
MNIST·皮托尔赫光学公司](https://colab.research.google.com/drive/1TEILbIeyE1wW3daNWOx9rLq0Hc9TXmbV)
现在让我们言归正传。
香草 MNIST 分类器框架
我们从导入和数据加载器开始:
接下来,我们实施网络:
train
和test
方法:
还有main
功能:
注意,到目前为止,没有什么有趣的事情发生,只是一个简化的 pytorch MNIST 分类器脚本。用当前随机选择的超参数训练上述脚本 5 个时期将给出 93%的准确度。我们能做得更好吗?让我们看看…
用 Optuna 增强 MNIST 分类器框架
Optuna 框架(通过pip install optuna
安装并作为import optuna
导入)基于 研究 对象。它包含关于所需参数空间、采样器方法和修剪的所有信息:
研究创建后,搜索空间通过trial.suggest_
方法合并。我们将这些嵌入到train_mnist
配置中,这样这些值:
将替换为以下内容:
以这种方式,我们根据我们的需求定义搜索空间,一旦完成,train_mnist()
应该得到trial
作为它的输入,并被定义为train_mnist(trial)
。请注意,存在允许train_mnist
具有除trial
之外的输入的配置,如果您遇到这种需要,请检查这个。
最佳化
最后一步是定义一个目标函数,其输出将被优化。在我们的例子中,我们选择train_mnist
及其输出,即测试误差。
因此将调用study.optimize
,以train_mnist
作为其参数:
总而言之,由对train_mnist()
的单一调用组成的main
,已经变成了:
就是这样!一旦这些行被添加到代码中,优化器将根据采样器对定义的参数空间进行采样。
优化完成后,可以通过study.trials_dataframe
以数据帧的形式访问结果:
输出如下:
人们可以看到所有的试验和它们的价值。为了找到最佳试验最佳参数,也可以使用study.best_trial
和study.best_params
。
在这里,我们还可以看到其中一个结果如何在相同的训练数据量和时间下获得 98.9%的测试误差(约 6%的改进),这是对 3 行代码的重大改进。
形象化
除了向您展示参数的最佳配置,Optuna 还有助于可视化物镜对参数的依赖性。给定研究对象,各种可视化工具存在于optuna.visualization
中。您可以调用plot_parallel_coordinates(study)
查看参数(本例中为 lr 和动量)和目标之间的相关性:
另一种获得直觉的方法是使用等高线图。这可以通过调用plot_contour(study)
来产生:
为了完成画面,还可以通过调用slice_plot(study)
产生切片图。这有助于理解每个参数的最佳子空间分别位于何处。
最后一个可视化选项是由plot_optimization_history(study)
生成的研究历史。这将呈现以下情节:
这显示了 Optuna 的研究是如何进行的,首先对空间进行均匀采样,然后聚焦于最有希望的区域。
最后,我希望你喜欢这篇教程,我遗漏了几个很棒的特性,比如早期修剪和不同的搜索算法,这些将不得不等到下次。如果我激起了你的兴趣,请查看伟大的 Optuna 文档,都在那里。
尽情享受吧!
[1]注意,在这篇文章中,为了简洁起见,我犯了一个可怕的错误:人们应该永远不要优化测试集,因为它会过度拟合测试数据!更好的方法是将训练集分成训练和验证,但是因为这不是本文的主题,所以我决定保持原样。
自动文本分类的最佳方法是什么?
原文:https://towardsdatascience.com/https-medium-com-piercarlo-slavazza-what-is-the-best-method-for-automatic-text-classification-a01d4dfadd?source=collection_archive---------9-----------------------
Photo by Franki Chamaki on Unsplash
自动文本分类任务包括自动将文档分配给一个或多个成员类别。
在许多情况下,这是一项基本任务。
例如,在社交媒体监控中,有必要将与某个“品牌”相关的推文分类为正面意见或负面意见。
或者,在搜索引擎的情况下,如果索引文档根据它们所涉及的主题进行分类,就有可能大大提高它们的准确性,这样用户就可以更容易地识别感兴趣的文本。
自动文本分类任务可以通过由“领域专家”或机器学习系统明确定义的“规则系统”来实现。
机器学习(ML)是一种理想的解决方案,在这种情况下,已经有足够大的一组先前分类的文本可用,即所谓的“训练语料库”:语料库被提供给 ML 系统,该系统自主地“学习”什么是分类文档的最佳策略。
另一方面,规则系统的实现和维护通常更昂贵,因为需要“领域专家”的介入,这通常必须形式化不成文的、非单义的或模糊的规则:因此,当没有足够的训练语料库可用时,通常使用规则系统。
在本文中,我们将重点关注基于机器学习的自动文本分类系统,我们将比较一些系统,并试图了解哪一个是最好的,或者至少在选择系统时可以遵循的“最佳实践”是什么。
我已经处理机器学习很长时间了,多年来我认为 SVM(即支持向量机)是自动文本分类任务中最有效的 ML 工具之一。
像大多数人工智能从业者一样,我怀着极大的兴趣关注着“深度学习”作为人工智能选择范式的进步和普遍的肯定(关于“深度学习”兴起的简要而准确的总结,可以看看这篇关于神经网络“之父”之一杰弗里·辛顿教授在谷歌 I/O 2019 上接受采访的伟大文章。
那么,对于自动文本分类任务,深度学习会比 SVM 更有效吗?
显然,除了 SVM 之外,还有许多其他方法,但是,根据我的经验,一般来说,对于 SVM(就整体准确性而言)没有实质性的区别。正是利用深度学习在几个领域取得的令人印象深刻的进展,让我想知道后者是否能明显优于 SVM 及其同类。
因此,这篇文章的结构是关于自动文本分类任务的 SVM 和深度神经网络(DNN)之间的(非详尽)比较的报告。
1.实验设置
我决定使用意大利语文本语料库来进行这个比较“实验”;在我的专业活动中,我几乎只处理意大利语文本,并且考虑到使用英语的自然语言处理(NLP)工具通常更容易,所以在意大利语语料库上进行比较对我来说很重要,这样我可以立即检查该语言的具体问题。我希望这种方法可以对所有处理非英语文本的 ML 从业者有用。
1.1 语料库的选择和任务要求
据我所知,没有真正“开放”的意大利语文本语料库可以用来训练和评估自动文本分类器。
因此,我决定创建一个。
《连线》杂志意大利版的文章是以知识共享许可的形式发布在网络上的:所以我决定使用这些文本来创建所讨论的语料库。
wired.it 文章按“主题”分类:文章主题显示在标题之前。例如,标题为“Tutti I limiti Dell ' intelligenza artificial e”的文章被分类在网站的Attualità > Tech
部分(即News > Tech
)。
每篇文章都有一个主题,主题分为两个层次。有些文章可能被列在“高级”主题中,例如直接列在Attualità
;但是由于层次结构只有两个级别,我更喜欢将任务定义为多类分类任务(即,每个文档被分配一个类,由给定的集合选择)——并且我相应地建立了语料库。
除了这些层次方面之外,很明显,在单个部分中对每篇文章进行编目(从出版者的角度来看是一个合理的选择),并考虑这些部分的类型(我们将很快看到),将导致类之间的“语义重叠”,这不利于上游的任何 ML 算法。因此,我不认为这个语料库可以允许训练高性能的分类器——不管使用什么 ML 算法。无论如何,这个限制与我们的目的无关,我们的目的主要是在不同方法之间进行比较。
尽管如此,为了不遗漏任何可能性,我也对其他非公开语料库进行了类似的评估(在我与 KIE 的职业活动期间使用,我是该公司的首席技术官),我将偶尔报告其中的一些摘要信息。
评估将使用 precision/recall 和 F1 作为衡量标准(通常为“宏平均”),这是最适合此任务的衡量标准。
总结一下:
- 我们将处理“多类”文本的自动分类任务
- 文集是意大利语的
- 语料库由 wired.it 意大利版的文章组成,按章节/主题分类
1.2 wired . it 语料库
语料库是通过使用 Scrapy 工具爬行 wired.it 创建的。爬虫代码可以在 GitHub wired-it-scraper 项目中找到。
我制作了两个版本的语料库:
- 一个 JSON 文件,其中列出了每篇文章的相关元数据(类别、标题、URL、版权、文本),可以从这里下载
- 文件系统上的语料库的布局,其中使用文件夹的名称将文章分成训练集和测试集,然后总是通过文件夹的名称将文章分成类;这种“布局”将允许以简单的方式将语料库加载到 ML 训练系统中;这个文集可以从这里下载
下面是课程以及每个课程的培训和测试文档数量的汇总表:
2.SVM
2.1 简介
支持向量机是一种 ML 方法,它从给定向量空间中表示的一组训练数据开始,找到划分这两个类别的最佳超平面,其中“最佳”意味着最佳概括的超平面,这意味着它以最大可能的幅度划分两组数据。
支持向量机可以解决非线性分类问题:使用“核”函数将数据映射到具有更大维数的向量空间,从而可以将原始问题重新定义为具有线性可分性特征的问题。
因此,为了将 SVM 应用于自动文本分类任务,需要定义代表文档的“特征”;我们将如下进行:
- 语料库的 NLP 预处理——需要实现所需的维度缩减,并允许更好的泛化
- 特征提取:我们将使用 TfIdf
- 以所选 SVM 工具支持的格式导出矢量表示,即 LibSVM
2.2 语料库的自然语言处理预处理
我继续执行语料库的 NLP 预处理步骤,使用 Apache OpenNLP ,采用为意大利语训练的模型,并以 Apache License Version 2 发布。
NLP 预处理管道包括:
- 分割
- 标记化
- 词性标注
- 按位置标签过滤
- 堵塞物
我发布了一个开源项目,它实现了各种提到的步骤的执行,并且还实现了后续的特征提取过程:这个项目叫做 java-ml-text-utils 。这个工具也可以用于意大利语以外的语言(尽管目前它需要一些最小的定制)。
说明可以在项目“自述”中找到:
- 要为意大利语以外的语言自定义库
- 来执行各种预处理步骤,以及我们将在后面看到的为 ML 更新准备素材的其他实用程序
2.2 特征提取
我决定用传统的 TfIdf 作为特性;在过去,我试验过 SVM 其他类型的特征(例如单独的 Tf,用 SVD 实现的主题模型,领域语言特征,名词短语),但是 TfIdf 总是提供更好的结果。
使用前面提到的工具 java-ml-text-utils 提取特征。
为了限制计算复杂性,特征的向量空间的维数被限制为 10000 项。
2.3 导出到 LibSVM 格式
再次使用 java-ml-text-utils,语料库最终以 LibSVM 格式导出。
2.4 分类器的训练
使用 LibSVM 工具训练分类器。
我遵循了教程“支持向量分类实用指南”中指出的方法,我个人认为这非常有效。
这种方法包括以下步骤:
- 数据缩放
- 超参数网格搜索“RBF”内核的最佳“ C ”和“ γ ”参数
- 用找到的最佳参数训练分类器
- 测试集上分类器的评估
对于 wired.it 语料库,按照这个过程,我获得了大约 0.59 的“宏观平均”F1。
结果不出所料:只有 10%的班级 F1 大于 0.8。
以下是详细的结果,其中:
TP
表示“真阳性”FP
表示“误报”FN
意为“假阴性”
3.深度学习
3.1 Keras 和 Tensorflow
对于神经网络训练,我选择使用 Keras,带有 Tensorflow 后端。Keras 编程 API 是稳定的,并且有很好的文档记录,软件生态系统是有营养的,并且有许多可用的资源——例如教程,但是特别是可以容易地重用的网络架构的定义。
3.2“扁平”神经网络
我决定从一个基本上“扁平”的神经网络开始,没有“隐藏”的层次。
使用 Keras,很容易构建一个基本的记号赋予器;为意大利语获得适当的 NLP 预处理似乎并不简单,但是这种限制由于文本可以通过单词嵌入来表示的额外的简单性而减轻了:您可以在网络架构的定义中指定它。
因此,我们的第一个网络构成如下:
- 输入是每个文本的前 N 个单词(带有适当的填充)
- 第一级使用具有特定维度和给定嵌入大小的词汇来创建单词嵌入
- 之后,对嵌入维度应用“平均池”
- 最后,输出级具有与问题类别相等的神经元数量和“softmax”激活函数
你可以在项目wired-it-text-class ification-ml中找到完整的笔记本这里(漂亮的印刷这里)。
我们需要设置一些基本参数:
- 词汇大小——即用于表示文本的最大术语数量:例如,如果我们将“词汇”的大小设置为 1000,则只考虑语料库中最常见的前 1000 个术语(其他术语将被忽略)
- 文本的最大长度(长度必须相同)
- 嵌入的大小:基本上,我们拥有的维度越多,语义就越精确,但是超过某个阈值,我们将失去嵌入定义一个连贯和足够通用的语义区域的能力
- 网络的训练时期数
我们首先尝试“手动”探索这些超参数的空间:
我们使用这种配置获得了 0.62 的 F1 宏,这在目前看来是最佳配置:
- 词汇量:30000
- 文本的最大长度:1000
- 嵌入尺寸:200
- 训练时期:40
增加或减少这些设置似乎会更糟,或者无论如何不会提高 F1 的分数。
使用 LibSVM 时,我们获得了 0.59 F1(宏)的结果:因此,使用 0.62,DNN提高了的性能,即使增加的幅度不大,因此,一般来说,我宁愿认为这是“平局”的结果。
3.3 深网和回旋
我们取得了一个很好的结果,但“深度学习”的点恰恰在“深”,即在网络内部增加层次,提高“表示”某个实体“语义”的能力的思想。换句话说,每个内部层应该——直观地说——创建一个比前一层更“抽象”和“高级”的表示。
因此,让我们尝试,可以说是天真地尝试,添加一个单一的内部级别,就像这样:
采用上一步中的最佳参数,我们得到的 F1 宏的为 0.41 :比用“琐碎的”扁平网络得到的 0.62 差得多!
但是还有另一个方面需要考虑。
从 Yoon Kim 的 2014 年文章"卷积神经网络用于句子分类"开始,人们普遍认为"卷积"层允许在文本分类任务的上下文中显著提高 DNN 的性能。理论上的原因是卷积能够捕捉连续单词(或嵌入)的“窗口”上表达的语言“模式”。
因此,让我们尝试添加一个“卷积”层:
我们得到 0.52 的 F1 宏:比只有内部“密集”层的试验性宏好,但比“平坦”网络差。
然而,考虑到我们可以插入任意数量的层,每个层具有不同数量的神经元,具有卷积的层又具有一些要设置的参数(输出维度的数量和激活函数),并且这些架构参数与前一步骤中探索的超参数(以及我们目前尚未改变的其他参数)相结合,通过“手动尝试”来探索搜索空间变得非常大和复杂。
有没有一种更有效、更详尽的方法来尝试理解架构和参数的最佳组合?
3.4 超参数优化
和 SVM 一样,dnn 也有“最佳实践”和库,允许您系统地探索超参数空间。
我决定尝试一下 Talos ,这是一个 Python 库,还附带了一篇由Mikko(Talos 的作者)撰写的文章,这篇文章做得非常好,就如何进行操作给出了极好的建议。
这不是一个完全自动的过程:
- 有必要预先定义哪些是我们想要“探索”的参数,哪些是可能的值
- 在一个“扫描”周期(可能是穷尽的,或者为了提高操作效率,可能是部分的)结束时,必须对结果进行分析,并决定集中在搜索空间的一个更受限制的“区域”上,然后反复进行,直到找到满意的组合
因此,让我们定义一个可以传递给 Talos 的“参数化”网络:
我们将它定义为一个接受输入训练和验证集的函数,以及一个参数映射:Talos 将通过调用该函数生成各种网络。
因此,我们将要“探索”的参数是:
- 嵌入:大小
- 隐藏层:形状、数量、大小、激活、缺失
- 卷积:过滤器数量
- 训练:优化、时期、训练批次的大小
我们只将训练集用于扫描,然后 Talos 将使用它来创建训练和验证的示例。
让我们对搜索空间的一个非常小的区域进行第一次“快速”扫描:1%的样本。这第一步将让我们开始“定位自己”。
我们将可能的参数值设置如下:
第一次执行给出了极高的验证准确度值,但是我们在这个阶段感兴趣的是(正如相关的指南所建议的)理解哪些参数对任务影响最大。
因此,我们通过 Talos 呈现了与“验证准确性”相关的“可视化”映射:
其中,颜色根据此标度定义相关性:
因此,有人会说,最好关注:嵌入维度(对已学内容的确认)、卷积特征的数量、内部层级神经元的数量、批量大小、漏失。相反,似乎不值得有一个以上的内部级别,并且限制到几个训练时期更有效(这与前面步骤中发生的情况相反,但是,为了快速获得指示,我们仍然可以尝试)。
然后,我们用这些参数设置第二次执行:
我们增加采样率,并且我们最终获得新的相关矩阵:
这种新的执行似乎没有给出非常重要的信息——甚至可能与迄今为止所取得的成就形成对比:也许我们可以掌握的唯一线索是增加卷积的特征图仅在某个最大阈值时起作用。
让我们通过进一步提高采样率来进行最后一次扫描,并检查 115 个可能的参数组合。
我们得到的最佳结果如下:
因此,让我们尝试使用这些参数和架构创建一个网络,并验证其性能:
在 40 次训练之后,我们得到了 0.48 的 F1 宏:一个非常令人失望的结果。
为了完整起见,让我们简单地尝试删除内层——我们之前观察到这是性能下降的原因:我们得到 0.50 的 F1 宏。
为了完整起见,让我们只尝试 10 个训练周期:另一方面,这是用 Talos 进行的优化所建议的参数。我们得到 F1 为 0.53:Talos“发现”的纪元值实际上是最佳建议。很明显,这种体系结构容易过度适应,因此最好限制电子逆向拍卖的次数。
作为最后一个测试,让我们尝试恢复内部“密集”层,并用 10 个时期进行训练:我们得到 0.52 的 F1,比用 40 个时期获得的 0.48 好,但比没有内层获得的 0.53 稍差。
简而言之,使用 Talos 进行的研究似乎证实,比简单的“平面”网络更复杂的网络根本无法达到后者的性能。
然而,Talos 虽然是一个非常有效的工具,但并不容易使用:所以我仍然希望有机会做得更好。
4 自动化机器学习
因此,SVM 和带有嵌入的“扁平”神经网络看起来是一样的——带有 DNN 显示的轻微扇形。
目前是否有其他解决方案可以为这项任务提供更好的性能?一种我没有考虑过的建筑,甚至是一种不同于 DNN 的学习方法?
我认为找出答案的最佳方式是使用谷歌云自动 NLP 服务(我从各种其他类似服务中选择了该服务,例如 H2O 无人驾驶人工智能或 MokeyLearn )来检查“基线”。
自动机器学习(或简称为 AutoML)是一种定义 ML 模型的方法,旨在建立一种“端到端”的解决方案,对我们看到的所有复杂且没有通用“配方”的决策承担全部责任。
用户只需要生成数据集(这在任何情况下都是一项重要的任务……):然后,系统承担识别最佳算法(不一定是 DNN)以及寻找最佳超参数的任务。
有了 Google Cloud AutoML,我们可以用这种非常简单的方式进行:
- 这些文本被加载到谷歌云存储桶中
- 使用 java-ml-text-utils 工具,您可以导出 CSV 格式的语料库,以供 Google Cloud AutoML 解释
- 训练开始
CSV 表明:
- 文档的 URI(它必须在先前加载到存储中的文档中)
- 相关类的标签
Google Cloud AutoML 自动生成训练集和测试集(更准确地说,它还需要生成一个“验证”集)。
为了获得更好的可比较结果,我们还在 CSV 中导出了我们的语料库的训练集和测试集之间的细分,还添加了验证集(我将其设置为训练集的 10%)。
网络培训大约 3 个小时,费用大约 10 欧元:非常便宜!
结果以精确度和召回率的形式提供。从可以推断的情况来看,结果是微观平均的。
我们可以立即检查“混淆矩阵”,这非常方便,即使只列出了类的子集:
正如所料,混淆矩阵清楚地显示了一些类别对是如何特别模糊的,例如:
Attualiaà > Ambiente
对Scienza > Ecologia
Economia > Business
vsEconomia > Finanza
Internet > Regole
vsInternet > Web
Scienza
vs 两个子类,Scienza > Ecologia
eScienza > Lab
Lifestyle > Salute
vsScienza > Medicina
在评估时,需要设置一个“分数阈值”,该阈值允许系统将某一类的归因的“排名”变成实际的赋值(“分数阈值”由系统赋予默认值)。
显然,改变分数、精确度和召回率会相应地改变:这个特性允许您理解模型如何根据与任务最相关的度量表现。
在我们的例子中,我们只是设置分数,以使精度尽可能接近其他实验中获得的精度:这样,我们获得的 F1 为 0.6 (微平均),而 DNN 和 SVM 分别获得 0.62 和 0.58。
因此,结果与迄今为止已经取得的成果完全一致:DNN 给出的结果完全可以与 SVM 相媲美(或许略好),Google Could AutoML 证实,在这个语料库上,这一结果可能是所能取得的最好结果。
我在进行类似实验的其他语料库中也得出了同样的结论。
5.有可能用简单的方式解释为什么 SVM 和 DNN 如此相似吗?
让我们从回顾文献中关于自动文本分类任务的性质的陈述开始。
据说,考虑到向量空间的大量特征/维数,该问题通常是线性可分的(如在前面提到的 LibSVM 教程中所报告的)。在过去的实验中,我们发现 RBF 核可以给出比完全不使用任何核稍好的结果——但我们可以认为这些差异是可以忽略的优化。
为了试图找到这种说法的直观解释,我们可以将维度视为“视点”,通过它我们可以观察 n 维空间中的对象。在文本的情况下,这些“观点”是如此之多(大约数千个),以至于总是有可能(与数据集的“质量”兼容)找到一种方法在属于一个类的文档和不属于该类的文档之间“插入”一个超级计划。
另一方面,在 DNN 的例子中,我们必须问自己——从数学上而不是从“隐喻”上——到底是什么“计算”了网络的某一层。
当然,有很多文献使用数学模型准确地描述了神经网络。然而,这篇文章提供了一个有趣的观点,可以以更直接的方式访问,并且具有非常清晰的图形显示:据说神经网络的各个级别的功能可以理解为一系列旨在修改输入的转换,以便数据将变得线性可分。因此,作案手法与 SVM 相似:
- 尝试转换数据,使它们可以线性分离——在 DNN 的情况下,通过添加内部级别,在 SVM 的情况下,通过应用核函数(精确地说,将数据投影到一个具有更多维度的空间中)
- 然后找到划分数据的最佳超平面(“最佳”是指它概括了“更好”,避免了最有可能的对训练数据的过度拟合)
由此可见,假设文本的自动分类问题意味着线性可分性,向 DNN 添加内部级别不会改善网络的结果。
大概,我认为这就是为什么 SVM 和 DNN 在自动文本分类任务上没有表现出实质性差异的原因。
6.那又怎样?
那么,如果对于自动文本分类来说,SVM 和 DNN 的任务似乎具有完全可比的性能(在理论上和实践中),如何在两者之间进行选择呢?使用其中一种有什么好处吗?
6.1 训练速度
在所使用的设置中,SVM 分类器的训练——包括超参数的网格搜索(在我的体验中是不可或缺的)——在一台采用 6 核(12 线程)英特尔 i7–8750h 的笔记本电脑上的多线程中花费了整整 42 个小时。
性能相似的神经网络可以在大约 2.5 分钟内训练完成(总是在同一台笔记本电脑上,其上安装了 Nvidia GeForce GTX 1060 卡)。
然而,公平地说,LibSVM 为文本分类提供了一些特别优化的替代方案: LibLinear 和多核 LibLinear 。我还没有机会尝试他们的语料库,但我认为他们很难比 DNN 训练得更快。
6.2 NLP 预处理复杂性
语料库的预处理是非常复杂的:它包括 NLP 部分(分割、标记化、词性标注、词干提取)和特征提取部分(在我们的例子中是 TfIdf)。
根据我的经验,NLP 预处理部分通常是必要的,但是逐例检查它对整体性能的贡献是值得的。
然而,特征提取部分仍然必须进行,因为它显然是不可缺少的。
另一方面,在 DNN 的情况下,这些准备步骤是不需要的:
- NLP 预处理不是必需的:在这方面已经使用 NLP 预处理的语料库进行了测试,并且与使用没有 NLP 预处理的语料库训练的结果相比,训练的 DNN 的结果没有给出优势
- 特征提取隐含在第一级嵌入中,并且是网络架构本身的一部分
6.3 谷歌云汽车
因此,使用性能相同的 DNN 似乎比 SVM 更“经济”和简单。
另一方面,使用 Google Cloud AutoML,总是具有相同的性能,结果证明甚至比 DNN 更简单——特别是因为在训练分类器后,会自动创建一个 REST 端点来计算预测。
7.结论和可能的改进
7.1 获胜者是…
在我看来,目前实现自动文本分类任务的最强大、最简单和最廉价的方法是 Google Cloud AutoML 。
如果 Google Cloud AutoML 不是一个可行的选项(可能是出于战略原因,或者因为使用了真正敏感的数据),使用具有嵌入功能的 DNN“平台”(可能是用 Keras / Tensorflow 实现的)是最好的替代可能性。在某些情况下,DNN 也可能提供比谷歌云 AutoML 略好的结果。
如果使用 Google Cloud AutoML 由于战略原因不可行,我仍然建议使用它来定义当前项目的“基线”。
关于 AutoML 方法,我也建议测试替代平台——如 H2O 无人驾驶人工智能和 MonkeyLearn。
7.2 可能的改进
在这个简短的调查中,一个缺失的部分可以在 DNN“迁移学习”实践中找到;在感兴趣的任务的特定情况下,目前最有前途的方法在于使用基于 BERT 的模型:这些是预训练的嵌入模型,能够基于单词使用的上下文来辨别单词的语义。然而:
- 理论上,数据集越小,它们就越有用:在我们的例子中,数据集已经足够大,但我不能排除预先训练的模型仍能带来优势
- 然而,最大的障碍是(据我所知)没有一个预先训练好的意大利语模型:因此,我应该安排训练一个,例如按照本文文章中描述的步骤,其中展示了如何为俄语训练一个 BERT 模型。还有BERT“multi-language”模型,但是,由于其目的是能够在某个应用程序中管理用不同语言编写的文档,所以它们对于与各种语言相关的应用程序不是很有效。
可以更好地探索的其他方法是那些与 AutoML 和超参数优化的其他库相关的方法,例如:
- Talos 本身有一个 AutoML 特性,允许您探索不同网络架构的效率
- AutoKeras
- 谷歌的 Adanet
- kopt
- Hyperas
我们解决了手写识别的问题了吗?
原文:https://towardsdatascience.com/https-medium-com-rachelwiles-have-we-solved-the-problem-of-handwriting-recognition-712e279f373b?source=collection_archive---------3-----------------------
内部 AI
深度学习能够以 99.73%的准确率识别文本。我们将何去何从?
深度学习已经被广泛用于识别笔迹。在离线手写识别中,文字在被书写后被分析。唯一可以分析的信息是背景中字符的二进制输出。虽然向数字手写笔的转变提供了更多的信息,如笔画、压力和书写速度,但当无法在线时,仍然有必要使用离线方法。这对于历史文件、档案或手工填写表格的大规模数字化尤为必要。
对这一领域的广泛研究已经导致了从经典方法到人类竞争性能的重大进展。这篇文章是对这一旅程的概述,以及该领域的潜在未来。
在深度学习之前,有 ocr
邮件分类首先需要手写文本分类器。使用扫描设备,硬连线逻辑识别单倍行距字体。1974 年,Ray Kurzweil 开发了第一款光学字符识别(OCR)软件。通过减少问题域,流程更加准确。这允许手写形式的识别。首先,它缺乏 efficiency 和意想不到的人物的知识。这些经典技术在两个关键领域有很大的局限性:
- 字符提取 —通过 OCR 轻松识别单个字符。草书笔迹,这是相连的,提出了更多的问题与评估。这是 difficult 解释笔迹没有明显的字符之间的分离。
- 特征提取 —符号的个别属性被硬编码,并与输入符号匹配。属性包括纵横比、像素分布、笔画数、距图像中心的距离和反射。这需要开发时间,因为这些属性是手动添加的。
OCR methods fail with cursive handwriting.
使用神经网络
神经网络能够通过分析数据集来学习特征,然后根据权重对看不见的图像进行分类。关于神经网络的精彩介绍可以在这里找到。在卷积层中提取特征,在卷积层中,核通过图像来提取某个特征。最终结果是,多个内核学习数据集内的所有特征,以便进行分类。这解决了 OCR 方法中的特征提取问题。
此外,在数据库上使用神经网络,而不是传统方法,意味着不需要手动硬编码。相反,参数是在训练过程中学习的。这使得深度学习方法对手写风格的变化更具弹性,并缓解了传统方法中特征提取的挑战。然而,输出精度强烈依赖于训练过程中使用的数据集的质量和完整性。
MNIST 数据库的建立推动了使用神经网络进行手写识别的研究。该数据库包含 70,000 个手写数字,自 1998 年以来一直用于深度学习。在 LeCuns 的开创性论文中,通过引入手写神经网络而引起了关注。使用 LeNet-5,并扭曲 MNIST 数字,错误率立即达到 0.7%,这是对经典方法的巨大改进。
Examples of digits from the MNIST database. Image via https://www.oreilly.com
除此之外,神经网络甚至被用于分类看不见的字母。这意味着,模型可以通用于任何语言,并且不需要在特定的字符数据库上进行训练,例如 MNIST。 Graves 对一个看不见的阿拉伯文字产生了 91.4%的准确率。
卷积神经网络(CNN)的使用在 2011 年达到顶峰,当时 Ciresan 分析了笔迹,实现了 0.27%的微小错误率。为此,七个深度 CNN 训练了相同的数据分类器,以 different 方式进行预处理。硬件的进步使这变得更容易实现,强大的 GPU 可以有效地处理深度学习任务,现在已经在社区中广泛使用。误差尽可能 differed,并且输出被平均。结果可与类似人类的性能相媲美。
The formation of CNNs used by Cisresan et al. to achieve 0.27% error rate. Image from https://ieeexplore.ieee.org/document/6065487
可以说,经典方法确定的两个问题已经解决了。神经网络可以识别任何字母、任何风格的任何笔迹。《纽约时报》已经在利用这项技术来修复他们档案中的旧印刷品。罗氏每天分析数 Pb 的医疗 pdf 文件,以加速医疗保健领域的管理。下一步是什么?
介绍顶网
对胶囊网络(CapsNets)的新兴研究导致了该领域的进一步发展。作为机器学习解决方案的另一种方法,CapsNets 的介绍展示了手写识别改进的未来。尽管 CapsNets 在现场还相当新,但它的应用正开始加快步伐,并解除了 CNN 的一些限制。
CapsNets 在许多方面改进了 CNN 的结果,特别是以下方面:
- 减少使用 CNN 方法发现的空间变化的影响。
- 减少训练所需的数据量。
在细胞神经网络中,不同核的空间差异是一个突出的问题。为了使用 CapsNets 解决这一问题,用于确定特征的核在动态路由的帮助下一起工作,以组合多个组(胶囊)的个体意见。这导致内核之间的等方差,与 CNN 相比极大地提高了性能。
Am example of CapsNets architecture. Image via https://medium.com/@pechyonkin
为了最有效地使用 CNN 进行手写识别,有必要拥有包含手写字符的大型数据集。数据集需要很大,因为模型需要学习大量的变化,以适应不同的手写风格。CapsNets 有助于减少所需的数据量,同时仍然保持高精度。例如,最近的一个团队能够在每个班仅使用 200 个训练样本的情况下进行训练,超过或达到 CNN 字符识别结果,同时还能够识别高度重叠的数字。
超越文本到文本
到目前为止,本文已经讨论了从手写输入生成数字文本输出。既然手写文本已经成功地数字化了,那么可以采取进一步的步骤来生成不同形式的输出。
文本到语音
通过将文本输入与人的语音相结合,机器学习技术已经允许类似人类的文本到语音的转换。例如,Googles WaveNet 将 mel spectrograms 作为网络的输入,它指示单词如何发音,但也指示音量和语调。这允许强调大写单词,标点符号的停顿,同时也补偿了原文中的拼写错误。由此产生的语音听起来自然而富有人情味,如下面的视频所示。
文本到图像
深度学习方法现在可以将自然语言转化为合成图像。在这里,对图像的书面描述被用来建立一个新的幻觉图像。这是通过训练 GAN 来完成的,以从噪声中创建逼真的高分辨率图像,直到它令人信服地匹配文本输入。
其结果是产生一个描述文字内容的图像。下图显示了文本输入在第一阶段通过 GAN 生成图像的例子。然后在第二阶段提高分辨率,以创建最终的合成图像。
Example of image synthesis using GANs. Image via https://arxiv.org/pdf/1612.03242.pdf
这只是几个机器学习应用程序,可以看到手写变成完全不同的输出。你最期待看到什么?你有没有遇到其他有趣的应用,可以把它带到另一个层次?请在回复中告诉我——我很乐意继续这个话题。
[## 雷切尔·怀尔斯——萨里大学| LinkedIn
计算机视觉,机器人和机器学习理学硕士
www.linkedin.com](https://www.linkedin.com/in/rachelwiles/)
下一级数据可视化—带有散景和烧瓶的仪表板应用程序
原文:https://towardsdatascience.com/https-medium-com-radecicdario-next-level-data-visualization-dashboard-app-with-bokeh-flask-c588c9398f98?source=collection_archive---------3-----------------------
视觉化很重要。也许对作为数据分析师/科学家的你来说不是,你可能对查看表格数据并从中得出结论感到自信。但通常情况下,你需要向你的老板和/或大学教授(如果你还在上大学的话)展示你的作品。不像你,他们可能不太熟悉数据,如果你向他们抛出一堆数字,他们会感到困惑。
为了避免这种情况,一种方法是通过 Matplotlib 和/或 Seaborn 生成图表,并将您的上级图表直接显示在 Jupyter 笔记本 中或作为保存的 PNG 文件。虽然这绝不是展示你成绩的一个坏方法,但它肯定不会让你的上司目瞪口呆,因此,你将无法在人群中脱颖而出。
值得庆幸的是,有一个非常酷的库叫做 Bokeh ,这篇文章将介绍创建一个简单的仪表板应用程序的过程,这个程序很可能会让你的上级感到惊讶。不仅如此,您的上级将能够手动过滤或深入查看数据,而不仅仅是查看图表。
这里要注意一点,这不是一个关于如何使用散景或 Flask 的教程。这篇文章只讲述了如何通过组合这些库来实现数据可视化。在开始之前,我假设您至少对以下技术有所了解:
- HTML
- CSS
- 烧瓶(蟒蛇)
- 散景(我用的是 1.2.0 版本)
并且能够流利地:
- Python(循环和条件)
- 熊猫/Numpy 栈
如果你的 Python 不是很好,你仍然可以跟上,但是我不能保证你会理解所有的东西。在整篇文章中,我不会解释任何的 HTML 和 CSS 片段,并将主要关注 散景 和 烧瓶 。
我将使用著名的 泰坦尼克号数据集 。如果过程中卡了,可以在我的GitHub Repo获取代码。
这是你要做的。请注意下拉菜单以及值是如何变化的。重新应用时,图表会根据相关的乘客等级重新绘制(不过,我为糟糕的设计技巧道歉)。
Final Dashboard
好了,事不宜迟,我们开始吧!
第一部分。创建目录和文件
首先,在你的电脑上创建一个空的根目录,并随意命名。在其中,创建以下文件和文件夹:
其中 下一级可视化 是我的根目录名。然后你可以在根目录下打开你喜欢的代码编辑器,我的是 Visual Studio Code 。
第二部分。HTML 和 CSS
现在,让我们来关注一下 HTML 和 CSS 文件。我只是把要点放在这里,你可以随意复制。这些是为了把所有东西放在它应该在的地方,并适当地设计它的样式。如果你懂一些网页设计的话,可以看到我用的是 Bootstrap ,所以设计部分所需的工作量是最小的。
https://gist.github.com/dradecic/a024729623eefddd02a3625b36598b7a
https://gist.github.com/dradecic/4c75e01a2c5077409f7e394538358042
https://gist.github.com/dradecic/04988be18320968a814a17f1a4c3ffa9
https://gist.github.com/dradecic/c06b8139fe018aae6067f1170833e9d0
第三部分。Python 设置
现在你需要做的是一些基本的内务处理,导入模块,声明几个常量和帮助函数,最后设置基本的 Flask 应用程序。
我先从进口说起,有不少。你将需要 Numpy 和 熊猫 当然还有很多来自 散景 的东西。您还需要导入 Flask ,这样图表就可以呈现到已经定义好的 HTML 模板中。在这里,您还将加载到数据集中,并在其中创建新的属性,该属性被称为“头衔,并将表示此人的头衔——就像先生。,错过。等。请记住,如果您没有按照我的指示创建目录和文件结构,您可能需要修改 CSV 文件的位置。
https://gist.github.com/dradecic/0cf3ac6cea2ca11b3c7831550b268b26
现在您需要定义一些常量属性——这不是必须的,但是可以让您以后更容易地更改。我所说的常量属性指的是图表上使用的字体、标题大小、刻度大小、填充等等。
在这里你还将声明两个辅助函数,第一个是【palette _ generator(),它将帮助你对图表上的条形进行动态着色。它基本上会返回一个足够长的颜色列表。
下一个辅助函数调用 plot_styler() 。它将使用先前定义的常量属性,并为图表设置各种属性,如字体大小等。之所以定义它,是因为否则您需要手动设置每个单独地块的样式。
https://gist.github.com/dradecic/380da5fb3ce3a979e33e7e8ce7e6e14b
最后,您需要为 烧瓶 应用程序定义一个基本结构,如下所示:
https://gist.github.com/dradecic/c63cc8211a19a9087e438509ef8d2f02
这将使您能够从终端/CMD 运行 app.py,并在 localhost:5000 上查看应用程序,但我不建议现在就运行应用程序。
Python 设置现在已经完成,您可以继续下一部分了。
第四部分。定义图表生成函数
这个仪表板应用程序将由 3 个图表组成。是的,我知道这不是很多。但是你可以自己创建额外的图表,这三个图表将帮助你了解它。
如果您想知道将以下函数的代码放在哪里,请将其放在 chart() 函数之后。
第一个将基于“幸存”列的值生成一个条形图——因为只有两个选项,我不会将图表放大,并将它放在一些虚拟文本的右侧(参见index.html)。该函数将根据乘客所处的等级对数据集进行子集划分,并输出这些表示的条形图。我还添加了悬停工具来使图表具有交互性。这里你将使用早先定义的plot _ styler()函数来节省一些时间和空间。
本身功能代码不难理解,如果你对 熊猫 和 散景 :
https://gist.github.com/dradecic/9ac65a6aea88070ca77ead136b5bb9ae
下一个函数将为乘客标题生成一个图表。记得我们之前做了一个新的属性' Title ',包含了像先生这样的头衔。,错过。等。现在,我们的目标是可视化特定乘客等级中有多少具有特定头衔的乘客。
class _ titles _ bar _ chart()大部分与前一个相似,因为两者都显示条形图,所以确实不需要额外解释。
https://gist.github.com/dradecic/788278cc89f043a69f3e94b363924467
最后一个函数, age_hist() 将呈现给定乘客类别的“年龄列的直方图。 散景 中的直方图比 Matplotlib 中的直方图要难一些。首先,您需要用 Numpy 创建一个直方图,它将返回直方图本身,以及边缘的位置。所有这些都将被传递到 ColumnDataSource ,边缘被进一步分为左边缘和右边缘(这对绘图交互性很有用——您可以获得有关 bin 宽度的信息)。
从那以后,该过程与 散景 中的任何其他图表类型非常相似。
https://gist.github.com/dradecic/7aceddf4176fec2bfd1011326e25ef15
图表生成函数现在已经创建好了,现在是时候将所有内容显示到屏幕上了。
第五部分。把这一切联系在一起
好了,这是你期待已久的部分。我知道要写很多代码,但是我希望即使你没有丰富的经验,也能理解。
在当前状态下,屏幕上不会呈现任何内容。这是因为你已经声明了图表绘制函数,但你没有从任何地方调用它们。现在我要你声明一个名为 redraw() 的新函数,它将产生 3 个变量,每个变量将保存 3 个图表绘制函数的返回值。然后你只需归还它们:
https://gist.github.com/dradecic/04c0e24e9eb5116091f6849c34d229ee
完成后,剩下唯一要做的就是编辑主要路线。由于仪表板在一个表单中有一个下拉菜单,所以 route 需要有提供给它的 GET 和 POST 方法。然后,您可以获取下拉列表的值。
作为边缘情况检查,如果值不知何故为 0 或不存在,您将需要为乘客类 1 调用 redraw() 函数。
如果该值存在,再次调用 redraw() ,但是这里传入取来的值。
现在,您有 3 个变量代表当前乘客等级的图表。从这里你需要使用散景的组件模块创建脚本和 div 。现在您将返回 HTML 文件名,即index.html,以及那 3 个脚本和 3 个 div:
如果你看一下index.html你会看到 div 和脚本是如何放置的。基本上就是这样。整个代码都写好了,除了启动应用程序之外,没有什么要做的了。
第六部分。启动应用程序和最后的话
如果你以前从未编写过 Flask 应用程序,你不必担心。发射的过程非常简单。
导航到您的应用程序的根目录,并打开终端/CMD 窗口。从那里,简单地写:
python app . py
其中 app.py 代表 Python 文件的名称。如果你的名字与众不同,请更改它。现在,该应用程序正在运行,您可以在以下网址看到它:
http://http://localhost:5000/
基本就是这样。现在,您有了一个创建更复杂的仪表板应用程序(当然设计得更好)的起始模板。我希望你已经学到了一些东西,这将有助于你脱颖而出,与你所处的环境无关。
直到下一次…
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
使用 Datasist 实现简单的数据分析、可视化和建模(第 1 部分)
原文:https://towardsdatascience.com/https-medium-com-risingdeveloper-easy-data-analysis-visualization-and-modeling-using-datasist-part1-8b26526dbe01?source=collection_archive---------23-----------------------
使用 datasist 库进行快速有效的数据分析
datasist logo
日前,第一个稳定版data list 发布。你可能不知道datalist是什么,所以先不要太激动。
那么,什么是 DATASIST 呢?
简单来说,datasist 是一个 python 库,它可以让数据分析、可视化、清理、准备甚至建模变得非常简单。因为让我们面对它,我不想每次都这样…(请看下面的代码块)
…只是因为我想删除缺少 80%值的列,而我可以简单地做到这一点(请看下面的美景)
source: Pixabay
我知道没错,它很懒,但效率极高。
datalist的目标是将我们经常使用的重复代码、函数和技术抽象成可以在一行代码中调用的简单函数。Datasist 的诞生纯粹是出于懒惰,因为让我们面对它吧,除非你是一个 10 倍的数据科学家,否则我们都讨厌一遍又一遍地键入又长又无聊的代码来做同样的事情。
datasist 的设计目前围绕 5 个模块:
- 结构数据
- 特征工程
- 时间序列
- 形象化
- 模型
class diagram for datasist. Source: ArXiv
这可能会在未来的版本中发生变化,因为我们目前正在努力支持数据科学和机器学习的许多其他领域。
这篇文章的目的是向你介绍这些模块中的一些重要特性,以及你如何在你的项目中使用它们。为了这篇文章简洁明了,我决定把它分成两部分。
第 1 部分将涵盖前三个 modu les (structdata、feature engineering、timeseries )和第 2 部分将涵盖最后两个模块(可视化和模型)。
所以不浪费更多的时间,让我们开始吧。
您将在这一部分学到什么:
- 使用 structdata 模块。
- 使用数据列表的特征工程。
- 使用基于时间的要素。
要阅读本文,您需要安装 datasist 库。您可以使用 python pip 管理器来做到这一点。打开终端或 Jupyter 笔记本并键入,
pip install datasist
记得用感叹号(!)在上面的命令之前,如果你在 Jupyter 笔记本上运行它。
接下来,您需要获得一个数据集来进行实验。虽然您可以使用任何数据集,但为了一致性,建议下载我们在本教程中使用的数据集。你可以在这里 找到 。
最后,打开 Jupyter 笔记本,导入以下库和数据集,如下所示:
使用 structdata 模块
structdata 模块包含许多用于处理结构化数据的函数,这些数据大多是 Pandas DataFrame 格式的。也就是说,您可以使用这些函数轻松地操作和分析数据帧。我们在下面重点介绍一些功能。
- describe :我们都知道 Pandas 中的 describe 函数,我们决定扩展它以支持对数据集的全面描述。让我们来看看实际情况。
ds.structdata.describe(train_df)
output from the describe function of structdata
从上面的结果中,您可以一次获得数据集的完整描述,并且还可以在一行中正确理解一些功能(太棒了!).
2。check_train_test_set :该函数用于检查两个数据集的采样策略。这一点很重要,因为如果两个数据集不是来自同一个分布,那么特征提取将会不同,因为我们不能将第一个数据集的计算应用于第二个数据集。
要使用它,您需要传入两个数据集( train_df 和 test_df ) ,一个公共索引(customer_id),最后传入两个数据集中存在的任何特性或列。
ds.structdata.check_train_test_set(train_df, test_df,
index='Customer Id',
col='Building Dimension')
output from the check_train_test_set
3。display_missing: 您可以检查数据集中缺失的值,并使用该函数在格式良好的数据帧中显示结果。
ds.structdata.display_missing(train_df)
missing values in data set
4。get_cat_feats 和 get_num_feats: 就像它们的名字一样,您可以分别以 Python 列表的形式检索分类和数字特征。
cat_feats = ds.structdata.get_cat_feats(train_df)
cat_feats
categorical features in data set
num_feats = ds.structdata.get_num_feats(train_df)
num_feats
numerical features in data set
5。get_unique_counts: 在决定使用何种编码方案之前,您是否希望检查分类特征中唯一类的数量?那么,你可以使用get _ unique _ count函数来轻松做到这一点。
output from the get_unique_counts function
6。join_train_and_test: 大多数时候,在构建原型时,您可能希望将训练集和测试集连接起来,然后对其应用一些转换。您可以使用join _ train _ and _ test功能来完成。它返回一个连接的数据集以及训练集和测试集的大小,以便将来进行拆分。
output from combining the two data set and splitting
这些是 datasist 的 structdata 模块中的一些常用函数,要查看其他函数并了解更多关于您可以更改的参数,请查看这里的 API 文档。
使用数据列表的特征工程。
特征工程是从原始数据中提取重要特征并将其转换为适合机器学习模型的格式的行为。
数据列表的 特征 _ 工程 模块中的一些可用功能解释如下。
注意:在特征工程模块中的函数总是返回一个新的和转换的数据帧。这意味着,你应该把结果赋给一个变量,因为什么也没有发生。
- drop_missing :这个函数删除具有指定百分比的缺失值的列/特性。假设我有一组丢失值超过 80%的特性,我想删除这些列,我可以很容易地用 drop_missing 函数来完成。
首先让我们看看数据集中缺失值的百分比
ds.structdata.display_missing(train_df)
display of missing values in data set
为了演示,我们将删除缺少 7.1%值的列(Date _ of _ Occupancy)。
注意:您不应该删除丢失值如此之少的列/特征。最理想的做法是填满它。我们把它放在这里,只是为了演示。
new_train_df = ds.feature_engineering.drop_missing(train_df,
percent=7.0)
ds.structdata.display_missing(new_train_df)
Output of dataset after using the drop_missing function
2 。drop_redundant: 该功能用于移除低方差或无方差的特征。也就是说,所有要素都包含相同的值。我们展示了一个使用人工数据集的简单示例。
首先,让我们创建数据集…
df = pd.DataFrame({'a': [1,1,1,1,1,1,1],
'b': [2,3,4,5,6,7,8]})df
sample dataset
现在看看上面的数据集,我们看到列 a 是多余的,也就是说它始终具有相同的值。我们可以通过将数据集传递给drop _ redundant函数来自动删除该列。
df = ds.feature_engineering.drop_redundant(df)
df
Result dataset from using the drop_redundant function
- convert_dtypes :该函数以一个数据帧作为参数,自动将特征类型转换为正确的数据类型。
让我们看一个例子。首先,我们创建一个人工数据集如下。
data = {'Name':['Tom', 'nick', 'jack'],
'Age':['20', '21', '19'],
'Date of Birth': ['1999-11-17','20 Sept 1998','Wed Sep 19
14:55:02 2000']}df = pd.DataFrame(data)
df
sample data set
接下来,让我们检查数据类型…
df.dtypes
data types of features
年龄和出生日期这两个特性应该分别是整数和日期时间,通过将这个数据集传递给convert _ dtype函数,可以自动修复这个问题。
df = ds.feature_engineering.convert_dtype(df)
df.dtypes
datatypes of features in artificial data set after using convert_dtypes function
- fill_missing_cats: 顾名思义,这个函数接受一个数据帧,并自动检测缺少值的分类列。它使用模式填充它们。让我们看一个例子。
从数据集中,我们有两个缺失值的分类要素,它们是 Garden 和 Geo_Code。
df = ds.feature_engineering.fill_missing_cats(train_df)
ds.structdata.display_missing(df)
missing values DataFrame after filling the missing categorical features
- fill_missing_nums :这类似于fill _ missing _ cats,除了它作用于数字特征,你可以指定一个填充策略(均值、众数或中位数)。
从数据集中,我们有两个数值特征缺失值,它们是建筑尺寸和入住日期。
df = ds.feature_engineering.fill_missing_num(train_df)
ds.structdata.display_missing(df)
missing values DataFrame after filling the missing numerical features
- log_transform :该功能可以帮助你对一组特征进行 log 变换。它还显示了之前和之后的图与偏斜水平,以帮助您决定是否日志转换功能是你真正想要的。
特征 B 建筑尺寸是右斜的,我们可以转换它。
注意:传递给 log_transform 函数的列不应该包含缺失值,否则它将抛出一个错误。
df = ds.feature_engineering.fill_missing_num(df)
df = ds.feature_engineering.log_transform(df,
columns=['Building Dimension'])
Log-transform plot
为了处理地理特征,如纬度和经度,datasist 有专门的函数,如方位、曼哈顿距离、获取位置中心等,在特征工程模块中也有。要查看这些和其他函数,您可以在这里查看 API 文档。
使用基于时间的要素
最后,在这一部分,我将讨论 datasist 中的 timeseries 模块。timeseries 模块包含使用日期时间功能的函数。它可以帮助您从日期中提取新特征,还可以帮助您将它们可视化。
- extract_dates: 该函数可以从指定的日期特征中提取指定的特征,如星期几、一年中的某一天、小时、分钟和一天中的秒钟。为了演示这一点,让我们使用一个包含日期功能的数据集。
在这里 获取新的数据集 。
new_data = pd.read_csv("Train.csv")
new_data.head(3).T
Transposed head of the dataset
数据集包含大量我们可以分析的时间特征。关于这项任务的更多细节可以在竞赛页面上找到。
让我们演示一下使用 extract_dates 函数从位置-时间、到达目的地-时间要素中提取信息是多么容易。我们指定只提取星期几(dow)和一天中的小时(hr)。
date_cols = ['Placement - Time', 'Arrival at Destination - Time']df = ds.timeseries.extract_dates(new_train, date_cols=date_cols,
subset=['dow', 'hr')df.head(3).T
output from extract_dates function
我们可以看到,datasist 创建了新的列,并向数据集追加了新的特性。
2。时间片:时间片功能可以帮助你根据特定的时间特性可视化一组特性。这可以帮助你识别趋势和模式。要使用此函数,可以传递一组数字列,然后指定要绘制的日期特征。
num_cols = ['Time from Pickup to Arrival', 'Destination Long',
'Pickup Long','Platform Type', 'Temperature']ds.timeseries.timeplot(new_train, num_cols=num_cols,
time_col='Placement - Time')
output of timeplot
至此,第 1 部分已经结束。要了解更多关于 datasist 和其他可用函数的信息,您可以在这里查看 API 文档。
在第 2 部分中,我们将介绍最后两个模块(可视化和模型),在那里您将看到如何利用 datasist 的强大功能,只用一行代码就能快速创建漂亮的图形。
数据列表 正在并将随着我们添加更多功能而继续发展。如果你想让它变得更好,请查看我们的投稿指南这里,如果你想报告一个 bug 问题或者对新功能有一个想法,请访问我们的 GitHub 问题页面这里。如果这个项目对你有用,别忘了在 GitHub 上给我们留下一颗星。
最后,如果您在项目中使用了 datasist,请告诉我们,这样我们就可以在我们的页面上展示您的作品。
点击 查看我们的贡献者列表 。
链接 到 GitHub 上的 datasist repo
将 链接到文档
链接 到示例用法
在TwitterLinkedIn上找我
给我发邮件:risingodegua@gmail.com
作为一名数据科学家,在 6 个月的旅程中学到了 6 件事
原文:https://towardsdatascience.com/https-medium-com-s-prateek3080-6-things-learned-in-6-months-data-science-journey-f5d3fec09c6b?source=collection_archive---------15-----------------------
这是每个学生的故事,考试中的内容与课堂上教授的内容完全不同。
在这篇文章中,我将试着写下从在线课程学习到从事专业项目的差距。
Photo by Kristopher Roller on Unsplash
我在 15 秒钟内——在大约半年的时间里,我一直是一名数据科学家,这是一个相当长的学习曲线。对我来说,这是一个相当长的学习曲线,因为我来自专利分析背景(2 年)。在那里,专利趋势评估项目激起了我的兴趣,从那时起,我开始在工作的同时学习更多关于数据科学领域的知识。我会利用业余时间学习在线课程和周末……?参加黑客马拉松。
然而,当我以数据科学家的身份加入时,经过 8 个月的自学,我在将知识付诸实践方面感到茫然。在组织中,课程工作和实际项目工作之间存在差距。课程中没有教授的技能,只有当你踏入这个领域时才能掌握。
所以我记下了过去 6 个月里学到的 6 件主要事情。
1.数据收集和数据准备
在任何在线或黑客马拉松中可用的典型分析问题中,数据已经可用,我们的任务只是准备数据(清理数据、缺失值插补等)。然而,一个企业有多个数据收集和存储源(Oracle、SAS、MongoDB)。作为一名数据科学家,你必须从这些数据源中识别相关变量。因此,如果你从零开始任何项目,这个过程将消耗你大量的时间。
当从事一个项目时,花大量的时间熟悉数据和数据准备。通常,您的目标是构建一个更好的模型,而不是改进构建模型所基于的数据。但是,基于可用数据/变量改进模型是有限度的。所以如果你花了足够的时间和精力去完善模型的输入数据,那么从更长远的角度来看,肯定对你有帮助。
T4 的建议:花大量的时间熟悉数据。
2.生产模型(模型部署)
机器学习框架一般有 7 个步骤:
1。数据收集
2。数据准备
3。型号选择
4。模特培训
5。型号评估
6。参数调整
7。预言;预测;预告
在开发过程中,我们进行探索性数据分析(EDA),绘制图表,测试假设,并使用不同的模型。然而,当代码进入生产流水线时,它应该全部自动化。在生产模型管道运行之间不应有任何人工干预。
3.工程师的噩梦:生产代码失败
当我的产品代码失败时,我已经艰难地学会了这一步。有时,我们会错过对一些用例的测试。在这种情况下,错误处理可以拯救您,并且当代码失败时,您的生产代码不会突然停止。
Try-catch =救生圈。
除了错误处理,日志记录也是必要的。当代码失败时,日志用于调试失败点。
4.通讯技能
巧妙的沟通需要两个方面:一是从客户那里收集正确可行的技术需求,二是向客户传达你已经做了什么。
- 与客户的来回沟通非常重要。让他们明白模型能提供什么,它们的局限性是什么。有时,客户的期望与模型在技术上能提供的不匹配。
- 你的技术专长是必须的,但是数据呈现和可视化技能也很重要。客户和管理层通常是非技术性的。除了计算数字,使用创造性的可视化来推销你的模型。即使你做了一些艺术级的工作,但是如果你不能把它的影响传达给客户,所有的工作都将是徒劳的。严酷的事实!
5.评定标准
在解决在线分析问题时,我们不太注意评估因子,而评估因子是传达模型实际性能的因素之一。
带回家提示:明智地选择评估指标,使其更有影响力。
例如,我们有一个数据集如下
患者总数:100
糖尿病患者:5
健康:95
这里,即使我们的模型只预测大多数类,即所有 100 个人都是健康的,我们也有 95%的分类准确率。在出现分类问题的情况下,参考本文中的选择评估标准。
6.业务影响
作为一名数据科学家,除了主要关注模型构建之外,您还应该关注模型产生的业务影响。另外,了解统计数据也很有趣。
加分。20%法则:学习新事物
虽然数据科学工作会让你一整天都很忙,但试着抽出一些时间(比如 10-20%)让自己了解与核心工作相关的新发展。其余 80%的时间反正会花在核心项目上。
结论
我主要讨论了 6 点
1.数据收集和数据准备
2。评价标准
3。生产模型(模型部署)
4。错误处理
5。演讲技巧
6。业务影响
如果您有任何意见或问题,请在下面留下您的反馈。更多文章请访问keytodatascence。你可以通过 LinkedIn 联系到我。
用 R 分析在旧金山拍摄的电影
原文:https://towardsdatascience.com/https-medium-com-tanmayee92-was-your-favorite-movie-shot-in-san-francisco-f872e482a5d9?source=collection_archive---------35-----------------------
The Golden Gate Bridge stands tall with the city of San Francisco on the horizon
旧金山是一个纯粹的魔法城市,几个月前我在这座黄金城市度过了一段美好的时光。因此,当我偶然发现一组非常有趣的电影和连续剧的数据,这些电影和连续剧是在旧金山的几个地方拍摄的,我无法阻止自己去挖掘它们。瞧,我发现了 4 个有趣的见解!
- 2015 年仅一年就有 23 部在旧金山拍摄的电影上映!
- 金门大桥是这座城市中最热门的电影拍摄地(毫无疑问!)
- 导演安德鲁·海格在《海湾城市》中拍摄了多达 11 部电影!
- 华纳兄弟影业(娱乐巨头之一)和 Hulu(流媒体服务公司之一)在旧金山拍摄的电影/连续剧数量最多。
在这篇文章中,我将展示我是如何通过 6 个步骤分析这些数据的。所以,打开你的 R 工作室,跟着做吧!
步骤 1:导入库
library(dplyr)
library(readxl)
library(writexl)
library(tidyquant)
library(tidyverse)
library(forcats)
library(magrittr)
步骤 2:加载数据
这项练习的数据可以在这个 url 上找到。确保以 csv 格式将数据下载到您的本地驱动器中。
film <- read.csv('Film_Locations_in_San_Francisco.csv')
现在,让我们仔细观察这些数据,了解其维度。
dim(film)
我们有 1622 行和 11 列。由于列的数量很大,这是一个很宽的数据集,因此,我们将使用 glimpse()函数一次性查看所有的列。
glimpse(film)
我们在数据中看到了 NAs,但我们将保持原样。
第三步:争论数据
我想通过替换“.”来使列名更加标准在带有“_”的名称中。此外,我决定重新排列几列,将“标题”、“发行年份”、“地点”、“导演”和“编剧”放在列表的顶部。
#Replacing "." in the column names with "_"film_wrangled <- film %>%
set_names(names(.)%>% str_replace_all("\\.", "_")) %>%#Re-ordering the columns select(Title, Release_Year, Locations, Director, Writer, everything()) %>%
glimpse()
我们看到所期望的改变已经实现。
步骤 4:数据操作
为了深入分析,我决定只关注几列,即“发行年份”、“标题”、“地点”、“导演”和“经销商”。
film_tbl <- film_wrangled %>%
#Choosing the columns to focus on
select(Release_Year, Title, Locations, Director, Distributor) %>%
glimpse()
因此,TiB ble“film _ TBL”是我们在这一点之后进行任何分析的首选数据集。
问题 1:哪一年在三藩市拍摄的电影数量最多
popular_by_year <- film_tbl %>%
group_by(Release_Year) %>%
summarize(Number_of_movies = n_distinct(Title)) %>%
filter(Number_of_movies > 5) %>%
arrange(desc(Number_of_movies))
这个如果形象化就很好理解了。
popular_by_year %>%
ggplot(aes(x = Release_Year, y = Number_of_movies)) +
#Adding geometries
geom_col(fill = "#18BC9C") +
#Formatting
geom_text(aes(label= Number_of_movies), vjust = 0 ) +
theme_tq() +
labs(
title = "Number of movies shot in San Francisco by release year",
subtitle = "The City was the clear favourite of movie-makers in 2015 ",
x = "Release Year",
y = "Number of Movies"
)
似乎 2015 年是科幻电影最多的一年,接下来是 2016 年。在这两年之前,大多数科幻电影的拍摄发生在 1996 年。
问题 2:旧金山有哪些最著名的拍摄电影的地点?
popular_locations <- film_tbl %>%
group_by(Locations) %>%
summarize(Number_of_movies = n_distinct(Title)) %>%
filter(Number_of_movies > 5) %>%
filter(Number_of_movies < 54) %>%
arrange(desc(Number_of_movies))
视觉化这个…
popular_locations %>%
ggplot(aes(x = reorder(Locations, -Number_of_movies), y = Number_of_movies )) +
#Adding Geometries
geom_col(fill = "#C40003" ) +
#Formatting
theme_tq() +
geom_text(aes(label= Number_of_movies), hjust = 0 ) +
labs (
title = "San Francisco is a top choice of the Directors",
subtitle = "Andrew Haigh directed the most number of movies shot in the City",
y = "Number of Movies"
) +
coord_flip()
数据告诉我们,拍摄一部电影最著名的地点是金门大桥(这里没有惊喜!).它与其他热门地点竞争激烈,如市政厅、梅森街 950 号的费尔蒙特酒店、金银岛和 Coit Tower。
问题 3:哪些导演在旧金山拍摄的电影数量最多?
directors <- film_tbl %>%
group_by(Director) %>%
summarize(Number_of_movies = n_distinct(Title)) %>%
filter(Number_of_movies > 3) %>%
arrange(desc(Number_of_movies))
视觉化这个…
directors %>%
ggplot(aes(x = Director, y = Number_of_movies )) +
#Adding Geometries
geom_col(fill = "#0055AA" ) +
#Formatting
theme_tq() +
geom_text(aes(label= Number_of_movies), vjust = 0 ) +
labs (
title = "San Francisco is a top choice of the Directors",
subtitle = "Andrew Haigh directed the most number of movies shot in the City",
y = "Number of Movies"
)
导演安德鲁·海格在这座海湾城市拍摄了多达 11 部电影,紧随其后的是阿尔弗雷德·希区柯克、克里斯·哥伦布、盖瑞·马歇尔和菲利普·考夫曼,他们分别在这里拍摄了 4 部电影。
问题 4:哪些发行公司的大部分电影都是在旧金山拍摄的?
film_tbl %>%
select(Title, Distributor) %>%
group_by(Distributor) %>%
summarise(Number_of_movies = n_distinct(Title)) %>%
arrange(desc(Number_of_movies))
我们看到华纳兄弟电影公司是明显的赢家。此外,值得注意的是,流行的流媒体服务 Hulu 似乎有很多系列/电影在旧金山拍摄。
问题 5:在金门大桥拍摄的电影叫什么名字?
既然我们已经知道了大多数电影通常都会有一两个在著名的金门大桥的场景,让我们看看它们的名字。
film_tbl %>%
select(Title, Locations, Release_Year) %>%
filter(grepl("Golden Gate Bridge", Locations)) %>%
arrange(desc(Release_Year))
我们看到近年来上映的电影,如《寻找》(2014)、《牛奶》(2008)、《桥》(2006)等,都是在这个非常著名的地方拍摄的。
太棒了,不是吗?
一个小提示——在这些电影中,我发现网飞只有“牛奶”!所以如果你想欣赏金门大桥的美景,你知道现在该去哪里了!😃
感谢阅读这篇文章!如果你喜欢,请给我发来掌声:)
源代码托管在我的 GitHub 页面
使用“pdpipe”与熊猫一起建造管道
原文:https://towardsdatascience.com/https-medium-com-tirthajyoti-build-pipelines-with-pandas-using-pdpipe-cade6128cd31?source=collection_archive---------0-----------------------
我们展示了如何使用一个叫做 pdpipe 的奇妙的小库,用 Pandas DataFrame 构建直观而有用的管道。
介绍
Pandas 是 Python 生态系统中一个了不起的库,用于数据分析和机器学习。它们在 Excel/CSV 文件和 SQL 表所在的数据世界和 Scikit-learn 或 TensorFlow 施展魔法的建模世界之间形成了完美的桥梁。
数据科学流程通常是一系列步骤,数据集必须经过清理、缩放和验证,才能供强大的机器学习算法使用。
当然,这些任务可以通过 Pandas 等软件包提供的许多单步函数/方法来完成,但更好的方式是使用管道。几乎在所有情况下,流水线通过自动化重复的任务减少了出错的机会并节省了时间。
在数据科学领域,具有管道特性的包的很好的例子是——R 语言的DP lyr和 Python 生态系统的Scikit-learn。
数据科学流程通常是一系列步骤,数据集必须经过清理、缩放和验证才能投入使用
下面是一篇关于它们在机器学习工作流中的使用的精彩文章。
[## 用 Scikit-learn 管道管理机器学习工作流第 1 部分:简介…
你熟悉 Scikit-learn 管道吗?它们是管理机器的一个非常简单但非常有用的工具…
www.kdnuggets.com](https://www.kdnuggets.com/2017/12/managing-machine-learning-workflows-scikit-learn-pipelines-part-1.html)
Pandas 还提供了一个**.pipe**
方法,可用于类似的用户自定义函数。然而,在本文中,我们将讨论一个名为 pdpipe 的奇妙的小库,它专门解决了 Pandas DataFrame 的流水线问题。
几乎在所有情况下,流水线通过自动化重复的任务减少了出错的机会并节省了时间
熊猫流水线
Jupyter 笔记本的例子可以在我的 Github repo 中找到。让我们看看如何用这个库构建有用的管道。
数据集
出于演示的目的,我们将使用美国房价的数据集(从 Kaggle 下载)。我们可以在 Pandas 中加载数据集,并显示其汇总统计信息,如下所示:
但是,数据集还有一个包含文本数据的“地址”字段。
添加大小限定符列
对于这个演示,我们用下面的代码向数据集添加一列来限定房子的大小,
数据集看起来像这样,
最简单的流水线—一个操作
我们从最简单的管道开始,只包含一个操作(不要担心,我们很快就会增加复杂性)。
假设机器学习团队和领域专家说,他们认为我们可以安全地忽略Avg. Area House Age
数据进行建模。因此,我们将从数据集中删除该列。
对于这个任务,我们使用 pdpipe 中的ColDrop
方法创建一个管道对象drop_age
,并将数据帧传递给这个管道。
import pdpipe as pdp
drop_age = pdp.ColDrop(‘Avg. Area House Age’)
df2 = drop_age(df)
如预期的那样,产生的数据帧如下所示:
简单地通过添加
只有当我们能够拥有多个阶段时,管道才是有用和实用的。在 pdpipe 中有多种方法可以做到这一点。然而,最简单、最直观的方法是使用+运算符。这就像手工连接管道一样!
比方说,除了删除年龄列,我们还想对House_size
列进行一次热编码,以便可以轻松地对数据集运行分类或回归算法。
pipeline = pdp.ColDrop(‘Avg. Area House Age’)
pipeline+= pdp.OneHotEncode(‘House_size’)
df3 = pipeline(df)
因此,我们首先用ColDrop
方法创建了一个管道对象来删除Avg. Area House Age
列。此后,我们只是用通常的 Python +=
语法将OneHotEncode
方法添加到这个管道对象中。
生成的数据帧如下所示。注意从一次热编码过程中创建的附加指示器列House_size_Medium
和House_size_Small
。
根据行的值删除一些行
接下来,我们可能希望根据数据的值删除数据行。具体来说,我们可能希望删除所有房价低于 25 万的数据。我们使用了ApplybyCol
方法将任何用户定义的函数应用于数据帧,还使用了ValDrop
方法根据特定值删除行。我们可以很容易地将这些方法链接到我们的管道中,以选择性地删除行(我们仍在添加现有的pipeline
对象,该对象已经完成了列删除和一次热编码的其他工作)。
def price_tag(x):
if x>250000:
return 'keep'
else:
return 'drop'pipeline+=pdp.ApplyByCols('Price',price_tag,'Price_tag',drop=False)
pipeline+=pdp.ValDrop(['drop'],'Price_tag')
pipeline+= pdp.ColDrop('Price_tag')
第一种方法通过应用用户定义的函数price_tag()
,基于Price
列中的值标记行,
第二种方法在Price_tag
列中查找字符串drop
,并删除匹配的行。最后,第三种方法删除Price_tag
列,清理数据帧。毕竟,这个Price_tag
列只是临时需要的,用来标记特定的行,应该在它达到目的后被删除。
所有这些都是通过在同一管道上简单地链接操作阶段来完成的!
此时,我们可以回顾一下,看看我们的管道从一开始对数据帧做了什么,
- 删除特定列
- one-hot-编码用于建模的分类数据列
- 基于用户定义的函数标记数据
- 基于标记删除行
- 删除临时标记列
所有这些——使用下面五行代码,
pipeline = pdp.ColDrop('Avg. Area House Age')
pipeline+= pdp.OneHotEncode('House_size')
pipeline+=pdp.ApplyByCols('Price',price_tag,'Price_tag',drop=False)
pipeline+=pdp.ValDrop(['drop'],'Price_tag')
pipeline+= pdp.ColDrop('Price_tag')df5 = pipeline(df)
最新版本更新:直接降行!
我与这个包的作者进行了一次精彩的讨论,他告诉我这个包的最新版本可以使用 lambda 函数用一行代码完成 row 的删除(满足给定的条件)。
pdp.RowDrop({‘Price’: lambda x: x <= 250000})
sci kit-学习和 NLTK 阶段
有许多更有用和直观的数据帧操作方法可用于数据帧操作。然而,我们只是想表明,即使是 Scikit-learn 和 NLTK 包中的一些操作也包含在 pdpipe 中,以创建令人敬畏的管道。
Scikit-learn 的比例估算器
构建机器学习模型最常见的任务之一是数据的缩放。Scikit-learn 提供了一些不同类型的缩放,如最小-最大缩放或基于标准化的缩放(减去数据集的平均值,然后除以标准偏差)。
我们可以在管道中直接链接这样的缩放操作。下面的代码演示了如何使用,
pipeline_scale = pdp.Scale('StandardScaler',exclude_columns=['House_size_Medium','House_size_Small'])df6 = pipeline_scale(df5)
这里,我们应用了 Scikit-learn 包中的[StandardScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html)
估计器来转换数据,以便进行聚类或神经网络拟合。我们可以有选择地排除不需要这种缩放的列,就像我们在这里对指示器列House_size_Medium
和House_size_Small
所做的那样。
瞧啊。我们得到缩放的数据帧,
NLTK 的标记器
我们注意到,数据帧中的地址字段现在几乎没有用。然而,如果我们可以从这些字符串中提取邮政编码或州名,它们可能对某种可视化或机器学习任务有用。
为此,我们可以使用一个单词分词器。NLTK 是一个用于文本挖掘和自然语言处理(NLP)的流行而强大的 Python 库,并提供了一系列标记化方法。这里,我们可以使用一个这样的标记器来分割地址字段中的文本,并从中提取州名。我们知道州名是地址串中的倒数第二个单词。因此,遵循链式管道将为我们完成这项工作,
def extract_state(token):
return str(token[-2])pipeline_tokenize=pdp.TokenizeWords('Address')pipeline_state = pdp.ApplyByCols('Address',extract_state,
result_columns='State')pipeline_state_extract = pipeline_tokenize + pipeline_statedf7 = pipeline_state_extract(df6)
产生的数据帧如下所示:
摘要
如果我们总结一下本演示中显示的所有操作,看起来如下所示:
所有这些操作都可能在相似类型的数据集上频繁使用,在数据集准备好进行下一级建模之前,有一组简单的顺序代码块作为预处理操作来执行将是非常好的。
流水线是实现统一的顺序代码块集的关键。Pandas 是在机器学习/数据科学团队中使用最广泛的用于此类数据预处理任务的 Python 库,而 pdpipe 提供了一种简单而强大的方法来构建具有 Pandas 类型操作的管道,这些操作可以直接应用于 Pandas DataFrame 对象。
自己探索这个库并为您的特定数据科学任务构建更强大的管道。
喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果您使用下面的链接, ,我将收取您的一部分会员费,而不会对您产生额外费用 。
[## 通过我的推荐链接加入 Medium—Tirthajyoti Sarkar
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@tirthajyoti/membership)
青年失业建模
原文:https://towardsdatascience.com/https-medium-com-vikramdevatha-modeling-youth-unemployment-d0f7cbcd078a?source=collection_archive---------16-----------------------
深入分析
根据劳动部(政府)的数据。印度的)
由德瓦希什·迪曼,瓦隆·萨拉奥吉 & 维克拉姆·德瓦塔
青年失业是当今印度的一个主要问题。尽管学校和大学毕业生的数量每年都在增长,但仍有数百万青年没有有意义的工作。这给个人和经济蒙上了阴影——它减少了个人的经济贡献,以及他/她的自我价值感。
印度是世界上青年人口比例最高的国家(《经济时报》,2014 年)。2015 年 18-29 岁年龄组的失业率为 13.2%(劳动局,2016 年 9 月)。每年有数百万青年进入就业市场(Picarelli,2017)。然而,根据 ESIC 的就业数据,与去年相比,2019 年 1 月的就业创造放缓了 6-7%(BI India Bureau,2019)。这对青年的就业前景产生了不利影响。2017-18 年的失业率估计为 6.1%,是过去 45 年来的最高水平。这反映了就业危机,以及合格人才和可用就业机会的不匹配”(BI 印度局,2019)。
我们相信,我们每个人都有潜力在我们所做的工作中找到意义,并有能力改变这个世界。帮助年轻人找到有意义的工作将大大改变他们的生活。
我们为印度的青年失业问题建立了一个端到端的商业解决方案。我们找出了与失业相关的问题,收集了个人和城市层面的相关数据,使用机器学习算法根据失业情况对城市和青年进行分类,分析了青年失业的原因,并继续提供潜在的商业解决方案来解决这一问题。
我们将试图回答的一些问题是:失业者的人口统计特征是什么?造成失业的因素有哪些(在国家层面和个人层面)?有可能根据失业情况对城市和青年进行分类吗?失业对个人的货币影响是什么?在未来十年,我们如何让失业青年从事有意义的工作?初创企业能够理解、参与并解决青年失业问题吗?
一些背景
失业被定义为有工作能力和愿意工作的工人找不到工作的情况。它表示为失业总人数与总劳动力的比率。在印度,就业和失业是由国家抽样调查组织(NSSO)和劳动局计算的。NSSO 使用不同的方法和参照期提供失业估计数,这些方法和参照期对个人的活动状况进行分类,用于估计过程(Thind,2013 年)。注:通常的状况法使用调查日期之前 365 天的参照期。当前每周状态方法使用调查日期前 7 天的参考期,而当前每日状态方法使用前一周的每一天作为参考期
自独立以来,失业问题一直在加剧,尤其是年轻人。2015 年,超过 30%的印度青年既没有就业,也没有接受教育或培训,这是世界上最高的百分比之一(OECD,2017)。
几个因素导致了印度的失业问题,包括高人口增长率,缓慢的经济进步率(和就业创造),让几个人依赖几个人的联合家庭制度,以及技术的兴起(开放学习学院,2019)。Mehta (2019 年)还将印度的种姓制度、农业盛行、家庭手工业和小工业的衰落(导致工匠失业)、工业化增长缓慢、储蓄减少从而投资减少(因此就业机会减少)以及电力、煤炭和原材料短缺归咎于此(Mehta,2019 年)。
劳动局将印度的失业问题部分归因于就业不足和低工资。他们还表示,在 2015 年有正当工作的少数民族中,超过一半的人每月收入低于 1 万卢比。因此,对就业市场的任何干预都需要解决所提供工作的数量和质量问题(劳动局,2016 年 9 月)。
在宏观层面,与失业相关的经济因素包括国家的国内生产总值(GDP)、人口增长、政府预算赤字/盈余、股价指数和从事研发的员工比例。终身学习和其他教育项目与失业有显著的反比关系。影响失业的人口因素包括移民和工作年限(Belen Villena Maria,2013/14)。
印度的就业市场正在快速变化,新的行业和技能产生了对劳动力的需求。技术改变工业的速度将熟练劳动力置于危险之中。因此,提高技能和职业培训计划对于帮助工人保住工作是必要的。此外,工作提供者需要与求职者相匹配,行业机构和政府组织扮演中介的角色,提供准确的信息来匹配需求和供应。通过为工人提供培训计划以及指导和咨询机会,重新获得技能和提高技能的责任必须由私营部门分担(Kedia,2018 年)。
毕马威对印度不同行业的就业潜力进行了估算。他们的研究表明,预计未来 3 年,农业部门的就业人数将会减少,而建筑和房地产、纺织和服装以及手摇纺织机和手工艺品部门的就业人数将会增加(KPMG,2016)。
数据收集
在线上有几个数据集可用于研究印度的失业情况。附录中提供了详细的清单。然而,大多数(如果不是全部的话)数据集都是原始数据的集合。我们在城市级别和个人级别搜索粒度数据,并选择了以下两个数据集:
market line Advantage 提供的城市数据(2017 年)
这提供了 2000-2011 年印度 142 个城市的年度数据,分布在 5 个主要类别下的 47236 个观察值和 339 个属性中。教育三。住户四。国内生产总值/GVA 与就业
该数据库结构良好,提供不同单位的特征(例如以当地货币和美元),以及与失业有关的变量(如通货膨胀、平均家庭规模、平均家庭支出等)。)然而,该数据集不包括村庄和城镇,因此印度农村地区被遗漏。此外,由于数据是在城市一级汇总的,因此它不提供家庭一级(如家庭收入)或个人一级(性别、学历、年收入等)的人口统计数据。)为此,我们转向第二个数据集。
第五次就业失业调查(劳动局,2019)
我们直接从劳动和就业部(印度政府)获得了这个数据集。它涉及政府 2015 年 4 月至 12 月在 36 个邦和中央直辖区开展的调查。最初的调查采用多阶段分层随机抽样方法,覆盖了 150,000 多个家庭中的 700,000 多人。这比 MarketLine 数据集粒度更细,涵盖以下类别:I .个人的年龄和人口统计数据 ii。培训和教育细节。就业/失业期限。失业原因
然而,NSSO 在早期调查中使用的几个调查问题已被劳动局删除(包括宗教、土地所有权和婚姻状况),这些问题可能是我们研究的重要属性。此外,我们没有获得整个数据集,大约有 200,000 个观察结果被保留(详情见附录)。
我们在研究中使用了这两个数据集,以确定印度青年失业的原因。通过这样做,我们达成了一个商业理念,将在未来十年为 10,000 名年轻人提供每周至少 10 小时的有意义的工作。
在城市一级
MarketLine 提供了 141 个城市和 335 个属性的数据,总共有 47235 个观察值。每个观测都有 2000 年至 2011 年的实际数据,以及 2012 年至 2025 年的预测数据。这项研究仅考虑了 2000 年至 2011 年的实际数据。对数据进行了转换,以便每行显示给定城市和年份的所有 335 个属性。转换后的数据快照如下所示:
探索性数据分析
对 2000-2011 年进行了探索性数据分析。以下是分析得出的主要观察结果:
劳动力参与率在北部、东部和东北部各邦最低(用红色和橙色圆点表示),而在印度中部和南部最高(用绿色圆点表示);然而,自 2000 年以来,所有城市的失业率都大幅上升。
Net labour force participation rate in India (2000–2011)
农业、工业和服务业就业人数的增长显示,大多数城市的农业就业人数出现了负增长,而几乎所有城市的工业和服务业就业人数都出现了增长(绿点)。
Avg. annual growth in employment in Agriculture, Industry and Services in India (2000–2011)
平均家庭规模与平均家庭收入呈负相关。家庭规模增加一名成员,家庭的平均收入就会减少大约。卢比在其他条件不变的情况下,一年 26000 英镑。红点表示在所述期间失业人数净增加,而绿点表示失业人数净减少。
然而,我们发现,家庭平均规模每增加一名成员,失业率就会下降 0.11%。这可能说明了家族企业在印度的盛行,在印度,整个家族生活和工作在一起。
综上所述,图表可能表明,随着家庭规模的增加,家庭成员找到工作的机会增加,但家庭人均收入实际上却在下降。2000 年至 2011 年间,古尔冈、勒克瑙、赖布尔和加济阿巴德的平均失业率增幅最高。尽管 IT 业蓬勃发展,古尔冈的年失业率仍在上升。2000 年至 2011 年间,Kholapur、Ratnagiri、Kannur 和孟买的失业率有所下降。
2000-2011 年失业增长和通货膨胀散点图显示了这两个变量之间的正相关关系。在其他因素不变的情况下,各城市的 CPI 指数每上升 1 个单位,失业率平均下降 1.82%。
失业与中等教育年增长率之间存在正相关关系。在其他条件不变的情况下,完成中等教育的人数每增加 1%,失业率就会平均增加 0.03%。
失业与公共服务部门的总增加值之间存在正相关关系。在其他条件不变的情况下,一个城市的 GVA(公共服务)每增加 1%,失业率就会增加 0.02%。
在 2000 年至 2011 年间,城市中的青年比例与平均失业率呈负相关。这可能表明,在其他条件不变的情况下,城市人口越年轻,找到工作的机会就越高。红点表示 2000 年至 2011 年间失业人数净增加,而绿点表示失业人数净减少。
使用上面的可视化,在 Tableau 中建立了一个仪表板,使市政当局能够获得一个城市中与失业相关的变量的快照。这些可以帮助城市官员实时做出决策,以提高城市的就业能力。仪表盘可以在这里查看:https://public.tableau.com/profile/vikram.devatha#!/
城市级数据的分析模型
基于上述分析,在 MarketLine 数据上部署了以下模型:
I .主成分分析以降低数据的维度(原始数据具有 335 个属性),随后是 K-均值聚类以对城市进行聚类
二。随机森林回归器,用于为后续模型确定决定城市失业水平的重要特征
三。多元线性回归确定州一级的失业原因。
四。确定导致年失业率上升(或下降)的因素的逻辑回归模型
动词 (verb 的缩写)分类模型(逻辑回归、决策树、随机森林和朴素贝叶斯分类器)试图根据相关属性的值对失业率是上升还是下降进行分类
经过上述迭代之后,我们最终确定了分析该数据集的以下方法
I .使用随机森林回归器获得重要属性(在原始数据的 337 个属性中)
二。应用多元线性回归来确定这些因素对失业率的影响
三。基于这些要素的年值,使用逻辑回归对失业率是增加还是减少进行分类。
变量选择
随机森林回归模型(使用朴素贝叶斯方法)擅长处理具有数字特征的表格数据,或者具有少于数百个类别的分类特征。与线性模型不同,随机森林可以捕捉要素和目标之间的非线性交互。它是一种附加模型,通过组合一系列基本模型的决策来进行预测。更正式地,我们可以将这类模型写成如下(TURI,2019):
g(x) = f0(x) + f1(x) + f2(x) + …
其中最终模型 g 是简单基本模型 f(i)的总和。这里,每个基本分类器是一个简单的决策树。这种使用多个模型来获得更好预测性能的广泛技术被称为“模型集成”。在随机森林中,所有基本模型都是使用不同的数据子样本独立构建的(维基百科,免费百科全书,2019 年)
对该数据使用随机森林回归器的目的是找到回归模型中可能使用的重要特征。虽然主成分分析给出了重要的组成部分,但它没有对特征进行排序。我们使用了 K-fold 交叉验证来确保无偏采样,并结合了所有这些重要特征,稍后将在回归模型中使用。
该模型适合以失业率(%)作为响应变量。共有 33 个变量作为重要属性出现(共有 337 个特征),如下所示:
然而,该模型存在多重共线性,年龄变量的变异膨胀系数> = 40,而所有其他变量的 VIF <= 2。因此,我们在去除年龄相关变量后重新拟合了模型。最终的回归输出如下所示。
上述特征用于构建一个模型来预测一个州的失业水平。在验证数据集上获得了 90%的准确率。然而,这些变量中的每一个对失业率的影响都不能通过这个模型得到。因此,我们转向回归模型。
模式 A:确定城市一级的失业原因
从随机森林回归因子中获得的特征以及从领域知识中获得的特征被用于以失业率为因变量的多元线性回归模型中。所有 141 个城市从 2000 年到 2011 年的数据都被选取,一个普通的最小二乘法被用来拟合模型。以下变量被证明是重要的:
该模型具有 74.90%的调整后 R 平方和显著的 F 统计量。这些系数表明,在所有其他变量保持不变的情况下,女性人数每增加 1 %,特定州的失业率平均下降 6%。我们还看到,在其他因素不变的情况下,完成进一步教育的比例每增加 1%,失业率平均增加 3%。这可能是由于大学数量的增长,但对劳动力需求的增长不足。
残差图显示它们是随机分布的。
有几个有影响的观察结果,但其中大多数似乎是真实的情况,我们选择不从我们的分析中删除它们。此外,残差遵循正态分布,但它是厚尾的,这证实了数据中存在异常值的事实。
模式 B:对城市一级的失业变化进行分类
年度失业率的变化可以表示为一个二元变量(其中 increase=1,decrease=0),并使用机器学习来分类给定城市是否会根据当前年份见证失业率的增加或减少。我们使用混淆矩阵来测试分类器的性能。精确度测量可以解释如下:
为了分类,我们测试了 4 种不同的机器学习算法。从训练和测试数据中获得的结果如下所示:
为了采取预防措施,分类器的灵敏度很重要。决策树和随机森林分类器的灵敏度最高(100%),可能需要更多数据来验证这些结果。对于剩余的两个分类器(逻辑回归和朴素贝叶斯),我们构建了 ROC 曲线以可视化它们的性能,如下所示。
上述分析是在 12 年的时间内,对城市一级的年度数据进行汇总。接下来,我们在个体层面对更精细的数据进行建模。
在个人层面
2015 年 4 月至 12 月,就业和劳工部(印度政府)在印度所有 36 个邦和中央直辖区进行了第五次就业和失业调查。最初的调查采用多阶段分层随机抽样方法,覆盖了 150,000 多个家庭中的 700,000 多人。这比 MarketLine 数据集粒度更细,涵盖以下类别:I .个人的年龄和人口统计数据 ii。培训和教育细节。就业/失业期限。失业原因
劳动局的原始数据分布在 5 个“区块”中,每个区块代表调查的一部分。该调查收集了超过 90 个此类属性的数据。为了便于解释,我们首先将调查标签替换为实际标签,这些标签来自调查问卷以及 NIC(中央统计组织,2008 年)和 NCO 代码列表(劳动和就业部,2004 年)。个人的唯一代码是由被调查个人的唯一家庭代码和序列号串联而成的。以此为主键,区块 1、2、3A、3B、4A 和 5A 在 Python 中进行了合并,以达到本研究的目的。
探索性数据分析
在 6 个月的时间里,总共对 156,564 户家庭进行了调查。从每个州选择的家庭数量遵循多阶段分层随机抽样方法。这里显示了每个州接受调查的家庭总数。
被调查家庭的平均规模如下所示,其中颜色代表 15 岁以上成员的人数(颜色越浅,人数越多)。
我们看到,在梅加拉亚邦和拉克沙威进行调查的家庭规模最大,而在安得拉邦和泰米尔纳德邦进行调查的家庭规模最小。调查中北方邦的家庭数量最多,其次是马哈拉施特拉邦。
不同社会群体中被调查者的平均年收入如下。各社会群体中所占比例最大的收入阶层已被突出显示,以供参考。
我们关注的是 15-35 岁年龄段的年轻人,我们对这个年龄段的数据进行了细分,并做了进一步的探索。这里显示了被调查青年的教育水平。
近似的 20-23%的被调查青年接受过中学和高中教育。接受调查的青年的职业培训经历如下。我们看到,那些拥有本科和研究生学位的人更有可能接受职业培训来增强他们的技能。
被调查青年的收入分布显示,在每个收入等级中,女性比男性获得的份额低,如下所示:
劳动局在调查中总共使用了 14 种工作状态。接受调查的青年的工作状况如下。
我们看到,大多数接受调查的青年“接受过教育”。超过 50%的被调查女性从事家务劳动。此外,5.27%的青年没有工作,被归类为"寻找工作"、"无法工作"和"其他"(如突出显示的)。在接受调查的求职青年中,63%是男性,37%是女性。这里显示了他们寻找工作的不同方式。
在接受调查的青年中,找不到工作的原因如下。在所有因为在家照顾孩子而没有工作的人中,57%是女性,42%是男性。此外,这些年轻人中有很大一部分有“艺术和人文”背景(65%),没有职业培训经验(82%)
该调查还询问了相关女青年不参加工作的情况,分为六类:家里有孩子、经济上富裕、附近没有工作、社会问题、交通不便和其他原因。下面给出了每个类别中的比例,以及用红色字体表示的重要比例。
使用个体层次数据的分析模型
基于上述分析,劳动局数据集上部署了以下模型:
I .基于他/她的人口统计因素将个人分类为失业或未失业的机器学习算法
二。确定青年失业原因的逻辑回归
三。多元线性回归确定找工作的货币效应
如果一个青年属于以下类别,我们认为他/她是失业的:没有工作但正在寻找工作和其他(乞讨、卖淫等)。)
在对青年进行子设置后,我们得到了一个涵盖 36 个邦和中央直辖区的 303549 名被调查者的数据集。根据上述分类,其中只有 14289 人失业,被调查者的失业率为 4.94%。这就变成了一个倾斜的数据集,为了分类算法的目的,我们用过采样来平衡这个数据集。这样,失业阶层增加到数据集的 24.699%。该数据集以 75:25 的比例分为训练数据集和测试数据集,生成的数据集将用于后续模型。
模式 A:将青年归类为失业者
为分类工作选择了以下属性:社会群体(落后阶层、在册阶层/部落、其他)、年龄(以年为单位,仅限 15-35 岁年龄组)、性别(男性、女性、变性者)、职业培训(二元变量,是/否)、技能提升(二元变量,是/否)、州(分类变量)、受教育年限(受教育年限)、失业(阶层变量(1 =失业,0 =就业)。
劳动局进行的调查认为教育是一个分类变量。我们将其转换为一个数值变量,如下所示:
我们训练了六种监督学习算法,用于根据人口统计因素对青年进行分类:1 .作为分类器的逻辑回归 2。k-最近邻 3。决策树 4。支持向量机。深度神经网络
在两个数据集(原始劳动局数据集,以及过采样数据集)上训练上述模型,并且在相应的测试数据集上验证它们的性能。为了评估性能,我们使用了混淆矩阵,其准确性度量如下:
我们主要关心的是正确地将一个给定的人归类为“失业”的敏感性度量。逻辑回归和支持向量机分类器在这一指标上表现最差,而决策树和深度神经网络分类器在验证数据集上表现出超过 98%的准确性。
上面获得的准确性度量表明,通过使用监督机器学习,政府可以仅根据他/她的人口统计因素将青年分类为失业。其中一些因素是个人无法控制的,但其他一些因素可以被影响以减少失业的机会。比如,通过提供职业培训计划、增加免费教育的年数、让年轻人更容易移民到其他州,政府或许能够合理地解决国内的年轻人失业问题。
与此同时,如果一个社会企业家知道哪些因素导致失业,那么他/她可能能够找到解决同一问题的商业方案。为此,我们求助于逻辑回归模型。
模式 B:导致青年失业的因素
我们定义了两个逻辑回归模型来确定失业的原因:
模型 1:失业~年龄+性别+学历+社会群体+ Up 技能+状态+ VT
模型二:失业~年龄+性别+学历+社会群体+ Up 技能+状态+ VT_Field
回归模型在原始数据集上运行(没有过采样),并进行相应的诊断。结果如下所示:
以上表明,两个模型都很好地拟合了 Hosmer 和 Lemeshow 拟合优度测试显示的数据。自变量之间也不存在多重共线性,因为两个模型中的最高方差通货膨胀系数分别为 4.14 和 4.3(Kassambara,2018)。模型 1 中一些系数的细节如下所示(所有状态变量都是无关紧要的变量):
因变量是用二元变量表示的“失业”。结果显示,在接受调查的青年(15-35 岁)中,在其他条件不变的情况下,随着年龄的增长,失业的可能性下降了 4%。它还显示,在其他因素保持不变的情况下,每受一年教育,失业的可能性就会降低 12%。
回归结果还表明,与没有接受过职业培训的青年参照类别相比,其他条件相同的情况下,接受过职业培训的青年失业几率降低了 91%。这表明政府可以更加重视与职业培训相关的计划,并确保更多的年轻人能够参与这些计划。我们稍后还会带着我们的商业理念重新审视这一点。
鉴于某些人口统计因素会影响青年的就业状况,我们使用多元线性回归模型来确定就业的货币效应。
模型 C:找工作的货币效应
我们定义了两个回归模型,如下所示。这两个模型都考虑了就业对个人年收入的货币效应。这两个模型的区别在于,模型 1 考虑了所有的就业类型,而在模型 2 中,就业状况被表示失业的二元变量所取代。
模型 1:个人平均收入~年龄+性别+受教育年限+社会群体+职业培训(Y/N) +国家+就业类型
模型二:个人平均收入~年龄+性别+受教育年限+社会群体+职业培训(Y/N) +国家+失业(Y/N)
回归模型在完整的数据集上运行,并进行相应的诊断。结果如下所示:
通过将不同的就业类型替换为二元变量(失业=1,就业=0),模型的 R 平方减小了。两种型号都通过了所有其他诊断测试。我们选择模型 1 进行进一步分析,因为它区分了不同的雇佣类型。该模型的一些系数的细节如下所示。
上述系数表明,在考虑其他变量后,平均而言,青年人的平均年收入每年增加 61 印度卢比。调查还显示,在其他条件不变的情况下,女性青年的平均年收入低于男性青年。考虑到受教育的年数,数据表明,在其他条件不变的情况下,个人平均年收入预计会增加 121 印度卢比。
在就业状况中,参考类别是“其他(乞丐、妓女等。)".这些系数表明,平均而言,在其他条件不变的情况下,从事任何一种有偿工作都会对个人的年均收入产生显著的积极影响。这些系数还表明,从事家务劳动、接受教育和寻找工作的人的年收入低于参照类别的人。在这个模型中不重要的两个类别是“食利者、养老金领取者”和“因残疾而无法工作”,这两个类别的年平均收入与参照类别相同。此外,自营职业类别的系数是所有就业类型中最高的,这表明,如果赋予失业青年经营自己的企业的权力,为他们寻找工作的任何商业解决方案都可能产生最大的影响。
状态变量的系数如下所示:
参考邦是德里;上述系数表明,在其他因素不变的情况下,德里接受调查的年轻人的年收入是全国最高的。因此,如果失业青年接受经营自己企业的培训,那么首都的青年将成为出售其商品/服务的可行市场。
社会企业的商业理念
对 MarketLine 数据的探索性数据分析显示,从 2000 年到 2011 年,与南部相比,印度北部的劳动力参与率一直在下降。此外,与服务业和工业相比,从事农业的人数正在迅速减少。这可能表明对商品和服务的需求不断增长(与农场和农产品相比),一个有利可图的商业想法将进入这个不断增长的市场。
同一数据集的回归模型显示,中等教育和失业之间存在负相关关系。第五次 EUS 数据集上的逻辑回归模型也证实了这一点,该模型表明,在其他一切保持不变的情况下,每接受一年正规教育,失业几率就会降低 12%。同一模型还显示,在其他条件相同的情况下,接受过职业培训的人失业的可能性平均低 91%。因此,教育和职业培训必须是任何试图解决失业问题的计划的一部分。因此,一项提供职业培训作为其模式一部分的商业倡议可以对该国失业的未充分就业的青年产生积极影响&。
此外,2011 年各城市的横截面显示,失业与公共服务部门的总增加值呈正相关(35.43%)。尽管该数据集仅涉及印度城市,但这种相关性表明,需要从公共服务转向解决失业问题的私人举措。
对劳动局数据集的探索性数据分析显示,0.08%的被调查青年是社会弃儿(“乞丐、妓女等”)).表中显示了各州接受调查的这一类别青年的比例。
在泰米尔纳德邦接受调查的年轻人中,超过 23%是乞丐、妓女等。其次是北方邦,超过 15%。有几个政府为这些青少年开办的康复中心,但质量审计发现,这些中心的标准很差,比监狱和拘留所还糟糕(Azad India Foundation,2019 年)。
Proportion of surveyed youth in the “Other (beggars, prostitutes, etc.)” category
与此同时,文献综述(毕马威,2016 年)表明,手摇纺织机和手工艺品行业正在增长。这是一个 4000 亿美元的行业,其中印度的市场份额不到 2%(印度 CSR 网络,2013)。该部门还拥有大量熟练技工,通过电子商务分销的成本较低。还有几项政府计划和举措旨在振兴这一部门(发展专员(手工业),2019 年)
基于以上所述,我们认为一个有价值的企业应该将手工业部门作为干预领域,将被社会排斥者作为劳动力的提供者。我们建议采用青年乞丐进行康复,并作为康复过程的一部分,由经验丰富的工匠训练精选的青年。那些出类拔萃的人可以得到指导,建立自己的微型企业,并在全球市场上销售他们的产品。还可以鼓励他们建立系统,通过直接或间接就业来雇用其他没有联系的青年。他们将需要指导来建立一个可持续发展的企业,并接受基本商业技能、小额融资和政府资助方面的培训。根据具体情况,还需要每 3 年对他们进行评估和技能提升。这种社会企业的成功可以通过生态系统中接触到的生命数量来衡量。
制定了一项财政计划,在未来十年将这一倡议扩大到 10000 名青年。我们的模型显示,该行业运营良好的企业可以在十年内产生超过 5 亿卢比的税前利润。该计划使多达 10 000 名青年得到康复、培训和参与。使用每个年轻人 10 万印度卢比销售额的保守估计,以及每销售一件商品给年轻人 70%的佣金,我们得出如下收入费用表。未来现金流的净现值(假设无风险利率为 10%)为 27.52 亿卢比。
结论
青年失业是当今印度的一个令人担忧的问题。快速城市化以及缓慢的就业增长率使失业成为一个需要积极干预的领域。
在这个项目中,我们使用文献综述和探索性数据分析研究了印度的青年失业问题,以了解该领域,使用机器学习算法来确定一个城市的失业率是上升还是下降,根据他/她的人口统计数据确定一个青年成员是否失业,然后使用回归模型来确定印度青年失业的原因,以及评估失业的货币影响。该分析首先在全市范围内进行(使用 MarketLine 城市优势数据集),然后在个人层面进行(使用第五次 EUS 调查数据集)。
根据调查结果,我们为手工业部门的一个社会企业制定了一项商业计划,该计划将帮助脱离社会的青年恢复正常生活,并为选定的青年提供职业培训,以复兴印度濒临消亡的手工业。在此过程中,我们致力于实现 3 个可持续发展目标,即没有贫困、教育和福利、体面的工作和经济增长。
当劳动局和 MarketLine City Advantage 提供新数据时,本项目中使用的模型可以重复使用。在对数据运行模型之前,需要对数据进行清理和预处理。此外,如果调查问卷更新,模型也需要相应调整。
Photo by Eric Ward on Unsplash
面临的挑战
在这个项目的过程中,我们使用了与统计分析、数据挖掘、业务基础、数据收集、文本分析、数据可视化和深度学习相关的工具和技术。我们面临的一些挑战:
MarketLine 数据集是免费提供的,但很小,而且是在城市一级汇总的。因此,我们不能用这个数据集来分析个人层面的失业情况。此外,该数据集仅提供了 11 年的实际数据(从 2000 年到 2011 年),这使得该数据集太小,无法用于预测。
-就业和劳工部没有与我们共享整个数据集,并扣留了 20 万次观察。拥有整个数据集将使模型更加精确。然而,我们假设提供的数据是被调查人群的随机样本,并据此进行。
-劳动局数据集很大,一些分类算法需要很长时间才能收敛(即 R 中的 SVM 算法
参考
Azad 印度基金会。(2019 年 1 月 1 日)。在印度乞讨*。2019 年 4 月 7 日检索,来自青年 Ki awa az:【https://www.youthkiawaaz.com/2008/04/beggary-in-india/ *
贝伦诉 m .案(2013/14)。欧洲失业统计分析。纽伦堡技术学校,乔治·西蒙·欧姆,纽伦堡。
贝伦·比列纳·玛丽亚(2013/14)。欧洲失业统计分析。纽伦堡技术学院,乔治·西蒙·欧姆,纽伦堡。**
BI 印度局。(2019 年 3 月 26 日)。ESIC 公布的就业数据显示,1 月份印度就业增长放缓 6.9%。检索于 2019 年 4 月 22 日,来自 Business India Insider:https://www . Business Insider . in/job-creation-in-India-slow-by-6-9-in-January-esic-payroll-data/articleshow/68574896 . CMS
BI 印度局。(2019 年 2 月 6 日)。印度的失业率如此之高,以至于超过 150 名 MBA 和工程学毕业生申请了一些环卫工作。检索于 2019 年 4 月 22 日,来自印度商业内幕
中央统计组织。(2008).国民经济行业分类(所有经济活动)。统计和方案执行部。新德里:印度政府。
发展专员(手工艺品)。(2019 年 3 月 20 日)。方案。(M. o. Textiles,生产商,&印度政府)2019 年 4 月 7 日从发展专员手工艺品处检索:【http://www.handicrafts.nic.in/】T2
经济时报。(2014 年 11 月 18 日)。印度拥有世界上最多的青年人口:联合国报告。(经济时报、印度时报)检索 2019 年 4 月 26 日,来自经济时报:https://Economic Times . India Times . com/news/politics-and-nation/India-has-world-maximum-youth-population-un-report/articleshow/45190294 . CMS
弗雷 C. B .和奥斯本,文学硕士(2013 年 9 月)。就业的未来:工作对计算机化有多敏感?https://www . Oxford Martin . ox . AC . uk .
手工艺品网(2019 年 1 月 1 日)。被认定为濒危的工艺品清单。2019 年 4 月检索,来自http://manifests . NIC . in/pdf/List _ Of _ Identified _ As _ Endangered _ craft . pdf
霍特奖。(2018).十周年挑战:为了我们,由美国青年失业。2019 年 4 月 23 日检索,霍特奖:http://www.hultprize.org/challenge/
印度企业社会责任网络。(2013 年 5 月 22 日)。印度衰落的遗产——农村工匠:报道。2019 . 04 . 07 检索自 IndiaCSR:https://IndiaCSR . in/the-decing-legacy-of-India-rural-artisans-report/
卡桑巴拉。(2018 年 3 月 11 日)。复共线性要领和 R 中的 VIF。检索于 2019 年 4 月 21 日,来自 STHDA —高通量数据分析的统计工具:http://www . sth da . com/English/articles/39-regression-model-diagnostics/160-multicollinearity-essentials-and-Vif-in-r/
凯迪亚公司。(2018 年 10 月 18 日)。科技改变印度未来工作的 5 种方式。检索于 2019 年 4 月 23 日,来自世界经济论坛:https://www . weforum . org/agenda/2018/10/five-ways-tech-can-transform-the-future-of-work-in-India/
毕马威。(2016 年 1 月 1 日)。毕马威环境扫描 2016。印度。检索自http://www . tsscindia . com/media/2565/KPMG-environmental-scan-report-2016 . pdf
劳动局。(2019 年 1 月)。第五次就业失业调查数据。印度昌迪加尔。
劳动局。(2016 年 9 月)。第五次年度就业-失业调查报告(2015-16)。劳动和就业部。昌迪加尔:印度政府。**
劳动局。(2016 年 9 月)。青年失业报告——就业情景第 2 卷。劳工部&就业,2015-16 年第五次年度就业失业调查。昌迪加尔:印度政府。
市场优势。(2017 年 6 月 1 日)。城市数据。 MarketLine 数据库。英国伦敦。
梅塔,P. (2019 年 1 月 1 日)。印度失业的主要原因。检索于 2019 年 2 月 14 日,来自经济学讨论:http://www . Economics Discussion . net/articles/main-causes-of-losing-in-India/2281
梅塔,P. (2019 年 1 月 1 日)。印度失业主要原因。检索于 2019 年 2 月 14 日,来自经济学讨论:http://www . Economics Discussion . net/articles/main-causes-of-losing-in-India/2281
劳动和就业部。(2019 年 3 月)。第 5 轮—附表 b2015 年年度就业-失业调查。印度政府。
劳动和就业部。(2004).n . c . o . 2004 的字母索引,带有 n . c . o . 1968 的职业名称和等效代码。印度政府。
米斯拉公司(2014 年 6 月 1 日)。估算印度经济增长的就业弹性。2019 年 4 月 22 日从印度储备银行检索:https://www.rbi.org.in/Scripts/PublicationsView.aspx?id=15763
经合组织。(2017).经合组织印度经济调查。经合组织。
皮卡雷利,S. (2017 年 10 月 6 日)。印度的劳动力正在增长——创造就业的速度如何跟上?2019 年 4 月 26 日检索,来自世界经济论坛:https://www . weforum . org/agenda/2017/10/India-work force-skills-training/
俄亥俄州鲁斯文市(2017 年 9 月 11 日)。如何在工作不景气的时候“驾驭印度”。检索 2019 年 02 月 14 日,来自 The Wire:https://The Wire . in/economy/skill-India-na rendra-modi-jobs-in-India-失业
开放学习学院。(2019 年 1 月 1 日)。失业的含义。(S. o. Learning,制片人,&德里大学)2019 年 4 月 23 日检索,来自经济:https://sol.du.ac.in/mod/book/view.php?id=1266&chapterid = 933
Thind,m &。(2013 年 7 月 2 日)。印度失业测量。(即服务,生产者)2019 年 4 月 23 日检索自 Arthpedia:http://www.arthapedia.in/index.php?title =印度失业测量
图里。(2019 年 1 月 1 日)。随机森林回归。2019 年 4 月 20 日检索,来自https://turi . com/learn/user guide/supervised-learning/random _ forest _ regression . html
维基百科,免费的百科全书。(2019 年 3 月 14 日)。合奏学习。2019 年 4 月 21 日检索,来自维基百科,免费百科:https://en.wikipedia.org/wiki/Ensemble_learning
数据来源
如果您有兴趣进一步探索这个主题,下面给出了一些数据来源。由于格式的限制,我们将此作为 2 个截图粘贴(并且 URL 将不可点击)
**
从机器学习中为您的企业创造价值的 6 个步骤
原文:https://towardsdatascience.com/https-medium-com-vishalmorde-6-steps-to-create-value-from-machine-learning-dfadef2b7ccb?source=collection_archive---------12-----------------------
This article was originally published in the December 2018 issue of CIOReview, a leading Technology publication (Image Source: Adobe Stock)
企业高管实现机器学习操作化和货币化的战略路线图
一千年后,当有人书写人类历史时,机器学习(ML)的出现将被誉为一个重要的里程碑。ML 是人工智能(AI)的一个分支,它使计算机能够在没有显式编程的情况下从数据中学习。今天,ML 已经成为从客户数据中释放价值的关键。网飞的电影推荐,脸书识别我们面部的能力,谷歌的自动驾驶汽车都是 ML 解决方案的早期例子。然而,人工智能和人工智能仍处于萌芽阶段,大多数行业领导者仍在努力消除宣传并为其业务设定正确的优先事项。考虑到这一创新的巨大潜力,以下步骤可以作为构建 ML 能力的战略路线图,帮助您的企业创造切实的价值。
第一步:为您的组织构建数据结构
尽管生活在数据驱动的经济中,我们并没有给予数据应有的尊重。只有在发生灾难性数据泄露时,数据才被视为资产;那么它就成了我们最有价值的财产!创建 data fabric 是部署 ML 解决方案的最关键步骤之一,data fabric 是一个生态系统,可以在整个企业范围内提供无缝的良好管理的数据集成。如果没有一个高效且设计良好的数据结构,有价值的数据将被困在孤岛中,永远无法得到最大程度的组织、民主化和货币化。没有这个基础,ML 将成为一个“垃圾进垃圾出”的练习,导致危险的不准确的决策,给客户带来不利的体验。
第二步:雇佣合适的人才
一个常见的 ML 人力资本策略是雇佣“独角兽”数据科学家,他们拥有博士学位、卓越的计算机编程技能、非凡的分析能力和卓越的商业头脑。现实中,根本不可能找到这些神话生物!它们被称为独角兽,因为它们确实是我们想象中的虚构物。从本质上来说,ML 是一项团队运动,是一个由领域专家、统计学家和数据工程师组成的跨职能团队,可以完成比三个独角兽数据科学家加起来还要多的事情。另一种常见的情况是只支持一种特定的算法,如 Xgboost(极端梯度推进算法)。重要的是雇佣数据科学家,他们将这些算法视为工具箱中的工具,而不是立即解决任何问题的魔药。引入合适的外部人才并创建内部人才管道是在整个企业内成功传播 ML 的必要前提。
第三步:创建 一个实验室环境
ML 是一个科学领域,科学发生在实验室里。成功和快速的原型开发需要能够访问所有企业数据资产的实验室环境、最先进的分析工具以及运行冠军挑战者测试的能力。有了这样的设置,跨职能团队可以快速地从定义业务问题转移到进行分析实验,并最终开发出一个“最不可爱”的挑战者 ML 模型,该模型具有更强的预测能力或更深的消费者洞察力。实验室环境允许团队进行大量的研究计划,从失败的实验中快速恢复,并最终确定对企业最有价值的 ML 应用。
第四步:实施成功的试点项目
一旦确定了成功的试点,下一个合乎逻辑的步骤就是将它们部署到面向客户的业务战略和运营中。这是橡胶接触路面的地方,不幸的是融化得非常快!使用不适当的技术基础设施,糟糕的软件工程实践,以及缺乏模型治理,甚至会将一个伟大的模型变成一场绝对的灾难。容器平台的出现使得将 ML 任务打包成标准化的单元用于开发、运输和部署成为可能。但是,这需要跨不同操作系统进行协调,同时保持最高的性能标准。这就是为什么在不久的将来,对数据工程师的需求可能会远远高于对数据科学家的需求。尽管如此,成功部署和实施少数关键的 ML 模型将为整个组织更广泛的部署建立必要的势头。
第五步:扩大规模以便在企业范围内采用
组织内的价值创造有不同的形式,但归根结底,都是为了让关键业务流程更好、更快或更便宜。每个业务主管都应该对他们的关键流程进行全面审计,并确定监督和非监督 ML 算法的潜在机会。一旦确定了潜在的应用程序列表,就应该根据增加的业务价值和潜在的客户利益来确定新计划的优先级。然而,有几个行业特定的约束条件在决定 ML 算法的选择时起着很大的作用。一旦确定了潜在的应用程序列表,就应该根据增加的业务价值和潜在的客户利益来确定新计划的优先级。然而,有几个行业特定的约束在决定 ML 算法的选择时起着很大的作用。例如,消费者金融法规对模型的可解释性设置了很高的门槛;因此,在应用人工神经网络等暗箱方法之前,银行需要非常小心。然而,这是一个活跃的研究领域,一些开源项目,如本地可解释的模型不可知解释(LIME ),正在行业中获得很大的吸引力。总的来说,在适当的商业环境中应用 ML 是至关重要的。
“本质上,所有的模型都是错误的,但有些是有用的”——乔治·考克斯,现代统计学之父
第六步:推动文化变革
最后,我们需要一种组织文化,这种文化包含了从经典统计学方法到现代 ML 方法论的根本转变。这种转变是由“持续学习”文化促成的,在这种文化中,团队被鼓励拥抱他们内心的“极客”,并通过学习新的编程语言(如 R 和 Python)和开源大数据框架(如 Apache Hadoop)来不断更新他们的技能。此外,执行领导团队应该通过在整个企业中健康地传播数据和知识来促进数据驱动的决策文化。
总之,随着 ML 的出现和运作,我们正在见证商业格局的巨大转变,以创建更具预测性的模型、更深入的消费者洞察和更好的客户体验。创建和执行 ML 战略路线图是释放重要商业价值的关键,有助于为您的企业发展长期竞争优势。
XGBoost 算法:愿她统治长久!
原文:https://towardsdatascience.com/https-medium-com-vishalmorde-xgboost-algorithm-long-she-may-rein-edd9f99be63d?source=collection_archive---------0-----------------------
Photo by Jared Subia on Unsplash
接管世界的机器学习算法的新女王…
(本文与 Venkat Anurag Setty 合著)
我仍然记得 15 年前我第一份工作的第一天。我刚刚完成研究生学业,加入了一家全球投资银行,担任分析师。第一天,我一直在整理领带,试图记住我学过的所有东西。与此同时,在内心深处,我怀疑自己是否适合企业界。感觉到我的焦虑,我的老板笑着说:
“放心吧!你唯一需要知道的就是回归建模!”
我记得我自己想,“我得到了这个!”。我知道回归建模;线性和逻辑回归。我的老板是对的。在我任职期间,我专门建立了基于回归的统计模型。我不是一个人。事实上,在那个时候,回归建模是预测分析中无可争议的女王。快进十五年,回归建模的时代结束了。老皇后已经去世了。有着时髦名字的新女王万岁;XGBoost 或者极限梯度提升!
XGBoost 是什么?
XGBoost 是一种基于决策树的集成机器学习算法,使用了梯度提升框架。在涉及非结构化数据(图像、文本等)的预测问题中。)人工神经网络往往优于所有其他算法或框架。然而,当涉及到中小型结构化/表格数据时,基于决策树的算法目前被认为是同类最佳的。请参见下图,了解这些年来基于树的算法的演变。
Evolution of XGBoost Algorithm from Decision Trees
XGBoost 算法是作为华盛顿大学的一个研究项目开发的。陈天琦和卡洛斯·盖斯特林在 2016 年 SIGKDD 大会上发表了他们的论文,并在机器学习领域引起了轰动。自推出以来,该算法不仅赢得了众多 Kaggle 比赛,还成为了几个尖端行业应用的驱动力。因此,有一个强大的数据科学家社区为 XGBoost 开源项目做出了贡献,大约有 350 名贡献者,在 GitHub 上有大约 3,600 次提交。该算法在以下方面与众不同:
- 应用广泛:可用于解决回归、分类、排名、用户自定义预测问题。
- 可移植性:可以在 Windows、Linux 和 OS X 上流畅运行。
- 语言:支持所有主要的编程语言,包括 C++、Python、R、Java、Scala 和 Julia。
- 云集成:支持 AWS、Azure 和 Yarn 集群,可以与 Flink、Spark 和其他生态系统很好地协作。
如何为 XGBoost 建立一个直觉?
决策树,以其最简单的形式,是易于可视化和相当容易解释的算法,但为下一代基于树的算法建立直觉可能有点棘手。下面是一个简单的类比,可以更好地理解基于树的算法的发展。
Photo by rawpixel on Unsplash
假设你是一名招聘经理,正在面试几名资质优秀的候选人。基于树的算法进化的每一步都可以被看作是面试过程的一个版本。
- 每个招聘经理都有一套标准,比如教育水平、工作经验、面试表现。决策树类似于招聘经理根据自己的标准面试候选人。
- 装袋:现在想象一下,不再只有一个面试官,而是有一个面试小组,每个面试官都有投票权。Bagging 或 bootstrap 聚合涉及通过民主投票过程将所有面试官的意见结合起来以作出最终决定。
- 随机森林:这是一种基于 bagging 的算法,有一个关键的区别,其中只有一部分特征是随机选择的。换句话说,每个面试者将只测试被面试者的某些随机选择的资格(例如测试编程技能的技术面试和评估非技术技能的行为面试)。
- 推进:这是另一种方法,每位面试官根据前一位面试官的反馈改变评估标准。这通过部署一个更动态的评估过程来“提高”面试过程的效率。
- 梯度提升:梯度提升的一种特殊情况,通过梯度下降算法将误差降至最低,例如,战略咨询公司利用案例面试淘汰不合格的候选人。
- XGBoost :把 XGBoost 想象成“类固醇”上的梯度增强(嗯,它被称为“极端梯度增强”是有原因的!).它是软件和硬件优化技术的完美结合,能够在最短的时间内使用更少的计算资源产生卓越的结果。
XGBoost 为什么表现这么好?
XGBoost 和 Gradient Boosting Machines(GBM)都是系综树方法,它们使用梯度下降架构来应用增强弱学习器的原理。然而,XGBoost 通过系统优化和算法增强改进了基本 GBM 框架。
How XGBoost optimizes standard GBM algorithm
系统优化:
- 并行化 : XGBoost 使用并行化实现来处理顺序树构建的过程。由于用于构建基础学习者的循环的可互换性质,这是可能的;枚举树的叶节点的外部循环,以及计算特征的第二个内部循环。这种循环嵌套限制了并行化,因为如果不完成内循环(对两者的计算要求更高),外循环就无法启动。因此,为了提高运行时间,通过全局扫描所有实例进行初始化,并使用并行线程进行排序,从而交换循环的顺序。这种切换通过抵消计算中的任何并行化开销来提高算法性能。
- 树剪枝:GBM 框架内树分裂的停止准则本质上是贪婪的,依赖于分裂点的负损失准则。XGBoost 首先使用指定的“max_depth”参数而不是 criterion,并开始向后修剪树。这种“深度优先”的方法显著提高了计算性能。
- 硬件优化:该算法旨在有效利用硬件资源。这是通过在每个线程中分配内部缓冲区来存储梯度统计数据的缓存感知来实现的。诸如“核外”计算的进一步增强优化了可用磁盘空间,同时处理了不适合内存的大数据帧。
算法增强:
- 正则化:通过套索(L1)和山脊(L2) 正则化来惩罚更复杂的模型,防止过度拟合。
- 稀疏意识 : XGBoost 通过根据训练损失自动“学习”最佳缺失值,自然地承认输入的稀疏特征,并更有效地处理数据中不同类型的稀疏模式。
- 加权分位数草图: XGBoost 采用分布式加权分位数草图算法在加权数据集之间有效地寻找最优分割点。
- 交叉验证:该算法在每次迭代中都有内置的交叉验证方法,这样就不需要显式地对这种搜索进行编程,也不需要指定单次运行所需的 boosting 迭代的确切次数。
证据在哪里?
我们使用 Scikit-learn 的' Make_Classification '数据包创建了一个包含 20 个特征(2 个信息性特征和 2 个冗余特征)的 100 万个数据点的随机样本。我们测试了几种算法,如逻辑回归、随机森林、标准梯度提升和 XGBoost。
XGBoost vs. Other ML Algorithms using SKLearn’s Make_Classification Dataset
如上图所示,与其他算法相比,XGBoost 模型具有预测性能和处理时间的最佳组合。其他严格的基准测试研究也产生了类似的结果。难怪 XGBoost 在最近的数据科学竞赛中被广泛使用。
“有疑问时,使用 XGBoost”——欧文·张,Kaggle 上的 Avito 上下文广告点击预测竞赛的获胜者
那么我们应该一直只使用 XGBoost 吗?
当谈到机器学习(甚至是生活)时,没有免费的午餐。作为数据科学家,我们必须测试手头数据的所有可能算法,以确定冠军算法。此外,选择正确的算法是不够的。我们还必须通过调整超参数为数据集选择正确的算法配置。此外,在选择获胜算法时,还有其他几个考虑因素,如计算复杂性、可解释性和实现的容易程度。这正是机器学习开始从科学走向艺术的地方,但老实说,这就是奇迹发生的地方!
未来会怎样?
机器学习是一个非常活跃的研究领域,已经有几个可行的 XGBoost 替代方案。微软研究院最近发布了 LightGBM 渐变提升框架,显示出巨大的潜力。由 Yandex Technology 开发的 CatBoost 已经交付了令人印象深刻的基准测试结果。我们有一个更好的模型框架,在预测性能、灵活性、可解释性和实用性方面击败 XGBoost,这只是时间问题。然而,在一个强大的挑战者出现之前,XGBoost 将继续统治机器学习世界!
请在下面给我留下你的评论。非常感谢文卡特·阿努拉格·塞特与我合作撰写这篇文章。
创建更可靠的网络爬虫的 5 个技巧
原文:https://towardsdatascience.com/https-towardsdatascience-com-5-tips-to-create-a-more-reliable-web-crawler-3efb6878f8db?source=collection_archive---------6-----------------------
提高你的网络爬虫的效率!
W 当我在抓取网站时,网络爬虫被网站屏蔽可以说是最讨厌的情况。要成为真正的网络爬虫高手,你不仅要能够快速编写 XPath 或 CSS 选择器,而且你如何设计你的爬虫也很重要,尤其是从长远来看。
在我网络爬行旅程的第一年,我总是专注于如何抓取一个网站。能够搜集数据,清理和组织它,这个成就已经可以让我的一天。在爬越来越多的网站后,我发现有4重要元素是建立一个伟大的网络爬虫最重要的。
如何确定一个伟大的网络爬虫?您可能需要考虑以下几点:
爬虫的速度
你能在有限的时间内收集数据吗?
收集的数据的完整性
你能收集到所有你感兴趣的数据吗?
收集的数据的准确性
你如何确保你搜集的数据是准确的?
网络爬虫的可扩展性
当网站数量增加时,你能调整网络爬虫吗?
为了回答以上所有的问题,我将分享一些可以帮助你建立一个伟大的网络爬虫的技巧。
提示#1 减少你需要请求网页的次数。
使用一个 web 抓取框架: Selenium 为例。如果我们要刮这个网站:https://www.yellowpages.com.sg/category/cleaning-services
比方说,我们想要获得公司地址和描述的数据。所以,对于 Selenium,我们可能会使用**driver.findElement**
两次到分别检索地址和描述。更好的方法是使用驱动程序下载页面源并使用 BeautifulSoup 提取你需要的数据。总之,点击网站一次,而不是两次,这样不容易被发现!
另一种情况是,当我们在使用**WebDriverWait**
( 驱动、超时、 poll_frequency=0.5 、 ignored_exceptions=None )等待页面满载时,记得将**poll_frequency**
(调用之间的睡眠间隔)设置为一个较高的值,以最大限度地减少向网页发出请求的频率。更多详情可以通过这个官方文档阅读!
技巧#2 一旦擦除一条记录,就将数据写入 CSV
以前当我抓取网站时,我将只输出一次记录——当所有记录都被抓取时。然而,这种方法可能不是完成任务的最聪明的方式。
取而代之的一种方法是,在你抓取了一个记录之后,你需要写入这个文件,这样当问题发生时(例如你的计算机停止运行,或者你的程序因为发生错误而停止运行),你可以从发生问题的网站开始,重新启动你的爬虫/抓取器:)
对于我来说,我通常使用 python writerow 函数将记录写入输出文件,这样我就可以从网站开始,如果我的 scraper 停止,我就不需要重新抓取所有以前废弃的数据。
技巧 3:减少被网站屏蔽的次数
有相当多的方法来实现这些东西,这样爬行器或抓取器就不会被阻塞,但是一个好的爬行框架会减少你实现它们的工作量。
我使用的主要库是 Request、Scrapy 或 Selenium。Scrapy 和 Selenium 的对比可以参考这个链接。我更喜欢 Scrapy ,因为它已经实现了一些减少被网站屏蔽次数的方法。
- 服从 robots.txt,在刮网站之前一定要检查文件。
- 使用下载延迟或自动节流机制,已经存在于 Scrapy 框架,使您的刮刀/爬虫较慢。
- 最好的方法是轮换一些 IP 和用户代理来伪装你的请求。如果你正在寻找任何代理服务,你可以看看这个服务因为他们提供了大量的代理供你轮换。
- 如果你使用 scrapy-splash 或 selenium,随机点击和滚动确实有助于模仿人类行为。
有关更多信息,请参考以下链接
- https://www . scrape hero . com/how-to-prevent-getting-black-while-scraping/
提示 4 通过 API 检索数据
比如 twitter。你可以抓取网站或者使用他们的 API 。通过 API 访问他们的数据肯定会让您的生活变得更加轻松,而不是经历重重障碍!
技巧 5 抓取谷歌缓存的网站,而不是原来的网站
以https://www.investing.com/为例:
您可以访问缓存版本,如下所示:
您将无法通过抓取缓存的网站而不是网站来获取最新数据。然而,如果网站的数据只在几周甚至几个月内发生变化,抓取谷歌缓存网站将是一个明智得多的选择。
有关 google cache 的更多信息,您可以查看以下网站:
- https://blog.hubspot.com/marketing/google-cache
关于作者
低卫红是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。
他提供爬行服务,能够为你提供你所需要的准确和干净的数据。你可以访问 这个网站 查看他的作品集,也可以联系他获取抓取服务。
你可以在 LinkedIn 和 Medium 上和他联系。
[## ●伟鸿-中等
在媒体上阅读低纬鸿的作品。数据科学家|网络搜集服务:http://datainfinite.mystrikingly.com/…
medium.com](https://medium.com/@lowweihong?source=post_page-----e85d1753fb4b----------------------)
多样性抽样备忘单
原文:https://towardsdatascience.com/https-towardsdatascience-com-diversity-sampling-cheatsheet-32619693c304?source=collection_archive---------15-----------------------
当您构建受监督的机器学习模型时,您希望确保它尽可能覆盖一组不同的数据和真实世界的人口统计数据。确保你的模型有多样化的训练数据的方法是一种叫做多样化抽样的主动学习。
备忘单中涵盖的四种多样性采样类型是:
- 基于模型的异常值:对逻辑和隐藏层中的低激活进行采样,以找到由于缺乏信息而使模型混乱的项目
- 基于聚类的采样:使用无监督的机器学习从数据的特征空间中所有有意义的趋势中采样数据
- 代表性采样:相对于当前训练数据,最能代表模型目标领域的采样项目
- 现实世界的多样性:当试图支持现实世界的多样性时,使用增加公平性的采样策略
本文分享了实现分集采样的四种常用方法的备忘单。下次当您需要决定如何为一个需要支持不同用例的模型创建训练数据时,请使用它作为参考!
Voice technologies supporting different variants of a language
在之前的一篇文章中,我分享了一份不确定性采样的备忘单。不确定性抽样是看你的模型在哪里混淆了。在机器学习的知识象限中,不确定性采样是您的“已知未知”。也就是说,您知道您的模型由于低置信度预测而变得混乱。多样性抽样是你的“未知的未知”,你的模型知识中的差距不是那么明显:
不用说,很难发现你不知道的东西,所以分集采样的算法比不确定性采样的算法更具探索性和多样性。这变得更加困难,因为你的模型需要知道的往往是一个不断变化的世界中的移动目标。正如人类每天都在学习新单词、新对象和新行为以应对不断变化的环境一样,大多数机器学习算法也部署在不断变化的环境中。
一个需要多样性采样的例子
想象一下,你的工作是建立一个语音助手,它可以为尽可能多的用户带来成功。你公司的领导希望你的机器学习算法比任何一个人都拥有更广泛的知识:一个典型的英语使用者从英语的 20 万个单词中知道大约 4 万个单词,这只占语言的 20%,但你的模型应该有接近 100%的覆盖率。你有许多未标记的录音可以标记,但人们使用的一些词非常罕见。如果你随机抽样录音,那么你会错过这些罕见的单词。因此,您需要明确地尝试获取涵盖尽可能多的不同单词的训练数据。你可能还想知道当人们和他们的语音助手说话时最常用的词是什么,并从中抽取更多的例子。
你也担心人口的多样性。这些录音主要来自一种性别和居住在少数地方的人,这意味着产生的机器学习模型可能对该性别更准确,而且只对某些口音更准确。因此,您希望尽可能公平地从不同的人口统计数据中进行采样,并使模型对所有人口统计数据都同样准确。
最后,有许多人不会说英语,他们想要一个语音助手,但你只有很少的非英语数据。所以,你可能不得不坦诚面对语言多样性的限制。
这显然是一个比简单地知道你的模型何时被混淆更困难的问题,这就是为什么多样性抽样的解决方案本身比不确定性抽样的解决方案在算法上更多样化。这也是为什么我可以将不确定性采样的实际代码和方程压缩在一页的备忘单中,但这对于多样性采样是不可能的。
下载代码和备忘单:
您可以在此下载 diversity_sampling.py 文件中的代码:
[## rmunro/pytorch_active_learning
用于将新闻标题分类为与灾难相关或无关的人在回路机器学习系统的代码…
github.com](https://github.com/rmunro/pytorch_active_learning)
该代码包含使用 PyTorch 的所有算法的实现,以及对灾难响应相关文本进行分类的用例。这是我最喜欢的一个用例,因为我从事灾难响应的时间几乎和我从事机器学习的时间一样长。
您可以在此下载 PDF 版本的备忘单:
http://www . Robert Munro . com/Diversity _ Sampling _ cheat sheet . pdf
另见最近的这篇伟大文章:神经网络知道它不知道的时候吗?蒂瓦达·卡丹
这份备忘单摘自我的书《人在回路中的机器学习:
https://www . manning . com/books/human-in-the-loop-machine-learning
有关每种方法的更多细节以及比图像和文档级标记更复杂的问题,如预测文本序列和图像的语义分割,请参见该书。多样性的原理是一样的,但是多样性的计算会有所不同。
我的书的章节已经出版了——多样性抽样章节已经出版了,下一个将是高级主动学习章节。我会一边走一边分享摘录!
罗伯特·芒罗
2019 年 9 月
端到端食谱烹饪分类
原文:https://towardsdatascience.com/https-towardsdatascience-com-end-to-end-recipe-cuisine-classification-e97f4ac22104?source=collection_archive---------12-----------------------
AWS Lambda 函数,BeautifulSoup,Python,Sci-Kit Learn
Preparing Breakfast photo credit: Mark Weins @ https://migrationology.com/pakistan-travel-guide/
谁应该读这篇文章?
如果您有兴趣从零开始了解机器学习系统的高级概述,包括:
—数据收集(网络搜集)
—处理和清理数据
—建模、培训和测试
—部署为云服务
—重新运行系统、获取任何新配方以及重新训练模型的计划
介绍
因为好奇,成长和学习的愿望——我决定从头开始构建一个 ML 系统,涵盖从数据收集和清理、建模、培训和测试,以及作为云服务部署的所有内容。也就是现实生活中适用的东西。
我已经找到了关于各部分的有用文章,但是将信息拼凑在一起,从导师和同事那里获得进一步的指导,以及阅读文档来填补知识空白,这些都需要时间。我决定记录我的过程,希望它能帮助其他人在谷歌上搜索“如何做”我的文章可以解决的事情。
本文不是我所使用的工具的教程,而是描述我如何构建这个系统,以及我在这个过程中所做的决定,用最低的成本和最简单的方法来完成工作。
概观
整个项目分为两部分:
- AWS 管道
- 建模工作和结果
所有的代码都托管在我的 GitHub repo 这里。
即将发布的第三部分将介绍如何使用 AWS API 向序列化模型提交输入数据并发回响应(预测)。
为什么食谱美食分类?
Mark Weins @ https://migrationology.com/pakistan-travel-guide/
为什么我选择建立一个美食分类器?我喜欢食物。从小到大,我既品尝过巴基斯坦北部的美食,也品尝过我生活过的美国城市的美食。我一直喜欢尝试来自美国以外的其他国家的朋友和同事的其他美食,当我去旅行时,我已经接触到了。随着时间的推移,全球美食是如何起源和发展的。我注意到成分和方法的区别和重叠,以及它是如何基于人口迁移和殖民主义而融合的。今天,所有类型的食物都有信息,人们几乎可以尝试任何一种食物,而不必去旅行。
Spices on Plate With Knife — Creative Commons Images https://www.pexels.com/
这方面的商业应用可用于节省人类在标记错误分类的食谱、为数据库或档案分类新食谱方面的审核时间。
使用 AWS Lambda 函数实现无服务器
AWS Lambda 函数等无服务器架构流行的原因之一是不需要在云端管理服务器。用亚马逊的话说:
AWS Lambda 是一个无服务器计算服务,它运行您的代码来响应事件,并自动为您管理底层计算资源。AWS Lambda 可以自动运行代码来响应多个事件 …
我使用的组件是写入和检索数据的 S3 桶、分发 web 抓取的简单服务队列(SQS)和处理模型端点的 API 网关。
注意:对于权限,我将我的 lambda 函数设置为对我使用的 S3 桶和 SQS 有完全访问权。出于安全原因,可以也应该设置一个精确的权限类型列表,以避免事故,尤其是在有更多移动部件的设置中。
配方数据收集
我的目标是对几个菜系进行分类,并且来自一个有大量食谱的网站。我最终选择了allrecipes.com,因为它很受欢迎,而且在食谱公布前会有一个审核检查来确认其有效性。如果没有提及,可能会有偏见问题,如菜肴中主菜类型的分布,以及拼写错误、不真实或放错地方的菜肴配方等问题。业务问题是,it 需要预测的数据是什么样的?训练数据是否反映了这一点?我想简单地开始——我能用我能得到的做什么。
allrecipes.com world cuisine page
每个美食网址滚动时动态生成单独的食谱链接,这些链接是我需要刮。我想把我选择的 6 个菜系的抓取任务分配到单独的 lambda 调用中,并且在 900 秒的限制内。为了实现这一点,我使用了 lambda 函数, queue_cuisine_URLs.py 将 6 个美食 URL 发送到一个简单的服务队列(SQS), cuisine_URLs ,这触发了 lambda 函数, scrape_html_links.py 。它首先通过获取 S3 桶 recipe-url-page-numbers、中的任何对象来检查是否已经抓取了某个菜系,否则从第 1 页开始抓取食谱 url,并将它们放入 recipe-scraped-data S3 桶中。
AWS Architecture Flowchart
然后[parse_direct_URLs.py](https://github.com/kulsoom-abdullah/kulsoom-abdullah.github.io/blob/master/AWS-lambda-implementation/src/parse_direct_URLs.py)
Lambda 函数从配方抓取数据 S3 桶中抓取配方文本,并将它们放入配方-全部接收数据 S3 桶中。我从每个配方中解析的字段是:
- 身份证明(identification)
- 标题
- 描述
- 等级
- 复习
- 佐料
我决定的配方文本解析规则和模型管道(在第 2 节中描述)受 Sagemaker 支持,并且不需要创建容器来使用我的代码。我用 Python 代码创建了一个 Sagemaker notebook 实例来解析菜谱、向量化和训练模型。模型管线被酸洗(序列化)并保存到 S3 桶中。
当事件触发按其常规时间表(每周)发生时,整个流程重新开始,获取任何新的配方,并重新训练模型。数据的规模非常小,模型足够简单,因此我不需要担心训练数据的存储问题、对整个训练数据的子集进行采样,或者对数据进行训练所需的时间。
进行中——使用 S3 的静态网页为模型提供服务,接收用户输入的食谱,转到 AWS API,输入到模型中,并获得预测结果。这篇博文将会被编辑,第二部分将会发表。
建模工作
我想回答的一些问题是:
- 仅用配料就能正确地将菜谱从 6 种不同的菜系中分类吗?
- 我能对每一类做得多好,而不仅仅是所有类的平均准确度?
- 是否有必要收集更多的训练数据,或者我是否可以使用其他方法来解决这个问题?
二元情况
为了开始并找出是否值得推进这个项目,我从二进制案例开始。
意大利和印度——截然不同的两极?
第一次尝试将使用印度和意大利食谱,提出预处理成分列表的规则,并尝试一个简单的 BagofWords 分类模型。我从意大利菜和印度菜开始,因为它们似乎是一个简单问题的对比菜系,而且这些菜系的食谱数量是最多的。
解析文本规则
—重量和度量
我认为,重量和度量是那种不会给模型增加价值的词(除非我将数量作为一个特征,而不仅仅是成分词)。以下是成分列表的一个示例:
- 1 汤匙植物油
- 1/4 杯白糖
- 1/4 茶匙盐
- 两杯万能面粉
- 2/3 杯水
结果,这留下了这些成分名称:,植物油,白糖,盐,面粉,和水,因此过滤。
—数据泄漏
在检查这些成分时,我发现了可能会泄露数据的单词,并将它们添加到我的过滤列表中:“意大利风格”、“法国风格”、“泰国风格”、“中国风格”、“墨西哥风格”、“西班牙风格”、“印度风格”、“意大利风格”
—词汇化
另外,我只做了词条整理,没有选择词干。这是为了让我更容易理解成分的重要性,如果我认不出这个词,就不必回头去查这个没有成分的词。例如,“1 片朝鲜蓟”,我想要的是朝鲜蓟,而不是带茎的结果 朝鲜蓟。这样做并没有增加不同单词的数量。
—其余的
那还剩下很多其他的词。有先进的 NLP 技术来识别单词的实体,这将计算单词是成分的概率,而其余的是成分单词周围的度量、纹理、动作和其他类型的单词。简单地打印出最常用的单词,并目测哪些单词没有用添加到过滤规则中,结果很好,并且只有相对较少的一组独特的单词需要向量化,我采用了这种方法。另一个原因是这样做也节省了很多时间。
这些最终的成分名称使用 scikit-learn 中的计数矢量器库转换成来自训练集的单词矩阵。
类别计数
Count of Indian and Italian cuisines
意大利食谱比印度食谱多 3 倍多(2520 比 787)。一个 ML 模型学习什么是印度的数据够吗?ML 会比 76%更好吗(一个虚拟分类器,每个食谱都被归类为意大利菜)
多项式朴素贝叶斯
使用简单快速的多项朴素贝叶斯方法在训练集和测试集上得到了两种菜系几乎“完美”的 f1 加权分数。三重分层交叉验证的得分是一致的:
- 平均训练分数:0.986
- 平均测试分数:0.984
因为训练和测试分数几乎相等,所以过度拟合不是问题。因为训练分数不是完美的 1,所以我们训练不足。为了减少欠拟合从而增加训练分数,选项是增加模型复杂度或使用更复杂的模型。未来的工作可以集中在使用更复杂的模型,如随机森林。我在这里停下来,因为我对这个分数很满意,并继续进行多类案例。
多类案件
作品在这个 Jupyter 笔记本里。这 6 个班级是中国人、法国人、印度人、意大利人、墨西哥人和泰国人。最终结果在下面的汇总表中。
相关著作
我发现的一些基于成分文本分析的食谱烹饪分类的相关工作与我的工作有相似的发现。他们都没有一个平衡的类数据集。这个团队由于其庞大的训练集,在逻辑回归方面取得了最好的结果。他们发现,对实例规模较小的类进行上采样不会产生更好的结果。这个团队使用随机森林,在训练集上比回归有更好的训练分数,但由于测试结果更差而过度拟合。他们对 39,774 个食谱的准确率为 77.87%。两个团队都不报告每种菜系的单项得分,而是报告所有菜系的总体准确度。
初步分析
我发现使用二元模型给了整体分数一些提升,使用计数矢量器相对于 TFIDF 有更好的结果。基于相关的工作成果和我对某些菜系的专业知识,这是意料之中的。(第 4 页,共页)本文解释了为什么 tf idf 在食谱分类问题上比计数矢量器差。)由于这些结果,我修改了我的parse_recipes
函数,将有用的两个单词成分考虑到文档字符串中,并使用 BagofWords。
随机森林过拟合数据,由于数据的增加,逻辑回归比多项式朴素贝叶斯具有更好的结果。我还通过实现每个模型并查看混淆矩阵来检查 F1 分数。结果如下,选择的型号和代码留在 Jupyter 笔记本中。
Initial results
最佳模型性能是具有计数矢量化的逻辑回归,其平均测试分数为 0.870,训练分数为 0.997。我开始更详细地分析这个模型。
逻辑回归
随着数据量的增长,逻辑回归比朴素贝叶斯表现更好。对于配方数据集也是如此。查看每个菜系的个人得分,有过度拟合的情况,不清楚阶级不平衡是否是一个问题。例如,总共有 75 种墨西哥食谱的 F1 得分 = 为 0.73,而有 387 种法国食谱的 F1 得分为 0 。 63 。
Logistic Regression train/test confusion matrix heat maps
一些观察结果:
- 法语通常被误认为是意大利语
- 墨西哥人最容易被误认为意大利人
- 泰语被误归类为汉语,然后是印度语。
- 墨西哥作为意大利有点出乎意料,但我可以看到为什么一些印刷案件。
—一个墨西哥食谱和意大利食谱一样的例子:
梅子牛至鱼汤香蕉大蒜番茄肉汤黄油梅子番茄洋葱橄榄油黑胡椒马槟榔橄榄海湾盐油胡椒白鱼腌绿橄榄肉桂
训练集的分数高于测试,我试图处理这种过度拟合和可能的类不平衡贡献。
损失函数中的类权重
[class_weight='balanced'](https://chrisalbon.com/machine_learning/logistic_regression/handling_imbalanced_classes_in_logistic_regression/)
参数将与它们在 sci-kit learn 逻辑回归类中的频率成反比地对类进行加权。这给出了更高的 F1 平均训练分数 0.997 和测试分数 0.892。在没有班级加权损失的情况下,个别班级的表现有所改善。
Logistic Regression (class weighted loss) train/test confusion matrix heat maps
过采样和欠采样
我使用了一个名为不平衡学习的 Python 包来实现过采样和欠采样,并找出这对美食的评分有多大帮助。
Logistic Regression (oversampling) train/test confusion matrix heat maps
Logistic Regression (undersampling) train/test confusion matrix heat maps
相比之下,过采样除了降低墨西哥分数和法国分数之外,并没有产生太大的影响。F1 训练的总得分为 1.0,测试得分为 0.89。欠采样表现最差,训练 F1 得分为 0.77,测试 F1 得分为 0.75
卡方检验 (χ)
最后,对成分特征使用χ检验并选择前 K 个显著特征是处理训练集过拟合的另一种方法。训练 F1 得分为 0.934,测试 F1 得分为 0.866。与类加权损失函数逻辑回归等其他模型相比,训练分数略有下降,测试分数没有提高。
Logistic Regression (χ² 600 best) train/test confusion matrix heat maps
以下是根据类别频率按 chi2 排序的前 10 个成分词:
- 鱼:1897.8449503573233
[('泰国',48),('中国',8),('印度',6),('法国',5),('意大利',4),('墨西哥',1)] - 孜然:1575.1841574113994
[('印度',275),('意大利',16),('墨西哥',9),('泰国',6),('中国',1),('法国',1)] - 外壳:138.64852859006
[('墨西哥',12),('印度',3)] - 马萨拉:146 页,146 页,147 页,147 页,147 页,148 页,148 页,146 页,147 页,146 页,146 页,146 页,146 页,146 页,146 页,147 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,146 页,147 页,146 页,146 页,146 页,16 页,16 页
- 奶酪:1155.8931811338373
[('意大利人',1074)、('法国人',85)、('印度人',22)、('墨西哥人',9)、('泰国人',3)、('中国人',2)] - 鱼酱:1119.2711018711018
[('泰国',45),('法国',2),('中国',2)] - 姜黄:999.0619453767151
[('印度',225),('泰国',8),('意大利',1)] - 花生:994.6422201344235
[('泰国',42),('中国',26),('印度',24),('意大利',3)] - lime: 991.2019982362463
[('泰国',43),('印度',33),('墨西哥',17),('意大利',8),('法国',4),('中国',3)] - 芝麻:958.9888557397035
[('中国人',77)、('印度人',8)、('意大利人',7)、('泰国人',7)、('法国人',1)]
得分最高和最频繁出现在法语中的成分直到#66:
格鲁耶尔:291.2451127819549
[('法语',17),('意大利语',2)]
深度学习
出于好玩和好奇,我还用 Keras 实现了两个深度学习架构。密集连接的 2 层网络具有 0.996 的训练 F1 分数,并且通过 tad 以上类加权逻辑回归得到的最佳测试 F1 分数为 0.8995。
在第二个架构中,我使用了具有嵌入和 Conv1D 的多通道 2-gram,得到的训练 F1 分数为 0.945,测试 F1 分数为 0.8699。我想尝试使用二元模型来看看简单的深度学习架构会有多大的不同。我在这里找到了一个实现,我将其用作指南。我认为 RNN 不会像 word2vec 那样做太多,因为配料的顺序与菜肴无关。
Final Results
实验:更多的数据会有助于过度拟合、分数不高的类和类不平衡吗?
【编辑于 2019 年 6 月 1 日】
我总共收集了 4177 个数据点——按类别细分:中国人= 260,法国人= 387,印度人= 787,意大利人= 2520,墨西哥人= 75,泰国人= 148。这让我尝试一个实验来测试获取更多的数据来平衡这些类是否会有所改进。如果获取更多数据非常耗时或昂贵,这可能是一个重要的量化指标。根据我得到的结果,还不清楚班级的不平衡是否导致了低的考试分数。
我画出了每种菜肴的测试和训练分数。测试数据是固定的。培训班级的规模从 25 人开始,并以 25 人为增量继续。如果大小小于类计数,则向下采样以将它们设置为相等。这种情况一直持续到人数超过班级人数。
垂直彩色线标记 x 轴上的最大类计数。印度和中国在 1000+左右的训练规模时达到顶峰,而在这个分数以下则持平。墨西哥的峰值更早,接近 500,持平略低。印度,意大利和法国在 1400 左右,然后逐渐减少,以接近相同的分数。泰国在 1300 点,然后也平线收盘。我可以通过绘制更多的网格线并获得最大 f1 分数出现的确切 x 值来进行深入研究,但总体趋势表明,收集更多的数据将会有所帮助。本笔记中所有其他尝试的结果表明,收集更多数据是提高训练分数的最后选择。
结果摘要
结论摘要
- 中国人、法国人和印度人的班级加权得分最高
- 意大利语用 Conv1D 和 multigram 嵌入 DL 做得最好,其次是类加权逻辑回归。
- 墨西哥在过采样方面做得最好,其次是类别加权逻辑回归。
我为 AWS 部署选择的模型是逻辑回归中的类加权损失函数,这是最简单也是最好的。商业决策可以基于你想要的分类器有多完美,基于它训练和执行的速度,你有多少数据,以及它在生产中需要如何工作。
除了收集更多数据之外,其他想法是将成分的数量作为特征权重的一部分。
关于动画条形图你需要知道的一切
原文:https://towardsdatascience.com/https-towardsdatascience-com-everything-you-need-to-know-about-animated-bar-charts-be033f398619?source=collection_archive---------6-----------------------
用 R 语言生成动画条形图的分步指南
一个动画条形图基本上是一个迷人的动画趋势图,棒线根据等级上升到顶端。制作一个动画条形图通常涉及 3 个变量,其中之一通常是时间变量。剩下的两个变量是
- 代表国家名称、公司名称等类别的变量
- 代表每个类别的相应值的变量。
下面是一些动画条形图的例子(图片来自谷歌,给所有者的信用):
你希望在这篇文章中找到什么?
在这篇文章中,我将提出两个要点:
- 为什么动画条形图如此受欢迎和重要?(简短地)
- 如何在 R 中创建动画条形图?(本文主要关注点)
- 如何将 excel 文件导入 R
- 使用“ggplot2”包可视化静态图
- 用“gganimate”包创建动画
当然,你可以在网上找到很多关于如何创建动画条形图的不同来源。有各种各样的工具可以用来创建这样一个柱状图,比如 Tableau、Power BI、Visme、fluore 等等。然而,更多的时候,这些工具并不是免费的。因此,我想介绍如何在 R 中做到这一点,这是一个免费的统计软件,每个人都可以使用。
在 R 中创建一个动画柱状图并不是什么新鲜事。你肯定可以在网上找到很多关于如何在 r 中做到这一点的资源。然而, 就像我的许多其他文章一样,我想给你们一个简单而详细的分步指南(带有一些解释和数据在每个步骤中的样子的截图,这样每个人都可以很容易地跟随,即使没有实际下载数据并亲自尝试) 。
如果这听起来像是你喜欢的,那我们就开始吧!!
为什么动画条形图如此受欢迎?
我们都喜欢用数据讲故事。然而,制作一个既能讲述一个故事又能在视觉上吸引大量观众的图表并不总是容易的。既然我们想提供大量的信息,但同时又不想用一个图表/图轰炸观众太多的信息,那么为什么不创建一个动画可视化,将所有的图结合在一起呢?
动画条形图帮助我们可视化趋势随时间的变化,这种类型的图表非常受欢迎,尤其是在社交媒体上,因为它们在简洁易懂的图表中提供了整体数据故事/见解。
如何在 R 中创建动画条形图?
下载数据并导入到 R
在这篇文章中,我将查看 2002 年至 2018 年在澳大利亚大学注册的国际学生的国籍,并查看这些年来,排名前 10 位的国籍是什么。数据集在这里可用。点击“获取数据”,然后就完成了。
原始数据集如下所示:
“月”列包含两个类别:8 月和 12 月。由于 8 月摄入的数据仅在 2019 年可用,我决定使用 12 月摄入的数据,因为数据在 2002 年至 2018 年的 12 月可用。因此更容易创建动画条形图。注意,最后我们只需要 3 列,即年份、国籍和学生。这足以产生一个动画条形图。最终数据集将如下所示:
使用 Filter 函数,然后删除不相关的行和列,清理原始数据集以获得如上的最终数据集的过程简单明了。我不会详细讲述如何去做,因为这不是本文的重点。如果你有任何困难,请在评论区告诉我。你也可以先把原始数据导入 R,然后用‘tidy verse’包清理数据。但是,既然我们大多数人都是在 Excel 中打开下载的文件,为什么不干脆一直清理那里的数据呢:)?
现在,让我们假设我们已经获得了只有 3 列的最终数据集。我会把它命名为“Dec Intake.xlsx”。
现在让我们将这些数据导入到 R ,中,只需使用 read_excel()函数
library(readxl) # remember to install before loading this package dec_intake = read_excel('Dec Intake.xlsx')
View(dec_intake)
由于我们希望以这样的方式创建一个条形图,即每年只显示前 10 个国籍,我们需要用“tidyverse”包整理上面的数据集。
library(tidyverse)dec_intake_formatted = dec_intake %>%
group_by(Year)%>%
mutate(rank = rank(-Students),
Value_rel = Students/Students[rank==1],
Value_lbl = paste0(" ",Students)) %>%
group_by(Nationality) %>%
filter(rank <= 10)View(dec_intake_formatted)
让我解释一下代码:
- group_by(Year) :首先,我按照年份对数据进行分组
- mutate() :创建新列
- rank = rank(-Students) :创建“rank”列,对该年的学生人数进行排名。“学生”旁边的“-”号表示最大的人数将排在 1 号,第二大的人数排在 2 号,依此类推。
- Value_rel = Students/Students[rank = = 1]:创建“Value _ rel”列,其中国籍等级编号 1 的值为 1.0,以下国家的值小于 1.0
- Value_lbl = paste0(",Students) :创建“Value_lbl”列,用于标记每个等级中的学生人数。该列在后面很有用,因为它将在动画条形图中为我们提供标签。
- filter() :每年只选择前 10 个国家
我们现在有一个干净的数据集准备绘图。让我们进入下一步。
在绘图中创建动画
library(ggplot2) # to create static plot
library(gganimate) # to add animation to static plot
让我们创建一个名为' anim '的新变量。以下是本部分的完整代码:
anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(y = Students/2,
height = Students,
width = 0.9), alpha = 0.8, color = NA) +
**geom_text**(aes(y = 0, label = paste(Nationality, " ")), vjust = 0.2, hjust = 1, size = 7) + #determine size of the Nationlity label
**geom_text**(aes(y=Students,label = Value_lbl, hjust=0),size = 8 ) + #determine size of the value label
**coord_flip**(clip = "off", expand = TRUE) +
**scale_x_reverse**() +
**theme_minimal**() +
**theme**(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="red", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="red"),
plot.caption =element_text(size=12, hjust=0.5, face="italic", color="red"),
plot.background=element_blank(),
plot.margin = margin(1,4, 1, 8, "cm")) +
**transition_states**(Year, transition_length = 4, state_length = 1) +
**ease_aes**('sine-in-out') +
**labs**(title = 'Number of International Students Enrolled in Australia per Year by Nationality: {closest_state}',
caption = "Data Source: [https://internationaleducation.gov.au/Pages/default.aspx](https://internationaleducation.gov.au/Pages/default.aspx)")
不要被上面的代码吓到!如果您熟悉 ggplot2 中的语法,它们实际上非常简单。如果你是新来的,也没关系,因为这篇文章是给初学者的。我现在将解释上面的每一行代码。
anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(y = Students/2,
height = Students,
width = 0.9), alpha = 0.8, color = NA)
这里要创建柱状图,可以使用 geom_bar()。不过这里我要介绍一下 geom_tile(),就是在地块中创建瓦片。这在我们处理 3 个变量,即国家、学生和时间时特别有用。对于 geom_bar(),如果我们使用两个变量,通常会更有用。这里的是我觉得非常有用的帮助表。更多信息也可以参考一下。
aes(y = Students/2, ...)
现在,为什么是“学生/2”而不仅仅是“学生”,或者“学生/3”等等?让我们来测试一下:
anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(**y = Students**,
height = Students,
width = 0.9), alpha = 0.8, color = NA)anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(**y = Students/2**,
height = Students,
width = 0.9), alpha = 0.8, color = NA)anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(**y = Students/3**,
height = Students,
width = 0.9), alpha = 0.8, color = NA)anim = ggplot(dec_intake_formatted, aes(rank, group = Nationality))+
**geom_tile**(aes(**y = Students/4**,
height = Students,
width = 0.9), alpha = 0.8, color = NA)
至此,你大概知道我为什么选择 Students/2 作为论点了。代码的下一部分将是:
**geom_text**(aes(y = 0, label = paste(Nationality, " ")), vjust = 0.2, hjust = 1, size = 7) #determine size of the Nationlity label
+ **geom_text**(aes(y=Students,label = Value_lbl, hjust=0),size = 8 ) #determine size of the value label
这两行代码允许我们确定标签的大小,即国籍名称和学生人数。
**coord_flip**(clip = "off", expand = TRUE) +
**scale_x_reverse**() +
**theme_minimal**()
- 坐标翻转():翻转坐标以便更好的可视化
- scale_x_reverse() :让排名靠前的国家名称出现在顶部,并随着我们沿轴向下移动而减少。
- 这是一种定制我们剧情主题的方式。根据您的风格,您也可以使用各种其他主题。我选择了 theme_minimal(),因为我希望一切都简单。
**theme**(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="red", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="red"),
plot.caption =element_text(size=12, hjust=0.5, face="italic", color="red"),
plot.background=element_blank(),
plot.margin = margin(1,4, 1, 8, "cm"))
这里是 ggplot2 包中主题的完整列表。来源解释了我在上面的块中使用的每一个元素。所以这真的取决于你希望你的动画条形图看起来像什么。对我来说,同样,我希望我的情节看起来简单,所以你可以看到我把大部分参数作为 element_blank()。这样你就可以随心所欲地定制自己的主题。
但是我想请你注意这一部分:
plot.margin = margin(1, 4, 1, 8, "cm")
第一个和第三个数字表示顶部和底部边缘。
第二和第四数字表示右和左余量。
没有固定的边距。一切都取决于你情节的尺度。换句话说,这是一个反复试验的过程。例如,如果国家的名称很长,您可能希望增加一点边距,以便它能适合框架。经过几次试验后,获得了上述裕度组合(1,4,1,8)。
酷!现在我们有了静态图。让我们创建过渡来制作动画图表。
anim <- ggplot(dec_intake_formatted, aes(rank, group = Nationality)) + geom_tile(aes(y = Students/2,
height = Students,
width = 0.9), alpha = 0.8, color = NA) +
geom_text(aes(y = 0, label = paste(Nationality, " ")), vjust = 0.2, hjust = 1, size = 7) + #determine size of the Nationlity label
geom_text(aes(y=Students,label = Value_lbl, hjust=0),size = 8 ) + #determine size of the value label
coord_flip(clip = "off", expand = TRUE) +
scale_x_reverse() +
theme_minimal() +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="red", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="red"),
plot.caption =element_text(size=12, hjust=0.5, face="italic", color="red"),
plot.background=element_blank(),
plot.margin = margin(1,4, 1, 8, "cm")) +
**transition_states**(Year, **transition_length** = 4, **state_length** = 1) +
**ease_aes**('sine-in-out') +
**labs**(title = 'Number of International Students Enrolled in Australia per Year by Nationality: {closest_state}',
caption = "Data Source: [https://internationaleducation.gov.au/Pages/default.aspx](https://internationaleducation.gov.au/Pages/default.aspx)")
- 过渡 _ 长度:动画长度
- state_length :状态停顿的相对长度
- ease_aes() :表示在动画中应该如何缓和不同的美感
- labs() :这是你添加标题、说明、副标题的地方。
也可以使用:enter _ fade()+exit _ fade()使过渡更加平滑。有关参数的更多信息,您可以参考“gganimate”包指南 此处 。然而,在我看来,您不需要使用软件包中介绍的所有参数。就像我在这里介绍的一些论点就足够了。
创建 gif
使用 animate() 函数,
library(gifski)
library(png)animate(anim, nframes = 350,fps = 25, width = 1200, height = 1000,
renderer = gifski_renderer("gganim.gif"))
- nframes 是帧数。数字越大,过渡越好。这和画漫画差不多。想象一下,如果你画了许多捕捉角色单个动作的页面,然后翻阅所有页面,动作会显得非常流畅。同样的概念也适用于此。但是,帧数越多,处理时间就越长。r 将花费更多的时间和消耗更多的能量。
- fps 是每秒花费在每一帧上的时间(默认为 10)
- 宽度、高度:动画的尺寸,以像素为单位
- Renderer: 设置将每一帧合成一个动画的函数(默认为 gifski_renderer())
完整的论据列表,你也可以在这里 参考指南 。
将所有东西放在一起,这就是最终的输出
就是这样!希望你们喜欢这篇文章,并从中有所收获。下次当你们在网上或任何地方遇到动画趋势柱状图时,我希望你们都能有信心用像 r 这样简单免费的工具生成这样的图表。
如果你有任何问题,请在下面的评论区写下来。让我知道你们用什么样的数据集来做这种图表。谢谢你的阅读。祝您愉快,编程愉快!!!
如果您有兴趣了解更多关于 R 的信息,请查看我在 R 、随机森林和预测中关于探索性数据分析的其他文章!
在 Excel 中生成新闻情感评分
原文:https://towardsdatascience.com/https-towardsdatascience-com-generate-news-sentiment-scores-in-excel-1edddfc25163?source=collection_archive---------15-----------------------
具有单一功能
Null result for days which have no news articles on The Business Times
刮掉的新闻文章
Search result for USD on the 8th July, Sentiment Score: -0.1409
我收到了我的一个读者的请求,他在的算法交易中使用了对新闻文章的情绪分析,来创建一个通用工具,让你可以从网上搜集的新闻文章(《商业时报》)中获得情绪分数。我以前在 algo 交易中用它作为衡量标准,但我认为它对投资组合管理或金融风险方面的人也非常有用。
想法
这个想法是为了让非技术用户更容易在 Excel 上根据他们在不同的日子里感兴趣的各种术语得到简单的一对一的分数。我可以想象这将被用于投资组合的重新平衡,甚至作为媒体监控的自动化形式。我在之前的帖子中描述了网络抓取和情感评分。
设置的 9 个简单步骤
***仅限 Windows ***
1。 LinkedIn 消息我用你的电子邮件获取了项目文件夹
2。打开项目文件夹中的 perspective . py
Replace the highlighted path with your own aka C:/Users/bob/Desktop/sentiment/stock_lexicon.pickle
3.下载并安装 Anaconda (Python)
https://www.anaconda.com/distribution/#download-section
4。打开命令提示符,创建 conda 环境
conda create -n py36 python=3.6 && activate py36
5。进入情感项目目录并安装包
假设文件夹在您的桌面上
cd desktop/sentiment && pip install -r requirements.txt
6。在 Excel 中显示开发者标签
File > Options > Customize Ribbon
7。启用设置
File > Options > Trust Center > Trust Center Settings > Macro Settings > Trust access to the VBA project object model
8。打开 perspective . xlsm 并启用 xlwings
9。将 xlwings 指向您的 conda 环境并导入 python 函数
指定 Anaconda3 的安装路径
Conda Base: C:\Users\bob\Anaconda3
和..我们完了!
欢迎分享任何意见或想法!
如何分析训练一个聊天机器人的质量?
原文:https://towardsdatascience.com/https-towardsdatascience-com-how-to-analyze-the-quality-of-training-a-chatbot-bf73d5f5b4b7?source=collection_archive---------27-----------------------
评估聊天机器人训练的一些重要指标。
目前,聊天机器人已经出现。我们可以说,大多数有网站的公司都有一些机器人,甚至在不知道的情况下(因为有特别训练有素和实施的机器人),大多数人已经与一个机器人互动过。
伴随着机器人,出现了无限的概念,例如:实体、意图、对话节点、工作空间、技能等等。还需要评估机器人提供的培训和服务表现。亲爱的读者,我们已经进入了…超级数据科学家。
举一个很肤浅的一笔,下面对齐一下:
- AI 模型:由一组意图和实体组成。
- 人工智能提供商:它是一个工具,使用人工智能模型对机器人用户发送的新消息进行分类(该引擎的例子是 Watson)。
如果“人工智能模型”是好的,“人工智能提供者”将在用户与聊天机器人的对话中按预期执行。同样,这就像评估老师教给学生的内容(人工智能模型),从而确保如果内容是正确的,学生(机器人)能够在日常生活中应用这些知识。
IBM 推荐的注意点之一是,在训练中不存在重复表达,无论是与意图相关还是与实体相关。在这篇文章中,我展示了如何评估这些重复的存在与否。
所以来吧,让我们开始吧…
1-意向
意图意味着用户期望机器人支持什么。
Example of intent used in bot training.
- 结构:
在机器人工作区有几个对象,其中之一是“意图”。里面的‘意图’:[]都是在 bot 训练中使用的意图。
每个意向都有 { '意向'和'实例' } 对象。在 'intent' 对象中是意图的名称,在 'examples': [] 中是该意图的所有表达式示例,这些示例在' examples '对象中报告:[ {'text': ''} ,…, {'text': ''} ]。
不应该重复的是 {'text': ''} 中的表达式。
Structure of intents in the workspace — Watson Assistant.
分析:
为了检查机器人是否被训练了重复的例子,我在 jupyter 笔记本上创建了一个脚本,可以在我的 github 上找到
- 导入所需的库,并使用沃森助手中的凭据创建对象;
- 用 bot 训练中使用的工作空间创建“original_workspace”对象;
- 对进行循环,遍历每个意图的例子,寻找重复;
2 个实体
实体意味着信息的补充,即用户希望执行的动作的参数。
Example of entities used in bot training.
- 结构:
在 bot 工作区中有几个对象,其中之一是“实体”。在‘实体’:[]对象内部是所有用于训练机器人的实体。
每个实体都有 { '实体'和'值' } 。在对象‘entity’中是实体的名称,在‘values’:[]对象中是该实体的值和同义词。
值在' values': [{'value': ''}]内报告,同义词在' values': [{'synonyms': ['']}]内报告。
Structure of entities in the workspace — Watson Assistant.
分析:
继续我在 github 上提供的脚本。对于实体,建议实体名称、值和同义词之间不要有重复的表达式。
- 为创建一个循环,通过寻找重复项来遍历实体名称、值和同义词:
感谢阅读。
给我看看代码!
要使用我在 github 中分享的代码,您必须安装 python 和 jupyter notebook,或者使用 IBM 创建的允许您在云端执行分析的平台。为此,只需实例化您的数据科学体验版本。
步骤:
- 接近 DSX 号。
- 创建新项目。
- 在“资产”选项卡上,单击“创建笔记本”。
- 在 github 中访问我的代码。复制粘贴。
- 在笔记本中,根据您要分析的助手更改凭据。
搞定了。
如何闪电般下载文件
原文:https://towardsdatascience.com/https-towardsdatascience-com-how-to-download-files-in-a-lightning-speed-a8e8dcc694f7?source=collection_archive---------11-----------------------
以及不同解析工具之间的详细比较
你可以有没有信息的数据,但你不能有没有数据的信息。— 丹尼尔·凯斯·莫兰
随着分析技能在最近几天受到高度重视,如何获得高质量的数据也很重要。如果没有更多或高质量的数据,伟大的分析总是无法进行。
有一天,
我的一个朋友问我。
“伟鸿,在点击下载音乐文件的链接之前,你知道媒体文件是否会立即下载吗?
如果链接指向另一个网站,并显示错误信息,该怎么办?我不想下载邮件,我只需要媒体文件。"
我说,“这是个好问题。让我想清楚,然后尽快回复你。”
过了一会儿,我说:“给你!”
def is_downloadable(url):
"""
Does the url contain a downloadable resource
"""
h = requests.head(url, allow_redirects=True)
header = h.headers
content_type = header.get('content-type')
if 'text' in content_type.lower():
return False
if 'html' in content_type.lower():
return False
return True
上述函数将用于检查 URL 是否包含可下载的源,其逻辑如下所示:
- 不是直接下载 URL 的内容并检查源的类型,而是检查 URL 的请求头。
- 检查标题的内容类型,如果它既不是文本也不是 Html,这意味着 URL 带有可以下载的源。
接下来,我在考虑加速代码。除了使用 BeautifulSoup 来解析 Html,有没有其他替代方法可以得到同样的结果,但比 BeautifulSoup 更快?
答案是肯定的,下面我将向你展示如何使用其他更快的 Html 解析器。在此之前,让我们比较一下从 Html 中提取数据的各种比较著名的工具。
- 美丽的声音
- Lxml
- html 解析器
- Selectolax
这是我们将要抓取的网站,我们将点击 M 来下载巴赫约翰的音乐。
美丽的声音
from bs4 import BeautifulSoup
import wget
soup = BeautifulSoup(r.text, 'lxml')css_path = 'tr > td:nth-child(2) > a:nth-child(3)'for node_link in soup.select(css_path):
url = node_link['href']
if is_downloadable(url):
wget.download(url,
'./data/' +\
url.split('&file=')[-1].split('&format')[0] +\
'.mid')
上面的代码片段是使用 BeautifulSoup 作为我们工具的代码。
如 BeautifulSoup 文档中所述,
漂亮的汤永远不会像它上面的解析器一样快。
因为它是建立在 LXML 之上的,所以我们将把它用作我们的解析器。如您所知,我们使用 CSS 来定位数据。
LXML
import lxml.html
import wgetdom = lxml.html.fromstring(r.text)
css_path = 'tr > td:nth-child(2) > a:nth-child(3)'for node_link in dom.cssselect(css_path):
url = node_link.get('href') # OR node_link.attrib['href'] # check whether the url is downloadable
if is_downloadable(url):
wget.download(url,
'./data/' +\
url.split('&file=')[-1].split('&format')[0] +\
'.mid')
上面的代码说明了如何使用 LXML 解析器访问 HTML。正如您所观察到的,语法看起来非常类似于 BeautifulSoup。此外,Lxml 不仅支持 CSS,还支持 Xpath,因此如果您更熟悉使用 Xpath,那么 LXML 将是您更好的选择,而不是 BeautifulSoup。
html 解析器
from html.parser import HTMLParser
import wgetclass MyHTMLParser(HTMLParser):
links = []
def handle_starttag(self, tag, attrs):
if tag != 'a':
returnfor attr in attrs:
if 'href' in attr[0]:
if attr[1].endswith('format=midi'):
self.links.append(attr[1])
breakparser = MyHTMLParser()
parser.feed(r.text)for url in parser.links:
if is_downloadable(url):
wget.download(url,
'./data/' +\
url.split('&file=')[-1].split('&format')[0] +\
'.mid')
Python 框架内置了一个 HTML 解析器,上面的代码用它来提取 URL。这有点复杂,因为我们需要创建自己的 HTMLParser 类来覆盖原始类中的handle_starttag
方法。对我来说,我很少使用 HTMLParser,因为其他可用的工具更容易实现。
Selectolax
from selectolax.parser import HTMLParser
import wgetfor node_link in dom.css(selector):
url = node_link.attributes['href'] if is_downloadable(url):
wget.download(url,
'./data/' +\
url.split('&file=')[-1].split('&format')[0] +\
'.mid')
我开始知道 Selectolax 包是当有人回复我的 Reddit 评论,告诉我试试这个包。(感谢这位 Reddit 的朋友!🤗)基本上,它是一个适度的引擎的 Cython 包装器。经过尝试,解析 HTML 页面的速度有所提高,但幅度不大。同样的建议,如果你更熟悉 XPATH,就用 LXML 代替。
性能概述
作为实验,我使用不同的工具总共下载了 1349 个 MID 文件。运行 20 次后,平均每个工具所用的时间,结果如下:
+---------------+--------------------+
| Package | Average Time taken |
+---------------+--------------------+
| BeautifulSoup | 1300.94s |
| LXML | 1258.89s |
| Selectolax | 1241.85s |
| HTMLParser | 1265.95s |
+---------------+--------------------+
Selectolax 是最快的,但差别并不明显。
总之,如果你真的需要提高你的铲运机或爬虫的速度,那么也许选择 Selectolax 更好。如果您更熟悉 Xpath,请使用 LXML。此外,也许你正在处理一个设计糟糕的网站(就 Html 文档结构而言),最好选择 BeautifulSoup。最后但同样重要的是,如果您想挑战自己,那么就使用 HTMLParser 吧😎😎😎。
到目前为止,我希望您对用于解析 Html 页面的每个 Python 包有了更好的理解。
参考
- https://stack overflow . com/questions/4967103/beautiful soup-and-lxml-html-what-to-preferred
- https://www . mschweighauser . com/fast-URL-parsing-with-python/
- https://www . code mentor . io/aviar Yan/downloading-files-from-URLs-in-python-77 q3b S10 un
- https://stack overflow . com/questions/71151/html-parser-in-python
- https://stack overflow . com/questions/6126789/selecting-attribute-values-from-lxml
关于作者
Low 魏宏是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。
他提供爬行服务,能够为你提供你所需要的准确和干净的数据。你可以访问 这个网站 查看他的作品集,也可以联系他获取抓取服务。
你可以在 LinkedIn 和 Medium 上和他联系。
[## 低微红—中等
在媒体上阅读低纬鸿的作品。数据科学家|网络搜集服务:http://datainfinite.mystrikingly.com/…
medium.com](https://medium.com/@lowweihong?source=post_page-----3efb6878f8db----------------------)
如何使用深度学习为您的视频找到合适的音乐
原文:https://towardsdatascience.com/https-towardsdatascience-com-how-to-find-the-right-music-for-your-video-using-deep-learning-58541eb8bc3b?source=collection_archive---------12-----------------------
假设您有一个自定义视频,并且想要其中某些场景的配乐。这种方法描述了如何通过数字指纹技术将动作、文本和音乐链接在一起。
Photo by Denise Jans on Unsplash
在这篇文章中,我将介绍一种可能的方法,可以给你一个关于如何选择视频背景音乐的答案。无论你做什么:你的 Youtube 频道的博客或电影比赛的业余电影,或者你经营一个专业的制作工作室,或者你是一个游戏开发者,你需要为你的游戏找到一个配乐——无论如何,好的音乐都会增加你的视频的价值。
这种方法描述了如何使用机器学习为视频挑选音乐。这个概念可以使用深度学习作为更广泛的机器学习方法家族的一部分来实现。
在看了 Instagram 视频和商品评论后,我萌生了自动为视频挑选音乐的想法。我开始研究并试图理解这是否是一种先验的可能性。最后,我发现我的想法有权利被转化为一种方法,甚至转化为一种产品。然而,这将是一个资源密集型的机器学习系统开发。
你需要的音乐
当我们为一个视频选择音乐时,我们会遇到许多挑战,有些挑战来自一系列演绎和归纳的思维方式。
首先我们从一个场景描述开始。让我们把这种思维方式命名为‘向前’,在这里,我们观看视频,然后对我们所看到的进行分析和分类,并试图理解和描述我们产生的情绪。
之后要逆向思考。利用我们对情感的分析和描述的结果,我们需要在我们的脑海中找到一段适合所讨论场景的音乐。
所以,音乐和动作有一个共同点,那就是可以用语言来表达,但如果你没有这方面的经验,这就不那么容易了。描述一首音乐的一种方式是遵循的建议,将音乐作为一种艺术形式来分析。这将非常复杂,结果可能会变得非常主观。
然而,如果我们打算使用人工智能来挑选音乐,我们将需要找到另一个共同的数字分母。应该是来自原始媒体的少量相关特征,它们可以像数据库的关键字段一样相互链接。该方法基于数字视频和声学指纹之间的时间一致性的概念。
动作识别
第一步,我们将解决动作识别的任务。今天,机器学习系统能够使用视频指纹来检测和识别视频中的活动。你甚至可以在微软的计算机视觉服务上测试它。
这个领域也在 Kaggle 上流行起来。去年,谷歌开始了第一阶段的竞赛来开发分类算法,该算法使用来自 Youtube 的新的和改进的 YT-8M V2 数据集准确地分配视频级别标签。
动作识别的目的是从电影帧中识别出场景。作为这一阶段的结果,我们将有一个数字视频指纹和一个行动的文本描述。
最佳音乐
第二步是定义什么音乐最适合视频场景。幸运的是,在很多情况下,我们知道什么音乐应该适合一个动态图片所代表的故事。我们的生活经验帮助我们。电影充满了动作和声音的结合。从童年起,我们就知道什么声音符合追逐,或者恐惧、爱、快乐等情绪。
电影摄影,由于其受欢迎程度,为选择合适的轨道设定了质量标准。所以,我们可以用电影原声作为视频的例子。
在这种情况下, Movieclips 可以提供帮助,因为它是 YouTube 上最大的电影网络。每个剪辑包含一个简短的电影场景和一段简短的文字。
然而,配乐并没有覆盖电影或场景的整个持续时间。音乐出现在作者决定强调观众注意力的地方。因此,下一个任务是从其他声音或其缺失中选择音乐。类似于 YouTube 、内容 ID 或 Shazam 的系统可以通过声音指纹的技术来实现。
Image source: https://support.google.com/youtube/answer/2797370
从音频中生成签名对于通过声音进行搜索至关重要。一种常见的技术是创建一个称为频谱图的时频图。任何一段音频都可以翻译成声谱图。随着时间的推移,每段音频被分割成一些片段。在某些情况下,相邻的时间段共享一个公共的时间边界,而在其他情况下,相邻的时间段可能会重叠。结果是一个图表,它描绘了音频的三维:频率对振幅(强度)对时间。
概念
正如我之前提到的,这个概念很简单。它表示视频的一个动作和一首歌曲之间的相互联系,作为数字视频指纹和声音指纹之间的时间一致性。
Image by author
旨在解决分类任务的监督深度学习算法可以分为两个阶段:
- 训练-分析标记的电影数据库(检测动作和声音)并利用标记的动作和相应的配乐建立指纹数据库。
2.工作-从音乐数据库中选择曲目名称。
警告:当我们使用计算机视觉 神经网络 时,我们应该考虑到 概率 这些术语。对于一个新的独特的视频,我们将使用 的不确定性 来获利。
两种选择
未来系统的输入数据有两种可能的选择:视频及其文本描述。声音、视频和文本在媒体文件或流式视频中是相互联系的。
Image by author
1.录像
机器学习系统将识别视频上的一个动作,创建一个视频指纹,在电影数据库中搜索相似的指纹,根据符合程度对结果进行排名,将结果与电影配乐相关联,并返回带有链接的配乐列表,例如,谷歌音乐或苹果 iTunes。
2.文本
通过视频的文字描述来搜索音轨,或者搜索你想要的音轨的关键部分,会让这个概念变得有点困难。该算法必须添加搜索动作-描述对应关系的过程。
副作用
在研究这个主题时,我公开了另一个有用的选项,该选项基于来自新视频和系统学习的视频之间的指纹差异的不确定性。
深度学习分类模型往往给出归一化的得分向量,不一定能捕捉到模型的不确定性。它可以通过贝叶斯深度学习方法来捕获,贝叶斯深度学习方法为理解深度学习模型的不确定性提供了一个实用的框架。
这种不确定性可以被用作潜在修改的度量,以使用生成对抗网络来生成新的音频指纹。另一种选择是快速傅立叶逆变换(FFT)的实现,其可以生成新的唯一音轨(音乐片段)。来自 FFT 的自然损失可以通过来自先前生成的音轨列表的最佳匹配音乐的最近比特来补偿。
结论
所描述的概念示出了如何使用机器学习系统为视频选择音乐。它可以轻松找到视频项目或流媒体所需的最佳歌曲曲目。它还可以为最佳选择提供曲目的变体。
这一概念显示了其成为强大服务的重要功能的潜力,如 Youtube、谷歌照片、微软 Azure、 Adobe Premiere Pro 、 Corel VideoStudio 和 Pinnacle Studio 。然而,我认为基于概念的独立产品开发是低效的。
动作和文本可以用作音乐生成的输入数据。它可能没有人类的作品漂亮,但很可能是独一无二的,可以激发作者的创造力。
被揭示的副作用可能是人类创造力的一个伟大领域。它可以创造出了解一个活动或一个故事听起来如何的可能性。
使卷积网络再次保持平移不变
原文:https://towardsdatascience.com/https-towardsdatascience-com-making-convolutional-networks-shift-invariant-again-f16acca06df2?source=collection_archive---------16-----------------------
现代卷积网络有什么问题,如何修复?如果你使用 CNN,你可能想读这个。
istock.com/sarhange1
2019 年 4 月,一篇新的计算机视觉论文出现,标题为“让卷积网络再次保持平移不变”。为什么现代卷积网络不再是平移不变的,这意味着什么,我们如何使它们再次平移不变?
现代卷积网络怎么了?
大多数现代的卷积网络对于小的移位或转换来说是不健壮的。例如,网络输出可能会根据输入位置发生剧烈变化。
The two sets of images look identical to us, but not to the convolutional network!
尽管卷积是平移不变的,并且汇集建立了平移不变性,但是跨越的忽略了奈奎斯特采样定理和混叠,这破坏了平移不变性。在最大汇集和跨步回旋期间可以看到跨步。
采样定理:如果对波形的采样速度是其最高频率分量的两倍,则可以对带限连续时间信号进行采样,并从其样本中完美地重建信号。
在信号处理中,模糊在二次采样之前用作抗混叠手段。在深度学习中,这种方法最终被 max-pooling 所取代,当时后者从经验上证明了更好的性能。
Max-Pooling operation on the same signal with two different shifts. The outputs are different, Max-Pooling breaks shift-equivariance
现有的工作提出了各种方法来增加下采样的抗混叠能力,例如通过密集地提取特征,通过在最大和平均池之间软选通,或者利用卷积核网络。然而,这些方法要么计算量大,没有充分利用平均池的抗锯齿能力,要么精确度较低。此外,大多数现有工作将最大池和平均池视为两个独立的、不兼容的下采样策略。
怎样才能给强大的网络加上抗锯齿?
本文试图调和经典反走样和最大池。首先,请注意,最大池操作相当于以密集的方式获取最大值,并从该中间特征图中进行子采样。第一个操作,密评,其实根本不别名;问题在于二次采样操作。因此,我们可以在二次采样之前添加一个模糊滤波器来减少混叠。模糊和子采样一起被评估为模糊池。
抗混叠可以类似地应用于其他卷积网络。对于步进卷积,我们可以在卷积和激活后简单地添加一个模糊池层。平均池相当于使用箱式滤镜的模糊缩减像素采样,因此用使用更强滤镜的模糊池替换它可以提供更好的等偏移方差。BlurPool 使用以下模糊滤镜进行测试:矩形-2 [1,1],三角形-3 [1,2,1]和二项式-5 [1,4,6,4,1]。
我们如何评价抗锯齿?
在不同的计算机视觉架构上,对新的子采样策略进行了图像分类和生成测试。为了评估抗混叠性能,提出了三种移位不变性/等方差度量:
首先,将卷积网络视为特征提取器,其中每一层都是一个特征图。然后,一个度量是内部特征距离,它是特征映射的移位输出和具有移位输入的特征映射的输出之间的余弦距离。
Internal feature distance for a feature map F tilda
接下来,我们可以通过检查模型多长时间预测来自同一图像的两个不同偏移的相同类别来评估分类一致性。
Classification consistency for prediction on different shifts
对于图像生成,我们可以通过测试输入图像的偏移是否会生成原始图像输出的偏移版本来评估生成稳定性。
Peak signal-to-noise ratio between generated images with shifted and non-shifted input
结果
通过针对各种水平和垂直偏移计算 VGG 网络各层的内部特征距离,我们观察到抗锯齿网络保持了更好的偏移-等方差,并且最终输出更加偏移-可变。与基线网络不同,在缩减采样图层中,与理想的等偏移方差没有太大的偏差。
Each pixel in the heatmap corresponds to a shift (∆h, ∆w) where its color indicates feature distance. Big distance or large deviation is red, zero distance or perfect shift-equivariance is blue.
对于图像分类,添加低通滤波器可通过 ResNet50 增加分类一致性,其中强滤波器可进一步提高稳定性。此外,绝对分类精度也随着这些滤波器的增加而提高,而无需增加可学习的参数。事实上,低通滤波可以作为有效的正则化。
ImageNet classification consistency vs. accuracy
对于图像生成,低通滤波器被添加到 U-Net 架构的步长卷积层。输入有偏移和无偏移时生成的图像之间的 PSNR 也会增加,这意味着输出更加相似。
Selected example to demonstrate generation stability. Without anti-aliasing (top), shifting produces different looking windows. With anti-aliasing (bottom), the same window pattern is generated regardless of shifts.
此外,这种抗锯齿方法还提高了对噪声等其他扰动的稳定性。它还降低了对受损图像进行分类的平均错误率。因此,抗锯齿有助于为各种架构和任务获得更健壮和更通用的网络。
讨论
我自己尝试了这个模型,对一个预先训练好的反锯齿 Resnet18 模型进行了微调,用于灰度图像的图像分类,训练数据不到 4 000 个。最初,这项任务是具有挑战性的,因为该模型倾向于过度拟合稀缺的训练数据。反走样确实帮助模型一般化,测试精度从 0.95865 提高到 0.97115。
本文提出的方法值得注意,因为它在不增加任何可学习参数的情况下提高了性能。拥有移位不变卷积网络意味着我们不再需要移位数据增强。两者都有助于缩短计算时间,并在计算机视觉任务中更好地概括。
最初的问题在于图像在视觉上可能看起来相似,但实际上它们之间有很大的距离。移位图像正是这种现象的一个常见例子。让我们提醒自己,好的卷积网络应该迎合人类的视觉。对我们来说看起来一样的图像对机器来说也应该如此。因此,平移不变网络更好地模拟人类感知,因为由网络提取的特征具有更好的平移等方差,并且平移后的图像更经常被认为是相同的。
经典的信号处理实践模糊抗混叠,但它已经在现代卷积网络中消失,目的是优化性能。本文的结果表明,在当前的卷积网络中添加抗锯齿功能可以同时提高平移方差和任务性能,现在也许是时候恢复模糊滤波器,让卷积网络再次保持平移不变了!
多重共线性-它是如何产生问题的?
原文:https://towardsdatascience.com/https-towardsdatascience-com-multicollinearity-how-does-it-create-a-problem-72956a49058?source=collection_archive---------11-----------------------
深入了解多重共线性如何影响模型的性能
Photo by Luke Chesser on Unsplash
在回归分析过程中,我们在实际执行回归之前检查许多东西。我们检查独立值是否相关,我们检查我们选择的特征是否重要,以及是否有任何缺失值,如果是,那么如何处理它们。
首先,让我们了解什么是因变量和自变量—
- 因变量,回归过程中必须预测的值。也称为目标值。
- 自变量,我们用来预测目标值或因变量的值。也被称为预测器。
如果我们有这样一个等式
y = w*x
这里,y 是因变量,w 是自变量。
我们稍后会看到它是如何被检测到的,但首先,让我们看看如果变量是相关的,会有什么问题。
从概念上理解—
想象你去观看一个摇滚乐队的音乐会。有两名歌手,一名鼓手,一名键盘手和两名吉他手。你很容易区分歌手的声音,因为一个是男性,另一个是女性,但你似乎很难分辨谁弹得更好。
两个吉他手都以相同的音调、音高和速度演奏。如果你能去掉其中一个,那就不成问题了,因为两者几乎一样。
去掉一个吉他手的好处是降低成本,减少团队成员。在机器学习中,训练的特征越少,模型就越简单。
这里两个吉他手共线。如果一个人弹吉他很慢,那么另一个吉他手也会弹得很慢。如果一个人弹得快,那么另一个人也弹得快。
如果两个变量共线,这意味着如果一个变量增加,那么另一个也增加,反之亦然。
数学上的理解—
让我们考虑这个等式
考虑 A 和 B 是高度相关的。
y = w1*A + w2*B
系数 w1 是在保持 B 不变的情况下,A 每增加一个单位 y 的增加量。但是实际上这是不可能的,因为 A 和 B 是相关的,如果 A 增加一个单位,那么 B 也增加一个单位。因此,我们不能检查 A 或 b 的个人贡献。解决方案是删除他们中的任何一个。
检查多重共线性—
通常有两种方法来检查多重共线性
- 相关矩阵
- 差异通货膨胀系数(VIF)
相关矩阵—****相关矩阵是显示变量间相关系数的表格。
我们不打算讨论相关矩阵是如何计算的。
create_correlation_matrix
source
我认为高于 0.75 的值是高度相关的。
方差膨胀因子— 方差膨胀因子(VIF)是多项模型中的方差与单项模型中的方差之比。它量化了普通最小二乘回归分析中多重共线性的严重程度。VIF 值可以解释为
- 1(非共线)
- 1–5(中等共线)
-
5(高度共线)
移除 VIF 值大于 5 的值。
VIF Python
结论—
多重共线性会显著降低模型的性能,而我们可能不知道这一点。这是特征选择过程中非常重要的一步。移除多重共线性还可以减少要素,这最终会降低模型的复杂性,并且存储这些要素的开销也会减少。
确保在执行任何回归分析之前运行多重共线性测试。
关于数据和科学
原文:https://towardsdatascience.com/https-towardsdatascience-com-on-data-and-science-e96849b5f363?source=collection_archive---------27-----------------------
第一部分:将科学引入讨论的重要性。
Illustration by Héizel Vázquez
我们从事科学研究已经有一段时间了。我打算把开端放在 1637 年笛卡尔发表《方法的论述》的时候。这本书的主要结果是知识和真理之间的区别,科学家的话语与知识有关(我们后来发现知识总是不完整的)而不是寻找真理。
这是非常重要的一点,因为它给了我们一个焦点,科学想要知道那些不是“无可争议的真理”的东西。
数据在科学中的作用
Illustration by Héizel Vázquez
几乎在科学的历史中,数据一直是接近科学的。有时是理论,然后得到数据,但对于我们在这里讨论的大部分内容和其他即将到来的文章,它将在模型数据->理论中。
我想告诉你一个小故事,它会让你更好地理解为什么数据很重要,但不是科学中最重要的部分。
故事讲的是一个叫第谷·布拉尼的人。他几乎一生都在测量恒星、行星、月亮和太阳的位置。为了什么?他想学习如何预测椭圆,而且他对托勒密体系不满意,哥白尼理论对他来说也不够。所以他想找到描述天空及其运动部分的最佳方式。
遗憾的是,他不确定如何测量,但他一直坚持测量,直到生命的最后几天。他死于 1601 年,一个名叫约翰尼斯·开普勒的人在一年前成为他的助手,他是一位伟大的数学家,可以接触到他几乎所有的数据。利用这些数据,开普勒改进了哥白尼的宇宙理论,并发展了描述行星运动的三大定律。开普勒的工作为艾萨克·牛顿后来关于引力理论和物体运动的研究奠定了基础。
这个故事更长更有趣,如果你想知道更多,请上网看看。但是此时你可能会问自己,这个故事与数据科学有什么关系?
我们从这个故事中最大的收获是拥有数据,有时很多数据是没有价值的,除非你有一个好问题要回答。如今仍然如此,现代人对数据的热爱始于统计学。
统计的作用
Illustration by Héizel Vázquez
我不打算在这里写太多关于统计学的东西,但我会指出两件永远改变了世界的具体事情。第一篇是 John Tukey 在 1962 年发表的一篇名为“数据分析的未来的文章,另一篇是 Jeff Wu 教授在 1997 年发表的一篇名为“统计学=数据科学的演讲。
我知道这些都是很老的参考资料了,但它们非常重要。相信我。
在图基的文章中,他这样说:
很长一段时间以来,我一直认为自己是一名统计学家,对从特殊到一般的推论感兴趣。但是当我看到数理统计学的发展时,我有理由感到惊奇和怀疑。[……]总而言之,我觉得我最感兴趣的是数据分析……
这是一个统计学家的巨大声明。在这个时代,“数据科学”这个词并没有像今天这样存在,但图基描述数据分析的方式非常接近我们现在所说的数据科学。他甚至称数据分析是一门科学,因为它通过了这三项测试:
- 知识性内容。
- 组织成一种可以理解的形式。
- 依赖经验测试作为有效性的最终标准。
也就是说,这门“新科学”是由一个普遍存在的问题而不是一个具体的学科来定义的。然后,他开始讲述如何学习和开始数据分析,以及如何成为一名数据分析师以及如何教授数据分析。这是一篇令人惊叹的文章,如果我们想了解这个领域的开端,我们都应该读一读。
在 Tukey 出版 35 年后的第二篇文章中,Jeff Wu 说:
统计学=数据科学?
他在会上提议将统计学重新命名为“数据科学”,将统计学家命名为“数据科学家”。按照今天的标准,我们知道统计学是数据科学的一部分,但是为什么呢?因为我们说我们还需要编程,商业理解,机器学习等等。可能只是统计学进化了,现在一些统计学家变成了数据科学家。但是其中有一些。
为了理解成为数据科学和数据科学家的统计学家和统计学家,我们需要阅读 Leo Breiman 在 2001 年发表的文章“统计建模:两种文化”。
他在这里提到,在统计文化中,有些人受数据建模的驱动,有些人受算法建模的驱动。其中第一个假设我们有一个随机数据模型,它将输入变量 x 映射到响应变量 y 。第二种方法认为映射过程既复杂又未知,他们的方法是找到一个作用于 x 的函数 f(x) 来预测响应 y 。
然后,他继续讨论为什么数据建模文化长期以来对统计学不利,导致不相关的理论和可疑的科学结论,阻止统计学家使用更合适的算法模型和解决现有的新问题。他还谈到了光谱的另一部分的奇迹,算法建模文化从他自己的作品和其他作品中给出了如何解决困难和复杂问题的例子。
数据科学的作用
Illustration by Héizel Vázquez
数据科学是目前大多数科学和研究的主要焦点,它需要许多东西,如人工智能、编程、统计、商业理解、有效的演示技巧等等。所以才不容易理解,也不容易学习。但是我们能做到,我们正在做。
数据科学已经成为学术界和工业界解决问题的标准框架,而且这种情况还会持续一段时间。但是我们需要记住我们从哪里来,我们是谁,我们要去哪里。
我会在这个主题上写更多的文章,你可以把这看作是一个介绍。
感谢阅读:)
如需了解更多信息,请点击此处关注我:
[## 法维奥瓦兹奎-首席执行官-克洛斯特| LinkedIn
‼️‼️重要提示:由于 LinkedIn 的技术限制,我现在只能接受来自我…
www.linkedin.com](https://www.linkedin.com/in/faviovazquez/)
Python 基础:可变对象与不可变对象
原文:https://towardsdatascience.com/https-towardsdatascience-com-python-basics-mutable-vs-immutable-objects-829a0cb1530a?source=collection_archive---------2-----------------------
Source: https://www.quora.com/Can-you-suggest-some-good-books-websites-for-learning-Python-for-a-layman
读完这篇博客后,你会知道:
- 什么是对象的身份、类型和值
- 什么是可变和不可变 对象
简介(对象、值和类型)
Python 代码中的所有数据都由对象或对象之间的关系来表示。每个对象都有标识、类型和值。
身份
一个对象的标识 一旦被创建就不会改变;你可能认为它是内存中对象的地址。
[**is**](https://docs.python.org/3/reference/expressions.html#is)
运算符比较两个对象的身份;[**id()**](https://docs.python.org/3/library/functions.html#id)
函数返回一个表示其身份的整数。
类型
一个对象的类型定义了可能的值 和操作(例如“它有长度吗?”)该类型支持。[**type()**](https://docs.python.org/3/library/functions.html#type)
函数返回对象的类型。像身份一样,对象类型是不可改变的。
价值
某些对象的值可以改变。值可以变化的对象被称为可变;一旦被创建,其值不可改变的对象**称为。****
对象的可变性是由其类型决定的。
重要提示 有些对象包含对其他对象的引用,这些对象被称为容器。容器的一些例子有元组、列表和字典。如果可变对象被改变,包含对可变对象 的引用的不可变容器的值可以被改变。然而,容器仍然被认为是不可变的,因为当我们谈论容器的可变性时,只有被包含对象的身份是隐含的。****
在下一节中,我们将看到更多的信息和详细的例子来理解可变和不可变对象之间的区别。
Python 中的可变和不可变数据类型
- Python 中的一些可变数据类型有列表、字典、集合和用户自定义类。
- 另一方面,一些不可变的数据类型是 int、float、decimal、bool、string、tuple 和 range 。
是时候举些例子了。先来比较一下元组 ( 不可变)和列表 ( 可变)的数据类型。我们可以像这样用方括号 **[]**
定义一个列表:numbers = [1, 2, 3]
。定义一个 tuple,我们只需要把括号替换成圆括号 **()**
就像这样:numbers = (1, 2, 3)
。从这两种数据类型中,我们可以通过索引访问元素,并且可以对它们进行迭代。主要区别在于元组一旦定义就不能更改。
索引列表和元组
输出:
****1
10****
改变值:列表与元组
输出:
****[100, 2, 3]**--------------------------------------------------------------------**
**TypeError** Traceback (most recent call last)
**<ipython-input-2-286c46a29f5d>** in <module>**()**
3 list_values**[0]** **=** **100**
4 print**(**list_values**)**
**----> 5** set_values**[0]** **=** **100**
**TypeError**: 'tuple' object does not support item assignment****
我们可以看到,当我们试图改变元组时,我们得到了一个错误,但我们没有这个问题的列表。
元组与列表扩展
现在,我们可以尝试使用+=
操作符来扩展我们的列表和元组。这将对两种数据类型都起作用。让我们看看会发生什么。
输出:
****2450343168136
2450343205552
2450343168136
2450341742248****
我们可以看到,列表标识没有改变,而元组标识改变了。这意味着扩展了我们的列表,但是创建了一个完全的新元组。列表比元组更节省内存。
其他不可变数据类型示例
我们已经看到其他一些不可变的数据类型是整数和字符串。一旦它们被初始化,它们的值就不能被改变。
输出:
****1657696608
1657696640****
输出:
****2450343168944
2450343426208****
我们看到,对于数字和文本变量,它们的标识都发生了变化。这意味着新变量在两种情况下都被创建。
通过引用复制可变对象
让我们看看,如果我们为一个可变数据类型给同一个对象的两个名字会发生什么。
输出:
****2450343166664
2450343166664
True
[4, 5, 6, 7]
[4, 5, 6, 7]****
我们可以看到变量名具有相同的标识,这意味着它们引用了计算机内存中相同的对象。提醒:[**is**](https://docs.python.org/3/reference/expressions.html#is)
运算符比较两个对象的身份。
所以,当我们改变第二个变量的值时,第一个变量的值也会改变。这只发生在可变对象上。你可以在我之前的博客文章中看到如何避免这种情况。
复制不可变对象
让我们尝试用一个不可变的对象做一个类似的例子。我们可以尝试复制两个字符串,并更改其中任何一个字符串的值。
输出:
****3063511450488
3063511450488
True
3063551623648
3063511450488
False
Python is awesome
Python****
每次当我们试图用更新一个不可变对象的值时,一个新的对象就会被创建。当我们更新第一个字符串时,第二个字符串的值不会改变。
==运算符
有时候我们不是要比较两个对象的同一性,而是要比较这些对象的价值。我们可以使用==
操作符来做到这一点。
输出:
****True
False****
我们可以清楚地看到这两个对象具有相同的值,但是它们的身份不同。
不可变对象改变它的值
正如我们之前所说的,如果可变对象被改变,包含对可变对象的引用的不可变容器的值可以被改变。让我们来看一个例子。
输出:
****<class 'tuple'>
(129392130, ['Programming', 'Machine Learning', 'Statistics'])
(129392130, ['Programming', 'Machine Learning', 'Maths'])****
我们已经改变了skills
变量的值。另一个变量person
包含对skills
变量的引用,这也是它的值被更新的原因。
提醒
对象仍然被认为是不可变的,因为当我们谈论容器的可变性时,只有被包含对象的标识是隐含的。****
然而,如果你的不可变对象只包含不可变对象,我们不能改变它们的值。让我们看一个例子。
输出:
****1657696608
1657696032
(42, 24, ('Python', 'pandas', 'scikit-learn'))
1657696864
1657696064
(42, 24, ('Python', 'pandas', 'scikit-learn'))****
请记住,当您试图更新一个不可变对象的值时,会创建一个新的对象。
摘要
- Python 代码中所有的数据都是用对象或对象之间的关系来表示的。
- 每个对象都有一个标识,一个类型,以及一个值。
- 对象的标识一旦被创建就不会改变 。你可以认为它是对象在内存中的地址。
- 一个对象的类型定义了可能的值 和操作。
- 值可以改变的对象称为可变的 。 对象一旦被创建,其值就不可改变的对象称为。**
- 当我们谈论容器的可变性时,只有被包含对象的身份*是隐含的。*******
资源
- https://www . python forthe lab . com/blog/mutable-and-immutable-objects/
- https://standupdev.com/wiki/doku.php?id = python _ tuples _ are _ immutable _ but _ may _ change
- https://www . geeks forgeeks . org/mutable-vs-immutable-objects-in-python/
- https://docs.python.org/3/reference/datamodel.html
- https://docs.python.org/3/library/functions.html#id
我的其他博客文章
你也可以看看我以前的博文。
- Jupyter 笔记本快捷键
- 数据科学的 Python 基础知识
- Python 基础:迭代、可迭代、迭代器和循环
- Python 基础:列表理解
- Python 数据科学:Matplotlib 数据可视化简介
- 使用 Python 的数据科学:使用 pandas 加载、子集化和过滤数据简介
- [文本自然语言处理导论](http://Introduction to Natural Language Processing for Text)
时事通讯
如果你想在我发表新的博客文章时得到通知,你可以订阅我的简讯。
商务化人际关系网
这是我在 LinkedIn 上的简介,如果你想和我联系的话。我将很高兴与你联系在一起。
最后的话
谢谢你的阅读。我希望你喜欢这篇文章。如果你喜欢,请按住拍手键,分享给你的朋友。我很高兴听到你的反馈。如果你有什么问题,尽管问。😉
不平衡数据集的重采样方法-欺诈交易
原文:https://towardsdatascience.com/https-towardsdatascience-com-resampling-methods-for-unbalanced-datasets-5b565d0a247d?source=collection_archive---------14-----------------------
假设你的任务是开发一个简单的机器学习算法,无论是有监督的(有明确的目标变量)还是无监督的(没有预定义的结果变量)。但是看你的数据,好像是一个阶级统治了另一个阶级。在这种情况下,您的模型将很难从您的数据中学习来预测未来的类。
Data Sampling Source
仍然不确定这里的问题是什么?让我们看一个恰当的例子。
可视化不平衡数据集
让我们看看不平衡数据在实践中是什么样子的。出于本文的目的,以及即将发布的一系列专注于检测欺诈者的文章,我从 Kaggle 挑选了信用卡欺诈数据集。
该数据集是大约 28.5k 信用卡交易的集合,其中维度是从 V1 到 V28 的一组理论特征,不包括交易金额,以及后者是否是欺诈交易,以分类变量的形式表示(当没有欺诈时,Class == 0,否则,Class == 1)。
#Import libraries & Read Data
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdf = pd.read_csv("creditcard.csv")
现在让我们来数一数欺诈案件相对于非欺诈案件出现的次数。
occ = df['Class'].value_counts()
print(occ)Output:
#0 284315
#1 492
因此,在总共 284807 笔信用卡交易中,我们总共发现了 492 起欺诈案件。
print(occ / df.shape[0])
这只占所有病例的 0.17%。对于训练我们的模型来说,这可以说是相当微不足道的欺诈性数据,这就是我们所说的类不平衡问题。
在我们做出任何更改之前,让我们先直观地看一下。
首先,让我们定义一个函数来创建数据和标签的散点图。
def plot_data(X, y):
plt.scatter(X[y == 0, 0], X[y == 0, 1], label="Class #0", alpha=0.5, linewidth=0.15)
plt.scatter(X[y == 1, 0], X[y == 1, 1], label="Class #1", alpha=0.5, linewidth=0.15, c='r')
plt.legend()
return plt.show()
我们希望在我们的图表上尽可能避免噪音和维度。因此,我们将创建一个将所有特性放在一起的向量 X ,以及一个包含目标变量(类变量)的向量 y 。
我们将为此定义一个附加函数。
def prep_data(df):
X = df.iloc[:, 1:29].values
X = np.array(X).astype(np.float)
y = df.iloc[:, 30].values
y=np.array(y).astype(np.float)
return X,y
我们现在定义变量 X 和 y:
X, y = prep_data(df)
准备好了吗?我们走吧:
plot_data(X, y)
Visualization of Class Imbalance
您可以很容易地看到,红色的欺诈案例明显多于蓝色的非欺诈案例。在这种情况下,机器学习算法解释的主要是非欺诈事件。当成功训练我们的模型时,这将被证明是具有挑战性的,因为当数据集保持原样时,它很可能会产生假阴性。
那么我们能做些什么呢?这就是重采样派上用场的地方,作为一种提高欺诈与非欺诈比率的方法。
什么是重采样&什么时候用? 重采样是从原始数据集中抽取重复样本的过程。重采样方法背后的直觉是,它为我们的数据类创建“相似”案例,以便呈现代表我们希望调查的人群的数据,并因此向算法提供足够的数据以输出更准确的结果(当数据不够时)。
有哪些类型的重采样方法?
- 欠采样多数类
- 对少数民族阶层进行过度采样
- 合成少数过采样技术(SMOTE)
显然有更多的重采样方法(例如,自举、交叉验证等。)但在本文中,我们将重点定义以上三种。
欠采样多数类(在这种情况下,非欺诈情况)从数据集中随机抽取主要类,以匹配非主要类的数量。一般来说,这通常是最不可取的方法,因为它会导致我们丢弃一些有价值的数据,但是当您有一个大型数据集时,欠采样在计算上可能会更好(除非您同时煮咖啡)。
过采样少数类则相反。与前面的方法不同,我们随机抽取非支配类,并创建“假”副本来匹配支配类中的案例数量。在这种情况下,我们实际上是在创建数据的副本,并在此基础上训练我们的模型。当我们的非支配类没有分散在数据集中时,这可能不是一个理想的方法。复制只会有效地再造相似的实例,而没有“合成的”种类。
这就引出了第三个也是最后一个方法!
合成少数过采样技术(SMOTE) 是另一种类型的少数过采样技术,只是这种技术考虑了非支配类的现有情况的特征,并以“最近邻居”的方式创建合成副本(无法控制自己来自东南亚的说法:相同,但不同!).
对于这三种方法,一个经验法则是只对你的训练数据进行重采样!
重采样不平衡类—击杀方式 (看我在那里做了什么?永远不要错过任何插上一句双关语的机会)
!pip install imblearn
from imblearn.over_sampling import SMOTEmethod = SMOTE(kind='regular')
让我们将该方法应用于我们的特性&目标变量。
X_resampled, y_resampled = method.fit_sample(X, y)
现在让我们来看看我们新的平衡数据集:
plot_data(X_resampled, y_resampled)
瞧啊!
Balanced Dataset — using SMOTE Technique
结论
正如你所看到的,我们的非主导类(红色的欺诈案例)在数据上更加明显。如果我们运行一个快速的数字检查,我们会看到 y 和y _ 重采样的计数现在是相似的。
SMOTE 已经在 imblearn 软件包中预定义的特征空间中有效地合成了新的欺诈案例(对于更倾向于数学的人来说,对 K-最近邻和欧几里德空间的理解在这一点上可能会派上用场)。
不过,尽管如此,还是要记住一些限制,因为最近的邻居可能并不总是欺诈案例。将 SMOTE 方法与其他一些基于规则的系统结合起来以获得更高的准确性将是一个明智的决定,但这取决于手头的任务和数据。
玩得开心! 现在,可以说你已经准备好继续使用你的预测模型了(别忘了只在训练集上应用 SMOTE)!
这是我关于检测信用卡欺诈的系列文章中的第一篇(因此选择了这里的数据集)。如果您有兴趣了解更多信息并尝试一下,请订阅我的频道,不要犹豫,请在下面留下您的反馈:)谢谢!
商业分析的转变与扭曲:来自 Qlik Qonnections 和 Alteryx Inspire 的思考
原文:https://towardsdatascience.com/https-towardsdatascience-com-shifts-twists-in-business-analytics-bec8766091b9?source=collection_archive---------21-----------------------
Transfăgărășan Pass in Romania by Cristian Bortes, Flickr #1414351112 — CC BY-NC-SA 2.0
就像开车上山一样,商业分析主要是向上发展的,但是伴随着意想不到的思维转变和技术的突然转变。在这篇文章中,最近的两个事件提供了关于转变的线索,以及我们何时能登上这个山口。我小儿子的声音在我脑海中回响,“爸爸,我们到了吗?”
摘要:在最近的厂商简报会上,我观察到分析系统的七个行业变化,这些变化可能预示着未来几年思维的根本转变和技术的扭曲。给出了组织如何为这些变化做好准备的建议。
作为一名研究商业智能(BI)行业几十年的技术分析师,我见证了信息技术(IT)的许多变化,尤其是商业分析(BA)的变化。
在早期,最先进的分析技术包括生成带有少量计数和总计的财务报告。换句话说,是在描述已知数据,而 T5 凭借其实时性能仪表盘和交互式可视化分析工具,一直是 BI 行业背后的驱动力。
最近,机器学习算法的快速发展推动了分析技术的发展,尤其是那些基于人工神经网络的算法。更重要的是,重点已经转向超越已知数据的概括。这些变化令人着迷,而且往往出乎意料,因为它们正在改变和扭曲着商业智能的面貌。
兜售他们的最新产品,几十年来已经购买了 BI 供应商的持续游行,很像节日游行,喇叭响着,财富飙升。每一次新技术浪潮都会引起人群的欢呼,承诺解决我们的业务问题。
Qlik Qonnections in May 2019 — Alteryx Inspire in June 2019
最近,我参加了 Qlik 和 Alteryx 的分析师简报会,听取了他们的最新和最伟大的,期待看到更多的游行。
又一个转变和转折?
然而,事实并非如此!Qlik 会议强调了在前一周对 Attunity 的收购。[01]同样,Alteryx 大会在第一天就迎来了 Salesforce 对 Tableau 的收购。[02]这些游行不同寻常…
Qlik 以超过 6 亿美元的价格从私人资本手中收购了 Attunity。我想知道…为什么仪表板公司要收购一家公司来提供企业级数据管道?就因为他们可以?你只能把这么多像素放入这些仪表板。
会议的讨论围绕着这些大的收购,一些人暗示商业智能产业现在只对成年人开放。对技术古怪的企业家和手推车小贩来说,商业智能创新结束了吗?BI 游戏现在的赌注是否超过 10 亿?
从表面上看,这些趋势看起来是一样的——旧技术的重新混合和整合,在海量数据、无处不在的云、洞察狂热和大量分析的混乱中。这些发展是否足够重要和根本,足以暗示新的转变或扭曲?
我对这两个事件的主要观察是什么?下面的章节详细阐述了七个观察结果,并提出了一些实用的建议。
- 驱动因素 —分析发展迅速,但分布不均
- 障碍—分析需要坚实的数据运营基础设施
- 障碍 —分析需要新思维,但大多数人缺乏基本素养
- 乘数 —分析应该使孤立的应用成熟为集成的系统
- 决策 —商务智能供应商面临关于分析的关键决策
- 促成者 —业务/数据分析师必须在分析中扮演促成角色
- 能源 —推动上述发展的燃料来自下一代数据极客
下面的章节详细阐述了这些观察结果,并为经理们提供了一些建议。
驱动因素—分析正在快速发展,并且分布不均匀
这两次活动的主题都是分析。因此,我问了每个人他们是否、如何以及为什么使用分析。我数不清有多少人用青少年性行为的类比来描述他们组织中分析的使用。每个人都在谈论它,但是……
我的评估是,大多数人使用传统的机器学习(如随机森林)来进行决策支持项目,这些项目通常由外部专家领导,具有精选的一次性数据集。然而,目前最先进的分析技术已经迅速发展,超越了传统的机器学习技术,几乎成为一个独立的类别。只有 3–5%的普通组织 [03]正在使用当前一代的分析,并准备利用下一代的分析。
我对这些未来分析使用的术语是下一代分析,它基于乐高式神经网络架构动物园,消耗大量数据流,需要相当大的张量处理能力。人们可以把由此产生的模型想象成信息海绵,能够将数十亿字节的原始数据提取成一百万个权重(简单的数字)。然后,这些权重可以用于各种任务,例如对未来销售进行单一预测,对用于癌症检测的图像进行分类,将俄语语音翻译成英语文本,执行复杂的机器人动作序列,或者生成初始数据集的样本。
不幸的是,很少有公司能够具备这样的企业级能力:从 github 获取预先训练好的模型,在 Jupyter 笔记本电脑中定制代码,通过迁移学习使用其独特的数据集进行再培训,作为 web 服务部署到生产中,与现有的 it 基础设施集成,实现实际的业务价值,并满怀信心地进行管理。这不再是你奶奶的监督学习了。然而今天,对于任何好奇的技术人员来说,所有必要的工具和技能都是现成的。[04]
那么,为什么这些未来的分析不是均匀分布的呢?
障碍—缺乏可靠的数据运营基础架构
如前所述,我在这些活动中观察到的分析示例通常是独立的分析应用程序,带有手动管理的一次性培训数据集。此外,数据准备通常需要一个月,而数据分析需要几天,这意味着…
大多数公司只谈论分析的原因是他们挣扎于基本的数据获取和整合。具有讽刺意味的是,我们的 It 行业已经花了 70 年的时间来解决一般的数据集成问题,取得了巨大的进步,但从未到达终点线。
在 20 世纪 90 年代接受数据仓库课程的组织现在正在进行分析。对数据的贪得无厌的渴望作为商业环境的例子来推动学习分析,这对所有人来说都是一个惊喜,对那些早期投资 DataOps 的人来说也是一种祝福。 [05]。
如果没有可靠的数据操作基础架构,每个分析项目都是从零开始,以创建带标签的训练/测试数据集。这应该在单个 SQL 语句中执行。当成功时,部署创建了另一个独立的烟囱系统,漂浮在云中的某个地方。这应该是集中管理的正常生产工作负载的一部分。
Qlik 为什么收购 Attunity?…因为他们的企业级数据操作非常成熟。SalesForce 为什么收购 Tableau?…因为 SalesForce 拥有大量数据和可靠的数据运营基础架构,但需要一种更好的分析方法。为什么 Alteryx 非常适合分析系统?…因为他们有用户友好的 DIY 数据操作工具,可以轻松地将分析模块(像另一个 ETL 转换)添加到他们的工具箱中,并且只需单击一下就可以部署数据管道到 web 服务。
要点:对于一名高管来说,确定他们的公司是否准备好采用分析系统的一个有见地的练习如下:要求对最近的制造缺陷(或类似缺陷)进行简单的逻辑回归分析。这些缺陷的根本原因是什么?忽略结果,但记下花费的时间。询问有关持续时间、人-小时和分析所需步骤的具体问题,尤其是数据准备。然后,表现出兴奋的样子,要求尽快将此分析模型部署到生产中。做好被人弄湿衣服的准备。最后,乘以 x10-x100 来估计实际分析系统的资源和持续时间。在分析成熟的公司中,这个估计应该是几个人一周。
Barrier 每个人对数据及其分析的人工智能素养
我对 Qlik 在开放数据扫盲计划中所做的努力印象深刻。[06]他们花费了必要的资源和才能来做好这件事,并与所有人分享。我敦促 BI 社区中的每个组织都支持这个数据扫盲计划(或类似的计划)。
下一步是用大量的分析素养来扩展基本的数据素养。雇佣一些有才华的数据科学家不会充分改变组织文化来确保你的开发团队成功。每个人都应该用共同的术语和概念来思考和讨论问题。
分析素养有几个微妙的变化。这里有两个关键的转变。有关详细信息,请参见[07]
首先,重要的是理解从描述已知数据的到概括已知数据的的转变。这就是分析的本质!这是一个概念上的飞跃,每个人都自然而迅速地执行,但也是可预见的非理性和次优。[08]**
第二,从精心制作的(或静态的)逻辑(这是几十年来的标准)到学习逻辑的转变。在后一种情况下,应用程序是从分析模型中创建的,这些模型经过训练和验证(称为 Fit ),并带有包含已标记(或已分类)示例的训练数据集。然后用来从一个输入推断出一个输出(称为预测)。这种 Fit-Predict 舞蹈被称为监督学习(虽然它实际上是训练,而不是学习)。
要点:第一步是定义你关于分析和相关主题的术语。它每月都在变化。从拟合和预测开始,继续其他对你的分析计划至关重要的概念。确保每个人都说同一种语言。
要点:最后,确保你的公司信息与上述内容同步。特别是,定义你对人工智能这个术语的具体用法,或者完全避免使用它。[09]
决策—商业智能供应商重新分析的战略选择
在展览中,我询问了供应商他们如何为客户提供分析支持,以及他们如何将分析嵌入到他们的产品中。每个供应商的标牌都说明了一些关于分析的内容;然而,只有大约一半支持(或嵌入)固定的机器学习模块,如逻辑二元分类器、K 均值聚类和各种决策树。只有一个供应商(一个全球系统集成商)明智地谈论了神经网络,并理解它们的意义和差异。当被问及他们的客户项目中有多少应用了神经技术时,他回答说“没有”!
这给 BI 供应商带来了一个普遍的困境。他们关于下一代分析的战略选项包括:
- 忽略 —短期内无收益。太冒险了,不宜过早采用。目前生意很好。
- 炒作——这是下一个大的科技浪潮。让我们把我们公司的未来赌在它上面。把目前所有的产品和服务都贴上 AI 的标签。
- 领导 —成为思想领袖。公开承认潜力和局限。教育大家。想想准备情况。
作为 BI 供应商,哪个选项最适合您?
我推荐选项 3 — 领导,但是要运用谨慎的商业头脑。作为思想领袖,投入资源提高组织内部、外部客户以及整个行业的数据和分析素养。确定并消除组织内采用新一代分析的关键障碍。在大赌注上慢慢来,但是尝试许多小赌注来为你的组织学习最佳实践。
要点:启动一个小型分析创新团队,通过以下方式确定问题的范围:(a)自我教育,(b)汇编有效的用例,(c)实现 2-3 个原型,以及(d)为管理层讨论创建准备计划。建立一个六个月的计划,明确每个月的里程碑。
外卖:开始监控以 arXiv.org为中心的分析研究流,因为每周都有很多帖子。此外,从研究到应用的等待时间正在稳步下降。指派一个有才能的人,他可以扫描学术研究,并提取实际的见解。这个人应该花至少 20%的时间监控、提炼和定期汇报。为了辅助,开放聚合服务正在稳步改善,如代码为arXiv-Sanity两分钟论文O ' Reilly AI 简讯和语义学者。[10]
要点:成为思想领袖也意味着对分析系统日益增长的社会影响和道德问题负有专业责任。否则,这类似于 20 世纪 40 年代理论物理学家的疏忽,他们在鼓吹核能发电的同时忽视了核技术武器化的危险。是时候抓住这个领导机会了!让分析道德成为一个可接受的专业话题,在您的组织内进行讨论。与其他组织合作,集中人工智能未来的智慧。[11]
乘数——从开发应用程序到部署系统
如前所述,我观察到的大多数分析示例都是使用一次性精选数据集训练的独立决策支持应用程序。
为了从分析中获得更大的商业价值,应该将注意力从为单一分析用例开发应用转移到部署增强了多个分析模块的系统上。引人注目的分析应用程序会吸引注意力,但是嵌入在企业系统中的无关紧要的分析模块可能是价值的主要乘数。
想想这些分析模块,比如 20 世纪 90 年代 Informatica 的 ETL 模块或者今天 Teradata 的 ELT 转换。它们是将 A 映射到 B 的可定制的通用转换函数,其中 A 和 B 现在大不相同。如果正确实现,系统模块将逐渐增强组织对客户、供应商和其他人的行为。
十多年来,BI 一直稳步向数据消费者转变,成为数据开发者,学习必要的技术技能,重新设计易于使用的工具。术语普及 BI* 经常被用来表示这种趋势。供应商迎合了各种形式的自助 BI。最新的是辅助分析,分析工具根据数据的性质建议适当的图表来可视化。*
总的来说,辅助分析是商业智能工具成熟的健康趋势。问题是,辅助分析通过关注模型开发中的小问题而分散了对大问题的注意力。你看到了树,却看不到森林。较大的问题(森林)处理业务用例及其分析价值主张,以及特定的技术用例、其参数和期望的度量。支持分析系统工作的工具甚至方法中应该嵌入更多的严格性和验证性。
要点:升级您的 DevOps 和 DataOps 敏捷开发方法,以用于未来的分析系统。这应该是全行业的努力。一旦标准出现,供应商就可以创建支持这种方法所需的工具。如果这种分析开发方法构建得当,那么部署到生产环境应该只需一次点击(加上大量的测试)。依靠您的分析供应商合作伙伴提供帮助。
推动者—业务/数据分析师的角色至关重要
在 Qonnections,在 Elif Tutuk 和 Vinay Kapoor 关于 Qlik Sense 的增强智能的演讲之前,我被要求做一个解释人工智能的简短介绍。我挣扎着在十分钟内能说些什么实质性的东西。我考虑了受众的性质,主要是数据分析师(精通技术)和一些业务线业务分析师(精通业务)。答案似乎显而易见。有一个非常重要的消息要传递!**
IT 专业人员(尤其是业务分析师)和数据科学家之间的文化差异越来越大。他们说不同的语言。除非得到解决,否则结果可能会限制组织的 BI 发展,从而伤害组织。为了完成他们的工作,数据科学家将会离开并实施烟囱系统,漂浮在云中,不受 IT 部门的影响。并且,商业分析师将否认对那些人工智能系统的任何责任或知识。数据分析师将继续涉足描述历史数据的可视化图表。管理两个不沟通的 IT 团队以及维护不兼容的系统会让高管们感到沮丧。而且,没有人会为分析模块执行概念化业务用例的艰苦工作。大家都会不开心!
纵观商业智能在企业中的发展历史,现在最需要的是强有力的行政领导,来引领整个组织进入商业智能发展的下一个阶段。治理和敏捷性之间的平衡从未如此微妙。IT 角色和职责发生了前所未有的巨大变化。而且,技术变革的速度从未如此之快。
在神经网络技术飞速发展的今天,数据科学团队必须专注于细节,确保分析模型得到正确的构建、训练和反复验证。他们需要用例目标和标准的清晰陈述,以及部署后的持续模型评估。数据科学家不适合编写这些需求陈述,这需要对业务有深入的了解。对这些声明负责的是从高层到中层的管理层。
最后,猜测谁应该是所有管理层和技术专家(尤其是数据科学)之间的桥梁,确保分析用例的目标和标准正确完成。
重点是… 业务/数据分析师是未来成功分析系统的推动者。[12]
收获:对整个企业中业务/数据分析师的角色进行战略性重新评估。这些人目前是如何被利用的?相对于他们在组织中的位置,商业知识和技术知识的平衡是什么?他们的角色应该如何发展以支持未来的分析系统?他们应该有哪些新的职责?此外,他们需要哪些新技能和工具来完成这些新的以分析为中心的任务?
要点:设计一个培训下一代业务/数据分析师的计划,以提升他们的技能和对分析系统这一新兴新角色的渴望。如果成功,他们应该成为数据科学家的好朋友,而不是试图取代他们成为公民数据科学家。[13]
要点:从战略角度思考数据科学团队的职能。你真的想雇佣整个团队作为员工吗?也许几个协调数据科学家就足够了。定制的分析工作可以外包给高度专业化的开发团队,而常见的分析任务可以由云供应商提供 web 服务。如果是这样的话,全球 SI 公司,加上 AWS 和 Azure 将会掀起一场疯狂。
能源——新一代数据极客的好奇心
我立刻注意到,这两个活动的参与者都很好奇,精力充沛,干劲十足,而且都不到 40 岁。对我来说,进入这个房间并戏剧性地提高平均年龄有点不和谐。观众的注意力中有复兴的能量,就像这些技术对他们个人来说真的很重要。但是,为什么呢?
早餐时,我和一个随机的 Alteryx 客户聊了聊。他没有提示就说:“使用这个产品很有趣,也很吸引人。我真的很喜欢图标中的艺术细节。让他们与众不同。简单易学。令人愉快。我的工作日过得很快**
他的情绪呼应了过去几十年 SAS 用户群爱节和过去几年 Tableau 摇滚音乐会的能量。这种能量似乎来自他们的内心,而不是他们的头脑或钱包。以下是我对这种年轻活力背后原因的解释…
首先,他们的动机已经从以技术为中心的喜爱转变为以故事为中心的好奇。他们不关心技术,只关心获得工具和技能,根据数据讲述故事。他们不关心分析产生的洞察力本身,而是那些洞察力所预言的故事。
其次,分析公司给他们的故事增加了色彩(更有深度和戏剧性)。分析正在将注意力从洞察“什么是有趣或重要的”转移到了解谁造成了什么以及为什么。这就像是一个调查海伦女士是如何被杀害的神秘事件。他们的角色变得像一个调查记者,新闻截止时间是下午 6 点。
第三,**任何故事都不会以谁干的结束。必须有决心。**我最喜欢的问题是,“你用你知道的东西做什么?“换句话说,故事必须以解决业务问题的具体行动结束。这将需要了解要雇用的相关临时关系。[14]或者简单地说,下一代数据极客想要了解商业是如何运作的,以便完成他们的故事。
要点:高管们,通过证实他们对组织的贡献来支持你们的下一代数据极客。他们的贡献往往被埋没了几层,或者从未引起管理层的注意。
要点:新一代数据极客非常清楚他们工作职责的社会意义和道德问题。他们意识到现在忽视这些问题或者对这些问题过于天真是一种职业过失。现在这被认为是他们讲故事的一部分。高管应该支持这种趋势,促进对这些问题的公开和诚实的讨论,并使这些讨论成为组织文化中安全和正常的一部分。
我们到了吗?
我认为我们离山口还很远。在接下来的几十年里,商业智能的发展将以其令人惊讶的转变和曲折继续向上。所以,系紧你的安全带。欣赏风景!
这里有一些总结之前的最后建议…
收获:一旦你有了一个可行的分析用例,将你的思维从以分析为中心的应用程序转移到分析驱动的系统。由于价值乘数,正确实现的分析用例将开始从外部改变组织行为。引人注目的分析应用程序固然不错,但是嵌入在企业系统中的几个无关紧要的分析模块可能会产生巨大的业务影响。处理部署、运营和治理问题。
外卖:忘掉你认为自己对分析的了解。分析每天都在发展,从应用研究到实际应用的延迟正在快速下降。例如,研究论文会在早上发布在 arXiv 上;成功的 github 分叉在下午被报告,web 服务在第二天可用。现成的下一代分析的潜在用例现在已经超出了行业吸收这些新的 BI 创新的能力。
要点:要扩展你的团队对下一代分析的想法,试试这个练习:点击这里;)
承认
我收到了以下人员对文章草稿的许多有用建议:Remco Broekmans、Rob Gerritsen、Dan Graham、April Healy、Julie Hunt、Dave Imhoff、Todd Margolis、Joseph A. di Paolantonio、Neil Raden 和 Elif Tutuk。谢谢你帮我理清思路!
笔记
[01] Qlik 新闻稿位于https://www . Qlik . com/us/company/press-room/press-releases/Qlik-to-acquire-attunity。再加上埃克尔森集团的韦恩·埃克尔森在https://www . Eckerson . com/articles/qlik-acquisites-at unity-fleshes-out-its-data-analytics-platform的一篇文章。Eckerson 表示,Qlik“希望成为大型企业集成数据和分析的一站式商店”。
[02]位于https://investor . Salesforce . com/press-releases/press-release-details/2019/sales force-Signs-Definitive-Agreement-to-Acquire-Tableau/default . aspx 的 sales force 新闻稿。加上《福布斯》在的一篇文章 https://www . Forbes . com/sites/patrickmoorhead/2019/06/18/sales forces-tableau-acquisition-admission-organic-innovation-failure/# 1e 26457 B3 ca 2。
*[03]艾米·韦伯(Amy Webb)题为《九大巨头》(The Big Nine)的有争议的书(2019 年 3 月 5 日)指出,“九大巨头——亚马逊、谷歌、脸书、腾讯、百度、阿里巴巴、微软、IBM 和苹果——是人工智能的新神,它们正在改变我们的未来,以获取直接的经济利益。”对当前人工智能歇斯底里的技术、经济和政治的有用(但有争议)见解,以及有据可查的事实。【https://www.amazon.com/dp/B07H7G7CMN/ *
[04]即将发表的关于新一代分析的文章。当发表在《走向数据科学》上时,我会在这里发布一个链接。有人对合作感兴趣吗?
[05]维基百科条目有关于 https://en.wikipedia.org/wiki/DataOps的数据操作的有用背景。然而,在别处搜索更多当前和详细的材料,例如在 https://www.eckerson.com/thought-leadership的埃克尔森集团思想领导部分。
[06]https://thedataliteracyproject.org/的数据扫盲计划。浏览网站。参加在线评估。
[07]这里有几个关于分析素养的资源:
- https://towards data science . com/data-science-literacy-for-the-enterprise-fadaf 9268494
- https://www . Gartner . com/smarterwithgartner/a-data-and-analytics-leaders-guide-to-data-literature/
- https://tdwi . org/events/on site-education/on site/sessions/business-analytics/adv-all-developing-data-analytics-literacy-workshop . aspx
- https://HBR . org/2018/10/your-data-literacy-on-understanding-the-types-of-data-and-how-they-capture
[08]2008 年出版的令人愉快的经典著作《可预测的非理性》,在 https://www.amazon.com/dp/B002C949KE/的找到。值得每隔几年读一读,再加上搜索参考这一经典的书籍和文章。
[09]我讨厌人工智能这个术语的含义。要了解更多我的观点,请访问 https://towardsdatascience . com/Vendors-Define-Your-Usage-of-AI-9495 b 30 EBD 28
[10]开放 arXiv 聚合服务的完整 URL 是:
- https://arxiv.org/
- https://paperswithcode.com/
- http://www.arxiv-sanity.com/
- https://www.patreon.com/TwoMinutePapers
- https://www.oreilly.com/ai/newsletter.html
- https://www.semanticscholar.org/search?q=deep learning 排序=相关性&fos =计算机科学
[11]人工智能伦理资源有:
- 与艾在https://www.partnershiponai.org/的合作
- fast.ai 艾伦理资源https://www.fast.ai/2018/09/24/ai-ethics-resources/
- https://allenai.org/index.html 艾伦人工智能研究所
- 位于https://intelligence.org/的机器智能研究所(MIRI)
- 在https://intelligence.weforum.org/举行的世界战略情报经济论坛
[12]即将发表的关于业务/数据分析师新角色的文章。将在《走向数据科学》发表时在此处发布链接。有人有兴趣合作吗?
[13]小心公民数据科学家计划。只有少数下一代数据极客想调整张量的位,但不是大多数。这就像将赛车手改造成汽车工程师。该组织需要两者,密切合作。[13]
[14]即将发表的关于因果分析出现的文章。将在《走向数据科学》发表时在此处发布链接。需研究朱迪亚·珀尔(https://en.wikipedia.org/wiki/Judea_Pearl)等人的文献。有人有兴趣合作吗?
“嘿,那是什么?”使用解释调试预测
原文:https://towardsdatascience.com/https-towardsdatascience-com-that-debugging-predictions-using-explanations-861cc94cb875?source=collection_archive---------40-----------------------
机器学习(ML)模型到处都在涌现。有许多技术创新(例如,深度学习、可解释的人工智能)使它们更加准确,适用范围更广,可供更多人在更多商业应用中使用。名单无处不在:银行业,医疗保健,科技,以上全部。
然而,与任何计算机程序一样,模型也会有错误,或者更通俗地说,就是bug。发现这些 bug 的过程与以前的技术有很大不同,需要一个新的开发者栈。“很快我们就不会给电脑编程了,我们会像训练狗一样训练它们”(《连线》,2016)。“梯度下降能比你写的代码更好。对不起”(安德烈·卡帕西,2017)。
在深度学习神经网络中,我们看到的可能是数百万个连接在一起的权重,而不是人们编写的一行行代码,形成了一个不可理解的网络。(图片鸣谢)
How do we find bugs in this network?
那么我们如何在这个网络中找到 bug 呢?一种方法是解释你的模型预测。让我们看看通过解释可以发现的两种类型的错误(数据泄漏和数据偏差),并用预测贷款违约的例子进行说明。这两个其实都是数据 bug,但是一个模型总结了数据,所以在模型中表现出来。
大部分 ML 模型都是有监督的。您选择一个精确的预测目标(也称为“预测目标”),收集一个具有特征的数据集,并用目标标记每个示例。然后你训练一个模型使用这些特征来预测目标。令人惊讶的是,数据集中经常存在与预测目标相关但对预测无用的要素。例如,它们可能是从未来添加的(即,在预测时间之后很久),或者在预测时间不可用。
这里有一个来自 Lending Club 数据集的例子。我们可以使用这个数据集尝试用 loan_status 字段作为我们的预测目标来建模预测贷款违约。它取值为“全额支付”(好的)或“注销”(银行宣布损失,即借款人违约)。在这个数据集中,还有 total_pymnt(收到的付款)和 loan_amnt(借入的金额)等字段。以下是一些示例值:
Whenever the loan is “Charged Off”, delta is positive. But, we don’t know delta at loan time.
注意到什么了吗?每当贷款违约(“冲销”)时,总支付额小于贷款额,delta (=loan_amnt-total_pymnt)为正。这并不奇怪。相反,这几乎是违约的定义:在贷款期限结束时,借款人支付的金额少于贷款金额。现在,德尔塔没有有肯定违约:你可以在偿还全部贷款本金而不是全部利息后违约。但是,在这个数据中,98%的情况下,如果 delta 为负,则贷款已全部付清;并且 100%的时间 delta 是正的,贷款被注销。包含 total_pymnt 给了我们近乎完美的信息,但是我们直到整个贷款期限(3 年)结束后才得到 total_pymnt!
在数据中包含 loan_amnt 和 total_pymnt 有可能实现近乎完美的预测,但是我们不会真正使用 total_pymnt 来完成真正的预测任务。将它们都包含在训练数据中是预测目标的数据泄漏。
如果我们做一个(作弊)模型,它会表现得很好。太好了。而且,如果我们对一些预测运行特征重要性算法(模型解释的一种常见形式),我们将看到这两个变量变得很重要,如果运气好的话,会发现这种数据泄漏。
下面,Fiddler 解释界面显示“delta”是提高这个示例预测的一个重要因素。
“delta” really stands out, because it’s data leakage.
这个数据集中还有其他更微妙的潜在数据泄漏。例如,等级和子等级由 Lending Club 专有模型分配,该模型几乎完全决定利率。所以,如果你想在没有 Lending Club 的情况下建立自己的风险评分模型,那么 grade、sub_grade、int_rate 都是数据泄露。他们不会让你完美地预测违约,但想必他们会帮忙,否则 Lending Club 不会使用他们自己的模型。此外,对于他们的模型,他们包括 FICO 评分,另一个专有的风险评分,但大多数金融机构购买和使用。如果你不想用 FICO score,那么那也是数据泄露。
数据泄漏是任何你不能或不愿用于预测的预测数据。建立在有泄漏的数据上的模型是有缺陷的。
假设由于糟糕的数据收集或预处理中的错误,我们的数据有偏差。更具体地说,在特征和预测目标之间存在虚假的相关性。在这种情况下,解释预测将显示一个意想不到的特点往往是重要的。
我们可以通过删除邮政编码从 1 到 5 的所有注销贷款来模拟贷款数据中的数据处理错误。在这个 bug 之前,邮政编码并不能很好地预测 chargeoff(一个 0.54 的 AUC ,仅略高于 random)。在这个 bug 之后,任何以 1 到 5 开头的邮政编码都不会被注销,AUC 会跳到 0.78。因此,在根据邮政编码的数据预测(无)贷款违约时,邮政编码将成为一个重要特征。在本例中,我们可以通过查看邮政编码很重要的预测来进行调查。如果我们善于观察,我们可能会注意到这种模式,并意识到这种偏见。
如果用邮政编码的第一个数字来概括,下面是销账率的样子。一些邮政编码没有冲销,而其余的邮政编码的比率与整个数据集相似。
In this buggy dataset, there are no charged-off loans with zip codes starting with 6, 7, 8, 9, 0.
下面,Fiddler 解释 UI 显示邮政编码前缀是降低这个示例预测的一个重要因素。
“zip_code_prefix” really stands out, because the model has a bug related to zip code.
从这种有偏差的数据中建立的模型对于根据我们还没有看到的(无偏差的)数据进行预测是没有用的。它只在有偏差的数据中是准确的。因此,建立在有偏差数据上的模型是有缺陷的。
对于不涉及模型解释的模型调试,还有许多其他的可能性。例如:
- 查找过度配合或配合不足。如果你的模型架构过于简单,它将会不适应。如果太复杂,就会过拟合。
- 对你理解的黄金预测集进行回归测试。如果这些失败了,您也许能够缩小哪些场景被破坏。
由于解释不涉及这些方法,我在这里就不多说了。
如果您不确定模型是否正确使用了数据,请使用要素重要性解释来检查其行为。您可能会看到数据泄漏或数据偏差。然后,您可以修复您的数据,这是修复您的模型的最佳方式。
Fiddler 正在构建一个可解释的人工智能引擎,它可以帮助调试模型。请发邮件至 info@fiddler.ai 联系我们。
原载于 2019 年 7 月 22 日https://blog . fiddler . ai。
数据结构、容器、Kubernetes、知识图表等等…
原文:https://towardsdatascience.com/https-towardsdatascience-com-the-data-fabric-containers-kubernetes-309674527d16?source=collection_archive---------13-----------------------
在这里看完所有的部分:第一部分、第一部分 1b 、第二部分。
在上一篇文章中,我们讨论了知识图的构建模块,现在我们将更进一步,学习构建知识图所需的基本概念、技术和语言。
Image by Héizel Vázquez
目录
- 简介
- 目标
- 集装箱和码头简介
- 什么是容器?
- 我们为什么需要容器?
- 码头工人
- Kubernetes
- 在 Docker 和 Kubernetes 部署 AnzoGraph
- Anzo 和 AnzoGraph 的基础知识
- SPARQL 基础知识
- 齐柏林飞艇在安兹图
- 结论
- 资源
介绍
https://towardsdatascience.com/the-data-fabric-for-machine-learning-part-1-2c558b7035d7
在本系列的上一篇文章中,我谈到了知识图的概念及其与数据结构的关系:
数据结构中的结构是从知识图构建的,为了创建知识图,你需要语义和本体来找到一种链接数据的有用方法,这种方法可以唯一地识别和连接具有常见业务术语的数据。
我还谈到了三元组 : 主体、客体和谓词(或实体-属性-值)以及资源描述框架(RDF)的概念。现在,在所有这些和讨论之后,我们应该准备好创建我们的数据结构了,对吗?没有。
在本文中,我将详细介绍我们需要理解的最后几个部分,以便为我们的公司实际构建知识图和部署数据结构。我将使用由 Cambridge Semantics 开发的独立 AnzoGraph 数据库,并将它与 Docker 和 Kubernetes 一起部署。
可以想象,我们必须了解更多关于容器、docker、kubernetes 等的知识。,但是还有别的。我们需要有一种与数据对话的方式,通常我们用 SQL,但是当你有图形数据时,最好的语言之一叫做 SPARQL,所以我们也将学习它。
本文是一篇教程,提供了关于如何在 Kubernetes 上部署 AnzoGraph 的理论信息,基于剑桥语义的教程:
[## 用 Docker 设置沙盒
编辑描述
docs.cambridgesemantics.com](https://docs.cambridgesemantics.com/anzograph/userdoc/sandbox-docker.htm)
教程的免责声明:我将测试 MacOS 中的所有东西,但是你可以在上面的链接中找到更多关于其他平台的信息。
目标
在文章的最后,你将能够理解容器、Kubernetes 的基础知识,如何在它们之上构建平台,以及我们将使用的图形数据库语言 SPARQL,所有这些都与独立的 AnzoGraph 图形数据库相关。
集装箱和码头简介
https://www.tintri.com/blog/2017/03/tintri-supports-containers-advanced-storage-features
T 这不会是容器的完整概述,只是足够的信息让你知道我们为什么需要它们。请查看下面的参考资料。
什么是容器?
在 docker 的网页上,有一个关于什么是容器的很好的例子:
软件的标准化单位
容器的正式定义是:
容器是一个标准的软件单元,它将代码及其所有依赖项打包,以便应用程序能够快速可靠地从一个计算环境运行到另一个计算环境。
简而言之,容器是一个隔离的环境,您可以在其中设置执行任务所需的依赖关系。它们类似于虚拟机,但功能不同,因为容器虚拟化的是操作系统而不是硬件。
我们可以想象这样一个容器:
https://www.docker.com/resources/what-container
每个容器都有自己独立的用户空间,允许多个容器在一台主机上运行。
为什么我们需要容器?
https://xkcd.com/1629/
容器让我们的生活变得更容易。有了它们,我们可以测试编程环境、软件和工具,而不会损害我们的主操作系统,而且它们在我们产品的分销部分也有惊人的应用。
像本·韦伯、威尔·科尔森、马克·纳格尔伯格和萨钦·阿贝瓦达纳这样的伟人在数据科学领域写了关于容器需求的精彩文章,你可以在下面的参考资料中找到它们。
最大的使用案例是:
- 再现性
- 改善协作
- 节省开发运维时间和数据运维时间
- 更容易分配
当然还有更多,但在数据空间中,这些是最重要的。我们将使用容器创建一个完整的隔离系统来运行 AnzoGraph 数据库,并将其部署在那里。
码头工人
Docker 是创建容器的最佳工具。Docker 是一个基于 Linux 容器的开源项目。
Docker 容器映像是一个轻量级的、独立的、可执行的软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
Docker 图像更像是蓝图。图像是不可变的主模板,用于抽取完全相同的容器。
这是使用 docker 的基本工作流程:
https://towardsdatascience.com/digging-into-data-science-tools-docker-bbb9f3579c87
我们将使用 docker 和 kubernetes(见下文)来部署我们的 AnzoGraph 实例,所以我们需要做的第一件事是安装 docker。在此之前,您需要知道使用 docker 运行 AnzoGraph 有一些要求:
- Docker 版本:需要 Docker 社区版 18 版或更高版本。
- 操作系统 : MacOS、Linux、Windows 10 专业版或企业版。Docker 使用虚拟机管理程序,主机服务器必须支持虚拟化。由于较旧的 Windows 版本和 Windows 10 家庭版不支持 Hyper-V,Windows 上的 Docker 需要 Windows 10 Professional 或 Enterprise。另外,在 Windows 上使用 Docker CE 时,配置 Docker 使用 Linux 容器。不支持使用 Microsoft Windows 容器,因为它为 Windows 容器服务实例提供 Windows API 支持。
- 可用内存:最低 12gb;推荐:32 GB。AnzoGraph 需要足够的 RAM 来存储数据、中间查询结果和运行服务器进程。Cambridge Semantics 建议您分配 3 到 4 倍于计划数据大小的 RAM。
- 可用磁盘空间 : AnzoGraph 内部需要 10 GB。加载文件转移、持久化或备份所需的额外磁盘空间量取决于要加载的数据的大小。对于持久性,Cambridge Semantics 建议您在服务器上拥有两倍于 RAM 的可用磁盘空间。
- CPU 计数:最小值:2;推荐 4+。
让我们从安装 docker 开始。对于 Mac,请点击此处:
[## Mac Docker 桌面- Docker Hub
在 Mac 上开始使用 Docker 的最快和最简单的方法
hub.docker.com](https://hub.docker.com/editions/community/docker-ce-desktop-mac)
点击获取 Docker:
并按照 Docker 文档中的说明安装和运行 Docker。
AnzoGraph 映像需要至少 10 GB 的可用磁盘空间和 7 GiB 的可用 RAM 来启动数据库。
要调整设置,右击 Docker 图标并选择设置。点击磁盘查看可用的磁盘镜像大小。例如:
根据需要调整磁盘大小,然后点击应用保存更改。点击高级查看 CPU 和内存设置。例如:
根据需要调整数值,然后点击应用并重启以应用更改并重启 Docker。
注意:为了记录,我使用了 80GB 的磁盘和 16GB 的内存。
库伯内特斯
https://svitla.com/blog/kubernetes-vs-docker
首先。Kubernetes 怎么发音?根据这个 GitHub 线程的正确说法是:
koo-ber-nay-TACE
这是我说的:
它的意思是“航海大师”。很酷的名字,不是吗?
所以,如果这是水手,船在哪里?还有,是什么船?
根据官方文档, Kubernetes (K8s) 是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。所以“船”就是我们的容器,以及里面的应用程序。Kubernetes 是所有关于抽象的复杂性。
欲了解更多信息,请点击此处:
[## 了解 Kubernetes 基础知识
Kubernetes 基础本教程提供了一个 Kubernetes 集群编排系统基础的演练…
kubernetes.io](https://kubernetes.io/docs/tutorials/kubernetes-basics/)
和下面的参考资料部分。
在 Docker 和 Kubernetes 中部署 AnzoGraph
H 在这里,我们将专注于运动学,因为这是我们如何使用 Kubernetes 和 Docker 与 AnzoGraph。Kitematic 是一个简单的应用程序,用于管理 Mac、Linux 和 Windows 上的 Docker 容器。
所以,我们要做的第一件事就是通过点击苹果菜单中的 Docker 图标并选择 Kitematic 来启动 Docker Kitematic。
这将引导您下载软件:
然后,当所有的东西都安装好后,只需打开 Kinematic 并在搜索字段中键入 anzograph 并找到 anzograph 库:
然后点击 Create 启动 AnzoGraph 部署,您将看到:
等待几秒钟,当您看到消息Press [CTRL+C] to stop
时,按 CTRL+C 关闭引导日志。AnzoGraph 现在在您的 Docker 实例中运行。
现在您可以点击 web 预览来查看 AnzoGraph 在哪里运行:
在我的例子中,它运行在http://localhost:32871/上,但是它可以为你改变。
在登录界面上,输入用户名 admin 和密码 Passw0rd1 ,然后点击登录。
你被录取了!!!你应该会看到这个:
因此,查询部分看起来像 SQL,但不是。什么是 AnzoGraph??我希望你记得。如果没有,我给你出个主意。
Anzo 和 AnzoGraph 的基础知识
https://towardsdatascience.com/deep-learning-for-the-masses-and-the-semantic-layer-f1db5e3ab94b
你可以用 Anzo 建立一个叫做“企业知识图”的东西。
AnzoGraph 是一个独立的本地大规模并行处理(MPP)图形 OLAP 数据库,旨在提供大数据规模的快速高级分析,AnzoGraph 的一个版本与 Anzo 集成。
随着机器学习和人工智能的发展,图 OLAP 数据库变得非常重要,因为许多机器学习算法本身就是图算法,在图 OLAP 数据库上运行比在 RDBMS 上运行更有效。
图中的节点和边灵活地捕捉了每个数据源的高分辨率孪生数据—结构化的或非结构化的。该图表可以帮助用户快速、交互式地回答任何问题,允许用户与数据进行对话以揭示见解。
所有这些的目标是构建一个数据结构:
数据结构是支持公司所有数据的平台。它是如何被管理、描述、组合和普遍访问的。该平台由企业知识图构成,以创建统一的数据环境。
如果你想了解更多,请查看我在该系列上的文章:
[## 本体论和数据科学
对现有数据的研究如何帮助我们成为更好的数据科学家。
towardsdatascience.com](/ontology-and-data-science-45e916288cc5) [## 图形数据库。有什么大不了的?
继续对语义和数据科学的分析,是时候讨论图形数据库以及它们必须…
towardsdatascience.com](/graph-databases-whats-the-big-deal-ec310b1bc0ed) [## 面向大众的深度学习(…和语义层)
深度学习现在无处不在,在你的手表里,在你的电视里,在你的电话里,在某种程度上,在你的平台上…
towardsdatascience.com](/deep-learning-for-the-masses-and-the-semantic-layer-f1db5e3ab94b)
SPARQL 基础知识
PARQL 发音为“sparkle ”,是资源描述框架(RDF)的查询语言。如果您想了解更多关于 RDF 的信息,请查看:
[## 机器学习的数据结构。第 2 部分:构建知识图。
在能够开发数据结构之前,我们需要构建一个知识图。在这篇文章中,我将建立一个基础…
towardsdatascience.com](/the-data-fabric-for-machine-learning-part-2-building-a-knowledge-graph-2fdd1370bb0a)
但基本上,RDF 是一种定向的、带标签的图形数据格式,用于表示 Web 中的信息。RDF 通常用于表示个人信息、社交网络、关于数字制品的元数据等,并提供一种集成不同信息源的方法。
我们将在这里理解 SPARQL 的基础知识,目标是至少理解这个查询:
SELECT ?g (COUNT(*) as ?count)
WHERE {
graph ?g{
?s ?p ?o
}
}
GROUP BY ?g
ORDER BY DESC(?count)
如果您想了解关于 SPARQL 的更多信息,请查看官方文档:
[## RDF 的 SPARQL 查询语言
RDF 是一种定向的、带标签的图形数据格式,用于表示 Web 中的信息。本规范定义了…
www.w3.org](https://www.w3.org/TR/rdf-sparql-query/)
让我们从一些样本数据开始运行一些查询。在查询控制台上,用以下语句替换默认查询:
LOAD WITH 'global' <s3://csi-sdl-data-tickit/tickit.ttl.gz> INTO GRAPH <tickit>
该语句从 csi-sdl-data-tickit S3 桶上的tickit.ttl.gz目录中加载样本 Tickit 数据。顺便说一下,Tickit 数据集捕获了虚构的 Tickit 网站的销售活动,人们在该网站上买卖体育赛事、演出和音乐会的门票。
数据包括人员、地点、类别、日期、事件、列表和销售信息。通过识别一段时间内的门票移动、卖家的成功率、最畅销的活动和场地以及一年中最赚钱的时间,分析师可以使用这些数据来确定提供什么激励措施、如何吸引新人以及如何推动广告和促销。
下图显示了 tickit 图的模型或本体。圆圈代表数据的主题或类别,矩形代表属性:
https://docs.cambridgesemantics.com/anzograph/userdoc/tickit.htm
然后单击 Run,过一会儿您应该会看到消息“更新成功”
为了检查一切是否正确,运行以下查询:
SELECT (count(*) as ?number_of_triples)
FROM <tickit>
WHERE { ?s ?p ?o }
统计 Tickit 数据集中三元组的数量。您应该得到:
SPARQL 惯例:
- 大写:虽然 SPARQL 不区分大小写,但是为了可读性,本节中的 SPARQL 关键字都是大写的。
- 斜体 :斜体术语是您在查询中替换的占位符值。
- [ ] :表示可选条款。
- | :表示或。指示您可以使用一个或多个指定的选项。
- ^ :表示异或(XOR)。表示您只能选择一个指定的选项。
学习数据库语言的基本部分是选择和检索一些数据。对于类似 SQL 的 SPARQL,提供了一个用于选择或查找数据的选择查询表单。
以下简单的 SELECT 语句查询样本 Tickit 数据集,以返回 event100 的所有谓词和对象:
SELECT ?predicate ?object
FROM <tickit>
WHERE {
<event100> ?predicate ?object
}
ORDER BY ?predicate
您应该看到:
你可能在想什么是?谓词和?object 部分是,因为其他的东西,FROM,WHERE 和 ORDER BY,似乎和 SQL 中的一样。
在过去的一篇文章中,我用一个例子解释过:
To have a triple we need a subject and object, and a predicate linking the two.
谓语和宾语的概念来源于三元组的概念。所以你可以看到我们有了主语 < Geoffrey Hinton >与宾语 <研究者>由谓语 <构成>。这对我们人类来说可能听起来很容易,但需要一个非常全面的框架来用机器做到这一点。
你会在其他地方发现这些概念是实体-属性-值。
仅此而已,它们只是我们在构成知识图的图形数据库中的普通名称和概念。
再来做一个例子。我们将在 Tickit 数据集中列出每个不同的事件名称:
SELECT DISTINCT ?name
FROM <tickit>
WHERE {
?event <eventname> ?name.
}
您应该得到:
SPARQL 的另一个重要部分是构造的概念。
我们使用构造查询表单从现有数据创建新数据。构造查询采用每个解决方案,并用它替换图或三元模板中的变量。
以下示例查询指定了一个三元组模板,该模板为样本 Tickit 数据集中的 person 三元组构造了一个新的年龄谓词和大约年龄值:
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
CONSTRUCT { ?person <age> ?age . }
WHERE { GRAPH <tickit> {
{ SELECT ?person ((YEAR(?date))-(YEAR(xsd:dateTime(?birthdate))) AS ?age)
WHERE {
?person <birthday> ?birthdate .
BIND(xsd:dateTime(NOW()) AS ?date)
}
}
}
}
ORDER BY ?person
LIMIT 50
您应该得到:
这里,PREFIX 子句声明了您希望在查询中引用的 URIs 的任何缩写。BIND 将表达式的结果赋给一个新变量。WHERE 子句中的图形部分仅用于匹配
我们可以用子句 ask 向我们的图提问。我们使用 ASK 查询表单来确定特定的三元组模式是否存在于指定的数据集中。ASK 返回 true 或 false,这取决于解决方案或匹配是否存在。
例如:
ASK FROM <tickit> { ?s <eventname> "Wicked" . }
对于这一个,你将得到真😃
我们将使用的最后一个子句是 DESCRIBE。我们使用 DESCRIBE 查询表单返回与指定资源相关联的所有三元组,而不仅仅是绑定到您指定的任何变量的三元组。
例如,以下简单的 DESCRIBE 示例查询样本 Tickit 数据集,以描述与 person2 相关联的所有资源:
DESCRIBE <person2>
FROM <tickit>
您将获得:
s | p | o
--------------+-------------------------------------------------+------------------
person6048 | friend | person2
person9251 | friend | person2
listing30988 | sellerid | person2
sales28393 | sellerid | person2
sales28394 | sellerid | person2
person2 | lastname | Humphrey
person2 | like | musicals
person2 | birthday | 1995-01-03
person2 | http://www.w3.org/1999/02/22-rdf-syntax-ns#type | person
person2 | card | 9955429152637722
person2 | city | Murfreesboro
person2 | friend | person48892
person2 | friend | person15323
...
99 rows
关于 SPARQL 还有很多要学习的,另一个很好的信息来源是剑桥语义本身的 SPARQL 参考:
[## SPARQL 参考
AnzoGraph 实现了 W3C SPARQL 1.1 查询语言中描述的标准 SPARQL 形式和函数…
docs.cambridgesemantics.com](https://docs.cambridgesemantics.com/anzograph/userdoc/sparql-ref.htm)
齐柏林飞艇
我们要讨论的最后一部分是如何使用 Zeppelin 并将其与独立的图形分析数据库 AnzoGraph 连接。Zeppelin 是一款基于网络的笔记本电脑,类似于 Jupyter,我们将使用它的部署来拥有一个集成的 SPARQL 解释器,使我们能够使用 gRPC 协议与 AnzoGraph 建立一个安全的、经过身份验证的连接。
第一步是访问 docker CLI 并选择一个文件夹来存储 Zeppelin。我是这样做的:
- 打开 Kinematic 并点击 Docker CLI
2.选择一个文件夹,然后运行:
[ -d $PWD/logs ] || mkdir -p $PWD/logs
[ -d $PWD/notebook ] || mkdir -p $PWD/notebook
最后,运行以下命令,在端口 8080 上下载并运行 Zeppelin 映像:
docker run -p 8080:8080 --name=zeppelin -v $PWD/logs:/logs -v $PWD/notebook:/notebook \
-e ZEPPELIN_NOTEBOOK_DIR='/notebook' \
-e ZEPPELIN_LOG_DIR='/logs' \
-e ZEPPELIN_WEBSOCKET_MAX_TEXT_MESSAGE_SIZE=10240000 \
-d cambridgesemantics/contrib-zeppelin:latest \
/zeppelin/bin/zeppelin.sh
部署完成后,在浏览器中转至以下 URL 打开 Zeppelin:
[http://localhost:8080/#/](http://localhost:8080/#/) # this may be different
此刻您应该会看到这个屏幕:
要连接 AnzoGraph,点击匿名下拉列表,选择翻译:
现在输入“sparql”并找到 SPARQL 解释器:
点击编辑按钮,修改解释器,输入您的 AnzoGraph 部署细节,并与数据库建立安全连接:
- anzo . graph . host:AnzoGraph 主机的 IP 地址。
- anzo . graph . password:anzo . graph . user 字段中用户的密码。
- anzo.graph.port :用于 AnzoGraph 的 gRPC 端口。默认值为 5700 。不要更改该值。
- anzo.graph.trust.all :指示 Zeppelin 信任 AnzoGraph SSL 证书。接受默认值真。
- anzo.graph.user :登录 AnzoGraph 的用户名。
添加完连接详情后,点击屏幕底部的保存。Zeppelin 会显示一个对话框,询问您是否要使用新设置重新启动解释器。点击确定配置连接。
当解释器重新启动完成时,单击屏幕顶部的 Zeppelin 徽标返回到欢迎屏幕。
现在使用平台下载 AnzoGraph 教程 Zeppelin 笔记本,并在电脑上解压下载的笔记本 ZIP 文件。ZIP 文件包含 AnzoGraph-Tutorial-notebook . JSON。
在 Zeppelin 欢迎界面上,点击导入注意:
在导入界面,点击选择 JSON 文件,然后选择要导入的 AnzoGraph-Tutorial-notebook . JSON 文件。现在,要在文件中运行查询,请单击该段落的 run 按钮。看一下我们讨论 SPARQL 的上一节,以理解这些查询:)
你应该会看到这个:
结论
这只是我们创建数据结构过程的开始。到目前为止,我们已经建立了理论框架,现在是在本地推出 AnzoGraph 的第一个实际步骤。
我们学习了容器、Docker、Kubernetes、SPARQL、RDF 和 Zeppelin,以及如何查询图形数据。如果你已经知道 SQL,这种改变并不疯狂,但是你需要了解一门新的语言。
在未来,我们将把我们的“公共数据集”转换成图表,然后开始构建我们的知识图表和数据结构,在其上运行查询,最后通过机器学习来预测未来。
感谢您的阅读,如果您想了解更多信息,请关注我这里,以及 LinkedIn 和 Twitter:
[## 法维奥·瓦兹奎-科学与数据公司创始人/首席数据科学家| LinkedIn
加入 LinkedIn ‼️‼️重要提示:由于 LinkedIn 技术限制,我现在只能接受连接请求…
www.linkedin.com](https://www.linkedin.com/in/faviovazquez/) [## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/faviovaz)
资源
[## 对初学者友好的容器、虚拟机和 Docker 介绍
如果你是一个程序员或技术人员,你可能至少听说过 Docker:一个打包、运输…
medium.com](https://medium.com/free-code-camp/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b) [## 创业公司的数据科学:容器
为机器学习构建可重复的设置
towardsdatascience.com](/data-science-for-startups-containers-d1d785bfe5b) [## 没有麻烦的码头工人
使用 repo2docker 自动构建 docker 容器
towardsdatascience.com](/docker-without-the-hassle-b98447caedd8) [## 挖掘数据科学工具:Docker
Docker 是一个创建和管理“容器”的工具,它就像一个小虚拟机,你可以在其中运行你的…
towardsdatascience.com](/digging-into-data-science-tools-docker-bbb9f3579c87) [## 数据科学码头工人
Docker 是一个为软件工程师简化安装过程的工具。来自统计背景的我…
towardsdatascience.com](/docker-for-data-science-4901f35d7cf9) [## Kubernetes 的关键概念
云计算、容器化和容器编排是 DevOps 中最重要的趋势。无论你是…
towardsdatascience.com](/key-kubernetes-concepts-62939f4bc08e) [## RDF 的 SPARQL 查询语言
RDF 是一种定向的、带标签的图形数据格式,用于表示 Web 中的信息。本规范定义了…
www.w3.org](https://www.w3.org/TR/rdf-sparql-query/) [## AnzoGraph 部署和用户指南
欢迎使用 AnzoGraph 部署和用户指南!本指南包括 AnzoGraph 部署说明、指南和…
docs.cambridgesemantics.com](https://docs.cambridgesemantics.com/anzograph/userdoc/home.htm)
蒙特卡洛模拟能驱散‘困难的第三张专辑’吗?
原文:https://towardsdatascience.com/https-towardsdatascience-com-the-difficult-third-album-655d7a710412?source=collection_archive---------31-----------------------
数字音乐
使用 Python 进行排列测试和蒙特卡罗模拟的介绍
The Killers, sensibly sticking to their first two albums at Glastonbury 2019 (Photo: NME)
《困难的第三张专辑》在音乐界就像民间传说一样好。
一个乐队的首张专辑实际上从一开始就一直在建设中。对一些乐队来说,这可能代表了多年的歌曲创作和提炼。这听起来很新鲜,而且没有期望的重量。
一个乐队的第二张专辑(所谓的第二张专辑)是带着第一张专辑的成功所带来的能量和信心制作的。即使一个乐队的声音从他们的首次亮相到现在没有太大的变化,人们也不太可能在一次发行后就厌倦它,如果它一开始就很好的话。
因此,如果乐队能够淘汰体面的首次亮相和大二学生,是什么让第三张专辑如此艰难?首先,第三张专辑可能会在第一张的四到五年后推出——流行的音乐趋势将会改变。乐队通常需要超越他们可能已经形成的舒适区,这可以发现那些不太符合标准的歌曲作者。
此外,一个厌倦了几年巡回演出的乐队可能缺乏空间来写一张唱片的高质量材料,长时间的巡回演出会让一个乐队彻底厌倦彼此。长期滥用药物在摇滚乐中仍然很常见,而且并不像甲壳虫乐队让你相信的那样有助于创作好音乐。
艰难的第三篇博文
理论站得住脚,但是‘困难的第三张专辑’是在数据中诞生的吗?为了找到答案,我们将使用我们在本系列的前几篇文章中看到的数据集,它由从 Metacritic 收集的数据组成。
[## 魔鬼的音乐
Pitchfork 真的是互联网最苛刻的乐评人吗?
towardsdatascience.com](/the-devils-music-622d29028c0b)
我们将为每张专辑考虑的重要数据点是它的“ Metascore ”。这是一张专辑不同评论家评论的加权平均值。
虽然用于创建 Metascore 的确切方法并不公开,但 Metacritic 建议“根据[出版物的]质量和整体地位”给予额外的权重。然后将这些分数标准化(类似于大学里的“曲线评分”),以防止分数聚集在一起。无论如何,Metascore 是衡量任何一张专辑“真实”质量的最佳标准。
乍一看
我们从“专辑”数据帧开始,它包含每个发行版本的信息,如艺术家、专辑的 Metascore 和专辑的流派。数据集中有 17,727 个相册。
An extract of the Albums dataframe. Note — the ‘SuperGenres’ column is a high level view of the genres given on the album’s Metacritic page. For example, terms like ‘Indie’ or ‘Metal’ would be given as ‘Rock’ here. Note, an album can be assigned to more than one genre — the dictionaries in the ‘SuperGenres’ column describe the different weightings of each genre for that album.
出于这种分析的目的,我们关注那些只制作了至少部分“摇滚”专辑的艺术家,因为“困难的第三张专辑”通常与这种类型有关。我们也将只考虑发行了至少三张专辑的艺术家。这将范围缩小到 1324 位艺术家的 5791 张专辑。
我们可以通过几种方式来看待这些数据。首先,让我们简单地把不同专辑的 Metascores,根据专辑是一个乐队的首张专辑、第二张专辑还是第三张专辑来分组。
通过绘制这三组专辑的均值和核密度估计值 (KDEs ),我们看到元得分的分布非常相似。首张专辑的平均元得分较高,第二张专辑的元得分略高于第三张专辑。
Vertical dashed lines represent means for each group of albums
我们可以查看数据的另一种方式是考虑一个乐队从一张专辑到下一张专辑的相对 Metascore 差异。我们可以绘制出乐队专辑相对于他们首次亮相的得分,从而显示他们的得分如何随着时间的推移而发展。
Green lines represent artists that improved from albums 1 to 2, and then again from 2 to 3. Amber lines represent artists whose third albums were better than their debuts, but whose second albums were worse.
同样,我们看到专辑三的平均 Metascore(相对于首张专辑)下降了。这就支持了‘困难的第三张专辑’的存在。然而,每张专辑的差异是显著的,就平均得分“轨迹”而言,没有明确的模式。许多乐队完全避免了“困难的第三张专辑”综合症(上图中用绿色和琥珀色突出显示的那些)。
因此,我们有一些证据表明,“第三张专辑”获得的元批评分数比首次亮相或大二学生低。但我们显然在数据中有很多噪音,并且均值之间的差异远非令人信服。光凭肉眼观察数据不足以得出结论——我们需要更加严谨的统计数据。
蒙特卡罗模拟——简介
蒙特卡洛模拟是一种非参数统计测试,它可以告诉我们两个样本是否来自同一人群(在给定的确定性范围内——通常为 95%)。换句话说,它们可以告诉我们两个样本的平均值之间的差异是否具有统计学意义。
从这个意义上说,它们具有与 T 检验相似的功能。然而,蒙特卡罗模拟的优点是,我们可以忽略一些假设,这些假设必须满足 T 检验才是可靠的(例如,正态分布样本)。在我看来,蒙特卡洛模拟也更直观。
A photo of Monte Carlo to keep you going through the statsy bit that’s coming up…
让我们考虑一个非常基本的例子。
假设我们有两个样本,大小分别为 4 和 3。
我们可以看到样本 A 的均值比样本 B 的均值大 1.67。因此,我们可能会得出这样的结论:样本 A 来自不同的总体,而样本 B 的均值更大。
但是,为了便于论证,我们假设 A 和 B 是从同一个人群中抽取的(把这个当作零假设)。现在,如果我们观察相同的 7 个数据点,但排列不同(仍然抽取大小为 4 和 3 的样本),我们观察到大于 1.67 的平均差异的可能性有多大?
如果我们发现绘制这些大小的样本通常会产生大于 1.67 的平均差异,那么这种差异显然不是非常特殊的——我们可以得出结论,两个原始样本没有显著差异。
反过来,如果我们大多看到均值差异小于 1.67,那么我们可以得出相反的结论。这样的平均差异是不可能的,因此两个原始样本是明显不同的。
因此,我们研究了从现有的 7 个数据点中抽取大小为 4 和 3 的样本的所有不同方法。
There are 35 possible permutations, as given by the N choose K formula
我们看到有 3/35 的实例(或 8.5%)的平均差异大于 1.67。这个百分比可以像标准 T 检验中的 p 值一样使用。
换句话说,如果我们想以 95%的把握说人口 A 的平均值大于人口 B 的平均值(即,我们想使用 0.05 的α值),那么我们需要这个值小于 5%。
既然 8.5% > 5%,就不能拒绝两个样本来自同一总体的零假设。样本 A 与样本 B 在统计上没有差异,尽管具有较大的平均值。
上面有 7 个数据点的例子可以很好地解释排列测试的理论。然而,如果我们想在现实世界中部署同样的逻辑,就有一个障碍。
当我们增加样本量时,两个组合样本的可能排列数爆炸。例如,如果我们有两个大小为 140 的样本,那么这 280 个数据点的可能排列比已知宇宙中的原子还要多。
Just having two samples, each of size 10, results in nearly 200,000 possible permutations
鉴于我们对“困难的第三张专辑”的分析中有几张千张专辑,不可能查看每种可能排列的均值差异——地球上没有足够强大的计算机。
这就是蒙特卡罗模拟方法所处理的问题。蒙特卡洛模拟不是计算出所有可能的排列(可能有几十亿几十亿),而是从可能的排列中随机抽取样本,然后计算它们的平均差。
让我们用尺寸为 20 和 15 的较大样本创建一个新示例。
假设我们将上面的两个样本结合起来,取一系列 20 和 15 大小的样本(每次取它们平均值的差)。有 3,247,943,160 种可能的方法来做到这一点,但是我们不需要查看每一种方法。记住——蒙特卡罗方法只会从这些排列中抽取一个样本。
我们需要回答的下一个问题是——在我们对自己的答案有信心之前,我们需要进行多少次排列?
正如我们所看到的,一旦我们的模拟观察到超过 10,000 个排列,低于 0.92 的平均差异份额(原始样本对的平均差异)开始稳定。当我们进行蒙特卡洛模拟来观察 100,000 种排列时,我们可以非常确定我们的 p 值将足够接近真实值。
在这种情况下,p 值稳定在 0.095 左右。同样,这大于我们的标准α值 0.05,因此我们不能拒绝零假设——样本 A 和样本 B 没有显著差异,尽管它们的均值不同。
用蒙特卡洛模拟法分析“困难的第三张专辑”
让我们将这一理论应用于相册数据集。首先,让我们引入一些必需的库。Pandas 将允许我们与相册数据框架进行交互,Numpy 将允许我们快速进行基本的操作和算术——当你运行成千上万的模拟时这很有用!
**import** pandas **as** pd
**import** numpy **as** np
我们现在需要编写几个额外的函数。首先,我们需要一个可以从一个 Numpy 数组中减去另一个数组的函数。换句话说,如果我们有两个数组:
- [2, 3, 5, 7, 7, 7, 8]
- [3, 7, 7]
然后我们需要一些返回[2,5,7,8]的函数
我们在蒙特卡洛模拟的部分需要这一点,其中,已经从组合样本中抽取了数据点的初始随机选择,我们需要未被选择的其他数据点的列表。我在谷歌上搜索了一个内置的 Numpy 函数来做这件事,但是没有用。如果它确实存在,那么请随时给我发消息
第二个函数是运行蒙特卡罗模拟本身的函数。我们内置了几个额外的参数,包括它应该运行的默认模拟次数,以及我们测试样本 A 的平均值是大于还是小于样本 b 的平均值。
让我们使用上面的函数来运行一些假设检验。
首先,让我们比较一下第三张专辑和第一、第二张专辑的原始 Metascores。记住——在这些测试中,我们只使用摇滚歌手,只考虑发行了三张或更多专辑的歌手。
p-value derived from 50,000 Monte Carlo simulations
所以看起来第三张专辑的 metascore 明显低于初次登场和大二学生的 metascore 总和。
然而,这有可能是由首张专辑中相对较高的分数驱动的吗?让我们只比较第三张专辑和第二张专辑——我们知道第三张专辑的平均 Metascore 比第二张专辑稍低,但是差距似乎很小。
p-value derived from 50,000 Monte Carlo simulations
事实上,假设检验表明差距并不显著——超过 40%的相同数据的随机排列产生了更大的平均差异。我们未能证明第三张专辑通常比第二张专辑差。
从出道到出第二张专辑的差距呢?这里的平均差异看起来更大,但它有统计学意义吗?
p-value derived from 50,000 Monte Carlo simulations
这里我们可以看到我们的 p 值确实非常小——不到 0 . 1%的随机排列比真实的排列有更大的平均差异。我们可以断然拒绝零假设,似乎在出道专辑和大二之间存在统计上的显著差异。
因此,第三张专辑远不是“困难”的一张,似乎乐队在制作第二张专辑时面临着更大的挑战。
这是我的“ 【数字音乐】 ”专栏的最新博客,用数据讲述现代音乐产业的故事。我很乐意听到对上述分析的任何评论,或者对数据集本身的任何想法。欢迎在下方随意留言,或者通过LinkedIn联系我。
传播病毒:图嵌入的一个应用
原文:https://towardsdatascience.com/https-towardsdatascience-com-the-elements-of-viral-growth-7f364aec64eb?source=collection_archive---------36-----------------------
模拟不同的播种技术以最大化网络中的信息扩散
影响者被高估了吗?
这是足够直观的,你需要有影响力的人来传播你的产品或服务的意识。然而,在我的一个研究生班里,我遇到了一个观念,即影响者可能被高估了。基本思想是影响者倾向于集中在大型子网络中。如果你依靠他们来推广你的产品,你可能会错过许多较小的卫星网络。这是一个警钟,许多我们认为理所当然的直觉可能无法纠正,如果仓促实施,从长远来看可能会付出高昂的代价。
周末,我决定在不同的数据集上测试几种播种策略。事实证明,影响者是否被高估没有简单的答案。增长动力在很大程度上取决于图簇的结构、节点嵌入以及影响者如何与其他人联系。
两个数据集——脸书政客和 Deezer 音乐流媒体——特别能说明问题。在运行 GEMSEC 图形嵌入算法之后,如上所示,通过前 3 个主成分来可视化这两个数据集。您能猜出以下哪种播种技术对每个数据集最有效吗?
- 简单的随机播种:这是一种天真的播种方式,但是它有它的支持者。主要优点是简单、便宜、公平。
- 根据集群大小分层抽样的随机播种:依靠分层抽样,我们可以确保不会错过播种小集群。
- 影响者播种:只需选择拥有最多联系的影响者。
- 基于集群的影响者播种:类似于选项 2,但是我们在每个集群中挑选顶级影响者。
本帖将集中于高层讨论,将实现细节留到最后。
数据集
真实世界的社交网络数据集被用来训练 GEMSEC 模型。这些数据集可以在仓库中找到。在这里,我主要关注两个数据集:
- 脸书政客页面网络:这些图形代表了经过验证的脸书页面之间的相互相似的网络。
- Deezer 用户-用户友谊网络:音乐流媒体网站 Deezer 的友谊网络(这里我们只关注匈牙利)。
图形嵌入
数据集中唯一可用的信息是节点之间的边。我们知道谁和谁有联系,但是我们不知道他们为什么有联系,或者他们有多相似。如果我们要对信息传播建模,我们需要某种相似性度量来估计一个人将信息传播给另一个人的可能性。在音乐服务中,相似性可以是音乐品味。在社交网络中,相似性可以代表亲密度(共享的对话、照片等)。)
为了绕过这一限制,我训练 GEMSEC 图嵌入模型直接学习节点嵌入,同时对它们进行聚类(因此得名 G 图 EM 与 SE lf C 聚类)。让我放弃数学上的细节,这些细节在最初的论文中有。重要的一点是我们现在有了图结构和节点嵌入。
模拟
扩散过程被模拟成随机行走。感染的概率与两个节点之间的余弦相似性相关。我做了一个简化的假设,即具有负余弦相似性的节点不会相互感染。
开始时,只有种子节点被感染。种子节点被放置在队列中。每当一个节点出队时,它都试图感染它的所有邻居。新感染的节点(包括旧节点本身)以广度优先搜索的方式被附加到队列中。
观察
结果总结在下面的两个图中。
- 在脸书政客数据集上,基于聚类的影响者播种优于直接影响者播种,但在 Deezer 音乐数据集上,它们显示出很小的差异。
- 基于聚类的随机播种在两个数据集上都优于简单的随机播种。这是意料之中的,因为我们本质上是按照集群大小进行分层抽样。
Diffusion curve, Facebook politician dataset
Diffusion curve, Deezer music dataset (Hungary)
是什么导致了影响者播种的差异?主要原因是影响者在所有集群中的影响力并不相同。如果我们只选择顶级影响者,20 个集群中只有 12 个具有合格的影响者。通过分层抽样,我们迫使影响力较小的群体被播种。
First 400 steps animation: random 1% seeding (left); cluster-based top 1% influencer seeding (right)
First 200 steps animation: random 1% seeding (left); cluster-based top 1% influencer seeding (right)
第二个原因归因于图形结构。政客数据集具有非常两极分化、明显不同且分离良好的聚类。Deezer 音乐流数据集更加模糊。这是可以理解的,人们可以享受不同的音乐流派,但政治家们坚持特定的(往往是相反的)政治立场。最高影响者的邻居节点的密度图清楚地展示了两极分化的模式:政治家的朋友都是相似的;音乐爱好者跨越群体建立友谊。
Kernel density estimation, top influencer’s cosine similarity with connected nodes (Facebook politician)
Kernel density estimation, top influencer’s cosine similarity with connected nodes (Deezer music)
总结
图形是最难处理也是最有利可图的问题之一。这篇博客的目的不是提出任何普遍真理,而是阐明一些观点,从这些观点你可以检查你自己的图形数据集。一些值得您注意的细节是:
- 当图表的知识容易获得,或者容易通过机器学习导出时,与随机播种相比,影响者播种是更优选的。
- 相似性度量应该是感染概率的良好代理。c 罗拥有 1.61 亿 Instagram 粉丝,但这并不意味着他可以影响所有人(其中大部分人与他截然不同)。
- 集群是否定义良好?个别节点是否高度极化?如果是这样,那么特定集群中的影响者可能非常有影响力。
- 在所有集群或细分市场中,影响力是否相等?如果不是,你可能需要分层抽样来捕捉小卫星网络。
- 不要依赖直觉,进行模拟,尽可能多地整合当前可用的信息。虽然模拟经常被证明是非常不准确的,但它有助于提出有价值的问题。
实验细节
首先,将 GEMSEC 存储库克隆到您的工作站。数据库中也提供了数据集。
其次,用所需的包创建环境。你可以简单地运行我的 gemsec_env.yml 文件。
conda env create -f gemsec_env.yml
要复制我的结果,运行实验. sh 文件中的命令。
建议您使用多核 CPU 虚拟机。该算法支持多线程。
图、汇总统计和动画代码可在这里获得。
延伸阅读
下面的博客涵盖了与 AB 测试相关的主题,以及对本文中提到的关键概念的更深入的回顾。
- 可视化贝塔分布和贝叶斯更新[ 链接
- 理解置信区间[ 链接
- A/B 测试的威力[ 环节
- 超越 A/B 测试:多臂强盗实验[ 链接
- 你知道可信区间[ 链接吗
来源
【1】b . Rozemberczki,R. Davies,R. Sarkar 和 C. Sutton。GEMSEC:带自聚类的图嵌入。2018.
对数概率是什么,为什么
原文:https://towardsdatascience.com/https-towardsdatascience-com-what-and-why-of-log-odds-64ba988bf704?source=collection_archive---------2-----------------------
数据科学的三个主要类别是统计学、机器学习和软件工程。要成为一名优秀的数据科学家,你需要将这三者结合起来。在这篇帖子里,我要说的是一个Log Odds——一个来自统计范畴的箭头。当我第一次开始从事数据科学工作时,我对对数概率非常困惑。我会问一些问题,比如什么是对数概率,我们为什么需要它们,等等。
当试图理解任何概念时,我喜欢使用Divide and Understand strategy,即把它分成更小的部分,分别理解它们的含义,然后结合这些知识,从整体上把握概念。所以在这里,让我们首先了解什么是赔率,然后努力理解对数赔率。
Figure-0: Divide and Understand Log Odds (image by Author)
出于解释的目的,让我们考虑一个场景,我和一个人工智能(AI)系统下了 10 盘棋,其中 4 次我都赢了(如果我在现实中真的能做到这一点,我会对我的象棋技巧印象深刻)。
赔率和概率
按照我们的设想,我有 4 次能够击败系统,所以我赢得游戏的几率是 4 比 6,即在总共 10 场游戏中,我赢了 4 场,输了 6 场。
Figure-1: Odds of winning are 4 to 6 (image by Author)
这也可以写成一个分数
Figure-2: Odds as a fraction (image by Author)
赔率不应与概率混淆
赔率 是某件事情发生与某件事情没有发生的比率。在我们上面的场景中,赔率是 4 比 6。然而, 概率 是某件事情发生与所有可能发生的事情的比率。因此,在我们的象棋例子中,概率是 4 比 10(因为总共进行了 10 场游戏)。
Figure-3: Odds v/s Probability (image by Author)
根据我们的例子,
赢的几率:4/6 = 0.6666
赢的概率:4/10 = 0.40
输的概率:6/10 = 0.60
也等于 1 -赢的概率:1 - 0.40 = 0.60
给定概率,我们也可以计算如下赔率
Figure-4: Calculating Odds, given Probability (image by Author)
更新(2020 年 2 月 10 日):增加了更多的上下文并更新了图 5 和图 6,以更好地表示数字线上的赔率。感谢读者Buhringj对他们的查询。
现在,假设我们将游戏总数从 10 场增加到 100 场,而我仍然只能在这 100 场游戏中赢 4 场,那么
获胜几率:4/96 = 0.0417
如果我们进一步将游戏次数增加到 500 次,而我仍然玩得很糟糕,并且我的获胜次数保持不变,那么赔率现在变成了
获胜几率:4/496 = 0.0081
我打得越差,我的胜算就越接近于零。由于在这种情况下我输了,这些赔率也可以被认为是“赢的赔率”。赢的几率保持在 0 和 1 的范围内。
另一方面,如果我开始在更多的游戏中击败人工智能,那么我获胜的几率就会增加。假设我们玩 100 局游戏,人工智能输了 6 局,而我赢了剩下的,那么
获胜几率:94/6 = 15.6667
同样的,在 500 场比赛中,假设 AI 仍然输了 6 场
获胜几率:494/6 = 82.3333
在这种情况下,我赢了,这些赔率也可以被认为是“赢的赔率”,随着我在这场比赛中击败 AI 的表现越来越好,这些赔率会快速增加。如果我永远保持这样的进步,很快人工智能的损失与我的胜利相比将变得几乎可以忽略不计,我获胜的几率将接近无穷大。赢的几率范围在 1 到无穷大之间。
Figure-5: Odds on a Number Line (image by Author)
对数赔率
既然我们已经了解了赔率和概率,那么让我们试着了解对数赔率,以及为什么我们真的需要它们。Log Odds 无非是 log of odds,即 log(odds)。 在我们上面的场景中,对我不利的胜算范围在 0 到 1 之间,而对我有利的胜算范围在 1 到无穷大之间,这是一个非常巨大的范围。这使得对的赔率在那些赞成的人看来要小得多。
那么我们能做些什么来让它变得公平呢?你猜对了,取日志。取概率的对数使它看起来对称。
胜算= 4/6 = 0.6666
log(胜算)= log(0.6666) = -0.176
胜算= 6/4 = 1.5
log(胜算)= log(1.5) = 0.176
Figure-6: log(odds) on a Number Line (image by Author)
看,它现在看起来很对称,是一个公平的比较尺度。所以基本上使用对数函数帮助我们在两种情况下,即赢(有利)和输(不利)时,使离原点(0)的距离相同。你现在可以看到这有多重要。但是等等…
你还知道吗,了解这一切也有助于我们了解一个非常重要的函数的基础知识,Logit 函数,它是最常用的机器学习算法之一的基础,逻辑回归。让它深入人心吧!!
Figure-7: Logit Function (image by Author)
结论
所以希望这篇文章能帮助你更好地理解赔率、概率、对数赔率(与 log(Odds)相同)和 Logit 函数。在结束之前,我想在这里指出的一点是 log(odds)的用处。
Figure-8: log(odds) helps getting a Normal distribution (image by Author)
你可以从右边的图中看到 log(odds)如何帮助我们在左边的图中得到一个很好的正态分布。这使得 log(odds)对于解决某些问题非常有用,基本上是那些与发现赢/输、真/假、假/非假类型场景中的概率相关的问题。
参考
- StatQuest: Odds and Log(赔率),解释清楚!!!
当算法失控时
原文:https://towardsdatascience.com/https-towardsdatascience-com-when-algorithms-go-rogue-51d60bd71c6f?source=collection_archive---------39-----------------------
人工智能“黑匣子”如何让我们看不到流氓算法,以及我们能做些什么。
Photo by Noah Silliman on Unsplash
在 11 月的第一周,苹果和高盛受到了不必要的关注,因为 Ruby on Rails 的著名创造者 @DHH (阿乐 24 小时耐力赛冠军车手)指控他们性别歧视。
例证:他和妻子一起申请了苹果信用卡,并获得了相当于妻子 20 倍的信用额度。这一点,当他们共同报税,她有一个更好的信用评分。
这条推文在网上疯传,但当苹果的另一位“史蒂夫” @stevewoz 支持这一说法时,事情变得更加激烈。
但我们不是在讨论苹果和高盛在此事件后的麻烦,以及随后下令进行的法律调查。在整个推特风暴中还有一个相关的问题。
这值得思考,不是吗?毕竟,我们谈论的是世界上最大的公司之一,他们不能解释他们自己的算法?据我所知,他们不得不通过将她提升到 VIP 级别来解决这个问题。
当算法失控时
我们知道,大多数人工智能决策几乎都是一个“黑箱”。这是由于基于树或基于神经网络的模型分数不容易被翻译来为人类提供直观的理解。由此导致的问题在金融服务等受监管行业变得尤为严重。如果一家电子商务公司的推荐算法出了问题,最糟糕的情况可能是收入受到影响。对于一家金融服务公司来说,情况并非如此。
如果我们甚至不知道一个决定是如何做出的,你怎么能在一个决定中发现偏见(种族、性别、年龄甚至文化)?
苹果的故事并不是唯一的例子。过去有太多的例子表明,无意中的偏见已经潜入了系统。
以下是算法失控的一些原因:
解决问题:
如果计算客户信用度的人工智能系统只是为了优化利润,它可能很快就会陷入掠夺性行为——例如寻找信用评分低的人来出售次级贷款。这听起来是不是很牵强?正在进行的针对联合健康集团和 Optum 的法律调查如何?在 Optum 中,非裔美国人更倾向于去看医生,只是因为算法被优化以降低医疗成本(而不是选择一个需要更多医疗关注的人)?
缺乏社会意识:
输入系统的数据包含了体现社会系统的偏见和成见。机器既不理解这些偏差,也不能考虑消除它们,它只是试图针对系统中的偏差优化模型。
作为一个例子,考虑下面的关于谷歌 BERT 的研究或者这个关于 Word2Vec pairing 的研究男人对于电脑程序员就像女人对于家庭主妇一样?”。在这两种情况下,模型本身不会导致偏差,但基础数据会。
不良数据的代理:
虽然不使用明显令人反感的数据是显而易见的,但是高度相关的数据通常可以充当代理。以 NYPD 开发的犯罪模式识别系统为例。他们小心翼翼地从数据中删除了特定的位置,因为这些位置被认为与种族高度相关,因此是其代表。
可解释的人工智能
我们谈论算法问责制的事实——以及以这个名字命名的法案,现在可能会得到推动——足以证明人们对人工智能在自动化决策中的使用非常关注。
这种算法责任的关键要求之一是人类能够理解人工智能决策过程。从 2017 年开始,在可解释的人工智能方面投入了大量的努力来解决这个问题。DARPA 是努力创造能让人工智能决策被人类理解的系统的先驱。它已经获得了广泛的工业和学术兴趣。一些负责可解释人工智能的开源框架,如 LIME 和 SHAP 正受到良好的关注。
它需要的是采纳和监管支持。
为什么随机梯度下降有效?
原文:https://towardsdatascience.com/https-towardsdatascience-com-why-stochastic-gradient-descent-works-9af5b9de09b8?source=collection_archive---------6-----------------------
Crazy paths often lead to the right destination!
优化代价函数是机器学习中最重要的概念之一。梯度下降是最常见的优化算法,也是我们如何训练 ML 模型的基础。但对于大型数据集来说,这可能会非常慢。这就是为什么我们使用这种算法的一种变体,称为随机梯度下降,以使我们的模型学习得更快。但是是什么让它更快呢?这是有代价的吗?
嗯……在深入 SGD 之前,这里有一个香草渐变下降的快速提醒……
我们首先随机初始化模型的权重。使用这些权重,我们计算训练集中所有数据点的成本。然后计算代价相对于权重的梯度,最后更新权重。这个过程一直持续到我们达到最小值。
更新步骤是这样的…
J is the cost over all the training data points
现在,如果我们的训练集中的数据点数量变大,会发生什么?说m = 1000 万。 在这种情况下,我们必须将所有 m 示例的成本相加,以执行一个更新步骤!
新币来救我们了……
我们不是计算所有数据点的成本,而是计算单个数据点和相应梯度的成本。然后我们更新权重。
更新步骤如下…
J_i is the cost of ith training example
我们可以很容易地看到,在这种情况下,更新步骤执行得非常快,这就是为什么我们可以在很短的时间内达到最小值。
但是 SGD 为什么会起作用?
关键的概念是,我们不需要检查所有的训练示例来了解斜率下降的方向。通过一次只分析一个例子并跟随它的斜率,我们可以到达一个非常接近实际最小值的点。这里有一个直觉…
假设你做了一个 app,想通过 100 个客户的反馈来改进它。你可以用两种方法来做这件事。在第一种方式中,你可以将应用程序交给第一个客户,然后将他的反馈交给第二个客户,然后是第三个,以此类推。从他们那里收集反馈后,你可以改进你的应用程序。但是第二种方式,你可以在得到第一个客户的反馈后,马上对 app 进行改进。然后你把它给第二个,在给第三个之前你又提高了一次。请注意,通过这种方式,您可以以更快的速度改进您的应用程序,并且可以更早地达到最佳状态。
希望你能分辨出第一个过程是普通梯度下降,第二个是 SGD。
但是 SGD 也有一些缺点…
SGD 比原始梯度下降法快得多,但是 SGD 的收敛路径比原始梯度下降法更嘈杂。这是因为在每一步中,它不是计算实际的梯度,而是一个近似值。所以我们看到成本有很大的波动。但是,这仍然是一个更好的选择。
Convergence paths are shown on a contour plot
我们可以在上面的等高线图中看到 SGD 的噪声。需要注意的是,vanilla GD 更新次数较少,但是每次更新实际上都是在一个完整的时期之后进行的。SGD 需要很多更新步骤,但它将需要较少的历元数,也就是说,在这种情况下,我们迭代所有示例的次数将较少,因此这是一个更快的过程。
从图中可以看出,梯度下降还有第三种变化,称为小批量梯度下降。这是一个利用 SGD 的灵活性和 GD 的准确性的过程。在这种情况下,我们一次获取固定数量(称为批量)的训练样本,并计算成本和相应的梯度。然后,我们更新重量,并为下一批继续相同的过程。如果批量= 1 ,那么它变成 SGD,如果批量= m ,那么它变成正常 GD。
J_b is the cost of bth batch
从头开始实施
这里有一个 python 实现的小批量渐变下降。您可以轻松地使 batch_size = 1 来实现 SGD。在这段代码中,我使用 SGD 优化了一个简单的二元分类问题的逻辑回归的成本函数。
在这里找到完整的代码。
还好奇?看一个我最近做的视频…
我希望你喜欢阅读。下次见…学习愉快!
人类活动识别:小数据学习的有效实现
原文:https://towardsdatascience.com/human-activity-recognition-an-efficient-implementation-of-small-data-learning-f4c282d92fa?source=collection_archive---------14-----------------------
[1]This image was procured from the Mind’s Eye Project. It depicts Human Activity Recognition in real time.
深度学习应用中的大数据集魔咒能否被打破?有必要收集数百万个样本来训练一个特定任务的神经网络吗?我们卷起袖子,开始寻找这个古老问题的答案。我们创建了一个定制的深度学习管道,用于克服自主系统中人类活动识别的挑战。在项目接近尾声时,我们能够产生足够的结果,支持我们的架构有效地从极小的数据集中学习。我们使用不到 260 个例子来训练我们的模型!
在这篇博客中,我将避免细枝末节,也就是说,我将专注于我们所做的有效的事情,而不是提及我们所有失败的尝试。我也不会讨论引文中已经存在的不必要的细节。如果您想了解更多,或者对我们方法的实施有任何疑问,请随时通过sudarshan.kamath97@gmail.com 与我联系。
传统上,从视频中提取特征一直具有挑战性,因为视频数据包含许多语义时空关系,这些关系难以被丰富地编码以馈入 LSTM 模块。原始视频帧数据只有在我们拥有大量数据集时才有效。
我们想建议一个替代方案,以时间活动图(标签)的形式。标签向 LSTM 呈现了一系列丰富编码的时空关系。为了帮助你理解标签是如何形成的,我将用下面的例子进一步说明:
[2]Hand-shake activity from the UT-Interaction Dataset
包围盒形成在延伸的物体上,即上述视频帧中的左臂、右臂、左腿、右腿和头部。这些边界框之间的交互由标签编码,如下所示:
[3]TAG depicting Handshake Activity from the UT-Interaction dataset
标签中的节点对应于描述扩展对象的边界框,同一帧中两个节点之间的空间关系使用空间边来描述,空间边的标签使用扩展核心 9 集成表示来计算。它们描述了两个相互作用的边界框之间的拓扑、方向和距离关系。如果一帧中的节点出现在两个视频帧中,则该节点通过时间边连接到另一帧中的节点。
在从原始视频数据中创建了一个标签之后,我们接着将它输入到我们定制的 结构化递归神经网络 架构中。下图解释了 sRNN 的各个部分:
[4]Custom sRNN architecture for taking in a TAG as input
上述体系结构基于分解由单个神经网络承担的任务的复杂性的直观想法。LSTMs B1 ,…, B5 从对应于人物 1 的节点,即 B1 获取输入,例如,对人物 1 头部的所有关系进行编码。整个关系再次由扩展核心 9 架构提供。骨骼追踪数据可通过 SBUKI 数据集获得,或者可以使用开源库 Openpose 有效提取。编码后,单个 LSTMs Bis 和 Cis 分别将数据反馈给 LSTMs D1 和 D2 。因此,各个 rnn 只学习由它们各自的节点编码的信息,而不是学习编码在视频帧中的所有信息。这有助于分解手头任务的复杂性。此外,我们有一个特征丰富的向量,该向量将被馈送到 LSTM A、中,该向量以整体方式包含所有时空信息,可以被馈送到其他深度学习管道。
在通过 2 个密集层传递特征向量之后,我们使用两种分类方法来标记我们的数据。一个是随机森林分类器,另一个是连体网络。
以前,当我们使用传统的 softmax 分类器时,我们面临过拟合的问题。98 %的训练准确率之后是低至 50 %的测试准确率。随机森林已经被方便地用于克服机器学习流水线中的过拟合问题,因此我们在我们的 sRNN 架构的最后一层的输出上训练了一个随机森林分类器。
暹罗网络也在我们的建筑上展现了它的魅力。我们都知道人脸识别软件面临着一次性学习的挑战,这个问题和我们正在做的事情很相似,我们需要从非常少量的数据中学习。
以下是我们的最终精度:
[5]Activity-wise as well as overall accuracies for the SBUKI dataset using Random Forest and Siamese Network Classifiers
活动方面的准确性不是架构效率的准确度量,因为我们必须确保训练集包含适当数量的用于所考虑的特定活动的示例。然而,看看总体精度,然后将它们与下面给出的最先进的方法进行比较:
[6]State-of-the-art accuracies for SBUKI and ME dataset
我们的精度几乎相当于最先进的水平。需要记住的是,上述精度使用的是机器学习管道,这要求我们明确提供学习方法工作的特征向量。我们的方法使用深度学习管道()来学习特征。我们的方法是高度可扩展的,并且可以扩展到需要使用小数据快速学习的较大系统。
我们相信未来在于更快、更有效的学习方法,而不是更大的数据集,因此这是迈向未来的又一步。
我们的大部分训练是使用 80-20 的训练-测试分割完成的,训练进行了 100 个时期。我们管道的代码可以在 这个库 中找到。
这个项目是我和我* ( Sudarshan Kamath )以及我的项目伙伴Diptanshu Agarwal在Shyamanta Hazarika*教授的指导下完成的。所有的引用、深入的解释以及项目细节都可以在我们的学士论文中找到,这些论文可以在我们的 Github 资源库中找到。**
干杯!
走向以人为本的教育
原文:https://towardsdatascience.com/human-centered-education-85f9a9702076?source=collection_archive---------21-----------------------
教育促进人类赋权
Photo by Ana Viegas on Unsplash — The Alps
今天的教育
教育是社会、个人和集体发展的核心,应该促进儿童赋权。然而,在许多情况下,无论是因为经济问题还是过时的方法,它都没有做好。
根据 USI 的数据,大约有 2.6 亿儿童失学,辛迪·刘对美国学生进行的一项研究得出结论,五分之一的学生会因为学校的压力而考虑自杀。
教育目前没有优化,学生之间的水平差距很大,个体差异没有得到充分考虑。
21 世纪的教育
Sschool 定义什么技能是社会所看重的。今天主要宣扬个人主义、竞争和零和博弈。然而,生活在 21 世纪,在一个增长的社会中,资源正在增长,现在非常有价值的技能是合作和交流。
此外,知识现在是每个经济体的核心。你拥有的知识越多,你拥有的专利、出版物或创新就越多,你就越强大。这就是谷歌和脸书成为今天的巨头的原因。因此,重新设计学习方法是关键,以便学校促进合作,自我发现,创造性和双赢的心态。通过游戏化、趣味化和定制化的信息来吸引注意力可能是最有前途的方法。
“我宁愿娱乐并希望人们学到一些东西,而不是教育人们并希望他们被娱乐”华特·迪士尼
本文的第一部分介绍了影响学习过程的个体差异。然后,将引入一个旨在优化每个个体学习潜力的数字工具,利用人工智能和大数据来设计一个更加定制化的平台。
Towards a creativity and cooperation based education system
我们如何学习?
技能不固定;它们的发展是一个动态的过程。它们部分源于遗传基础,但也受到一生中的关系、环境和经历的影响。
学习风格
T21 收益风格已经引起了广泛研究的关注。事实证明,它会显著影响学生对学习材料的态度和参与度。
研究表明,学生们会形成自己偏爱的学习风格,主要有五种类型:视觉、听觉、物理、语言和逻辑。
利用学习风格的一种方式是通过技术增强项目 (TEIs),如视频片段、音频文件、互动和模拟组件。通过定制学习的评估标准,TEIs 还支持积极的互动、参与,并可以深入评估学生的知识增长。
认知能力
C 认知技能是你的大脑为了处理和使用信息所需要的所有功能。我们通常有几个首选的能力,使我们能够更有效地学习。随着对认知技能的更好理解,我们可以为每个人的大脑量身定制学习材料。
研究确定了 10 种主要能力[1]:注意力、工作记忆、灵活记忆(适应性和改变方法的能力)、言语推理、抽象推理、空间感知、言语记忆、视觉记忆、视觉运动速度和处理速度。
对于理科科目,不同的题型会要求空间表征、微积分、逻辑思维等不同的认知能力。
个性
非认知个性因素就像学习过程的调节者一样。社交能力、自信、坚持、雄心、动机和对工作习惯的控制可以调节一个人的总体学习方法。
人格和教育领域使用的通用框架是大五因素。这是一个很好的基础,可以根据人们的性格特征对他们进行分类。[2]
当学生被平等对待时,他们因性格特征而产生的个体差异通常被认为是教学中的障碍,而不是被利用和进一步发展。
The big five factors in personality
教育的新方法
现在,我正在介绍一个新的 TEI,它是我在加州大学伯克利分校的课堂上开发的。它从学习的角度利用个体差异,就像之前介绍的那样,为教师和学生提供更好的工具。在目前的状态下,这是一个最小可行的产品,旨在展示这种工具在大规模定制教育中的优势。它被设计成可扩展和易于操作。
体系结构
TEI 是一款通过问题和建议与学生互动的移动应用程序。然后用它来构建一个用户数据库,用机器学习模型对其进行分析,以定制问题测试和在线查找相关学习资料。然后,收集关于一名学生的所有信息,并显示在仪表板上,可供当前或未来的教师访问。
Architecture of the solution
个性化聚类
Student’s learning style profile
我们为每个学生定义一个档案,这样我们就可以知道学生通过哪种方式学习效率更高。这种剖析是利用学习风格、个性以及学科知识来完成的。
根据认知能力对问题进行分组
为了测试学生的数学问题并定制体验,我们根据三种能力对数据集进行了聚类:空间表达、微积分和问题解决,以一种半监督的方式。我们首先手工标记 300 个问题,然后使用支持向量机模型和 L2 正则化来聚类剩余的问题。
按内容聚类
使用自然语言处理技术对文本进行预处理,问题也根据其内容进行聚类。可视化的特征空间,我们得到一个最佳的聚类数的想法,这是使用肘方法确认。潜在空间(此处为 500 维)由簇着色。它突出了数据背后的模式。
Dimensionality reduction visualization of the clustering by content
根据我们想要提取的信息的级别,聚类可以或多或少地精确。我们也可以通过聚类来可视化最常用的单词,如下图中的气泡图所示。
Bubble plot of five clusters
结果
交互式仪表板
T 学生和教师将通过
交互式仪表板进行互动,该仪表板跟踪学生的进度,显示建议,并能够可视化具体指标。
Dashboard of the webapp (developped with Flask)
推荐
答根据我们想要测试的内容和学生的学习偏好收集问题后,我们开发了一个推荐引擎:
学习内容推荐:算法 webscrapes 几个教育网站,找到最相关的文章和在线课程。第一个版本只基于 wikifier API,这是一个使用 ngrams 选择相关维基百科文章的编程接口。在此基础上,学习内容研究机构 webscrapping edX、academia.com 和其他在线教育平台提供了一个更强大的搜索工具。
Using customized profiles to make relevant recommendations
评估指标
F 对于每一个机器学习应用,我们都在疑惑,我们如何评价成功?我如何知道移动应用程序的使用是否对学生产生了我们想要的效果?正如引言中所述,我们希望我们的新学习方法能够促进以下价值观:创造力、合作精神,并使学生能够更有效地学习。因此,我们的目标是定义一个可以评估这些技能的标准。
创造力:它通常与工作中的激情和你所做的事情带来的快乐相关。当对一个主题感到兴奋时,你会有更多的想法,并愿意在它上面花更多的时间。因此,我们可以用好奇心来衡量创造力,这可以通过花在应用程序上的时间来衡量。[3]
合作:可以通过与平台上其他同学的互动,以及互动量与整体表现的相关性来评估。
学习表现:我们也想衡量学生的整体进步。这可以通过主体和认知能力来实现。然而,为了简单起见,我们计算了一个总得分,它评估了当前各地区的平均得分与一个月前的平均得分之间的差异。
然后,我们可以对每个指标进行加权,得到一个唯一的分数。建议的权重如下。
The proposed weights
然后,它被用来跟踪学生和改善个性化。
Evaluation dashboard
应用程序
第一个应用是为那些不容易进入教育机构的学生,如发展中国家,主要是亚洲和非洲的学生。通常,由于健康、文化差异或性别方面的不平等,这些孩子被排除在教育系统的边缘,因此,他们的个人发展受到很大影响。正因为如此,全球仍有超过 7200 万儿童失学。为了解决这种情况,我们的工具可以用作第一次教育的基础,以后可以由未来的教师利用,他们可以在应用程序上访问学生数据。
Share of the population older than 15 with completed tertiary education, 2010. [Source: ourworldindata.org]
从更广泛的角度来看,该应用程序可以被每一个教学机构用来支持传统方法。它提供了一种方法,可以轻松地从儿童身上学习,更有效地适应和跟踪每个人一生中的进展。
教育的未来
优化我们如何使用大脑的神经行为学
在通往最佳教育系统的道路上,神经行为学将是理解我们大脑行为方式的关键。这一新的研究领域包括收集生理数据,以收集重要信息,如注意力水平。
神经工程学的目标是利用大脑的认知功能。它分析大脑如何与外界互动,持续监控大脑功能。当面对复杂的认知任务时,两个重要的跟踪能力是工作记忆和注意力。使用图像技术,我们还可以可视化与专业技能发展相关的大脑活动的演变(大脑使用更少的策略和认知自动化),这可用于评估不同的学习方法。[5]
这用于提供对人们精神状态和意图的直接洞察。它有助于应对挑战,如优化工作负载水平,以便评估如何确保持续保持高性能水平。[6]
“我们应该让我们的学校适应我们的大脑”
更强大的 NLP 模型的出现
很多学习材料都包括书面文件或口头文件。两者都可以使用 NLP 技术进行分析,如本文所示。随着最近高性能 NLP 模型的发展,可以开发更准确和有效的学习工具。
二月底,OpenAI 发布了一个新的基于 transformer 的模型,GTP-2。这个经过数十亿参数训练的模型学习了非常复杂的单词嵌入。与 BERT 一起,这些最先进的模型现在可以利用迁移学习,为定制教育带来更多见解。[7]
Photo from Pexels
参考
[1]贝琪·希尔。认知技能和差异
[2]亨利·舒文堡·布尔·德·拉德。学习与教育中的人格:一个综述
[3],吴毓子,廷.运用创造性学习策略研究创造力、创造力风格、创造力氛围——以工程教育为例
[4] Humanium,《受教育权:世界各地的情况》。【https://www.humanium.org/en/right-to-education/
[5]塞琳·麦克欧文。神经工效学:人类因素和工效学的认知神经科学方法
[6]阿德里安·柯廷,哈桑·阿亚兹。神经行为学的时代:用 fNIRS 对脑功能进行无处不在的连续测量
[7] AlecRadford,JeffreyWu,RewonChild,DavidLuan,DarioAmodei,IlyaSutskever。语言模型是无人监督的多任务学习者
人类兼容人工智能
原文:https://towardsdatascience.com/human-compatible-ai-c02c141c5756?source=collection_archive---------18-----------------------
为什么阿西莫夫定律不充分?我们能否制造出不是面向目标,而是可证明有益的人工智能系统?
Photo by rawpixel.com from Pexels
阿西莫夫定律:深奥却无力
对于科幻迷来说(还有其他一些人),艾萨克·阿西莫夫不需要介绍。
A collage of covers by Michael Whelan from the Foundation series.Image: Bantam Books (Digital Trends)
他的机器人三定律(1942 年 3 月首次出现在短篇小说around中)是任何关于机器人、人类人工智能和文明未来的知识话语中最常被引用的格言。
因为,我们都在网上的某个地方见过这张图片,对吗?
我们希望这些机器,站在我们这边,作为我们的朋友、哲学家和向导,而不是站在另一边的敌人
这是三大定律,只是为了重述一下,
- 第一定律——机器人不得伤害人类,也不得坐视人类受到伤害。
- 第二定律——“机器人必须服从人类给它的命令,除非这些命令与第一定律相冲突。”
- 第三定律:机器人必须保护自己的存在,只要这种保护不与第一或第二定律相冲突。”
一套(主要)情节生成设备(英语)
阿西莫夫既不是机器人专家,也不是计算机科学家/人工智能研究者。他的职业是生物化学家,在他的一生中,他对写作的重视远远高于常规的大学研究和教学。文学界当然因为他的这一选择而更加丰富。
他编织的惊人故事的情节对他来说极其重要。他还使用了新颖的情节生成装置,前面提到的机器人法则就是其中主要的。它们并不意味着被编码到某种机器人设备中,或者甚至是模拟人工智能代理的计算机程序中。
Source: Why Asimov’s Three Laws Of Robotics Can’t Protect Us
正如机器人专家兼作家丹尼尔·克拉尔言简意赅地指出的那样——“阿西莫夫的规则很整洁,但也很扯淡。例如,它们是英文的。你到底是怎么给那个编程的?”
阿西莫夫定律并没有被设计成编码到人工智能程序或超级智能机器人的处理器中。
你可以争辩说,自然哲学(早期称之为物理科学)的许多定律是用通俗易懂的语言表述的,后来用数学术语编纂成了法典。
如果你确信同样的事情也可以发生在这些法律上,试着给出关键短语的精确定义(和数学界限),比如不作为、伤害、服从、冲突、保护、存在。
努力?正如我提到的,它们在英语中是。
阿西莫夫的故事证明它们不起作用
阿西莫夫的大部分故事都围绕着一个主题——机器人可能会遵循这些表面上符合逻辑、伦理上合理的代码,但仍然会误入歧途,给人类和社会带来意想不到的灾难性后果。
《创世纪》中关于规避的故事本身就表明了前两条定律是多么容易发生冲突,而第三条定律需要被发明出来才能有一个圆满的结局。
Source: http://raydillon.blogspot.com/2012/09/my-art-from-ridley-scotts-prophets-of.html
真正符合逻辑的科学法则不应该这么容易就发生冲突。它们是按顺序建立的,通常会产生一个清晰、明确、可行的解决方案。还记得牛顿定律吗?或者,麦克斯韦方程组?
网上有大量文章讨论这些法律对于构建任何功能性超级智能代理(以硬件或软件为中心)的可悲不足。检查这里,或者这里,或者这个。
那么,有什么措施来解决这个问题吗?
人类兼容人工智能
你对人工智能感兴趣吗?我认为答案是肯定的,因为你选择了打开这个故事来阅读。
你见过这本教科书吗?
你很有可能知道(即使你没有勇气翻阅这本近千页的纲要——我自己也只有 30%左右),因为这是全球数百所大学人工智能课程的标准文本。
这本书有两位作者。
Peter Norvig 是学生和学习者社区中更熟悉的名字,他在一个伟大的在线课程中教授我们人工智能的基础知识,或者出版那些关于编程、统计和机器学习的惊人的 Jupyter 笔记本。
然而,在本文中,我们将关注本书的第一作者 Stuart Russell 博士,教授,世界知名的加州大学伯克利分校人工智能研究员。
他正在通过他的 人类兼容人工智能 中心,研究一种名为可证明有益的人工智能的东西。
要问的重要问题
主流人工智能研究人员并不经常问这些问题,但他们正在慢慢地但肯定地获得社区中许多人的关注。
我们应该担心超级智能人工智能给人类带来的长期风险吗?如果是这样,我们能做些什么呢?
你可能会问“ 什么长期风险 ”。
你可能会说,如果聪明、理性、道德和伦理的人类——科学家、工程师、社会活动家、政治家——一起仔细定义智能系统的“目标”,那么它就不会走错路。
因为目标函数很重要,对吧?
如果你已经阅读并理解了现代机器学习算法的核心原理,这个世界似乎就是在这些原理上运行的,你知道几乎所有的这些算法(无论如何是最有用的)都是通过最大化一个目标函数来工作的。
* [## 下面是什么?机器学习的核心是优化
我们展示了最流行的机器学习/统计建模技术背后的核心优化框架。
towardsdatascience.com](/a-quick-overview-of-optimization-models-for-machine-learning-and-statistics-38e3a7d13138)
因此,如果你认为为了开发一个超智能但有道德和伦理的 AI 系统,我们所需要的只是一个好的目标函数,那你就错不了。
几乎所有现代、强大的人工智能系统和算法的核心都是目标函数。
当然,如果目标函数或目标是无害的,一个强大的人工智能不会对人类造成伤害。
还有什么比设定一个目标最大化回形针产量更无害(也更令人沮丧的平凡)的呢?
超级智能回形针最大化器
牛津大学哲学家尼克·博斯特罗姆在2003 年的一篇论文中首次描述了曲别针最大化器,它是一个被赋予了人工 G 通用 I 智能 ( AGI )的系统/代理,其目标是最大化其收集的曲别针数量。
听起来无害吗?让我们再深入一点。
如果它被构造成具有大致人类水平的一般智能,该系统可能会从地球上所有可能的来源收集回形针,赚钱购买回形针,甚至开始制造回形针。
这才是更有趣的地方。它从哪里获得制造回形针的原材料?它当然可以买到它们。当正常的供应链耗尽时会发生什么?它可以尝试非常规的供应链,从其他来源购买相同的原材料(如铝),通常用于其他行业,如飞机或汽车行业。
要做到这一点,它必须采用巧妙的方法来赚钱。而且它越聪明,就越有可能完成那些子目标。
因此,主目标会产生子目标,这些子目标没有被明确地编程,并且是人类设计者没有计划到的。
因此,它也将经历一个“智能爆炸”,将努力提高自己的智能,以满足子目标,这反过来又有助于满足最大限度地提高回形针产量的宏伟目标。
增加了它的智力后,它会制造出更多的回形针,并利用它增强的能力来进一步自我提高。
一个纯粹以目标为导向的 AGI,即使给了一个非常安全和简单的目标,也极有可能产生子目标,这些子目标是不可预见的,因此也是无法计划的。
****Source: http://www.danieldewey.net/tedxvienna.html
它停在哪里?
根据博斯特罗姆的说法,在某个时候,它可能会“首先将整个地球,然后将越来越多的空间变成纸夹制造设施”。
可证明有益的人工智能
因此,设计一个纯粹面向目标的人工智能系统,终究不是一个好主意。意想不到的事情可能会突然出现。
因为,当我们教一台机器思考并不断改进自己时,我们不能指望它会在何时以何种方式超越我们。
这就是所谓的“AGI的控制问题”。目前对它的定义和理解都很模糊。这比你想象的要难。非常非常难。
因为这类似于一群大猩猩试图思考如何控制人类的情况。
在超级聪明的 AGI 面前,我们很可能会像那些大猩猩一样。
****Source: https://www.gorilladoctors.org/
“如果机器会思考,它可能会比我们思考得更聪明,那么我们应该在哪里?艾伦·图灵,1951 年。
在他非常令人愉快的 TED 演讲中,拉塞尔教授给出了几个目标导向型机器人的例子(包括一个智能助理,其目标是让你的配偶一直开心),并解释了这种系统的潜在危险和局限性。
然后,他谈到了可以解决这个问题的一种方法— 可证明是有益的 AI 。
这种设计方法的目标是通过将人工智能的注意力从实现任意目标的能力转移到实现可证明有益行为的能力和动机,来确保不会出现像回形针最大化器那样的可能性。****
而有益是什么意思?
当然,这取决于人类和整个社会集体行为的性质和特征。因此,这项任务必然要利用比人工智能研究人员、机器学习工程师和计算机科学家的核心群体更大的思想家群体的专业知识和经验——社会科学家、政治家、经济学家、心理学家。
这是设计安全有益的人工智能的新思路,它被命名为与人类兼容的人工智能。
新的三部法律
除了形式概念,Russell 还引入了三个简单的想法作为新设计方法的核心。如果你愿意,你可以称之为机器人新定律 T21,
****Source: https://futureoflife.org/wp-content/uploads/2017/01/Stuart-Russell-conference.pdf?x90991
从本质上来说,智能代理在开始的时候并不是很聪明或者不确定它的目标。它开始时有很多不确定性,就像一个人类婴儿,然后,慢慢地,它找到了一个稳固的立足点,不仅执行随机搜索并盲目遵循 Q-learning 策略(所有强化学习课程都会教你),而且还信任它的父母——我们人类——并观察他们。
Image by Mabel Amber (Pixabay)
还记得“摇篮里的猫”吗?
我的孩子前几天刚出生
他像往常一样来到这个世界
但是我要赶飞机,要付账单
我不在的时候他学会了走路
他会说话【在我知道之前】随着他的成长
他会说“爸爸,我会像你一样”
“你知道我会像你一样”
总结和相关想法
这篇文章可能已经超出了它的有用性,但是不提及一些相关的想法是不公平的。如果你对这个领域感兴趣的话,我们鼓励你去谷歌一下,了解更多。
- 逆向强化学习(在合作博弈中)
- 关闭开关问题(用于机器人)
- AI 安全举措(参考 Max Tegmark 的书 Life 3.0 )
认真思考 AGI 及其潜在影响不应仅限于学术研究界。每个人都可以参与进来,提出他们的想法和对这样一个未来系统应该学会吸收的价值系统的投入。
当 AGI 到来时,我们可能仍然会变成那些大猩猩(与 AGI 相比),但仍然有一个健康的关系。
Image by Stefan Keller from Pixabay
一些进一步的阅读
- https://www . technology review . com/s/527336/do-we-need-asimovs-laws/
- https://www.cs.huji.ac.il/~feit/papers/Asimov06.pdf
- https://wiki.lesswrong.com/wiki/Paperclip_maximizer
- http://www.danieldewey.net/tedxvienna.html
- https://alfredruth.com/en/ai-and-the-control-problem/
- https://futureo flife . org/WP-content/uploads/2017/01/Stuart-Russell-conference . pdf?x90991
- https://people . eecs . Berkeley . edu/~ Russell/papers/Russell-BBVA book 17-pbai . pdf*
如果你有任何问题或想法要分享,请联系作者tirthajyoti【AT】Gmail . com。另外,你可以查看作者的 GitHub 资源库中其他有趣的 Python、R 和机器学习资源中的代码片段。如果你像我一样对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
*** [## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…
通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和有趣…
www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)***
人类发展与国家生态足迹:一个视觉导向
原文:https://towardsdatascience.com/human-development-national-eco-footprints-a-visual-orientation-9adf86618d4f?source=collection_archive---------29-----------------------
使用 Plot.ly 和 Bubbly
程序员和数据科学家可以将一些开源数据可视化工具整合到他们的工作中,这些工具真的很吸引人。如果你不太赞同我的热情,可以看看布丁的“记者工程师”的一些互动的、有时有趣的、有时与文化相关的项目。在我看来,他们正在引领数据可视化的艺术。也就是说,数据科学家没有能力仅凭他们的可视化和时间敏感的问题来震撼心灵,他们自己拥有可访问的资源来快速建立信息丰富、易于理解的数据通信。
撇开形象化不谈(就目前而言),以下是我最近抛出的一些问题:我们对人类进步有共同的标准全球定义吗?在评估一个国家的发展时,应该如何权衡教育和健康与经济财富?一个国家培育人民的努力是否需要更大的生态足迹和有限自然资源的更多支出?哪些国家在引领前进,哪些没有?我将在下面探讨这些想法,同时深入一些有用的 Python 库,用于抓取 web 和可视化相关信息。
为了支持人类发展指数和类似的指标
在关于国家“增长”的讨论中,国内生产总值(GDP)似乎是最容易获得和被大量引用的指标。虽然很容易衡量和比较,但更高的 GDP 肯定不能保证一个地方的普通公民比其他地方的更好。美国每年花费数十亿美元开采石油,GDP 也随之增长。中国是世界上最大的二氧化碳排放国之一,在国民生活和工作环境高度污染的情况下,中国的 GDP 也取得了令人难以置信的增长。GDP 指标是一维的,在衡量实际进展方面显然有其局限性。作为回应,联合国经常引用一个叫做人类发展指数 (HDI)的新指标,该指标不仅考虑了人均 GDP,还考虑了预期寿命、识字率、入学率等指标。还有的不平等调整人类发展指数 (IHDI),与此类似,但惩罚了健康、教育和收入分配不均的国家。请记住,这不是一个完美的指标,因为它不容易解释(在 0 & 1 之间),排名将取决于其他人的增长,但它比 GDP 更全面,可以作为进步的指南,这是我选择关注人类发展指数的主要原因,以便快速了解数据搜集、搜索、清理、合并和可视化。进入数据探索过程!
抓取维基百科
我使用 Python 库 BeautifulSoup , Requests ,& Pandas 从维基百科抓取一个简单的数据表。在导入库之后,我解析了 Wikipedia 表,提取了国家和 HDI 的文本,并将每个文本放入一个列表对象中,如下所示:
- 文章可读性跳过的步骤:库安装和导入、数据清理、合并来自 WorldBank/Kaggle 的第三方数据集
- 在我的 GitHub 库上探索完整的笔记本和数据集的更多细节
*#parse with BeautifulSoup & Requests
web_page = "[https://en.wikipedia.org/wiki/List_of_countries_by_inequality-adjusted_HDI](https://en.wikipedia.org/wiki/List_of_countries_by_inequality-adjusted_HDI)"req=requests.get(web_page)
page = req.text
soup = BeautifulSoup(page, 'html.parser')
table = soup.find_all("table", "wikitable")#extract country & HDI text
ihdi = table[0]
table_rows = ihdi.find_all('tr') #tr found in browser developer tool
header = table_rows[1]
temp = ihdi.find_all('td') #td found in browser developer tool#list comprehensions to get lists of country & HDI strings
countries = [table_rows[i].a.get_text() for i in range(len(table_rows))[1:]]IHDI = [temp[i].get_text() for i in range(len(temp)) if "." in temp[i].get_text()]#zip data and create pandas dataframe
data = zip(rank,countries, IHDI)
cols = ['Rank', 'Country', 'IHDI']
ihdi_df = pd.DataFrame(list(data), columns = cols, index=rank)*
使用 Plot.ly 通过 Choropleth 地图可视化 IHDI
在创建了一个包含按国家名称排列的 IHDI 值的熊猫数据框架后,我能够构造一个变量(“数据”),该变量可以传递到 plot.ly 方法中,如下所示:
*data = [dict(
type='choropleth',
locations = ihdi_df['Country'],
autocolorscale = True,
z = ihdi_df['IHDI'],
locationmode = 'country names',
marker = dict(line = dict (
color = 'rgb (255,255,255)', width = 2)),
colorbar = dict(
title = "2017 Inequality-Adjusted HDI")
)]layout = dict(title = 'Countries by 2017 Inequality-Adjusted HDI')#using one of many plotly imports: import plotly.graph_objs as go
fig = go.Figure(data = data, layout = layout)py.offline.iplot(fig);*
Plotly 很棒,因为它易于使用、动态且具有交互性。虽然依赖第三方资源进行数据科学有时很好,但最终在价格、复杂性和文档可用性方面会很昂贵,因此我非常欣赏像 matplotlib 这样简单的库。在下方,您可以将鼠标悬停在国家/地区上方以查看各个 IHDI 值,向任意方向平移地图,放大/缩小地图,并将其重置为原始比例-所有操作均使用嵌入右上角的 plot.ly 按钮。
Created in Python with Plot.ly
洞察力:IHDI Choropleth 地图
我们现在可以很容易地看到,加拿大、澳大利亚、日本、冰岛和一些斯堪的纳维亚国家在这一特殊的不平等调整人类发展指标上的指数非常高。它们是在发展努力中实现经济实力、教育和健康之间良好平衡的领导者,这些好处可能会更均匀地分配给更大部分的公民。希望提高自身得分的政府应该效仿这些国家在前进中所采用的一些价值观和行动。美国在不平等调整后的排名上有所下降(从人类发展指数的第 13 位降至第 25 位)。中非共和国、南苏丹和尼日尔等非洲国家显然迫切需要提高教育入学率、人均收入、公共卫生服务以及其他经济机会和平均预期寿命的决定因素。没有地图,这些事情可能是显而易见的,但 choropleth 使我们能够清楚地看到陆地、海洋、边界和最近的邻居如何影响测量的值。它可以作为一种地理目录来指导进一步的认识和未来的研究。
人类发展&我们国家的生态足迹
经济增长必然会破坏我们的生物圈吗?发达国家的生态足迹与他们的生物能力相符吗?或者我们正在以赤字的方式消耗资源?哪些国家在不依赖有限自然资源的情况下增加了 IHDI?哪些国家正在消耗自然资源,却不一定能发展经济?随着时间的推移,这些因素在各个国家、各个大洲,在总的和人均指标和人口方面发生了怎样的变化?我怎么可能用一种容易理解的方式来想象这一切呢?
为了简单直观地探究这些问题,我下载、清理并合并了。在 Kaggle 上使用熊猫的 csv 数据来自世界银行和 T2 的全球足迹网络。我不会讲太多细节,我将总结一下我遇到的一些清洁障碍:*
- 我添加了列后缀,以便合并许多按年份标记的列(例如 2007 年人类发展指数,2007 年 le,2007 年 pop)
- 在不同的数据集中,国家有时会被不同地缩写或截短,所以我将它们对齐(例如。美国-美国-美利坚合众国、圣卢西亚-圣卢西亚等。)
- 在生态足迹数据中,我将“美洲”大陆分为北美和南美
- 在合并之前决定如何正确处理缺失或空的指标、年份和国家(因为一些指标、年份和国家缺失,所以数据不是当前世界的 100%综合视图)
在将合并的数据清理并加载到 Pandas dataframe 后,我使用一个名为 Bubbly 的 Python 库创建了一个气泡图,它依赖于 NumPy、Pandas 和 Plot.ly。令人难以置信的是,每个气泡图可以一次接受多达六个有意义变量的参数!
*# Biocapacity Per Capita vs. EF Per Capita Chart code
from bubbly.bubbly import bubbleplotfigure = bubbleplot(
#input dataframe, and 2 main variables
dataset=data1,
x_column='BiocapPerCap',
y_column='EFConsPerCap',
bubble_column='country', #what each bubble reps
time_column='year', #time interval
size_column='EFConsTotGHA', #bubble size argument
color_column='continent', #bubble color argument
#column titles, main title
x_title="Biocapacity Per Capita (global hectares)", y_title = "Ecological Footprint Per Capita (global hectares)",
title = 'Biocapacity (Per Capita) vs. Ecological Footprint (Per Capita) by Year, Country, & Population',
x_logscale=False, #log scale argument
scale_bubble=3, #how big should bubbles be?
height=650,
#scale of axes
x_range = (-2,18),
y_range = (-2,18)
)#render the plot inline
iplot(figure, config={'scrollzoom': True})#alternatively, use: plot(figure, config={'scrollzoom': True})
#to create an html page auto-saved your current directory*
在以下可视化中要寻找什么:
- 每个泡泡:国家
- 气泡颜色:大陆
- 气泡大小:以全球公顷(测量土地,100 公顷= 1 平方公里)为单位的国家总生态足迹
- 水平 X 轴上的位置:每个国家的人均生物能力,以全球公顷为单位
- 垂直 Y 轴位置:每个国家的人均生态足迹,以全球公顷为单位
- 滑块/动画:时间(年)
- 右下角附近的国家:!对地球来说是积极的。**
- 左上方附近国家:!他们在生态赤字下运作。****
******* 点击探索互动图表(生物容量 pc vs .生态足迹 pc) *******
预览:
洞察:人均生物能力与人均生态足迹
请记住,这种分析不是预测性的,而是描述性的,我们可以得出结论,一些国家正在以比其他国家更可持续和更健康的方式发展和增长,但我们不能对变量之间的潜在关系或因果关系做出评论。此外,请记住,这张图表有助于我们分析一个严格的生态比率,尽管这很有趣,但它忽略了许多有意义的因素,这些因素可能有助于评估过去的表现并激励新的行动,并且在 2014 年被截断。
玻利维亚在这里看起来真的很好(目前)!这个南美国家的生态容量是其足迹的 5 倍(比例为 16:3),这是一个令人震惊的净积极生态。然而,玻利维亚的故事并非完美无缺。自从世纪之交以来,这个国家的森林砍伐率一直在上升,这主要与森林转化为大规模农业和牧场有关,特别是在查科地区。它是南美洲的对手,巴西的人均足迹相似,但人均生态承载力只有它的一半。这种影响,在人均规模上,似乎平衡了亚马逊与其庞大人口的利益。在美国,我们正在消耗生态系统提供的 2.3 倍的水,这是一个不容忽视的运营赤字。中国(3.8 倍)和印度(2.4 倍)位居第二(或者说没有第二),以同样可怕的人均比率,以及意料之中的最大的总足迹。图表中人均足迹与生物能力的比率最低的国家是卡塔尔,卡塔尔和其邻国被世界卫生组织称为世界上毒性最大的国家。每个点似乎都在讲述一个新的故事。每个故事似乎都揭示了需要持续的意识和行动。
另一个泡沫图:人类发展指数与人均生态足迹
为了在气泡图上查看一组不同的变量,我用 x_column、y_column 和 bubble_column (size)的新参数操纵了“figure”对象(显示在上面的 Python 代码中)。
要查找的更改:
- ****新的水平 X 轴位置:每个国家的人类发展指数(HDI)
- 国右下方: 还好 !这些国家在经济、教育和健康方面都在发展,同时(相对)限制了它们对环境的破坏。
- 国左上方: 还不好 !这些国家正在耗尽地球的资源,却不一定同步造福人类。
******* 在此探索互动图表(HDI 与环保电脑) *******
预览:
洞察:人类发展指数与人均生态足迹
国家人类发展努力必然会破坏生态吗?挖掘石油当然会带来经济利益,例如,我们每次开车都会从中受益。与此同时,有一些方法可以有效地将这种好处转移到能够改善人类发展指数等指标的项目上。当然,说起来容易做起来难,但是考虑到有时是间接的,通常是直接的权衡,哪些国家做得好呢?
一般来说,欧洲似乎在树立生态意识的同时也为人类进步设定了标准。向西班牙、葡萄牙、意大利、罗马尼亚、匈牙利和塞浦路斯大声疾呼,它们成功地控制了人均碳足迹,同时处于或接近国家人类发展指数的较高水平。大部分欧洲国家位于或接近这一等级,但是一些没有被提及的欧洲国家似乎更愿意过度利用他们的生态资源。在这张泡泡图中,非洲是另一个大多数国家都聚集在一起的大陆。平均而言,大多数非洲国家都位于人类发展指数排名的后半部分,尽管它们似乎都不是生态破坏的罪魁祸首。北非国家摩洛哥、阿尔及利亚和突尼斯的这一比例最为理想,这可能是因为地处地中海,靠近许多制定标准的欧洲国家。
亚洲国家似乎没有明显地聚集在一起,尽管有一些趋势和重要的观察值得注意。从 2000 年到 2014 年,沙特阿拉伯、科威特、巴林、哈萨克斯坦、阿曼和一些近邻似乎在人类发展指数上取得了令人难以置信的进步,但它们对自然资源的依赖也出现了类似的大幅飙升。除了战争和腐败之外,许多开放的贸易政策改革、石油之外的多样化以及融入全球经济的努力对人类发展指数和该地区公民的总体生活水平产生了积极影响。
美国、加拿大、澳大利亚、丹麦和新加坡似乎是这些国家中高度发达的环境罪犯。如果没有对环境的真正破坏,我们可能无法达到美国目前的生活水平。我们可以同样感激我们所拥有的,同样致力于改善我们的制度和价值观。这些巨大的、令人生畏的进步肯定是从本地开始的。我们都可以教别人一些东西,种植一些东西,快速洗澡,吃完你的食物,骑自行车,投票。
我希望你喜欢这本书,
亚历克斯
查看我的 GitHub 库 获取项目数据、代码、详情。
请继续关注我的后续文章,我会继续深入研究数据科学。我鼓励大家喜欢、评论、分享或直接给我发消息,告诉我你们对这里提出的想法的想法,或者对我今后应该研究的有趣主题的建议。
www.linkedin.com/in/alexshropshire
medium.com/@as6140
github.com/as6140
使用 Dabl 的人在回路自动机器学习
原文:https://towardsdatascience.com/human-in-the-loop-auto-machine-learning-with-dabl-2fe9c9d1736f?source=collection_archive---------32-----------------------
使用这个 python 库自动执行重复的机器学习任务
T 任何机器学习项目最耗时的部分都是数据清理、预处理和分析的初始阶段。在训练一个模型之前,你首先需要经历一个漫长的过程。执行任务,例如处理缺失值、将分类变量转换为数字变量并分析数据,以便为特征工程和选择提供信息。
有许多工具试图自动化这个过程,包括众所周知的 auto-sklearn 库。然而,其中许多都是一个黑箱,很难准确理解工具是如何改变数据的,如果数据有一些独特性,也很难定制过程。
Andreas Mueller 创建的相对较新的 python 库 d abl 试图解决这个问题。Dabl 提供了一个工具来自动化初始模型开发阶段中涉及的许多重复性任务。虽然功能目前有点有限,但确实存在的功能是非常有前途的。看看 Github 回购开发正在进行中,最近的项目承诺发生在 2019 年 11 月 15 日。在本文的剩余部分,我将对该工具进行简单的评估。
自动化预处理
Dabl 可以 pip 安装,如下所示。该库还依赖于是否安装了最新版本的 scikit-learn,因此如果您没有安装,则需要升级或安装最新版本scikit-learn==0.21.3
。
pip install dablimport pandas as pd
import dabl
为了说明其中的一些特性,我将使用“给我一些信任”竞赛中的 Kaggle 数据集。数据集可以从这里下载。我使用的是cs-training.csv
文件,该文件包含关于一个人的信用历史和环境的特征,以及目标变量(SeriousDiqin2yrs `)。这表明他们在过去两年中是否经历过严重的财务压力。
loan_data = pd.read_csv('cs-training.csv')
通常,机器学习项目的第一部分是理解数据,并在训练模型之前执行必要的预处理。Dabl 寻求自动化这一过程。如果运行以下命令,dabl 将尝试识别缺失值、要素类型和错误数据。我们数据集的输出显示在代码下面。
loan_clean = dabl.clean(loan_data, verbose=1)
describe_data(loan_clean)
有关它已识别的要素类型的更多信息,您可以键入。
types = dabl.detect_types(loan_clean)
types
当模型适合数据时,Dabl 将使用上述方法对特征进行适当的预处理。特别有用的是,1)您可以直观地看到 dabl 正在推断什么,2)如果您认为推断的数据类型不正确,您可以对预处理进行调整。例如,在上文中,dabl 已将特征NumberOfDependents
识别为连续变量。然而,如果被视为分类,这实际上可能在模型中执行得更好,所以我们可以选择将其指定为categorical
,如下面的代码所示。
loan_clean = dabl.clean(loan_data, type_hints={"NumberOfDependents": "categorical"})
数据分析
模型开发中第二耗时的部分是数据分析。在训练模型之前,了解数据的基本分布、目标类的平衡程度以及哪些特征与目标变量密切相关非常重要。Dabl 也试图简化这一过程。简单地运行这一行代码就可以返回大量有用的可视化结果。由于 dabl 检测特征类型并自动清理数据,这使得数据分析速度极快。
dabl.plot(loan_clean, 'SeriousDlqin2yrs')
模型开发
Dabl 还寻求加速模型选择过程。通过运行非常少量的代码,dabl 训练一组 scikit-learn 模型并返回相应的分数。
fc = dabl.SimpleClassifier(random_state=0)
X = loan_clean.drop('SeriousDlqin2yrs', axis=1)
y = loan_clean.SeriousDlqin2yrs
fc.fit(X, y)
A selection of models and scores returned from dabl
这个图书馆很新,还在开发中。看一下文档,还会有一些有用的特性,包括模型解释器和增强模型构建的工具。目前,这个库提供了一种在模型开发之初自动完成大量工作的方法,特别是对于机器学习模型的快速原型开发非常有用。
感谢阅读!
人工智能的类人机器听觉(3/3)
原文:https://towardsdatascience.com/human-like-machine-hearing-with-ai-3-3-fd6238426416?source=collection_archive---------10-----------------------
Photo credit: Malte Wingen
结果和观点。
这是我关于 【类人】机器听觉 系列文章的最后一部分:用 AI 对人类听觉的部分进行建模来做音频信号处理。
本系列的最后一部分将提供:
- 对主要观点的总结。
- 经验测试的结果。
- 相关工作和未来展望。
如果你错过了之前的文章,这里有:
背景:AI 在音频处理上的承诺
批评:CNN 和 spectrograms 做音频处理有什么问题?
第一部分 : 具有 AI (1/3)听觉的类人机器
第二部分: 具有 AI (2/3)听觉的类人机器
总结。
在抽象层次上理解和处理信息不是一件容易的事情。人工神经网络已经在这一领域移山。特别是对于计算机视觉:深度 2D CNN 已经被证明可以捕捉视觉特征的层次,随着网络的每一层,复杂性都在增加。卷积神经网络的灵感来自于大脑皮层,而大脑皮层又受到了人类视觉系统的启发。
人们已经尝试在音频领域重新应用风格转换等技术,但结果很少令人信服。视觉方法似乎不适用于声音。
我认为声音完全是一种不同的动物。在进行特征提取和设计深度学习架构时,这是需要记住的事情。声音表现不同。就像计算机视觉受益于对视觉系统的建模一样,当在神经网络中处理声音时,我们可以受益于考虑人类的听觉。
Photo credit: Steve Harvey
声音表现。
为了开始探索建模方法,我们可以建立一个人类基线:
对大脑来说,声音是用光谱表示的。压力波由耳蜗处理,并被分成大约 20-20,000 Hz 范围内的大约 3500 个对数间隔的频带。
声音是以 2-5 毫秒的时间分辨率听到的。比这更短的声音(或声音的间隙)人类几乎察觉不到。
基于这些信息,我推荐使用一个 伽玛通滤波器组 来代替傅立叶变换。 Gammatone 滤波器组是听觉建模中的常用工具,通常,滤波器组允许分离频谱和时间分辨率。通过这种方式,您可以拥有多个光谱带和一个较短的分析窗口。
内存和缓冲器。
人类被认为具有短期储存感官印象的记忆,以便进行比较和整合。尽管实验结果略有不同,但它们表明人类有大约 0.25-4 秒的回声记忆(专门针对声音的感官记忆)。
任何人类能听懂的声音 都可以在这些限度内表现出来!
几秒钟的 2-5 ms 窗口,每个窗口有大约 3500 个对数间隔的频带。但这确实积累了大量数据。
Two dilated buffers covering ~1.25s of sound with 8 time steps.
为了减少一点维度,我提出了 扩展缓冲区 的想法,其中时间序列的时间分辨率随着旧时间步长的增加而降低。这样,可以覆盖更大的时间范围。
Photo credit: Alireza Attari
监听器处理器架构。
我们可以将内耳概念化为一个光谱特征提取器,将听觉皮层概念化为一个分析处理器,从听觉印象的记忆中导出“认知属性】。
在这两者之间,还有一系列经常被遗忘的步骤。它们被称为耳蜗核 。关于这些我们还有很多不知道的,但是它们对声音做了一种初步的神经编码:对定位和声音识别的基本特征进行编码。
这让我探索了一个 监听器-处理器模型 ,其中声音缓冲区由通用 LSTM 自动编码器(一个)嵌入到一个低维空间,然后被传递到一个特定任务的神经网络(一个 【处理器】 )。这使得 autoencoder 成为一个可重用的预处理步骤,用于对声音进行一些特定任务的分析工作。
A listener-processor architecture to do sound classification.
结果。
我认为这一系列文章提出了一些在神经网络中处理声音的新想法。利用这些原则,我建立了一个模型,使用 UrbanSound8K 数据集进行环境声音分类。
由于计算资源有限,我只能勉强接受:
- 100 个伽马酮过滤器。
- 10 ms 分析窗口。
- 8 级扩展缓冲器,覆盖约 1.25 秒的声音。
为了训练听者,我将数千个膨胀的缓冲区输入到一个自动编码器中,每边有两个 LSTM 层,将 800 维的连续输入编码到一个 250 维的“静态”潜在空间中。
An illustration of the LSTM autoencoder architecture.
经过大约 50 个时期的训练后,自动编码器能够捕捉大多数输入缓冲器的粗略结构。能够产生一种嵌入来捕捉声音中复杂的频率顺序运动是非常有趣的!
但是有用吗?
这是要问的问题。为了测试这一点,我训练了一个 5 层自归一化神经网络,使用来自 LSTM 编码器的嵌入来预测声音类别 (UrbanSound8K 定义了 10 个可能的类别)。
经过 50 代的训练后,该网络预测声音类别的准确率约为 70%。
2018 年, Z .张等人。艾尔。在 UrbanSound8K 数据集上实现了 77.4%的预测准确率。他们通过对γ谱图进行 1D 卷积实现了这一点。随着数据的增加,这种准确性可以被推得更高。我没有资源来探索数据增强,所以我将在系统的非增强版本上进行比较。
相比之下,我的方法准确率低了 7.4%。然而,我的技术在 10 ms 的时间范围内工作(通常附带一些内存),这意味着 70%的准确率涵盖了数据集中声音在任何给定时间的 10 ms 时刻。这将系统的延迟降低了 300 倍,非常适合实时处理。简而言之,这种方法不太准确,但在处理时引入的延迟明显更少。
A “happy accident” I encountered during initial experiments.
视角。
完成这个项目确实非常有趣。我希望已经为你提供了一些如何在神经网络中处理声音的想法。虽然我对我的初步结果很满意,但我相信,如果有更好的光谱分辨率和用于训练神经网络的计算资源,这些结果可以得到显著改善。
我希望有人会拿起这个,在新问题上用一种监听器-处理器的方法进行实验。特别是,我很好奇尝试一种变分自动编码器方法,看看当它们的潜在空间被调整时,重建的声音会发生什么——也许这可以揭示一些关于声音本身的基本统计特征的直觉。
相关工作。
如果您对使用自动编码器的声音表现感兴趣,这里有一些启发了我的项目,我推荐您去看看:
音字 2Vec
这些人使用 MFCC 和 Seq2Seq 自动编码器研究了一种类似的语音编码方法。他们发现语音结构可以用这种方式充分表达。
全球音乐翻译网
这是非常令人印象深刻的,也是我见过的最接近声音风格的转变。它是去年由脸书人工智能研究所发布的。通过使用共享的 WaveNet 编码器,他们将许多原始样本音乐序列压缩到一个潜在空间,然后使用单独的 WaveNet 解码器对每个所需的输出“风格”进行解码。
用神经网络模拟非线性音频效果
马克·马丁内斯和约书亚·赖斯成功地用神经网络模拟了非线性音频效果(如失真)。他们通过使用 1D 卷积来编码原始样本序列,变换这些编码(!)与深度神经网络,然后通过去卷积将这些编码重新合成回原始样本。
亲爱的读者,非常感谢你和我一起踏上这段旅程。我对这个系列文章得到的大量积极的、批评性的和信息丰富的回复感到荣幸。
忙得不可开交,这篇最后的文章姗姗来迟。现在它已经结束了,我期待着下一章,新的项目和想法来探索。
人体姿态估计:简化
原文:https://towardsdatascience.com/human-pose-estimation-simplified-6cfd88542ab3?source=collection_archive---------5-----------------------
看看人类姿势估计的世界
什么是人体姿态估计?
人体姿态估计是计算机视觉领域的一个重要问题。想象一下,能够跟踪一个人的每一个微小动作,并实时进行生物力学分析。这项技术将会产生巨大的影响。应用可能包括视频监控、辅助生活、高级驾驶辅助系统(ADAS)和运动分析。
从形式上讲,姿态估计是从图像或视频中预测一个人的身体部位或关节位置。
Image courtesy Microsoft COCO Dataset (Lin et al., 2014)
为什么是这个博客?
我从事人体姿态估计已经超过 8 个月了。这一领域的研究在广度和深度上都是巨大的。然而,姿势估计方面的大多数文献(研究论文和博客)都相当先进,使得新手很难积累。
姿势估计的未来研究范围是巨大的,创建一个学习斜坡可以让更多的人感兴趣。博客的目的是提供对姿态估计的初步理解,并可能引发对该领域的兴趣。任何之前完全没有计算机视觉经验的人都可以肤浅地关注这个博客。即使是对计算机视觉概念的基本理解,也足以完全理解博客。
问题定义
正如我前面说过的,人体姿态估计是一个在深度和宽度上都有大量研究的领域。问题陈述可以基于以下轴进行分类:
被跟踪的人数
根据被跟踪的人数,姿态估计可以分为单人和多人姿态估计。单人姿势估计(SPPE)是两者中较容易的一个,可以保证帧中只有一个人。另一方面,多人姿态估计(MPPE)需要处理额外的人与人之间的遮挡问题。最初的姿态估计方法主要集中在 SPPE,然而随着大规模多人数据集的出现,MPPE 问题最近受到越来越多的关注。
Single-person vs Multi-person Pose Estimation.
输入模态
模态是指不同类型的可用输入。根据获取的难易程度,前三种输入形式是:
- 红绿蓝(RGB)图像:我们每天在身边看到的图像,也是姿态估计最常见的输入类型。就输入源的移动性而言,仅处理 RGB 输入的模型比其他模型具有巨大的优势。这是因为普通相机(捕捉 RGB 图像)很容易获得,使它们成为可以在大量设备上使用的模型。
- 深度(飞行时间)图像:在深度图像中,像素的值与通过飞行时间测量的距相机的距离有关。像微软 Kinect 这样的低成本设备的引入和流行,使得获取深度数据变得更加容易。深度图像可以补充 RGB 图像,以创建更复杂和精确的计算机视觉模型,而仅深度模型广泛用于关注隐私的地方。
- 红外(IR)图像:在红外图像中,像素的值由反射回相机的红外光的量决定。与 RGB 和深度图像相比,基于红外图像的计算机视觉实验很少。微软 Kinect 在录制时也提供红外图像。然而,目前没有包含红外图像的数据集。
RGB image vs Depth image
静态图像 vs 视频
视频只不过是图像的集合,其中每两个连续的帧共享其中存在的大量信息(这是大多数视频压缩技术的基础)。在执行姿态估计时,可以利用视频中的这些时间(基于时间的)依赖性。
对于视频,需要为输入视频序列产生一系列姿态。期望所估计的姿态应该在连续的视频帧之间理想地一致,并且该算法需要在计算上高效以处理大量的帧。对于视频来说,遮挡问题可能更容易解决,因为存在身体部位未被遮挡的过去或未来的帧。
如果时间特征不是流水线的一部分,则可以对视频中的每一帧应用静态姿态估计。然而,由于抖动和不一致性问题,结果通常不如期望的那样好。
Notice the jitter in Single-frame model and the smoothness in Temporal model. Image courtesy Pavllo et al. (2018)
2D vs 3D 姿态估计
根据输出维数的要求,姿态估计问题可以分为 2D 姿态估计和三维姿态估计。2D 姿态估计是预测图像中身体关节的位置(根据像素值)。另一方面,3D 姿态估计预测所有身体关节的三维空间排列作为其最终输出。
2D Pose Estimation vs 3D Pose Estimation
大多数三维姿态估计模型首先预测 2D 姿态,然后尝试将其提升到三维姿态。然而,也存在一些直接预测 3D 姿态的端到端 3D 姿态估计技术。
车身模型
每个姿态估计算法事先都同意一个身体模型。它允许该算法将人体姿态估计问题形式化为估计人体模型参数的问题。大多数算法使用简单的 N 关节刚性运动骨架模型(N 通常在 13 到 30 之间)作为最终输出。形式上,运动学模型可以表示为一个图,其中每个顶点 V 表示一个关节。边 E 可以编码关于身体模型结构的约束或先验信念。
这种模型足以满足大多数应用。然而,对于许多其他应用程序,如角色动画,可能需要更精细的模型。一些技术已经考虑了高度详细的网格模型,用点云表示整个身体。
在早期姿势估计流水线中使用的另一个相当原始的身体模型是基于形状的身体模型。在基于形状的模型中,人体部分使用类似矩形、圆柱、圆锥等几何形状来近似。
Kinematic Model vs Shape-based Model vs Mesh-based Model
摄像机数量
研究的主要部分涉及使用来自单个相机的输入来解决姿态估计问题。然而,有某些算法试图使用来自多个视点/摄像机的数据,将它们组合起来以生成更精确的姿势并更好地处理遮挡。目前对多摄像机姿态估计的研究还比较有限,主要是因为缺少好的数据集。
姿态估计流水线
预处理
- 背景去除:可能需要从背景中分割出人,或者去除一些噪声。
- 一些算法,特别是在 MPPE,为图像中出现的每个人创建边界框。然后,每个边界框被单独评估人类姿态。
Bounding Box creation. Image courtesy Fang et al. (2017)
- 摄像机校准和图像配准:如果使用多个摄像机的输入,则需要进行图像配准。在 3D 人体姿态估计的情况下,相机校准也有助于将报告的地面实况转换成标准世界坐标。
特征提取
机器学习中的特征提取指的是从原始数据(如我们案例中的图像或视频)中创建导出值,这些值可以用作学习算法的输入。特征可以是显式的,也可以是隐式的。显式特征包括传统的基于计算机视觉的特征,如梯度方向直方图(HoG)和尺度不变特征变换(SIFT)。在将输入馈送到下面的学习算法之前,显式地计算这些特征。
Left : Image along with corresponding color gradients, Right : Image with SIFT features
隐式特征是指基于深度学习的特征映射,如来自复杂深度卷积神经网络(CNN)的输出。这些特征地图从来不是明确创建的,而是端到端训练的完整管道的一部分。
VGG16 : A CNN based feature extraction and image classification architecture
推论
置信图:预测关节位置的常用方法是为每个关节生成置信图。置信度图是图像上的概率分布,表示每个像素处的联合位置的置信度。
Confidence map examples
- 自下而上方法:自下而上方法包括首先检测图像中一个或多个人的部位或关节,然后将这些部位组合在一起,并将它们与特定的人相关联。
简单来说,该算法首先预测图像中出现的所有身体部位/关节。典型地,这之后是基于身体模型的图形公式,其连接属于同一个人的关节。整数线性规划(ILP)或二分匹配是创建此图的两种常见方法。
Cao et al. complete pipeline. An example of a bottom up approach. Image courtesy Cao et al. (2017)
- 自顶向下方法:自顶向下方法在开始时包括分割步骤,首先将每个人分割成一个边界框,然后在每个边界框上单独执行姿态估计。
自顶向下的姿态估计可以分为基于生成人体模型的方法和基于深度学习的方法。基于生成人体模型的方法包括尝试在图像上拟合人体模型,允许最终预测像人类一样。基于深度学习的方法直接预测关节位置,因此最终的预测不能保证像人类一样。
Fang et al. complete pipeline. An example of a top down approach. Image courtesy Fang et al. (2017)
后处理
许多算法,包括自底向上和自顶向下的方法,在最终输出上没有关系约束。通俗地说,从输入图像预测关节位置的算法没有任何关于拒绝/校正不自然的人类姿势的过滤器。这有时会导致怪异的人体姿态估计。
Pose Estimation using Kinect containing weird and unnatural pose
为了解决这个问题,存在一组后处理算法,其拒绝不自然的人类姿态。来自任何姿势估计管道的输出姿势通过学习算法,该算法基于其可能性对每个姿势进行评分。在测试阶段,得分低于阈值的姿势会被忽略。
数据集
人体姿态估计中几种常用数据集简介。
- MPII:MPII 人体姿态数据集是一个多人 2D 姿态估计数据集,包括从 Youtube 视频收集的近 500 个不同的人体活动。MPII 是第一个包含如此多样姿态的数据集,也是第一个在 2014 年发起 2D 姿态估计挑战的数据集。
- COCO:COCO 关键点数据集是一个多人 2D 姿势估计数据集,图像从 Flickr 收集。COCO 是迄今为止最大的 2D 姿态估计数据集,并且正在考虑测试 2D 姿态估计算法的基准。
- HumanEva : HumanEva 是一个单人 3D 姿态估计数据集,包含使用多个 RGB 和灰度相机记录的视频序列。使用基于标记的运动捕捉(mocap)相机来捕捉地面真实 3D 姿态。HumanEva 是第一个大尺寸的 3D 姿态估计数据集。
- Human3.6M : Human3.6M 是单人 2D/3D 姿态估计数据集,包含使用 RGB 和飞行时间(深度)相机记录的视频序列,其中 11 个演员正在执行 15 种不同的可能活动。使用 10 个 mocap 相机获得 3D 姿态。Human3.6M 是迄今为止最大的真实 3D 姿态估计数据集。
- 超现实:超现实是一个单人 2D/3D 姿态估计数据集,包含使用实验室记录的 mocap 数据创建的虚拟视频动画。超现实是最大的 3D 姿态估计数据集,但是还没有被接受作为比较 3D 姿态估计算法的基准。这主要是因为它是一个合成数据集。
结论
人体姿态估计是一个不断发展的学科,有机会在各个领域进行研究。最近,在人体姿态估计中有一个值得注意的趋势,即转向使用深度学习,特别是基于 CNN 的方法,因为它们在任务和数据集上的优异性能。深度学习成功的一个主要原因是大量训练数据的可用性,特别是随着 COCO 和 Human3.6M 数据集的出现。
如果您有兴趣进一步阅读和更详细地探索人体姿态估计,请查看这些资源。
[## 姿势估计指南
现在我们知道了一点什么是姿态估计,不同类型的姿态估计之间的区别,以及…
www.fritz.ai](https://www.fritz.ai/pose-estimation/)
这个博客是努力创建机器学习领域简化介绍的一部分。点击此处查看完整系列
[## 机器学习:简化
在你一头扎进去之前就知道了
medium.com](https://medium.com/@prakhargannu/machine-learning-simplified-1fe22fec0fac)
或者只是阅读系列的下一篇博客
[## 卷积核的类型:简化
对迷人的 CNN 层的不同变化的直观介绍
towardsdatascience.com](/types-of-convolution-kernels-simplified-f040cb307c37)
参考文献
[1]曹,哲,等,“基于局部亲和场的实时多人二维姿态估计”IEEE 计算机视觉和模式识别会议录。2017.
【2】微软公司。xbox 360 版 kinect,2009 年。
[3] Pavllo,Dario 等人,“视频中的三维人体姿态估计,采用时间卷积和半监督训练。”arXiv 预印本 arXiv:1811.11742 (2018)。
[4]方,郝舒,等,“Rmpe:区域多人姿态估计”IEEE 计算机视觉国际会议论文集。2017.
[5]林、梅尔、贝隆吉、海斯、佩罗娜、拉马南、杜尔和兹尼克。微软 coco:上下文中的公共对象。在欧洲计算机视觉会议上,第 740-755 页。斯普林格,2014。
人类选择,AI 不选择
原文:https://towardsdatascience.com/humans-choose-ai-does-not-6512d49f7c46?source=collection_archive---------21-----------------------
人工智能不是人类
专家称,到 2060 年,人工智能将在各方面胜过人类。好吧。
首先,正如约吉·贝拉所说,“很难做出预测,尤其是对未来。”我的飞车在哪里?
第二,标题读起来像 clickbait,但令人惊讶的是,它似乎与的实际调查非常接近,该调查询问人工智能研究人员“高级机器智能”何时到来,定义为“当没有辅助的机器可以比人类工人更好、更便宜地完成每项任务。”这个定义中的“任务”是什么?“每个任务”有意义吗?我们能列举所有的任务吗?
第三也是最重要的,高级智能只是完成任务吗?这是人工智能和人类智能的真正区别:人类定义目标,AI 试图实现它们。锤子会取代木匠吗?他们每个人都有自己的目的。
理解人工智能和人类智能之间的这种差异至关重要,这不仅有助于解读流行媒体上所有疯狂的头条新闻,更重要的是,有助于对这项技术做出实际、明智的判断。
这篇文章的其余部分介绍了一些类型的人工智能,人类智能的类型,以及鉴于它们之间的差异,人工智能的似是而非的风险。简而言之:与人类不同,每一种人工智能技术都有一个数学上完美定义的目标,通常是一个标签化的数据集。
人工智能的类型
在监督学习中,您定义一个预测目标,并收集一个带有与该目标对应的标签的训练集。假设您想识别一张图片中是否有丹泽尔·华盛顿。那么你的训练集就是一组图片,每张图片都标有包含或不包含丹泽尔·华盛顿。标签必须在系统之外贴上,很可能是由人来贴。如果您的目标是进行面部识别,那么您的标注数据集就是带有标签的图片(图片中的人)。同样,你必须以某种方式收集标签,可能是与人。如果你的目标是将一张脸与另一张脸进行匹配,你需要一个匹配是否成功的标签。总是贴标签。
你读到的几乎所有机器学习都是监督学习。深度学习,神经网络,决策树,随机森林,逻辑回归,所有在标记数据集上的训练。
在无监督学习中,你再次定义一个目标。一种非常常见的无监督学习技术是聚类(例如,众所周知的 k 均值聚类)。同样,目标是非常明确的:找到最小化一些数学成本函数的集群。例如,在同一聚类内的点之间的距离小,而不在同一聚类内的点之间的距离大的情况下。所有这些目标都定义得非常明确,它们都有数学形式:
这个公式感觉和人类指定目标的方式很不一样。大多数人类根本看不懂这些符号。他们不是正式的。此外,人类中“目标导向”的思维模式是非常不寻常的,它有一个专门的术语。
在强化学习中,你定义了一个奖励函数来奖励(或惩罚)朝着目标前进的行为。这是人们最近在国际象棋和围棋等游戏中使用的技术,在这些游戏中,可能需要许多动作才能达到特定的目标(如将死),所以你需要一个奖励函数,在这个过程中给出提示。同样,不仅仅是一个定义明确的目标,甚至是一个定义明确的实现目标的奖励函数。
这些是目前热门的人工智能(“机器学习”)类型,因为最近在准确性方面取得了巨大的进步,但人们已经研究了许多其他类型的人工智能。
遗传算法是另一种受生物学启发的解决问题的方法。一种方法是从一群数学构造(本质上是函数)中,选择那些在问题上表现最好的。尽管人们对生物学的类比很情绪化,但是定义“最佳”的适应度函数仍然是由人类选择的具体的、完全指定的数学函数。
还有电脑生成艺术。比如深梦 ( 图库)就是深度学习神经网络生成图像的一种方式。这看起来更人性化,更少目标导向,但事实上人们仍然在指导。作者高度描述了这个目标:“无论你在那里看到什么,我都想要更多!”取决于网络的哪一层,放大的特征可能是低级的(如线、形状、边、颜色,见下面的 addaxes)或高级的(如对象)。
Original photo of addaxes by Zachi Evenor, processed photo from Google
专家系统是一种在正式表达的知识体上使用 if-then 规则做出决策的方法。它们在 20 世纪 80 年代有点流行。这些是一种“好的老式人工智能”(go fai),这是一个基于操纵符号的人工智能术语。
人类和人工智能的另一个共同区别是,人类需要长时间的学习,而 AI 通常会针对每个问题从头开始重新训练。然而,这种差异正在缩小。迁移学习是训练一个模型,然后在不同的环境中使用或调整该模型的过程。这是计算机视觉领域的行业实践,深度学习神经网络已经使用以前网络的特征进行了训练(示例)。
长期学习的一个有趣的研究项目是 NELL 的“永无止境的语言学习”。内尔爬上网络收集文本,试图提取信念(事实),如“ airtran 是一个运输系统”,以及信心。它从 2010 年开始爬行,截至 2017 年 7 月已经积累了超过 1.17 亿个候选信念,其中 380 万个是高置信度(至少是 1.0 的 0.9)。
在上面的每一个例子中,人类不仅指定一个目标,而且必须明确地指定它,通常甚至用数学来形式化。
人类智力的类型
人类的智力有哪些类型?甚至很难列出一个清单。心理学家对此已经研究了几十年。几千年来,哲学家们一直在与之角力。
智商是通过语言和视觉测试来衡量的,有时是抽象的。它基于这样一种观点,即所有的认知能力都有一个共同的智力(有时称为“ g 因子”)。这个想法并不是所有人都接受的,智商本身也是被热议的。例如,一些人认为,具有相同潜在能力但来自不同人口统计群体的人可能会被不同地测量,这被称为差异项目功能,或简称为测量偏差。
人们描述流动智能(解决新奇问题的能力)和结晶智能(运用知识和经验的能力)。
情商的概念出现在大众媒体上:一个人能够识别自己和他人的情绪,并利用情绪思维来指导行为的能力。目前还不清楚学术界对此的接受程度。
更广为接受的是五大性格特征:对经验的开放性、责任心、外向性、宜人性和神经质。这不是智力(或者是?),而是说明了与计算机智能的强烈差异。“性格”是预测一个人行为的一组稳定的特质或行为模式。人工智能的个性是什么?这个概念似乎不适用。
通过幽默、艺术或对意义的探索,我们离定义明确的问题越来越远,却离人性越来越近。
人工智能的风险
人工智能能否超越人类智能?
抓住大众媒体的一个风险是奇点。作家兼数学家 Verner Vinge 在 1993 年的一篇文章中给出了一个令人信服的描述:“在三十年内,我们将拥有创造超人智慧的技术手段。不久之后,人类的时代将被终结。”
这种风险至少有两种解读方式。常见的方式是某种神奇的临界质量会引起机器智能的相变。我一直不明白这个论点。“更多”不代表“不同”。这种观点类似于“当我们密切模仿人脑时,将会发生类似人类(或超人)的事情。”也许吧?
是的,大量计算能力和大量数据的可用性导致了 AI 结果的相变。语音识别、自动翻译、计算机视觉和其他问题领域已经完全转变。2012 年,当多伦多的研究人员将神经网络重新应用于计算机视觉时,一个著名数据集的错误率开始快速下降,直到几年内计算机击败了人类。但是计算机和以前一样做着同样明确的任务,只是做得更好。
ImageNet Large Scale Visual Recognition Challenge error rates. 0.1 is a 10% error rate. After neural networks were re-applied in 2012, error rates dropped fast. They beat Andrej Karpathy by 2015.
更引人注目的观察是:“奇点出现的几率可能很小,但后果如此严重,我们应该仔细思考。”
另一种解释奇点风险的方式是,整个系统将发生相变。这个系统包括计算机、技术、网络和设定目标的人类。这似乎更正确,也完全合理。互联网是一个阶段性的变化,手机也是。在这种解释下,人工智能存在大量看似合理的风险。
一个可能的风险是算法偏差。如果算法参与重要决策,我们希望它们是可信的。(在之前的一篇帖子中,我们讨论了如何衡量算法的公平性。)
Tay,一个微软聊天机器人,在 24 小时内被推特教种族主义和仇视女性。但 Tay 并没有真正理解什么,它只是“学习”和模仿。
亚马逊的面部识别软件 Rekognition 错误地将 28 名美国国会议员(大部分是有色人种)与已知罪犯进行了匹配。亚马逊的回应是,美国公民自由联盟(谁进行了测试)使用了一个不可靠的截止值,只有 80%的信心。(他们推荐 95%。)
麻省理工学院的研究人员 Joy Buolamwini 展示了几种计算机视觉系统中的性别识别错误率对于深色皮肤的人来说要高得多。
所有这些不可信的结果至少部分来自训练数据。在 Tay 的案例中,它被 Twitter 用户故意输入了充满仇恨的数据。在计算机视觉系统中,有色人种的数据可能更少。
另一个可能的风险是自动化。随着人工智能在解决汽车驾驶或农田除草等问题方面变得更具成本效益,过去从事这些任务的人可能会失业。这是人工智能加资本主义的风险:企业将各自努力提高成本效益。我们只能在社会层面上解决这个问题,这很困难。
最后一个风险是糟糕的目标,可能会因一心一意而加剧。回形针问题令人难忘地说明了这一点,首先是尼克·博斯特罗姆在 2003 年对的描述:“超级智能的唯一目标完全是任意的,比如制造尽可能多的回形针,并且会全力抵制任何改变这一目标的尝试,这似乎也是完全可能的。不管是好是坏,人工智能不需要分享我们人类的动机倾向。”甚至有一款网页游戏就是受这种想法启发。
了解你的目标
我们如何应对上述一些可能的风险?一个完整的答案是另一个完整的帖子(或者书,或者一生)。但是让我们提一件:理解你给你的 AI 的目标。因为所有的人工智能只是优化一个定义良好的数学函数,这就是你用来说你想解决什么问题的语言。
这是否意味着你应该开始阅读积分和梯度下降算法?我能感觉到你的眼睛闭上了。不一定!
目标是在你的业务需求(人类语言)和它如何被测量和优化(人工智能语言)之间的协商。你需要有人对双方说话。这通常是业务或产品所有者与数据科学家或定量研究人员的合作。
我举个例子。假设您想使用模型推荐内容。你选择优化模型来增加内容的参与度,这是通过点击量来衡量的。瞧,现在你明白互联网充满点击诱饵的一个原因了:目标是错误的。你关心的不仅仅是点击量。公司试图过滤掉不符合政策的内容,从而在不触及人工智能的情况下修改目标。这是一个合理的策略。另一个策略可能是,如果人工智能推荐的内容后来被发现违反政策,则向训练数据集添加严厉的惩罚。现在我们开始认真思考我们的目标如何影响人工智能。
这个例子也解释了为什么内容系统会如此神经质:你点击 YouTube 上的一个视频,或者 Pinterest 上的一个大头针,或者亚马逊上的一本书,系统会立即推荐一大堆几乎一模一样的东西。为什么?点击通常是在短期内衡量的,因此系统针对短期参与进行了优化。这是一个众所周知的推荐挑战,围绕数学定义一个好的目标。也许目标的一部分应该是推荐是否令人恼火,或者是否有长期参与。
另一个例子:如果你的模型是准确的,但你的数据集或测量没有考虑到你的企业中代表性不足的少数群体,你可能对他们表现不佳。你的目标可能真的是对各种不同的人都准确。
第三个例子:如果你的模型是准确的,但你不明白为什么,这可能是一些关键应用程序的风险,如医疗保健或金融。如果您必须了解原因,您可能需要使用人类可以理解的(“白盒”)模型,或者您现有模型的解释技术。可理解性可以是一个目标。
结论:我们需要理解人工智能
尽管你在大众媒体上读到过,但人工智能无法完全取代人类。人类和人工智能最大的区别在于只有人类选择目标。到目前为止,人工智能还没有。
如果可以拿走人工智能的一件事:了解它的目标。任何人工智能技术都有一个完美定义的目标,通常是一个带标签的数据集。如果定义(或数据集)有缺陷,那么结果也会有缺陷。
更好地理解你的人工智能的一个方法是解释你的模型。我们成立了提琴手实验室来帮助。欢迎致电 info@fiddler.ai 联系我们。
原载于 2019 年 5 月 8 日https://blog . fiddler . ai。
人类不信任基于人工智能的呼叫
原文:https://towardsdatascience.com/humans-dont-trust-ai-based-calls-1da68dabadd6?source=collection_archive---------24-----------------------
同样糟糕的客服,现在有了人工智能
人类代表也可能很糟糕,但不要试图用人工智能欺骗人们
客服的 AI“管用”,但人家不喜欢。我最近为了一份关于对话式人工智能和消费者信任状态的报告,与【clutch.co】的员工就此进行了深入的交谈。
研究结果很有趣。例如:
“73%的人不信任谷歌 Duplex 等人工智能语音技术来打简单的电话,尽管随着使用的增加,信任可能会建立起来”
在 B2C 领域,我对此有更多的想法,我想在这里提出来。开始了。
在星巴克,你支付额外的费用,因为他们是“高端”的,并且做一些事情,比如记住你的名字并写在你的杯子上。但是在许多商店,给你饮料的人和为你点菜的人不是同一个人。因此,这导致了这样一种情况,服务器在人群中寻找“丹尼尔”,希望找到正确的那个。这真的比一个无名无姓的机器以半价卖给你同样的 goop 好吗?
更让我对最近的客户服务经历感到愤怒的是,最近我在蒂姆·霍顿的汽车通道上,当我在开车离开之前把信用卡放回钱包时,窗口的人说了声“再见”,这是一个毫不隐晦的信号,促使我继续前进。顺便说一下,正好有一辆车在我后面等着,所以我觉得没有必要在付完饮料钱后 1 秒钟就开走。他们想让我像抢劫一样离开。
因此,人性化的客户服务可能会非常令人恼火。为什么不用基于人工智能的点餐系统来代替这些人呢?技术是存在的。考虑一下 Google Duplex ,它通过像真人一样的行为,代表 Google Assistant 用户给商店打电话预约或订购披萨:
Google Duplex: A.I. Assistant Calls Local Businesses To Make Appointments
当 Duplex 问世时,许多评论者强烈反对谷歌通过伪装成人来欺骗人们。他们是对的。我喜欢那一年谷歌停止使用座右铭“不要作恶”他们开始推出双面打印。谷歌可能在欺骗比萨饼制造商和发廊,但我更担心的是那些真正的坏演员将这项技术用作现代自动呼叫机来吸引消费者。我认为莱奥·格雷布勒说得最好,这远远超过了欺骗消费者:即使是用不幸的人作为测试假人来训练这些系统也是非常粗略的。我曾经和 Leor 一起研究过语音交互代理,从早期的文本到语音和语音到文本的转换,整个领域都在以疯狂的速度发展,以至于普通人都没有意识到他们正处于语音交互代理的新时代。
Leor Grebler talking about his voice interaction technology way back in 2012. It’s now 2019!
与仅仅一两年前的系统语音质量相比,这项技术非常非常强大。看看以下来自 VoiceNet 的语音样本:https://deep mind . com/blog/wave net-generative-model-raw-audio/
事情变得越来越有趣,这对消费者来说不会没有痛苦。举例来说,一位密友在过去几周有如下经历:
一名销售人员代表她的银行打电话给她。这是一个真正的销售电话,而不是一个骗局。与她通话的代理人有着人类应有的语调和热情,嘲笑她的 T2 闲聊,并停下来获取更多信息,正如你所料,但当她被问及一个人们通常不会问的奇怪问题时,通话速度慢了很多,然后一名带有印度口音的代理人加入了通话,接管了通话。该人士马上明确表示:“你一直在和我说话,但我们使用人工智能软件来克服口音障碍”。我的朋友很奇怪,挂了电话。这完全违反了。更糟糕的是,人工代理可能是同时拨打 50 个电话的备用系统。也许更多。
在我家,我们有一位年长的亲戚,自 2012 年以来一直在不要打电话的名单上,她在早上 6 点、7 点,甚至晚上 11 点通过她的座机接到机器人电话。这些都是老派录制的 robocalls,但是真的很让人气愤。一点都不酷。基本都是机械化骚扰。像这样的系统只会变得更糟,因为坏人得到了人工智能语音代理的东西。我在亚马逊上看了一下,有一些阻止垃圾电话的硬件设备,但切断电话线和反垃圾手机应用程序是更好的策略。
这是我拼凑的一个小东西,用来证明这项技术是切实可行的。它只会持续一个月左右,但它证明了这一点。打电话:+1 213–224–2234,你会听到我制作的一个基本会话代理。我给代理打电话的录音嵌在这里:
Me calling an artificial intelligence system on the phone, to show the basic capability.
像这样的系统有很多问题。请注意,我演示的系统预先告诉您它只能做某些事情,因此用户(调用者)更清楚会发生什么和正在发生什么。
在我与 Darryl Praill 的谈话中,我们讨论了人工智能如何不会取代销售人员,因为消费者讨厌被欺骗,而且现在的工具经常没有被正确应用(在道德上?)来帮助消费者。
My talk with Darryl Praill of VanillaSoft.com fame, about artificial intelligence in sales.
我提到的新调查报告的主要观点是:“消费者对谷歌 Duplex 等对话式人工智能工具表现出不信任,但随着使用的增加,信任将会建立。”离合器是华盛顿特区的一家 B2B 评级和评论公司。为了获得数据,离合器与全球数字解决方案公司 Ciklum 合作,调查了 500 多人对对话式人工智能的信任程度。调查告诉我们这项技术将会被使用。很多。所以系好安全带接受消费者的投诉。
一个机器人打电话卖东西已经够烦人的了,但这种人工智能呼叫技术并不像一个非法来电者试图诈骗你。相反,这是一个恼人的信任危机业务工具,可以扩展,并且很容易证明成本合理。这是伪装的机器人电话,还打了类固醇。即使人类介入捕捉系统不知道该做什么的情况,使用技术来欺骗人们也不是一个好主意。信任将是一个问题。
我朋友的爸爸告诉了她一个巧妙的方法。简单地问打电话的人是不是人。许多这样的系统被设计成将你拉向人类作为回应。我从我在一次会议上遇到的一位银行业人士那里得知,咒骂系统可能会让系统挂断你的电话,而用愤怒/吼叫的语气说话可能会让你遇到真人。但我不是一个伟大的演员,所以我会坚持“再见”。
在这篇文章中,你看到了我对人类和人工智能代理的一些负面体验和极度沮丧。如果你喜欢这篇文章,那么看看我过去最常读的一些文章,比如“如何给一个人工智能项目定价”和“如何聘请人工智能顾问”嘿,看看我们的时事通讯!
下次见!
——丹尼尔
Lemay.ai
丹尼尔@lemay.ai
人类一直在努力了解罕见的癌症,让我们给人工智能一个机会。
原文:https://towardsdatascience.com/humans-have-struggled-to-understand-rare-cancers-lets-give-artificial-intelligence-a-turn-d9b180b29805?source=collection_archive---------18-----------------------
癌症分型的挑战&人工智能如何帮助
被诊断患有一种罕见的癌症,如肝内胆管癌,会有一定程度的孤独感。大多数人甚至不知道癌症发生在哪里。这是一种胆管癌,一组从肝脏伸出的管状结构,在美国的发病率为 14 万分之一。
因为 ICC 由于其罕见性而没有得到很好的研究,医生不能真正参考以前的病例来预测新患者的结果。存活时间可以从几个月到几年不等,没有办法知道患者将属于哪个存活组——没有已知的遗传或细胞标记来预测这一点。拥有这样的生存标记是很重要的,不仅对于患者通过了解他们可能的结果来亲自适应他们未来的生活,而且对于他们的医生决定治疗也是如此。
对 ICC 进行“分型”,或者从整体上发现癌症中的亚组,可以帮助缓解这个问题,我将在下一节进一步解释。然而,这是一项艰巨的任务。研究人员可以花费长达几十年的时间进行体力劳动来对癌症进行分型,但仍然可能失败,因为没有足够的病例来做出有力的科学结论。随着最近人工智能(AI)的蓬勃发展,我们现在有能力自动化重复的过程,理解复杂的视觉数据,并从甚至很小的数据集中提取有价值的信息。人工智能提供了新的工具,最终可以更深入地了解罕见的癌症,并在未知的黑暗中给患者带来一些光明。
癌症的亚型是什么意思?
抗击癌症的最大困难之一源于这种疾病在人群中表现出的多样性。由于肿瘤之间的遗传变异,患有相同类型癌症的两个患者可能具有显著不同的生存结果和治疗方案。
为了促进治疗决策,临床医生根据细胞,有时是基因特征将每种癌症分成亚组——这被称为癌症的亚类型。在一个很好的分型癌症中,每个亚组中的所有患者应该具有相似的疾病严重程度和生存结果,当与来自同一癌症的不同亚组的患者比较时,这是不同的。
能够根据疾病的严重程度和肿瘤生物学的差异对患者进行比较和分组,对于确定适当的治疗和预测新患者的生存结果非常重要。这项任务主要由病理学家来完成,病理学家是一名临床医生,接受过在显微镜下观察组织以描述疾病特征的训练。
当患者被诊断患有癌症时,通常的程序是对癌块进行活组织检查以了解其细胞和结构组成。该组织将准备在显微镜载玻片上可视化,以更好地突出细胞形态。
例如,前列腺肿瘤的组织样本有五种主要模式,主要由癌细胞的“分化”程度,或者更简单地说,它们与正常细胞的相似程度来定义。分化良好的细胞生长缓慢,表明这是一种早期的、侵袭性较低的疾病。分化差的细胞表明更多的细胞死亡,或更具侵袭性的癌症,以及更差的生存结果。这五种分类模式用于创建 Gleason 评分,这是一种国际公认的前列腺癌疾病分期工具。
Survival probability of prostate cancer patients over 15 years. Those with a higher Gleason Score (G) have a lower probability of survival as time progresses. [1]
对于前列腺癌,亚型与细胞分化直接相关。同样的规则不一定适用于其他种类的癌症。例如,在某些皮肤癌中,典型特征之一是细胞伸长。
亚型是如何被发现的?
前列腺癌有一个最完善的分型方案。前列腺癌分型最初是由明尼阿波利斯弗吉尼亚州医疗中心的病理学主任Donald Gleason博士在 20 世纪 60 年代开始的 20 年中提出的。为了使前列腺癌患者的护理标准化,他亲自观察了数千个组织样本,并记录了复发模式,以与他们已知的生存结果进行比较。通过多次修改和多年的验证,我们有了今天所知的前列腺亚型。
通过根据病理将患者分组来对癌症进行分型是一项具有挑战性的工作,并且极其耗时。看一张显微镜载玻片就像在谷歌地图上看整个纽约市,纽约市的每条街道代表一组细胞。想象一下看着成千上万像格里森一样的人!此外,一个病理学家可能会看到与另一个病理学家不同的东西——人类偏见是另一个需要克服的因素。
罕见癌症面临另一个挑战。与前列腺癌医学不同,前列腺癌医学有一个定义明确的分级系统,不幸的是发生率很高,而罕见癌症则没有。通常情况下,一个研究机构没有足够大的样本数据集来对组织中所有发生的模式进行全面分析。
计算病理学能有什么帮助?
计算病理学和基于人工智能的模型为使用传统方法对癌症进行分型的挑战提供了答案。虽然人类可能需要数年时间来评估数千张幻灯片,但最先进的图形处理单元(GPU)可以在不到一周的时间内完成。此外,人工智能模型有可能从小型数据集提取更多信息,首次为开发罕见癌症的亚型开辟了可能性。
肝内胆管癌是一种罕见的原发性胆管肝癌。由于其罕见性,这种癌症没有确定的亚型,使得治疗决策变得困难。
我们在纪念斯隆-凯特琳癌症中心的计算病理学小组最近发表了一份预印本,检查了 246 张 ICC 的数字化切片,并建立了一个基于人工智能的模型,以在数据集内搜索潜在的亚型【2】。尽管案件数量看似不多,但它是国际商会在世界上最大的数据集。
我们的新算法类似于人类病理学家。使用类似于自动驾驶汽车如何识别道路上不同特征的方法,我们的算法首先查看所有数字化的幻灯片,并在所有患者的所有组织中找到视觉上相似的模式。接下来,我们使用统计分析将这些模式与每个患者的已知生存结果进行比较。例如,如果假设每个模式都是一个亚型的指标,该分析将评估有多少患者的组织包含每个模式时具有高复发风险。
在这种情况下,人工智能可以帮助那些超负荷工作且供不应求的病理学家,同时以积极的方式为医学研究做出贡献。在未来,直到癌症不再存在于这个地球上,面对 ICC 和其他罕见癌症的不幸诊断的人们将对未来有更好的理解。
点击此处阅读关于该研究的详细信息。
哈桑·穆罕默德是纪念斯隆-凯特琳癌症中心和威尔·康奈尔医学院的博士生。他是托马斯·富克斯实验室(Thomas Fuchs Lab)的成员,该研究小组致力于开发人工智能模型,以改善医学图像分析和癌症研究。这项工作得到了安珀·辛普森博士的 生存周期 资助。
参考文献
- 格里森评分对前列腺癌的预后价值。 BJU 国际89.6(2002):538–542。
- 迈向无监督的癌症分型:使用组织学视觉字典预测预后。 arXiv 预印本 arXiv:1903.05257 (2019)。
人类、机器和教育的未来
原文:https://towardsdatascience.com/humans-machines-and-the-future-of-education-b059430de7c?source=collection_archive---------20-----------------------
人工智能和新兴技术能让我们变得更聪明吗?
德克·克内梅尔和乔纳森·福利特
Figure 01: Education became formalized to accelerate our understanding of difficult, complicated, or abstract topics. [Illustration: “The School Teacher”, Albrecht Dürer, 1510 woodcut, National Gallery of Art, Open Access]
人类是如何学习的?我们的第一次学习是体验性的:对我们自己和我们周围的子宫之间的相互作用做出反应。体验式学习甚至延伸到子宫之外,延伸到我们的启蒙老师——我们的母亲和其他有意或无意给我们留下印象的人——唱首歌,让自己感动。事实上,我们在人类历史上所做的许多学习都是这种简单生活的刺激-反应模型,并且在这个过程中,继续学习。这种经验学习的固有模式对很多事情都适用,比如如何对待他人,如何划船,或者去哪里找淡水。然而,在帮助我们掌握语法、哲学和化学等更微妙的东西时,它就不那么有效了。它完全不足以教授我们高度复杂的知识领域,如理论物理。这就是为什么教育变得形式化的一个原因——加速,甚至仅仅是使我们对困难、复杂或抽象的主题的理解成为可能。
在西方,正规教育在大学达到了现代的顶峰,其起源可以追溯到 11 世纪的意大利博洛尼亚。高等教育植根于基督教教育和僧侣教育的延伸——其本身来自佛教传统和远东——从历史上看,高等教育是少数特权阶层的知识绿洲。融入巴黎、牛津和布拉格等城市,虽然大学是自己的地方和空间,但它生活在一个更大的城市和社区中,并成为其中的一部分。关注的焦点是艺术,这个术语的用法与我们今天所想的非常不同,它包括七种艺术的全部或子集:算术、几何、天文学、音乐理论、语法、逻辑和修辞学。
今天的大学经历看起来非常不同。学科数量激增,“艺术和科学”仅代表一所大学中的一个“学院”——几十年来,与商业和工程等更实用的应用知识相比,这个学院的重要性一直在下降。现在比以往任何时候都有更多的公民进入高等教育机构,知识已经大大民主化,尽管它对于仅仅维持简单的生活变得越来越重要。而且,在大多数情况下,随着我们的世界变得越来越世俗,大学,尤其是你的学校的宗教根源被隐藏或淡化了。大约一千年来,这些变化以不同的速度和方式发生。虽然差异是显著的,并且反映了知识和文明的进化方式,但考虑到所涉及的时间长度,我们甚至可以认为这些变化是适度的。
Figure 02: Historically, an oasis of knowledge for the privileged few, the university was integrated into cities such as Paris, Oxford, and Prague. [Illustration: “University”, Themistocles von Eckenbrecher, 1890 drawing, National Gallery of Art, Open Access]
当然,鉴于近几十年来技术的快速变化及其对经济和社会的影响,正规教育已经过时了。正规教育设计在一个模拟的世界里,强迫每个人都学习相同的课程,不同的科目以差不多相同的方式被教授,充其量只能说是笨拙地进行。出现了各种不同的哲学和教学法,它们引入了不同的学习方法,但这些方法并不是平均分布的。标准的教育方法可能是令人麻木的死记硬背——每个教授有数百名学生的大礼堂。不考虑这些障碍,我们渴望一种更好的方式。下一波重大的教育创新看起来将会是极端的。在未来的几十年里,我们可以期待人工智能和其他新兴技术的融合,以及对我们人类动物——我们如何学习、如何生活、如何参与互联人的社会——不断增加的知识,将彻底改变教育。
在一个新兴技术的世界里,教育将会发生怎样的变化?人工智能将如何协助、增强、管理、调节以及改变驱动人类学习的复杂互动?通过检查当前正规教育模式中的一些差距,我们可以看到这种技术能够并将发挥重要作用的一些地方。事实上,这些变化的痕迹已经在这里,就在我们面前。
人工智能与个性化课程之路
KGIMinerva Schools的创始人本·尼尔森(Ben Nelson)支持互联教育,这种教育利用技术的信息共享能力,采用系统思维方法,认为将体验的各个部分联系在一起非常重要。Minerva 学校的理念和结构是对未来教育的启发。“在未来的教育系统中,在线人工智能和虚拟现实平台将在知识传播中变得非常重要。教育应该教会我们变得更加灵活,并提供变革的工具,”尼尔森在ESADE 商学院组织的关于教育未来的小组讨论中说道。尼尔森表示,这种模式转变“将带来更个性化的学习体验,为每个学生带来更好的用户体验。”
为每个学生定制课程的第一步已经在实地进行了。出于这个目的,有许多公司正在为教育市场开发人工智能驱动的软件。虽然人工智能可以提供初步评估和学习任务,但人类合作也是一个重要因素。教师可以与这些工具协同工作,并可以修改甚至覆盖建议,以更好地适应学生。例如,总部位于纽约的电子学习公司 Knewton 使用人工智能自适应学习技术来识别学生现有知识的差距,并为包括数学、化学、统计和经济学在内的各种学科提供最合适的课程。超过 1400 万学生已经学习了 Knewton 的课程。来自 Cognii 的 EdTech 软件使用由人工智能驱动的虚拟学习助手驱动的对话来辅导学生并实时提供反馈。Cognii 虚拟助手是根据每个学生的需求定制的。来自匹兹堡的专注于数学的 Carnegie Learning 开发了一种智能教学设计,使用人工智能在正确的时间向学生提供正确的主题,实现了完全个性化的学习、测试和反馈周期。这些例子虽然还处于萌芽阶段,但表明了人工智能支持的个性化学习的推进,随着时间的推移,这将改变正规教育的面貌。
优化教育体验,从被动学习到主动学习
然而,就教育交付的变化而言,个性化只是冰山一角。为了深入了解正规教育在未来将如何进一步转变,我们采访了尼尔森,他谈到了 Minerva 学校的学习理念:“如果你想到学院或大学中的传统教育,你会想到它是由真正独立的单元组成的集合体,”尼尔森说。“你在学校里学了 30 门课程。有 30 位不同的教授教授这些课程。那些教授真的不怎么合作。事实上,他们不知道在他们特定的班级里,学生的构成是什么。也许某些学生会选择 XYZ 的课程。其他学生可能已经学过 ABC 课程了。……这种教育的本质在很大程度上是以单位为基础的。”
纳尔逊认为大学的方式——一种以讲座为基础、面向信息传播的方式——是一种迫切需要创新的方式。“学生进来后,教授会在大部分时间里代表学生发言。即使教授会回答问题,讲座也能有效地从一个教授传给一个学生。尼尔森说:“大多数学生在课堂上都是被动地坐着。“这两种模式有两个问题。从课程设计的角度来看,这个世界并不是在基于学科知识的离散部分中运转的。”
“在大多数情况下,世界并不被划分为与生物学相分离的物理学,也不被划分为与经济学相分离的政治学,等等。对离散信息的学习与世界的运作方式没有太大关系。顺便说一下,这也与人们的思维方式无关。”
尼尔森说:“当我们想到某个聪明的人,或者能够思考如何将实际知识恰当地应用于特定情况的人时,我们会想到某个人在一种情况下吸取了教训,并将其应用于另一种情况。”。“当你提供的教育是分散的包时,大脑很难理解这一点。第二,当你坐在一个被动接收信息的环境中时,大脑中的信息保留量微乎其微。一项又一项的研究表明,一个典型的基于测试和讲座的课程,在学期结束后的六个月内,学生已经忘记了他们在期末考试中所知道的 90%,这基本上意味着它是无效的。[在密涅瓦,]我们改变了这两个方面。”
Nelson 描述了 Minerva 的课程架构方法,该方法由他们的技术平台提供支持和交付。“首先,我们创建了一个课程和交付机制,确保您的教育不是以一门课程为基础,而是从课程的角度来看。我们这样做的方式是,我们将几十种不同的元素,学习目标,我们称之为思维习惯或基本概念。思维习惯是随着练习而自动形成的东西。基础概念是可以生成的东西,一旦你学会了,你就可以用许多不同的方式来构建。然后这些学习目标被引入到一门特定背景下的课程中。然后它们会出现在同一门课的不同情境中,然后它们会在新的情境中再次出现在整个课程中,直到你学会了可概括的学习目标。[这]意味着你已经从概念上学会了一些东西,以及在多种情况下实际应用它们的方法,这意味着当你遇到原始情况、原始情况时,你将能够知道在那些情况下该怎么做。”
尼尔森说:“我们已经部署了部分技术,但在不久的将来我们将继续开发和研究脚手架课程的概念——引入一个特定的学习目标,然后在四年内跟踪 30 名不同的教授如何应用和掌握该学习目标。”“这听起来不像是如此激进的改进,但它从根本上改变了教育的本质。”
“顺便说一下,这只能通过技术来实现,”尼尔森说。“如果没有技术,您就无法在课堂环境中跟踪单个学生的进步并修改他们的个性化智力发展。你需要有数据。你需要有一些数据,教授可以用这些数据做出反应并做一些事情。没有技术,这是不可能的。收集数据是不可能的。不可能传播出去。不可能以教授可以使用的形式实时呈现给他们。”
虽然互联技术是这种方法的促成因素,但同样重要的是实施更好的学习方法的知识和意愿。“我们确保我们 100%的班级都非常活跃,”Nelson 说。“完全主动是什么意思?这意味着我们的教授不允许每次讲话超过四分钟。他们的教案是以这样一种方式组织的,即教授的工作实际上是促进学生对他们所学知识的新颖应用……并且实际上利用课堂时间来促进学生的智力发展。我们这样做是因为我们能够这样做,因为我们已经建立了一个全新的学习环境。”主动学习课程结束两年后,学生能记住 70%的信息,相比之下,基于讲座和测试的课程只有 10%的记忆率。“密涅瓦课程非常吸引人,”尼尔森说。“它们非常密集。它们是综合的,从某种意义上说,你把不同的领域和领域结合在一起,它们是有效的。
Minerva 的教育环境和课程完全通过视频直播在线进行。“所有的学生都住在一起,但教授们却遍布世界各地。我们聘请教授作为我们的全职员工,但我们不会让地理限制他们,这是拥有一个能够让教授和学生密切互动的平台的另一个好处。这考虑到了两件事。它让我们的教授在教授他们的学科方面成为世界上最好的,也让学生能够改变他们的位置。这就是为什么在 Minerva,学生毕业时生活在七个不同的国家,因为他们不必带着教员一起走。你在世界的任何地方都可以接触到这里的教师。它让我们的学生有机会接受非常深入的正规教育,并有能力在现实世界的多种背景下应用这些知识。”
从主动学习到增强现实
虚拟和增强现实是新兴技术,具有令人兴奋的教育应用——这与纳尔逊和其他人支持的主动学习思想非常吻合。斯蒂芬·安德森(Stephen Anderson)是设计教育的领导者,也是 Capital One 的实践发展主管,他认为增强现实等新兴技术是创造持续学习和正反馈循环环境的下一步。
Figure 03: VIrtual reality has the potential to immerse us in new learning environments and help us cultivate our sense of curiosity. [Photo: by Scott Web on Unsplash ]
“我们有这种循序渐进的方法,我们让同龄的孩子在同一个年级学习,希望他们学习同样的内容。它是非常工业化或组织化的。我们将对所有学员一视同仁。让他们通过,他们将在这个年龄带着这些知识毕业,哦,顺便说一下,他们必须在今年涵盖这些材料。我明白为什么我们会采用这种模式,因为这种模式易于扩展,”Anderson 说。“但我们知道这没用,对吗?这不是教人的最好方法。教人的最好方法并不新鲜。它至少在 80 年代末、90 年代的玛利亚·蒙台梭利就已经存在了,在那里它更多的是关于学习者的。更多的是培养对世界的好奇心,以及学习和自学的兴趣。你可以在世界各地的蒙特梭利项目中看到这一点……他们的分支或各种各样的东西,比如华德福学校,在那里它几乎处于另一个极端——那里没有对全面和涵盖所有概念的关注。更重要的是亲自动手,积极参与,鼓励或基于项目,基于调查,所有这些事情。”
安德森给了我们一个积极的学习例子,展示了增强现实如何在各种各样的环境中帮助我们以动手的方式学习——甚至是在日常任务中,比如在家里做饭。“…随着相机和投影仪的价格下降,想象一下,如果我们家里的每个灯泡都可以投影到一个表面上,并且还可以看到互动。所以,现在几乎所有的表面都变成了互动的。所以,你可以[在厨房]在你的砧板前切东西,然后[从学习系统]得到反馈,比如这块肉应该薄一点或厚一点。……你会看到反馈循环、互动性和趣味性这些永恒的理念,”安德森说。
纳尔逊也看到了将会出现的现实和未来趋势,但还没有出现,因为他谈到了新兴技术和 Minerva:“我相信未来的一些真正机会将是增强现实将有效地取代对笔记本电脑类型界面的需求。我可以想象增强现实,你在一个地方有一个教室的学生和一个教授,或者你在世界上 30 个不同的地方有 30 个学生和一个教授通过数据叠加进行身临其境的真实生活体验。我认为当你有机会让教育消除界限和约束时,你会突然对教育的本质有非常不同的想法。这使得人类能够提出比大多数大学目前所做的更先进的解决方案。”
Creative Next 是一个播客,探索人工智能驱动的自动化对创意工作者,如作家、研究人员、艺术家、设计师、工程师和企业家的生活的影响。本文附 第一季第七集——人类如何学习 和 第一季第九集——高等教育创新 。
人类对机器。在零售中意味着什么?
原文:https://towardsdatascience.com/humans-vs-machines-what-does-it-mean-in-retail-7970824fe25?source=collection_archive---------20-----------------------
上个月,我参加了一场关于“零售业技术的未来以及技术能否取代人类”的辩论随后,我整理了一些内部零售的想法(这里也发表了)。
在过去的十年里,技术的进步已经破坏了人类体验的大部分方面。随着技术日新月异的发展,全球零售业的创新和实验都在加速,这也就不足为奇了。根据 Gartner 的数据,2019 年,全球零售技术支出将增长 3.6%,达到 2036 亿美元,在技术支出方面超过大多数其他行业。
我们看到的新兴技术的发展通常是为了满足提高效率、提升客户服务或接触新的未被满足的受众的需求。
随着客户支持的即时、24 小时需求,语音和聊天助手已经迅速取代了大多数传统的在线帮助平台和传统服务。顾客不再需要在决定下一次购买前等待信息。丝芙兰、路易威登、H&M 和许多其他品牌都在使用智能界面来改善客户体验;到 2023 年,零售聊天机器人预计将带动 1120 亿美元的零售销售额。
物联网的使用率正在上升;实体零售商正在通过访问来自 RFID 标签、相机、传感器、跟踪器和设备的新型数据来丰富商店体验。当顾客在网上查看某一特定产品的价格以进行比较时,商店中捕获的移动数据可以通知零售商,表明他们对商店定价、销售或环境不满意。沃尔玛已经推出了 IRL(智能零售实验室)概念,它可以实时跟踪库存,这意味着顾客不会在没有他们想要的产品的情况下离开商店。
随着网上购物和退货成为常态,机器人已经成为“履行”一词的同义词。自 2013 年以来,亚马逊一直在使用机器人来帮助他们的履行中心,但不要认为这些机器人是用来完全取代员工的。在机器人的帮助下,他们纽约配送中心的 2700 多名仓库团队现在不再需要执行耗时的任务,例如从一个过道走到另一个过道,在不同部门寻找商品来完成一个订单。然而,除了亚马逊的机器人/人类标签团队,新英格兰的机器人公司 Symbotic LLC 也制造了自动仓库机器人,比员工更快、更有效地完成订单——劳动力成本降低了 80%,同时在小 25 %- 40%的空间内完成相同数量的订单。
所有正在进行技术进步的零售商都有一个共同点,那就是他们正在以闪电般的速度前进。上述品牌和直接面向消费者的宠儿,如 Glossier、Allbirds、Casper 和 Away,正在通过以运营和创新的方式投资技术来巩固竞争优势,使顾客购物更容易、更有趣。
随着零售技术的进步,问题来了,它总是符合购物者的最大利益吗?或者它在人际交往中造成了脱节,特别是在顾客和零售商之间?
最近的争议围绕着使用面部识别来确定客户的情绪、性别和年龄是否可能侵犯隐私的辩论。美国的沃尔玛和沃尔格林正在测试面部识别,试图个性化商品展示并改善客户服务。但是相关的问题出现了,比如面部照片存储在哪里,谁可以访问它们?难道实体员工不能比电脑更快更有效地理解和服务不开心的顾客吗?
未来两年,零售商将投资于日益增长的智能界面趋势。然而,最先进的技术限制了对话式聊天、语音和高级增强和虚拟现实的“人性化”水平。"
两个原因;
- 首先,推动智能聊天和语音界面的对话式人工智能并没有真正理解自然人类语言。与 Alexa、Siri 和 Google Assistant 的对话是基于命令和事务性的,导致对话支离破碎、互不关联,响应和解决时间缓慢。
- ****其次,今天的智能界面无法识别语调、肢体语言和俚语。在交谈中,同一个句子有成千上万种说法,声音上的屈折可以完全改变一个短语的意思。我们大多数人认为这是一种共同的语言,并随着时间的推移而发展。对我们来说,这种理解水平是自然的,但只是在人类之间。人类和机器之间还没有。
实现完全的人类语言理解和视觉识别并不容易。在一篇题为人工智能最先进方法的问题的文章中, Pat Inc 的联合创始人兼首席执行官贝丝·凯里写道,
“为了理解一段对话,人类不需要听到每一个可以想到的单词和短语组合(这是无限的)。我们只需要知道大约 3000 个基本日常对话所需的单词。”
Pat Inc 通过将当代语言学集成到人工智能中,解决了对话式人工智能的固有挑战,消除了用最新最大的数据不断训练算法的需要。
如果我们要从零售技术的现状中前进,弥合人类和机器之间的差距需要零售商:
1.了解客户行为何时自然与新创新相吻合。
零售商需要分析顾客在购物体验的哪个阶段需要人际互动,什么时候不需要。随着产品信息在网上变得更加容易获得,一些顾客对他们的购买变得更加了解,并且带着他们的信用卡到达购买阶段。这是专注于速度和效率的创新最有益的时候。当客户仍处于品牌认知阶段或产品比较阶段时,人的因素可以更有效地创造价值,并将个人联系保持在品牌客户服务模式的最前沿。
2.对新兴技术采用直观的以人为本的方法。
智能界面和其他应用类型为我们创造了一个以更自然、更直观的方式与设备互动的未来。如今的平台正在聚合越来越多的用户信息。在未来,他们还将开始收集环境和情境的相关数据。这不仅会减少对刷卡、语音或信息的依赖,还能让平台适应我们的情绪、精神状态和未言明的偏好。期待零售商了解比你想象的更多的顾客——我们的习惯、惯例、品味、经历——将个性化带到微观层面。
随着智能界面成为人类交互的一种有价值的替代方式,人类和机器之间的界限变得模糊了。为了成功整合,新型零售技术必须是直观的(不仅仅是高效的)、有价值的、微妙的,并且总是有助于改善客户体验。
推特: @emsharley
图片来源: https://unsplash.com/photos/0E_vhMVqL9g
机器人有没有实现意识?
原文:https://towardsdatascience.com/hybrid-humans-and-conscious-robots-2a00bca1f509?source=collection_archive---------19-----------------------
人工智能、意识和强化学习交汇处的思考
Creative Commons Zero — CC0 https://www.maxpixel.net/Self-reflection-Thinking-Monkey-Reflection-Mirror-4788334
你的意识处于什么水平?凝视着昏迷的亲人的眼睛,我们许多人都为病人是否意识到收到的爱抚或低声祈祷而苦恼。我们将越来越多地找到这些问题的答案,这在很大程度上要归功于对强化学习、人工智能以及它们如何与意识相关的理解不断增长。
Tristan Bekinschtein 及其同事发表在《自然神经科学》上的一项开创性研究表明,一些植物人状态的患者仍然保留了一些基本的强化学习能力(Tristan A Bekinschtein,2009)。这些患者接受了输送到他们眼睛的气流,并配有一些预测刺激,如铃声——一种众所周知的基本强化学习能力测试。尽管无法用任何自我意识的方式表达或回应,这些患者仍然表现出预测空气喷射的能力。这些患者虽然与其他植物人几乎没有区别,但在某种程度上仍然是有意识的,这被证明是对哪些患者后来会恢复我们所认为的完全意识的高度预测。这有助于区分哪些病人应该继续维持生命,哪些应该被仁慈地允许离开人世。它也有助于区分意识的类别。
这些研究支持了一个多层次的意识理论,类似于诺贝尔奖获得者生物学家和神经学家杰拉尔德·埃德尔曼提出的理论。根据埃德尔曼的说法,意识存在于一个至少有两个部分的光谱上——主要意识和次要意识(埃德尔曼,2003)。初级意识是一种意识,包括感知、情感,以及至关重要的以促进预期决策的方式连接基本刺激的能力。这就是所谓的强化学习。在强化学习中,一些过去的经验被用来随着时间的推移改进决策以优化期望的结果。这种初级意识可以延伸到生命之树的根部。狗、鸟甚至许多两栖动物都表现出基本的强化学习能力。这意味着初级意识的核心是强化学习系统,这个系统允许我们区分积极和消极的刺激,从而从中学习,并根据这些过去的经验指导决策。这是否也需要人工智能,如机器人和具有强化学习能力的计算机,如 AlphaZero,应被视为具有初级意识,这是一个有待讨论的问题。随着机器人和人工智能扩大它们的强化学习工具箱,这可能是未来几十年一个激烈竞争的话题。
但这不是关于意识的最终结论。根据埃德尔曼的说法,与初级意识不同的是次级意识,也就是我们意识到的意识。这种元认知是我们通常与人类意识联系在一起的类型,因为它也预示着创造关于我们自己的高度详细的叙述的能力,我们是不同于我们周围环境的代理人。它还可能对应于一种不同类型的学习系统,一种涉及结构化逻辑和显式推理的系统。这种显式推理包括以抽象形式制作世界模型。为了像我们通常认为的那样有意识,我们创造了一个世界模型,把我们自己作为其中一个独特的组成部分,与提供我们意识的积极和消极刺激流分开。越来越多的证据表明,我们在“有意识的人类”中发现的这种类型的陈述性学习对应于某种基于模型的强化学习,与只表现出初级意识的动物的无模型强化学习形成对比(Samuel J. Gershman,2017)。在决策方面,这种基于模型的强化学习与经济学家丹尼尔·卡内曼在双过程理论中概述的“系统 2 思维”相似。系统 2 思维是深思熟虑的、努力的和基于逻辑的,与无模型强化学习的快速直觉决策特征相反。虽然我们对基于模型的强化学习算法在人脑中的确切数学形状知之甚少,更重要的是,它们如何与无模型的同类实时交互,这是目前认知科学中最热门的研究领域之一。因此,我们应该为即将到来的对人类意识的解释做好准备,这些解释深深植根于数学之中。
无生命的意识
定义第二意识的问题本身就是一个棘手的问题。近年来,我们已经能够获得这个古老之谜的一些线索。答案可能藏在神经科学家所谓的“心理理论”中。人类的大脑似乎不是单一的,而是由不同的“进化算法”驱动的许多相互竞争的需求和欲望的融合。在许多模块或算法中,有一个似乎负责创建一种思维理论——一种推测另一个人在想什么或感觉什么的能力。事实上,正如最近的一项研究表明的那样,为了更好地“感知”他人的感受,我们会无意识地模仿他人的面部表情。
通过反射性地采取与另一个人相同的表情,我们获得了关于他们精神状态的有用见解。这甚至可能是一些老夫妇变得彼此相似的原因——通过模仿对方的面部表情,他们脸上的皱纹逐渐汇聚成相似的图案。帮助和促进这一过程的是镜像神经元,当我们执行一个动作时,神经元的反应与我们看到别人执行一个动作时一样。这就好像当我们观察他人的行为时,大脑会尝试他们的行为。通过这样的机制,我们形成了关于另一个人的意图和动机的理论。为什么这样的心理理论可能很重要?对于像我们这样高度社会化的动物来说,知道另一个人在想什么对生存大有裨益。这个人是希望我们倒霉吗,或者,他们是友好的和潜在的盟友吗?
也许更有趣的是,我们似乎有一套关于我们自己的心理理论,这是我们大脑的一部分,试图理解并创造一个关于我们自己行为的故事。这是对第二意识的主要解释之一,也就是说,一种针对其拥有者的心理理论。这种自我参照的心理理论对我们所做的事情所产生的信念往往是完全虚假的,或者至少是不真诚的。我们已经很熟悉这个过程,只是名字不同,“否认”,或者虚构。有趣的是,否认似乎更像是常规而不是例外,因为我们或多或少地用错误的解释系统地解释我们的行为。一些神经科学家将意识比作律师,不断为我们的行为辩护,并为我们所做的事情编造可信但非常虚假的理由。
这种与律师的比较暗示了为什么我们可能首先需要这样一个令人讨厌的算法,也就是说,在一个高度社会化的环境中证明我们的行为是正当的。其他缺乏自我参照心理理论的动物似乎既不感到羞耻也不否认。虽然还没有一个明确的答案,为什么人类会进化出这样一种奇怪的进化算法,但我们有猜测的空间。其中一种推测源于所谓的“红皇后效应”从进化的角度来看,红皇后效应是当两种生物在生存斗争中发生一系列级联适应时产生的。一旦一种生物在激烈的战斗中占据上风,另一种生物就会进化出一种机制来对抗它,这一过程不断重复,因此两种生物都必须尽可能快地进化,以保持它们之间的平衡。因此,这里提到了《爱丽丝梦游仙境》中的红皇后,她向年轻的女主角解释说:“在这里,你需要竭尽全力才能保持在同一个地方。”
红皇后效应怎么可能产生第二意识?如果我们假设心理理论的发展是为了阅读他人的思想,更好地预测他们是否会帮助或阻碍我们,那么通过挫败这种适应并找到欺骗它的方法,我们将获得生存优势。如果一个有意识的心理理论可以为我正在做的事情构造一个托辞,即使它们明显是不真实的,这可以给我在一个高度社会化的环境中的生存优势。在警察和强盗的游戏中,如果你开发了一个真理探测器,那么我需要开发一个更好的谎言编造器,周而复始。
在我们目前的关头,假新闻可能会刺激人类内部类似的红皇后种族,将我们引向混合意识形态,将我们的生物湿件与机器智能融合。想想看,在计算机的帮助下,使用 Photoshop 等工具创造虚假故事的能力使得区分真实和虚构变得更加困难。编造虚假故事从未如此容易,因此越来越需要反制武器来揭开这些谎言。这种对策也可能采取算法的形式,尽管它存在于计算机中。例如,有一些人工智能算法被训练来区分真实图像和经过 Photoshop 修饰的图像。个人越来越有必要采用这种人工智能来区分假新闻和真实报道。以这种方式,我们可能会发现自己处于进化的压力之下,将这类人工智能融入到我们的生物湿件中,依靠它们来让我们比说谎者领先一步。很难说这种来回的措施会在哪里结束,但是将“混合”形式的意识添加到我们目前的生物学中并不是不可能的。埃隆马斯克(Elon Musk)支持的名为 Neuralink 的公司已经在创建神经鞋带方面取得了进展,这可能会在人类中实现这种形式的混合意识,将机器和生物融合为一个实体。
另一个可能导致混合意识形式的竞争压力来自市场。目前,进入顶级学术机构的竞争相当激烈,因此学生和求职者将利用像 Adderall 和 Ritalin 这样的药物来获得必要的成绩和考试分数,以获得这些令人垂涎的职位。如果一个申请人的意识受到神经花边或 CRISPR 基因改造的帮助,表现出获得最好的学校和工作的倾向,那么这种适应很可能会在整个人口中迅速传播。红皇后效应可能会导致奇怪和不可预见的后果,明智的做法是仔细考虑我们目前承受的竞争压力,以免它们将我们拖入我们后来发现明显是反乌托邦的角落。
最近的一些实验涉及可能被认为是“无生命的意识”,包括拥有心灵理论的合成药剂。心智理论是用来区分人工智能和人类智能的一种方法。为了理解这种差异,有一个叫做最后通牒游戏的简单实验。在最后通牒游戏中,一个玩家得到 100 美元(或其他价值单位),他必须决定如何与另一个玩家平分这笔钱。第二个玩家,可以拒绝这个提议,在这种情况下两个玩家都一无所获,也可以接受这个提议,在这种情况下,他们根据玩家一指定的分配得到钱。如果一号玩家是完全理性的,缺乏思维理论,它的出价将远低于人类,因为它会假设另一个玩家会接受任何大于零的出价,因为有所得总比没有所得好。逻辑大概是这样的。由于缺乏思维理论,一号玩家没有考虑到,如果只给一美元,另一个玩家可能会觉得受到了轻视,因此会断然拒绝这个提议。虽然一个纯粹理性的代理人接受美元会比拒绝美元更好,但人类会经常拒绝如此低的报价。这一直是经济学家和心理学家的眼中钉,因为效用理论的整个教条是基于这样一个前提,即人们最大化效用,并会像玩游戏的计算机那样接受如此低的报价。有趣的是,自闭症是一种经常被描述为“精神盲”的疾病,因为患者通常表现出明显的无法通过观察面部特征来阅读他人的思想,患者往往比“正常”人表现得更像纯粹的理性代理人。在这样的游戏中——自闭症患者会期望别人接受低球报价,自己接受也没问题。来自自闭症的证据支持了这样一种观点,即当人类在许多战略环境中运作时,他们正在使用一种思维理论,这影响了他们的决策。
人类拒绝低价提议的一个原因是,我们习惯于玩重复囚徒困境游戏,也就是说,这种游戏会重复多次,并拥有一个解决方案,当两个玩家合作时,他们的情况会比他们都自私时更好。如果作为最后通牒游戏中的玩家,我假设我们生活在一个重复囚徒困境的世界中,那么我就有动机惩罚你自私的出价,这样下次我们玩的时候你就不会再出低价了。一个人如何着手创造一种算法,利用思维理论来猜测他人的策略,从而获得与人类更相似的结果?
在这方面取得进展的团体之一是 OpenAI 基金会。OpenAI 团队与牛津大学的研究人员合作,创建了一种强化学习算法,当在最后通牒游戏中更新自己的策略时,它拥有关于另一个玩家的思维理论(Jakob N. Foerster,2018)。他们配方中的秘密成分是在强化学习等式中增加一项,捕捉第二个玩家策略的变化,也就是说,其他玩家的想法。虽然这背后的数学可能有点复杂,但原理很简单——如果我知道你也在学习,那么当我制定自己的策略时,我需要考虑你策略的变化。他们的方法似乎奏效了——在一个重复的囚徒困境游戏中,该算法学习了更像人类玩家的互惠策略,而不是纯粹自私的代理人的策略。这很可能标志着创造人工第二意识的重要一步。假设意识是一种转向自身的心理理论,那么建立一种转向外部的心理理论是合乎逻辑的第一步,就像 OpenAI 实验中那样。这显然是更复杂的心理理论的前兆。例如,可以说狗拥有简单的思维理论。
你可以观察狗扫描你的特征和手势,试图猜测你是否要重新装满它们的食物碗或带它们去散步。据我所知,还没有这样的尝试来修改强化学习,以包括一个关于自己行为的心理理论,这可能不会太远。虽然最初这种新生的机器意识形式很难被认为与我们自己的相似,但也许随着时间的推移,它们会发展出丰富多彩的心理细微差别,如个人叙事、羞耻、否认和投射,这些都是我们自己的意识思维的特征。值得注意的是,即使这种情况发生了,也并不意味着合成意识会对人类构成威胁。他们的目标状态可能仍然是预先确定的,他们的行动仅限于虚拟世界中的虚拟任务。
当我们检查人工智能和强化学习的含义时,组织和优先考虑它的影响是很重要的。虽然有意识机器人的崛起可能会在遥远的未来对人类构成生存威胁,但可能会有更近的挑战,例如,工作自动化程度的提高导致财富差距不断扩大。只有克服了这些近期的障碍,我们才有可能遭遇如此多科幻小说和电影中所预示的耸人听闻的恐怖。
混合智能
原文:https://towardsdatascience.com/hybrid-intelligence-1495c0e1fde8?source=collection_archive---------25-----------------------
作为创造性伙伴的机器
人类是自然的创造者;我们享受制造东西的自由。然而,在自动化的背景下,机器挑战了人类在制造中的角色。它浪费了人类的独特技能,使人们与现实世界的材料脱节。为了解决这个问题,研究人员提出了混合工作流程,从研究人类如何工作开始,并在制造过程中结合人类和机器的专长。它可以让我们保持工艺,并为数字工艺输入更多的人性。
混合制造在制作过程中重视人类的肌肉记忆和触觉技能。如果我们把混合的想法延伸到无形的过程,比如创造力,会怎么样?机器除了能做助手之外,还能充当创意伙伴吗?我们能创造出“混合智能”吗?这种智能结合了机器和人类的智能,创造出它们各自无法完成的工作。
混合制造是人类和机器之间的合作,在将人类重新引入循环的同时,提高了制造效率或作品中的人性纹理。如果我们把混合的想法延伸到无形的过程,比如创造力,会怎么样?机器除了能做助手之外,还能充当创意伙伴吗?我们能创造出“混合智能”吗?这种智能结合了机器和人类的智能,创造出它们各自无法完成的工作。
混合智能可以优化工作效率,减少不确定性,就像人工智能在自动驾驶汽车中与人类司机合作一样。为了让人类和人工智能系统和谐地一起工作,研究人员把重点放在如何消除人类感知和机器判断之间的差异上。如果机器在路上感知物体的方式与人类不同,可能会导致可怕的交通事故。虽然某些任务需要较低的不确定性,但艺术等其他任务实际上需要风险。风险有时会推动创新过程。如今,强大的计算成为艺术家的创新工具,机器学习算法带来的不稳定结果使我们能够创造出超出我们想象的东西。
机器以非常不同的方式感知和解释世界。汤姆·怀特制造了一个感知引擎来展示机器如何看待世界。此外,他还邀请人们重新解读这幅图像,发现每个人看到的东西都不一样。他的项目带来了机会,我们可以使用机器学习算法来打开人类感知的缺口。
当科学家主导人工智能研究时,几位艺术家在艺术背景下展开了关于人工智能的对话,并对这一技术提出了独特的观点。他们想利用机器的能力,并利用它来拓展创造力的边界。安妮·里德勒通过人工智能生成了数吨人工郁金香,并手工对结果进行分类,这展示了机器学习背后的人类方面。在斯科特·伊顿的作品“数字与形式”中,他将流行的算法与传统的绘画和雕塑实践相结合。这项工作呈现了斯科特的手部技能和人工智能工具之间相互作用的结果。实现人类以前从未实现的任务的计算能力,例如在短时间内生成大量不同的图像。这种新型的人与人工智能的合作启发艺术家们在视觉呈现中设想其他可能性。
音乐中的艾
除了视觉艺术,艺术家们也在寻求打破音乐领域可预测模式的方法。奥拉富尔·阿尔纳斯和霍利·赫恩登都“培养”了他们自己的定制人工智能助手,并将它们“教授”到个人音乐助手中,这可以激励他们并与他们合作。一旦奥拉维尔弹奏了一个和弦,这个和弦就会进入软件,软件对它进行处理,然后将它作为有节奏的纹理发送给其他钢琴。Arnalds 不是控制每个音符,而是可以按一个键,获得大量意想不到的音符,形成定制的 AI 助手。
为了探索未知的领域,霍莉创造了“产卵”Spawn 是一个人工智能系统,可以创作令人惊讶和独创性的音乐,这可能与 Holly 的风格非常不同。在 Spawn 的帮助下,Holly 可以防止制作重复她以前作品的音乐。不仅 Spawn 从 Holly 身上学到了东西,Holly 也从 Spawn 身上学到了智慧。AI 助手背后的意义不是创造一个做音乐的算法;它创造了一种艺术家可以演奏的乐器,并拓宽了音乐的可能性。
艾在写作
随着自然语言进程的发展,艾也可以用在诗歌和电影剧本中。人工智能生成的文本是罗斯·古德温工作的核心部分。他用基于文本的数据训练机器,然后用摄像机捕捉图像作为输入。一旦设备接收到照片,它就可以将图像转换成文本。根据古德温的说法,人工智能生成的文本距离我们的正常对话很远,但它确实提供了有趣的结果。比如“一股水从街道的一边流下来。画家笑了,然后说,我喜欢那个,我不想看。”然而,在短片 Sunspring 中,那些可笑的剧本在演员的演绎下变得严肃起来。该剧体现了人性与机器算法的协作。
行为艺术中的艾
在sou Wen Chang 的绘画操作系列中,现场表演呈现了艺术家和机器人手臂之间的合作。在表演过程中,机器人感知艺术家的绘画手势,解释信息,并创建自己的绘画。看起来机器人手臂是模仿艺术家的风格,但它实际上是通过自己的绘画来回应艺术家。艺术家和机器人手臂之间的互动鼓励人类改变或适应他们的行为以适应系统。意外的机器反馈可能会触发艺术家跳出舒适区的思维,开启新的想法。另一方面,机器也可以根据人类正在做的事情来调整自己的行为,但这是一种不同于人类所做的学习。
有些人可能会害怕艺术制作机器,因为艺术制作是我们历史上最人性化的行为。一旦我们声称机器可以创造艺术,那人类还能剩下什么?在这种情况下,我们可以考虑一些观点。首先,认知和意识是有区别的。在我们给机器输入大量数据后,它们可能会有认知能力,它们可以理解和解释信息,但这就意味着它们有意识吗?这两者之间的光谱是我们仍在争论的。
第二,艺术的本质是表达感情或作陈述,艺术家可以解释作品和自己。在人机合作艺术的语境中,只有人才能解释生成的结果。而且,伙伴关系也是人类解释的一部分;真正的伙伴可以拒绝选择,可以对概念做出贡献,而不仅仅是结果。在现实中,机器可以提供鼓舞人心的想法,并带领艺术家获得令人惊讶的结果,然而,最终,艺术家仍然拥有最终的决定权,人类的解释完成了故事。
最后,“如今,算法非常强大,但它们的好坏取决于它们接受的训练,”安娜·里德勒说。在她看来,机器使她能够做她通常不能做的事情,她也使机器能够做它不知道如何做的事情。
随着人类历史的发展,我们总是想做出新的东西,这种冲动推动人类走向进步。自工业革命以来,我们不断制造先进的工具来塑造我们的工作方式,在许多情况下提高了效率,但有时也限制了思维。另一方面,人工智能赋予我们计算能力,理解我们收集的数据,并为我们提供新的视角。Jennifer Sukis 曾经说过:“艺术是我们探索我们是谁以及我们想成为谁的方式,因为人工智能改变了日常生活的画面。”借助人工智能带来的新视角,我们可以通过混合智能不断探索技术和人类的未知领域。
海得拉巴房价。
原文:https://towardsdatascience.com/hyderabad-housing-prices-526217d2c6d7?source=collection_archive---------17-----------------------
Photo by Shiv Prasad on Unsplash
每天我都从办公室的朋友和同事那里听到很多关于他们在海得拉巴很难找到出租公寓的故事,他们大多要么是公寓不对单身汉开放,要么是某个地区的租金太高,要么是公寓的面积对于给定的价格来说太小。我想了解上述问题的真实情况,所以我决定使用我的 python 技能从一个领先的房屋租赁网站获取并分析关于可供出租的房屋的数据。
我把当前的任务分成了 3 部分。
- 使用网络抓取收集数据。
- 数据预处理。
- 数据分析。
数据收集。
Photo by Luca Bravo on Unsplash
当没有实时数据可供分析时,网络搜集经常被用作收集数据的工具。首先,我们将收集海得拉巴领先的房地产网站之一的所有搜索结果。我们要收集数据的网站是 magicbrics.com.The 网站,它很棒,所有的数据都排列得很整齐,但是,你可以自由选择你喜欢的网站,你可以很容易地修改代码。
在我们真正开始收集数据之前,我们需要决定需要从网站上收集哪些功能。在当前示例中,我们将收集,
- 没有卧室。
- 没有浴室。
- 家具类型。
- 田纳西人更喜欢。
- 房子的面积(平方英尺)。
- 房子的位置。
- 价格还是租金。
首先,让我们导入所有的依赖项,
import re # Regular Expressions Library
import pandas as pd # Data Preprocessing Library
from bs4 import BeautifulSoup # Used to get Data from HTML files.
from urllib.request import urlopen,Request #Used to get a given url
一些网站会自动阻止任何类型的抓取,这就是为什么我们会定义一个头来传递 get 命令,这基本上会使我们对网站的查询看起来像是来自实际的浏览器。
headers = ({'User-Agent':
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'})
首先,我们需要查询网站,并以 HTML 代码的形式(页面)获取数据。
request = Request(url, headers=headers)
response = urlopen(request)
html = response.read()
我们的 Html 的输出看起来像下面这样,这是一个原始的 Html 代码,需要传递给 Beautiful Soup 方法来获得结构化的 Html 代码。
**Html Output(**html) **:**b'\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<meta charset="UTF-8">\r\n\t\t<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> \r\n\t\t<meta name="viewport" content="width=device-width, initial-scale=1">\r\n\t\t<meta name="google-signin-client_id" content="614944930403-u1s9tmqebd273mutmdhmsngnhvivgd6a.apps.googleusercontent.com">\r\n\t\t\r\n\t\t<link rel="dns-prefetch preconnect" href="//cdn.staticmb.com" />\r\n\t\t<link rel="dns-prefetch preconnect" href="//img.staticmb.com" />\r\n\t\t<link rel="dns-prefet'*html_soup = BeautifulSoup(html , 'html.parser')***Beautiful Soup Output (**html_soup) **:**<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="614944930403-u1s9tmqebd273mutmdhmsngnhvivgd6a.apps.googleusercontent.com" name="google-signin-client_id"/>
<link href="//cdn.staticmb.com" rel="dns-prefetch preconnect"/>
<link href="//img.staticmb.com" rel="dns-prefetch preconnect"/>
<link href="//b.scorecardresearch.com" rel="dns-prefetch preconnect"/>
<link href="//www.googleadservices.com" rel="dns-prefetch preconnect"/>
<link href="//stats.g.doubleclick.net" rel="dns-prefetch preconnect"/>
<link href="//ase.clmbtech.com" rel="dns-prefetch preconnect"/>
<link href="//ingestor.magicbricks.com" rel="dns-prefetch preconnect"/>
<link href="//maps.googleapis.com" rel="dns-prefetch preconnect"/>
<link href="//www.googletagmanager.com" rel="dns-prefetch preconnect"/>
<title>Properties in Hyderabad</title>
获得代码后,我们需要浏览 Html 代码,找出在整个源代码中我们可以找到所需功能的确切位置。我们可以在我们的浏览器中检查这一点,我们还可以在 Html 文档中找到某个特定对象的位置,例如属性的价格。右键单击它并选择检查。
整个网页被分成多个块,每个块将被放置在带有类名的 div 容器中(当前示例是flex relative clear fix m-SRP-card _ _ container),每个这样的块将具有关于单个房屋的所有所需功能。我们可以扫描整个页面,将所有这样的块收集到一个列表中,并对它们进行迭代,以找到所有房屋的特征集。
page_container = html_soup.find_all('div', class_ = 'flex relative clearfix m-srp-card__container' )
在收集了作为容器列表的网页数据之后,我们可以看到属于每个字段的数据被存储在每个 page_containers 的 < span > 标签中。我们可以编写一个脚本来收集每个 page_container 的所有 span 标签,提取数据并在整个 page_containers 列表中循环,如下所示。
*span_containers = page_container[3].find_all('span')
span_containers[1].text*Output : **' \n \t \t\t\t \t \t\t\t16,000 \t \t\t'***span_containers[1].text.replace('\n','')*Output :**' \t \t\t\t \t \t\t\t16,000 \t \t\t'**
除了 locality 之外,所有字段的逻辑都是一样的,Locality 需要从字符串中提取,很难得到。数据会是这样的。我要在 和2000 sqft之间的字符串
*' 3 BHK Apartment for rent *in* ***SMR Vinay Harmony County, Appa junction*** *2000 sqft * '*
因此,我使用正则表达式来查找以' 中的' '开始,以 '数字(\d)' 结束的模式,但是这种模式在数据中并不统一,有些样本还以空格结尾,或者结尾没有任何内容。因此,我使用了 3 种模式来获取位置数据。
*Locality_1 = Locality_0.text.replace('**\n**',' ')
Locality_2 = re.search(r'in(.+?)\d', Locality_1)
**if** Locality_2 **is** **None** :
Locality_2 = re.search(r'in(.+?),',Locality_1)
**if** Locality_2 **is** **None** :
Locality_2 = re.search(r'in(.+?) ',Locality_1)***Output:***YMCA Circle, Narayanguda
Amarnath Residency
Nanakram Guda
My Home Avatar, Narsingi, Outer Ring Road
Nizampet
Kachiguda, NH
Miyapur, NH
Dukes Galaxy, Banjara Hills, NH
Machabollaram, Medchal Road*
以类似的方式,每个 span_containers 将具有不同的特性,可以如上所示提取并保存在. csv 文件中以供进一步处理。最终输出。csv 文件如下所示。
House Prices Data.
上面的完整工作代码以及 data.csv 文件可以在我的 Github 资源库saitejamahadev/Hyderabad _ housing _ data 中找到。
数据预处理。
Photo by Mika Baumeister on Unsplash
数据预处理是任何数据科学项目中的重要步骤。最初,当我们提取数据时,我们确保数据是干净的,没有任何随机值,但如果我们仔细分析数据集的特征,我们会发现数据在抓取过程中提取了一些垃圾或缺失值。
unique Bedroom values
Unique Bathroom values
unique Furnishing type and Tennants preferred
通过调用 pandas unique()方法,我们可以看到嵌入到特性集中的不正确的或无用的值,如上所示。我只列出了几个特征,但是几乎所有数据集的特征都有一种或另一种需要解决的不规则性。
现在,一些特征(其中垃圾被附加到所需的特征)我们可以提取正确的样本特征值,但是对于其他特征(其中数据被错误地收集,即家具类型),它可以具有值“家具”或“半家具”或“未家具”,但是不具有如上所示的其他值。
数据的这个问题可以被认为是丢失值的问题,根据业务情况,在数据预处理中有许多经典的方法来处理它,但在当前的用例中,我想用特征的模式/平均值的替换来进行,假设在给定的区域,人们不太可能为单身汉租房,而家庭是首选,反之亦然。
如果我们观察样本,我们可以看到 '\t' 通常是嵌入的,移除它并用单个空格替换产生的一个或多个空格将清除我们的大多数样本,这是所有样本共有的。我们可以使用下面几行代码来实现这个结果。
*data.Bathrooms[price] = re.sub(r'\t','', data.Bathrooms[price])
data.Bathrooms[price] = re.sub(r'\s+','',data.Bathrooms[price])*
sample code how different features are handled in preprocessing.
最后,清理后的数据可以保存在一个新文件中,如下所示。
House prices data after preprocessing.
注意:我们在House _ data _ preprocessing**方法中使用的数据预处理技术是特定于收集的数据类型和数据中存在的不规则性的。当处理不同的网页时,代码需要稍微修改。**
数据分析。
清理数据后,我们使用 python 数据可视化工具(如 Matplotlib)来尝试和可视化数据,并回答以下问题
- 出租公寓的常见装修风格是什么?
- 房东一般喜欢什么类型的 Tennants?
- 一般有多少间卧室可供出租?
- 与 Tennants 相比,家具类型的分布如何?
如下。下面的代码片段将回答上述问题。
Data Visualization.
- 出租公寓的常见装修风格是什么?
Furnishing Type
- 房东一般喜欢什么类型的 Tennants?
Tennants Preferred
- 一般有多少间卧室可供出租?
Bedrooms Distribution
- 与 Tennants 相比,家具类型的分布如何?
Furnishing Type vs Tenants Preferred
FurnishingType vs Tennants Preferred
****注:以上数据预处理和分析步骤的完整工作代码请访问saitejamahadev/Hyderabad _ House _ Prices _ Analysis。
hyper-Ledger Fabric 2.0 版本发布:新机遇正在形成
原文:https://towardsdatascience.com/hyper-ledger-fabric-version-2-0-launch-new-opportunities-in-the-making-39cb56a0d309?source=collection_archive---------19-----------------------
让世界了解区块链技术的最新进展。
Image credits Acodez
区块链技术具有变革性和进化性,但在某些时候,甚至它也未能留下所需的影响。许多专家普遍认为,区块链将颠覆许多行业,它将彻底改变当今许多商业运作的方式。
商业是更具挑战性的领域之一,以其原始的概念形式接受区块链技术。尤其是当一个人不得不依靠区块链技术来签订合同的时候。在分散式网络中,双方共同签署合同会使敏感信息公开。这些小错误足以让你的生意回到石器时代。在这一点上,需要一种未来的智能解决方案,它可以在混合环境中独立工作。
超级分类帐结构为企业提供了即使在许可网络中编写可访问性限制的机会。随着非许可区块链在分散分类帐技术上的引入而发展的概念使得超分类帐结构如此受欢迎。商业兄弟会可以轻松地签署合同并交换敏感信息,而不必担心信息公开。但即使有所有的优势,仍有灰色区域出现在 Hyper-Ledger Fabric 的早期版本中,随着更新版本的发布,这些缺点已被仔细迎合。在本博客中,我们将讨论 Hyper-Ledger Fabric 2.0 版的新增功能,以及它如何解决以前版本的缺点。
Hyper-Ledger Fabric 2.0 版有什么新功能?
发布新的结构链码生命周期
在 Fabric 2.0 Alpha 的新模型中,将引入一种新的分散治理,这将发布一种在对等网络上安装链码的新流程。有了这样的功能,现在多个组织将通过在链码上设置不同的参数来在同一页面上达成一致。链码背书政策就是即将推出的一项智能功能。在背书策略中,命令流将以下列方式发生;
这是一份政策样本
{“identities”: [{ “role”: { “name”: “member”, “mspId”: “Org1MSP” }},{ “role”: { “name”: “member”, “mspId”: “Org2MSP” }}],“policy”: {“1-of”: [{ “signed-by”: **0** }, { “signed-by”: **1** }]}}
样本策略 2
{“identities”: [{ “role”: { “name”: “member”, “mspId”: “Org1MSP” }},{ “role”: { “name”: “member”, “mspId”: “Org2MSP” }},{ “role”: { “name”: “admin”, “mspId”: “Org1MSP” }}],“policy”: {“2-of”: [{ “signed-by”: **2**},{ “1-of”: [{ “signed-by”: **0** }, { “signed-by”: **1** }]}]}}
在这两个样本策略中,身份定义了区块链网络的角色和 MSP。
类似地,策略由包含 nOf 格式策略的对象定义,其也是用于背书的特定“签名集策略”,其中“n”是背书的指定签名所需的最小签名数。
在示例策略 1 中,有来自 Org1MSP 和 Org2MSP 的两个身份。在这里,签名集策略说
“policy”: {“1-of”: [{ “signed-by”: **0** }, { “signed-by”: **1** }]}
定义认可策略时,它应该由 0(使用角色成员)签名,以标识身份数组(Identity Org1MSP)中的 1,或者由 1(使用角色成员)签名的数组,以标识身份数组(Identity Org2MSP)中的身份 2。在功能中,区块链的策略只有在 Org1MSP 或 Org2MSP 的成员对交易进行签名时才会成功。以同样的方式,样本策略 2 将规定任何违反该策略的交易。任何变更只有在(I)签字后才能在区块链被接受。订单管理(ii)。Org1MSP 或 Org2MSP 任何组织的成员。
这就是在分散的环境中,背书政策为您的阅读工作的方式。现在,回到 Fabric Chaincode 将从现在开始改变用例的方式;
1.帮助多个组织同意链码的任何特定参数
在之前的版本中,明确提到了 Fabric 的 1.x 版本,规定只有一个组织能够设置链码所需的参数,以确保网络正常运行。在这种设置中,只有一个组织有能力定义链码的参数。
但新的 Hyper-Ledger Fabric 版本 2.0 完全不同,为各方提供了更大的灵活性。这样,它将支持区块链的混合和本地模式。因此,集中式和分散式两种环境都可以得到支持。因此,无论链码需要一个单一成员还是多个成员来签署网络上的任何政策,在它变得能够移动合同和操作之前,通过引入这一新特征,一切都将成为可能。
2.链码的升级过程比以前的版本更安全
在过去版本的超级分类帐结构中,只有一个组织或也称为网络中的第一个组织有权升级链码上的交易。因此,网络中的任何新组织都别无选择,只能下载甚至是损坏的链码。这样,新成员总是要承受交易带来的风险。
但是最新版本的超级分类帐结构带来了新的修正,这将允许在链码上建立共识。只有在集团达成共识后,新的链码才会实施,以帮助区块链平台按照业务要求运行。
3.通过新的更新简化了认可政策
网络中的链不需要为了背书策略的改变而不时地重新打包或重新安装链码。有新的默认策略可供用户从大多数成员那里寻求共识。
4.更好地检查链码包装
读取可读 tar 文件中的链码非常简单。结果,网络中的节点可以容易地检查链码包,并在安装过程中与网络中的其他节点协调。
在 Hyper-Ledger Fabric 版本 2.0 中引入 fab token
在最新版本的 Hyper Ledger Fabric 2.0 中,用户有机会使用他们的资产作为令牌。确切地说,FabToken 将是这个新版本中用于启动事务的令牌。它使用未用完的交易输出或 UTXO 模型,以便使用由 Hyper-Ledger 结构网络提供的身份和会员基础设施来发行、转移和兑换代币。使用 FabToken,用户可以很容易地创建新的加密硬币。同时,从一个用户向另一个用户转移硬币将被完全简化。用户可以执行整个交易列表,并使用 FabToken 启动硬币的完全兑换。
FabToken 将以与 ERC 20 标准相同的方式简化加密货币的创建。也就是说,Hyper-Ledger Fabric 2.0 将见证与以太坊相同的令牌创建环境。这种类型的优势将首次在 Hyper-Ledger 网络上提供给开发者。在你冒险在你的 SDK 中使用 FabToken 之前,请记住某些特定的东西。
安装 Hyper-Ledger Fabric SDK 后,使用 docker 映像进行快速验证。您需要访问 FabToken 目录来制作您选择的加密货币。使用以下命令:CD $ HOME/fabric-samples/fab token。
当您计划使用 FabToken 制作任何加密货币时,将会出现对 Fabric 网络的需求。因为 FabTokens 要求光纤网络启动并运行。使用示例节点应用程序来测试 FabToken。使用命令 fabtoken.js 和一个名为“startFabric.sh”的 shell 脚本。它将位于您当前所在的目录中。一旦你给出这些代码,它将启动基本网络和 JavaScript 目录。您需要安装“npm 安装”使用命令。/startFabric.sh 立即启动 FabToken。
要使用 FabToken 创建硬币,在安装 SDK 后应该会出现以下屏幕,
— — fabtoken.js —开始设置客户端网络对象创建客户端对象来表示通道
创建了客户端对象来代表对等方
创建了客户端对象来表示订购者
成功设置客户端侧令牌参数:goldcoinToken 参数:1000
开始颁发令牌操作
用 args goldcoin 开始令牌发放,1000 结束发放令牌操作,返回{ status: 'SUCCESS ',info:' ' }—-fab token . js—end
当您发出此命令时,它将启动令牌创建,并帮助您根据预期创建令牌。
结论
创建超级分类帐结构的目的是为企业提供更好的功能。高级功能的引入将有助于 Hyper-Ledger 结构在不同业务中的使用,以便在不久的将来简化和增强其潜力。
超轻推和大数据
原文:https://towardsdatascience.com/hyper-nudges-and-big-data-d15767b2ee0b?source=collection_archive---------19-----------------------
大数据和行为经济学可能会创造超级推动——这些将如何被使用,我们应该担心吗?
Photo by Franki Chamaki on Unsplash
行为推动可以被认为是地毯式轰炸。例如,如果我们想增加养老金缴款,我们可以将高缴款产品作为默认选项。对所有人来说。
像这样的推动已经相当有效,但是它们并不完美。如果你很难把钱存到一边,多存一点可能会很好,因为你很难,轻推可能就是解决办法。但是如果你是一个以上的储蓄者呢?这种轻推是否意味着你最终会对金钱失去兴趣?或者,节食怎么样。更小的盘子可以减少人们吃的食物量,如果你正在节食,这可能很好,但如果你已经对自己的体重感到不安或有饮食障碍,这就不太好了。
自从推动的想法流行起来,行为经济学家不得不采取地毯式轰炸的方法。他们必须是功利主义者,实施他们认为——平均来说——会改善结果的轻推。
但是如果有其他方法呢?如果我们可以用精确打击来代替地毯式轰炸呢?(这里的语言有点煽动性,但正如那些认为轰炸不好但接受轰炸存在的人更喜欢精确打击一样,那些不喜欢微推但接受微推存在的人也会想要更高的精确度——这是一个有目的的类比)通过结合微推和大数据,超微推可能正是。
进入超空间
轻推和大数据之间的关系是一件漫长而平静的事情。虽然大数据拥有前所未有的规模和技术专长来观察我们的世界,但行为洞察一直是利用这些洞察的工具。哈佛大学法律学者和 Nudge 的合著者 Cass Sunstein 想象这种关系变得越来越紧密,以至于大数据和算法可以为每个人选择最佳的 Nudge 和选项。
现在,我们已经成功了一半。新兴研究利用初始抽样和模拟建模,已经能够有效地将心理测试中的各种行为特征与不同的推动策略关联起来,以最佳方式推动每个人。例如,有些人非常在意其他人,更有可能受到社会规范的推动,而不是默认选项。
随着大数据的广度不断扩大,我们的轻推算法的输入数量将大幅增长,因此我们使用的轻推的精确度也将增长。然而,从技术上讲,有两个主要挑战:
- 我们可以个性化我们轻推的方式——现在我们需要个性化我们轻推的内容
- 我们如何将大数据信息转化为有意义的行为指标?
后一点将是未来几年行为研究的一个巨大领域。在个人金融等领域,面对面接触和文档填写可能很少,特定网页的浏览时间和交易历史等关联信息将成为与行为现象相关的重要数据点。
这种策略或许也能帮助我们设计个性化默认设置等推动措施,但这一挑战将更加依赖于具体环境,因此需要更多数据。例如,健康跟踪器显示的睡眠时间等无关紧要的数据可能会促使系统不仅以不同的方式微移,而且以不同的方式呈现整个 UI。
向前两步…
技术挑战不是这种超轻推将面临的唯一问题。首先,是数据问题。也就是说,收集如此多的数据,并以奇怪和可能令人不安的方式使用数据,将引发巨大的道德问题,并需要一个强大的监管框架。明显的算法对白人男性(主要是他们创造的)的偏见只是大数据摩擦我们社会结构的一个例子。
其次,我们应该考虑轻推自己。轻推的地毯式轰炸方式并没有引起行为经济学家的愤怒。相反,许多人表达了对透明度和胁迫性的担忧。就这些合理的担忧而言,地毯式轰炸的方法实际上是一种优势——每个人都受到同等的压力。点到为止改变这种计算。
我们可能会选择允许人们选择退出超推,就像我们让人们去个性化他们的社交媒体时间表一样。理论上,这解决了围绕数据安全和道德的大部分问题。但是,如果超推动是如此之好,选择退出成为一个非常昂贵的想法呢?如果没有超刺激,我们使用的服务变得明显更差会怎样?换句话说,如果我们别无选择呢?
这是一个经典的经济技术问题,我们已经看到它在社交媒体上上演。不管可信与否,脸书在被灌输大量信息时是一个更好的服务。个性化、有针对性的广告可能会令人不快,但如果你不得不看广告,为什么不看一个你可能会觉得有用的广告呢?
超轻推提供了许多优势,如果使用得当,将会简化我们生活中繁琐的部分,改善我们的决策。但是挑战依然存在,无论是技术上的、伦理上的还是社会上的,再多的推动也不会让它们消失。
—
斯图尔特·米尔斯是曼彻斯特城市大学行为经济学和元认知推动理论的博士研究员
超参数调整和模型选择,就像电影明星一样
原文:https://towardsdatascience.com/hyper-parameter-tuning-and-model-selection-like-a-movie-star-a884b8ee8d68?source=collection_archive---------13-----------------------
Photo by Markus Spiske on Unsplash
像你一样编码、分析、选择和调整真的知道你在做什么。
“针对随机森林分类器优化的超参数调整”是那些在电影场景中听起来很轻松的短语之一,在电影场景中,黑客正在积极地输入以“获得对大型机的访问”,就像在关于数据科学的媒体文章中一样。然而,事实是,这样的短语是将数学和计算概念结合在一个领域的不幸结果,更糟糕的是,是一个名字。虽然本文中的概念将受益于对使用 scikit-learn 的基本 python 建模以及其中一些模型如何工作的扎实理解,但我将尝试自下而上地解释一切,以便所有级别的读者都可以享受和学习这些概念;你也可以听起来(和编码)像好莱坞黑客。
在本文中,我将尝试解决以下问题:
- 什么是超参数,它与参数有何不同?
- 什么时候应该使用超参数?
- 超参数实际上是做什么的?
- 如何调整超参数?
- 什么是网格搜索?
- 什么是流水线?
- 如何定义单个超参数?
跳到最后,查看所有这些主题的摘要。
什么是超参数?
超参数这个术语是由于机器学习在编程和大数据中日益流行而产生的。许多作为数据科学家或程序员开始其旅程的人都知道参数这个词被定义为一个值,该值被传递到一个函数中,使得该函数对这些值执行操作和/或被这些值通知。然而,在机器学习和建模中,参数不是由程序员输入的,而是由机器学习模型开发的。这是由于机器学习和传统编程的根本区别;在传统编程中,规则和数据由程序员输入以便输出结果,而在机器学习中,输入数据和结果以便输出规则(在这种情况下通常称为参数)。这个 Google I/O 2019 演讲在最初几分钟非常简洁地解决了这个翻转。
如果模型本身生成参数,那么将我们(程序员、数据科学家等)输入的内容也称为模型参数会非常混乱。这就是超参数这个术语的诞生。超参数被输入到生成其自身参数的任何机器学习模型中,以便影响所述生成的参数的值,希望使模型更加精确。在本文的稍后部分,我将展示具体的例子,以及定义什么是单个的超参数。
这些单独的超参数是如何定义的,它们有什么影响?
让我们快速浏览一下 scikit-learn 关于逻辑回归的文档,以便更好地理解这个问题的真正含义。
**LogisticRegression**(*penalty=’l2’*, *dual=False*, *tol=0.0001*, *C=1.0*, *fit_intercept=True*, *intercept_scaling=1*, *class_weight=None*, *random_state=None*, *solver=’warn’*, *max_iter=100*, *multi_class=’warn’*, *verbose=0*, *warm_start=False*, *n_jobs=None*, *l1_ratio=None*)
正如我们在这里看到的,LogisticRegression()
接受了 15 个不同的值,我们现在知道这些值被称为超参数。然而,这 15 个值中的每一个都定义了一个默认值,这意味着在没有指定任何超参数的情况下创建一个LogisticRegression()
对象是非常可能的,甚至是常见的。这是 scikit-learn 中所有模型的情况。因此,我将只花时间来定义和解释四种常见建模方法的一些更相关和通常修改的超参数。
逻辑回归:
- 惩罚:用于指定对非贡献变量系数的惩罚方式。
- Lasso (L1)执行要素选择,因为它将不太重要的要素的系数缩小到零。
- 里奇(L2)所有的变量都包括在模型中,尽管有些被缩小了。计算强度低于 lasso。
- 两个罚值都限制解算器的选择,如这里的所示。
- C :是正则项的逆(1/λ)。它告诉模型有多大的参数被惩罚,较小的值导致较大的惩罚;必须是正浮点数。
- 常用值:[0.001,0.1 …10..100]
- class_weight :允许你更强调一个类。例如,如果类别 1 和类别 2 之间的分布严重不平衡,则模型可以适当地处理这两种分布。
- 默认值是所有权重= 1。类别权重可以在字典中指定。
- “平衡”将创建与类别频率成反比的类别权重,给予较小类别的个别事件更多权重。
线性回归:
- 拟合截距:指定是否计算模型截距或设置为零。
- 如果为假,回归线的截距将为 0。
- 如果为真,模型将计算截距。
- 规格化:指定是否使用 L2 范数规格化模型的数据。
SVM
- C :是正则项的逆(1/λ)。它告诉模型有多大的参数被惩罚,较小的值导致较大的惩罚;必须是正浮点数。
- 较高的 C 将导致模型的错误分类较少,但更有可能导致过度拟合。
- 良好的值范围:[0.001,0.01,10,100,1000…]
- class_weight :将 class i 的参数设置为 class_weight[i] *C。
- 这可以让你更加重视一门课。例如,如果类别 1 和类别 2 之间的分布严重不平衡,则模型可以适当地处理这两种分布。
- 默认值是所有权重= 1。类别权重可以在字典中指定。
- “平衡”将创建与类别频率成反比的类别权重,给予较小类别的个别事件更多权重。
k-最近邻
- n_neighbors :确定计算最近邻算法时使用的邻居数量。
- 良好的值范围:[2,4,8,16]
- p :计算闵可夫斯基度规时的功率度规,这是一个数学上相当复杂的话题。在评估模型时,简单地尝试这里的 1 和 2 通常就足够了。
- 使用值 1 计算曼哈顿距离
- 使用值 2 计算欧几里德距离(默认)
随机森林
- n_estimators :设置要在林中使用的决策树的数量。
- 默认值为 100
- 良好的值范围:[100,120,300,500,800,1200]
- max_depth :设置树的最大深度。
- 如果未设置,则没有上限。这棵树会一直生长,直到所有的叶子都变得纯净。
- 限制深度有利于修剪树,以防止对噪声数据的过度拟合。
- 良好的值范围:[5,8,15,25,30,无]
- min_samples_split :在内部节点进行分割(微分)之前所需的最小样本数
- 默认值为 2
- 良好的值范围:[1,2,5,10,15,100]
- min_samples_leaf :创建叶(决策)节点所需的最小样本数。
- 默认值为 1。这意味着,仅当每条路径至少有 1 个样本时,才允许在任何深度的分割点。
- 良好的值范围:[1,2,5,10]
- max_features :设置考虑最佳节点分割的特征数量
- 默认为“自动”,这意味着特征数量的平方根用于树中的每次分割。
- “无”表示所有特征都用于每次分割。
- 随机森林中的每个决策树通常使用随机的特征子集进行分割。
- 良好的值范围:[log2,sqrt,auto,None]
如何调整超参数,它们实际上有什么作用?
为了弄清楚这两个问题,让我们用经典的加州大学欧文分校虹膜数据集来解决一个例子。
首先,我们将加载数据集并导入我们将使用的一些包:
# import packages
import numpy as np
from sklearn import linear_model, datasets
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline# Loading dataset
iris = datasets.load_iris()
features = iris.data
target = iris.target
现在,让我们创建一个快速模型,不使用额外的超参数,并获得分数供以后评估。
logistic.fit(features, target)
print(logistic.score(features, target))
输出:
0.96
现在,让我们尝试一些超参数调整的方法,看看我们是否可以提高我们的模型的准确性。
什么是网格搜索?
网格搜索是一种方法,通过这种方法,我们为每个超参数创建可能的超参数值集,然后在“网格”中相互测试它们例如,如果我想用值[L1, L2]
和值 C 作为[1,2]
来测试一个逻辑回归,GridSearchCV()
方法会用C=1
测试L1
,然后用C=2
测试L1
,然后用两个值C
测试L2
,创建一个 2x2 的网格和总共四个组合。让我们看一个没有当前数据集的例子。verbose 参数指示函数运行时是否打印信息,cv 参数指的是交叉验证折叠。关于GridSearchCV()
的完整文档可以在这里找到。
# Create range of candidate penalty hyperparameter values
penalty = ['l1', 'l2']# Create range of candidate regularization hyperparameter values C
# Choose 10 values, between 0 and 4
C = np.logspace(0, 4, 10)# Create dictionary hyperparameter candidates
hyperparameters = dict(C=C, penalty=penalty)# Create grid search, and pass in all defined values
gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, verbose=1)
# the verbose parameter above will give output updates as the calculations are complete. # select the best model and create a fit
best_model = gridsearch.fit(features, target)
既然我们的模型是基于更大的输入空间创建的,我们可以希望看到改进。让我们检查一下:
print('Best Penalty:', best_model.best_estimator_.get_params(['penalty'])
print('Best C:', best_model.best_estimator_.get_params()['C'])
print("The mean accuracy of the model is:",best_model.score(features, target))
输出:
Best Penalty: l1
Best C: 7.742636826811269
The mean accuracy of the model is: 0.98
使用相同的模型并增加超参数的小变化,精度提高了 0.02。尝试用不同的超参数集进行试验,并将它们添加到超参数字典中,然后再次运行GridSearchCV()
。请注意添加许多超参数如何快速增加计算时间。
什么是流水线?
如果我们想要用多个超参数测试多个算法,以便找到可能的最佳模型,该怎么办?流水线允许我们以一种代码高效的方式做到这一点。让我们看一个 Iris 数据集的例子,看看我们是否可以改进我们的逻辑回归模型。
# Create a pipeline
pipe = Pipeline([("classifier", RandomForestClassifier())])# Create dictionary with candidate learning algorithms and their hyperparameters
search_space = [
{"classifier": [LogisticRegression()],
"classifier__penalty": ['l2','l1'],
"classifier__C": np.logspace(0, 4, 10)
},
{"classifier": [LogisticRegression()],
"classifier__penalty": ['l2'],
"classifier__C": np.logspace(0, 4, 10),
"classifier__solver":['newton-cg','saga','sag','liblinear'] ##This solvers don't allow L1 penalty
},
{"classifier": [RandomForestClassifier()],
"classifier__n_estimators": [10, 100, 1000],
"classifier__max_depth":[5,8,15,25,30,None],
"classifier__min_samples_leaf":[1,2,5,10,15,100],
"classifier__max_leaf_nodes": [2, 5,10]}]# create a gridsearch of the pipeline, the fit the best model
gridsearch = GridSearchCV(pipe, search_space, cv=5, verbose=0,n_jobs=-1) # Fit grid search
best_model = gridsearch.fit(features, target)
注意这个函数运行需要多长时间。在另一篇文章中,我将讨论如何减少运行时间和挑选有效的超参数,以及如何将一个RandomizedSearchCV()
和一个GridSearchCV
结合起来。运行该方法后,让我们检查结果。
print(best_model.best_estimator_)
print("The mean accuracy of the model is:",best_model.score(features, target))
输出:
Pipeline(memory=None, steps=[('classifier', LogisticRegression(C=7.742636826811269, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, l1_ratio=None, max_iter=100, multi_class='warn', n_jobs=None, penalty='l1', random_state=None, solver='warn', tol=0.0001, verbose=0, warm_start=False))], verbose=False) The mean accuracy of the model is: 0.98
根据我们的管道搜索,具有指定超参数的LogisticRegression()
比具有任何给定超参数的RandomForestClassifier()
执行得更好。有意思!
好了,我们已经使用了一个管道方法来实现这一切,但是它实际上做什么,为什么我们要传入一个RandomForestClassifier()
?
pipeline 方法允许我们传入预处理方法以及我们想要用来创建数据模型的算法。在这个简单的例子中,我们跳过了预处理步骤,但是我们仍然输入了一个模型。我们输入的算法只是用于实例化管道对象的算法,但是将被我们创建的search_space
变量的内容所替代,该变量稍后将被传递到我们的GridSearchCV()
中。这里可以找到一个简化的帖子,只关注管道。
我们的原始基线模型和用我们的超参数调整生成的模型之间的精度差异显示了超参数调整的效果。通过指导我们的机器学习模型的创建,我们可以提高它们的性能,并创建更好、更可靠的模型。
摘要
什么是超参数,它与参数有何不同?
在机器学习模型中使用超参数来更好地指导模型用来生成数据预测的参数的创建。超参数由程序员设置,而参数由模型生成。
什么时候应该使用超参数?
永远!模型通常有内置的默认超参数,可用于大多数目的。然而,在许多情况下,使用超参数调优会挤出模型的额外性能。了解不同超参数的限制和影响有助于限制过度拟合等负面影响,同时提高性能。
超参数实际上是做什么的?
简单地说,它们改变了模型寻找模型参数的方式。个别定义可以在上面的文章中找到。
如何调整超参数?
网格搜索、随机搜索和流水线是常用的方法。这篇文章没有提到随机搜索,但是你可以在这里阅读更多的。
什么是网格搜索?
网格搜索是对传递给GridSearchCV()
函数的所有超参数的元素测试。网格搜索在大搜索空间上的计算开销很大,它的测试也很详尽。
什么是流水线?
流水线允许搜索多个算法,每个算法都有许多超参数。这是一种非常高效的测试许多模型的方法,以便选择最好的一个。此外,它还可以处理再加工方法,允许进一步控制过程。
最后,下面是一些函数,它们可以通过传入参数来执行一些不同类型的超参数调整。包含本文中使用的所有代码的 Google Colab 笔记本也可以在这里找到。使用这些函数,您可以在一行代码中高效地执行超参数调整!
# # # Hyperparameter tuning and model selection
import numpy as np
from sklearn import linear_model
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressordef perform_gridsearch_log(features, labels,
log_params = {'penalty': ['l1', 'l2'], 'C': np.logspace(0, 4, 10)},
cv=5, verbose = 1):
import numpy as np
from sklearn import linear_model, datasets
from sklearn.model_selection import GridSearchCV
global best_model
logistic = linear_model.LogisticRegression()
penalty = log_params['penalty']
C = log_params['C']
hyperparameters = dict(C=C, penalty=penalty)gridsearch = GridSearchCV(logistic, hyperparameters, cv=cv, verbose=verbose) # Fit grid search
best_model = gridsearch.fit(features, target)
print(best_model.best_estimator_)
print("The mean accuracy of the model is:",best_model.score(features, labels))def rand_forest_rand_grid(features, labels, n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)],
max_features = ['auto', 'sqrt'],
max_depth = [int(x) for x in np.linspace(10, 110, num = 11)],
min_samples_split = [2, 5, 10],
min_samples_leaf = [1, 2, 4], bootstrap = [True, False]):
max_depth.append(None)
global best_model
random_grid = {'n_estimators': n_estimators,
'max_features': max_features,
'max_depth': max_depth,
'min_samples_split': min_samples_split,
'min_samples_leaf': min_samples_leaf,
'bootstrap': bootstrap}
rf = RandomForestRegressor()
rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 3, verbose=1, random_state=42, n_jobs = -1)
best_model = rf_random.fit(features, labels)
print(best_model.best_estimator_)
print("The mean accuracy of the model is:",best_model.score(features, labels))def rand_forest_grid_search(features, labels, n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)],
max_features = ['auto', 'sqrt'],
max_depth = [int(x) for x in np.linspace(10, 110, num = 11)],
min_samples_split = [2, 5, 10],
min_samples_leaf = [1, 2, 4], bootstrap = [True, False]):
param_grid = {'n_estimators': n_estimators,
'max_features': max_features,
'max_depth': max_depth,
'min_samples_split': min_samples_split,
'min_samples_leaf': min_samples_leaf,
'bootstrap': bootstrap}
global best_model
rf = RandomForestRegressor()
grid_search = GridSearchCV(estimator = rf, param_grid = param_grid,
cv = 3, n_jobs = -1, verbose = 1)best_model = grid_search.fit(train_features, train_labels)
print(best_model.best_estimator_)
print("The mean accuracy of the model is:",best_model.score(features, labels))def execute_pipeline(features,labels, search_space=[
{"classifier": [LogisticRegression()],
"classifier__penalty": ['l2','l1'],
"classifier__C": np.logspace(0, 4, 10)
},
{"classifier": [LogisticRegression()],
"classifier__penalty": ['l2'],
"classifier__C": np.logspace(0, 4, 10),
"classifier__solver":['newton-cg','saga','sag','liblinear'] ##This solvers don't allow L1 penalty
},
{"classifier": [RandomForestClassifier()],
"classifier__n_estimators": [10, 100, 1000],
"classifier__max_depth":[5,8,15,25,30,None],
"classifier__min_samples_leaf":[1,2,5,10,15,100],
"classifier__max_leaf_nodes": [2, 5,10]}], cv=5, verbose=0, n_jobs=-1):global best_model
pipe = Pipeline([("classifier", RandomForestClassifier())])
gridsearch = GridSearchCV(pipe, search_space, cv=cv, verbose=verbose,n_jobs=n_jobs) # Fit grid search
best_model = gridsearch.fit(features, labels)
print(best_model.best_estimator_)
print("The mean accuracy of the model is:",best_model.score(features, labels))
感谢阅读!
深度学习中的超参数调整技术
原文:https://towardsdatascience.com/hyper-parameter-tuning-techniques-in-deep-learning-4dad592c63c8?source=collection_archive---------2-----------------------
设置超参数的过程需要专业知识和大量的反复试验。没有简单易行的方法来设置超参数,特别是学习率、批量、动量和重量衰减。
Source
深度学习模型充满了超参数,在如此高维的空间中找到这些参数的最佳配置不是一个微不足道的挑战。
在讨论寻找最优超参数的方法之前,让我们先了解这些超参数:学习率、批量、动量、权重衰减。这些超参数充当旋钮,可以在模型训练期间调整。为了让我们的模型提供最佳结果,我们需要找到这些超参数的最佳值。
梯度下降
梯度下降是一种常用于训练机器学习算法的优化技术。训练 ML 算法的主要目的是调整权重*w*
以最小化损失或成本。这个成本是我们的模型做得有多好的度量,我们用*J(w)*
来表示这个成本。因此,通过最小化成本函数,我们可以找到产生最佳模型性能的最佳参数[1]。
回归问题的典型损失函数图是碗形的,如下所示。
在梯度下降算法中,我们从随机模型参数开始,计算每次学习迭代的误差,不断更新模型参数,以更接近产生最小成本的值。详情请参考我的帖子。梯度下降算法将梯度(斜率)乘以一个称为学习速率(或步长)的标量,以确定下一个点。此参数说明了在渐变方向上移动权重的距离。
如果我们将dw
和db
表示为梯度,以更新梯度下降算法的参数W
和b
,如下所示:
如果学习率小,那么训练更可靠,但是它将花费大量时间,因为向损失函数的最小值的步骤很小。
如果学习率很高,那么训练可能不收敛,甚至发散。重量变化可能如此之大,以至于优化器超过了最小值,使损失更严重。因此,我们的目标是找到能够快速找到最小损失的最优学习速率。
Source
对于更一般的模型,您可以将梯度下降想象为一个球在山谷中滚动。我们希望它坐落在大山的最深处,然而,很容易看出事情可能会出错。
Source
根据球开始滚动的位置,它可能会停在谷底。但不是在最低的一个。这被称为局部最小值。我们初始化模型权重的方式可能导致它停留在局部最小值。为了避免这种情况,我们用随机分布的值初始化权重向量。
我们可以用二维表示损失面,如下所示:
红点是全局最小值,我们想要到达那个点。使用梯度下降,更新将如下所示:
随着梯度下降的每一次迭代,我们随着上下振荡向局部最优移动。如果我们使用更大的学习率,那么垂直振荡将具有更高的幅度。所以,这种垂直振荡减缓了我们的梯度下降,并阻止我们使用大得多的学习率。此外,学习率太小会使梯度下降更慢。
我们希望在垂直方向上进行较慢的学习,在水平方向上进行较快的学习,这将帮助我们更快地达到全局最小值。
为了帮助我们实现这一点,我们使用梯度下降与动量【2】。
我们从梯度下降开始:
在动量项中,我们采用 dw 和 db 的指数加权平均值,而不是对每个历元独立使用 dw 和 db。
其中,β是另一个称为动量的超参数,范围从 0 到 1。它设置以前值的平均值和当前值之间的权重,以计算新的加权平均值。
在计算指数加权平均值后,我们将更新我们的参数。
通过使用 dw 和 db 的指数加权平均值,我们倾向于使垂直方向上的振荡趋于零。然而,在水平方向上,所有的导数都指向水平方向的右边,所以水平方向上的平均值仍然很大。它允许我们的算法采取更直接的路径走向局部最优,并抑制垂直振荡。由于这个原因,该算法将通过几次迭代而在局部最优处结束。
要直观地了解这是如何工作的,可以考虑一个球滚下山的例子——vᵈʷ和 Vᵈᵇ为球提供了速度,使它运动得更快。我们不希望我们的球加速太快,以至于错过了全局最小值,因此β作为摩擦力。
梯度下降有三种方式:
批量梯度下降:
- 一次所有示例:在每次迭代中使用所有训练实例来更新模型参数。
- 随着误差梯度的精确估计而缓慢收敛。
随机梯度下降(SGD):
- 一次一个例子:在每次迭代中仅使用单个训练实例更新参数。训练实例通常是随机选择的。
- 在误差梯度的噪声估计下快速收敛。
小批量梯度下降:
- 一次 b 个样本:小批量梯度下降不是使用所有的样本,而是将训练集分成更小的规模,称为批量,用“b”表示。因此,小批量“b”用于在每次迭代中更新模型参数。
小批量梯度下降寻求在随机梯度下降的鲁棒性和批量梯度下降的效率之间找到平衡。
小批量梯度下降是深度学习领域中最常见的梯度下降实现。Mini-batch 的缺点是它为学习算法增加了一个额外的超参数“批量大小”或“b”。
寻找最佳配置的方法:网格搜索和随机搜索
网格搜索
在网格搜索[3]中,我们尝试了每个可能的参数配置。
步骤:
- 在 n 维上定义一个网格,每个网格映射一个超参数。例如 n = (learning_rate,,batch_size)
- 对于每个维度,定义可能值的范围:例如,batch_size = [4,8,16,32],learning_rate =[0.1,0.01,0.0001]
- 搜索所有可能的配置,并等待结果以建立最佳配置:例如 C1 = (0.1,4) - > acc = 92%, C2 = (0.01,4) - > acc = 92.3%,等等
正如我们看到的,维度越多,搜索的时间复杂度就越高。当维度小于或等于 4 时,通常使用这种方法。虽然它保证最终找到最佳配置,但它仍然不是首选。相反,最好使用随机搜索
随机搜索
随机搜索[4]在步骤 1 中进行随机搜索,从配置空间中随机选取一个点。它如何更好地工作的直觉是,我们可以通过随机搜索更广泛地探索超参数空间(特别是对于更重要的变量)。这将帮助我们在更少的迭代中找到最佳配置。例如,请参见下图:
在网格布局中,很容易注意到,即使我们训练了 9 个(n=3)模型,每个变量也只使用了 3 个值。然而,在随机布局中,我们不太可能多次选择相同的变量。最后,使用第二种方法,我们将为每个变量使用 9 个不同的值来训练 9 个模型。关于网格 vs 随机的详细分析,请参考这篇论文。
即使随机搜索比网格搜索执行得更好,这两种方法仍然计算量大且耗时。2018 年,Leslie N. Smith 在其经典的 论文 中,就确定最优超参数的各种方法发表了详细的报告。我们将快速浏览 Smith 建议的方法【5】。该方法基于通过检查训练的测试/验证损失来寻找欠拟合和过拟合的线索,从而找到欠拟合和过拟合之间的平衡,以便努力获得超参数的最优集合。
超参数调整过程是一个走钢丝的过程,目的是在欠适应和过适应之间取得平衡。
欠拟合是指机器学习模型无法减少测试集或训练集的误差。不合适的模型不足以适应数据分布的潜在复杂性。
过度拟合发生在机器学习模型强大到与训练集拟合得太好,泛化误差增大的时候。上图显示了这种欠拟合和过拟合的权衡。
方法
- 通过监控验证/测试损失观察和理解培训期间可用的线索。在培训的早期,通过几个时期的短期运行来调整您的架构和超参数。
- 测试的 欠拟合 或 过拟合 的迹象或训练过程早期的验证损失对于调整超参数是有用的。
Model complexity refers to the capacity of the machine learning model. The figure shows the optimal capacity that falls between underfitting and overfitting.
寻找最佳超参数
学习率
如果学习率(LR)太小,可能会出现过拟合。大的学习率有助于使训练规律化,但是如果学习率太大,训练就会分散。因此,对短期运行进行网格搜索以找到收敛或发散的学习率是可能的,但我们有另一种方法,称为 Leslie N. Smith 的“循环学习率(CLR) ”。
Leslie 的实验表明,在训练期间改变学习速率总体上是有益的,因此建议在一个值范围内循环地改变学习速率,而不是将其设置为固定值。这种学习率政策的本质来自于这样一种观察,即提高学习率可能会产生短期的负面影响,但却能产生长期的有益影响。这一观察引出了让学习率在一个值的范围内变化的想法,而不是采用逐步的、固定的或指数递减的值。也就是说,设置最小和最大边界,学习率在这些边界之间循环变化。
Source
如何估计合理的最小和最大边界值?
LR 范围测试:在让学习率在低 LR 值和高 LR 值之间线性增加的同时,运行你的模型几个时期。每当你面对一个新的架构或数据集时,这个测试都是非常有价值的。对于浅 3 层架构,large 是 0.01,而对于 resnet,large 是 3.0,您可以尝试多个最大值。
From my previous post, using fast.ai library to do a LR test
使用 1 周期 LR 策略,通过 LR 范围测试确定最大学习率,最大学习率的十分之一的最小学习率似乎工作良好[6]。
批量
与学习率超参数(其值不影响计算时间)不同,批量大小必须结合训练的执行时间进行检查。批量大小受硬件内存的限制,而学习速率不受限制。Leslie 建议使用适合硬件内存的批处理大小,并允许使用更大的学习速率。
如果您的服务器有多个 GPU,总批处理大小是 GPU 上的批处理大小乘以 GPU 的数量。如果体系结构很小,或者您的硬件允许非常大的批量,那么您可以比较不同批量的性能。此外,请记住,小批量增加正则化,而大批量增加较少,因此在平衡正则化的适当数量时利用这一点。使用较大的批量通常更好,这样可以使用较大的学习速率。
周期性势头
动量和学习率密切相关。最佳学习速率取决于动量,动量取决于学习速率。由于学习率被认为是最重要的超参数,因此动量也很重要。像学习率一样,在不导致训练不稳定的情况下,将动量设置得尽可能大是很有价值的。
寻找学习率和动量组合的步骤
- 使用循环学习率:最佳训练程序是一个递增的循环学习率和递减的循环动量的组合,前者初始的小学习率允许收敛开始,后者递减的动量允许学习率在训练的早期到中期变大。当学习率增加时,使用递减的循环动量提供了更快的初始收敛,并稳定了训练以允许更大的学习率。
循环动量对于以大动量开始并在学习速率增加时减小动量是有用的,因为它提高了测试精度,并使训练对大学习速率更鲁棒。
下面的图来自我的帖子典型地显示了学习率和动量在一个训练周期(一个时期)中是如何变化的。
left: learning rate one cycle, right:momentum for one cycle
- 使用恒定学习率:如果使用循环学习率,则相反方向的循环动量是有意义的,但是当学习率恒定时,最佳动量是什么?在这里周期性的动量并不比一个好的常量值强。如果使用恒定的学习速率,那么大的恒定动量(即 0.9-0.99)将表现为伪递增的学习速率,并将加速训练。然而,使用过大的动量值会导致较差的训练结果,这在训练的早期是可见的,并且这可以被快速测试。
对于循环学习率或恒定学习率,一个好的程序是测试 0.9 到 0.99 范围内的动量值,并选择一个表现最佳的值。
重量衰减
权重衰减是正则化的一种形式,它在训练中起着重要的作用,因此需要适当地设置它的值[7]。权重衰减被定义为将每个历元的梯度下降中的每个权重乘以因子λ [0 < λ < 1】。
Leslie 的实验表明,重量衰减不同于学习速率或动量,最佳值应在训练过程中保持不变(即周期性重量衰减没有用)。
如果你不知道重量衰减的合理值,测试 1/10,1/10⁴,1/10⁵和 0。较小的数据集和架构似乎需要较大的权重衰减值,而较大的数据集和较深的架构似乎需要较小的值。我们的假设是,复杂数据提供了自己的正则化,其他正则化应该减少。
如果你用一个恒定的学习速率和使用一个学习速率范围进行搜索,最佳权重衰减是不同的。这符合我们的直觉,因为较大的学习率提供了正则化,所以较小的权重衰减值是最佳的。
主要调查结果摘要
学习率(LR):
- 执行学习率范围测试,以确定“大”学习率。
- 使用 1 循环 LR 策略,最大学习率由 LR 范围测试确定,将最小学习率设置为最大学习率的十分之一。
气势:
- 使用动量值 0.99、0.97、0.95 和 0.9 进行短期测试,以获得动量的最佳值。
- 如果使用 1 周期学习率时间表,最好使用一个循环动量(CM ),它从这个最大动量值开始,并随着学习率的增加而减少到 0.8 或 0.85。
批量:
- 使用尽可能大的批处理大小来适应您的内存,然后比较不同批处理大小的性能。
- 小批量增加正规化,而大批量增加较少,所以利用这一点,同时平衡适当数量的正规化。
- 使用较大的批量通常更好,这样可以使用较大的学习速率。
重量衰减:
- 确定适当震级的网格搜索,但通常不要求超过一个有效数字的精度。
- 更复杂的数据集需要更少的正则化,因此测试更小的权重衰减值,例如 104、105、106、0。
- 浅架构需要更多的正则化,因此测试更大的权重衰减值,如 102、103、104。
感谢您的阅读。
参考资料:
[1]https://www.jeremyjordan.me/gradient-descent/
https://engmrk.com/gradient-descent-with-momentum/
[3]https://blog . Floyd hub . com/guide-to-hyperparameters-search-for-deep-learning-models/
[4]http://www . jmlr . org/papers/volume 13/bergstra 12a/bergstra 12a . pdf
https://arxiv.org/pdf/1803.09820.pdf
[6]https://arxiv.org/pdf/1506.01186.pdf
[7]https://papers . nips . cc/paper/563-a-simple-weight-decay-can-improve-generalization . pdf
其他参考文献
https://www . analyticsvidhya . com/blog/2018/11/neural-networks-hyperparameter-tuning-regulatory-deep learning/
利用随机网格搜索的超参数调谐
原文:https://towardsdatascience.com/hyper-parameter-tuning-with-randomised-grid-search-54f865d27926?source=collection_archive---------18-----------------------
为什么随机网格搜索更好,如何使用它?
Jewel Changi Singapore — beautiful isn’t it?
随机网格搜索在为任何机器学习模型寻找接近最优的超参数时非常有用。
经验法则:无论网格大小如何,60 次迭代,95%的时间,可以找到最好的 5%的参数集。
什么是网格搜索?
网格搜索是一种寻找最优参数集的残酷搜索算法。
让我们假设我们正在构建一个二元随机森林分类模型,并将使用 AUC 来评估它。在所有的数据处理和特征工程之后,我们需要调整参数以达到最大的精度。
经过一些初步分析后,我们决定从数值范围中选择参数,例如:
Example: parameter grid
这是一个参数网格,由所有可能的参数组合组成。36 (233*2)组潜在的参数可以从这个网格中提取。
网格搜索将计算每组参数的准确度分数,并选择产生最佳结果的一个。在下面的例子中,网格搜索将输出集合 4,因为它产生最高的 AUC。
Example: AUC score for each parameter set in the grid
为什么网格搜索会失败?
网格搜索保证在网格中找到最佳参数集。然而,随着更多的参数或更多的参数选择添加到网格中,网格的大小呈指数级增长。
使用上面的例子,让我们用 5 个候选参数再调整一个参数“最小杂质减少”,并为所有现有参数添加一个选项。通过稍微扩大搜索区域,网格扩展到 720 (34435)个集合,比原始网格大 20 倍!如果原来的网格搜索需要 20 分钟,这个网格就需要将近 7 个小时才能完成。
因此,当我们调整具有许多参数的复杂模型时,网格搜索在许多情况下不太可行。
随机网格搜索是网格搜索的一个很好的替代品
随机网格搜索不是穷举搜索,而是从网格中随机抽取一组参数来计算每次迭代的精确度分数。可以调整迭代次数,所有迭代中的最佳集合将作为输出。
显然,由于控制了迭代次数,随机网格搜索消耗了更少的计算能力。但是,需要多少次迭代才能找到足够好的参数集呢?
经验法则:无论网格大小如何,60 次迭代,95%的时间,可以找到最好的 5%的参数集。
简单数学证明:
- 让我们将 n 表示为迭代次数。
- 经过 n 次迭代后,从网格中抽取的最佳 p 组参数中没有一组的概率是(1- p)ⁿ
- 因此,在 n 次迭代之后,从网格中抽取至少一组最佳 p %参数的概率是 1-(1- p)ⁿ
- 如果我们想要有 95%置信度的最好的 5%参数集,解上面的方程,1-(1–5%)ⁿ=95%,n ≈ 59
从这个证明中,我们还可以得出结论,推荐的迭代次数与网格大小无关。
随机网格搜索的迭代次数清单
为了方便读者,请参考下表,了解不同置信度和性能阈值的推荐迭代次数
Recommended number of iterations
感谢阅读!
用 Python 解释超几何分布
原文:https://towardsdatascience.com/hypergeometric-distribution-explained-with-python-2c80bc613bf4?source=collection_archive---------14-----------------------
在数学课上的概率问题中,你需要的概率要么是给你的,要么是以一种简单明了的方式计算出来的。
Photo by Francesco Ungaro on Unsplash
但现实中并非如此。你需要根据情况自己计算概率。这就是概率分布可以发挥作用的地方。
今天,我们将通过以下方式探索超几何概率分布:
- 解释它在什么情况下有用。
- 应用此分布所需的信息。
- 使用 Python 从头开始编写一些计算代码。
- 将我们的代码应用到问题中。
我们什么时候使用超几何分布?
超几何分布是一个离散概率分布。当您想要确定在不替换特定样本量的情况下获得一定数量成功的概率时,可以使用该方法。这类似于二项式分布,但是这一次你不会得到一次成功的概率。应用这种分布的一些示例情况是:
- 扑克中一手 5 张牌中拿到 3 张黑桃的概率。
- 在万智牌一副标准的 60 张牌中,一手牌拿到 4 到 5 张非地牌的概率。
- 从特许学校招生抽签中随机抽取的混合性别组中抽出 60%男生参加新生班的概率。
超几何计算需要什么参数(信息)?
为了计算超几何分布的概率质量函数(也称为单个实例),我们需要:
a)我们从中抽取的项目总数(称为 N)。
b)N 中所需项目的总数(称为 A)。
c)我们将从 N 中抽取的次数(称为 N)。
d)在我们的 n 个项目(称为 x)的抽签中所需项目的数量。
根据教程的不同,这些变量使用不同的字母。我使用了我在下面发布的视频中使用的字母,在那里我最初了解到了超几何分布。
从头开始编写超几何 PMF、CDF 和绘图函数。
回想一下概率质量函数(PMF),它允许我们计算单一情况的概率。在我们的例子中,这是上面 x 的具体值。超几何分布 PMF 如下。
PMF for Hypergeometric Distribution
稍后,我们用其他函数为我们的计算导入numpy
。Matplotlib
将在后面创建我们的情节函数。scipy
中的comb
函数是一个内置函数,用于计算我们的 PMF 中的 3 个组合。我们为需要计算的每个组合创建一个变量,并返回 PMF 的计算结果。
累积分布函数(CDF)是计算 x 的一系列值的总概率的函数。这将允许我们用万智牌游戏解决第二个例子。另一个例子是确定在一手五张牌中最多获得 2 张黑桃的概率(也就是 2 张或更少的黑桃)。
要用最多两个黑桃回答黑桃问题,我们需要下面的 CDF:
对于万智牌游戏场景,我们可以使用上面的函数,但是它需要在 4 点开始,在 5 点结束。
PMF sum of a set of x-values.
幸运的是,使用 Python,我们可以创建一个足够灵活的函数来处理这两个问题。
最后,下面是根据您的情况绘制分布图所需的代码。一些代码和样式基于这个 scipy docs 页面的例子。
请注意,由于我们展示了从 0 到 n 的所有可能性,所以我们不需要在这个函数中为 x 创建一个参数。设置N = 52
、A = 13
和n = 5
,查看 5 手牌的超几何分布。然后,您将获得下图:
Hypergeometric Distribution plot of example 1
将我们的代码应用到问题中。
问题 1
现在来利用我们的函数。为了回答第一个问题,我们在hypergeom_pmf
中使用以下参数,因为我们想要一个单独的实例:
N = 52
因为一副牌里有 52 张牌。
因为一副牌中共有 13 张黑桃。
n = 5
既然我们抽了一手 5 开的牌。
x = 3
因为我们想在第一手牌中抽取 3 张黑桃。
计算hypergeom_pmf(52, 13, 5, 3)
我们得到的概率是 0.08154261704681873,大概是 8.1%。拿到那只手的机会不大。
问题 2
对于第二个问题,我将为您提供一些快速的背景信息。万智牌(简称魔术)是一个可收藏的交易纸牌游戏,玩家使用生物和咒语击败他们的对手。玩家从一副 60 张牌中拿出 7 张牌开始每场游戏。
Image from manaleak.com
一副牌由允许你施放法术的地牌和法术本身(非地牌)组成。根据不同的牌组,你通常希望你的起手牌中有 4-5 张非地牌,而你的牌组中有大约 23 张地牌。
假设以上,我们来计算一下拿到 4 张或者 5 张非地牌的概率。我们将使用带有以下参数的hypergeom_cdf
:
由于一副牌有 60 张牌。
A = 37
因为我们假设我们的 60 副牌中有 23 个地。
n = 7
因为我们将从一手 7 张牌开始。
t = 5
因为这是我们想要的非陆地的最大数量。
min_value = 4
因为这是我们第一手牌中非陆牌的最小数量。
计算hypergeom_cdf(60, 37, 7, 5, 4)
给我们的概率是 0.5884090217751665,大概是 59%。这意味着我们有大约 59%的机会在第一手 7 张牌中抽 4 或 5 张非地牌。还不错。你会如何改变你牌组中的地和法术的数量来增加这种概率?
问题三。
假设你经营一所特许学校,你通过抽签系统录取学生。你有 734 个申请人,其中 321 个是男生,413 个是女生。你只录取随机抽取的前 150 名学生。考虑到你的学校女生比男生多,你希望今年有更多的男生。假设你想知道你的学校录取 90 个男生的几率是多少(150 个中的 60%)。
花几秒钟计算你的答案,然后检查下面的图片。
Image from almadelmar.org
你应该使用hypergeom_pmf
,因为这是一个单实例概率。使用hypergeom_pmf(734, 321, 150, 90)
你应该得到 3.1730164380350626 e-06…少于百分之一…让我们看一下分布图,看看哪里我们有更好的机会。
Hypergeometric distribution of problem 3
看起来如果我们试着得到 65 个男孩,我们会有更好的机会,但是可能性仍然相当低。也许你应该改变你的入学程序…
哈尔滨麻将开局手的问题
现在让你练习一个你可能不熟悉的游戏。麻将是一种中国各地都玩的著名纸牌游戏,但有着相同的获胜条件。它经常是为了钱而玩的,但那不是我玩的方式。我也不鼓励你赌博…
Image from fotolia.com
我们将要讨论的麻将来自中国东北的哈尔滨。它是著名的哈尔滨冰雪节和我姻亲的家乡。
Image from mymodernmet.com
游戏有 3 种花色,编号为 1 到 9,每张牌 4 份。到目前为止总共有 108 张卡片。此外,还有 4 张钟牌(上图中竖立的红色方块),总共 112 张牌。在哈尔滨麻将中,除了获胜的一手牌之外,满足特定条件也是获胜的基础。在你的开局手牌中拿到至少 3 张钟牌,你就涵盖了几乎所有的情况。
问题是如果你不是庄家,你的开局手牌中至少有 3 张中牌的概率是多少?这意味着你的第一手牌将有 13 张。尝试使用提供的正确函数自己计算这个概率。然后把你的答案贴在下面的评论里,我会让你知道你是否回答正确。
额外资源
感谢阅读!要查看本教程的代码,你可以在我的 Github 找到。
如果你想看这里的视频教程,你可以看看下面的视频。这是我用来学习超几何分布的。
你可以在 Linkedin 和 Twitter 上关注或联系我。直接在 j.dejesus22@gmail.com 联系我。如果你喜欢这个,看看我在下面的一个叫做点双列相关的相关概念上的类似文章:
[## 与 Python 的点双列相关
线性回归是确定数据的两个或多个连续特征之间相关性的经典技术…
towardsdatascience.com](/point-biserial-correlation-with-python-f7cd591bd3b1)
如果你喜欢在媒体上阅读,并愿意进一步支持我,你可以使用我的推荐链接注册一个媒体会员。这样做可以用你的会费的一部分在经济上支持我,我将不胜感激。
直到下一次,
约翰·德杰苏斯
Hyperledger 结构:技术概述
原文:https://towardsdatascience.com/hyperledger-fabric-technical-overview-a63046c2a430?source=collection_archive---------23-----------------------
我是🇵🇹大学的博士研究员@ Técnico Lisboa,在那里我教授以用户为中心的设计。我是基于 Hyperledger 结构的访问控制项目的导师,该项目由 Hyperledger 和 Linux 基金会支持和资助。
Fabric 允许网络中有不同类型的参与者,这有助于链代码的分布式执行的执行-命令-验证范例。
作者认为,相对于区块链常见的订单执行模式,如比特币和以太坊,执行订单验证具有优势。
背书对等体(背书者)执行(背书)智能合同(链码)并向区块链客户端返回已提交交易的验证输出,其中包含背书对等体的签名。这个过程允许并行执行,并处理非确定性代码。
链码是结构网络中的中心元素,因为它规定了成员参与者要遵守的规则。它在 Docker 容器中运行,因此与共享分类帐隔离。
有两种类型的链码:应用链码,其执行应用逻辑并使用 gRPC 消息和系统链码与对等体通信,在配置信道上运行并用于存储生态系统的配置,例如 MSP 的定义、osn 的网络地址、关于共识的配置、订购服务参数以及关于如何改变信道配置的规则。
来源:https://hyperledger-fabric . readthedocs . io/en/release-1.4/peers/peers . html
Chaincode 可以动态部署,并且通常在网络上并发运行。它直接运行在对等体的进程上。配置信道存储 MSP 的定义、osn 的网络地址、关于共识的配置、订购服务参数以及关于如何调整信道配置的规则。
由于世界状态提供了对这些键的最新值的直接访问,Chaincode 根据世界状态数据执行事务提议。鉴于此,没有必要遍历整个事务日志并计算其值。
最终,chaincode 的目标是修改共享分类账。每个对等方包含一个分类帐组件,由存储包含事务的块的块存储和对等方事务管理器(PTM)组成。每个渠道都有不同的分类账,因为渠道会强制实施链码和数据隔离。
通道允许参与者在有权可视化交易子集的参与者子集之间建立通信路径。
例如,在同一个网络中,可能存在只能访问某类事务的对等体子集。除了通道之外,Fabric 还支持私有数据,这允许通道上组织的一个定义子集将他们的数据与其他数据隔离开来。
具体来说,具有权限的组织可以签署、提交或查询私有数据,这些数据在逻辑上与渠道分类帐数据分离。如果出现争议,可以共享私人数据。
为了进一步保护隐私,私有数据的散列通过订购者,而不是数据本身。它是点对点传播,而不是通过块。
当交易数据必须对订购服务节点保密时,使用私有数据集合而不是通道是一种解决方案。
来源:https://vital flux . com/hyperledger-fabric-channels-private-区块链-deep-dive/
Fabric 引入了混合复制模型,结合了主动和被动复制(primarybackup-replication,移植到不可信环境)。
对于主动复制或状态机复制,分类帐状态仅反映经过验证并就其排序达成一致的交易。当签署者将事务处理的结果发送到提交节点时,发生被动复制。
Fabric 包含三个围绕数据的主要元素:世界状态,对应于分布式分类帐的版本化的键值存储;交易日志,存储所有交易的历史(PTM);NoSQL 数据库,如 CouchDB,存储世界状态。
可以限制用户查看和编辑特定字段的权限,并且只授予只读权限。与 LevelDB 相比,CouchDB 支持针对整个区块链数据的复杂数据查询,这使得它成为数据分析和审计的合适解决方案。LevelDB 是存储世界状态的另一个内置选项。
这是一个简单、快速的键值存储库,提供了从字符串键到字符串值的有序映射。
虽然 Fabric 没有内置的加密货币,但可以使用 chaincode 创建一个底层令牌,它可以表示执行特定操作的资产或权利。
这些资产可以通过交易在网络参与者之间进行交换。
参与者可以拥有网络上的一个或多个对等节点。Fabric 在其模型上定义了几种对等节点:
- 提交同行。每个对等体维护分类帐当前状态的当前快照,作为键值的存储。这样的对等体不能调用链码函数。
- 背书人同行。背书者对等方安装了链码。当他们收到一个事务提议时,他们在隔离的容器上模拟事务执行。基于该模拟,这些对等方准备一个交易提议,然后发送给订购方对等方。背书者对等体的存在避免了所有对等体顺序执行事务。
- 订购者同行。订购者接收经认可的交易,并将它们组装成块。在对交易进行分组之后,订购者通过将这样的块传播给提交对等方来确保一致性,在提交对等方处,它们被验证,然后被提交到共享分类帐。订购方对等方记录有效和无效交易,而其他对等方只包含有效交易。
此外,Fabric 定义了锚点对等体和领导者对等体。
锚节点在来自其组织的节点和来自外部组织的节点之间充当中介。
领导节点负责将交易从订购者分发到提交节点。
结构解决方案的架构。
为了达成共识,并且假定在超分类帐结构网络中存在部分信任的假设,结构使用基于许可投票的方案,这实现了低延迟。
背书策略定义了对等体使用的基于投票的方案,并因此定义了每个对等体关于交易有效性的权重。
遵循执行-订单-验证范例的事务流程如下:
- 交易建议。代表组织的区块链客户创建一份交易提案,并将其发送给背书政策中定义的背书伙伴。该提议包含关于提议者的身份、交易有效载荷、随机数和交易标识符的信息。
- 执行(背书):背书是模拟交易。背书者产生一个包含密钥及其修改值的写集合和一个读集合。背书对等体还检查事务执行的正确性。背书作为建议响应发送,包含写集合、读集合、交易 ID、背书人 ID 和背书人签名。当客户机收集到足够多的背书(需要有相同的执行结果)时,它创建事务并将其发送给订购服务。认可阶段消除了任何最终的不确定性。
- 订单:背书后是订货环节,由订货人完成。订购服务检查提交交易建议的区块链客户在给定频道上是否具有适当的许可(广播和接收许可)。排序产生包含每个通道中有序序列的已签署事务的块。排序允许网络达成共识。定序器将事务的输出广播给所有对等体。
- 验证。首先,每个对等体通过检查交易是否遵循通信方背书策略来验证接收到的交易。之后,将按顺序对块中的所有事务运行读写冲突检查。对于每笔交易,它会将读取集中的密钥版本与当前分类帐中的密钥版本进行比较。它检查值是否相同。在它们不匹配的情况下,对等体丢弃该事务。最后,分类帐被更新,其中分类帐将创建的块附加到其头部。分类帐附加有效性检查的结果,包括无效的事务处理。
- 伊里·安德罗拉基、亚科夫·马涅维奇、斯里尼瓦桑·穆拉利哈兰、切特·穆尔蒂、阮平、马尼什·塞西、加里·辛格、基思·史密斯、亚历山德罗·索尼奥蒂、金苏拉·斯塔萨科普卢等。Hyperledger Fabric:许可区块链的分布式操作系统。2018 年第十三届欧洲系统会议记录
- 超级账本基金会。Hyperledger 结构文档,2018 年。https://hyperledger-fabric.readthedocs.io/en/release-1.4.网址访问时间 2018-11-12
- 马尔科·武科里奇。重新思考被允许的区块链。在 2017 年 ACM 区块链、加密货币和合同研讨会会议录第 3-7 页
超净:强大的,间接的神经网络进化
原文:https://towardsdatascience.com/hyperneat-powerful-indirect-neural-network-evolution-fba5c7c43b7b?source=collection_archive---------5-----------------------
超净:强大的,间接的神经网络进化
扩展神经进化
上周,我写了一篇关于 NEAT(增强拓扑的神经进化)的文章,我们讨论了许多围绕算法的很酷的事情。我们还简要地谈到了这种旧算法可能会如何影响我们今天的网络构建方法,暗示了神经网络不需要完全手工构建的事实。
今天,我们将进入一种不同的神经进化方法,一种叫做超净的 NEAT 的扩展。你可能还记得,NEAT 的网络结构有一个直接的编码。这使得网络可以更直观地进化,一个节点接一个节点,一个连接接一个连接。HyperNEAT 放弃了这个想法,因为为了进化出像大脑(有数十亿个神经元)这样的网络,人们需要一种更快的方式来进化这种结构。
HyperNEAT 是一个概念上复杂得多的算法(至少在我看来),甚至我也在努力理解它如何工作的具体细节。今天,我们将深入了解并探索该算法的一些组件,以便我们可以更好地理解是什么使它如此强大,并在这个深度学习的时代对未来的扩展进行推理。
超净
动机
在深入研究论文和算法之前,我认为值得探索一下 HyperNEAT 背后的动机。
论文全称是“一种用于进化大规模神经网络的基于超立方体的间接编码”,相当拗口!但是,我们已经可以看到两个要点。这是一种基于超立方体的间接编码。我们稍后将讨论超立方体部分,但是我们已经知道这是从直接编码到间接编码的转变(参见我在 NEAT 上的上一篇博客,了解两者之间一些差异的更详细描述)。此外,我们还得到了它背后的主要原因:进化大型神经网络!
不仅如此,这种算法的创造者强调,如果人们观察大脑,他们会看到一个具有数十亿节点和数万亿连接的“网络”。他们看到了一个使用重复结构的网络,重复使用同一基因的图谱多次生成相同的物理结构。他们还强调,人类大脑的构造方式是为了利用世界的物理属性:对称性(拥有结构的镜子,例如两只眼睛用于输入)和局部性(结构中的节点影响它们的连接和功能)。
相比之下,我们所知道的神经网络,要么是通过进化过程建立的,要么是手工构建和训练的。这些属性中的任何一个都成立吗?当然,如果我们强迫网络具有对称性和局部性,也许…然而,即使这样,采取一个密集的前馈网络,其中一层中的所有节点都连接到下一层中的所有节点!当观察由普通算法构建的网络时?它们往往是无组织的、零星的,没有表现出任何这些良好的规律性。
以超整齐的方式进入!通过一种被称为连接性组合模式产生网络(CPPNs)的间接编码,HyperNEAT 试图利用几何属性来产生非常大的神经网络,这些网络具有我们可能希望在我们的进化网络中看到的良好特征。
什么是组合模式生产网络?
在前一篇文章中,我们讨论了编码,今天我们将深入探讨用于 HyperNEAT 的间接编码。现在,间接编码比你想象的要普遍得多。其实你自己内心也有一个!
DNA 是一种间接编码,因为表型结果(我们实际看到的)比基因型含量(DNA 中的基因)大几个数量级。如果你观察人类基因组,我们会说它有大约 30,000 个基因,编码大约 30 亿个氨基酸。大脑有 3 万亿个连接。很明显,这里面有间接的东西!
从生物学的思想中借鉴来的是一种叫做发展编码的编码方案。这是一个想法,所有的基因应该能够在发育过程中的任何时间点和在个体的任何位置重复使用。组合模式产生网络(CPPNs)是这一概念的抽象,已经表明能够在笛卡尔空间中创建重复结构的模式。请点击此处查看使用 CPPNs 生产的一些结构:
纯 CPPNs
表型可以描述为 n 维的函数,其中 n 是表型性状的数量。我们所看到的是从遗传编码到展示特征的某种转化的结果。通过组合简单的函数,复杂的模式实际上可以很容易地表示出来。像对称、重复、不对称和变异这样的东西,都很容易脱离这样的编码结构,这取决于所产生的网络类型。
我们将更深入地了解 CPPNs 在这种情况下的具体用法,但希望这能让您大致了解它们在间接编码环境中的重要性。
系在整洁的
在 HyperNEAT 中,一堆熟悉的属性重新出现在原始的 NEAT 纸上。随着时间的推移,像复杂化这样的事情是很重要的(我们将从简单开始,如果需要的话,逐渐变得复杂)。将使用历史标记,以便我们可以正确地排列任何类型的交叉编码。还将使用统一的起始群体,以便从一开始就没有通配符、不兼容的网络。
这篇文章和以前的文章在整洁程度上的主要区别是什么?HyperNEAT 没有使用 NEAT 算法直接进化神经网络,而是使用 NEAT 来进化 CPPNs。这意味着更多的“激活”函数被用于 CPPNs,因为像高斯函数产生对称性,三角函数有助于结构的重复。
该算法
既然我们已经讨论了什么是 CPPN,并且我们使用 NEAT 算法来进化和调整它们,这就引出了一个问题:在整个 HyperNEAT 环境中,这些算法实际上是如何使用的?
首先,我们需要引入基底的概念。在超净的范围内,基底仅仅是节点的几何排序。最简单的例子可能是平面或网格,其中每个离散的(x,y)点是一个节点。一个连接的 CPPN 实际上会取其中的两个点,并计算这两个节点之间的权重。我们可以把它想成下面的等式:
CPPN(x1, y1, x2, y2) = w
其中 CPPN 是一种进化的 CPPN,就像我们在前面章节中讨论的那样。我们可以看到,这样做时,每个节点之间实际上都有某种权重连接(甚至考虑到循环连接)。连接可以是正的,也可以是负的,还可以定义一个最小权重值,以便任何低于该阈值的输出都不会导致连接。
节点的几何布局必须在任何 CPPN 发展之前指定。因此,随着 CPPN 的发展,实际的连接权重和网络拓扑将导致几何模式(所有输入都基于节点的位置)。
在节点排列在某种二维平面或网格上的情况下,CPPN 是四维的函数,因此我们可以说它是在四维超立方体上发展的。这就是我们得到报纸名字的地方!
生产模式的规律性
我们之前提到的所有规则都很容易从这样的编码中脱离出来。对称可以通过在 x1 和 x2 上使用对称函数来实现。这可以是一个类似高斯函数的函数。当对称用于像 x 和 y 这样的事物时,可能会出现不完全对称,但只是相对于一个轴。
就像我们之前提到的,正弦、余弦等周期性函数也会重复。和对称性一样,通过在衬底的非重复方面引入周期性函数,可以引入相对于重复的变化。因此,所有四个主要的规律都可以从这个编码中发展出来。
衬底配置
从上面你可能已经猜到基板的配置是至关重要的。这很有道理。在生物学中,事物的结构与其功能紧密相连。因此,在我们自己的演进模式中,我们的节点结构与特定任务上可能看到的功能和性能紧密相连。
在这里,我们可以看到原始论文中特别概述的几种基板配置:
我认为查看三维立方体的配置非常重要,并注意它如何简单地将 CPPN 方程从四维调整为六维:
CPPN(x1, y1, z1, x2, y2, z2) = w
此外,通过只允许一半上的节点连接到另一半,网格可以扩展到三明治配置。这很容易被视为输入/输出配置!该论文的作者实际上使用这种配置来在输入半部上接收视觉激活,并使用它来激活输出半部上的某些节点。
圆形布局也很有趣,因为几何图形不必是配置的网格。可以使用放射状的几何图形来代替,允许从圆形所代表的独特几何图形中产生有趣的行为属性。
输入输出布局
输入和输出在 CPPNs 发展之前就已经设计好了。然而,与传统的神经网络不同,我们的超净算法知道输入和输出的几何形状,并可以学习利用和接受它的规律。通过 HyperNEAT 接收的这些额外信息,可以很容易地利用输入和输出的局部性和重复性。
基底分辨率
HyperNEAT 的另一个强大而独特的特性是能够上下缩放承印物的分辨率。那是什么意思?好吧,假设你根据一定大小的图像进化出一个超整洁的网络。在该尺寸下表现良好的基础几何图形在缩放到新尺寸时会产生相同的图案。除此之外,不需要额外的训练。它只是缩放到另一个尺寸!
算法综述
我认为有了这些关于这个算法如何工作的信息,总结一下它的步骤是值得的。
- 1.选择基板配置(节点布局和输入/输出位置)
- 2.创建一个统一的、最小的连接性 CPPNs 初始群体
- 3.重复直到解决:
- 4.对于每个 CPPN
- (a)使用 CPPN 生成神经网络的连接
- (b)评估神经网络的性能
- 5.使用 NEAT 算法再现 CPPNs
结论
我们做到了!这就是超净算法。如果你希望探索更多的细节,或者希望看看他们用该算法做的一些实验的性能,我鼓励你看看这篇论文(我特别喜欢他们的食物收集机器人实验)。
这对未来有什么影响?这也是我最近一直在思考的事情。今天,从 HyperNEAT 到训练传统的深度网络有联系吗?这是一种更好的训练深度网络的方法吗?还有另一篇关于进化基质超净的论文,其中实际的基质也在进化,这是我希望在未来探索的一篇论文!但是,在那篇论文中是否隐藏着某种东西,在超净和深度神经网络之间架起了桥梁?只有时间能证明,也只有我们能回答这个问题!
希望这篇文章是有帮助的!如果我错过了什么或者你有问题,让我知道。我自己仍在学习和探索这方面的很多东西,所以我很乐意在这里或在 Twitter 上谈论这个话题。
如果你想读更多我写的东西,也许可以看看:
- 什么是生成性对抗网络
- 单词嵌入简介
- 知识代理简介
原载于hunterheidenreich.com。
HyperparameterHunter 3.0 中的特征工程优化
原文:https://towardsdatascience.com/hyperparameter-hunter-feature-engineering-958966818b6e?source=collection_archive---------24-----------------------
使用超参数猎人自动保存并优化您的特征工程步骤和超参数,使优化更加智能,并确保不会浪费任何实验
Pre-HyperparameterHunter demo of fitting feature engineering into hyperparameter optimization. Photo: Robyn Mackenzie
漫长的等待结束了。超参数猎人 3.0(阿耳忒弥斯)已经到来,增加了对特征工程的支持,并带来了礼物!
- Gift #1) 清晰且可定制的特征工程师语法:你自己的功能列表
- Gift #2) 为自动记录的建筑特色工程工作流程搭建一致的脚手架
- Gift #3) 针对特征工程步骤的优化,以及(明显地)检测过去的实验以启动优化
- 礼物#4) 你的理智和时间:停止跟踪功能工程步骤的 janky 列表,以及它们如何与你的所有其他超参数一起工作
1.特征工程背景
1.1.这是什么?
很多人对特征工程和预处理有不同的定义,那么超参数猎人是如何定义的呢?
我们对“特征工程”有一个非常宽泛的定义,因此它本身和“预处理”之间的界限是模糊的。我们认为“特征工程”是在模型拟合之前应用于数据的任何修改——无论是在实验开始时执行一次,还是在交叉验证的每个折叠中重复执行。不过,从技术上来说, HyperparameterHunter 让你为自己定义“特征工程”的细节,我们很快就会看到。以下是我们的“特征工程”的几个方面:
1) 手动特征创建, 2) 缩放/规范化/标准化,
3) 重新采样(参见我们的 [imblearn](https://github.com/HunterMcGushion/hyperparameter_hunter/blob/master/examples/feature_engineering_examples/imblearn_resampling_example.py)
示例), 4) 目标数据转换, 5) 特征选择/消除, 6) 编码(一键热码,标签等)。)、
7) 插补、 8) 二值化/宁滨/离散化
…还有许多其他东西!
1.2.我为什么要在乎?
这是一个合理的问题,因为特征工程很少成为超参数优化的话题。那么,你为什么要让超参数猎人跟踪特征工程呢?
第一,特征工程很重要。
你几乎总是需要预处理你的数据。这是一个必需的步骤。
— 机器学习掌握
第二,我们通常将特征工程步骤视为超参数——只是我们习惯于手动调整的超参数。
应该用StandardScaler
还是Normalizer
?我将对这两种算法都进行测试,并尽力记住哪一种(如果有的话)最适合每种算法。我应该将日期一次性编码成星期几,还是创建一个二进制的“is_weekend”特性?我在乎月份吗?年份?我应该把 12 个月转换成四季吗?闰年呢??
最终,我们使用的众多特征工程步骤中的每一个都只是我们应该优化的另一个超参数——但我们没有。为什么?
特征工程在普通超参数优化中的缺失实际上有一个很好的原因:很难。这并不完全像在 0.1 和 0.7 之间选择一个值,或者在 NN 层中选择使用 sigmoid 或 ReLU 变换。我们讨论的是参数化和优化一组函数,这些函数需要知道什么并返回什么,所有这些都是为了转换您的宝贵数据。
你有没有把一个脚本扔在一起做你所有的特性工程,然后拖着它到处跑——为了你的整个项目——根据需要随意地添加、删除和修改片段?你并不孤单。在项目结束时,不可能重新创建实验,因为没有为它们执行的清晰、自动的特征工程记录。此外,忽略特征工程使得超参数优化完全不可靠。当然,一定有更好的方法…而且确实有!
2.超参数亨特方法
在我们开始使用 HyperparameterHunter 之前,让我们快速浏览一下我们的数据:SKLearn 的波士顿住房回归数据集。我们将使用“DIS”列作为目标,就像 SKLearn 的目标转换示例一样。该数据集具有可管理的 506 个样本,其中 13 个特征不包括目标。
2.1.基线
因为特征工程的目标是产生更好的模型,所以让我们建立一个基线[CVExperiment](https://hyperparameter-hunter.readthedocs.io/en/latest/api_essentials.html#experiment-execution)
。和往常一样,我们将从建立一个[Environment](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.environment.Environment)
开始,以宽泛地定义任务以及如何评估结果。
我们将进行五次分割的交叉验证,我们将只关注中位数绝对误差。
还有,因为我们不是山顶洞人,我们会通过 SKLearn 的train_test_split
告诉[Environment](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.environment.Environment)
从train_dataset
预留一个holdout_dataset
。
然后,我们将使用AdaBoostRegressor
和它的默认参数运行一个简单的[CVExperiment](https://hyperparameter-hunter.readthedocs.io/en/latest/api_essentials.html#experiment-execution)
,看看没有华丽的新FeatureEngineer
我们会做些什么。
2.2.定义
已经建立了 0.51 的基线 MAE 用于折叠外预测,让我们看看我们可以采取的几个特征工程步骤来消除它。
2.2.A .手动特征创建 因为我们很有创造力,我们喜欢从特征工程中获得乐趣,所以我们将首先在输入数据中添加我们自己的特征。让我们制作一个特征,它是其他 13 个特征中的欧几里德范数,或 ℓ2 范数-范数!本着创造性的精神,让我们创造性地将我们的欧几里德范数函数命名为euclidean_norm
:
2.2.B .输入缩放 接下来,我们必须做输入缩放,因为这是最近所有酷孩子都在做的事情。说真的,扩展数据通常是个好主意。
记得fit_transform
用我们的train_inputs
,然后只transform
我们的non_train_inputs
(验证/保持数据)以避免数据泄露。
2.2.C .目标转换 我们的最后一个特征工程步骤将使用 SKLearn 的QuantileTransformer
来均匀分布我们的目标输出,从而分散最频繁出现的值,减少离群值的影响。与我们的输入缩放一样,我们必须注意fit_transform
只是我们的train_targets
,然后是transform
和non_train_targets
。
2.3.我们什么时候到达超参数猎人?
我知道你在想什么,我也在想同样的事情。别拖延了。向我展示如何在超参数搜索中完成所有这些操作。
表白时间:我可能是想偷偷摸摸的过去,没有提到我们上面清晰简洁的函数就是我们做FeatureEngineer
所需要的全部。
但是,Hunter,定义特征工程步骤的语法是如此流畅和符合逻辑!我从来没有想到 HyperparameterHunter 会期望它们采用与我已经使用的完全相同的格式!这太疯狂了。但是怎么做呢???
—你,大概是
亲爱的读者,秘密成分在上面的函数签名中,特别是输入参数。我们称这些函数为 EngineerStep 函数,因为每个函数都生成一个[EngineerStep](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.EngineerStep)
。那么,[FeatureEngineer](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.FeatureEngineer)
就是一系列EngineerStep
或函数。
回到秘密配料。EngineerStep 函数只是一个普通的函数,您可以在其中进行任何想要的数据处理。您只需要在签名的参数中告诉它您想要的数据。敏锐的读者可能已经注意到了上面 EngineerStep 函数中的模式,但是这里有一个方便的公式来记住有效的 EngineerStep 函数参数。
扣上。这个数学很高级,但是不要担心;我是专业的…
只需从第一组中取出一个字符串,将第二组中的一个字符串粘在上面,就得到一个有效的 EngineerStep 函数参数。另一个重要的部分是函数返回什么。幸运的是,这更容易记住。返回签名参数的新值。你也可以选择返回一个转换器来执行反向的目标转换,就像上面我们对quantile_transform
所做的那样。但是等等!还有呢!
我们还有两个别名来组合数据,以便于处理,我们已经在上面的函数中使用过了!让我们更新高度复杂和微妙的公式,添加额外的 EngineerStep 函数参数别名:
正如新参数的名称所暗示的,“all _ inputs”/“all _ targets”为您提供了一个包含所有数据集输入/目标的大数据框架。“non_train_inputs”和“non_train_targets”是相似的,只是它们省略了所有的训练数据。每个公式下面的注释提醒我们“test_inputs”没有 targets 对应的参数,因为我们没有通过设计来跟踪测试目标。
3.潜入水中
带着我们对如何制作自己的FeatureEngineer
步骤的新认识,让我们开始将FeatureEngineer
与[CVExperiment](https://hyperparameter-hunter.readthedocs.io/en/latest/api_essentials.html#experiment-execution)
结合使用。
我们只需要[CVExperiment](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.CVExperiment)
里的feature_engineer
kwarg,或者任何 OptPro 的[forge_experiment](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.optimization.html#hyperparameter_hunter.optimization.protocol_core.BaseOptPro.forge_experiment)
方法。feature_engineer
可以是一个[FeatureEngineer](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.FeatureEngineer)
实例,也可以是一系列[EngineerStep](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.EngineerStep)
函数,就像我们上面定义的那样。
3.1.试水:实验
记住,我们的基线实验结束时,OOF 数据的中值绝对误差为 0.51。让我们用几个增强的[FeatureEngineer](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.FeatureEngineer)
来测试一下,看看会发生什么...
嗯,那很容易……
让我们来消化一下刚刚发生的事情。三个不同的[CVExperiment](https://hyperparameter-hunter.readthedocs.io/en/latest/api_essentials.html#experiment-execution)
s,每个都有不同的FeatureEngineer
。实验#1 的表现和我们的基线一样好。#2 好一点。然后在#3 中,我们看到误差从 0.51 下降到 0.46。或许我们可以称quantile_transform
为唯一重要的特征工程步骤,然后回家!但是我们怎么能确定呢?
3.2.面向第一:优化
对于跳过“3.1”部分的人。试水”,我也喜欢危险地生活。虽然在[CVExperiment](https://hyperparameter-hunter.readthedocs.io/en/latest/api_essentials.html#experiment-execution)
中使用[FeatureEngineer](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.FeatureEngineer)
很棒,但是让 HyperparameterHunter 的 OptPros 为我们处理测试所有不同的特征工程步骤组合会更好!
现在,你可能会担心增加优化一定会使特性工程复杂化。你可以放松了,因为我们只需要 OptPros 的[forge_experiment](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.optimization.html#hyperparameter_hunter.optimization.protocol_core.BaseOptPro.forge_experiment)
方法,这就像初始化一个[CVExperiment](https://hyperparameter-hunter.readthedocs.io/en/latest/api_essentials.html#experiment-execution)
!
要搜索不同[EngineerStep](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.EngineerStep)
的空间,只需将步骤放在[Categorical](https://hyperparameter-hunter.readthedocs.io/en/latest/source/hyperparameter_hunter.html#hyperparameter_hunter.Categorical)
中,就像标准的超参数优化一样!Categorical
也有一个optional
kwarg,指的是美国疯狂的科学家都想尝试一个特别有问题的EngineerStep
。如果optional
=真(默认=假),搜索空间不仅包括显式给出的categories
,还包括当前EngineerStep
的完全省略。
在我们进行特性优化之前,我们需要更多的EngineerStep
函数来优化。也许除了standard_scale
,我们还想尝试一些其他的缩放方法,所以让我们定义一下min_max_scale
和normalize
。
这可能是足够的炒作。让我们看看功能优化的实际效果!
注意,在经典的 超参数猎人 时尚中,我们下面的 OptPro 自动计算出我们上面的四个实验与我们的搜索空间兼容,并使用它们作为学习材料来启动优化。
Blue rectangle added around scores of new Experiments conducted by OptPro
每当 OptPros 发现一个实验的分数比我们目前最好的分数高时,它会很有帮助地将分数涂成粉红色,将超参数涂成绿色。通过 16 次实验,我们的 OptPro 才刚刚起步,但quantile_transform
看起来仍然很有希望。此外,似乎搜索一些不同的缩放器可能会有所收获,因为我们新的最佳实验使用了最近添加的min_max_scale
,而不是standard_scale
。
4.回到我们的根源
Some nerd (me) + my friends, who won’t appreciate how sick this burn is
既然这是超参数搜寻者并且搜寻最佳超参数是我们的全部事情,让我们回到我们的根本。我们将把我们的新特性优化技术与一些经典的超参数优化混合在一起,因为没有人想被局部最优所困。
除了添加经典的超参数优化,让我们假装非常确信euclidean_norm
是重要的(尽管它实际上似乎并不重要),并通过移除包围它的Categorical
使它成为必需的EngineerStep
。请注意,这一变化意味着我们的 OptPro 将只从 16 个候选实验中的 8 个保存的实验中学习,因为我们限制了它的搜索空间。
quantile_transform
继续胜过无目标改造,但让我们添加一些真正的竞争与power_transform
。
我们也可以通过从BayesianOptPro
切换到RandomForestOptPro
(或者其他任何 OptPro)来获得第二种意见。纵观上面我们所有的实验,似乎normalize
做得不太好,所以我们把它去掉吧。事实上,假设我们肯定想要standard_scale
或min_max_scale
,那么我们将从组合中去掉normalize
,并在第二个EngineerStep
的末尾删除optional=True
部分。也许我们也有点过于热心地认为euclidean_norm
是件大事,所以让我们再做一次第一个EngineerStep
optional
。当然,我们还需要添加我们的新power_transform
作为我们上一个EngineerStep
的选择。
总之,下面的 OptPro 将修改上面的所有三个EngineerStep
,我们将尝试RandomForestOptPro
来改变节奏。
尽管我们改变了整个FeatureEngineer
的空间,甚至获得了一个新的 OptPro 来运行该节目,但我们从 26 个保存的候选实验中识别出 16 个匹配实验并没有问题,这些实验可用于启动优化。我要说这比从头开始好多了。
更好的是,我们有了一个新的最佳实验,大大提高了 0.37 MAE,低于我们没有任何功能工程的基线 0.51。
现在飞吧,你这只伟大的孔雀!
这些结果的神奇之处在于,它们都保存在你的本地计算机上,这意味着你可以在未来几天、几周、几年甚至几代人的时间里继续使用它们!好吧,也许不是最后一部分。
关键是,当你从这个玩具问题中抽身出来,开始构建需要数小时训练的模型时,你为什么会满足于重新运行同一个模型,或者从过去的实验中获取有价值的优化信息,或者不得不手动跟踪所有这些荒谬的超参数和特征工程步骤?
展开你的翅膀!让超参数猎人去处理所有那些烦人的事情,这样你就可以停止努力跟踪每件事,把你的时间花在真正的机器学习上。
如果你还没有足够的超参数猎人,看看我们的回购的自述快速入门,或者我们的许多例子,或者这个优秀的文章(前 HH-3.0)由 Javier Rodriguez Zaurin 关于将 ML 投入生产。
第二部分:远视。
原文:https://towardsdatascience.com/hyperparameter-optimization-in-python-part-2-hyperopt-5f661db91324?source=collection_archive---------4-----------------------
Python 中超参数优化。
在这个博客系列中,我将比较 python HPO 库。在阅读这篇文章之前,我强烈建议你阅读 第 0 部分:简介 其中我:
- 谈论 HPO 是什么,
- 要比较的选定库,
- 选择了评估标准,
- 为 HPO 定义了一个示例问题。
这篇博文和本系列其他部分的代码可以在 github 上获得,而所有关于脚本、超参数、图表和结果(可以下载)的实验都可以在 Neptune 上获得。更多信息,请阅读这篇关于组织实验过程的文章。
好,我们开始吧。
远视
这是 HPO 空间中的经典。这个项目有超过 3300 星,600 叉和 40 个贡献者(2 个主要的)。甚至有基于它构建的项目,如:
- hyperas :远视+角膜
- 超视-sklearn :超视+ sklearn
易于设置和 API
这个 API 非常简单易用。我们需要定义一个搜索空间、目标并运行优化函数:
首先,定义搜索空间。它可以是一个常规词典,也可以是本例中的 OrderedDict:
有点尴尬的是,我必须定义这个名字两次,一次作为字典键,一次作为参数采样器中的label
。
然后,定义目标函数。记住远视最小化功能,所以如果需要,改变符号:
最后,实例化试验对象,并运行优化:
…完成了!
所有的信息、超参数、损失和其他东西都保存在trials
对象中。您可以毫无问题地访问它,也可以将其保存起来供以后使用。如果你想看完整的示例脚本,包括训练曲线、诊断图表等等,请看这个版本化的 ml 实验。
我给它的分数是 9/10 ,因为在空间搜索定义中有重复的名称,而且对于简单的问题,我宁愿不实例化trials
对象,而只是在默认情况下将它实例化为Trials()
。
分数 9/10
选项、方法和(超)超参数
搜索空间
这就是远视大放异彩的地方。有大量采样选项可供选择:
Categorical parameters-
使用 hp.choiceInteger parameters-
你可以使用 hp.randit 、 hp.quniform 、 hp.qloguniform 或 hp.qlognormal ,这给了你很多选择来为你的整数超参数空间建模Float parameters-
类似于整数参数,你真的可以选择用 hp.normal 、 hp.uniform 、 hp.lognormal 和 hp.loguniform 来解决你的问题
但事实并非如此。您可以轻松地定义嵌套空间,其中某些参数的值依赖于其他参数。以文档中的例子为例:
我们可以看到,通过将 hp.choice 与其他采样方法相结合,我们可以拥有条件搜索空间。
这在从特征预处理、模型选择方法到模型超参数的复杂空间中搜索时非常有用。
优化方法
有两种优化算法可以尝试。
*tpe.rand.suggest*
你对参数的标准随机搜索。
*tpe.suggest*
类似于在之前关于 Scikit-Optimize 的博文中所解释的,我们想要使用一个廉价的代理模型来估计昂贵的目标函数在一组参数上的性能。不同之处在于,我们想要估计尾部的密度,而不是估计实际性能(点估计)。
我喜欢 AutoML.org 弗赖堡的了不起的人们从 AutoML_Book 中摘录的以下解释。
树 Parzen 估计器对给定运行的密度函数 p(λ|y < α) and p(λ|y ≥ α). Given a percentile α (usually set to 15%), the observations are divided in good observations and bad observations and simple 1-d Parzen windows are used to model the two distributions.
By using p(λ|y < α) and p(λ|y ≥ α) one can estimate the Expected Improvement ( EI )进行建模,而不是对给定配置λ的观测值 y 的概率 p(y|λ)进行建模。
有趣的是,在优化器中没有指定 λ 参数的选项。
回调
本质上没有回调,但是您可以将回调函数放在objective
中,每次调用objective
时都会执行回调函数。
我不喜欢它,但我想我可以忍受。
总而言之,这是嵌套搜索空间的一大优势,但我不喜欢没有干净回调的事实。 TPE 没有任何(超)超参数,这一方面很好(工作量少,过拟合少),但另一方面,它不允许您调整不工作的东西。我给它 7/10。
分数 7/10
证明文件
说得好听点,它需要很多爱。
官方文档页面由维基上的托管。如果你问我的话,我觉得这更像是一次图书馆之旅,而不是正式的文档。也就是说,读完之后,你应该能够有效地使用这个库。问题是,当你想找到一个特定的东西时,你需要浏览整个维基来寻找它。
它缺少基本的例子。我找到的唯一一个(hyperopt/recipes
)是 6 岁,有错误。
绝大多数函数和 main 类方法都缺少 docstrings。不幸的是,这使得导航和回答简单的问题变得很困难,比如这个函数实际上是做什么的?
好消息是,有很多关于它的博客帖子。其中一些我认为有用的是:
- 区数据实验室的【远视参数整定】
- Vooban 撰写的《优化神经网络超参数的远视教程》
- Tanay agr awal的《关于使用 Hyperopt:高级机器学习》
- Will Koehrsen撰写的“使用 Hyperopt 在 Python 中进行贝叶斯优化的介绍性示例”
文档肯定不是这个项目的强项,但因为它是一个经典,所以有很多外部资源。我给它 3/10。
比分 3/10
注
如果你正在考虑为社区做一些有益的事情,你可以继续,添加 docstrings,一堆例子,并为这个项目创建 read-the-docs 文档。就我而言,我会很感激的。
形象化
远视有可视化模块 plotting.py 。它有三个功能:
- 它向您显示每次迭代的结果,并突出显示最好的分数。
plot_history(trials) of the best experiment
main_plot_histogram
-显示所有迭代结果的直方图。
plot_histogram(trials) of the best experiment
- 哪个…我真的不知道它是做什么的,因为我无法让它运行,也没有文档字符串或示例(同样,文档也远非完美)。
有一些基本的可视化工具,但它们不是非常有用。感觉像 3/10 。
分数 3/10
注
正如我在上一篇帖子中提到的,我喜欢 Scikit-Optimize 提供的图形,并且我实现了一组函数来帮助在不同的 HPO 库之间进行转换,以便您可以对每个库使用这些可视化。我已经把它们放在neptune-contrib
包里,你可以在这里查看如何使用。
持续/重启
你可以先处理一下trials
对象,以后再用。例如,保存部分可以读作:
pickle 会再次加载,而重新启动就像传递trials
对象(现在不为空)并将 max_evals 从 100 更改为 200 一样简单。
简单且工作没有问题: 10/10。
分数 10/10
速度和并行化
使用 hyperopt,您可以将计算分布在一组机器上。Tanay Agrawal 撰写的这篇博客文章中可以找到很好的分步指导,但简而言之,你需要:
- 启动一个装有 MongoDB 的服务器,它将使用您的工人培训脚本的结果,并发送下一个参数集进行尝试,
- 在您的训练脚本中,创建一个指向您在上一步中启动的数据库服务器的
MongoTrials
对象,而不是Trials()
, - 将您的目标函数移动到一个单独的 objective.py 脚本中,并将其重命名为函数,
- 编译您的 Python 训练脚本,
- 运行远视-蒙哥-工人
虽然它完成了任务,但感觉并不完美。您需要围绕目标函数做一些杂耍,在 CLI 中启动 MongoDB 会使事情变得更容易。
因为上面的 8/10 对我感觉很公平。
得分 8/10
实验结果
你可以在海王星探索所有版本化的 ml 实验。每个实验都有一个脚本。例如,你可以在这里看到最佳的代码。
还可以下载实验元数据给熊猫。数据帧通过运行:
我们来看看的实验结果:
只有当我们运行更多的迭代时,tpe
方法才略微胜出。在 100 次迭代的预定义预算中,random
搜索略胜tpe
。
查看 Scikit 的 plot_evaluations 图表——优化最佳 100 次迭代实验:
我们可以看到,只有对于 feature_fraction 参数,搜索实际上已经转向某个方向。否则,它基本上是随机的(这解释了为什么结果如此接近随机搜索)。
总的来说,我在 100 次迭代中得到的最高分仅仅是 0.84509,实际上比随机搜索(来自 Scikit-Optimize)的 0.8464 差了 0.001。我将把它转换成 -1 点(-0.001*100)。
分数–1
结论
hyperpt是一款经典产品,已经为社区服务多年。它有一个易于使用的 API,可以在一个机器集群上并行计算,并且对嵌套搜索空间有很好的支持。
然而,它的文档有限,只有很少的例子和文档字符串,这使得它很难使用,尤其是在黄金路径之外。Visualization suite 也非常有限,并没有带来很多价值。有点麻烦的是,对于我们的示例问题,它无法打败随机搜索。
让我们来看看所有标准的结果:
39 的分数远低于 Scikit-Optimize 的分数。最大的因素是文档、可视化和实验结果。
下一步是什么?
下次我们将仔细看看另一个用于超参数优化 Optuna 的 Tree-Parzen 估计器库。
你可以在这里查看这个系列的第三部分 Optuna vs 远视。
你也可以在我的 Python 专栏的 HPO 中阅读这个系列的其他帖子。
如果你喜欢这个,你可以在我们的 Neptune 博客上找到更多类似的帖子。
你也可以找我 发微博@Neptune_a 我或者 在 LinkedIn 上发帖 关于 ML 和数据科学的东西。
参考
@book{automl_book,
editor = {Hutter, Frank and Kotthoff, Lars and Vanschoren, Joaquin},
note = {In press, available at http://automl.org/book.},
publisher = {Springer},
title = {Automated Machine Learning: Methods, Systems, Challenges},
year = {2018}
}
超参数调谐
原文:https://towardsdatascience.com/hyperparameter-tuning-c5619e7e6624?source=collection_archive---------1-----------------------
探索 Kaggle 的不要过度拟合 II 竞赛中超参数调整方法
Photo by rawpixel on Unsplash
卡格尔的不要过度适应 II 竞赛提出了一个有趣的问题。我们有 20,000 行连续变量,其中只有 250 行属于训练集。
挑战在于不要吃太多。
对于如此小的数据集,甚至更小的训练集,这可能是一项艰巨的任务!
在本文中,我们将探索超参数优化作为一种防止过度拟合的方法。
完整的笔记本可以在这里找到。
超参数调谐
维基百科声明“超参数调优就是为一个学习算法选择一组最优的超参数”。那么什么是超参数?
超参数是在学习过程开始之前设置其值的参数。
超参数的一些例子包括逻辑回归中的惩罚和随机梯度下降中的损失。
在 sklearn 中,超参数作为参数传递给模型类的构造函数。
调优策略
我们将探讨优化超参数的两种不同方法:
- 网格搜索
- 随机搜索
我们将从准备数据开始,用默认的超参数尝试几种不同的模型。我们将从中选择两种最佳的超参数调节方法。
然后,我们找到平均交叉验证分数和标准偏差:
Ridge
CV Mean: 0.6759762475523124
STD: 0.1170461756924883
Lasso
CV Mean: 0.5
STD: 0.0
ElasticNet
CV Mean: 0.5
STD: 0.0
LassoLars
CV Mean: 0.5
STD: 0.0
BayesianRidge
CV Mean: 0.688224616492365
STD: 0.13183095412112777
LogisticRegression
CV Mean: 0.7447916666666667
STD: 0.053735373404660246
SGDClassifier
CV Mean: 0.7333333333333333
STD: 0.03404902964480909
我们这里表现最好的模型是逻辑回归和随机梯度下降。让我们看看是否可以通过超参数优化来提高它们的性能。
网格搜索
网格搜索是执行超参数优化的传统方式。它通过彻底搜索超参数的指定子集来工作。
使用 sklearn 的GridSearchCV
,我们首先定义要搜索的参数网格,然后运行网格搜索。
Fitting 3 folds for each of 128 candidates, totalling 384 fitsBest Score: 0.7899186582809224
Best Params: {'C': 1, 'class_weight': {1: 0.6, 0: 0.4}, 'penalty': 'l1', 'solver': 'liblinear'}
我们将交叉验证分数从 0.744 提高到了 0.789!
网格搜索的好处是可以保证找到所提供参数的最佳组合。缺点是非常耗时且计算量大。
我们可以用随机搜索来解决这个问题。
随机搜索
随机搜索不同于网格搜索,主要在于它随机地而不是穷尽地搜索超参数的指定子集。主要的好处是减少了处理时间。
然而,减少处理时间是有代价的。我们不能保证找到超参数的最佳组合。
我们用 sklearn 的RandomizedSearchCV
来试试随机搜索吧。与上面的网格搜索非常相似,我们在运行搜索之前定义了要搜索的超参数。
这里需要指定的一个重要的附加参数是n_iter
。这指定了随机尝试的组合数量。
选择太低的数字会降低我们找到最佳组合的机会。选择太大的数字会增加我们的处理时间。
Fitting 3 folds for each of 1000 candidates, totalling 3000 fitsBest Score: 0.7972911250873514
Best Params: {'penalty': 'elasticnet', 'loss': 'log', 'learning_rate': 'optimal', 'eta0': 100, 'class_weight': {1: 0.7, 0: 0.3}, 'alpha': 0.1}
在这里,我们将交叉验证分数从 0.733 提高到 0.780!
结论
在这里,我们探索了两种超参数化的方法,并看到了模型性能的改善。
虽然这是建模中的一个重要步骤,但绝不是提高性能的唯一方法。
在以后的文章中,我们将探索防止过度拟合的其他方法,包括特征选择和集合。
解释了超参数调优——调优阶段、调优方法、贝叶斯优化和示例代码!
原文:https://towardsdatascience.com/hyperparameter-tuning-explained-d0ebb2ba1d35?source=collection_archive---------14-----------------------
本书"赢得 KAGGLE 的数据分析技巧"
何时以及如何使用手动/网格/随机搜索和贝叶斯优化
Simple Mandala of modeling world (Validation Strategy is out of setup space because the same validation approach should be applied to any models compared for fair model selection)
超参数是 ML 模型的重要组成部分,可以使模型成为黄金或垃圾。
在这篇文章中,我将讨论:
- 随着建模的进行,调谐阶段的演变,
- 各车型的重要参数(特别是 GBDT 车型),
- 常见的四种调优方法(手动/网格搜索/随机搜索/贝叶斯优化)。
目录
- 通用超参数调整策略
- 1.1.特征工程参数调整的三个阶段
- 1.2.什么是超参数基线,哪些参数值得调整?
2。超参数调整的四种基本方法
- 2.1.人工调谐
- 2.2.网格搜索
- 2.3.随机搜索
- 2.4.贝叶斯优化
3。超参数调整和交叉验证中的 k 折叠
4。结论
这是另一篇帖子接的一本新书中介绍的技巧数据分析技巧赢 Kaggle由三位高阶 Kaggle 作者(不包括我自己)由此可见这不是个人推广!😃 )**
关于这本书本身的完整目录,请看我的其他帖子。
1.通用超参数调整策略
1.1.特征工程参数调整的三个阶段
我们如何调整超参数不仅是关于我们使用哪种调整方法的问题,也是关于我们如何发展超参数学习阶段直到我们找到最终的和最好的。
这应该取决于任务和我们实际上通过超参数变化看到多少分数变化,但我们应该记住以下常见步骤:
- 初始阶段:开始基线参数** &基线特征工程,**
- 预热阶段:围绕手动调谐或网格搜索几个重要参数用几个搜索候选&更多特色工程,
- 激烈调优阶段 : 对更多参数进行随机搜索或贝叶斯优化 &最终特征工程
Plates are getting hotter.
1.2.什么是超参数基线,哪些参数值得调整?
然后,您会有另一个问题:“什么是超参数基线,哪些参数值得调优?”****
每个模型的参数是不同的,因此我不能在这里讨论每个模型的参数。留意参数的选择始终是数据科学家的工作。它应该从对模型算法和模型文档的理解开始。
在这篇文章中,我将只给留下一些关于 GBDT 模型、xgboost、lightbgm 和 catboost** 的资源,这些模型我曾经讨论为的入门模型。**
Laurae ++的这个网页 对于 xgboost/lightgbm 来说一直是一个很棒的起点。
- 你可以找到每个参数的描述,典型值,允许范围,变化的影响等。字面上的大量信息。
- 它们不包括 catboost(截至 2019 年 12 月 7 日)。
Laurae++, a descently-designed information-rich web site about hyperparameters of xgboost and lightgbm ( https://sites.google.com/view/lauraepp/parameters)
解析维迪亚 也提供了关于 GBDT 模型超参数的丰富内容:
- xgboost : 《使用 Python 代码在 xgboost 中进行参数调整的完整指南》
- Light GBM::Light GBM vs XGBOOST 哪个算法取冠?”
一旦你开始谷歌搜索,还有许多其他随机的网页。这是我从《数据科学》杂志上找到的一篇文章,它提供了三种主要 GBDT 车型的对比列表。
- “使用 Hyperopt 在 XGBoost、LightGBM 和 CatBoost 上进行超参数优化的示例”
下面的图表总结了我对分级重要性中哪些参数是重要的、它们有利的基线选择和调整范围的看法。
List of important hyperparameters of three GBDT models, their baseline choice and tuning range.
(对于表格开发,我的朋友兼同事丁玉轩给了我很好的建议。谢谢大家!)
使用 Python 包建模 GBDT 的人通常使用原始函数版本(“原始 API”)或 sklearn 包装器版本(“sklearn API”),这使得函数的使用等同于其他 sklearn ML 模型 API。
大多数情况下,你可以根据自己的喜好选择任何一个,但请记住,除了 catboost 包,original API 和 sklearn API 可能会有不同的参数名,即使它们表示相同的参数。我在上面的总结中包含了两个参数名称。
2.超参数调整的四种基本方法
#1 手动调谐
通过手动调整,基于当前选择的参数和它们的得分,我们改变它们中的一部分,再次训练模型,并检查得分的差异,而不使用自动选择参数来改变新参数的值。
****手动调谐的优点是:
- 您可以记住超参数的行为,并在另一个项目中使用您的知识。因此,我建议至少对主要型号进行一次手动调优。
****缺点是:
- 需要手工操作。
- 你可能会过度思考乐谱的意外移动,而没有尝试很多次并检查它是否是广义的移动。
书中给出了一些手动调谐的例子:
- 当你发现有太多无用的变量输入到模型中时,你就增加正则化参数的权重。
- 当你认为变量间的相互作用在模型中没有被考虑很多时,你可以增加分裂的次数(GBDT 案例)。
一旦您了解了下面讨论的其他方法,您可能会说,如果远不是达到全局最佳参数的最佳方法,我们为什么要进行手动调整,但在实践中,这在早期阶段很好地用于了解对超参数变化的敏感度,或在最后阶段进行调整。
另外,令人惊讶的是,许多顶尖的 Kagglers 更喜欢使用手动调谐来进行网格搜索或随机搜索。****
#2 网格搜索
****网格搜索是一种方法,我们从准备候选超参数集开始,为每个候选超参数集训练模型,并选择性能最佳的超参数集。
通常通过 [sklearn.model_selection](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html)
的[GridSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html)
等支持库自动完成参数设置和评估。
****这种方法的优点是:
- 您可以涵盖所有可能的预期参数集。无论你多么坚信其中一套是最可行的,谁知道,邻居可能会更成功。网格搜索不会失去这种可能性。
****缺点在于它是:
- 一个超参数集的一次运行需要一些时间。整个参数集的运行时间可能很长,因此要探索的参数数量有实际限制。
#3 随机搜索
另一方面,随机搜索是一种方法,其中我们像网格搜索一样准备候选超参数集,但是接下来从准备的超参数搜索空间中随机选择超参数集。重复随机选择、模型训练和评估指定的次数,以搜索超参数。最后,选择性能最佳的超参数集。
我们可以通过指定参数的密度函数而不是特定值来控制随机性,例如均匀分布或正态分布。
这里再次说明,设置参数和评估通常是通过 [sklearn.model_selection](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html)
的[RandomizedSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html)
等支持库自动完成的。
****使用随机搜索的优点是:
- 您不必担心运行时间,因为您可以控制参数搜索的数量。
****缺点是:
- 应该有一些妥协,最终选择的超参数集可能不是您在搜索中输入的范围之外的真正最佳值。
- 根据搜索次数和参数空间的大小,有些参数可能没有被充分研究。
The ‘world famous’ grid search vs. random search illustration by James Bergstra James, Yoshua Bengio on “Random Search for HyperParameter Optimization” ( http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf)
#4 贝叶斯优化
贝叶斯优化 的基本概念是“如果我们随机搜索一些点,并且知道其中一些点比其他点更有希望,为什么我们不在它们周围再看一看?”
在贝叶斯优化中,它从随机开始,基于贝叶斯方法缩小搜索空间。
如果你知道贝叶斯定理,你可以理解它只是通过开始随机搜索将关于可能超参数的信念的先验分布更新为后验分布。
Illustration of Bayesian optimization. Based on the Bayesian update next try will happen on star point in the bottom chart ( https://github.com/fmfn/BayesianOptimization)
贝叶斯优化方法的优势在于:
- 搜索是潜在有效的(但不一定)。
缺点是:
- 可能陷入局部最优。
做贝叶斯优化常见的有两个 python 库,[hyperopt](https://github.com/hyperopt/hyperopt)
和[optuna](https://github.com/optuna/optuna)
。还有其他名字如[gpyopt](https://github.com/SheffieldML/GPyOpt)
、[spearmint](https://github.com/JasperSnoek/spearmint)
、[scikit-optimize](https://scikit-optimize.github.io/)
。
下面是使用hyperopt
的示例代码。
Bayesian Versus Frequentist ( https://irsae.no/blog-report-international-summer-school-on-bayesian-modelling/)
3.超参数调整和交叉验证中的折叠
在上面讨论的任何超参数调整方法中,为了避免过拟合,首先对数据进行折叠,对训练折叠数据和非折叠数据重复训练和验证,这一点很重要。
此外,如果在交叉验证中继续使用相同的褶皱分割(以便比较模型),那么您的具有选定超参数的模型可能过度拟合褶皱,但没有机会识别它。
因此,通过更改随机数种子,将折叠分割从超参数调整更改为交叉验证非常重要。
另一种方法可能是做 嵌套交叉验证 。在嵌套交叉验证中,有两个层次交叉验证循环:外部和内部。
Nested cross-validation
嵌套交叉验证的一个巨大缺点是,它显著增加了运行时间,增加了内循环折叠的次数。我个人觉得做嵌套的交叉验证太多了,对于额外的运行时间来说好处不大,即使在 Kaggle 竞争中也不是主流。
4.结论
我们在超参数调整中采用的方法将随着建模阶段的发展而发展,首先通过手动或网格搜索从少量参数开始,随着模型随着有效特征的增加而变得更好,通过随机搜索或贝叶斯优化查看更多参数,但我们如何做没有固定的规则。
模型会有很多超参数,因此找到重要的参数及其搜索范围并不是一件容易的事情。然而,像 GBDT 家族这样受欢迎的模型是精心制作的,我们对它们知道得足够多,知道从哪里开始和去哪里。
我们必须担心数据折叠不会过度拟合模型,那么必须将折叠分割从超参数调整更改为模型选择交叉验证。
如果你发现遗漏了什么,请告诉我。它将帮助我改进这个总结,为读者提供更好的信息!
使用 Scikit-Learn 在 Google 云平台上调整超参数
原文:https://towardsdatascience.com/hyperparameter-tuning-on-google-cloud-platform-with-scikit-learn-7d6155195efb?source=collection_archive---------13-----------------------
谷歌云平台的 AI 平台(原 ML Engine)为你的模型提供超参数调优服务。为什么要花费额外的时间和精力去学习如何使用它,而不是仅仅在虚拟机上运行您已经拥有的代码呢?这些好处值得付出额外的时间和精力吗?
使用它的一个原因是人工智能平台提供了开箱即用的贝叶斯优化。它比网格搜索更有效,从长远来看,也比随机搜索更准确。他们还提供提前停止和恢复已完成的培训工作的能力。如果你认为你第一次没有进行足够的试验,这允许你使用过去的数据进行一些更好的试验。
所有这些都有助于加快超参数调整过程,同时比网格搜索或随机搜索更好地找到最佳匹配。当经常对大量数据进行训练或运行大量实验时,它肯定可以节省金钱和时间。
Stochastic Gradient Descent Visualized Source
和往常一样,我所有的代码都可以在我的 git hub 页面上找到。在讲述了如何在 GCP 上运行超参数调优工作之后,我将比较他们提供的三台预定义机器的培训时间和成本。
我还将展示如何从 api 自动检索训练运行中的最佳超参数。然后,您可以将它们直接传递到您的生产模型中,或者如果您正在运行实验,请将它们保存在 Google 云存储上的 csv 文件中、BigQuery 中的一个表中或任何您希望稍后进行分析的地方。
那么什么是超参数优化的贝叶斯优化呢?超参数调整是一个优化问题,这意味着确切的性质是未知的,并且计算起来很昂贵,因此以一种知情的方式进行将是有益的。
当函数的数学形式未知或者计算起来很昂贵时,贝叶斯优化是一种非常强大的技术。其背后的主要思想是基于数据计算目标函数的后验分布(使用著名的贝叶斯定理),然后选择好的点来尝试这个分布。来源
这意味着,随着更多的试验运行和后验分布开始改善,最有成效的超参数值开始出现。因此,通过根据模型所获得的信息对未来惠普价值做出明智的决策,我们可以加快找到最佳匹配的过程。要了解更多关于贝叶斯统计的知识,请查阅这本的书。
Photo by Jose Antonio Gallego Vázquez on Unsplash
在 GCP 上提交超参数调整工作有 4 个主要部分:
- 一个训练文件,其中包含您想要使用的模型的常用代码,以及您想要用来评估模型的分数。它还包括一个参数解析器,可以为每次试验添加不同参数的 hp 值
- 包含要在训练文件中使用的超参数值的 yaml 文件
- 提交培训作业的 shell 可执行文件
- 安装附加依赖项的安装文件
如果你不熟悉在云中或者 GCP 上工作,有一些额外的步骤,但是我认为它们是值得的,一旦你建立了框架,很容易适应不同的模型。
我在这里使用的模型是一个多类文本分类模型,来自我以前的文章。该模型在这里并不重要,但它是随机梯度下降,在此之前有特征创建(tf-idf)和维数减少(LSA)。如果您愿意,也可以调整这些参数的超参数。训练数据已经清理完毕,如下所示:
每个类都有 1,890 个示例,非常平衡。让我们仔细看看运行培训作业所需的每个文件。
培训文件
顶部是参数解析器。这将把每个踪迹的 hp 值从 yaml 文件馈送给估计器。模型的 hp 值将由参数解析器从 yaml 文件中传递,如下所示:
然后我们要从谷歌云存储中下载训练数据。从那里,文本通过 tf-idf 矢量器,我们定义我们的目标和特征,然后我们减少我们的目标的维度。然后通常的训练-测试-拆分,然后我们将训练数据拟合到分类器,并根据测试数据进行预测。
之后,我们定义我们的分数,在这种情况下只是准确性,因为我们有平衡的类。下一步是调用 hypertune 库,在这里我们设置度量以及与度量值相关的全局步长。每次试验后,模型都保存在您指定的 GCS 文件夹中。
超参数配置文件
在这个文件的第一部分,您指定了目标,在我们的例子中是最大化精度。如果你想基于 RMSE 这样的东西进行优化,那么你应该把它设置为最小化。然后,您设置想要运行的试验次数。试验越多越好,但肯定存在收益递减的问题。他们建议将轨迹的数量至少设置为参数数量的 10 倍,在我们的例子中是 50 个。
接下来,您必须指定想要运行的并发试验的数量。并行运行试验减少了运行时间,但在使用贝叶斯优化时也会降低效率。这是因为它使用先前试验的结果来通知后续试验的 hp 值。
然后,您必须传入 hp metric 标记,最后您还可以启用早期停止,这将在试验明显没有成效时停止试验,从而节省时间。之后,你为每个 hp 定义最小/最大值或不同的类型/类别,这是非常直接的,本质上就是你在网格搜索中所做的。
然后你必须定义你希望每个参数发生什么。当你有一个范围的值要研究时,你可以传入离散值,就像我在这里对“n_components”所做的那样,或者给定一个最小/最大范围,让它遍历并缩放这些值以线性搜索。如果您要搜索的空间非常大,它们还有一个对数刻度和一个反向对数刻度选项。对于分类 1,你必须传递那些谨慎的值。
你也可以选择指定一个搜索算法。如果你没有,它默认为贝叶斯优化。其他选择是网格搜索或随机搜索,所以你也可以这样做。这也是您可以通过使用“resumePreviousJobId”字段并传入作业 Id 来恢复更早的试验的地方,如果您认为更多的试验是值得的。
安装文件
这只是下载了我们需要的 hypertune 库依赖项。如果你需要其他不能直接下载到 AI 平台的依赖项,你可以在这里添加。这里我们唯一需要的是 hypertune 库。
命令过程
这包含了我们提交培训作业所需的变量和 gcloud 命令。就变量而言,“bucket name”是您希望将模型下载到的 bucket,“job directory”是您希望将模型保存到的 bucket 中的文件夹。为“作业名”添加时间戳是一个好的做法,以便将来识别。
“培训包路径”是您在 GCP 上保存文件的文件夹,而“主培训师模块”是带有模型和参数解析器的文件。您还需要设置 AI 平台的运行时版本、python 版本、区域、规模层以及指向 hp config yaml 文件的位置。
然后实际的 gcloud 命令运行训练作业,该作业使用我们定义的上述变量。最后一部分是一个可选命令,如果您想将日志流式传输到控制台,但是您当然可以在此时关闭 shell 并执行其他操作。
把所有东西放在一起
打开 GCP 上的代码编辑器,打开外壳,点击右下角的“笔”图标:
GCP 有一个内置的代码编辑器,这里的任何代码都可以很容易地推到一个云源代码库进行版本控制。当你打开它,你会看到你已经有一个文件夹与你的用户名。
创建一个培训作业文件夹,并随意命名。在主培训作业文件夹中,为培训文件和 yaml 配置文件创建一个子文件夹。您还需要添加一个空的“init”文件,这也是我放置 shell 脚本的地方。在主培训文件夹中是放置安装文件的位置。
接下来,将训练数据上传到云存储桶。你可以通过用户界面做到这一点。我使用的存储桶名称是“training_jobs_bucket ”,但是您可以使用任何您喜欢的名称。
现在,我们准备运行培训作业。假设您已经为在 AI 平台上运行培训作业做好了一切准备,您只需打开 shell 并输入以下命令来运行 shell 脚本:
chmod +x training_job_folder/trainer/submit_hp_job.sh
training_job_folder/trainer/submit_hp_job.sh
就是这样。您的作业现在将运行,您可以在 GCP 的 AI 平台部分检查输出。
它将显示每个试验的精确度从高到低排序,以及该试验的 hp 值。
人工智能平台也有一个 api,你也可以从那里得到结果。这样,您可以将最佳参数直接传递到您的生产模型中,或者您可以轻松地分析实验结果。这里有一个如何做到这一点的例子:
对于凭证,我使用一个服务帐户并提供凭证 json 文件的路径。然后只需提供项目 id 和作业名称。然后提出要求。返回的第一个对象将是最佳超参数。
我用三种不同的标准机器类型(基本型、标准型和高级型)进行了三次不同的测试。除了这三个预定义的层,他们还有带 GPU 和 TPU 的机器,您可以随时创建自定义机器。
使用相同的 hp 值运行了 50 次试验,启用了提前停止,并且我没有运行任何并发试验。如上所述,运行并发试验会加快进程,但这并不是我真正关心的。最后,毫不奇怪,所有三次运行都产生了大约 86%的最高准确率。
计算这些工作之一成本的公式是:
(Price per hour / 60) * job duration in minutes
- 基本:(. 19/60)* 432 = 1.37 美元
- 标准 _ 1:(1.988/60)* 194 = 6.43 美元
- premium _ 1:(16.5536/60)* 222 = 61.25 美元
有趣的是,高级层实际上比标准层花费的时间更长,而且成本几乎是标准层的 10 倍。这可能有几个原因,我启用了提前停止,所以在标准运行中可能有一些试验被提前停止,但在高级运行中没有。我也没有运行并发试验,所以我不知道在这种情况下标准会比溢价有多大优势。
与 standard 相比,Premium 拥有更大的主机(16 个 vcpu 对 8 个 vcpu),但真正的区别在于工作线程的数量(19 个对 4 个)和参数服务器的数量(11 个对 3 个)。所以你应该自己去探索这个问题,你不应该只是假设 premium 会给你最快的结果,这真的取决于你想要达到的目标。
结论
要使用 hyperparameter 服务,您还需要做更多的工作和一点点的学习曲线,但总的来说,我认为这是值得的,我自己也会继续使用它。很多事情,比如实现贝叶斯优化和记录结果,都是为你处理的。我真的很喜欢贝叶斯方法来调整,如果这在训练大量数据或运行大量实验时节省了我的时间,那么这里的额外努力对我来说绝对是值得的。
在 Keras 中使用回调进行超参数调优
原文:https://towardsdatascience.com/hyperparameter-tuning-with-callbacks-in-keras-5230f51f29b3?source=collection_archive---------10-----------------------
通过可视化梯度下降调整超参数的简单方法
为什么这很重要?
本文展示了一种简单的方法,通过在 Keras 中使用回调访问模型权重来调整超参数。
应用机器学习是一个经验过程,您需要尝试不同的超参数设置,并推断哪些设置最适合您的应用。
这种技术通常被称为超参数调谐。
这些超参数可以是学习率(alpha)、迭代次数、最小批量等。
目标
通常通过在连续迭代中观察成本函数的趋势来执行调整。一个好的机器学习模型具有不断降低的成本函数,直到某个最小值。
本文展示了一种简单的方法,借助等高线图、为 Keras 模型可视化成本函数的最小化。
在我们的例子中,我们将考虑一个单变量线性回归问题,该问题根据花在广告上的钱数来预测特定产品的销售额。
注意:虽然选择的问题相当简单,但这项技术也适用于深度神经网络。
背景
成本函数和梯度下降
成本函数是根据模型估计输入和相应输出之间关系的能力来衡量模型错误程度的方法。
简单来说..
“你的模型表现有多差”
另一方面,梯度下降是一种通过重复更新网络的参数值来最小化成本函数的技术。
梯度下降的目标可以被认为是…
“反复调整参数,直到达到局部最小值”
线性回归的成本函数通常是均方误差,在这里有很好的解释。
问题描述
Advertising.csv 文件包含分配给各种来源(电视、广播、、报纸)的广告预算及其对特定产品销售的影响。
由于我们的重点是单变量回归,我们将只考虑分配给 TV 的预算作为我们的独立变量。
本文的代码和数据可以在这里找到。
在将 csv 文件加载到一个 pandas dataframe 中并删除不必要的列之后…
df = pd.read_csv(‘path/to/file/Advertising.csv’)
df.drop([‘Unnamed: 0’,’radio’,’newspaper’],axis = 1 , inplace=True)
X = df[‘TV’]
Y = df[‘sales’]
df.head()
…最终的数据帧将是这样的
Advertising Data Set
后来,我们将数据分成训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,
test_size = 0.2)
现在,请注意,Keras 并没有明确提供像 scikit-learn 这样的线性回归模型。但是我们可以用单个神经元的密集层来模拟线性回归。
model = Sequential()
model.add(Dense(1, activation = ‘linear’, use_bias = True,
input_dim = 1))
model.compile(optimizer = optimizers.RMSprop(lr = 0.01),
loss = ‘mean_squared_error’, metrics = [‘mae’])
设计的模型看起来会像…
Univariate Linear Regression “Network”
训练模型,我们得到一个相当令人满意的预测图…
绘制成本函数
线性回归的成本函数由下式给出
从等式中可以清楚地看出,我们对可视化成本最小化的要求是每次迭代后更新的图层的权重(和偏差)。
如果我们能够以某种方式访问图层的权重,我们将能够轻松地可视化成本最小化/梯度下降。
Keras 提供了一个 get_weights() 函数供用户访问网络层的权重。
model.get_weights()
但是该函数在训练后返回模型的最终权重(和偏差)。
我们需要一种方法来访问每次迭代(或每批)结束时的权重。
为此,我们将利用一个回调。
在 Keras 中定义回调
Keras 回调帮助您更快地修复 bug 并构建更好的模型。
“回调是在训练过程的给定阶段应用的一组函数。您可以在训练期间使用回调来查看模型的内部状态和统计数据。
这正是我们所需要的,因为现在我们可以在每次小批量之后(即每次迭代之后)获得 _weights()。重量存储在一个重量历史列表中,以备后用。还为偏差项维护了一个单独的列表。
weight_history = []
bias_history = []
class MyCallback(keras.callbacks.Callback):
def on_batch_end(self, batch, logs):
weight, bias = model.get_weights() B = bias[0]
W = weight[0][0]
weight_history.append(W)
bias_history.append(B)callback = MyCallback()
创建的回调与用于训练模型的输入和输出一起传递。
model.fit(X_train, Y_train, epochs = 10, batch_size = 10,
verbose = True, **callbacks=[callback]**)
现在,存储的权重可用于绘制关于权重(W)和偏差(B)的成本函数(J)。
等高线图仅根据重量历史和偏差历史绘制。这里不需要计算成本函数。
解读等高线图
等高线图的基本直觉是,连续的线代表恒定的量值(称为等高线),并且量值随着我们从图的中间部分到向外部分而增加。
等高线的大小已经给出,在这里,它表示成本函数(J)的可能值。您可以大致观察到,成本(红线)从接近 5000 开始,并继续下降,直到在特定点停止。
这与损失函数值相对应,损失函数值也被认为是均方误差。
注意:两个图之间的误差是由于均方误差(如上)是根据验证分割计算的,而等高线图是使用整个训练数据绘制的。
什么也有用?
如上所述,绘制迭代损失函数也可用于超参数调整。事实上,这是数据科学家最常用的技术。
为什么要使用等高线图?
等高线图提供的优势在于,它们给出了关于梯度下降算法在迭代中更新模型/网络参数所遵循的轨迹的更好的直觉。
最后…
因为我们已经获得了模型参数,所以观察它们随时间变化的趋势是值得的。
Weight vs. Time
Bias vs. Time
因此,可以观察到我们的模型的权重和偏差达到成本函数的局部最小值所遵循的趋势。
现在,您已经可以访问所有的图,您可以有效地检查您的模型是否学习缓慢或超调(学习率),是否小批量产生可观察到的好处,理想的迭代次数(或甚至是时期)等。
深度学习中的超参数
原文:https://towardsdatascience.com/hyperparameters-in-deep-learning-927f7b2084dd?source=collection_archive---------4-----------------------
超参数调音就像调音你的吉他。然后奇迹发生了!
Photo by Roberta Sorge on Unsplash
当你处于学习阶段时,为你的吉他调音是至关重要的,因为你正在创造不同感官之间的联系。你的耳朵、手指和眼睛都在学吉他。习惯吉他走音就像养成了一个坏习惯,一个会破坏你爱上吉他学习过程的整个体验的习惯。
给你的吉他调音真的可以帮助你爱上吉他。机器学习和深度学习的超参数调整也是如此
超参数是我们在将学习算法应用于数据集之前需要设置的变量。
超参数的挑战在于,不存在放之四海而皆准的神奇数字。最佳数字取决于每个任务和每个数据集
超参数可分为两类:
1)优化器超参数
- 1.1 —学习率
- 1.2 —小批量
- 1.3 —历元数
2)模型特定超参数
- 2.1 —隐藏单元的数量
- 2.2 —第一层
- 2.3 —层数
1.优化程序超参数
它们更多地与优化和训练过程相关
1.1 学习率:
一个最重要的超参数,你应该始终确保它已被调整 Yoshua Bengio
良好的起点= 0.01
如果我们的学习率比最优值小,那么将需要更长的时间(数百或数千个)才能达到理想状态
或者,另一方面
如果我们的学习速率比最优值大得多,那么它将超过理想状态,并且我们的算法可能不收敛
这只是一个例证。在现实世界中,事情要复杂得多。
a)您的模型将有成百上千个参数,每个参数都有自己的误差曲线。学习率必须指导他们所有人
b)误差曲线不是整齐的 u 形。它们有更复杂的局部极小值形状
1.2 小批量尺寸:
批量大小对训练过程的资源需求、速度和迭代次数有影响,这种影响可能不像你想的那么微不足道
在历史上,有一个关于进行随机训练的争论,其中您将数据集的单个示例拟合到模型,并且仅使用一个示例,进行正向传递,计算误差,然后反向传递,并为所有超参数设置调整值。然后对数据集中的每个示例重复此操作。
或者,最好将整个数据输入训练步骤,并使用通过查看数据集中的所有示例而生成的误差来计算梯度。这被称为批量训练
目前常用的方法是设置一个小批量。
随机训练是指小批量=1,批量训练是指小批量=训练集中的样本数
推荐的实验起始值
1, 2, 4, 8, 16, 32, 64, 128, 256
较大的迷你批次大小允许在训练计算中利用矩阵乘法来提高计算能力,但这是以训练过程需要更多存储器为代价的。
较小的小批量会在误差计算中引入更多噪声,并且通常更有助于防止训练过程停止在局部最小值。
小型批量的良好价值= 32
因此,虽然计算能力的提升激励我们增加迷你批次的大小,但这种实际的算法优势激励我们实际上让它变得更小
1.3 历元数:
为了给我们的训练步骤选择正确的历元数,我们应该关注的度量是验证误差。
直观的手动方法是,只要验证误差不断减小,就让模型训练尽可能多的迭代次数。
有一种技术叫做提前停止来决定什么时候停止训练模型。如果验证误差在过去 10 或 20 个时期内没有改善,则停止训练过程
2.模型超参数
他们更多地参与到模型的结构中
2.1 隐藏单元数量:
隐藏单元数是其中最神秘的超参数之一。
神经网络是通用函数逼近器,对于学习逼近函数(或预测任务)的网络,它需要有足够的“能力”来学习函数
隐单元的数量是衡量模型学习能力的主要指标
‘Learning Capacity’ for a Simple Function
对于一个简单的函数,它可能需要较少数量的隐藏单元。
函数越复杂,模型需要的学习能力就越强
‘Learning Capacity’ for a Complex Function
单位数量略多于最佳数量不是问题,但数量大得多会导致模型过度拟合,即如果您提供的模型容量过大,它可能会过度拟合,并试图记住数据集。
2.2 第一个隐藏层:
涉及第一隐藏层的另一个启发是,已经观察到,将隐藏单元的数量设置为大于输入的数量会在任务数量上给出更好的结果。
2.3 层数:
Andrej Karpathy 在他的博客中告诉我们,在实践中,3 层神经网络往往会优于 2 层网络。但是更深入的研究很少会有更大的帮助。
卷积神经网络是一个例外,它越深入,性能越好。
感谢阅读!
- 如果你喜欢这个,关注我的 medium 了解更多。
- 你的掌声对你写更多、写得更好是一个巨大的鼓励和动力。
- 有兴趣合作吗?我们在 Linkedin 上连线吧。
- 请随意写下您的想法/建议/反馈。
参考资料: Udacity_DeepLearning
超参数优化
原文:https://towardsdatascience.com/hyperparameters-optimization-526348bb8e2d?source=collection_archive---------0-----------------------
介绍如何使用随机搜索、自动超参数调整和人工神经网络调整等技术来微调机器和深度学习模型。
介绍
机器学习模型由两种不同类型的参数组成:
- 超参数 =用户在开始训练前可以任意设置的所有参数(如随机森林中的估计数)。
- 模型参数= 改为在模型训练期间学习(如神经网络中的权重、线性回归)。
模型参数定义了如何使用输入数据来获得期望的输出,并在训练时学习。相反,超参数首先决定了我们的模型是如何构建的。
机器学习模型调整是一种优化问题。我们有一组超参数,我们的目标是找到它们值的正确组合,这可以帮助我们找到函数的最小值(例如损失)或最大值(例如精度)(图 1)。
当比较不同的机器学习模型在数据集上的表现时,这可能特别重要。事实上,举例来说,将具有最佳超参数的 SVM 模型与未经优化的随机森林模型进行比较是不公平的。
在本帖中,将解释以下超参数优化方法:
- 手动搜索
- 随机搜索
- 网格搜索
- 自动超参数调整(贝叶斯优化,遗传算法)
- 人工神经网络调整
Figure 1: ML Optimization Workflow [1]
为了演示如何在 Python 中执行超参数优化,我决定对信用卡欺诈检测 Kaggle 数据集执行完整的数据分析。在本文中,我们的目标是正确分类哪些信用卡交易应该被标记为欺诈或真实(二元分类)。该数据集在发布前已被匿名化,因此,大部分特征的含义尚未公开。
在这种情况下,我决定只使用数据集的一个子集,以便加快训练时间,并确保在两个不同的类之间实现完美的平衡。此外,只有有限数量的功能被用来使优化任务更具挑战性。最终的数据集如下图所示(图 2)。
Figure 2: Credit Card Fraud Detection Dataset
本文中使用的所有代码(以及更多!)可以在我的 GitHub 库和 Kaggle 个人资料中找到。
机器学习
首先,我们需要将数据集分为训练集和测试集。
在本文中,我们将使用随机森林分类器作为优化模型。
随机森林模型由大量不相关的决策树组成,这些决策树连接在一起构成一个集合。在随机森林中,每个决策树做出自己的预测,并且选择整体模型输出作为最频繁出现的预测。
我们现在可以开始计算我们的基本模型精度。
[[110 6]
[ 6 118]]
precision recall f1-score support
0 0.95 0.95 0.95 116
1 0.95 0.95 0.95 124
accuracy 0.95 240
macro avg 0.95 0.95 0.95 240
weighted avg 0.95 0.95 0.95 240
使用带有默认 scikit-learn 参数的随机森林分类器可获得 95%的总体准确率。现在让我们看看应用一些优化技术是否可以获得更高的精度。
手动搜索
当使用手动搜索时,我们根据我们的判断/经验选择一些模型超参数。然后,我们训练该模型,评估其准确性,并再次开始该过程。重复这一循环,直到达到令人满意的精确度。
随机森林分类器使用的主要参数是:
- 标准 =用于评估分割质量的函数。
- max_depth =每棵树允许的最大层数。
- max_features =分割节点时考虑的最大特征数。
- min_samples_leaf =可以存储在树叶中的最小样本数。
- min_samples_split =节点中导致节点分裂所需的最小样本数。
- n_estimators =集合中的树的数量。
关于随机森林参数的更多信息可以在 scikit-learn 文档中找到。
作为手动搜索的一个例子,我试图在我们的模型中指定估计量的数量。不幸的是,这并没有带来任何准确性的提高。
[[110 6]
[ 6 118]]
precision recall f1-score support
0 0.95 0.95 0.95 116
1 0.95 0.95 0.95 124
accuracy 0.95 240
macro avg 0.95 0.95 0.95 240
weighted avg 0.95 0.95 0.95 240
随机搜索
在随机搜索中,我们创建超参数网格,并在这些超参数的一些随机组合上训练/测试我们的模型。在这个例子中,我还决定对训练集执行交叉验证。
当执行机器学习任务时,我们通常将数据集分为训练集和测试集。这样做是为了在训练模型后测试我们的模型(这样我们可以检查它在处理未知数据时的性能)。当使用交叉验证时,我们将训练集分成 N 个其他分区,以确保我们的模型不会过度拟合我们的数据。
最常用的交叉验证方法之一是 K 倍验证。在 K-Fold 中,我们将我们的训练集分成 N 个分区,然后使用 N-1 个分区迭代地训练我们的模型,并用剩余的分区对其进行测试(在每次迭代中,我们都改变剩余的分区)。一旦对模型进行了 N 次训练,我们就对每次迭代中获得的训练结果进行平均,以获得我们的总体训练性能结果(图 3)。
Figure 3: K-Fold Cross-Validation [2]
在实现超参数优化时使用交叉验证非常重要。通过这种方式,我们可以避免使用一些超参数,这些超参数对训练数据非常有效,但对测试数据却不太有效。
我们现在可以开始实现随机搜索,首先定义一个超参数网格,当调用RandomizedSearchCV()时,将随机采样该网格。对于这个例子,我决定将我们的训练集分成 4 个部分( cv = 4 ),并选择 80 作为要采样的组合数( n_iter = 80 )。使用 sci kit-learnbest _ estimator _属性,我们可以检索在训练期间表现最佳的一组超参数来测试我们的模型。
一旦训练了我们的模型,我们就可以想象改变它的一些超参数会如何影响整体模型的准确性(图 4)。在这种情况下,我决定观察改变估计量的数量和标准如何影响我们的随机森林精度。
Figure 4: Criterion vs N Estimators Accuracy Heatmap
然后,我们可以通过使我们的可视化更具互动性来更进一步。在下面的图表中,我们可以检查(使用滑块)在考虑所选 min_split 和 min_leaf 参数的情况下,改变模型中估计量的数量会如何影响模型的整体准确性。
通过更改 n_estimators 参数、放大和缩小图表、更改其方向以及将鼠标悬停在单个数据点上来获得有关它们的更多信息,您可以随意摆弄下面的图表!
如果你有兴趣了解更多关于如何使用 Plotly 创建这些动画,我的代码可以在这里找到。此外, Xoel López Barata 写的一篇文章也谈到了这一点。
我们现在可以使用随机搜索来评估我们的模型表现如何。在这种情况下,与我们的基本模型相比,使用随机搜索可以持续提高准确性。
[[115 1]
[ 6 118]]
precision recall f1-score support
0 0.95 0.99 0.97 116
1 0.99 0.95 0.97 124
accuracy 0.97 240
macro avg 0.97 0.97 0.97 240
weighted avg 0.97 0.97 0.97 240
网格搜索
在网格搜索中,我们建立超参数网格,并在每个可能的组合上训练/测试我们的模型。
为了选择在网格搜索中使用的参数,我们现在可以看看哪些参数最适合随机搜索,并基于它们形成一个网格,看看我们是否可以找到更好的组合。
网格搜索可以使用 scikit-learnGridSearchCV()函数在 Python 中实现。也是在这个场合,我决定把我们的训练集分成 4 折( cv = 4 )。
使用网格搜索时,会尝试网格中所有可能的参数组合。在这种情况下,训练时将使用 128000 个组合(2×10×4×4×10)。相反,在之前的网格搜索示例中,只使用了 80 种组合。
[[115 1]
[ 7 117]]
precision recall f1-score support
0 0.94 0.99 0.97 116
1 0.99 0.94 0.97 124
accuracy 0.97 240
macro avg 0.97 0.97 0.97 240
weighted avg 0.97 0.97 0.97 240
与随机搜索相比,网格搜索速度较慢,但它总体上更有效,因为它可以遍历整个搜索空间。相反,随机搜索可能会更快,但可能会错过搜索空间中的一些重要点。
自动超参数调谐
当使用自动超参数调整时,使用诸如贝叶斯优化、梯度下降和进化算法的技术来识别要使用的模型超参数。
贝叶斯优化
使用 Hyperopt 库可以在 Python 中执行贝叶斯优化。贝叶斯优化使用概率来寻找函数的最小值。最终目标是找到一个函数的输入值,它能给我们提供尽可能低的输出值。
贝叶斯优化已被证明比随机、网格或人工搜索更有效。因此,贝叶斯优化可以在测试阶段带来更好的性能,并减少优化时间。
在 Hyperopt 中,给函数 fmin() 三个主要参数,可以实现贝叶斯优化。
- 目标函数 =定义最小化的损失函数。
- 域空间 =定义要测试的输入值的范围(在贝叶斯优化中,该空间为每个使用的超参数创建一个概率分布)。
- 优化算法 =定义用于选择最佳输入值的搜索算法,以便在每次新的迭代中使用。
另外,还可以在 fmin() 中定义要执行的最大求值次数。
贝叶斯优化可以通过牢记过去的结果来选择输入值,从而减少搜索迭代的次数。通过这种方式,我们可以从一开始就将我们的搜索集中在与我们期望的输出更接近的值上。
我们现在可以使用 fmin() 函数运行我们的贝叶斯优化器。首先创建一个 Trials() 对象,以便以后能够可视化 fmin() 函数运行时发生的情况(例如,损失函数如何变化,以及使用的超参数如何变化)。
100%|██████████| 80/80 [03:07<00:00, 2.02s/it, best loss: -0.9339285714285713]{'criterion': 1,
'max_depth': 120.0,
'max_features': 2,
'min_samples_leaf': 0.0006380325074247448,
'min_samples_split': 0.06603114636418073,
'n_estimators': 1}
我们现在可以检索识别的最佳参数集,并使用训练期间创建的 最佳 字典测试我们的模型。一些参数已经使用索引数字存储在 best 字典中,因此,在将它们输入到我们的随机森林之前,我们需要首先将它们转换回字符串。
使用贝叶斯优化的分类报告如下所示。
[[114 2]
[ 11 113]]
precision recall f1-score support
0 0.91 0.98 0.95 116
1 0.98 0.91 0.95 124
accuracy 0.95 240
macro avg 0.95 0.95 0.95 240
weighted avg 0.95 0.95 0.95 240
遗传算法
遗传算法试图将自然选择机制应用于机器学习环境。它们受到达尔文自然选择过程的启发,因此通常也被称为进化算法。
让我们想象我们用一些预定义的超参数创建 N 个机器学习模型的群体。然后,我们可以计算每个模型的准确性,并决定只保留一半的模型(表现最好的模型)。我们现在可以生成一些子代,这些子代具有与最佳模型相似的超参数,从而再次得到 N 个模型的群体。在这一点上,我们可以再次计算每个模型的准确性,并重复定义数量的代的循环。通过这种方式,只有最好的模型会在流程结束时保留下来。
为了用 Python 实现遗传算法,我们可以使用 TPOT 自动机器学习库。TPOT 建立在 scikit-learn 库的基础上,可用于回归或分类任务。
使用遗传算法确定的训练报告和最佳参数显示在下面的代码片段中。
Generation 1 - Current best internal CV score: 0.9392857142857143
Generation 2 - Current best internal CV score: 0.9392857142857143
Generation 3 - Current best internal CV score: 0.9392857142857143
Generation 4 - Current best internal CV score: 0.9392857142857143
Generation 5 - Current best internal CV score: 0.9392857142857143
Best pipeline: RandomForestClassifier(CombineDFs(input_matrix, input_matrix), criterion=entropy, max_depth=406, max_features=log2, min_samples_leaf=4, min_samples_split=5, n_estimators=617)
我们的随机森林遗传算法优化模型的总体精度如下所示。
0.9708333333333333
人工神经网络(ann)调整
使用 KerasClassifier 包装器,可以像使用 scikit-learn 机器学习模型一样,对深度学习模型应用网格搜索和随机搜索。在下面的例子中,我们将尝试优化我们的一些人工神经网络参数,例如:每层使用多少个神经元,以及使用哪个激活函数和优化器。深度学习超参数优化的更多示例可在此处获得。
Max Accuracy Registred: 0.932 using {'activation': 'relu', 'neurons': 35, 'optimizer': 'Adam'}
使用我们的人工神经网络(ANN)获得的总体准确度可以在下面观察到。
[[115 1]
[ 8 116]]
precision recall f1-score support
0 0.93 0.99 0.96 116
1 0.99 0.94 0.96 124
accuracy 0.96 240
macro avg 0.96 0.96 0.96 240
weighted avg 0.96 0.96 0.96 240
估价
我们现在可以比较所有不同的优化技术在这个给定练习中的表现。总的来说,随机搜索和进化算法表现最好。
Base Accuracy vs Manual Search 0.0000%.
Base Accuracy vs Random Search 2.1930%.
Base Accuracy vs Grid Search 1.7544%.
Base Accuracy vs Bayesian Optimization Accuracy -0.4386%.
Base Accuracy vs Evolutionary Algorithms 2.1930%.
Base Accuracy vs Optimized ANN 1.3158%.
所获得的结果高度依赖于所选择的网格空间和所使用的数据集。因此,在不同的情况下,不同的优化技术会比其他技术表现得更好。
我希望你喜欢这篇文章,谢谢你的阅读!
联系人
如果你想了解我最新的文章和项目,请通过媒体关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:
- 领英
- 个人博客
- 个人网站
- 中等轮廓
- GitHub
- 卡格尔
文献学
[1]超参数优化:自动化算法的解释,Dawid Kopczyk。访问地点:https://dkopczyk.quantee.co.uk/hyperparameter-optimization/
[2]型号选择,ethen8181。访问网址:http://ethen 8181 . github . io/machine-learning/model _ selection/model _ selection . html
假设检验—双尾检验
原文:https://towardsdatascience.com/hypothesis-testing-2-tailed-test-42f0d5ef1071?source=collection_archive---------2-----------------------
在这篇文章中,我们将讨论如何对一个双尾检验进行假设检验。在我之前的帖子中,我已经用例子详细讨论了假设检验以及如何使用无效(H0) 和替代(H1) 假设来验证它。所以,在这篇文章中,我不会去探究假设检验的内容和方法。相反,我们将直接看到如何进行双尾检验,实施这种方法的条件和标准是什么。
所以,让我们直接进入一个问题,看看如何解决它。在解决问题的过程中,我会解释一些必要的概念,让你对这个方法更清楚。
问题陈述:一批学生平均身高 100 cm,标准差 15。然而,Tedd 认为这种情况已经改变,所以他决定测试该批中随机抽取的 75 名学生的身高。样本的平均高度是 105。是否有足够的证据表明平均身高发生了变化?
让我们重申一下执行假设检验的步骤:
- 指定零假设(H0)和替代假设(H1)
- 选择显著性水平(α)
- 找到关键值
- 查找测试统计数据
- 得出你的结论
让我们执行假设检验的第一步,即:
- 指定零假设(H0)和备择假设(H1)
零假设(H0): 这里的零假设指的是目前对总体而言为真的假设。在我们的例子中,这一批学生的平均身高是 100。
H0 : μ = 100
替代假设(H1): 替代假设总是被宣称的东西。“在我们的例子中,Tedd 认为(声明)实际值已经改变”。他不知道平均数是上升了还是下降了,但他相信平均数已经变了,不再是 100 了。
H1: μ ≠100
永远记住,一个替代假设总是用≠或< or >符号表示。请参考下表了解更多信息。
因此,如果另一个假设写有≠符号,这意味着我们将进行双尾检验,因为它可能大于 100 或小于 100,因此是双尾的。
所以,在陈述完无效假设和替代假设之后,是时候进入第二步了:
2。选择显著性水平(α)
显著性水平基本上被定义为曲线尾部的面积。通常,提供了显著性水平,但是如果没有,那么我们需要选择显著性水平。
因此,如果没有提供显著性水平,那么我们将其取为 0.05,因为这是最常见的值。让我们看看这是如何在双尾测试中表现出来的
在上面的曲线中,你可以看到显著性水平是 0.05,两条尾巴是对称的,这意味着它们有相同的面积。这意味着每条尾巴的面积为 0.025。
我们需要在曲线上看到的最后一点是,曲线的总面积是 1%或 100%。由于尾部的总面积等于 0.05,那么曲线中间的面积将是 95%或 0.95。
我们已经陈述了我们的重要性。现在让我们进入第三步
3。找到临界值
临界值基本上是分隔红色阴影区域(尾部区域)和曲线中间区域的 z 值或 t 值。
这里的临界值可以是一个 z 值或一个 t 值。让我们看看在我们的例子中会是什么。
请记住,当向我们提供总体标准差(σ)时,我们将使用 z 值。
我们将在以下情况下使用 t 值:
- 问题陈述中没有给出总体标准差(σ)。
- 抽取或提供的样本量小于 30。
在我们的例子中,我们将使用 z 值作为提供的总体标准差。为了计算 z 值,我们将使用下面给出的 z 表。
我们基本上可以使用几种方法来计算 z 值。
- 正如我们所知,不包括尾部的曲线面积是 0.95 或 95%,这意味着声明的置信水平是 95%。因此,我们可以使用置信度来查找 z 值。
- 我们还可以使用其中一条曲线的面积 0.025 来查找 z 值。
上表中需要注意的一点是“0 和 z 值之间的区域”一栏只不过是置信水平的一半(在我们的例子中是 0.4750)。但是,假设我们有一个上表中没有提供的置信度,那么您需要将该置信度除以 2,并在 Z 表的内部查找该区域,然后在外部查找相应的 Z 得分。
在我们的例子中,如果我们将置信水平除以 2,那么它将是 0.4750。因此,如果您在下表中查找并添加对应于 0.4750 的“z”的行值和列值,则结果为 1.96
所以,我们在曲线右尾的临界值是 1.96,在曲线左尾或低端,低于平均值的是-1.96
拒绝区域
这些临界值之所以如此重要,是因为它将红色区域与曲线中间分开。红色区域称为拒绝区域。
之所以称之为拒绝区域,是因为在下一步中,我们将执行一项测试,该测试将给出样本的 z 值。如果样本 z 值落在任何拒绝区域(红色区域),这意味着我们可以拒绝我们的零假设。现在,让我们进入第 4 步。
4。查找测试统计
这意味着我们将找到样本的 z 值。
z 值=(x-bar-μ)÷(σ÷√[ n])
其中 x-bar =样本平均值= 105
μ =总体平均值= 100
σ =样本的标准偏差= 15
n =样本量= 75
z 值=(105–100)÷(15÷√7.5)= 2.89
这个值 2.89 称为检验统计量。
这是我们的最后一步。
5。得出结论
所以,如果你看曲线,2.89 的值肯定位于曲线右侧的红色区域,因为临界值 1.96 小于 2.89。由于值位于拒绝区域,我们可以拒绝零假设。
结论:
拒绝 H0:μ= 100
接受 H1:也就是μ ≠ 100
因此,根据问题陈述,有足够的证据表明平均身高发生了变化,因为我们能够接受另一个假设,即平均身高不等于 100。
使用 Python 对欧洲足球数据进行假设检验
原文:https://towardsdatascience.com/hypothesis-testing-european-soccer-data-home-field-advantage-ideal-formations-and-inter-league-8af2f6302995?source=collection_archive---------9-----------------------
深入分析
主场优势、理想阵型和联赛间属性
康纳·安德森、凯文·维拉斯科和亚历克斯·什罗普希尔
简介和假设
欧洲足球队在主场比赛存在潜在优势的传统观念有统计学意义吗?哪种阵型的整体胜率更高,4-4-2 还是 4-3-3?当比较英超和法甲的球队属性时,平均而言,哪个联赛的防守侵略性更高?平均来说,哪一个更有能力让球员进入投篮位置?我们的假设测试会产生有价值的、有统计学意义的结论吗,或者只是留给我们更多没有答案的问题?
我们使用了来自 Kaggle.com 的欧洲足球数据库来探索这些假设,给出了一个 sqlite3 数据库,其中有 7 个数据表,涵盖了 2008 年至 2016 年来自 11 个欧洲国家的 25,000 场历史足球比赛,10,000 名球员和球队(球员&球队评级由 EA Sports 评估)。为了从单个统计假设的角度总结我们的方法,我们运行了四个双尾双样本 T 检验,阈值为拒绝或不拒绝每个零假设(alpha=0.05)。为了运行这些测试,我们的数据必须随机抽样,近似正态分布,并且是独立的。我们的测试产生了各种描述性的结果指标和有用的可视化,可以在本文末尾链接的 GitHub 资源库中更详细地查看,但为了简洁起见,我将坚持下面最重要的几点。
测试 1:主队与客队的胜率
H0(零假设):平均值之间无统计学显著差异。主场球队的胜率和平均成绩。客场球队的胜率
HA(替代 Hyp。):平均值之间存在统计上的显著差异。主场球队的胜率和平均成绩。客场球队的胜率
Is there any truth to home-field advantage?
测试 2:4–4–2 与 4–3–3 的成功率
H0:4–4–2 胜率和 4–3–3 胜率在统计上没有显著差异
哈:4–4–2 胜率和 4–3–3 胜率之间存在统计上的显著差异
Blue = 4–4–2 Formation | Red = 4–3–3 Formation
测试 3:防守侵略性评级(英超 vs 法甲)
H0: 两者的平均得分没有统计学上的显著差异。英国队和美国志愿队的防守侵略性评级。法国队防守攻击性评分
HA: 存在着统计学上的显著差异。英国队和美国志愿队的防守侵略性评级。法国队防守攻击性评分
测试 4:射门机会创造评级(英超 vs 法甲)
H0: 平均得分没有统计学上的显著差异。英格兰球队的投篮机会创造率和平均得分。法国队的射门机会创造评分
HA: 平均值之间存在统计学上的显著差异。英格兰球队的投篮机会创造率和平均得分。法国队的射门机会创造评分
流程和挑战概述
SQLite→PostgreSQL→Pandas data frames
Kaggle 以 SQLite 数据库格式提供了 7 个数据表,为了改善团队协作,我们选择通过指示pgloader
从 SQLite 文件加载数据,将数据移动到 PostgreSQL 数据库,这几乎可以完美地工作。 Player 表出现了一个错误,因此我们首先将它转换为 csv 格式,然后使用以下代码直接加载到 DataFrame 中,从而解决了这个问题:
import sqlite3
import pandas as pd
conn = sqlite3.connect('database.sqlite')
df = pd.read_sql_query("SELECT * FROM Player", conn)
df.to_csv('player.csv',index=False)player_df = pd.read_csv('player.csv')
player_df.head()
对于能够完全进入 PostgreSQL 的表,我们通过以下方式将它们加载到 Pandas 数据帧中:
conn = psycopg2.connect('dbname=soccer')
cur = conn.cursor()
query = '''
SELECT *
FROM Country
;'''
cur.execute(query)countries_data = cur.fetchall()
countries_df = pd.DataFrame(countries_data)
countries_df.columns = [i[0] for i in cur.description]
countries_df.head()
主场进球&客场进球栏目→二进制主场胜&客场胜栏目→主场胜率&客场胜率
我们决定利用我们对每支球队在每场比赛中的进球数的了解来创建 2 个二元列,其中 1 代表主队或客场队获胜,0 代表“未获胜”,或球队平局或失败。我们的胜率基本上是指总比赛数中的胜率,它完全基于特定球队在给定比赛中获胜的机会,并不会对输球和平局进行不同的处罚(传统上,联盟对获胜奖励 3 分,平局奖励 1 分,失败奖励 0 分)。如上所述,胜率将通过取这些二进制列的平均值来计算。
#initiate new columns with 0’s (there are other approaches)
match_df['home_team_win'] = np.zeros
match_df['away_team_win'] = np.zeros#set home team WINs equal to 1 in the new column
match_df['home_team_win'].loc[match_df['home_team_goal'] > match_df['away_team_goal']] = 1
#LOSS = 0
match_df['home_team_win'].loc[match_df['home_team_goal'] < match_df['away_team_goal']] = 0
#TIE = 0
match_df['home_team_win'].loc[match_df['home_team_goal'] == match_df['away_team_goal']] = 0
#repeat for away_team_win column#getting to a win rate for the entire dataset
home_team_win_array = np.array(match_df['home_team_win'])
home_win_rate = np.mean(home_team_win_array)
#repeat for away_team_win column
推算检验功效、效应大小和样本量
为了在每次测试中达到我们的理想样本量,我们计算了效应大小(Cohen 的 d ),它考虑了样本数据的平均值和混合方差之间的差异。我们用它来计算达到期望的α水平(0.05)和期望的功率水平(通常在 0.8 左右)所需的最小样本量。总之,这些决定有助于在测试返回 I 型错误(拒绝真 H0-假阳性)或 II 型错误(拒绝假 H0 失败-假阴性)的风险之间取得平衡。令我们惊讶的是,由于样本平均值之间的差异很小,计算表明我们实际上想要更多的样本用于我们的分析,而不是我们现有的样本。因此,在假设检验 2、3 和 4 中,我们检验的功效显著降低,增加了第二类错误的风险。尽管如此,我们还是继续进行测试,但是一个更理想的场景将允许我们在自信地结束测试之前获得更大的统计能力。
自举案例
推断统计学的一个目标是确定总体参数的值,这通常是昂贵的或不可能直接测量的。统计抽样帮助我们克服这一挑战。我们对人口进行抽样,测量一个关于人口的统计数据,并使用它来有希望地说一些关于相应人口的有意义的事情。在我们的第一个假设检验的情况下,我们希望确定主队有一个特定的平均胜率。收集每一场欧洲足球比赛的结果并不容易,因此我们从 2008 年至 2016 年的 25K 场比赛中取样,并说人口的平均胜率在我们样本的平均胜率的误差范围内。
假设我们想更准确地知道那段时间主队的平均胜率是多少,但是我们所能利用的就是这些样本。看起来之前的误差幅度可能是我们最好的猜测。然而,我们可以使用 bootstrapping 来改进这种猜测。为了做到这一点,我们从 25K 个已知匹配中随机抽取替换为的。我们称之为引导样本。通过替换,该引导样本很可能与我们的初始样本不同。一些匹配可能在我们的样本中出现不止一次,而另一些可能被忽略。使用 Python,我们可以快速创建这些引导样本的数千次迭代。bootstrap 方法产生的估计样本通常形成正态分布,我们可以用集中趋势和方差的度量来概括。大致基于大数定律,如果我们一次又一次地取样,我们可以得出一种“小总体”。由于自举和快速计算机的帮助,即使你使用单个样本来生成数据,这也是适用的。
#example of bootstrapping code applied to our home team win binary column
sample_means_home = []
for _ in range(1000): #number of iterations
sample_mean = np.random.choice(home_team_win_array,size=202).mean()
#sample size: 202
sample_means_home.append(sample_mean)
len(sample_means_home) #should be 1000
结论
测试 1:主队与客队的胜率
结论:否决 H0,赞成哈。主队和客场队的胜率有显著差异。主场优势肯定是存在的!下面是我们在假设检验之外创建的一个简单的可视化图,以说明团队和整体数据的情况:
Most teams tend to win more on their home field
测试 2:4–4–2 与 4–3–3 的成功率
结论:拒绝 H0,赞成哈。4–4–2 和 4–3–3 的胜率有显著差异。根据我们的数据,就胜率而言,4–4–2 是更好的阵型,尽管我们可以用更多的样本和/或更大的阵型平均得分差异来进行更强的测试。胜率。
4–4–2 is better on average, but our low power metric (0.67) indicates Type II risk
测试 3:防守侵略性评级(英超 vs 法甲)
结论:拒绝 H0,附带告诫。平均成绩似乎有所不同。英格兰队对法国队的防守侵略性评级(EA Sports),但我们的测试缺乏力量(冒着 II 型错误的风险)。我们不能自信地说 avg 真的有差别。联赛间的防守侵略。我们将能够用更多的样本和/或联盟平均值之间的更大差异来运行更强的测试。
测试 4:射门机会创造评级(英超 vs 法甲)
结论:拒绝 H0,附带警告。平均成绩似乎有所不同。英格兰队对法国队的投篮机会创造评级(EA Sports),但我们的测试缺乏动力(冒着 II 型错误的风险)。我们不能自信地说平均成绩有真正的差异。联赛间的投篮机会创造能力。我们将能够用更多的样本和/或联盟平均值之间的更大差异来运行更强的测试。
感谢您阅读我们简单易懂的欧洲足球假设检验概述!
深入我们的数据、代码和统计测试的细节,探索我们的 GitHub 库: 康纳——凯文——亚历克斯
在 LinkedIn 上与我们联系,分享您的想法和问题,或者关注我们的数据科学之旅: 康纳——凯文——亚历克斯
假设检验欧洲足球数据
原文:https://towardsdatascience.com/hypothesis-testing-european-soccer-data-using-python-af536f94c44a?source=collection_archive---------9-----------------------
Python 中探索的主场优势、理想阵型和联赛间属性
康纳·安德森、凯文·维拉斯科和亚历克斯·什罗普希尔
简介和假设
欧洲足球队在主场比赛存在潜在优势的传统观念有统计学意义吗?哪种阵型的整体胜率更高,4-4-2 还是 4-3-3?当比较英超和法甲的球队属性时,平均而言,哪个联赛的防守侵略性更高?平均来说,哪一个更有能力让球员进入投篮位置?我们的假设测试会产生有价值的、有统计学意义的结论吗,或者只是留给我们更多没有答案的问题?
我们使用了来自 Kaggle.com 的欧洲足球数据库来探索这些假设,给出了一个 sqlite3 数据库,其中有 7 个数据表,涵盖了 2008 年至 2016 年来自 11 个欧洲国家的 25,000 场历史足球比赛,10,000 名球员和球队(由 EA Sports 评估的球员&球队评级)。为了从单个统计假设的角度总结我们的方法,我们运行了四个双尾双样本 T 检验,阈值为拒绝或不拒绝每个零假设(alpha=0.05)。为了运行这些测试,我们的数据必须随机抽样,近似正态分布,并且是独立的。我们的测试产生了各种描述性的结果指标和有用的可视化,可以在本文末尾链接的 GitHub 资源库中更详细地查看,但为了简洁起见,我将坚持下面最重要的几点。
测试 1:主队与客队的胜率
H0(零假设):平均值之间没有统计学上的显著差异。主场球队的胜率和平均成绩。客场球队的胜率
哈(替代 Hyp。):平均值之间存在统计学上的显著差异。主场球队的胜率和平均成绩。客场球队的胜率
Is there any truth to home-field advantage?
测试 2:4–4–2 与 4–3–3 的成功率
H0:4–4–2 的胜率和 4–3–3 的胜率在统计上没有显著差异
HA:4–4–2 胜率和 4–3–3 胜率之间存在统计上的显著差异
Blue = 4–4–2 Formation | Red = 4–3–3 Formation
测试 3:防守侵略性评级(英超 vs 法甲)
H0: 两者的平均得分没有统计学上的显著差异。英国队和美国志愿队的防守侵略性评级。法国队防守攻击性评分
HA: 存在着统计学上的显著差异。英国队和美国志愿队的防守侵略性评级。法国队防守攻击性评分
测试 4:射门机会创造评级(英超 vs 法甲)
H0: 平均得分没有统计学上的显著差异。英格兰球队的投篮机会创造率和平均得分。法国队的射门机会创造评分
HA: 平均值之间存在统计学上的显著差异。英格兰球队的投篮机会创造率和平均得分。法国队的射门机会创造评分
流程和挑战概述
SQLite→PostgreSQL→Pandas data frames
Kaggle 以 SQLite 数据库格式提供了 7 个数据表,为了改善团队协作,我们选择通过指示pgloader
从 SQLite 文件加载数据,将数据移动到 PostgreSQL 数据库,这几乎可以完美地工作。 Player 表出现了一个错误,因此我们首先将它转换为 csv 格式,然后使用以下代码直接加载到 DataFrame 中,从而解决了这个问题:
import sqlite3
import pandas as pd
conn = sqlite3.connect('database.sqlite')
df = pd.read_sql_query("SELECT * FROM Player", conn)
df.to_csv('player.csv',index=False)player_df = pd.read_csv('player.csv')
player_df.head()
对于能够完全进入 PostgreSQL 的表,我们通过以下方式将它们加载到 Pandas 数据帧中:
conn = psycopg2.connect('dbname=soccer')
cur = conn.cursor()
query = '''
SELECT *
FROM Country
;'''
cur.execute(query)countries_data = cur.fetchall()
countries_df = pd.DataFrame(countries_data)
countries_df.columns = [i[0] for i in cur.description]
countries_df.head()
主场进球&客场进球栏目→二进制主场胜&客场胜栏目→主场胜率&客场胜率
我们决定利用我们对每支球队在每场比赛中的进球数的了解来创建 2 个二元列,其中 1 代表主队或客场队获胜,0 代表“未获胜”,或球队平局或失败。我们的胜率基本上是指总比赛数中的胜率,它完全基于特定球队在给定比赛中获胜的机会,不会对输球和平局进行不同的处罚(传统上,联盟对获胜奖励 3 分,平局奖励 1 分,失败奖励 0 分)。如上所述,胜率将通过取这些二进制列的平均值来计算。
#initiate new columns with 0’s (there are other approaches)
match_df['home_team_win'] = np.zeros
match_df['away_team_win'] = np.zeros#set home team WINs equal to 1 in the new column
match_df['home_team_win'].loc[match_df['home_team_goal'] > match_df['away_team_goal']] = 1
#LOSS = 0
match_df['home_team_win'].loc[match_df['home_team_goal'] < match_df['away_team_goal']] = 0
#TIE = 0
match_df['home_team_win'].loc[match_df['home_team_goal'] == match_df['away_team_goal']] = 0
#repeat for away_team_win column#getting to a win rate for the entire dataset
home_team_win_array = np.array(match_df['home_team_win'])
home_win_rate = np.mean(home_team_win_array)
#repeat for away_team_win column
推算检验功效、效应大小和样本量
为了在每次测试中达到我们的理想样本量,我们计算了效应大小(Cohen 的 d ),它考虑了样本数据的平均值和混合方差之间的差异。我们用它来计算达到期望的α水平(0.05)和期望的功率水平(通常在 0.8 左右)所需的最小样本量。总之,这些决定有助于在测试返回 I 型错误(拒绝真 H0-假阳性)或 II 型错误(拒绝假 H0 失败-假阴性)的风险之间取得平衡。令我们惊讶的是,由于样本平均值之间的差异很小,计算表明我们实际上想要更多的样本用于我们的分析,而不是我们现有的样本。因此,在假设检验 2、3 和 4 中,我们检验的功效显著降低,增加了第二类错误的风险。尽管如此,我们还是继续进行测试,但是一个更理想的场景将允许我们在自信地结束测试之前获得更大的统计能力。
自举案例
推断统计学的一个目标是确定总体参数的值,这通常是昂贵的或不可能直接测量的。统计抽样帮助我们克服这一挑战。我们对人口进行抽样,测量一个关于人口的统计数据,并使用它来有希望地说一些关于相应人口的有意义的事情。在我们的第一个假设检验的情况下,我们希望确定主队有一个特定的平均胜率。收集每一场欧洲足球比赛的结果并不容易,因此我们从 2008 年至 2016 年的 25K 场比赛中取样,并说人口的平均胜率在我们样本的平均胜率的误差范围内。
假设我们想更准确地知道那段时间主队的平均胜率是多少,但是我们所能利用的就是这些样本。看起来之前的误差幅度可能是我们最好的猜测。然而,我们可以使用 bootstrapping 来改进这种猜测。为了做到这一点,我们从 25K 个已知匹配中随机抽取替换为的。我们称之为引导样本。通过替换,该引导样本很可能与我们的初始样本不同。一些匹配可能在我们的样本中出现不止一次,而另一些可能被忽略。使用 Python,我们可以快速创建这些引导样本的数千次迭代。bootstrap 方法产生的估计样本通常形成正态分布,我们可以用集中趋势和方差的度量来概括。大致基于大数定律,如果我们一次又一次地取样,我们可以得出一种“小总体”。由于自举和快速计算机的帮助,即使你使用单个样本来生成数据,这也是适用的。
#example of bootstrapping code applied to our home team win binary column
sample_means_home = []
for _ in range(1000): #number of iterations
sample_mean = np.random.choice(home_team_win_array,size=202).mean()
#sample size: 202
sample_means_home.append(sample_mean)
len(sample_means_home) #should be 1000
结论
测试 1:主队与客队的胜率
结论:否决 H0,赞成哈。主队和客场队的胜率有显著差异。主场优势肯定是存在的!下面是我们在假设检验之外创建的一个简单的可视化图,以说明团队和整体数据的情况:
Most teams tend to win more on their home field
测试 2:4–4–2 与 4–3–3 的成功率
结论:拒绝 H0,赞成哈。4–4–2 和 4–3–3 的胜率有显著差异。根据我们的数据,就胜率而言,4–4–2 是更好的阵型,尽管我们可以用更多的样本和/或更大的阵型平均得分差异来进行更强的测试。胜率。
4–4–2 is better on average, but our low power metric (0.67) indicates Type II risk
测试 3:防守侵略性评级(英超 vs 法甲)
结论:拒绝 H0,附带告诫。平均成绩似乎有所不同。英格兰队对法国队的防守侵略性评级(EA Sports),但我们的测试缺乏力量(冒着 II 型错误的风险)。我们不能自信地说 avg 真的有差别。联赛间的防守侵略。我们将能够用更多的样本和/或联盟平均值之间的更大差异来运行更强的测试。
测试 4:射门机会创造评级(英超 vs 法甲)
结论:拒绝 H0,附带警告。平均成绩似乎有所不同。英格兰队对法国队的投篮机会创造评级(EA Sports),但我们的测试缺乏动力(冒着 II 型错误的风险)。我们不能自信地说平均成绩有真正的差异。联赛间的投篮机会创造能力。我们将能够用更多的样本和/或联盟平均值之间的更大差异来运行更强的测试。
感谢您阅读我们简单易懂的欧洲足球假设检验概述!
深入我们的数据、代码和统计测试的细节,探索我们的 GitHub 库: 康纳——凯文——亚历克斯
在 LinkedIn 上与我们联系,分享您的想法和问题,或者关注我们的数据科学之旅: 康纳——凯文——亚历克斯
假设检验——简介
原文:https://towardsdatascience.com/hypothesis-testing-i-introduction-9d4f769fef3?source=collection_archive---------12-----------------------
假设是我们对数据的假设,这些数据可能是真的,也可能是假的。在本帖中,我们将讨论评估假设真实性的统计过程——这个过程被称为假设检验。
大多数统计分析起源于比较两种类型的分布:总体分布和样本分布。让我们通过一个例子来理解这些术语——假设我们想从统计上检验我们的假设,即平均而言,学生在标准能力倾向测试中的表现在过去十年中有所提高。我们得到了一个数据集,其中包含随机选择的 100 名学生在 2009 年和 2019 年考试中的分数(最高分数= 250)。根据这些信息,我们应该确定以下细节-
Q1。这个问题的总体和样本分布是什么?
Q2。我们应该如何从统计学上评估前述假设的正确性(或不正确性)?
第一个问题的答案在于我们可以收集多少数据来进行分析。理想情况下,我们应该有十年前和今年参加考试的所有学生(全国各地)的分数,以便进行公平的比较。但由于物理条件的限制,我们无法获得全国所有在 2009 年和 2019 年的能力倾向考试中出现的学生的数据(分数)。因此,我们使用每年的一些数据点(标记)来进行统计分析。因此,总体分布是指所有学生(2009 年和 20019 年合计)的分数分布,样本分布是总体分布的子集,包含较少(比如说 100 个)随机选择的学生的分数。通常情况下,我们无法获得总体分布,只能使用样本分布。
我们可以从总体分布中抽取多个样本,我们为我们的示例抽取了两个样本分布-第一个包含来自 2009 年数据的 100 名学生的分数,第二个包含来自 2019 年数据的 100 名学生的分数。让我们将未知总体分布正式表示为 P: μ,σ,n,已知样本分布如下:
Equation 1: Two sample distributions for our example
下标中的数字是样本分布中相应年份的最后两位数字。对于每个分布,μ、σ和 n 分别代表它们的均值、标准差和样本大小(样本数),这些参数的值可以从给定的数据中计算出来(总体分布除外)。第二个问题可以用如下三步假设检验程序来回答:
第一步:建立假设
从形式上来说,我们的假设——平均而言,学生在标准能力倾向测试中的表现在过去十年中有所改善,可以写成——是这样的说法吗,>μ₀₉(比较平均值),在统计上显著正确?我们关于数据的假设被称为 研究假设 。我们知道在数字上μ₁₉ > μ₀₉,但我们也知道 2019 年有学生的分数低于μ₀₉,因为σ₁₉ > σ₀₉,因此有必要问一问——研究假设的统计意义是什么?为了解决这样的问题,我们总是从一个 无效假设 ,开始,并且我们假设无效假设为真,直到被证明不是这样。对于我们的例子,零假设是学生在 2009 年和 2019 年的平均分数没有显著增加,也就是说,μ₁₉ = μ₀₉.根据给定的数据,我们可以计算出零假设正确的概率,如果这个概率非常低,那么我们应该拒绝零假设而支持研究假设,否则我们应该拒绝研究假设。我们将很快学习如何计算期望的概率,但现在我们应该对给定的数据建立如下假设:
Equation 2: Setting up the hypothesis
第二步:选择合适的检验统计量
为此,我们可以撤销中心极限定理(CLT ),该定理规定样本分布的平均值的分布是正态分布,具有平均值μ和标准偏差σ/⎷n,即 Z(μ,σ/⎷n).你可以从我之前的帖子中读到更多关于中心极限定理的内容。虽然,我们没有获得 P: μ,σ,n,但是我们从 CLT 中知道μ₀₉和μ₁₉属于一个参数未知的正态分布。假设检验最棘手的部分来了,就是把μ₀₉和μ₁₉的值从一个不确定的正态 distribution,Z(μ,σ/⎷n,转换(或映射)到标准的正态分布,也就是 Z(0,1)。实际上,我们希望将 Z(μ,σ/⎷n).的μ₀₉和μ₁₉这两个点的平均值设置为零,并将标准偏差调整为 1 对于我们的假设,可以这样做:
Equation 3: Mapping our hypothesis to a standard normal distribution, Z(0,1)
即使在将值(μ₀₉和μ₁₉)映射到 Z(0,1)之后,未知量μ、σ和 n 仍然出现在我们的假设中。通过重新排列假设中的各项,我们可以很容易地去掉μ,如下所示:
Equation 4: Rearranging the terms in our hypothesis to get rid of the unknown μ
在等式 4 中求解我们假设的左侧,我们得到:
Equation 5: Hypothesis without the unknown μ
要去掉σ,就要用样本标准差最高的来代替。在我们的例子中,σ₁₉ > σ₀₉,所以我们将σ替换为σ₁₉,并在假设的分母中使用相应的 n₁₉。因此,根据已知的样本分布参数,我们的最终假设可以写成:
Equation 6: Our hypothesis in terms of the known sample distribution parameters
现在,我们可以将等式 1 至等式 6 中各个参数的值代入,以获得假设的数值。
Equation 7: Numerical values of our hypothesis testing set up
注意: 大家都知道方程 7 中数值上 2.4 大于 0,但请注意,假设检验不是数值比较问题,而是统计问题。这意味着我们在问 2.4 是否在统计意义上大于 0(不仅仅是,2.4 是否大于 0?)?这里,z=2.4 是我们的测试统计量。
所谓统计显著,我们的意思是,如果我们选择多个独立的随机样本,每个样本 100 名学生,出现在我们 2019 年的能力倾向测试中,那么这些随机样本中的大多数随机样本具有 z > 2.4(隐含的意思是,μ₁₉ > μ₀₉).)的概率是多少我们的随机样本 S₁₉只包含一组 100 名学生,其平均值(μ₁₉)与μ₀₉的比较只给出一个检验统计量(z = 2.4)。但我们有兴趣测试一个普遍假设,即如果我们从 2019 年的数据中获得另一组 100 名学生(随机选择)的分数,那么新组的平均水平也高于μ₀₉.的可能性有多大这就是为什么我们测试 z > 2.4,而不是 z = 2.4。请注意,我强调了“大多数”,因为我们应该量化“大多数”在我们的统计假设检验问题中的含义,我们将在下一步中这样做。但是先来计算 z > 2.4 的概率,也就是 p(z > 2.4),从标准正态分布的表中,Z(0,1)。在 z = -2.4 处(钟形曲线是对称的,所以-2.4 和 2.4 处的值相等),我们得到 p(z > 2.4) = 0.0082 。
你也可以用这个计算器计算 p(z > 2.4)。
第三步:选择一个显著性水平(α)
这是我们用来决定假设检验的统计显著性的参数。要做到这一点,让我们首先来看看 Z(0,1)的概率分布,如图 1 所示。
Figure 1: A plot of standard normal distribution, Z(0,1)
从图 1 可以明显看出,在标准正态分布中,68%的数据位于 1 个标准偏差内,95%的数据位于 2 个标准偏差内,99%的数据位于平均值(=0)附近的 3 个标准偏差内。在假设检验中,我们选择至少有(1-α)%的随机样本支持我们的研究假设的那个点作为我们的显著性水平。让我们来理解这一点——还记得我在第 2 步的最后一段强调了“大多数”吗?“大多数”是根据显著性水平(α)量化的,如果我们随机选择多个组,每个组 100 名学生,他们出现在 2019 年的考试中,那么我们接受我们的研究假设(μ₁₉ > μ₀₉,等价于 z>2.4),只有当(1-α)%的这些组的均值大于μ₀₉.
通常,选择α = 0.05 来检验假设检验的统计显著性。这意味着我们想要(1-α)= 1–0.05 = 95%的随机样本来支持我们的研究假设。由于我们的假设检验问题通常有一个 z 统计量,所以我们只需要 p(z > z 统计量)< α to accept the research hypothesis, otherwise we reject it in the favor of the null hypothesis. For our example, if we select α = 0.05 then we should accept the research hypothesis only if p(z> 2.4) = 0.0082 < 0.05, which is indeed correct. By accepting the research hypothesis we mean — ,显著性水平为 0.05(α= 0.05),我们得出结论:μ₁₉在统计上显著大于μ₀₉.
总之,统计假设检验采用三步程序:
- 设置假设:用户制定一个研究假设(例如μ₁₉ > μ₀₉)并选择一个零假设(μ₁₉ = μ₀₉)进行比较。
- 选择适当的检验统计量:检验统计量是总结样本信息的单个数字。例如,我们在讨论中使用了 Z 统计量,因此,我们的示例假设检验通常被称为 Z 检验。然而,根据问题的性质,应该适当地选择不同的测试统计。例如,t 统计(根据学生的 t 分布计算)应用于小样本问题(n < 30 ),相应的假设检验称为 t 检验。
- 选择显著性水平(α): 为了建立假设检验的统计显著性,用户选择合适的显著性水平。由于显著性水平是一种概率度量,其值介于 0 和 1 之间。科学文献中使用的α典型值为 0.01、0.05 和 0.10,其中α=0.05 是最常用的值。
最后,根据研究假设的性质,假设检验有三种类型:
- 上尾检验:一种假设检验,其中研究假设表明参数值与原假设相比有所增加(例如,μ₁₉ > μ₀₉).
- 低尾检验:一种假设检验,其中研究假设表明参数值与原假设相比有所下降(例如,μ₁₉ < μ₀₉).
- 双尾检验:一种假设检验,其中研究假设表明参数值与原假设相比发生了变化(例如,μ₁₉ ≠ μ₀₉).值得注意的是,双尾检验是对不相等的检验,而不是对感兴趣的参数值的增加或减少的检验。
使用 Python 进行机器学习中的假设检验
原文:https://towardsdatascience.com/hypothesis-testing-in-machine-learning-using-python-a0dc89e169ce?source=collection_archive---------1-----------------------
可能所有初学机器学习或中级水平或统计学的学生都听说过这个时髦词假设检验。
今天我将简单介绍一下这个让我在学习时感到头疼的话题。我用 python 把所有这些概念和例子放在一起。
在我考虑更广泛的事情之前,脑子里有些问题-
什么是假设检验?我们为什么要用它?假设的基础是什么?假设检验的重要参数是什么?
让我们一个一个地开始:
1。什么是假设检验?
假设检验是一种统计方法,用于利用实验数据进行统计决策。假设检验基本上是我们对总体参数的一种假设。
你说班上学生的平均年龄是 40 岁,或者一个男孩比女孩高。
所有这些我们假设的例子都需要一些统计方法来证明。我们需要一些我们假设为真的数学结论。
2 。我们为什么要用它?
假设检验是统计学中必不可少的程序。假设检验评估关于总体的两个互斥陈述,以确定哪个陈述最受样本数据支持。当我们说一个发现具有统计学意义时,这要归功于假设检验。
3 。假设的基础是什么?
Normal Curve images with different mean and variance
假设的基础是归一化和标准归一化。我们所有的假设都是围绕这两个术语的基础。让我们看看这些。
Standardised Normal curve image and separation on data in percentage in each section.
你一定想知道这两个图像之间的区别,一个可能会说我没有发现,而另一个会看到一些平坦的图形相比陡峭。伙计,这不是我想要表现的,在第一张图中,你可以看到不同的正态曲线,所有这些正态曲线可以有不同的均值和方差,在第二张图中,如果你注意到图形是适当分布的,并且均值=0,方差=1,总是。当我们使用标准化的正常数据时,z 分数的概念就出现了。
正态分布-
如果一个变量的分布具有正态曲线的形状——一种特殊的钟形曲线,那么这个变量就被称为正态分布或者具有正态分布。…一个正态分布的图形被称为正态曲线,它具有以下所有属性 : 1 .平均值、中值和众数相等。
Normal distribution formula
标准化正态分布—
标准正态分布是平均值为 0、标准差为 1 的正态分布
Standard Normal Distribution
哪些是假设检验的重要参数?
零假设:- 在推断统计学中,零假设是一个一般性的陈述或默认立场,即两个测量的现象之间没有关系,或者组之间没有关联
换句话说,这是一个基本假设,或者是基于领域或问题知识做出的。
例如:一家公司的产量为每天 50 台等。
替代假设:-
备选假设是在假设测试中使用的与原假设相反的假设。人们通常认为这些观察结果是真实效应的结果(叠加了一些偶然变化)
例如:某公司生产的是!=50 单位/每天等。
Null and Alternate hypothesis.
显著性水平:指我们接受或拒绝零假设的显著程度。接受或拒绝一个假设不可能有 100%的准确性,因此我们选择一个通常为 5%的显著性水平。
这通常用 alpha(数学符号)表示,通常是 0.05 或 5%,这意味着您的输出应该有 95%的信心在每个样本中给出类似的结果。
第一类错误:当我们拒绝原假设,尽管那个假设是真的。第一类误差用α表示。在假设检验中,显示临界区域的正态曲线称为α区域
第二类错误:当我们接受零假设但它是假的。第二类错误用β表示。在假设检验中,显示接受区域的正态曲线称为贝塔区域。
单尾检验:- 统计假设的检验,其中拒绝区域仅在抽样分布的一侧,称为单** - 尾检验。**
例如:-一所大学有≥ 4000 名学生或数据科学≤ 80%的组织采用。
双尾检验:- 一个两个 - 尾检验是一种统计检验,其中一个分布的临界面积为两个 - 侧,并检验一个样本是否大于或小于某个范围的值。如果被测样品落入任何一个关键区域,则接受替代假设,而不是零假设。
举例:某学院!= 4000 学生或数据科学!= 80%的组织采用
one and two-tailed images
P 值:-****P 值或计算概率,是当研究问题的零假设(H 0)为真时,发现观察到的或更极端的结果的概率——极端的定义取决于假设是如何被检验的。
如果您的 P 值小于所选的显著性水平,那么您拒绝零假设,即接受您的样本提供了支持替代假设的合理证据。它并不意味着“有意义的”或“重要的”差异;这由您在考虑结果的现实相关性时决定。
例子:你有一枚硬币,你不知道这是公平的还是棘手的,所以让我们决定无效和交替假设
H0:一枚硬币是公平的。
H1:硬币是一种狡猾的硬币。和α=5%或 0.05
现在我们抛硬币,计算 p 值(概率值)。
第一次投掷硬币,结果是尾 - P 值= 50%(因为头和尾的概率相等)
第二次抛硬币,结果是尾,现在 p 值= 50/2 = 25%
同样,我们连续投掷 6 次,得到的结果是 P 值= 1.5% ,但我们将显著性水平设为 95%,意味着我们允许 5%的误差率,这里我们看到我们超出了该水平,即我们的零假设不成立,因此我们需要拒绝并提出这枚硬币是一枚棘手的硬币,实际上是一枚复杂的硬币。
:-现在想象你不戴帽子。你对数据分析感兴趣。您有一个包含 10 个值的数据集。如果你不估算任何东西,每个值可以取任意数,对吗?每个值都可以自由变化。但是,假设您想使用单样本 t 检验,用 10 个值的样本来检验总体均值。现在,您有了一个约束条件—平均值的估计。具体是什么约束?根据平均值的定义,以下关系必须成立:数据中所有值的总和必须等于 n x 平均值,其中 n 是数据集中值的数量。
因此,如果一个数据集有 10 个值,这 10 个值的总和必须等于平均值 x 10。如果 10 个值的平均值是 3.5(您可以选择任何数字),此约束要求 10 个值的总和必须等于 10 x 3.5 = 35。
有了这个约束,数据集中的第一个值可以自由变化。不管它是什么值,所有 10 个数的和仍然有可能是 35。第二个值也可以自由变化,因为无论您选择什么值,它仍然允许所有值的总和为 35 的可能性。
现在让我们来看看一些广泛使用的假设检验类型:-
- T 检验(学生 T 检验)
- z 检验
- 方差分析检验
- 卡方检验
****T-检验:-T-检验是一种推断统计,用于确定在某些特征上可能相关的两组的平均值之间是否存在显著差异。它主要用于数据集,如作为投掷硬币 a 100 次的结果而记录的数据集,将遵循正态分布,并且可能具有未知的方差。t 检验用作假设检验工具,允许检验适用于总体的假设。
t 检验有两种类型:1。一个样本 t 检验 2。双样本 t 检验。
****单样本 t 检验:单样本 t 检验确定样本均值在统计上是否不同于已知或假设的总体均值。单样本 t 测试是一种参数测试。
例如:-你有 10 个年龄,你正在检查平均年龄是否为 30。(使用 python 检查下面的代码)
from scipy.stats import ttest_1samp
import numpy as npages = np.genfromtxt(“ages.csv”)print(ages)ages_mean = np.mean(ages)
print(ages_mean)
tset, pval = ttest_1samp(ages, 30)print(“p-values”,pval)if pval < 0.05: # alpha value is 0.05 or 5%
print(" we are rejecting null hypothesis")
else:
print("we are accepting null hypothesis")
上述代码的输出是:
one-sample t-test output
双样本 T 检验:- 独立样本 T 检验或双样本 T 检验比较两个独立组的平均值,以确定是否有统计证据表明相关总体平均值存在显著差异。独立的样本 t 检验是一个参数检验。这个测试也被称为:独立 t 测试。
示例:week1 和 week2 之间有任何关联吗(下面用 python 给出了代码)
from scipy.stats import ttest_ind
import numpy as npweek1 = np.genfromtxt("week1.csv", delimiter=",")
week2 = np.genfromtxt("week2.csv", delimiter=",")print(week1)
print("week2 data :-\n")
print(week2)
week1_mean = np.mean(week1)
week2_mean = np.mean(week2)print("week1 mean value:",week1_mean)
print("week2 mean value:",week2_mean)week1_std = np.std(week1)
week2_std = np.std(week2)print("week1 std value:",week1_std)
print("week2 std value:",week2_std)ttest,pval = ttest_ind(week1,week2)
print("p-value",pval)if pval <0.05:
print("we reject null hypothesis")
else:
print("we accept null hypothesis")
2-sampled t-test output
成对样本 t 检验:- 成对样本 t 检验也叫相依样本 t 检验。这是一个单变量测试,测试两个相关变量之间的显著差异。这方面的一个例子是,如果您在某个治疗、条件或时间点之前和之后收集个人的血压。
H0:——表示两个样本之间的差值为 0
H1:-两个样本之间的平均差异不为 0
检查下面的代码是否相同
import pandas as pd
from scipy import stats
df = pd.read_csv("blood_pressure.csv")df[['bp_before','bp_after']].describe()ttest,pval = stats.ttest_rel(df['bp_before'], df['bp_after'])
print(pval)if pval<0.05:
print("reject null hypothesis")
else:
print("accept null hypothesis")
当你可以进行 Z 测试的时候。
统计中使用了几种不同类型的检验(即 f 检验、卡方检验、 t 检验)。在以下情况下,可以使用 Z 检验:
- 您的样本量大于 30。否则,使用 t 测试。
- 数据点应该是相互独立的。换句话说,一个数据点不相关或者不影响另一个数据点。
- 您的数据应该是正态分布的。然而,对于大样本量(超过 30),这并不总是重要的。
- 您的数据应该从总体中随机选择,其中每一项都有平等的机会被选中。
- 样本大小应尽可能相等。
再举一个例子,我们使用 z-test 对血压进行一些均值测试,如 156 (python 代码如下所示)单样本 Z 测试。****
import pandas as pd
from scipy import stats
from statsmodels.stats import weightstats as stestsztest ,pval = stests.ztest(df['bp_before'], x2=None, value=156)
print(float(pval))if pval<0.05:
print("reject null hypothesis")
else:
print("accept null hypothesis")
双样本 Z 检验- 在双样本 Z 检验中,类似于这里的 t 检验,我们检查两个独立的数据组,并决定两组的样本均值是否相等。
H0:两组平均值为 0
H1:两组的平均值不为 0
示例:我们在采血后和采血前检查采血数据。(下面是 python 代码)
ztest ,pval1 = stests.ztest(df['bp_before'], x2=df['bp_after'], value=0,alternative='two-sided')
print(float(pval1))if pval<0.05:
print("reject null hypothesis")
else:
print("accept null hypothesis")
****ANOVA(F-TEST):-t-TEST 在处理两组时效果很好,但有时我们希望同时比较两组以上的数据。例如,如果我们想测试选民年龄是否因种族等分类变量而不同,我们必须比较变量的每个级别或组的平均值。我们可以对每一组进行单独的 t 检验,但是当你进行多次检验时,就会增加假阳性的机会。方差分析或 ANOVA 是一种统计推断测试,允许您同时比较多个组。
F =组间变异性/组内变异性
F-Test or Anova concept image
与 z 分布和 t 分布不同,F 分布没有任何负值,因为组间和组内的变异性由于每个偏差的平方而总是正的。
单向 F-检验(Anova) :- 它根据两组或更多组平均相似性和 F-分数来判断它们是否相似。
示例:有 3 种不同类别植物及其重量,需要检查所有 3 组是否相似(下面的 python 代码)
df_anova = pd.read_csv('PlantGrowth.csv')
df_anova = df_anova[['weight','group']]grps = pd.unique(df_anova.group.values)
d_data = {grp:df_anova['weight'][df_anova.group == grp] for grp in grps}
F, p = stats.f_oneway(d_data['ctrl'], d_data['trt1'], d_data['trt2'])print("p-value for significance is: ", p)if p<0.05:
print("reject null hypothesis")
else:
print("accept null hypothesis")
双向 f 检验:- 双向 f 检验是单向 f 检验的扩展,当我们有 2 个自变量和 2+组时使用。双向 f 检验不能说明哪个变量是主导变量。如果我们需要检查个体显著性,则需要执行事后测试。
现在让我们来看看总的平均作物产量(不按任何分组的平均作物产量),以及按每个因素和按组合在一起的因素的平均作物产量
import statsmodels.api as sm
from statsmodels.formula.api import olsdf_anova2 = pd.read_csv("[https://raw.githubusercontent.com/Opensourcefordatascience/Data-sets/master/crop_yield.csv](https://raw.githubusercontent.com/Opensourcefordatascience/Data-sets/master/crop_yield.csv)")model = ols('Yield ~ C(Fert)*C(Water)', df_anova2).fit()
print(f"Overall model F({model.df_model: .0f},{model.df_resid: .0f}) = {model.fvalue: .3f}, p = {model.f_pvalue: .4f}")res = sm.stats.anova_lm(model, typ= 2)
res
卡方检验- 当一个总体中有两个分类变量时,应用该检验。它用于确定两个变量之间是否有显著的关联。
例如,在选举调查中,选民可以按性别(男性或女性)和投票偏好(民主党、共和党或无党派)分类。我们可以使用卡方检验来确定性别是否与投票偏好有关
查看下面的 python 示例
df_chi = pd.read_csv('chi-test.csv')
contingency_table=pd.crosstab(df_chi["Gender"],df_chi["Shopping?"])
print('contingency_table :-\n',contingency_table)#Observed Values
Observed_Values = contingency_table.values
print("Observed Values :-\n",Observed_Values)b=stats.chi2_contingency(contingency_table)
Expected_Values = b[3]
print("Expected Values :-\n",Expected_Values)no_of_rows=len(contingency_table.iloc[0:2,0])
no_of_columns=len(contingency_table.iloc[0,0:2])
ddof=(no_of_rows-1)*(no_of_columns-1)
print("Degree of Freedom:-",ddof)
alpha = 0.05from scipy.stats import chi2
chi_square=sum([(o-e)**2./e for o,e in zip(Observed_Values,Expected_Values)])
chi_square_statistic=chi_square[0]+chi_square[1]
print("chi-square statistic:-",chi_square_statistic)critical_value=chi2.ppf(q=1-alpha,df=ddof)
print('critical_value:',critical_value)#p-value
p_value=1-chi2.cdf(x=chi_square_statistic,df=ddof)
print('p-value:',p_value)print('Significance level: ',alpha)
print('Degree of Freedom: ',ddof)
print('chi-square statistic:',chi_square_statistic)
print('critical_value:',critical_value)
print('p-value:',p_value)if chi_square_statistic>=critical_value:
print("Reject H0,There is a relationship between 2 categorical variables")
else:
print("Retain H0,There is no relationship between 2 categorical variables")
if p_value<=alpha:
print("Reject H0,There is a relationship between 2 categorical variables")
else:
print("Retain H0,There is no relationship between 2 categorical variables")
您可以在我的 git 存储库中获得所有代码。
啊,我们终于结束了这篇文章。我希望这篇文章会有所帮助。任何反馈都会受到欢迎。
更多更新请查看我的 git 并在媒体上关注 we。
使用方差分析进行假设检验:一项核心数据科学技能
原文:https://towardsdatascience.com/hypothesis-testing-in-the-northwind-dataset-using-anova-db3ab16b5eba?source=collection_archive---------14-----------------------
使用假设检验确定最有利可图的客户的例子
项目目标
作为 Northwind 数据库项目的一部分,我需要对数据提出一些问题,以便为公司获得有价值的商业见解。Northwind 数据库是 Microsoft 为一家名为 Northwind Traders 的虚构公司提供的示例数据库,该公司从世界各地进口和出口消费品。该数据库包含公司活动的一系列信息,包括客户、客户订单、产品及其供应商。我感兴趣的是更好地了解他们的客户,并找出哪些客户群体对 Northwind 的利润贡献最大。所以我决定问的一个问题是:
不同地区的客户每份订单的平均收入是否不同?
陈述假设
为了回答这个问题,我首先创建了一个无效替代假设:
零假设:每个订单的平均花费金额在不同的客户区域之间是相同的
另一个假设:在不同的客户区域,每个订单的平均消费金额是不同的(或高或低)
阿尔法水平(即,当假设为真时拒绝零假设的概率)设置为 0.05。
获取和清理数据
第一步是使用这个(只有轻微的标签错误)模式提取正确的数据:
Northwind database schema
为了回答正在调查的问题,我需要提取客户区域、订购的每种产品的总量、单价以及每份订单的折扣级别。为此,我使用 Order 表连接了 Customer 和 OrderDetail 表:
# Importing the required libraries
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.formula.api import ols# Creating an engine and connecting to a database with SQLAlchemy
engine = create_engine('sqlite:///Northwind_small.sqlite', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
con = engine.connect()# Extracting the data required as a pandas dataframe using a SQL query
df3 = pd.read_sql_query('''
SELECT c.Region, od.OrderId, od.Quantity, od.UnitPrice, od.Discount
FROM Customer c
JOIN [Order] o ON c.Id = o.CustomerId
JOIN OrderDetail od ON od.OrderId = o.Id
''', engine)
产生的数据框架现在显示了每个订单中每个产品的订单 ID、数量、单价和折扣:
The first five rows of the dataset
但我真正想要的是每份订单的总收入。这是使用下面单元格中的代码计算的,该代码将折扣应用于单价和单位数量的乘积,然后对每个订单求和,并删除不再需要的列:
# Calculating the revenue per sub-order
df3['price_per_order'] = df3.Quantity * df3.UnitPrice * (1 - df3.Discount)# Dropping the columns for quantity, unit price and discount now that we have the total revenue
df3.drop(['Quantity', 'UnitPrice', 'Discount'], axis=1, inplace=True)# Grouping the data by order and summing the revenue for each order
df3 = df3.groupby(['Region', 'OrderId'])['price_per_order'].sum().reset_index()# Dropping the OrderId as we no longer need this
df3.drop('OrderId', axis=1, inplace=True)
这给我留下了一个只包含我需要的数据的数据框架:
The first five rows of the new dataset
但是,对每个地区的订单数量进行快速统计后发现,一些地区的客户仅下了少量订单:
因为方差分析将用于检验假设,所以最好确保相对相等的样本量,特别是满足方差相等的假设。因此,较小的群体与其他具有地理意义的群体结合在一起,并采用了 30 人的最小群体规模。
# Combining Eastern and Southern Europe
df3.loc[(df3.Region == 'Eastern Europe') | (df3.Region == 'Southern Europe'),'Region'] = 'Southern and Eastern Europe'# Combining Scandinavia and Northern Europe
df3.loc[(df3.Region == 'Scandinavia') | (df3.Region == 'Northern Europe'),'Region'] = 'Northern Europe and Scandinavia'# Combining Central and South America
df3.loc[(df3.Region == 'Central America') | (df3.Region == 'South America'),'Region'] = 'South and Central America'
探索数据
既然数据已经有了正确的格式和分组,就可以开始研究它了。以下代码块生成了下图,该图绘制了每个地区的订单数、每份订单的总收入和每份订单的平均收入:
# Plotting the number of orders, total revenue per order and average revenue per order for each region
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(8,8))
df3.groupby(['Region'])['Region'].count().plot(kind='barh', ax=ax1)
df3.groupby(['Region'])['price_per_order'].sum().plot(kind='barh', ax=ax2)
df3.groupby(['Region'])['price_per_order'].mean().plot(kind='barh', ax=ax3)
ax1.set_title('Total number of orders')
ax1.set_ylabel('')
ax2.set_title('Total revenue ($)')
ax2.set_ylabel('')
ax3.set_title('Average revenue per order ($)')
ax3.set_ylabel('')
fig.subplots_adjust(hspace=0.4);
图表显示,西欧是订单数量最多的地区,总收入也最高。然而,北美的平均订单最贵(其次是西欧)。南欧和东欧的订单数量最少,总收入最低,平均订单最便宜。第三张图支持了另一个假设,即各地区之间的平均订单收入存在显著差异。这通过使用统计假设检验被进一步研究。
假设检验和结果
为了回答来自不同地区的顾客每份订单的平均花费是否不同的问题,使用了 ANOVA。这评估了多个样本之间的变化程度,在这种情况下,每个样本是不同的区域。
方差分析假设数据是正态分布的,样本具有相似的方差。分布图是使用 seaborn 绘制的,这表明数据非常严重地正偏,具有长尾。对数据进行对数变换会产生具有更相似分布的更正态分布的数据。对数转换数据的分布(如下所示)由以下代码生成:
# Copying the dataset and log-transforming price_per_order
df3_log = df3.copy()
df3_log['price_per_order'] = np.log(df3['price_per_order'])# Plotting the distributions for the log-transformed data
plt.figure(figsize=(8,5))
for region in set(df3_log.Region):
region_group = df3_log.loc[df3_log['Region'] == region]
sns.distplot(region_group['price_per_order'], hist_kws=dict(alpha=0.2), label=region)
plt.legend()
plt.xlabel('Revenue per order (log-transformed)')
数据现在更加正态分布,均值的方差也更加相似。现在可以进行方差分析测试了:
# Fitting a model of price_per_order on Region categories, and using statsmodels to compute an ANOVA table
lm = ols('price_per_order ~ C(Region)', df3_log).fit()
sm.stats.anova_lm(lm, typ=2)
上面的 ANOVA 表显示 p 值低于 alpha 值 0.05。因此,我能够拒绝零假设,接受替代假设。不同地区之间的平均订单价值存在统计上的显著差异,即平均而言,来自世界不同地区的客户在订单上花费的金额不同。
结论
商业洞察:
- 不同地区客户的平均每单收入存在显著的统计差异。
- 西欧客户下的订单最多,是 Northwind 盈利的最大贡献者。然而,尽管北美客户的订单数量大约是西欧客户的一半,但他们平均每份订单的花费更多。
- 订单平均最贵的地区(北美,1,945.93 美元)和订单最便宜的地区(南欧和东欧,686.73 美元)之间的差额为 1,259.20 美元,是北美订单的 2.8 倍。
- 南欧和东欧的订单数量最少,总收入最低,每笔订单的平均收入也最低。
- 北美客户的订单数量与南美和中美客户相似,但他们每份订单的平均支出是南美和中美客户的 1.8 倍。
未来工作的潜在业务行动和方向:
- 如果 Northwind 希望专注于利润更高的客户,一个潜在的行动将是停止为南欧和东欧的客户提供服务,而更多地关注西欧和北美的客户。
- 然而,还需要进一步的分析来证实这些发现。例如,一些更贵的产品可能只在某些地区有售。
假设检验——什么、为什么和如何
原文:https://towardsdatascience.com/hypothesis-testing-the-what-why-and-how-867d382b99ca?source=collection_archive---------9-----------------------
理解假设检验背后的直觉。它到底是什么,我们为什么要这样做,以及如何执行它。让我们开始吧!
直觉
我们先来了解一下假设检验背后的直觉。假设你在一家电子商务公司工作,你设计了一个新的网站来吸引更多的顾客。你的老板想知道你的新网站设计是否值得投资,或者只是一个噱头。你是做什么的?你不能只是把网站推广给你所有的客户,然后全力以赴。几天后,你会想通过引导流量到新网站来确认你的新设计是否真的有效。如果结果出来惊人的好,那意味着你的新网站设计确实很棒。否则,这可能只是一个一次性的运动。
你的新网站就是你想要测试的假设。但是你想让它和别的东西比较,对吗?为此,你做了一个“零假设”。你的无效假设说你的网站是垃圾。没有任何实际影响。然后你提出一个‘替代假设’。你的另一个假设是你的新网站真的很棒,它真的增加了你的客户。我们首先假设我们的零假设是正确的。所以如果你成功地证明了你的零假设是错误的,你实际上证明了你的替代假设是正确的!
太好了!所以你现在对我们在做什么,为什么我们在做什么,以及我们如何我们在做什么有一个直觉。现在让我们进入细节。
显著性水平和置信区间
继续我们的示例,假设贵公司每天的平均客户数量约为 5430 人。如果你为一年中的每一天的顾客画一张图,你将得到下面的正态分布图,平均值为 5430。
The normal distribution curve with mean μ and standard deviation σ
在你开始测试你的新想法之前,你设置一个显著性水平——一个阈值概率。这也被称为临界值— α。
曲线下超过临界值的区域就是临界区。临界值定义了我们的样本统计量(我们的实验值)与零假设值(原始平均值)之间的距离,在此之前,我们可以说它是异常的,足以拒绝零假设。
然后你把流量导向你的新网站几天,看看结果。假设平均有 5723 个客户。现在这个数字的增加可能是由于你的新设计(你的替代假设提出的)或者仅仅是运气。然后,我们计算这个实验的 测试统计量——这是 Z 测试的 Z 得分(下面将详细介绍)。这意味着,我们需要检查 5723 的实验值离我们的原始分布均值有多远或多少标准差。这可以使用下面的表达式来计算:
X = Sample mean, μ=Population mean, σ=Standard deviation
临界值可以是 0 到 1 之间的任何值。通常选择为 0.05。这意味着只有当达到 5723 的 Z 值的 P 值小于 0.05 时,你才能拒绝零假设。否则,你无法拒绝。现在,你可能知道曲线下的面积表示总概率,超过临界值的面积将是 5%。或者我们可以说我们有 95%的置信区间。如果将临界值降低到 0.01,假设检验会变得更加严格,因为如果要拒绝零假设,您现在希望新的 p 值更低(小于 0.01)。这意味着你的置信区间将是 99%。
p 值
达到 5723 或更大极限值的概率是假设我们的零假设为真的 P 值。请注意,这不是实现点估计 5723 的概率,这将是非常低的。它是实现一个如此罕见甚至更罕见的价值的总概率。它是正常曲线下超过 P 值标记的区域。这个 P 值是用我们刚刚找到的 Z 值计算出来的。每个 Z 得分都有一个对应的 P 值。这可以使用任何统计软件如 R 或甚至从Z-表中找到。
source
现在,如果这个 P 值小于临界值——意味着达到这个客户数量的可能性非常小,这确实不是运气,我们可以拒绝我们的零假设。现在,我们不能说我们接受我们的替代假设,因为统计学是一个推理游戏,我们永远不可能 100%确定。但是,正如我们已经设定了我们的置信区间,我们可以有 95%甚至 99%的把握。这就是错误出现的地方!
第一类和第二类错误
就像我说的,我们永远不能百分百确定。你的结论总是有可能是错误的,而事实真相是完全相反的。
如果你的显著性水平是 0.05,这意味着你有 5%的几率是错的!意思是,你拒绝了你的无效假设,当它在现实中是正确的时候。这是第 1 类错误。因此,犯类型 1 错误的概率是 α 。
反过来,你也可以断定你的零假设是真的,或者用统计学的话说,你没有拒绝你的零假设,而实际上它是假的。这是第二类错误的一个例子。犯第二类错误的概率用β来解释— β 。
[source](https://bmjopen.bmj.com/content/7/8/e015397)
功效是当零假设为假时,拒绝零假设的概率。所以犯第二类错误的概率是 1-(幂)或 1-β。
现在我们如何减少这些误差?我们可以简单地增加我们的信心水平,或者换句话说,减少我们的α。这样做减少了α下的面积,从而减少了犯类型 1 错误的概率。但是减少α 会增加犯第二类错误的概率,因为你将会更多地拒绝你的零假设!所以有一个取舍。
你也可以增加你的样本大小,n,这将使你的分布曲线更窄,从而降低犯错误的概率。
单尾与双尾检验
统计测试也可以是方向性的。这意味着你提出的另一个假设是结果增加或者减少或者减少。在我们的例子中,我们想测试客户是否增加了。所以这是一个单尾检验的例子。因此,对于 95%的置信区间,5%的概率分布是在我们测试的方向上(在我们的例子中是向右)。
相反,我们也可以从另一个方向进行测试。例如,测试对软件进行某些更改是否会显著减少处理时间。在这种情况下,我们将考虑正常曲线的左侧部分。
source
对于两个尾检验的情况,没有具体的方向。我们的替代假设只是检查新的统计数据是否发生了显著变化,即它是显著大于还是小于原始统计数据。因此,对于 95%的置信区间,我们的 5%概率分布将被分成两部分,两个方向各 2.5%。因此α 将是 0.025。
统计测试的类型
z 检验
当要计算两个分布之间的均值差异时,通常使用 z 检验。总体的标准差应该是已知的,样本数应该大于 30。z-检验的一个最重要的假设是所有的样本观测值都是相互独立的。
t 检验
当总体的标准偏差未知且必须从样本中近似得出时,使用 t 检验。它通常用于比较两个不同的群体。t 检验有三种主要类型:
- 一个独立样本 t 检验比较两组的均值。
- 一个成对样本 t 检验比较同一组在不同时间(比如说,相隔一年)的平均值。
- 一个样本 t 检验根据已知的平均值检验一个组的平均值
卡方检验
卡方检验通常用于与分类变量相关的检验。卡方检验主要有两种类型——拟合优度检验和关联检验。对于一个分类变量,拟合优度测试用于测试观察值是否与分布相匹配。另一方面,关联测试用于比较列联表中的两个变量,看它们是否独立。
卡方检验通常用于 特征选择 过程。我们使用关联测试来检查所有特征与目标变量的相关性。然后选择相关性最高的顶部特征来训练模型。
这些是主要使用的统计测试。还有更多的测试,如 F 检验、方差分析。
如果您想更深入地挖掘并理解背后的实际数学,我建议您参考以下优秀资源:
- https://www . uda city . com/course/intro-to-推论-统计- ud201
- https://www.khanacademy.org/math/ap-statistics
本文到此为止。请在下面评论你的想法!
假设检验可视化
原文:https://towardsdatascience.com/hypothesis-testing-visualized-6f30b18fc78f?source=collection_archive---------7-----------------------
从字面上看统计测试是如何工作的
在本文中,我们将对假设检验有一个直观的视觉感受。虽然网上有很多用文字解释的文章,但主要依靠视觉的文章还远远不够;这是令人惊讶的,因为这个主题非常适合通过图片和电影来阐述。
但是在我们走得太远之前,让我们简单描述一下它到底是什么。
什么是…
在进行一般性描述之前,最好从假设检验的例子开始。我们首先需要的是一个假设。例如,我们可以假设男性的平均身高大于女性的平均身高。本着‘矛盾求证’的精神,我们首先假设两性的平均身高没有差别。这成为我们的默认假设,或者无效假设。如果我们收集两组人的身高数据,并发现如果零假设为真,那么观察到该数据的可能性极小(例如,“如果零假设为真,为什么我在样本中看到男性和女性的平均身高有如此大的差异?”),我们可以拒绝它,得出确实有区别的结论。
对于一般的假设检验问题,我们需要以下内容:
- 我们关心的一个指标(上面例子中的平均身高)。
- 两个(或更多)以某种已知方式彼此不同的群体(在上面的例子中是雄性和雌性)。
- 一个无效的假设,即我们的组之间的度量是相同的,因此我们在收集的数据中观察到的任何差异都只能是统计噪声和另一个假设,即确实存在一些差异。
然后,我们可以继续收集两组的数据,估计他们感兴趣的度量,并查看我们的数据与我们的无效假设和替代假设的兼容性如何。最后一部分是假设检验理论的来源。我们将在前面的章节中看到它是如何工作的。
如何拒绝
现在我们已经形成了我们的假设并收集了我们的数据,我们如何用它来拒绝我们的零?总体框架如下:
- 定义一个统计量,用于测量两组之间我们关心的指标的偏差。在我们的平均身高示例中,这样的度量可以是男性和女性平均身高之间的差异(零假设是零)。另一个可能是男性和女性平均身高的比率(零假设是 1)。
- 由于我们从假设零假设开始,我们已经知道了检验统计分布的平均值(在上面的例子中,零表示差异,一表示比率)。关于分布的其他一切(如方差和其他矩),我们从收集的数据中获得。
- 现在,从收集的数据中获得统计的点估计值(对于平均高度的差异,平均您看到的两组的高度并取其差异)。如果零假设是真的,那么看到比我们观察到的估计值更极端的东西的概率是多少?如果这个概率(称为 p 值)低于某个阈值,我们得出结论,零假设不可能产生它。这个概率成为我们测试的假阳性率的估计值(因为我们将拒绝 null,即使它在这个概率下是真的)。
关于方差的一个注记
需要强调的是,关注点的分布是测试统计中估计值的分布,而不是总体中度量值的分布。例如,在我们比较男性和女性平均身高的例子中,男性的身高会有一些差异。然而,这不是我们感兴趣的方差。如果我们取 n 个男性的平均身高,我们就得到了男性人口平均身高的估计值。除非我们集合地球上所有男性成员,测量他们的身高并取平均值,否则这个估计值会有偏差。如果我们再进行一次实验,我们可能会得到一组不同身高的男性。所以,这次我们得到的平均值会略有不同。重复实验之间的这种差异(如果我们进行了多次)是我们有兴趣估计的。
当我们增加任何一组的样本量时,该组估计值的方差就会减小。如果你刚好过敏或者只是没心情数学,只想跳到图片,可以跳过下面一节跳到下一节,我不会难受的:)
方差:数学
我们的检验统计量的方差(例如,男性和女性平均身高估计值的差异)取决于两组的度量估计值的方差。为了具体说明这一点,假设我们对 n1 名男性进行了采样,并计算了他们身高的方差 s1。男性平均身高估计值的方差变成:s1 /n1。这是因为男性的平均身高估计为:
Eq 1: Estimate of mean height of males
因此,这个估计值的方差(如果我们对 n_1 个雄性样本进行多次采样,估计值 h_m 会变化多少)变为:
Eq 2: Variance in estimate of average height of males given we sample n_1 of them.
在等式(2)中,V(h_i)的最佳估计,即单个样本的方差是 S1,即根据我们的样本计算的方差。你可以看到,随着我们收集的样本越来越多,这个估计量的方差越来越小。
类似地,如果抽样 n_2 名女性,女性身高方差的估计为:s_2 /n2。
如果我们选择均值差异作为我们的检验统计量,它可以表示为:
并且该统计中的方差变成(因为来自两组的样本之间没有相关性):
Eq 3: Variance of test statistic
要使它变小,n_1 和 n_2 都必须变大。这里,我们举了手段不同的例子。然而,一般结论也适用于我们可能构建的其他检验统计量(如均值比)。
给我看看照片
好吧,我答应给你照片,但你到目前为止只看到文字和符号。让我们想象一下假设检验是什么样子的。下面的图 0 显示了 t 的概率密度函数(均值差异的检验统计量)。
假设我们选择了一个假阳性率(FPR),α为 15%(我们不希望有超过 15%的几率在没有差异的情况下错误地得出有差异的结论)。
粉色垂直线是右边区域变为 15%的点。所以这成为我们拒绝零的门槛。如果观察到的统计值大于粉红线,我们拒绝零(推断高度之间存在显著差异),如果小于粉红线,我们不拒绝它(数据无法推断高度存在显著差异)。
Fig 0: Distribution of the difference of means. The pink area is 15%, so the pink vertical line is our current threshold. If the difference we observe from the data is greater than it, we reject the null.
注意,对于我们拒绝零假设的标准,我们不是基于检验统计量本身,而是基于从零假设下的分布计算的概率来构造阈值。为什么要用这种复杂的方式呢?因为在给定足够的数据的情况下,它确保我们的测试能够捕捉到两组指标之间的最小差异,因为统计估计的方差将变为零。
假设男性的身高总是比女性高 5 厘米。上面图 1 中的绿点代表了这 5 厘米的差异。然而,由于它位于粉红色阈值的左侧,我们无法识别它,并得出结论,没有发现差异。
让我们看看当我们开始增加其中一组的数据量时会发生什么(假设是雄性——在图中这些组被标记为治疗组和对照组;假设治疗是指雄性,控制是指雌性)。根据等式(3),测试统计的方差开始下降。结果,粉红色的线(右边的区域是 15%)开始向左朝着绿点移动。同样根据图 1,我们可以看到,在另一组的贡献开始占主导地位之前,增加男性组的样本量只能减少这么多的方差。所以,粉色的线不能到达绿色的点。
Fig 1: As we increase the sample size of the one of the groups, the variance of the test statistic under the null reduces. This causes the point at which the FPR is 15% to shift to the left. Eventually however, the variance stops reducing since the second group becomes the blocker. Created using: https://github.com/ryu577/pyray
然而,当我们增加第二组(女性)的样本量时,方差再次开始显著减小,并且我们的阈值粉色线再次向左移动,直到它最终到达绿点。有了这么多数据,我们就能捕捉到平均高度的差异,小到蓝线上的绿点。这个故事的寓意是,给定足够的数据(在两个组中),即使是最小的效应大小也可以被捕捉到。
Fig 2: Beyond a point, increasing the sample size for the first group started giving us diminishing returns. So, we had to start increasing the sample size of the other group to get a further reduction in the variance of the distribution of the test statistic under the null hypothesis.
现在,我们刚刚表明,如果我们对假阳性率有 15%的容差,我们会得到上面图 1 和图 2 中的粉红色线。但这是我们设定的。如果假阳性率是我们唯一关心的,为什么不把它设置得尽可能低(0)?这将涉及到将粉红色线移动到无穷大,我们永远不会拒绝零。不会有假阳性,因为根本不会有阳性。这个测试的明显缺点是当另一个假设事实上是真的时(这里是高度之间的差异)。现在,因为我们从不拒绝零,我们会错误地总是拒绝它,即使存在差异。这将使我们的假阴性率(即使有显著差异,概率测试也返回阴性)达到 100%。在统计学术语中,假阳性率被称为第一类错误,用α表示,而假阴性率被称为第二类错误,用β表示。现在,α来自零假设,其中我们知道检验统计量的平均值(对于我们一直在进行的等均值检验,均值差的平均值为零)。为了得到β,我们假设交替假设为真(确实存在高度差异)。所以,我们需要得到它下面的统计分布。这个备择假设的方差和其他方面应该与零假设相同。但是,我们应该把意思定为什么呢?对于空值,它是零(对于均值差异检验统计量)。另一种方法是,我们挥挥手,从帽子里抽出一个数字。这就是我们希望测试关注的“效果大小”。基本上,我们假设平均值的差异正好是 5 cm(比方说),然后看看我们的测试在捕捉这种差异方面有多好(拒绝零)。
在下图 3 所示的两个图表中,黄色曲线是零假设,紫色曲线是替代假设。它们峰值的差距就是效应大小。图 3 清楚地显示了α(用黄色区域表示)和β(用紫色区域表示)之间的权衡。当我们减小α时,我们将粉色阈值向右移动。但这会导致紫色区域β增加。还要注意,当α=0 时,我们总是预测为负。因此,当交替假设为真时,假阴性率变为β=1。类似地,当α=1 时,β=0。因为它们之间有明显的权衡,我们会得到一个连接这两个极端的递减函数。这种α-β权衡图如下图 3 左下方所示。当粉色阈值来回移动时,我们沿着递减函数移动。
Fig 3: Tradeoff between FPR and FNR. Image created using https://github.com/ryu577/pyray
最糟糕的测试
现在我们知道,假阳性率α由我们来设定,但它与假阴性率β之间存在权衡。对于给定的样本量(在两组中),任何基于我们构建的统计数据的测试都将具有如图 3 左下方所示的α-β曲线。我们希望α和β都低,所以如果一个给定的假设检验的曲线保持在另一个的曲线之下,我们会更喜欢它。在统计学术语中,更可取的检验被称为“更有效的检验”,因为 1-β被称为检验的功效。既然我们有了一种称测试为“更有效”的方法,那么对于“最有效”测试的自然探索就产生了,给定我们感兴趣的度量以及该度量在治疗组和对照组中的分布。这是一个一致最有效测试的概念,在统计学中有相当多的努力来寻找这些测试。然而,我们将在这一节中反其道而行之,寻找最坏的可能,最没有力量的测试。因为如果我们知道最糟糕的交易是什么,我们就永远不会以最糟糕的方式受骗。
假设汤姆的任务是确定男性和女性的身高在统计学上是否有显著差异。他没有出去从一些男性和女性那里收集一些数据,而是呆在家里简单地扔硬币。硬币正面朝上的概率为α。如果他确实得到了“正面”,他只是简单地得出结论:零假设是正确的,平均身高没有差异(用统计学的行话来说,他“未能拒绝零”)。如果他得到了反面(概率 1-α),他得出结论,另一个假设是正确的。假设零假设为真,他将有错误拒绝它的概率α(根据定义)。而如果备选项为真,他将有而不是拒绝空的概率β=1-α。所以在这种情况下,α和β的关系就是β=1-α。这显示在下面图 4 的红线中。对于一个更合理的测试,它实际上收集了一些样本数据并构建了一个合理的测试统计量(如差异或均值比),对应的关系可能看起来像下面的白色曲线。
Fig 4: The α-β curve for the worst possible hypothesis test is given by the red line, β=1-α. A more reasonable hypothesis test where we actually look at some data might be given by the white curve. You can see for a given α, the β we get for the red line is much higher (worse).
样本量
假设检验中的另一个重要问题涉及到我们的实验需要多少样本量。要回答这个问题,我们需要目标假阳性率(α)、假阴性率(β)和我们感兴趣的效应大小。假设我们想要 16%的假阳性率和 10%的假阴性率。这在下面图 5 左下方的图中用绿点表示。您可以看到,最初,α-β曲线没有触及绿点(对于目标α,β比我们期望的要高得多)。然而,随着我们开始增加对照组和治疗组的样本量,整个曲线开始向下移动,直到最终绿点位于其上(注意,黄色区域α保持不变,但紫色区域β显著减少)。这是因为粉色线向左移动,紫色曲线变细。这基本上是我们如何预先知道,在给定假阳性和假阴性率的情况下,我们需要两组样本的大小,以及我们希望获得的效应大小。
Fig 5: Increasing sample size allows us to get any FNR for a given FPR. Image created using https://github.com/ryu577/pyray
这涵盖了假设检验的大部分重要方面。让我知道你的想法,我错过了什么,如果有任何其他方面的假设检验有利于这样的可视化。
假设检验:大学城的房价受经济衰退的影响小吗?
原文:https://towardsdatascience.com/hypothesis-testing-were-housing-prices-of-university-towns-less-affected-by-the-recession-3e582d2dde4a?source=collection_archive---------16-----------------------
衰退是经济活动普遍下降时的商业周期收缩。经济衰退发生在支出普遍下降的时候,这可能是由于各种事件,如金融危机、外部贸易冲击或经济泡沫破裂。在衰退期间,我们发现国内生产总值、收入、就业、销售和工业生产稳步下降。衰退于 2007 年 12 月袭击了美国,持续了大约 18 个月(2009 年 6 月)
在这篇博文中,让我们看看大学城(例如,锡拉丘兹是一个大学城,因为它的学生人口比传统的非学生人口多)的平均房价受经济衰退的影响是否比其他城镇小。
我们使用假设检验的方法来找出大学城的平均房价在经济衰退期间是否受影响较小。你可以在这里阅读更多关于假设检验的内容
问题:大学城的平均房价受经济衰退的影响比其他城镇小吗?
零假设:大学城的平均房价同样受到了经济衰退的影响。
数据:
1.从 Zillow.com 的 T4 传来了美国的房屋数据。特别是城市级别的所有房屋的数据文件,该文件具有细粒度级别的房屋销售价格中值。
2.维基百科上关于大学城的页面上有一个美国大学城的列表,它已经被复制并粘贴到文件 university towns 中。
3.来自美国商务部经济分析局,在 GDP 文件中,以现值美元表示的美国季度 GDP 超时值
数据角力:
数据分析中最被低估的任务是清理、操作数据,并准备好对数据应用机器学习算法。我们将使用 3 个不同的数据文件来测试我们的假设。我们开始吧!
大学城:
该文档是文本文件,其格式为州[编辑] —城镇名称—大学名称[编号] —城镇名称—大学名称[编号]。因此,第一个任务是获取一个包含州名和该州大学城的数据框。
**def** get_list_of_university_towns():
**with** open('university_towns.txt') **as** file:
data = []
**for** line **in** file:
data.append(line[:-1])
state_town = []
**for** line **in** data:
**if** line[-6:] == '[edit]':
state = line[:-6]
**elif** '(' **in** line:
town = line[:line.index('(')-1]
state_town.append([state,town])
**else**:
town = line
state_town.append([state,town])
state_college_df = pd.DataFrame(state_town,columns = ['State','TownName'])
**return** state_college_dfget_list_of_university_towns()
给你。,我们创建了一个函数,该函数将返回一个包含州和相应大学城的数据框。我们去掉了[编辑]、数字、大学和括号。
Data Frame- Univerity Towns
GDP
我们可以看到,前 6 行是由标题,所以我们将摆脱它。我们不需要所有的数据,因为我们正在努力寻找 2009 年某个地方发生的经济衰退的影响。我们去掉了 1929 年至 1999 年的所有数据,我们的数据集现在应该有 2000 年至 2016 年的季度 GDP。即从行 212 开始的列 E 和列 F。我们采用季度 GDP,因为这将有助于我们从微观层面理解衰退的影响。
x = pd.ExcelFile('gdplev.xls')
gdp = x.parse(skiprows=7)
gdp = gdp[['Unnamed: 4', 'Unnamed: 5']]
gdp = gdp.loc[212:]
gdp.columns = ['Quarter','GDP']
gdp['GDP'] = pd.to_numeric(gdp['GDP'])
gdp
Data Frame — gdp
Zillow 房产数据
在这个数据集中,我们有很多列,我们感兴趣的是从 2000 年开始的州、城镇名称和年份。我们希望我们的年份采用年-季度的形式(2000 年第一季度、2000 年第二季度、2000 年第三季度……),但是我们的数据采用年-月的形式(2000-01 年)。2000–02…)因此,我们编写一个函数来获取所需形式的数据。
*# Use this dictionary to map state names to two letter acronyms*
states = {'OH': 'Ohio', 'KY': 'Kentucky', 'AS': 'American Samoa', 'NV': 'Nevada', 'WY': 'Wyoming',
'NA': 'National', 'AL': 'Alabama', 'MD': 'Maryland', 'AK': 'Alaska', 'UT': 'Utah', 'OR': 'Oregon',
'MT': 'Montana', 'IL': 'Illinois', 'TN': 'Tennessee', 'DC': 'District of Columbia', 'VT': 'Vermont',
'ID': 'Idaho', 'AR': 'Arkansas', 'ME': 'Maine', 'WA': 'Washington', 'HI': 'Hawaii', 'WI': 'Wisconsin',
'MI': 'Michigan', 'IN': 'Indiana', 'NJ': 'New Jersey', 'AZ': 'Arizona', 'GU': 'Guam', 'MS': 'Mississippi',
'PR': 'Puerto Rico', 'NC': 'North Carolina', 'TX': 'Texas', 'SD': 'South Dakota', 'MP': 'Northern Mariana Islands',
'IA': 'Iowa', 'MO': 'Missouri', 'CT': 'Connecticut', 'WV': 'West Virginia', 'SC': 'South Carolina', 'LA': 'Louisiana',
'KS': 'Kansas', 'NY': 'New York', 'NE': 'Nebraska', 'OK': 'Oklahoma','FL': 'Florida', 'CA': 'California',
'CO': 'Colorado', 'PA': 'Pennsylvania', 'DE': 'Delaware', 'NM': 'New Mexico', 'RI': 'Rhode Island',
'MN': 'Minnesota', 'VI': 'Virgin Islands', 'NH': 'New Hampshire', 'MA': 'Massachusetts', 'GA': 'Georgia',
'ND': 'North Dakota', 'VA': 'Virginia'}
**def** convert_housing_data_to_quarters():
df = pd.read_csv('City_Zhvi_AllHomes.csv')
df = df.drop(df.columns[[0] + list(range(3,51))], axis=1)
df2 = pd.DataFrame(df[['State', 'RegionName']])
df2.rename(columns={'RegionName':'TownName'},inplace=**True**)
**for** year **in** range(2000, 2016):
df2[str(year) + 'q1'] = df[[str(year) + '-01', str(year) + '-02', str(year) + '-03']].mean(axis = 1)
df2[str(year) + 'q2'] = df[[str(year) + '-04', str(year) + '-05', str(year) + '-06']].mean(axis = 1)
df2[str(year) + 'q3'] = df[[str(year) + '-07', str(year) + '-08', str(year) + '-09']].mean(axis = 1)
df2[str(year) + 'q4'] = df[[str(year) + '-10', str(year) + '-11', str(year) + '-12']].mean(axis = 1)
year = 2016
df2[str(year) + 'q1'] = df[[str(year) + '-01', str(year) + '-02', str(year) + '-03']].mean(axis = 1)
df2[str(year) + 'q2'] = df[[str(year) + '-04', str(year) + '-05', str(year) + '-06']].mean(axis = 1)
df2[str(year) + 'q3'] = df[[str(year) + '-07', str(year) + '-08']].mean(axis = 1)
df2['State'] = [states[state] **for** state **in** df2['State']]
df2 = df2.set_index(['State', 'TownName'])
ans = pd.DataFrame(df2)
**return** ans
convert_housing_data_to_quarters()
为了将年-月转换为年-季度,我们创建了一个新列 Year-Quarter (2000q1,2000 Q2..)取第一季度前三个月(1 月-3 月)和第二季度前三个月(4 月-6 月)的房价平均值,我们对 2000 年到 2015 年的每一年都这样做。对于 2016 年,我们有截至 8 月的数据,即截至第三季度的数据。此外,我们注意到我们的州名有缩写(NY,IL..)但是我们想要一个全名,因为我们包含大学城的数据框有完整的州名。在字典(states)的帮助下,我们将缩写转化为全名。让我们看看我们的数据现在是什么样子。
Data Frame - Housing Prices
提问:
1.衰退的开始日期是什么时候?
在这里,我们用 GDP 数据来回答这个问题。例如,如果我们有数字 1,2,5,3,2,7,8,我们可以看到 5>3 和 3>2,所以我们的衰退开始日期将在数字 5。使用同样的逻辑,我们得到一个衰退的开始日期。
**def** get_recession_start():
x = pd.ExcelFile('gdplev.xls')
gdp = x.parse(skiprows=7)*#skiprows=17,skip_footer=(38))*
gdp = gdp[['Unnamed: 4', 'Unnamed: 5']]
gdp = gdp.loc[212:]
gdp.columns = ['Quarter','GDP']
gdp['GDP'] = pd.to_numeric(gdp['GDP'])
quarters = []
**for** i **in** range(len(gdp) - 2):
**if** (gdp.iloc[i][1] > gdp.iloc[i+1][1]) & (gdp.iloc[i+1][1] > gdp.iloc[i+2][1]):
quarters.append(gdp.iloc[i][0])
**return** quarters[0]
get_recession_start()
我们的开始日期是 2008 年第三季度。
2.经济衰退何时触底?
这里的衰退底部是指 GDP 最低的点。
**def** get_recession_bottom():
*'''Returns the year and quarter of the recession end time as a*
*string value in a format such as 2005q3'''*
df = pd.read_excel('gdplev.xls', skiprows = 7)
df = df[['Unnamed: 4','Unnamed: 6']]
df.columns = ['Quarter','GDP']
df = df.iloc[212:]
df = df.reset_index()
df = df[['Quarter','GDP']]
recession_end = []
**for** i **in** range(len(df) - 4):
**if** ((df.iloc[i][1] > df.iloc[i+1][1]) & (df.iloc[i+1][1] > df.iloc[i+2][1]) & (df.iloc[i+2][1] < df.iloc[i+3][1]) & (df.iloc[i+3][1] < df.iloc[i+4][1])):
recession_end.append([df.iloc[i][0],df.iloc[i+1][0],df.iloc[i+2][0],df.iloc[i+3][0],df.iloc[i+4][0]])
ans = recession_end[0][2]
**return** ans
get_recession_bottom()
2009 年 Q2 出现了经济衰退的谷底
数据可视化:
如果我们以年季度为轴,GDP 为 y 轴绘制时间序列图,我们应该可以更准确地理解上面回答的问题。
gdp1=gdp.loc[245:252]
plt.figure(figsize=(12,7))
ax = sns.lineplot(x="Quarter", y="GDP", data=gdp1)
Start-2008q3, bottom-2009q2, end-2009q4
为了方便使用,让我们将函数返回的所有值放入一个变量中。
nitowns = get_list_of_university_towns()
bottom = get_recession_bottom()
start = get_recession_start()
hdata = convert_housing_data_to_quarters()
bstart = hdata.columns[hdata.columns.get_loc(start) - 1]
现在,如果我们想知道大学城的房价是否受影响较小,我们就取一个比率,(衰退开始时的 Gdp-衰退底部的 Gdp)/衰退开始时的 Gdp。该比率是从衰退开始日期到衰退底部房价的下降。
hdata['ratio'] = (hdata[bstart] - hdata[bottom])/ hdata[bstart]
hdata['ratio']
下一步是合并数据框。我们创建一个包含州、城镇名称、衰退底部、衰退开始和比率的新数据框架 hdata,并将该数据框架与大学城数据框架合并。
hdata = hdata[[bottom, bstart, 'ratio']]
hdata = hdata.reset_index()
unitowns_hdata = pd.merge(hdata,unitowns,how='inner',on=['State','TownName'])
unitowns_hdata.head()
现在,让我们看看我们的数据框是什么样子的:
我们需要在数据框中将大学城与其他城镇分开。因此,我们创建一个列“uni ”,如果是大学城,则用 True 填充,否则用 False 填充,然后创建一个数据框 ut,其中包含所有大学城的 True 值和非大学城的 nut 值。
unitowns_hdata['uni'] = **True**
hdata2 = pd.merge(hdata, unitowns_hdata, how='outer', on=['State','TownName',bottom, bstart, 'ratio'])
hdata2['uni'] = hdata2['uni'].fillna(**False**)
ut = hdata2[hdata2['uni'] == **True**]
nut = hdata2[hdata2['uni'] == **False**]
T 检验:
t 检验用于确定大学城的平均房价与非大学城相比是否具有统计学意义。
我们对 ut 和 n ut 数据框架进行 T 检验,检查大学城的房价是否受经济衰退影响较小。我们采用 99%的置信区间来检验我们的假设。
**def** hypo():
**from** **scipy.stats** **import** ttest_ind
t,p = ttest_ind(ut['ratio'].dropna(), nut['ratio'].dropna())
different = **True** **if** p<0.01 **else** **False**
better = "university town" **if** ut['ratio'].mean() < nut['ratio'].mean() **else** "non-university town"
**return** (p,different,better)
hypo()
输出:
p, different, better
结论:
在 99%的置信区间,我们拒绝假设大学城的平均房价同样受到(而不是更少)经济衰退的影响,因为 p 值(0.00336292287685515)小于 0.01。我们可以得出结论,美国大学城的平均房价受经济衰退的影响较小
用 Numpy 进行假设检验
原文:https://towardsdatascience.com/hypothesis-testing-with-numpy-271c185e8cf0?source=collection_archive---------20-----------------------
各位数据科学爱好者,我们都做假设检验来从一个更大的流行样本数据中推断结果。这个测试帮助我们发现我们的零假设是对还是错。
首先,让我们明白当我们做假设检验时。当我们既不能从图形化 EDA 中得出结论,也不能通过比较汇总统计数据得出结论时,我们就这样做。在这种情况下,我们从现有的数据集模拟一个假设。做到这一点的一个方法是置换我们拥有的数据集。在继续之前,让我们看看如何做置换
def permutation_sample(data1, data2):
#Generate a permutation sample from two data sets.
# Concatenate the data sets: data
data = np.concatenate((data1, data2)) # Permute the concatenated array: permuted_data
permuted_data = np.random.permutation(data) # Split the permuted array into two: perm_sample_1, perm_sample_2
perm_sample_1 = permuted_data[:len(data1)]
perm_sample_2 = permuted_data[len(data1):] return perm_sample_1, perm_sample_2
您可以在“for 循环”中使用该函数来产生许多您需要的样本集。注意,这里我写了这个函数,从两个数据集推断样本。根据需要调整函数。
现在,既然我们知道如何使用排列来模拟假设,让我们来测试它。记住,假设假设是真的,测试假设是对观察到的数据的合理程度的评估。理解我们正在评估的数据是什么以及我们如何量化它是很重要的。这个问题的答案是测试统计。
检验统计量是一个单一的数字,可以从观察到的数据和我们从零假设模拟的数据中计算出来。这将有助于我们比较假设预测的结果和我们从数据中实际观察到的结果。我们可以选择能够帮助我们回答我们试图用假设来解决的问题的检验统计量。如果假设为真,样本的检验统计量和原始数据的检验统计量将是相同的,或者它们之间的差异太小。现在让我们看看如何使用 python 来计算这个测试统计复制。
def draw_perm_reps(data_1, data_2, func, size=1):
"""Generate multiple permutation replicates.""" # Initialize array of replicates: perm_replicates
perm_replicates = np.empty(size) for i in range(size):
# Generate permutation sample
perm_sample_1, perm_sample_2 = permutation_sample(data_1, data_2) # Compute the test statistic
perm_replicates[i] = func(perm_sample_1, perm_sample_2) return perm_replicates
在上面的函数中,您可以调整要传递的数据集的数量。在 for 循环中,对于每次迭代,它将使用我们之前编写的函数计算置换样本,然后计算测试统计量。您可以传递任何函数(如 np.mean()、np.var()或您自己的函数)来计算您的测试统计数据。
然后我们将这些值绘制成柱状图。然后,我们在直方图上标记来自原始数据的测试统计值。如果我们对原始数据的测试统计量的面积进行合计,就会得到 p 值。这可以用 python 实现,
P-Value, Red line represents the original data’s test statistics.
# Compute p-value: p
p = np.sum(perm_replicates >= test_statistic_of_original_data)/ len(perm_replicates)
例如,如果我们得到 p 值 0.05,我们可以说我们有 95%的信心我们的假设是正确的。即(100-(0.05×100))。
p 值是在零假设的假设下,获得测试统计值的概率,该值至少与观察到的值一样极端。注意,p 值不是假设为真的概率。
综上,让我们写下假设检验的流水线。
- 显然,陈述零假设
- 定义您的测试统计
- 假设零假设为真,生成多组模拟数据
- 计算每个模拟数据的测试统计
- p 值是测试统计至少与真实数据一样极端的集合的分数
在这里,我分享了一些关于如何进行假设检验的解释和 python 片段。希望对你有帮助。让我知道你的反馈。
假设检验和 p 值:一个温和的介绍
原文:https://towardsdatascience.com/hypothesis-tests-and-p-value-a-gentle-introduction-4b52322bfc50?source=collection_archive---------10-----------------------
每当统计学家被要求对一些无法观察到的人口参数作出推断时,他们需要从人口中有代表性的样本开始。然而,一旦获得了该参数的估计值(称为统计量),他们如何能够说明它是否对应于真实的参数,因为后者是未知的?
因为不可能比较两个结果(同样,一个是不可观察的),所以有必要做出一些假设并进行所谓的假设检验。
这些测试旨在评估估计值与真实参数相等的可能性。这个想法是,它总是存在一种可以被认为是默认的情况:这是一种保守的情况,如果你对自己的假设没有足够的把握,你最好保持这种情况。这种情况将是我们的零假设,或 H0。另一方面,还有另一种情况,如果被接受,将会改变现状。这是另一种假设,或 H1。
这些假设有一个有意义的解释,而做出错误决定的惩罚是不均衡的。事实上,如果你因为你的发现而决定拒绝零,而事实证明这是真的,你就陷入了你可能面临的最糟糕的情况:事实上,你拒绝了保守状态,也就是说,你的“舒适区”。另一方面,当选择为真时,不拒绝空值也没那么糟糕。为了更简单,让我们考虑下面的例子。
假设你是一名医生,你必须决定是否让一名病人住院。你非常谨慎,如果有疑问,你通常更愿意让你的病人住院至少一个晚上,但是这对你的组织来说是非常昂贵的。因此你决定设定这两个假设:
- H0:‘病人需要住院’
- H1:‘病人不需要住院’
想象一下,病人实际上需要住院治疗,但你确信情况正好相反:你将把一个病情严重的人送回家,这可能会带来可怕的后果。另一方面,如果你决定让病人留院观察一晚,但事实证明他完全正常,你肯定会损失一些钱,但这种情况并不像让某人因疏忽而死亡那么糟糕。
话虽如此,我们如何具体地进行假设检验呢?要做到这一点,了解数据的分布是至关重要的。这里,我们将使用标准正态分布,它具有众所周知的钟形,平均值=0,标准差=1。
要标准化一个样本的正态分布,步骤如下:
z 值称为 z 得分,它表示位于总体平均值和数据点值之间的标准偏差数。
也就是说,假设你在考试中得了 30 分,平均分是 25,标准差是 3。您的 z 分数将等于:
这意味着你的分数比平均值高 1.67 个标准差。让我们想象一下:
请注意,当您有多个样本并且想要描述这些样本平均值的标准偏差时,您可以使用以下 z 得分公式:
其中 n =样本大小。
很好,但是这和假设检验有什么关系呢?这个想法是,你需要 z-score 来计算你的假设的概率,从而决定,在给定的置信水平下,是否拒绝零。让我们看看下面的例子。
想象一下,上面例子中测试的总体平均值是 25。然而,在选择了 30 名学生的样本后,发现他们的平均分数更高,比如说 28 分。可能出现的问题是,这一证据是否足够有力地表明人口的平均值高于 25。你的假设是:
- H0:“平均数等于 25”
- H1:“平均值大于 25”
然后,你必须设置所谓的显著性水平,这是你愿意拒绝零假设的误差幅度。因此,用α表示的显著性水平是当零假设为真时做出错误决策的概率。它通常采用 1%、5%和 10%这样的值,当假设为真时,它对应于拒绝零假设的区域。
即,α=5%,由于分布是对称的,我们将有两个 z 得分的临界值,表示为 Zα/2 和-Zα/2,它们是接受区域(绿色区域)的边界,而红色区域表示拒绝区域:
知道概率分布的重要性来了。事实上,由于我们已知的标准正态分布,我们可以使用包含与每个 z 分数相关的概率的表格。
也就是说,如果我们想在α=5%的情况下解决上述问题,我们必须找到那些决定 95%接受区域的临界 z 分数。因此,他们将在尾部为每一边留下 2.5%的概率,我们可以很容易地在表上看到这些值分别是-1.96 和 1.96。
现在,我们可以计算问题的 z 值:
由于 z 值超出了接受范围,我们可以拒绝总体均值等于 25 的零假设:我们有足够的证据(显著性为 5%)来拒绝该假设。
这个问题也可以用不同的方法来解决。假设您想要计算实际样本均值(或其更极端的值)出现的概率,而不是您的 z 得分。换句话说,事前获得样本均值等于或大于 28 的可能性有多大?
因为 z 分数大于 3.89(或小于-3.89)产生的概率为 0,所以我们的结果将为零(大约)。这意味着获得样本均值的可能性非常低(几乎不可能),以至于出现的事实表明人口的真实分布均值不等于 25。该概率的值称为 p 值。
一般来说,如果 p 值小于显著性水平,我们可以拒绝零假设。
假设检验是可以在各种情况下运行的强大工具。在本文中,我们看到了参数假设检验的例子,但是它们也可以指概率分布、数据间缺乏相关性、区间估计等。
我买了一台新电脑只是为了试用 CUDA,值得吗?
原文:https://towardsdatascience.com/i-bought-a-new-computer-just-to-try-out-cuda-was-it-worth-it-958216e755b1?source=collection_archive---------19-----------------------
我一直对统计计算中图形处理的潜力很感兴趣。我最近一直在使用许多 OpenCL 包,而不是基于 CPU 的股票包,因为我的显卡是由 AMD 制造的,openCL 是他们对希望利用 GPU 的数学能力而不仅仅是图形的程序员做出的唯一足够的贡献。
当然,我最感兴趣的是 CUDA,这是一个 Nvidia 专有的并行计算平台。然而,我拥有的最后一个 Nvidia GPU 是 8800GT,我周围所有的卡都是 team red 的,大多数都是旧卡(我是一个硬件迷。)
因此,在过去的几周里,我不是在搜索,而是在 Letgo、脸书和 Craigslist 上查看了几次我感兴趣的硬件,只有一个要求:
它需要一个 Nvidia 显卡。
在我搜索的最后一刻,我偶然发现了一个令人震惊的发现。
这台电脑在 Letgo 上的售价只有区区 140 美元,但还是有一些问题。显然,我想知道处理器,但我可以告诉插座是 AM3+,这是一个好消息,无论处理器是什么,都值得用安装在机箱前面的 240 毫米大散热器来冷却。
此外,显卡是蓝宝石和蓝色 PCB,蓝色 PCB 很重要,因为蓝宝石不再使用它们,至少据我所知,它们通常与镭龙 HD 系列相关。显然,镭龙高清是没有骰子的 CUDA,是你能从 Nvidia 卡最远。
然而,不管怎样,这笔交易肯定是诱人的,因为这是一个 140 美元的相当不错的系统!我交叉手指,希望主板会配备 AMD FX 八核处理器或类似的东西(piledriver,而不是推土机。)结果是 AMD FX 830e 八核处理器的主频达到了 3.5 GHz。
但还是;显卡。我给卖电脑的人发信息问了几个问题,让他启动 bios 帮我检查一些规格。该系统添加了高达 8gb 的双通道内存、750w 模块化电源、240mm 散热器/AIO、128 GB SSD(不确定读写速度)、一些 Aura 主板和这张 Saphire 卡。
但为了让交易更甜蜜,他透露,除了他卖给我的规格,另加 20 美元,他会卖给我一个 GTX 1060 ROG strix 图形卡!
把它带回家后,我把它组装在一起,换了一个装有操作系统的固态硬盘(砰!Os),引导到 EFI 和一切工作完美。我添加了一些升级,一个 570 Evo SSD,8g 额外的内存和一个 R9 290 来驱动任何额外的显示器,结果看起来有点像这样:
太美了。
现在我们有了硬件,我们需要为软件做同样的事情!
让 CUDA 工作起来
CUDA 的设置实际上是相当广泛的,因为它不像设置你的驱动那么简单。首先,您必须进入您的终端并安装依赖项:
sudo apt-get install freeglut3 freeglut3-dev libxi-dev libxmu-dev
然后你必须去“Cuda 专区”给自己找一些二进制文件…或者如果你在 Debian 上,你可以得到回购:
wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run
然后我们从 repo 中运行 sh 文件(作为 root 用户):
sudo sh ./cuda_10.1.243_418.87.00_linux.run
还有一种方法可以在 DPKG 上安装 CUDA 环境,但我选择了 SH 版本,因为这通常是我对 Nvidia 等可靠来源的首选途径。当你通过 SH 安装时,你会被问一些问题,我添加了#注释来解释我的回答,这样你就可以决定你是否认为说是合适的。
You are attempting to install on an unsupported configuration. Do you wish to continue?
(y)es/(n)o [ default is no ]: y# Obviously, we have to do this to proceed with the CUDA installation. Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 396.26?
(y)es/(n)o/(q)uit: n# I said no to this, as I use the POP! OS Nvida DriverInstall the CUDA 9.2 Toolkit?
(y)es/(n)o/(q)uit: y# Of course, the whole reason we're here is for the toolkitEnter Toolkit Location
[ default is /usr/local/cuda-9.2 ]:# That location suited me fine.Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y# There's no reason not to, so it's global and usable with everything.Install the CUDA 9.2 Samples?
(y)es/(n)o/(q)uit: y# I figured why not so I can see the usage in Python, and C as I do a lot of writing there, as well.Enter CUDA Samples Location
[ default is /home/kinghorn ]: /usr/local/cuda-9.2
安装 cuBLAS 修补程序:
sudo sh cuda_9.2.88.1_linux.run
最后但同样重要的是,我们必须将回显路径添加到我们的系统中,我们首先在以下位置创建一个 sh 文件:
/etc/profile.d/cuda.sh
并将以下内容放入其中:
export PATH=$PATH:/usr/local/cuda/bin
export CUDADIR=/usr/local/cuda
另一个 sh 文件位于:
/etc/ld.so.conf.d/cuda.conf
包含:
/usr/local/cuda/lib64
当然,我们必须以超级用户的身份编辑它们。然后我们终于可以跑了
sudo ldconfig
现在我们有了 CUDA 设置!我越来越兴奋了!现在让我们进入 Julia 并设置我们的软件包!这应该很容易,但在这里我们将发现如果流行!驱动程序将会兼容。我们需要以下包:
CuArrays
CUDAnative
CUDAdrv
为了确保一切正常,我将推进这些路径,然后构建每个包:
ENV["LD_LIBRARY_PATH"] = "/usr/lib/cuda/lib64"
ENV["CUDA_PATH"] = "/usr/lib/cuda"
**using** Pkg; Pkg.build("CuArrays")
Pkg.build("CUDAnative")
Pkg.build("CUDAdrv")
现在只需启动 Jupyter 并进行测试!
ERROR: LoadError: Available CUDA toolchain does not provide libcudadevrt
小崽子,真不幸。看起来我们可能要安装 Nvidia 的驱动程序,我真的希望 POP 的驱动程序可能是驱动程序上的一个分叉工作,但似乎不是这样,或者如果是,它有点太修改了。
终于开始工作了
在 CUDA 控制面板中做了一些调整,并在我的部分做了一些 bashrc 编辑之后,我的 CUDA 驱动终于可以工作了。那么,在我的 CPU 上,Julia 和修改过的线性回归函数之间的时间比较如何呢?我着手做美国数据科学家最擅长的事情,进行了 20 次测试,得到了两个特征的平均值:
CPU:
0.2208722 seconds
CUDA:
0.052839374 seconds
哇!
有了这样的收获,我决定单独使用 OpenCL 进行第三次独立测试,结果令人震惊:
0.10083948593 seconds
结论
使用 CUDA 时,深度学习和简单预测建模的性能明显提高。将来,我也想使用一张有张量核的卡片,因为它的速度肯定是无可挑剔的。不管怎样,我对这一切的结果很满意!那么为了使用 CUDA 而购买一台全新的机器值得吗?
不值得。
我使用自然语言处理和分类模型构建了一个假新闻检测器
原文:https://towardsdatascience.com/i-built-a-fake-news-detector-using-natural-language-processing-and-classification-models-da180338860e?source=collection_archive---------3-----------------------
Credit: Unsplash
分析来自子编辑 r/TheOnion & r/nottheonion 的开源数据。
当 WhatsApp 宣布每月删除 200 万个账户以防止假新闻传播时,我被激起了兴趣。在数百万被标记为删除的账户中,有多少被误归类为假新闻?WhatsApp 甚至是如何创造出删除数百万假新闻账号的自动化流程的?为了回答这些问题,我使用 Reddit 的开源数据构建了自己的假新闻检测器。以下是我是如何做到的,以及我一路走来学到的东西。
在 Pushshift.io API 包装器 *的帮助下,我从子编辑 r/TheOnion 和 r/nottheonion 中搜集了大约 3 万篇帖子。我选择了这些小标题,看看我能在多大程度上区分假新闻和荒谬新闻。r/TheOnion 上的帖子以来自 www.theonion.com 或其他类似恶搞网站的讽刺新闻为特色。r/nottheonion 上的帖子以可信新闻机构报道的荒谬时事为特色。
r/TheOnion has 95.2k subscribers while r/nottheonion has 15 million subscribers. Image credit: Reddit.
为了保持我的数据简洁明了,我选择将我的预测变量(X
)设为文章的标题,将我的目标变量(y
)设为 1 来表示 r/TheOnion,设为 0 来表示 r/nottheonion。为了清理数据,我创建了一个数据清理函数,删除数据帧中的重复行,删除所有文本中的标点和数字,删除多余的空格,并将所有文本转换为小写。
# Data cleaning function
def clean_data(dataframe):# Drop duplicate rows
dataframe.drop_duplicates(subset='title', inplace=True)
# Remove punctation
dataframe['title'] = dataframe['title'].str.replace('[^\w\s]',' ')# Remove numbers
dataframe['title'] = dataframe['title'].str.replace('[^A-Za-z]',' ')# Make sure any double-spaces are single
dataframe['title'] = dataframe['title'].str.replace(' ',' ')
dataframe['title'] = dataframe['title'].str.replace(' ',' ')# Transform all text to lowercase
dataframe['title'] = dataframe['title'].str.lower()
print("New shape:", dataframe.shape)
return dataframe.head()
既然我的 Subreddit 数据集已经很好很干净了,我就可以进行探索性数据分析(EDA)了。即使我决定给我的预测变量(X
)分配帖子标题,在我的数据搜集过程中,我也获得了帖子的其他特征,以揭示数据中隐藏的故事。总的来说,我从每篇文章中总结了以下特征:
title
:子编辑帖子的标题subreddit
:这个帖子属于哪个子编辑num_comments
:一篇帖子的评论数author
:文章作者的用户名subreddit_subcribers
:该子编辑的用户数量score
:Reddit 上收到的分数domain
:帖子中引用的域名created_utc
:帖子创建的日期和时间
当我观察到一个作者分享的帖子数量时,一些奇怪的事情引起了我的注意。在拥有 1500 万订阅者的 r/n 联盟中,只有三位作者分享了超过 100 篇帖子,而拥有 95000 订阅者的 r/n 联盟有 14 位作者分享了超过 100 篇帖子,最多的是 4113 篇帖子。在做出这个观察之后,我确认了我做出了一个很好的决定,将 r/TheOnion 作为一个案例来了解 WhatsApp 的假新闻问题。在 WhatsApp 的“帮助防止谣言和假新闻传播的提示”中,七个提示中有三个侧重于防止假新闻传播。假新闻的最大问题之一不一定是它被写出来,而是它被传播。r/TheOnion 作者的活动模仿了假新闻现象的核心特征。
Most Active Authors in r/nottheonion & and r/TheOnion. Image credit: Jasmine Vasandani
数据科学中的第一个最大错误是将每个业务挑战都视为预测方法。记住 70%的低挂问题可以通过做 EDA 来解决。
Sundar Ramamurthy
在对数据进行 EDA 的过程中,我发现了另一件有趣的事情,那就是每个子编辑中引用最多的域。当然,r/TheOnion 中提到的大多数域名来自theonion.com和其他恶搞新闻网站。然而,r/nottheonion 中引用最多的域给了我一脚。r/nottheonion 上被引用次数最多的五个域名分别是foxnews.com、theguardian.com、google.com、bbc.com和newsweek.com。
Top 5 Most Referenced Domains in r/TheOnion & r/nottheonion. Image credit: Jasmine Vasandani
我对我的数据集进行了更多的 EDA,并通过对数据应用CountVectorizer(ngram_range = (1,1))
来分析最常用的词。我还通过对数据应用CountVectorizer(ngram_range = (2,2))
分析了最常用的二元模型。在这两个子编辑之间,我记下了常见的常用词,并将它们添加到一个自定义的stop_words
列表中,稍后我将在数据建模中使用该列表。
我本可以早点开始建模过程,但是我决定先进行 EDA,以便更好地了解我的数据。在数据与我分享了他们的故事后,我开始创建和完善我的预测模型。我设置了我的预测器(标题)和目标(子编辑)变量,进行了训练/测试分割,并通过管道和 GridSearchCV 找到了我的模型的最佳参数。我使用了矢量器和分类模型的组合来寻找能给我最高准确度分数的最佳参数。我对准确性进行了优化,以确保所有假新闻都被归类为假新闻,而所有真实新闻都不会被归类为假新闻。
我结合使用计数矢量器和tfid 矢量器与逻辑回归和多项式实现了四个模型。我实现最高测试准确度分数的最佳模型是 CountVectorizer 和 MultinomialNB。下面是我如何找到这个模型的最佳参数的代码。
# Assign vectorizer and model to pipeline
pipe = Pipeline([('cvec', CountVectorizer()),
('nb', MultinomialNB())])# Tune GridSearchCV
pipe_params = {'cvec__ngram_range': [(1,1),(1,3)],
'nb__alpha': [.36, .6]}gs = GridSearchCV(pipe, param_grid=pipe_params, cv=3)
gs.fit(X_train, y_train);
print("Best score:", gs.best_score_)
print("Train score", gs.score(X_train, y_train))
print("Test score", gs.score(X_test, y_test))gs.best_params_
我解释系数的最佳模型实现了 CountVectorizer 和 LogisticRegression。下面是我如何找到这个模型的最佳参数的代码。
pipe = Pipeline([('cvec', CountVectorizer()),
('lr', LogisticRegression(solver='liblinear'))])# Tune GridSearchCV
pipe_params = {'cvec__stop_words': [None, 'english', custom],
'cvec__ngram_range': [(1,1), (2,2), (1,3)],
'lr__C': [0.01, 1]}gs = GridSearchCV(pipe, param_grid=pipe_params, cv=3)
gs.fit(X_train, y_train);
print("Best score:", gs.best_score_)
print("Train score", gs.score(X_train, y_train))
print("Test score", gs.score(X_test, y_test))gs.best_params_
为了评估我的 CountVectorizer 和 MultinomialNB 模型,我实现了一个混淆矩阵。虽然 90%的准确率测试分数很高,但这仍然意味着 10%的帖子被错误地分类为假新闻或真实新闻。如果这是 WhatsApp 对其假新闻检测器的评分,每月将有 10%的假新闻账户被错误分类。好在我先在一个较小的数据集上创建了一个假新闻检测器。
Confusion Matrix. Image credit: Jasmine Vasandani
最后,尽管我的 CountVectorizer 和 LogisticRegression 模型的性能不如上面的模型,但我仍然决定解释它的系数,以更好地了解每个单词如何影响预测。在我的逻辑回归系数的下图中,对来自 r/TheOnion 贡献最大的词是“kavanaugh”,其次是“incredible”和“ftw”。对“来自 r/not theon”贡献最大的词是“佛罗里达”,其次是“警察”和“被捕”。在指数化我的系数之后,我发现当“kavanaugh”在标题中的出现次数增加 1 时,该标题被归类为 r/TheOnion 的可能性是 7.7 倍。并且随着标题中“florida”的出现增加 1,该标题被分类为 r/nottheonion 的可能性是 14.9 倍。
Logistic Regression Coefficients. Image credit: Jasmine Vasandani
回顾我的过程,我会在我的数据上测试更多的 NLP 矢量器和分类模型。展望未来,我很好奇如何通过机器学习来解析图像、视频和其他形式的媒体,因为新闻文章并不总是以文本格式编写的。我也对 WhatsApp 可能如何创建一个检测假新闻账户的模型有了更好的理解。至于 WhatsApp 删除账号的准确率得分,那是我至今还在想的问题。
要查看我在这个过程中的所有代码,请查看我的 GitHub repo 。
*帽子提示大卫·五车二与我分享 API 包装器!
Jasmine Vasandani 是一名数据科学家、战略家和研究员。她热衷于建立包容性的数据社区。了解她更多:www.jasminev.co/
我做了一个乐谱转录器——以下是我的操作方法
原文:https://towardsdatascience.com/i-built-a-music-sheet-transcriber-heres-how-74708fe7c04c?source=collection_archive---------6-----------------------
从音符到 ABC 符号的翻译从未如此简单!
过去几年,机器学习和深度学习领域经历了巨大的变革,并在许多领域带来了许多有用的应用。一个感兴趣的领域是光学音乐识别(OMR)。根据维基百科,OMR 是一个研究领域,调查如何通过计算读取文档中的音乐符号。OMR 的目标是教会计算机阅读和解释乐谱,并生成机器可读版本的书面乐谱。让我们就这么做吧!
The end product — an annotated music sheet with notes translated in ABC notation
音乐速成班
在我开始写代码之前,我先简单介绍一下乐谱。我们中的许多人都是通过学习如何阅读音符的缓慢而痛苦的过程开始学习音乐的。事实上,许多人通过在乐谱上写下每个音符对应的字母来将音符转换成 ABC 符号。
Converting between notes and ABC notation
我自己经历过这个过程,我决定如果我能建立一个 web 应用程序,可以自动将音符翻译成 ABC 符号,并在乐谱上标注 ABC 字母,那将是非常棒的!
深度学习模型
因此,我开始寻找能够执行这项任务的合适的深度学习架构。在此之前,我没有太多的光学识别模型的经验,所以我不确定是否会有任何关于这个主题的现有工作。让我惊讶的是,我在《应用科学杂志》上发现了一篇由 Calvo-Zaragoza 等人在 2018 年发表的非常精彩的研究论文,题目是端到端的神经光学音乐识别单音乐谱。他们甚至策划了一个数据集:乐谱的印刷图像(PrIMuS ),包含超过 80,000 个西方常用记谱法的真实乐谱!
Calvo-Zaragoza 等人提出的模型由一个卷积神经网络(CNN)组成,用于从输入图像中提取特征,随后是一个双向长短期记忆(BLSTM)网络,用于处理序列,单个五线谱被视为一个序列。CNN 最后一层的输出连接到 BLSTM 第一层的输入,形成卷积递归神经网络(CRNN)。研究人员使用了一种特殊的损失函数,连接主义者时间分类(CTC)损失函数,它提供了一种优化 CRNN 参数的方法,以便在给定输入 x 的情况下,它可能会给出正确的序列 y。这里,输入 x 代表单个五线谱图像,y 是其相应的音乐符号序列。
Graphical scheme of the CRNN taken from the paper.
但是请注意,该模型不输出关于每个音符的确切位置的信息,而只输出音符出现的顺序。然而,这并不重要,因为尽管音乐读者可能不知道哪个音符对应于哪个字母,但他们可以根据输出的字母数量来理解。
有关 CRNN 架构和实验细节的更多信息,请查看他们的论文这里了解更多信息。
在 Web 上部署
如果你只是想得到代码,点击这里。
好了,现在我们已经简单地了解了模型架构,现在是实现的时候了!研究人员已经上传了他们在 Tensorflow 中实现的模型,并将代码上传到 Github 上。在此基础上,我能够快速建立模型,并准备在 web 上部署它。首先,确保您安装了 tensorflow v1、flask 和 OpenCV。然后,下载研究人员训练的语义模型以及语义词汇。还要下载字体 Aaargh.ttf ,因为需要用 ABC 符号对图像进行注释。(如果您想自己训练模型,请前往 tensorflow 模型 Github 存储库获取说明,并下载 PrIMuS 数据集)。语义词汇表基本上是一个将整数表示映射到实际音符的字典,比如 index 348 如何给你 note-A2_quarter 。但是,由于模型的词汇表包含的信息比需要的要多得多(如拍号、竖线等),而且由于演奏者无需任何音乐背景知识就可以在乐谱上看到,所以不需要对这些信息进行注释,因此我对模型的输出进行了后处理,仅包含 ABC 字母,代码如下:
notes=[]
for i in array_of_notes: // array_of_notes contains the full output
if i[0:5]==”note-”:
if not i[6].isdigit():
notes.append(i[5:7])
else:
notes.append(i[5])
幸运的是,所有的笔记都标有“note-”作为前 5 个字符,所以很容易只抓住那些与 ABC 字母相关的。
Web 应用程序是做什么的?
获得包含相关注释的数组后,我使用 PIL ( Python 图像库)库将注释添加到图片本身。这包括创建一个新的完全白色的图像,其宽度和高度是原始图像的 1.5 倍,以扩展原始图像。然后,我使用 Image.paste()函数将原始图像复制到白色图像上。在下面用空白扩展了原始图像后,我可以在五线谱下面打印 ABC 字母。
Original Image
Annotated Image
如前所述,该模型不包含每个音符的确切位置信息,而是只打印出一系列字母,所以我必须做一些计算,使 ABC 字母在五线谱下方排列非常。它没有完全对齐,这肯定是未来改进的一个领域,但这不是一个大问题,因为音乐播放器可以根据出现的顺序知道哪个字母对应哪个音符。
在研究人员提供的 tensorflow predict.py 代码的基础上,我用 Flask 实现了我的 web 应用。Flask 是一个非常方便的 web 应用程序框架,它可以让每个人在尽可能短的时间内将自己的 python 代码移植到 web 应用程序上。所有 Flask 需要的是您的主要 python 代码、html 文件和 css 模板,您就可以开始了!
仔细看看弗拉斯克
Flask python 文件只需要对当前的机器学习 python 文件做一些小的补充。首先,你必须添加行
app = Flask(__name__)
导入 Flask 后,在您的机器学习代码上方创建 web 应用程序的 Flask 类的实例。然后,在后面添加下面一行:
if __name__==”__main__”:
app.run()
当 python 运行该文件时,它会将名称"__main__"
分配给脚本。因此,__name == "__main__"
得到满足,app.run()执行。在此之后,您必须定义一些函数,并将它们映射到一些路由,例如定义用户上传音乐表后,如何重定向到/预测包含注释音乐表的内容。查看烧瓶文档和我的代码了解更多信息。
最后的润色
现在 python 文件已经设置好了,剩下的就是 html 文件和 css 文件了。文件夹结构通常如下:
app.py
├── templates
| ├── html files here
├── static
| ├── css
| └── css files here
在这个项目中,该网站是风格化的布尔玛,一个伟大的开源 CSS 框架,我强烈推荐给大家!它使用简单,不需要太多的 Javascript,看起来非常好。
这个项目还需要一些额外的文件——深度学习模型、语义词汇文件、字体和任何你想要测试的图像。所以如果你已经下载了所有的文件,你应该这样组织你的文件夹:
app.py
vocabulary_semantic.txt
Aaargh.ttf
├── Semantic-Model
| ├── semantic_model.meta
| └── semantic_model.index
| └── semantic_model.data-00000-of-00001
├── templates
| ├── index.html
| └── result.html
├── static
| ├── css
| └── bulma.min.css
就是这样!一旦如上所述设置好了一切,就进入你的终端/命令提示符。将目录更改为包含您的app.py
文件的目录,并运行python app.py
。等待几秒钟,您应该会收到一条消息,显示您应该访问的链接,以便查看 web 应用程序。转到网址,上传您的音乐表,并获得结果!带注释的工作表将被保存到与您的app.py
文件相同的目录中。
请注意,目前该模型只能处理单音乐谱(由一条旋律线组成的乐谱)。所以不要给它太复杂的分数!
试试这个!我希望你能从中得到乐趣,并告诉我进展如何!如果你有任何关于如何使用这个模型的好主意,请在评论区分享!
这篇文章也发表在我的博客里。
使用可视化交流数据
原文:https://towardsdatascience.com/i-decided-to-download-my-social-media-data-facebook-linkedin-and-twitter-with-the-intention-of-64eabf961ed1?source=collection_archive---------12-----------------------
Communicating data using visualizations
我下载了我的脸书数据,这些数据分析了我的在线行为,并更新了过去十年的上网频率和总体参与度。
这篇博客文章以分析我在脸书的更新开始了社交媒体分析系列博客。第一次分析的目的是了解:I)我在 2009 年至 2018 年期间在我的脸书账户上发布帖子的频率,并根据更新的类型打破这些更新,即发布状态更新、帖子(这是指分享图片、新闻文章或转发附有一些个人评论的脸书帖子),在朋友的时间线上分享一些东西,分享一篇文章和发布一篇文章的链接,ii。)按年份和 iii 发布特定类型更新的年度百分比可能性。)我按工作日、小时和月份发帖的倾向,通过过去 10 年发帖频率的加权平均值来衡量。这将作为对我在过去十年中发布的内容类型进行更详细分析的后续,忽略年轻的我可能已经发布的明显令人生厌的帖子。
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import numpy as np
from google.colab import drive
drive.mount('/content/gdrive')
fb_posts = pd.read_csv(‘/***/myposts.csv’)
我把脸书的数据保存在我的谷歌硬盘上;为了在 Google Colab 上与这些数据进行交互,我必须使用 google.colab 包来挂载 GDrive 并打开与我的分析相关的文件夹和 csv。
阅读文件
#I need to convert this into a readable datetime
#iterate through timestamps and convert individual rows
fb_posts[‘timestamp’] = fb_posts[‘timestamp’].apply(lambda x: datetime.datetime.fromtimestamp(int(x)))
#create month, day, year and time columns
fb_posts[‘year’] = fb_posts.timestamp.dt.year
fb_posts[‘month’] = fb_posts.timestamp.dt.month
fb_posts[‘day’] = fb_posts.timestamp.dt.day
fb_posts[‘time’] = fb_posts.timestamp.dt.time#making the assumption that if 95% of the rows are NaN values, the column doesn’t contain valuable info for the purposes of our analysis
#use dropna and specify threshhold of na values
fb_posts = fb_posts.dropna(thresh=len(fb_posts)*0.05, axis=1)#use list(fb_posts) to id the remaining columns
fb_posts = fb_posts.drop(fb_posts.iloc[:,[1,4]], axis=1)
关于从 facebook 导入的数据,您注意到的第一件事是,您的更新的时间戳是以 unix 时间戳格式(一个表示自 1970 年 1 月 1 日以来发生的秒数的数字)导入的,因为它同时表示所有时区。为了将这个时间戳转换成可读时间,我在时间戳列的每一行上应用了一个 lambda 函数。所以我遍历每一行,并应用一个 lambda 函数将时间戳转换成日期时间格式。
然后,我继续使用。年份,。月,。天还有。时间分别。我需要这些专栏来回答我在开篇段落中提出的问题。
目前,dataframe 大约有 126 列,其中大部分对我们的分析没有用。为了过滤掉不重要的列,我删除了 NaN 值占行中值的 95%或更多的列。我这样做是为了减少列的数量,这样我就可以专注于我真正想要用于分析的列(并可能找到其他包含有趣信息的列)。
一旦我有了更少的列,我就根据与我们的分析最相关的列来限制列。
数据清理
#rename column
fb_posts.rename(columns = {'data/0/post':'posts', 'attachments/0/data/0/external_context/url':'links'}, inplace=True)
fb_posts['title'] = fb_posts['title'].astype(str)
for x in ['link', 'post', 'status', 'timeline','recommend','books','reviewed','playlist','feeling','event','likes','listened','played','published','shared','was','followed','commented','song','responded','wants','invested','photo']:
fb_posts.loc[fb_posts['title'].str.contains(x), 'title'] = x
#remove chart junk
removal = ['recommend','books','photo','reviewed','playlist','nan','feeling','event','likes','listened','played','published','was','followed','commented','song','responded','wants','invested']
fb_posts2= fb_posts[~fb_posts['title'].isin(removal)]
现在有趣的部分来了:清理。我首先将列重命名为更容易引用的名称:然后将 title 列中的所有项目转换为 string 格式。我这样做是为了帮助我们使用一个单词的引用(例如,状态=状态更新)来分类每行所代表的文章类型。
通过将 title 列中的所有项目转换为 string,我可以遍历 title 列中的每个字符串,并检查它是否包含在上面代码块中定义为“x”列表的单词列表中出现的任何单词。如果是这样,我就将该行的值更改为“x”列表中的相关引用文本。
然后,我遍历这个列表,删除引用删除列表中指定的引用词的值。我这样做是因为我只想处理状态、帖子、链接、分享和时间线更新。基于对我在脸书历史上发布的内容的理解,我认为这些是我在脸书活动的主要内容。
按年份和类型绘制更新频率图
fb_posts2.groupby([‘year’,’title’]).size().unstack().plot.bar(stacked=True)
Frequency of Facebook updates
为了形象化我们的图表,我按年份分组,并计算每种更新(标题)的出现次数。有趣的是,频率有点像高斯分布,频率峰值在 2012 年和 2015 年之间的中间,总更新数最低的是在 2009 年和 2018 年的尾部。这不一定表明我在社交媒体上不太活跃,而是我越来越多地从脸书转向 Twitter。这主要是因为该平台潜在的学习价值,以及它如何让自己成为比人们在脸书上分享猫图片和其他随机事情有趣得多的对话。
按百分比更新
我想想象的下一个趋势是了解 2009 年至 2018 年间任何一年的更新类型,按百分比计算。
#we want to find the count of posts, status updates and link shares by year
nine = fb_posts2[fb_posts2['year']==2009].groupby('title').size()
ten = fb_posts2[fb_posts2['year']==2010].groupby('title').size()
eleven = fb_posts2[fb_posts2['year']==2011].groupby('title').size()
twelve = fb_posts2[fb_posts2['year']==2012].groupby('title').size()
thirteen = fb_posts2[fb_posts2['year']==2013].groupby('title').size()
fourteen = fb_posts2[fb_posts2['year']==2014].groupby('title').size()
fifteen = fb_posts2[fb_posts2['year']==2015].groupby('title').size()
sixteen = fb_posts2[fb_posts2['year']==2016].groupby('title').size()
seventeen = fb_posts2[fb_posts2['year']==2017].groupby('title').size()
eighteen = fb_posts2[fb_posts2['year']==2018].groupby('title').size()
a = [x/sum(x)*100 for x in [nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen]]
df = pd.DataFrame(a, index= my_names)
#remove all NaN values and replace with 0
df['post'].fillna(0, inplace=True)
df['shared'].fillna(0, inplace=True)
df['timeline'].fillna(0, inplace=True)
在这段代码中,我获得了每种类型的更新占该特定年份总更新的百分比。然后,我继续删除由某些年份未发生的某些类型的更新导致的任何 NaN 值,并用 0 替换该 NaN 值。
df.plot(kind='bar', stacked=True, width=0.98)
Update type by percentage
从这个视觉化中,有一个明显的趋势表明状态更新在减少,我的更新越来越倾向于链接和帖子更新。我对社交媒体的使用案例已经从与老朋友保持联系转变为讨论热门话题或让我的业务和职业抱负感兴趣的问题。这清楚地反映在我的更新趋势中。
脸书按天更新
这个分析的问题集中在找出我在工作日更新脸书的倾向。
#convert dates to week days
fb_posts2[‘weekday’] = fb_posts2.timestamp.dt.weekday_name#find average tweets per day grouped by year
weighted = fb_posts2.groupby(‘year’).weekday.value_counts(normalize=True).unstack().sum().sort_values().plot(kind=’bar’)
在将我的时间戳上的工作日转换为单词 weekday 之后,我寻找一种解决方案来计算我的数据中每年按工作日更新的加权平均值,从最小到最大对条形进行排序,并对数据帧进行拆分以对其进行整形,并返回整个定义期间每天的加权平均值之和。
Most frequent posts by week day
最终结果不言自明:我的脸书更新频率在周末和本周初达到峰值。从最近的角度来看,我更有可能在一周结束和开始时分享脸书的链接,因为这是我最有可能积极检查我的脸书和阅读我更有可能分享的外部内容的时候。我相信我在周五通常更活跃,因为我的注意力往往会在一天结束时下降,因为我会期待周末,而在周一,我通常会在早上早些时候慢慢开始使用社交媒体,并放松进入我的工作。
在过去的两年里,这种情况越来越多地出现在 Twitter 上,而不是脸书,这解释了过去几年脸书帖子数量下降的原因。
脸书每小时更新
#facebook posts by hour, I need to split the first 2 digits from time
fb_posts2['hour'] = fb_posts['time'].apply(lambda x: x.hour)
time_weight = fb_posts2.groupby('year').hour.value_counts(normalize=True).unstack()
time_weight.sum().sort_index().plot(kind='bar')
为了显示过去 10 年中每小时的平均更新,与前面的分析非常相似,我计算了每小时更新的加权平均值,并通过将 groupby 函数与 value_counts (计算小时的唯一值总数)结合起来对这些平均值求和。“normalize”参数只允许我计算并返回我计算的小时数的唯一值的相对频率。
Most frequent posts by hour
平均每小时的帖子数从早上 5 点开始持续增加,在下午 6-9 点达到高峰。我会推测,这是我更可能坐在家里拿着手机的时候(取决于讲座或工作后的一年)。此外,我注意到我最容易分心的时间是上午 10-11 点和下午 6-8 点。虽然我通常是一个夜猫子,大多数日子熬夜到凌晨 1 点,周末甚至更久,而且通常在深夜更活跃。我倾向于在晚上 9 点左右不活跃在社交媒体上。
脸书每月更新
month_weight = fb_posts2.groupby('year').month.value_counts(normalize=True).unstack()
labels = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sept','Oct','Nov','Dec']
fig, ax = plt.subplots()
month_weight.sum().sort_index().plot(kind='bar')
plt.title('Most frequent post months')
plt.ylabel('Weighted Average')
plt.xlabel('Months')
ax.set_xticklabels(labels)
为了按月对条形图进行排序,我在 groupby 函数中以整数格式保存了月份。因为我知道按索引排序这些月份将返回从 1 到 12 排序的月份,所以我可以使用 set_xticklabels 将月份转换为由它们各自的缩写表示的月份
Most frequent posts by month
从每月发帖的频率来看,我在脸书的活跃程度似乎在冬季有所下降,在夏季有所上升,尤其是在接近年底的时候。如果不对我每月发布的帖子类型和主题进行进一步的分析,很难对这种趋势的原因进行理论化。
这篇文章不是我一个人写的
原文:https://towardsdatascience.com/i-didnt-write-this-article-alone-bc604e50859c?source=collection_archive---------17-----------------------
AI 在这里,越来越容易使用和理解。
使用 Python 在几分钟内用 GPT-2 生成文本。
Credit to my amazing sister Heizel Vázquez
不久前,我写了一篇关于数据科学的文章:
数据科学家不是知道如何使用 Python 或 R 的人,他们是可以通过理解他们拥有的数据来改进和优化业务工作方式的人,并创建模型来解释现实的复杂性,同时创建可以推动行动的解决方案,即与业务相关的特定行动。
我想看看我能想到的与这个思路相关的其他东西。这是系统产生的结果:
数据科学家是那些了解业务、了解业务需求、了解客户需求、了解业务模式并使用这些知识来更好地了解业务和客户的人。
在处理应用程序或业务时,您需要一名数据科学家来了解应用程序或业务需要什么类型的数据。当要做出明智的决策时,你需要一个懂得如何编写优秀的数据可视化(或分析)应用程序的人。这个人也可以理解即将到来的数据,并确定使用这些数据的最佳方式。
GPT-2 基础
这项工作在很大程度上基于 greycode 和 huggingface 的工作,你可以在这里看到他们的回复:
[## graykode/gpt-2-Pytorch
带有 OpenAI gpt-2 Pytorch 实现的简单文本生成器— graykode/gpt-2-Pytorch
github.com](https://github.com/graykode/gpt-2-Pytorch) [## 拥抱脸/py torch-预训练-BERT
📖变形金刚的大扩展库:为谷歌的 BERT,OpenAI GPT 和 GPT-2 预训练 PyTorch 模型…
github.com](https://github.com/huggingface/pytorch-pretrained-BERT)
但是在运行代码之前,我们需要一些关于这个模型如何工作的基础知识(如果您只是想使用这个模型,请转到下一节)。
GPT-2 是一个大型的基于转换器的语言模型,具有 15 亿个参数,在 800 万个网页的数据集上进行训练。GPT-2 训练有一个简单的目标:预测下一个单词,给定一些文本中的所有以前的单词。对我们来说很遗憾,但也许对世界更好的是,他们没有发布整个模型,而是发布了一个较小的模型。您可以在这里看到最初的实现:
[## openai/gpt-2
“语言模型是无监督的多任务学习者”论文的代码——open ai/GPT-2
github.com](https://github.com/openai/gpt-2)
现在我们有一个(117 米参数)和中等(345 米参数)版本的 GPT-2 测试。该模型如下所示:
Improving Language Understanding by Generative Pre-Training, Radford et al.
这些是型号规格:
我们的模型很大程度上遵循了最初的变压器工作。我们训练了一个只有 12 层解码器的变压器,它有掩蔽的自我注意头(768 维状态和 12 个注意头)。对于位置式前馈网络,我们使用 3072 维内部状态。我们使用了 Adam 优化方案,最大学习速率为 2.5e-4。在前 2000 次更新中,学习率从零线性增加,并使用余弦时间表退火至 0。我们在 64 个随机采样的小批次上训练 100 个时期,512 个标记的连续序列。由于 layernorm 在整个模型中广泛使用,简单的权重初始化 N(0,0.02)就足够了。我们使用了一个字节对编码(BPE)词汇,有 40,000 个合并和残差,嵌入,以及 0.1 的注意丢失率用于正则化。我们还采用了在中提出的 L2 正则化的修改版本,在所有非偏置或增益权重上 w = 0.01。对于激活函数,我们使用高斯误差线性单位(GELU)。我们使用学习位置嵌入,而不是原来的工作中提出的正弦版本。
他们在这里提到的“原创作品”是谷歌的一篇论文,名为“注意力是你所需要的”(2017)。这里他们提出了一个看起来像这样的变压器:
Attention Is All You Need (2017)
Transformer 是一种避免重复出现的模型架构,而是完全依赖于一种注意机制来绘制输入和输出之间的全局依赖关系。
变压器依靠一个编码器和一个解码器。这里,编码器将符号表示的输入序列 (x1,…,xn) 映射到连续表示的序列 z = (z1,…,zn) 。给定 z,解码器然后一次一个元素地生成符号的输出序列 (y1,…,ym) 。在每一步,模型都是自回归的,在生成下一步时,消耗先前生成的符号作为附加输入。
它们通过警示机构连接。它可以被描述为将查询和一组键-值对映射到输出,其中查询、键、值和输出都是向量。输出被计算为值的加权和,其中分配给每个值的权重由查询与相应键的兼容性函数来计算。
关于注意力机制和它的工作方式还有很多要讨论,请阅读詹姆斯·蒙泰斯的文章:
[## 检查变压器架构—第 1 部分:开放 GPT 2 争议
“回收对世界没有好处。它对环境有害,对我们的健康有害,对我们的…
towardsdatascience.com](/examining-the-transformer-architecture-part-1-the-openai-gpt-2-controversy-feceda4363bb)
如何使用 GPT 新协议模型
到目前为止,我们一直是技术性的,但在使用模型之前,最好有一个我们正在做什么的想法。但是现在,我们如何使用它呢?
让我们从旋转 JupyterLab 会话和克隆一些 repos 开始。为此,我使用了一个用于数据科学的云托管系统。
项目在那里(用叉车测试):
[## MatrixDS |数据项目工作台
MatrixDS 是一个构建、共享和管理任何规模的数据项目的地方。
community.platform.matrixds.com](https://community.platform.matrixds.com/community/project/5d653ca4d3af3918c87bc0c7/files)
这是 GitHub 回购协议:
[## FavioVazquez/gpt2-matrixds
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/FavioVazquez/gpt2-matrixds)
注意:如果你铲车回购你会有一切已经测试代码,如果没有遵循以下说明。
在 JupyterLab(我在本教程中使用的那个)中,打开终端并开始克隆 greycode repo:
git clone [https://github.com/graykode/gpt-2-Pytorch](https://github.com/graykode/gpt-2-Pytorch)
然后转到刚才创建的文件夹,下载 hugginface 的预训练模型:
curl --output gpt2-pytorch_model.bin [https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-pytorch_model.bin](https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-pytorch_model.bin)
并安装要求:
pip install -r --user requirements.txt
我还需要安装 PyTorch 和 tqdm,对于 pip,只需输入:
pip install --user torch torchvision
pip install --user tqdm
之后,你就可以走了!您有一个运行实验的命令行工具,可以通过以下方式使用:
python main.py --text "This is a text"
或者,如果您在笔记本电脑中:
!python main.py --text "This is a text"
如果您转到 main.py 文件,您将看到模型是如何被使用的,但是没有太多关于模型本身的描述。我们可以改变的论点是:
:seed=None : Integer seed for random number generators, fix seed to reproduce results
:nsamples=1 : Number of samples to return total
:batch_size=1 : Number of batches (only affects speed/memory). Must divide nsamples.
:length=None : Number of tokens in generated text, if None (default), is determined by model hyperparameters
:temperature=0.7 : Float value controlling randomness in boltzmann distribution. Lower temperature results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive. Higher temperature results in more random completions.
:top_k=40 : Integer value controlling diversity. 1 means only 1 word is considered for each step (token), resulting in deterministic completions, while 40 means 40 words are considered at each step.
:unconditional=False: If true, unconditional generation.
最难的概念是温度和 top_k ,阅读原文可以更好的理解:
例子
注意:我在这里展示的例子可能与你在 repo 或 notebook 中看到的不一样,它们是经过几次代码迭代后我能找到的最好的引用。
我们来试几个例子,看看这个东西有多好。
第一个文本将是:
“人工智能是新的电力”
!python main.py --text "AI is the new electricity" --top_k=10
样品:
在过去的两年里,它一直在开发世界上最先进和最具成本效益的发电系统,并提供世界上最高效的电力。它还致力于让世界上最贫穷的人用得起电,并投资于新能源技术以应对这些挑战。
我不认为算法在这个例子中有足够的信息,它只是谈论电力和功率。让我们尝试一些不同的东西。
让我们试试我的文章“学习数据科学的 3 个最大错误”中的一些内容:
数据科学需要实践。你所学的一切,即使教授没有告诉你,也要实践和尝试。这是真正理解事物的基础,当你在这个领域工作时,你会做许多不同的实际工作。
!python main.py --text "Data science needs practice. Everything you learn, even though if the professor doesn't tell you, practice and try it. This is fundamental to really comprehend things and when you are working in the field you will be doing a lot of different practical stuff." --top_k=20
下一次你在一个领域,你将会工作或者做很多对你来说不同的事情。你将在现实世界中做这些事情。你可以做不同的事情。你会在不同的领域发现不同的东西。你会在不同的工作中发现不同的东西。你会发现不同的东西。所以这不是你在现实世界中会做的事。你觉得更有趣的工作。你觉得更有趣的工作。你觉得更有趣的工作。你觉得更有趣的工作。有很多在现场的人实际上并不在现场。
!python main.py --text "Data science needs practice. Everything you learn, even though if the professor doesn't tell you, practice and try it. This is fundamental to really comprehend things and when you are working in the field you will be doing a lot of different practical stuff." --top_k=10 --temperature=0.8
如果你看着这个世界,这个世界对你来说是有意义的,不仅仅是这个世界或这个世界,而是整个世界,是这个世界给了人们希望和幸福。你需要了解的是这个世界。
看起来好多了,不是吗?
最后,让我们回到文章的第一句话:
数据科学家不是知道如何使用 Python 或 R 的人,而是可以通过理解他们拥有的数据来改进和优化业务工作方式的人,并创建模型来解释现实的复杂性,同时创建可以推动行动的解决方案,即与业务相关的特定行动。
!python main.py --text "A data scientist is not someone who knows how to use Python or R, is the person that can improve and optimize how a business work by understanding the data they have and create models that explain the complexity of reality while creating solutions that can drive actions, specific actions related to the business." --top_k=40 --temperature=0.9
在分析数据时,您需要有人了解您正在查看什么类型的数据,以及您将如何在业务案例中使用这些类型的数据。该人员还可以理解即将到来的数据,并确定在该业务案例中使用何种类型数据的最佳方式。
数据科学家是一个可以帮助你开发更好的商业解决方案的人。此人还可以帮助您制定更好的业务决策,以便更好地向客户解释数据。那个人也可以帮助你使用数据分析软件,学习如何更好地分析你的数据。
太棒了。这与我正在考虑的数据科学很接近,但系统帮助我创造了这些句子。您可以尝试一下,但是我建议您测试不同的配置,并阅读产生的文本,看看它是否有意义。
结论
我们正在达到人工智能世界的新水平,测试、尝试和扩展世界上最优秀的人的工作和研究变得越来越容易。在本文中,我展示了如何在 MatrixDS 平台中使用 GPT-2 模型,只需要最少的配置和该模型的一些基础知识。
你可以尝试非常不同的场景来测试这个模型,并开始用数据科学和人工智能改变世界。
感谢您的阅读,如果您想了解更多信息,请关注我这里,以及 LinkedIn 和 Twitter:
[## 法维奥·瓦兹奎——science y Datos | LinkedIn 创始人/首席数据科学家
加入 LinkedIn ‼️‼️重要提示:由于 LinkedIn 技术限制,我现在只能接受连接请求…
www.linkedin.com](https://www.linkedin.com/in/faviovazquez/) [## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/faviovaz)
“我不喜欢板球…我爱它”
原文:https://towardsdatascience.com/i-dont-like-cricket-i-love-it-a710b8cc0f49?source=collection_archive---------14-----------------------
网络刮痧遇上潮流
介绍
板球是一种球棒和球的游戏,双方各有 11 名队员,比赛场地的中心是一个 20 米(22 码)的球场,两端各有一个小门,每个小门由两个球组成,平衡在三个树桩上。击球方通过用球棒击打在三柱门投球得分,而保龄球和防守方试图阻止这一点,并解雇每个球员(所以他们是“出局”)(维基百科)。
(https://www.istockphoto.com)
动机
板球的四年一度的展览,国际刑事法院板球世界杯 2019 年本月早些时候在板球的“主场”英格兰开始。甚至在世界杯开始之前,就有很多关于最新一届世界杯的炒作。ESPNcricinfo 已经成为板球爱好者访问所有板球比赛和球员数据的热门网站。这篇博客背后的动机是如何从网站上收集有用的信息,并在 r 的帮助下从中产生一些基本的见解。在这第一篇博客中,我对“1971 年至 2019 年的国际板球结果”数据集进行了广泛的探索。该数据集列出了从 1971 年到 2019 年初的所有国际板球比赛(如比赛中的对手国家或民族)。
更具体地说,本博客将涵盖以下内容:
- 我们将首先学习如何收集 ESPNCricinfo.com 迄今为止不同团队的记录
- 然后,我们将看到一些从一个页面中提取信息的基本技术:我们将按年份提取所有 once day international (ODI)团队记录的比赛团队、获胜者、保证金、场地、比赛日期和记分牌
- 以及所有 ODI 在一个子页面上按年份显示的所有比赛的个人团队得分
- 有了这些工具,你就可以开始你的游戏,并比较不同板球队的比赛(我们自己选择的):我们将看到你如何利用
tidyverse
包,如绘图和dplyr
,结合stringr
,来进一步检查数据,并根据tidyverse
的哲学为进一步的调查和统计推断制定假设。
网页抓取 ESPNCricinfo.com:rvest
步骤 1: 准备工作
步骤 2: 废弃团队记录
步骤 3: 提取记分卡 URL
步骤 4: 废弃记分卡
第一步:准备
首先,我做了一个我想废弃的年份的向量。
第二步:删除团队记录
在下一步中,我将这个函数应用于我之前生成的 URL 列表。为此,我使用了purrr
包中的map()
函数和 year-url 数据框中的‘rvest’函数。
步骤 3:提取记分卡 URL
从href
属性中提取记分卡的 URL。然后获取 URL 列表并抓取我正在寻找的数据,然后在一些预处理后将其粘贴到数据框中。
第四步:废弃记分卡
Imap``rvest
对记分卡 URL 起作用。因为这是大量的网址。我用的是进度条progress
包。
数据清理和与 Tidyverse 的争论
在任何环境中处理数据的一个大问题是数据清理和数据集合并的问题,因为我经常从ESPNCricinfo.com
收集数据。有无数种方法可以将 R 用于数据争论,但是我非常依赖 tidyverse。我用tidyr dplyr
来处理不同的数据争论和重塑任务。最后,我编写了一个方便的函数,它从记分牌数据帧中获取输入。它提取所有游戏的分数绑定到一个 tibble。然后应用map
函数来获取包含团队记录所需信息的数据帧。经过一些处理后,将得到的数据帧连接起来。
使用 Tidyverse 进行可视化数据探索
数据可视化是数据分析过程中的一个重要工具。可视化任务的范围可以从生成基本分布图到理解机器学习算法中复杂的因果变量的相互作用。随着数据集的创建,我将可视化 ODI 比赛的分布情况。我将ggplot2
创建主要图形,以及一些看起来松散的趋势,为排名靠前的板球队获胜的情节。
每年的比赛次数
国际板球理事会(ICC)根据所有球队在不同比赛和双边系列赛中的表现给他们打分。这些分数随后被用于球队的排名。这一排名有助于保持各国之间的良性竞争,以不断争取胜利。基于这个排名,我只进入了前 10 名的团队进行探索和分析。
顶级球队的比赛次数
2019 年世界杯参赛球队
大英帝国在将板球运动传播到海外方面发挥了重要作用,到 19 世纪中叶,它已经在澳大利亚、加勒比海、印度、新西兰、北美和南非站稳了脚跟。然而,我将只关注有资格参加 2019 年世界杯的球队;包括阿富汗、澳大利亚、孟加拉、英国、印度、新西兰、巴基斯坦、南非、斯里兰卡、西印度群岛。
ICC Cricket World Cup 2019 Teams Final List (https://dailysportsupdates.com)
哪个世界杯球队的胜率最高
奥迪斯,印度是领头的。西印度群岛、南非、英格兰和孟加拉国在这种形式中取得了胜利,并在榜单上排名前 5。现在每支球队都至少踢过一次球,根据我们目前看到的表现来预测哪个国家会赢仍然是不切实际的。然而,印度和英格兰似乎都是冠军的有力争夺者,只要他们能保持目前的比赛状态。
结论:
我们确定了如何将网页抓取分成不同的阶段,每个阶段都有自己需要应对的挑战:网站分析阶段、数据分析和设计阶段以及生产阶段。在每个阶段中,我们都提到了在进入下一阶段之前要开展的一些活动和要回答的一些问题。在这篇博客中,我们已经看到了用于网络抓取的 R 包是如何应用于统计领域的。我们已经展示了网络抓取如何用于探索背景变量和检索元数据等情况,以及它如何与 r 的tidyverse
包完美结合。我们在 ICC 拥有最好的 ODI 板球队,它们是胜率最高的球队。我们提供了 plausibe isnight 来预测 2019 年 ICC 板球世界杯,我将在下一篇博客中发表。敬请关注。
参考资料:
“我不喜欢板球……我爱它!”:10cc — Dreadlock Holiday
《蟋蟀》。维基百科、国际板球理事会(ICC)
“统计与记录”:ESPNcricinfo.com
“gg plot 2】:H Wickham——数据分析的优雅图形
“Rvest】:H Wickham——轻松收获(刮)网页
“The tidy verse】:H Wickham——R 包
“gist-syntax-themes”:https://github.com/lonekorean/gist-syntax-主题
我喂了一个机器人八百个汉堡,这就是它吐出来的东西
原文:https://towardsdatascience.com/i-fed-a-bot-eight-hundred-burgers-and-this-is-what-it-threw-up-b78202ca39f9?source=collection_archive---------20-----------------------
似乎没有什么是人类能做的,除非有一个聪明的电脑傻瓜出现并做得更好。首先是简单的计算,然后是工厂。1996 年,计算机在国际象棋上打败了我们,1915 年,它们掌握了围棋,现在,它们也来争夺我们的视频游戏。这开始变得有点烦人了。但有一个领域我们永远比我们的数字对手有优势:创造力。
对吗?计算机不能产生创造性的作品。可以吗?它能想象吗?让我们找出答案。还有什么比人类智慧的顶峰,文明的最高荣耀,汉堡包更好的考验呢?
在我的家乡,每年都有一个美食节,来自城市各处的餐馆竞相做出最好、最有创意、最美味的汉堡。在过去的六年里,我一直在努力收集关于这些汉堡的数据。除了统计汉堡中使用的小圆面包、肉饼和其他配料的种类,我还记录了每个汉堡的名称和描述——总共超过 800 个。
1815 Cafe and Bar’s “Sweet Baby Cheesus”: Crumbed mozzarella with smoked cheddar, parmesan cream, jalapeno relish on a herbed milk bun, with straw fries. Matched with Garage Project White Mischief — Salted White Peach Sour.
汉堡的描述证明了人类的创造力。几乎所有能夹在小圆面包里的东西都出现在了菜单上,而且,在很大程度上,它们显示了对口味组合的深思熟虑。这是一个非凡的创造力壮举——想象并制作出新颖、令人兴奋、但味道也不错的配料组合。
这是我们可以教计算机做的事情吗?我们至少可以试试!让我们建立一个算法,可以产生一个从未见过的汉堡的描述。
我们需要一个可以生成文本的算法。这些技术同样支持聊天机器人和预测文本功能,如预先生成的电子邮件回复和自动完成句子。他们都有一个共同的方法:给定一个单词或短语,最有可能跟随的单词是什么?以“昨天我去了……”开头的句子可能以“……去了图书馆”结尾,但同样也可能以“……完全疯了”结尾给定上下文,这些算法试图计算哪一个是更好的选择。
让我们探索其中的一些算法,看看它们是如何工作的,并希望在此过程中制作出一些美味的汉堡。
实现这一点的最简单的方法被称为“马尔可夫链”。这就像游戏“多米诺骨牌”一样,在游戏中,通过匹配的数字将瓷砖连接起来。然而,我们的瓷砖上写的不是数字,而是单词。
Does anyone actually use Dominos for this?
想象一下,我们把我们集合中的每一个汉堡描述,分解成一对单词。威灵顿牛肉汉堡的“碳烤牛肉馅饼配野蘑菇”变成了“碳烤牛肉”、“牛肉馅饼”、“馅饼配”、“配野蘑菇”,等等。我们以同样的方式分解每一个汉堡的描述,就像多米诺骨牌一样,我们把它们混杂在一个袋子里。
现在,我们一次从袋子里拿出一片瓷砖。就像多米诺骨牌一样,我们可以把它们排列出来,把匹配的单词连接在一起。写有“配肉饼”的磁贴可能会连接到写有“配薯条”的磁贴,就像惠灵顿牛肉汉堡一样,但它也可能会连接到写有“配薯条”的磁贴。通过这种方式,我们把有时几乎有意义的汉堡描述放在一起。这里有几个用这种方法制作的汉堡:
奶酪红烧牛肉馅饼配熏牛肉、瑞士奶酪凝块、火柴杆薯条、gorgonzola 馅饼、纯素面包配烧过的甜菜根番茄酱。
手工制作的全熏甜菜根小面包,配以印度香料 taki 鳄梨色拉酱硬山羊奶酪酱,烤红辣椒肉饼,填充手切薯条,搭配 w Garage Project 啤酒,阿斯托里亚小面包配以卷心菜沙拉…
五香和牛淋薯条(五)
这些汉堡有些问题!第一个汉堡几乎是可信的,抛开你如何“奶酪炖”牛肉,或者“gorgonzola 肉饼”尝起来如何的问题。
第二个汉堡有更大的问题——它有两个小圆面包,配料太多。这个描述几乎没有意义。
最后,第三个汉堡根本不是汉堡!只是一些淋了牛肉的薯条,不知何故做成素食。
这些汉堡描述暴露了马尔可夫链方法的一些弱点。对于这样一个简单的算法,它在这种情况下产生了令人惊讶的一致结果,但它忽略了汉堡构造的几个重要规则:一个汉堡应该只有一个小面包,一个肉饼(通常),最多两三种其他配料。如果配上薯条或者其他的伴奏,这些都要在描述的最后介绍。马尔可夫链方法无法解释这些规则。
我们需要更复杂的东西。它能够理解它所使用的单词的含义,更重要的是,理解这些单词的顺序的含义。
我们试图解决的问题是,给定一个或多个前面的单词,如何预测句子中的下一个单词。如果一个汉堡的描述以“猪肉配……”开头,那么下一个词更有可能是“泡菜”、“棉花糖”或“老鼠药”之类的东西。为了生成我们的汉堡描述,我们从一个词开始,从我们收集的真实汉堡描述中随机选择。然后我们试着预测,给定第一个单词,最有可能的第二个单词是什么。
如果我们的第一个词是“熏”,那么第二个词很可能是“鹿肉”或“培根”之类的东西,很可能不是“生菜”。给定第二个单词,我们将这对单词反馈到模型中。给定这两个词,最有可能的第三个词是什么?例如,“熏鹿肉馅饼”比“熏鹿肉小圆面包”更有可能。
我们将使用的模型被称为“LSTM”,代表“长期短期记忆”。就像我们在以前的文章中用来分类图像的算法一样,这个模型是一个“神经网络”。这采用了两层或更多层的算法,首先将汉堡描述中的原始单词提取为有意义的数据,然后根据这种提取的“嵌入”进行预测。
LTSM 采用了两项非常重要的创新。首先,它是一个“递归”神经网络。这意味着它不仅知道描述中单词的意思,还知道这些单词的顺序中存在的意思。第二个创新是,该模型可以考虑句子中单词的不同重要性——该模型识别出汉堡的一些细节——如小面包和肉饼——应该只出现一次。该模型可以选择“保留”在汉堡描述中早期出现的单词,并使用这些重要的单词来通知它在文本中稍后选择的单词。
像其他神经网络模型一样,LTSM 是迭代训练的。它开始做出非常天真的选择,随着每一次迭代(或“时代”)的训练,它变得更加复杂。这是我们的模型在一个时期后的输出:
牛肉和和和和和和和和和和和和和和和和和和和和
这不是一个鼓舞人心的开始。从我们提供给模型的“种子”单词“beef”中,模型选择了它认为最有可能的下一个单词:“and”。并非没有道理——总体而言,“和”是描述中最常见的词。但是这个模型一次又一次地做出同样的猜测,随着句子越来越长,从不更新它的预测。让我们看看它在另一轮训练后表现如何:
牛肉馅饼加牛肉和牛肉和牛肉和牛肉和牛肉和牛肉馅饼加牛肉和牛肉
仍然不太好,尽管它已经在之前的尝试中取得了实质性的进展。据悉,“patty”通常跟在“beef”后面,“with”是另一个常用词。我们继续训练吧。
熏肉牛肉馅饼,烟熏牛肉馅饼,自制奶酪和蛋黄酱,夹在小面包里,还有手切薯条
现在我们有进展了!这个模型已经学会了一些重要的东西:它正在向汉堡中添加更多的配料,并且学会了按照可信的顺序摆放这些配料:肉饼、其他配料、小圆面包,最后是薯条。仍然有太多的“和”和“与”,但我们正在取得进展。让我们再来一次:
牛肉馅饼配烟熏培根和烟熏奶酪,夹在潘多罗面包里,配以手工切制的薯条
这简直太完美了!四个时代的训练(在我的笔记本电脑上大约四十分钟)给了我们非常好的结果。这是一个非常糟糕的汉堡,但至少它是有意义的。
从这里开始,对模型的改进要慢得多。需要十个以上的时间(和几个小时)才能可靠地做出真正可信的汉堡:
牛肉馅饼配烟熏切达番茄和 kāpiti 蓝奶酪,配以潘多罗牛奶面包和薯条
这个模型几乎已经确定了汉堡描述的格式。它学会了像“烟熏切达干酪”这样的短语。据悉,每种配料只应出现一次,尽管在这种情况下,它既有切达奶酪又有蓝奶酪,这是一个奇怪的烹饪选择。除了缺少逗号和大写字母(这些已从训练数据中删除),这种汉堡不会在餐厅菜单上引起任何关注。
下面是通过向同一个模型提供不同的“种子”单词而创建的几个汉堡:
木薯粉加香料的羊肉馅饼,夹有烟熏奶酪、蛤蜊调料和泡菜,放在潘多罗面包里,还有薯条
陈年牛肉馅饼配烟熏培根和培根果酱、西红柿酱和火箭酱,夹在 zaidas 面包房的牛奶小面包里,还配有薯条
猪肉馅饼配烟熏切达干酪和烟熏切达干酪沙拉,配以潘多罗牛奶面包和薯条
炸鸡配泡菜和红卷心菜沙拉,面包配薯条
饼干碎乡村肉猪肉馅饼配烟熏切达干酪贸易厨房金斯米德卡斯尔波因特羊乳酪和 kāpiti bay 屠夫培根配克莱尔维尔面包店面包配手工切薯条
相当好吃!我不知道饼干碎猪肉或木薯五香羊肉,但在大多数情况下,这些看起来像很好的汉堡。该模型已经学习了许多复杂的汉堡构造规则,这使它能够可靠地制作出令人信服的餐馆汉堡描述的复制品。
但是上面选择的汉堡掩盖了我们模型的一个弱点。再看更广泛的选择,它生产的汉堡几乎都极其相似。该模型有反复重复的模式:“烟熏培根和培根果酱番茄调味品和火箭”经常出现,每个汉堡都配有薯条,偶尔手工切割。此外,产生的汉堡范围相当狭窄。大部分是牛肉汉堡。很少有人偏离传统的汉堡标准。我们的模特是一个非常缺乏想象力的厨师。
事情是这样的。该模型学习预测句子中的每个单词,如果猜测错误,它将受到惩罚。这有助于模型学习汉堡描述的结构和模式,但当给定相对较小的数据集时,它会鼓励模型做出非常保守的选择。它学会在每个关键时刻做出最有可能的选择。它不是试图有创造性,而是试图成为正确的 T2。
这是所有人工智能算法的一个基本约束。从本质上讲,它们的运作原则是尽量减少误差。我们的汉堡生成器简单地学习了定义普通汉堡的原则,并试图尽可能做出最不令人惊讶的选择。它永远不会包含任何它没有见过的成分。它永远不会想出新的烹饪技术。在模仿汉堡描述的模式方面,它可能比马尔可夫链算法更熟练,但它本质上仍然只是重新排列它所训练的描述的片段。这有点令人失望。我们能做得更好吗?
结果是肯定的!虽然我们无法绕过核心约束——这些算法在内心渴望最小化惊喜,而不是最大化愉悦——但我们能做的是大幅扩大生成器必须利用的信息范围,并增加其计算的复杂性。我们需要深入艰苦的前沿研究——这种研究需要巨大的超级计算机和拥有难以发音领域学位的团队。我无法理解的东西。为了使用这项技术,我们将使用一种更古老、更简单的技术。我们要抄袭别人的作品。
2019 年 4 月,开放人工智能项目发布了他们的“GPT2”模型。这是一个“通用语言模型”。它对于我们的汉堡发电机就像核电站对于野营炉一样。我们的汉堡生成器有大约 20 万个参数——它可以学习数据的单个特征。GPT2 有超过 10 亿。虽然我们的汉堡生成器是在 800 个汉堡描述上训练的——大约 25,000 个单词或 140 千字节——但 GPT2 是在 800 万个网页上训练的——40 千兆字节的数据。你可以在开放人工智能网站上阅读更多关于这个模型的信息,但你可能会更喜欢实时实验它的反应。
这个非常强大的模型运行的基本原理与我们之前的汉堡生成器相似,只是规模扩大了。经过大量文本的训练,它不仅知道如何制作汉堡,还知道如何生成任何类型的文本。给它一个种子词“牛肉”,它会自信地快速说出一串关于这个主题的句子:
清迈路边餐馆的炖牛肉会让人瞬间怀旧。这是因为该镇长期以来最受欢迎的菜肴——炖牛肉来自这个村庄,它在那里已经存在了 1000 多年
这很有趣,但不是做汉堡。为了实现这一点,我在与之前相同的汉堡数据集上重新训练了该模型,尽管作为额外的挑战,我还包括了汉堡名称。该模型保留了它所看到的文本的复杂性和知识深度,但它学会了将训练集中在制作汉堡上。起初,它的努力相当奇怪:
…一个大家庭的终结,这很可能是个好主意。这是世界上“最疯狂”的人对最近的研究说的话,这项研究仍然是相关的;更重要的是…
但是很快它就学会了喜欢类似汉堡的单词:
…是一道非常好的纯素食甜点和辣味炸鸡,配有芝麻、番茄酱、芥末、薄荷和大虾的泡菜薯条,还有烤土豆
最爱的烤土豆,配培根…
有趣的是,随着它的学习,它保留了一些它被训练过的数据的怪癖。这里它给了一个摄影师一个不存在的插图。
蘑菇,带一点自制的红色奶酪馅饼,生菜,红洋葱和刺山柑。装在一个拉链袋里。(图片:克里布拉扎基)
它似乎对发现的汉堡很兴奋:
哦,天哪,一份炸鸡面包是一部 B 级电影,有薯条和香脆的洋葱面包。
然而,没过多久,这种“发电机”就开始生产各种各样新颖的、有时令人倒胃口、但绝对原汁原味的汉堡:
中城宿醉:牛肉馅饼配炸洋葱、碎马苏里拉奶酪、鳄梨、红甘蓝味噌、生菜、生菜泡菜和滑稽的宙斯荷兰酸辣酱。
帕特里克·斯图尔特爵士:牛肉馅饼来自多塞特郡,配有金斯米德香料茴香、pecorino、rojo 奶酪、猕猴桃沙拉、香草马沙拉胡椒蛋黄酱和甜菜根面包蘸 johnbé酱,还有小玉米爆米花-盐 tahini 凉拌卷心菜。
我把它们都毁了:牛肉配肋眼肉、土豆和黄瓜酸辣酱、烟熏椒盐卷饼、肉桂土豆、甜菜根酸辣酱和芒果酸辣酱夹在黑麦面包里,还有红色猕猴桃块和 confit 鸭籽沙拉。
小鸡夫人:香脆的油炸鹰嘴豆配奶酪、大蒜黄油、烧烤猪肉酱和星鳀鱼酸辣酱,放在 Arobake 牛奶面包中,配有水煮 piccalilli 和香脆的荷包蛋。
肥鸡汉堡:油炸的甜辣鸡腿,配以厚厚的巧克力和墨西哥辣酱,软壳上涂有辣酱。
海哲明牛肉汉堡:牛肉馅饼,干草卡哈羊乳酪,啤酒花屠夫蓝奶酪,奶油肉汁,松脆的绿色蔬菜和马槟榔豌豆油炸饼夹在芝麻软米饭团中。
臭名昭著的救赎者去年春天滑块所有春夏:玉米饼汉堡;霍夫曼汉堡;罗马牛肉饼配巨嘴鸟乳清干酪肉汁;鹿肉沙拉配脆迷迭香和自制菠萝,配软奶酪酱和手切苹果沙拉。
可疑的猪猪扒白宫肉配炸洋葱、炸甜菜根沙拉和大量绿叶菜,配 kū mara 薯条。
那么,计算机又一次胜利了吗?世界上的厨师们能放下帽子,相信算法能发明出比他们想象的更有创意的食物吗?我们教会了一台机器有创造力吗?
This one’s going on the refrigerator
不完全是。正如我们所了解的,我们的模型,即使是最复杂的模型,也根本没有试图去创造。他们只是试图正确地猜测句子中的下一个单词。在我们看来,他们的创造性程度是他们失败和不成功的函数。最终的模型已经很好地学习了英语句子的结构,甚至一些关于动词和形容词如何用于修饰食物的语义:“荷包蛋”、“松脆青菜”、“碎马苏里拉奶酪。但是它还没有完全学会构成“正常”汉堡的规则,因此它做出了不寻常的、令人惊讶的选择。我们可以将这些选择解读为“创造性的”,但它们绝不是小说创作中刻意努力的产物。
为了创造一个真正有创造性的算法,我们需要奖励“创造性”的选择,惩罚不那么有创造性的选择。我们需要能够衡量创造力。这暴露了我们努力的徒劳。到底什么是创造力?当厨师发明新的食谱时,他在做什么?当艺术家把颜料放到画布上时,他们在想什么?在某种程度上,它们在做和我们的算法一样的事情——它们在它们所选择的媒介的限制下工作;但是他们也在推动对抗那些约束。他们试图表达某种东西。
这重要吗?也许不是。如果有人坐下来点一个“海哲明牛肉汉堡”或“中城宿醉”却不能分辨出他们的汉堡是由计算机而不是人类厨师制作的,他们会知道其中的区别吗?海哲明奶牛的“腌豌豆油炸饼”会因为不是人类构思出来的而变得更难吃吗?会不会显得没创意了?如果“创造力”不在于厨师如何想出他们的食谱,或者艺术家如何选择他们的颜料。如果它只存在于吃汉堡的人的头脑(和胃)中呢?我们无法制造一台有创造力的机器,因为我们无法衡量创造力。也许那是因为没有可衡量——创造力不存在于创造的行为中,而是存在于感知的行为中。
这些问题超越了机器学习和汉堡。但在另一种意义上,它们是它的核心问题:像人一样思考意味着什么?这是精神食粮。
感谢阅读!本系列的上一篇文章——关于图像识别——可以在 这里 找到。下一篇文章将于下月发表。
我不知道如何建立一个机器学习管道。但我是这么想的。
原文:https://towardsdatascience.com/i-had-no-idea-how-to-build-a-machine-learning-pipeline-but-heres-what-i-figured-f3a7773513a?source=collection_archive---------5-----------------------
学习从零开始构建机器学习管道
Photo by JJ Ying on Unsplash
当事情变得困难时,困难就开始了。
作为一名学习人工智能(AI)的研究生,我对机器学习(ML)的接触很大程度上是学术性的。然而,当给我的任务是为时间序列预测模型创建一个简单的 ML 管道时,我意识到我是多么的无知。此外,我几乎找不到任何关于这个主题的具体信息或代码,因此我决定写这个主题。
本文将介绍如何创建一个简单的 ML 管道的基本结构(随着时间的推移,可能会补充更多的信息)。
什么是机器学习管道,为什么它们是相关的?
正如“管道”一词所暗示的,它是 ML 循环中一系列链接在一起的步骤,通常涉及获得数据、处理数据、对各种 ML 算法进行训练/测试,以及最终获得一些输出(以预测等形式)。与传统的“管道”不同,新的现实输入及其输出通常会反馈到更新模型的管道。微软 Azure 的这篇文章很好地描述了 ML 管道。
Typical ML Pipeline (source: https://docs.microsoft.com/en-us/azure/machine-learning/service/concept-ml-pipelines)
简而言之,ML 变得如此广泛如此迅速,以至于模型的准确性变得与访问、缩放和存储这些模型的能力同等重要。ML 管道本质上是一个自动化 ML 工作流程。
(管道现在已经可以在平台上使用,比如 Azure 机器学习管道和亚马逊 SageMaker。虽然它们代表了数据团队构建和部署的一种快速有效的方式,但是本文并没有解决上述这些服务。)
动机
在构建和部署 ML 模型时,效率是关键。然而,理解其中的细微差别和困难将有助于我们理解为什么自动化工作流是非常受欢迎的,尤其是当我们谈到可伸缩性和跟踪变更的简易性时。
除了拥有适当的结构和隔离 ML 堆栈不同部分的方法(数据处理、特性选择等),值得一提的是日志记录更改也是 ML 模型部署的重要部分。以下是一些原因:
- 如果输入要素发生变化,其余要素的权重也可能发生变化。我们希望始终能够跟踪一个模型相对于另一个模型的增量,以便我们能够始终评估是否有任何改进。
- 当我们不断迭代有细微变化的模型时,在保持清晰和灵活性的同时跟踪配置文件的更新变得很困难。
- 数据输入可能会随着时间而改变。将这些作为日志的一部分进行跟踪也很重要。
- 随着额外的数据反馈,更新测试和验证集是很重要的,因为我们需要保证模型之间的可比性。
ML 管道的组件
- README.md
大多数人应该对这个很熟悉。这只是一个降价文件,指导用户如何运行具有任何特性的管道。这方面的例子可以在任何 Github 存储库中找到。 - requirements.txt
这是一个文本 文件保存了所有的库版本需求。它由所有用于在管道中执行代码的外部(非预安装的 Python 库)库组成。创建这样一个文件的目的是为了让管道可以很容易地移植到另一个平台上,比如 Docker 容器或虚拟机。安装这些需求可以作为 run.sh 文件的一部分。 requirements.txt 文件的例子如下:
scikit-learn==0.20.0
numpy==1.16.3
pandas==0.24.2
statsmodels==0.9.0
scipy==1.3.1
Keras==2.2.4
seaborn==0.8.1
- run.sh
这本质上是一个 bash 脚本来完成以下任务(非穷举):
- 下载可能存储在云上的数据
- 在 requirements.txt 中安装库需求
- 创建任何文件夹/子文件夹来存储输出(日志、图表等)。)
- 运行任何属于 ML 管道的 python 模块/类/脚本
# Download dataset stored on cloud
curl -o dataset.csv [https://insert_cloud_storage_url/dataset.csv](https://insert_cloud_storage_url/dataset.csv)# Install libraries in requirements.txt
pip install -r requirements.txt# Make a charts directory if it doesn't exist; This is to store model chart outputs for example
[ -d charts ] || mkdir charts# Execute main script
python mlp/main.py -f experiments/config.yaml
- main.py
这应该是执行大部分代码的主文件。这应该包括解析配置文件的代码(在步骤 5 中)。一个例子可能是这样的(这个例子来自马丁·托马斯——大声喊出来帮忙!):
def load_cfg(yaml_filepath):
"""
Load a YAML configuration file. Parameters
----------
yaml_filepath : str Returns
-------
cfg : dict
"""
# Read YAML experiment definition file
with open(yaml_filepath, 'r') as stream:
cfg = yaml.load(stream)
cfg = make_paths_absolute(os.path.dirname(yaml_filepath), cfg)
return cfgdef make_paths_absolute(dir_, cfg):
"""
Make all values for keys ending with `_path` absolute to dir_. Parameters
----------
dir_ : str
cfg : dict Returns
-------
cfg : dict
"""
for key in cfg.keys():
if key.endswith("_path"):
cfg[key] = os.path.join(dir_, cfg[key])
cfg[key] = os.path.abspath(cfg[key])
if not os.path.isfile(cfg[key]):
logging.error("%s does not exist.", cfg[key])
if type(cfg[key]) is dict:
cfg[key] = make_paths_absolute(dir_, cfg[key])
return cfg
之后,该文件可用于运行其他脚本中的代码,这些脚本可用于数据预处理、特性选择、参数调整等。这个文件构成了其他文件的主干。
5.配置文件
通常,模型配置(调整超参数等)总是写在代码块本身中。但是,在单独的配置文件中维护这些配置已经成为一种惯例,因为它们可以更容易地处理,并且不需要在实际的代码块中进行修改。这些都是典型的 。yaml 文件。以下内容应该可以通过配置文件进行配置:
- 数据集加载
- 预处理
- 特征抽出
- 参数选择
- 模型创建
- 模型评估
一个的例子。yaml 文件应该是这样的:
dataset:
script_path: ../datasets/cifar10_keras.py
model:
script_path: ../models/optimized.py
optimizer:
script_path: ../optimizers/adam_keras.py
initial_lr: 0.0001
train:
script_path: ../train/train_keras.py
artifacts_path: ../artifacts/cifar10_opt/
batch_size: 64
epochs: 1000
data_augmentation:
samplewise_center: False
samplewise_std_normalization: False
rotation_range: 0
width_shift_range: 0.1
height_shift_range: 0.1
horizontal_flip: True
vertical_flip: False
zoom_range: 0
shear_range: 0
channel_shift_range: 0
featurewise_center: False
zca_whitening: False
6.创建的任何其他 python 模块/类/脚本
这可以包括从数据预处理、特征选择到处理数据所需的任何事情。
7.正确的项目文件夹结构
有一个合适的文件夹结构是很重要的,因为对于任何试图理解项目如何工作的人来说,这变得更加整洁和清晰。
├── artifacts
│ ├── train : Logfiles, trained models
│ └── test : Logfiles
├── datasets : Data loading scripts
├── experiments : Configuration files
├── models : Scripts defining how the model looks like
├── optimizers : Scripts defining the optimizeres
└── train : Script to run the training
估价
每个机器学习模型都有一个评估指标,通常以交叉熵(又称对数损失)、均方误差/绝对误差或简单的准确度(或精确度/召回率)的形式存在。这些指标可以输出到控制台,以帮助用户确定模型是否在改进,或者可以记录到文本文件中。
结束语
希望这能帮助那些试图理解为什么机器学习管道很重要以及如何创建一个管道的人!
支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我在这里的推荐链接订阅 ( 注意:你的一部分会员费将作为推荐费分摊给我)。
两年前我不知道如何写代码。现在我是一名 AI 工程师。
原文:https://towardsdatascience.com/i-had-no-idea-how-to-write-code-two-years-ago-now-im-an-ai-engineer-13c530ab8227?source=collection_archive---------0-----------------------
Photo by Jakub Kriz on Unsplash
正如艾尔莎所说,职业转换是一次“走向未知”的旅程
我最原始的旅程
两年前,我从大学毕业,在那里我学习经济和金融。我已经做好了从事金融业的准备。投资银行和全球市场——这些都是梦寐以求的工作。毕业前 9 个月,我在一家投资银行找到了一份工作,感到很自豪,因为如果没有在那家银行实习过,通常很难找到工作。
工作几个月后,我学会了一些 Excel VBA ,学会了如何使用 Tableau 、 Power BI 和 UiPath (一个机器人流程自动化软件)。我意识到我更感兴趣的是拿起这些工具,学习编码,而不是学习银行产品。银行产品一度因其复杂性而引起我的兴趣,但现在只被视为银行从客户身上获利的一种方式。
银行业环境极大地挑战了我的个人价值观,但这是改天的话题。
与此同时,我的一位同事让我看到了‘机器学习’的世界。一个人可以从特定的输入“预测”特定的结果,这个事实引起了我的兴趣。
我立刻就被吸引住了。
但是有一个问题——我的编码技能很初级。在我的字典里,蟒蛇是蛇的一种,而猪是好的...一头猪。
快进两年后,在这里我即将进入 AI 行业,成为一名 AI 工程师。旅程不容易,也不短。对我来说,转向人工智能行业仅仅是一个开始——一个我学习和成长的新开始。我的旅程是这样的。
放弃
每个人的数据科学之旅都不一样。这篇文章不是关于“如何进入人工智能”,也不应该被看作是一步一步的指南。这是一则个人轶事,我希望能激励人们鼓起勇气去做他们想做的事情,因为生命太短暂了,不能过着没有意义的生活。
我的旅程
跳上 MOOC 炒作列车
我有经济和金融背景,不知道如何编码。 Excel VBA 非常接近编码,但仅此而已。作为一名优等生,并希望赶上数据科学的潮流,我报名参加了一些大型开放式在线课程(MOOCs)。不是一个,而是少数。这是我报名参加的课程清单:
- Python BootCamp:在 Python 3 中从零到英雄[ Udemy ]
- Python for Data Science and Machine Learning boot camp[Udemy]
- 用 MySQL 管理大数据[ Coursera ]
- Java 初学者教程[ Udemy ]
- Web 开发人员训练营[ Udemy ]
- 机器学习 A-Z:数据科学中的实践 Python & R[Udemy
- 用 Docker [ Udemy ]部署机器学习和自然语言处理模型
不用说,大部分都不是我完成的(只有粗体的)。我陷入了我称之为的 MOOC 自我延续周期。获取知识的便利性使得从一门课程到下一门课程变得很自然,由于所涵盖的主题过于简短,我的兴趣稍纵即逝,所以通常无法完成之前的课程。
对我来说,这是 MOOCs 最大的缺点——覆盖的内容过于简短。或者,也许我最初对 MOOCs 能够推动我从事数据科学职业的期望太天真了。
从长远来看,教授传统机器学习(ML)方法的典型 MOOC 通常会忽略模型实际做的事情。随机森林被教导为决策树的集合,但是决策树如何决定在哪个分支选择哪个特征(即熵的概念和数学)将不被涵盖。支持向量机只是简单的作为一种分类方法来讲授,但是超平面是如何确定的就不涉及了。
当我们考察深度学习等更高级的人工智能领域时,我们可以看到“我所知道的与“我需要知道的”之间的这种差异。教授深度学习的 MOOCs 通常会在像 MNIST 这样的数据集上向你抛出一堆代码,并得出结论说你现在是深度学习专家(我有点夸张,但你已经明白要点了)。这显然与现实相去甚远,因为研究论文通常包括复杂的架构,涉及对深度神经网络模型中特征提取的理解,以及其他更复杂的功能,如变压器和双向编码。除了迁移学习和元学习等概念之外,理解为什么一些最先进的模型比其他模型更好也很重要。
在我看来,教授 ML 的 MOOCs 经常给人一种错误的印象,即任何人都可以成为 ML 从业者。对于天真的人来说,ML 只是包含的几行代码。契合()和。predict() ,这是因为 MOOCs 以这样一种方式呈现它,人们可以相对容易地开始学习 ML(也许由于 ML 的大量宣传,这些课程的货币化是如此有利可图)。
不要误解我——mooc 很棒。它们为人们获取知识和开始某个主题提供了一种快速简单的方法。他们会让你成为专家吗?不。完成课程后你做什么将决定你是否成为专家。
弄脏我的手
在完成了几门 MOOCs 课程后,我知道自己将一事无成。当然,我在 Python 中有一些基本技能,并且知道如何在中使用 sci-kit learn 。fit() 和。predict() 感,但仅此而已。
为了提高我的编码技能,我在hacker rank上练习,并完成了与 SQL 和 Python 相关的问题。同时,我想有一个现实生活中的项目,在那里我可以利用 Python 。这是我开始开发一个可以帮我预订羽毛球场的机器人的时候。这主要涉及使用 Selenium 与浏览器进行交互,以浏览网页,并最终推出并支付羽毛球场的费用(这类似于运动鞋机器人)。这样做的动机是,新加坡的羽毛球场通常在两周前就被预订一空,许多人经常在发布时间每天都在预订网站上扎营(他们通常在一两秒钟内就被预订了)。
尽管我对用 Python 写代码更有信心,但我对代码效率一无所知。时间和空间的复杂性对我来说完全陌生。面向对象编程是我头脑中的一个概念,从未有过闪光的时刻(更不用说最终被遗忘)。
在 ML 方面,我是一个 Jupyter 笔记本专家。我可以把我的 Jupyter 笔记本的主题改成“黑暗模式”,并使用所有的快捷键。显然,我已经准备好担当数据科学家的角色。
现实检查——我面试失败得很惨。涉及代码的技术测试比我说“数据科学”还快。我申请的一个技术分析师的职位让我被转到了另一个部门,因为他们觉得我更适合做业务分析师。
我离我该去的地方很远。
脏但还不够脏
为了获得 ML 的深度并磨练我的 Python 技能,我决定在新加坡管理大学攻读商业 IT 硕士学位(专攻 AI)。
我了解了传统 ML 模型背后的数学,并在自我管理的数据集上应用了最先进的深度学习架构。我了解了人工智能的重要概念,包括常见的搜索算法、Q 学习和深度 Q 学习。我学习了算法设计,包括图形算法、时间和空间复杂性、名称匹配算法和许多其他算法,这些算法几乎真的把我非计算机科学的大脑撕裂了。本质上,这门课程给了我 MOOCs 所缺乏的学术严谨性。
在这个时间点上,我有几个硕士项目。它们不是完全成熟的项目,因为数据集通常是从 Kaggle 提供或获得的,并且它们通常以 Jupyter 笔记本告终。为了一致性,深度学习模型在 Docker 上运行,但从未考虑过部署的某个方面。毕竟,它们是学校的项目。
在我看来,硕士学位提供了人工智能专业人员所必需的学术严谨性,但缺乏现实世界应用的方面。硕士课程不会告诉你在数据科学领域找到工作需要什么——你必须自己去发现。软件工程和 DevOps 技能通常是数据科学家工作范围的一部分(尽管不广泛)。代码协作在大型组织中也很重要。因此,知道如何设置 Docker 环境、启动 AWS EC2 实例、在 Azure blob 存储上托管数据集、高效地组织代码以及使用 GitHub 或 GitLab 进行版本控制是一些需要的关键技能,但在课堂上没有教授。
尝试,即使你认为自己不够好
我继续面试,在技术面试和非技术面试中积累了大量的经验(尽管大多数都失败了)。这也让我知道我不知道的事情,并花时间去学习那些技能。更重要的是,它让我了解了公司为同一角色提供的不同类型的职位描述,以及这如何与公司在人工智能采用方面的成熟度相对应。
两年后,我得到了一个角色,作为一名人工智能工程师接受培训。对我来说,这是一个在我热爱的领域学习和成长的好机会。更重要的是,这证明了任何人都可以完成他们设定的目标,尽管有些人可能比其他人需要更长的时间。
归根结底,职业生涯是一场马拉松,而不是短跑。做你喜欢做的事情,因为你将会花大量的时间在工作上。
如果你感到失落,记住艾尔莎说的话,“做下一件正确的事”。
结束语
很高兴收到任何评论:)
支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我在这里的推荐链接订阅 ( 注意:你的一部分会员费将作为推荐费分摊给我)。
我有很多数据,就是不知道在哪里!
原文:https://towardsdatascience.com/i-have-a-lot-of-data-i-just-dont-know-where-421d98c3cc3a?source=collection_archive---------14-----------------------
如果你对你的公司有这样的看法,你应该看看这篇文章。
Follow our company https://twitter.com/cienciaydatos_
介绍
https://hbr.org/2017/06/does-your-company-know-what-to-do-with-all-its-data
如果你正在读这篇文章,很可能你正在用你的数据做些什么,或者想用它做些什么。但是,这并不容易,对不对?
如今(实际上)大多数以数据为中心的项目都很复杂、昂贵,需要组织和文化的改变,有很长的时间来实现价值,并且不容易扩展。有什么问题?
在这篇文章中,我将讨论在我看来公司试图使用他们的数据面对的最大问题,它与几十年来做的事情有关,这些事情过去有效,但现在不再有效。
数据难题
欢迎来到数据时代。一切都产生数据,每个人都想使用它。最大的问题是如何实现?
在剑桥语义学最近的一篇名为“数据结构的故事的文章中,他们指出了我们在组织和数据中存在的三个具体问题:
- 来自大量结构化和非结构化来源的数据比以往任何时候都多。
- 原始形式的数据在数据质量方面变化很大。有时它是成形的和干净的。其他时候是稀疏的,不均匀的。
- 数据有许多不同的(和不兼容的)格式。
https://blog.adverity.com/data-warehouse-marketing-better-faster-insights
这一切都来自于“数据湖时代”。几年前,当数据开始呈指数级增长时,我们改变了我们的数据仓库,简而言之,它是将来自组织内许多不同来源的数据汇集在一起的系统,用于将报告和分析到数据湖。几乎每个组织中都有数据仓库,它们是为数据科学的前身“商业智能(BI)”而创建的。在 BI 中,我们对来自关系数据库(主要是)的有组织和结构化的数据进行报告、分析和研究,原始数据虽然存在,但并没有被使用。
https://www.inovaprime.com/business-intelligence-transform-data-into-successful-decisions/
当数据增长并变得越来越怪异和无结构时,一个新的范例出现了。浩荡的数据湖。
https://www.credera.com/blog/technology-solutions/comparing-data-lakes-and-data-warehouses/
在几乎所有从事大数据和数据科学的公司中,这都是标准。数据湖的前提是:存储任何规模的所有结构化和非结构化数据。所以我们开始这样做。然后创造了很多新技术来管理它们,比如 Hadoop 和 Spark 。
这是我不久前创建的 Apache Spark 的一个简短故事,但也展示了大数据在这些年里是如何转变的(顺便说一句,这是最新的):
https://twitter.com/faviovaz
到底发生了什么?我们有可能分析大量的数据,不同类型的数据,而且是实时的,这太棒了。但问题是,尽管我们尽了最大努力来管理我们的数据,并使一切严密,但这并不容易。
我们的大多数数据湖都变成了数据沼泽:
https://www.collibra.com/blog/blogdata-lake-vs-data-swamp-pushing-the-analogy/
这种情况并不少见。尽管我们有办法改善我们使用数据湖的方式,并真正管理它,但在我们需要的时候获取我们想要的数据并不容易。
这就是为什么当我与公司合作时,我听到最多的是:
我们有很多数据,只是不知道在哪里。它应该在这里的某个地方…
This is not what we want 😦
数据通常在筒仓中,由一个部门控制,并与组织的其他部分隔离,就像农场筒仓中的谷物与外界隔绝一样。是时候停止了。请记住:
要从数据中提取价值,数据必须易于探索、分析和理解。
走向数据结构
如果您一直关注我的研究,您可能还记得我对数据结构的定义:
数据结构是支持公司所有数据的平台。它是如何被管理、描述、组合和普遍访问的。该平台由企业知识图构成,以创建统一的数据环境。
这里我想强调两点,数据结构是由企业知识图构成的,它应该尽可能自动化。
为了创建一个知识图,你需要语义和本体来找到一个有用的方法来链接你的数据,唯一地识别和连接数据与常见的业务术语。
这里的关键是,在这个新模型下,我们不是在寻找可能的答案,而是在寻找答案。我们想要事实——那些事实从何而来并不重要。****
数据湖的概念也很重要,因为我们需要一个存储数据、管理数据和运行工作的地方。但是我们需要一个智能数据湖,一个了解我们拥有什么以及如何使用它的地方。我们必须努力将组织中的所有数据组织在一个地方,并真正管理和治理这些数据。
为了进入数据结构领域,我们需要开始考虑本体、语义、图形数据库、关联数据等,以构建知识图,然后找到一种自动接收、准备和分析数据的方法。
您可以在此阅读有关如何开始构建数据结构的更多信息:
** [## 机器学习的数据结构。第 2 部分:构建知识图。
在能够开发数据结构之前,我们需要构建一个知识图。在这篇文章中,我将建立一个基础…
towardsdatascience.com](/the-data-fabric-for-machine-learning-part-2-building-a-knowledge-graph-2fdd1370bb0a)
结论:数据结构中的数据科学
https://towardsdatascience.com/the-data-fabric-for-machine-learning-part-1-2c558b7035d7
使用数据的最终目的是从中做出决策。数据科学做到了这一点:我们有数据,在数据科学工作流程之后,我们应该能够根据我们创建的分析和模型做出决策。
到目前为止,我已经写了两篇关于如何开始在数据结构中进行机器学习(ML)和深度学习(DL)的文章:
[## 机器学习的数据结构。第一部分。
语义学的新进展如何帮助我们更好地进行机器学习。
towardsdatascience.com](/the-data-fabric-for-machine-learning-part-1-2c558b7035d7) [## 机器学习的数据结构。第 1-b 部分:图上的深度学习。
图形的深度学习日益重要。在这里,我将展示思考机器的基础…
towardsdatascience.com](/the-data-fabric-for-machine-learning-part-1-b-deep-learning-on-graphs-309316774fe7)
在此之前,我们需要打破我们的“数据孤岛”,协调组织数据对于发现新的见解和释放我们数据的全部潜力是必要的。
我们真正需要的是一个允许数据分析的基于图表的系统。通常这被称为图形在线分析处理(OLAP)。
图形 OLAP(如 Anzo)可以提供企业大规模大数据分析所需的高性能,并与图形在线事务处理(OLTP)数据库(如 Neo4j、Amazon Neptune、ArangoDB 等)相结合。)你有一个很好的方法来开始构建你的知识图表。
成功创建数据结构后,您将能够执行数据科学工作流中最重要的部分之一:机器学习,因为 ML 在此上下文中是:
使用算法在数据结构中发现见解的自动过程,该算法能够使用存储在 it 中的数据找到这些见解,而无需专门为此编程。
还要记住,通过结构生成的洞察本身是新数据,这些新数据作为结构的一部分变得显式/明显。也就是说,洞察力可以扩大图表,潜在地产生进一步的洞察力。
因此,在数据结构中进行数据科学的过程要容易得多,因为我们有一个完整的系统来存储和自动化数据接收、处理和分析,这也使我们能够以更快、更清晰的方式找到和探索组织中可用的所有数据。不再有奇怪的数据和庞大的查询来获得简单的值,这也是目标之一。
我们周围有一些我们甚至不知道的数据结构的例子。世界上大多数成功的公司都在实施和迁移他们的系统,以构建数据结构,当然还有其中的所有东西。我想是时候让我们所有人都开始建立自己的了。
感谢你阅读这篇文章。如果您有任何问题,请在此写信给我:
[## 法维奥·瓦兹奎——science y Datos | LinkedIn 创始人/首席数据科学家
加入 LinkedIn ‼️‼️重要提示:由于 LinkedIn 技术限制,我现在只能接受连接请求…
www.linkedin.com](https://www.linkedin.com/in/faviovazquez/)
祝学习愉快:)**
我有人工智能硕士学位。现在怎么办?
原文:https://towardsdatascience.com/i-have-a-masters-in-artificial-intelligence-now-what-a71a92b4c51?source=collection_archive---------14-----------------------
闯入人工智能是艰难的。以下是一些期望与现实的对比,让你保持克制。
Photo by Drew Graham on Unsplash
通常情况下,人们攻读硕士学位是为了在某个领域进一步提高自己的专业知识,或者在一个新的领域(不属于自己的领域)获得一些深度,也许是为了过渡到这个新的领域。属于后者类别,这里有一些我很快意识到的期望与现实的对比。(请注意,这些适用于人工智能(AI)领域,在地理方面也可能与读者不同)
期望 vs 现实
期望与现实#1
期望:我将具备进入研究领域(人工智能)所需的技能。
现实:事实远非如此。在 AI 领域,实际应用是关键。雇用人工智能/机器学习(ML)工程师或数据科学家的公司希望知道你在将理论模型应用到现实生活数据集方面有足够的经验。拥有人工智能硕士学位为各种人工智能模型奠定了坚实的理论基础,但往往并不能转化为现实生活中的应用。
这是否意味着一个没有经验的人不可能闯入人工智能?一点也不——雇主通常会留意参与Kaggle竞赛以及在 Github 上的活跃程度,并以此作为衡量你对该领域兴趣程度的代理。在雇主看来,能够把你在课堂上学到的东西运用到任何现实生活中是有价值的。例如,如果我在课堂上学到了(深度)Q-learning,那么构建一个学习如何玩 Atari 游戏或 Pac-man 的机器人就已经是一个巨大的胜利了。
要点:始终将你在课堂上学到的东西应用到实践中。没有人会因为你有硕士学位就相信你能胜任这份工作。
期望与现实#2
期望:我对成为一名数据科学家感兴趣,因此我的重点应该是建立高精度的最佳模型。代码效率和知道如何构建 ML 管道是次要的。
现实:在 AI 领域,人才匮乏。想要建立一支数据工程师、数据分析师和数据科学家团队的公司比市场上的供应量要多。因此,你几乎总是被期望做比你的职位所允许的更多的事情。更不用说,拥有这些技能会让你在找工作时更加灵活。
此外,不可避免的是,某些行业的公司在人工智能采用方面肯定会更快。电子商务、技术甚至医疗保健公司都从人工智能中受益匪浅,尽管金融等行业也受益匪浅,但由于金融监管,人工智能的采用速度无疑较慢。理解一家公司在人工智能采用方面所处的阶段是至关重要的,因为它会让你强烈地感觉到每个团队成员对 ML 堆栈的贡献有多大。
团队的规模也强烈显示出每个成员的职责是如何分离的。一般来说,团队越大,工作任务就越分散,反之亦然。为了理解这一点,想象一家公司开始采用人工智能。他们希望雇佣一些有丰富相关经验的人,能够从头到尾构建和部署模型。相反,像脸书和谷歌这样的大型科技公司可能会为每个工作职能配备单独的团队。
要点:学习能够从前到后部署 ML 模型所需的所有其他技能。
期望与现实#3
期望:我应该申请像方这样的大型科技公司来获得最好的学习,因为他们是这个领域的领导者。
现实:尽管像方这样的大型科技公司因其薪酬待遇和声誉而颇具吸引力,但通常很难进入这样的公司。就我个人而言,我从未在任何一家方公司工作过,但我可以想象,与一群志趣相投的高智商人士一起工作,将是一个理想的学习场所。
那我还能满足于什么呢?这真的取决于你感兴趣的行业和你想学什么。如果你对计算机视觉感兴趣,就去找那个领域的大公司,那些使命和愿景与你有共鸣的公司。在这个人工智能的时代,一切都是为了创造价值,让消费者的生活变得更加轻松。找一家与你相关的公司,一家你想为之增值的公司。
如果你像我一样,更专注于学习我需要的技能,那么你申请的公司应该不会太重要。这应该是你应该仔细检查的工作范围。这应该是你感兴趣的领域,在这里你可以完成大部分的工作要求,同时也可以每天学习新的东西。对我来说,这是学习和工作满足感旺盛的地方。
要点:关注你想学的东西,而不是你申请的公司。
有什么想法?欢迎发表评论:)
支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我在这里的推荐链接订阅 ( 注意:你的一部分会员费将作为推荐费分摊给我)。
《我知道 AI》:如何抓深度学习骗子
原文:https://towardsdatascience.com/i-know-ai-how-to-catch-deep-learning-scammers-60324c87b2eb?source=collection_archive---------16-----------------------
I know AI… gimme gimme
今天早上,我在开始新的一天之前喝着我通常喝的浓咖啡,平静地浏览 LinkedIn 的帖子,这时我看到了一篇由新动物学物种的一名成员(自称)人工智能专家撰写的文章。
虽然这个家伙(某个寻求关注的博主)和主题(意识、机器,以及他认为他真的需要写的其他超级大操蛋的东西)并不重要,但两个想法迅速在我脑海中闪现。
首先,不仅仅是一个想法和情感:我是一个愤怒的爱喝浓缩咖啡的意大利人,他真的很享受他的 am 杯,不会被不好的东西打扰,比如阅读无意义的人工智能垃圾。
第二:我怎样才能阻止这种情况,防止全球范围的浓缩咖啡中毒,同时也帮助其他对人工智能感兴趣的人迅速
撇开这些骗子,专注于什么是真正的人工智能内容?
与此相关,我想到了另一个问题:
我怎样才能帮助雇主或企业净化人工智能黄金,使其远离垃圾和假货?
我想出了一个三条规则的小备忘单——在这篇文章的最后找到它——你可以免费下载、打印和使用。
当你阅读一个“人工智能专家”的帖子,雇用一名自称是人工智能专家的员工,或者,如果你是一名企业主或负责思考人工智能产品,面试所谓的“人工智能解决方案提供商”,声称是最后一个艾龙绝地血统时,你可以记住这些原则。
这将是不完整的,快速而简单的,但是注射一针禽流感疫苗总比在一个充满禽流感病毒的社会里漫不经心地走来走去要好。
虽然,直到最近才像那样…
当事情真的很糟糕的时候
我在意大利高中毕业后就加入了对人工智能的探索,当时构建神经网络既不时尚(范思哲衬衫是这样的……)也不酷。
{是的,今天工作的人工智能的真实名字叫做神经网络}。
这实际上是一种耻辱:我记得,在波士顿攻读博士学位期间,有一天走出麻省理工学院,被告知"神经网络巫毒之类的东西根本行不通,专注于决策树。“令人沮丧。
那是艰难的时期,对科学的纯粹热情(以及几茶匙的固执和疯狂)对我和我的许多人工智能同事来说是必不可少的,尽管有批评和居高临下的评论。我甚至记得一个国防部机构的项目经理告诉我。听着,我喜欢你,我甚至可以考虑这个提议,但请把这些神经网络废话从文本中删除,然后我们再看”。
但是对于那些能够坚持自己的信仰和理论的人来说,事情有了很好的转机。对麻省理工学院来说没什么,他们输掉了人工智能的比赛,他们生产的更聪明的人工智能/机器人是 Roomba,它像一个被蒙住眼睛的醉汉和超重的沙鼠一样撞桌子和椅子。以下是令人惊叹的技术演示:
https://www.youtube.com/watch?v=ASjLXrbVlMw
这里跑题了,回到 AI。
然而,我需要再三考虑我的愿望…
虽然神经网络将麻省理工学院传统人工智能理论爱好者甩在身后是件好事,但人工智能及其意识的兴起不幸地向我们吐了太多虚假的“人工智能专家”。
从某种意义上来说,这让那些想成为“人工智能嗡嗡声”一员的人撒了很多谎。一些告诉我们“这是永远不会起作用的巫毒肥料”的人现在是神经网络的倡导者、以及在他们的简历、网站等地方撒上 AI、ML、深度学习的全新人群,就像是牛肝菌蘑菇烩饭上的欧芹一样(我可以做一个很棒的——欧芹最后会变得新鲜……是的,大量)。
由此产生的新动物学物种以不同的形式出现,从“人工智能专家”到“人工智能程序员”到“人工智能工程师”,声称直接来自人工智能宙斯,并饮用人工智能知识的源泉。
所以,这里有一张小抄,以一些简单规则的形式给你。
让我们从简单的开始:
如果他们开始谈论埃隆·马斯克和“人工智能接管世界”,或者张开他们的嘴,你认为在听到“埃隆……”之后,他们会完成“…n·马斯克”,跑向门口(或者给他们看一个)。我在下面放了一张图来提醒你为什么:
为了 f#@&缘故,算算吧:他们不是专家
好了,你去掉了高斯的马斯克尾巴。唷!….让我们来看看真正的第一条规则。
现在,说真的,让我们花点时间做些数学计算。
全球大约有 2.2 万名拥有博士学位的人工智能专家
(如果你不相信我,请在下面打勾)。
https://www . Bloomberg . com/news/articles/2018-02-07/just-how-shallow-is-the-artificial-intelligence-talent-pool
估计其中大概有一半能真正(真正)知道自己在做什么(更别说成为真正的思想领袖了),你注定会落到 10K 下面。随着人口接近 8B,你与人工智能专家交谈的机会确实很小。
所以,规则 1,你的默认值是:
规则 1:从统计学上来说,我不是在和专家交谈。我需要持怀疑态度。
现在,为什么和一个有博士学位的专家交谈很重要?让我们来看看第二条规则:
如果他们声称自己是专家,告诉他们“让我看看”
现在,有很多聪明人,很多超级聪明的人和天才等等。他们原本没有选择人工智能作为他们的激情和焦点,但现在想进入人工智能。我认识很多这样的人,我要说的是:
很好,很棒,这是当今地球上可能发生的最好的事情之一,应该受到称赞。我们需要更多对 AI 感兴趣的人!更多!更多!
当这些人(以及他们那些没有喝过智能河水的不那么聪明的表亲)声称他们是人工智能专家时,问题就来了,这就是第二条规则出现的时候。这很简单。让他们给你看。就像墨菲斯问尼欧会不会功夫。
和你说话的人是什么背景?他们接受过正规的 AI 教育吗?如果是,他们在哪里,什么时候,学了什么?
请他们在他们声称是专家的人工智能领域发表论文(论文、书籍章节、摘要)。这将是一个非常简单但极具指示性的酸性测试。
为什么?发表一篇经过同行评审的人工智能论文需要几个月或几年的努力,并经历严谨的思维过程,包括推介和专家同行的评判(以及消化几乎不可避免的修改和拒绝)。这是一个你希望你的专家/雇员/顾问经历的心理健身房,作为必要条件他们作为人工智能专家的输出是无效的。
人工智能就是这样一个既广又深的领域。大脑是一个极其复杂的机器,成千上万的研究已经分析、剖析并试图用数学来形式化它的复杂性。你想依赖那些了解人工智能的人,特别是当你雇佣一个“人工智能预言家”来告诉你人工智能的走向,以便你的组织做好准备。我自己在这个领域花了 20 多年,我几乎没有触及表面…知道你大脑中的每一个突触是如何工作的,能够用数学方法模拟它以及神经元中数以百万计的其他结构,一直到行为的宏观方面,更不用说把这些东西放在硅片上的问题了……这不是你在 Coursera 上学到的东西——一辈子是不够的。让我们现实一点,废话少说。
如果他们没有付出多年的努力——并向他们的同行证明他们无愧于自己的主张——那就忽略不计吧。
所以,总结一下:
规则 2:如果你是专家,给我看看你的同行评审出版物。如果你没有,再见。
嘿,快速问题…你认为 AI 今天能做什么?
这是另一个严峻的考验。虽然有一个共同的信念,特别是在舔邮票的硅谷主义者中“要天真,要大胆,你对一个主题知道得越少越好……你会跳出框框思考,赚一大笔钱”,我邀请你和一个刚刚告诉你“嘿,我以前从未驾驶过宇宙飞船,这就是为什么它会工作”的人一起踏上飞往火星的火箭。
再见。
现在,根据我的经验,人们认为人工智能可以做、擅长并准备投入使用的东西的数量(包括认为人工智能已经准备好接管并杀死我们所有人的人群)与他们真正了解人工智能的程度成反比。
简单来说:
真 AI 专家= >“今天的 AI 有局限性”
由于她已经从事这项工作,她知道要达到 100%准确的工作系统有多难,并且会清楚地表达期望、限制和“完美路线图”,这通常比我们提前几年。但这是真的,由此产生的人工智能将做承诺的事情——这通常仍然非常有用。恰恰相反:
人工智能骗局= >“我可以给你造一个做你想做的一切的人工智能”
简而言之,第三条规则:
规则 3:如果他们开始告诉你人工智能无所不能,赶紧逃之夭夭
好的,正如我所承诺的,这是给你的三条可打印的备忘单:
这些规则不是神剑,但可以帮助。
尽情享受吧!
原载于 2019 年 2 月 22 日https://medium.com。
我喜欢新的数学
原文:https://towardsdatascience.com/i-liked-the-new-math-e4a9c9d2e170?source=collection_archive---------20-----------------------
“谢尔曼,把 WABAC 机器调到很远很远的地方…”
Figure 1: Egyptian numerals and a Roman counting board (Roman abacus)
“当我回想起我在高中学的那些废话时,我能思考真是个奇迹”——西蒙和加芬克尔,柯达彩色胶卷
我们成长于 60 年代的加州,经历了很多教育实验。我们在课堂上有豆袋椅。我们眯着眼睛看着不舒服的金属和玻璃装置进行“快速阅读”。我们阅读彩色层压卡片上的文学片段。我记得在阅读箱结束时,我为达到 SRA 等级“紫色”而自豪,但不是读一本真正的书。四个食物组被一个金字塔代替,鼓励你吃很多很多的碳水化合物。然后是“新数学”
Figure 2: Why Johnny can’t read. A tachistoscopic projector and the SRA reading system
《新数学》是数学课程中的一次雄心勃勃的变革,以应对“人造卫星冲击”这在美国是一件大事,在欧洲也是如此。这是一个大胆而雄心勃勃的计划,要把每个孩子都变成下一个沃纳·冯·布劳恩(假设沃纳·冯·布劳恩是艾伦·图灵)。这也是一个明显的失败。
我喜欢它。嗯,不全是。如果你像我一样,你沉浸在其中,你不能可靠地将它与旧数学(如乘法表、代数、几何等)区分开来。).新数学扩展(并取代)了传统数学课程的抽象主题,如集合论、模运算、代数不等式、数基、符号逻辑和布尔代数。咻!谁还记得不平等?(提示:它涉及对象中的数字线和阴影)
愤世嫉俗和争论哪个话题最没用有点太容易了,新数学在当时受到了相当正确的批评(参见:为什么强尼不能加:新数学的失败 [1】)。
新数学于 1973 年夭折。(凶手稍后揭晓。)将近 50 年后,我想弄明白这到底是怎么回事。以下是我的亲身经历。你们很多人会感受到我的痛苦。或许,你会像我一样,在大学或研究生院经历过似曾相识的感觉,其中一些概念再次出现,甚至开始变得有意义。
基数
最受嘲笑的话题是基数。汤姆·莱勒在一首歌中模仿了它,这首歌抓住了父母和老师的困惑:
我从中得到这个问题的那本书要你用八进制来做。但是不要慌!八进制实际上就像十进制一样——如果你少了两根手指的话!
我们可以试一试吗?坚持住…
你不能从二中减去三,
二小于三,
所以你看看八位中的四。
现在实际上是四个八,
所以你把它变成三个八,
重组,你把一个八变成八个一
然后你把它们加到两个上,
你得到一个二进制八,
这是十进制十,
你拿走三,这是七。
Ok?
新数学万岁,
很简单,
非常简单,
只有孩子才能做!”
可以说,基数是所有数字中最容易接近和最实用的。快速更新一下,下面是基数为 2 的 7:
7 = 2⁰+2 +2 = 111 基数 2
加法(和其他算术运算)的执行方式与普通数学(以 10 为基数:
显然,二进制数学在数字时代变得至关重要。为了强调这一点,我们和一位 NASA 工程师以及一台 10 英尺高的电脑开了一个学校大会。谁不想成为一名宇航员?什么时候我们都会有自己的电脑?
学习基本数字和其他替代数字系统是有价值的,就像学习外语可以帮助你理解你的母语一样。一个来自生物学的类比:“如果你想知道为什么只有两种性别,试着想象 3…或 7 的进化优势。”
二进制是独一无二的,因为它是开关(开/关)、逻辑(对/错),当然还有计算机的自然语言。二进制数学及其孪生兄弟布尔代数允许我们设计电路来执行任何数学计算(图 3)。
Figure 3: A physical embodiment of an adding machine, combining elementary logic circuits AND, OR, and NOT. The variable C_out is the carry digit. Cool, huh?
我们了解到计算机可以做任何数学上的事情。布尔代数可以用来解决逻辑和命题演算。计算机在数学或逻辑推理方面的表现比人类更好!(实际上,这有点令人沮丧。一种新的、时髦的东西“人工智能”风靡一时。电影对计算机统治世界发出了世界末日般的警告(2001 年【18】【1968】,科洛斯:福宾计划【1970】)。听起来熟悉吗?
所以,我们这些流鼻涕的孩子明白一些我们父母不明白的事情。我们离理解数字计算机的工作原理只有几个星期了。布尔代数正在取得进展,但是突然,我们进入了另一个抽象层次。这是五年级和一些新代数的时间。
集合论
四年级和五年级的数学对我来说有点模糊。出于某种原因,我们不再把数字看作数量,而是把数字看作事物,而事物属于集合。从我的记忆中,一个介于 4 和 8 之间的整数变成了“整数集:”
S0 = {5,6,7},它是两个无限集合的交集:
S0 = S1 ⋂ S2,其中
S1 = {-∞,… 4,5,6,7}而 S2 = {5,6,7,8,9,… ∞}
当时和现在对我来说,这是一个完全的谜,为什么数学应该通过将数字视为“集合”中的“对象”而变得更容易。如果这给我贴上了市侩的标签,就当我是小资产阶级的一员吧。无产者如何看待这一切?
集合论是许多数学分支的潜在基础,因为几个领域的公理都可以转换成更一般的理论。另一方面,它在实践中是笨拙和乏味的,每个学科的原生方法更简单和更容易使用。集合论的一个不幸遗产是维恩图,这是人们唯一记得的东西,并且在商业演示中无处不在地使用,以给出内容的幻觉。
代数不等式
由于想出一组连续的数是相当困难的,我们的老师同时引入了代数不等式来处理实数行上的量,因此 4 到 8 之间的实数可以表示为
4 < x < 8
Which could be expressed using the logical/Boolean notation:
x > 4 和 x <8
Problems moved on to thinking in two dimensions (4x+y < 0), so we were finally moving into traditional algebra. Set theory was cast aside, perhaps because they had run out of examples of problems easily solved with set theory.
Figure 4: One Algebra to rule them all? Parsing Space, Things, and Propositions.
By the end of the 5th grade, our minds whirled with the nuances of the operations union(U), addition( + ),以及‘逻辑 AND'(⋀).它们都“有点”是同一个想法,但是每种情况下的数学都不同。到目前为止,在掌握基础代数之前,我们已经学习了三种代数。显然,我们需要的是另一个代数。
模运算
我没有在模运算上投入太多时间——可能是因为我的老师不知道它有什么用处。需要澄清的是:我在 1998 年的老师大多是被解雇的火箭科学家.(以防你错过,我们在 1969 年赢得了太空竞赛。)如果我的老师们不明白这一点,他们可能会有所发现。
模运算(有时也称为时钟运算)处理在一个周期内重复的数字——或模数(对于时钟来说是 12 ),并找出余数。如果两个数 a 和 b 被 n 除后有相同的余数,则称它们为同余。
a≡bmodn
在时钟时间中,从午夜开始的 100 个小时等于凌晨 4 点
100 mod 12
在西方音乐中,频率每 12 个音符增加一倍,所以所有的“C 音”在 mod 12 中都是全等的。
加、减、除、换等都有规律可循。类似于普通算术的规则。但是,尽管二进制数学与十进制数学有一点点不同,但模数学却有很大不同。
我做了 40 年的专业科学家,从来没有使用过计算器上的“MOD”按钮,所以认为这个按钮有用的人一定是一个真正的爱好者。另一方面,也许他是在炫耀他知道模数是什么,而设计会议上没有人有勇气问。
我已经有几十年没想过这个问题了,直到我听了一个有趣的讲座,讲的是它的发明者卡尔·弗里德里希·高斯关于他发展数论的工作。下面只是简单总结一下,以免吓到你。读者咨询:这会有点疼。
黄金定理(二次互易定理)
原来所有的素数都可以分为两类,全等于 1 模 4 的和全等于 3 模 4 的。
家庭 1
5 13 17 29 37 41 53 61 73 79 89 97 101…
家庭 2
3 7 11 19 23 31 43 47 59 67 71 83 103 …
第一个数列中的素数可以互为平方根,至少在模数学中是这样的。(如果 p 是 q 的模平方根,那么 q 就是 p 的模平方根)。例如,13 和 29 具有“倒易模块残基”
29 16 mod 13 4 mod 13
13 ≡ 100 mod 29 ≡ 10 mod 29
这就是我所说的“非常不同”这种事情在普通数学中是不会发生的。理解这意味着什么需要奉献,而它的意义我们大多数人都不知道。这是我所知道的——这是一个如此重要的结果,已经有 246 个发表的证明,其中 6 个是高斯自己的。找到实际上无法通过暴力解决的问题的解决方案(例如分解巨大的多项式)是至关重要的。这也是证明费马大定理的基础,考虑到抽象的程度,花 300 年来证明也就不足为奇了。
模数学的一个突出应用是密码学(常见的 RSA 令牌使用非常简单的模算法来加密和解密消息)。这就引出了一个问题:我们这些少年犯应该从研究这个中得到什么?
数学充满了像这样怪异和奇妙的东西,但很少有人会自愿报名参加一个关于数学鉴赏的课程。如果你想了解更多,我推荐雷蒙德·弗洛德在 YouTube 上的格雷欣学院演讲。
还是没兴趣?好的。让我们试试更适合年龄的东西。
埃及和罗马数字的算术
在最近的一次技术会议上,我注意到没有一个年轻的与会者能看清演讲厅外墙上的日期。这让我很难过。因此,这里有一个关于如何用罗马数字做数学的简单重述。同样,没有人需要知道这些,但这很有趣。
罗马数字加法规则
1.消除减法符号(例如用 IIII 代替 IV)
2.将所有符号按顺序分组,例如 CCCLXXXVVIIIIIIII)
3.简化/缩略:从右到左,将重复的符号替换为其更高的等值值(例如 VV →X)。埃及人更讨厌,因为他们没有 5,50 等等,所以有更多的符号来计算。
4.重新引入减法(如果你喜欢的话)
乘法可能比阿拉伯数字更容易:
几个更有趣的事实:罗马人发明了他们自己版本的算盘(图 1),以加速这种计算。用罗马数字做长除法或小数运算是很痛苦的,然而直到十八世纪,欧洲部分地区仍用罗马数字记账。
数学应该没坏处。对我来说,它一直很有趣。但这只是我。
验尸:
1973 年,大卫·麦考尔,一位广告主管,在帮助他的孩子学习乘法表时感到沮丧,为 ABC 电视台创作了周六早晨卡通系列片,“乘法石”。这是“返璞归真”运动最具标志性的表现。早期的支持者不是别人,正是迈克尔·埃斯纳和查克·琼斯(华纳兄弟卡通片的传奇动画师/导演)。上帝保佑查克·琼斯。
历史学家兼数学家莫里斯·克莱恩对新数学提出了简洁的批评:“抽象不是数学发展的第一阶段,而是最后阶段。”理解数学的结构和理论对它的使用来说并不是真正必要的,但是我们中的一些人变得好奇。我们学的很多东西都不再教了,数学又变得很干涩很枯燥,像以前一样。掉下来的一些东西是最有趣的。
当我可怜的女儿很小的时候,我给她上了新的数学课(但不是集合论!).她喜欢它。她只花了几个小时就学会了二进制数学。所以,我开始在她传统的苏格兰女子小学做客座演讲。他们喜欢它。女孩们跳到黑板前,添加日语、印度语、汉语的数字,以及其他乘法数字的方法。老师们开始听我的课。令我惊讶的是,他们没有学会如何处理罗马数字。他们可能都更喜欢它,因为他们知道他们不会在这个琐事上被评分;我只是想让他们知道它在那里。
Russell Anderson 没有成为宇航员,但是他在 1984 年为空间站和“星球大战”导弹防御系统工作。他在加州大学完成了生物工程博士学位。他的学术研究涉及生物系统(神经、免疫和进化)的学习。他曾在 IBM、KPMG、Opera Solutions、NICE/Actimize、HCL、HNC Software、Mastercard、JP Morgan Chase 和苏格兰哈利法克斯银行担任首席科学家。他发表了 30 多篇科学论文,获得了 8 项专利。
欢迎提问/评论:anderson.transactionanalytics@outlook.com
https://www.linkedin.com/in/russell-anderson-3571361
[1]莫里斯·克莱恩(1973)。为什么强尼不会加法:新数学的失败。纽约:圣马丁出版社。
[2]汤姆·莱勒,《新数学之歌》(1965)。【https://www.youtube.com/watch?v=UIKGV2cTgqA
[3]雷蒙德·弗洛德。高斯和热尔曼。伟大数学家格雷欣系列讲座。2016 年 2 月https://www . Gresham . AC . uk/lessons-and-events/gauss-and-germain # p 7 ipofiz 3 rbhxgcy . 03
[4]二次互易定理的 246 个证明。http://www.rzuser.uni-heidelberg.de/~hb3/fchrono.html
我用 Excel 做了一个动态飓风图!
原文:https://towardsdatascience.com/i-made-a-dynamic-hurricane-map-with-excel-d3673135fdab?source=collection_archive---------27-----------------------
这几天一直痴迷于研究数据图。我挑战自己,用 Excel 做了一个数据图。下图是我用 Excel 绘制的飓风厄玛的动态图。
如果你有兴趣,我很乐意和你分享用 Excel 制作飓风图的过程。它使用气泡图来描绘飓风的动态路径,并显示风力的变化。下面是制作飓风地图的具体步骤。
1.准备材料
①找到一张美国大西洋地图,其中包括纬度和经度线。
注意,我们需要的地图必须有经纬线。公共网络上提供的许多地图是不准确的。我从国家飓风中心和中央太平洋飓风中心下载了这张地图。
②从天气地下下载飓风 Irma 的风暴轨迹统计,包括日期、时间、纬度、经度、风力等。
2.过程数据
①去掉纬度、经度、风速、风压等数据的单位。日期和时间应该转换成 Excel 易于处理的格式。
②我们可以看到,数据资料中每六三个小时记录一次飓风统计。在这里,我们每六个小时记录一次数据。
3.画一个气泡图
①将上面的图插入表格,然后在上面画一个气泡图。气泡图的 X 轴代表经度数据,Y 轴代表纬度数据,气泡大小取决于风压的值。
②设计图表区的格式。气泡图中坐标轴的最大值和最小值根据纬度和经度读数设置。并使坐标上的间距与地图上的经纬度间距一致。这里我将间距设置为 5,这样可以确保气泡图绘制的数据点与地图上的实际经纬度相匹配。
③拖放绘图区域的边界,使其与底部大西洋地图中的坐标轴重合。然后隐藏轴数据,将边框设置为“无线条”。
4.制作动态效果
为了实现飓风轨迹的动态效果,我们可以使用滑块控件来控制时间。我们每滑一次,时间就增加 6 个小时。滑块链接的单元格将数据传递到图表左侧的表格区域。然后通过查询时间点获得相应的经纬度数据和风数据。同时,图表的两组数据源都是从这个时间数据生成的。整个控制链就这样形成了,滑块对图表的最终控制也就完成了。
除此之外,如果我想实现滑块的自动控制,我将需要 VBA 代码来使图表自动显示动态效果。
操作流程:
①用 VBA 写两个宏。一个宏控制开始,另一个控制停止。
②画 4 个控件,代表开始、停止、循环和滑块。指定上述宏。
③滑块控件的格式指定左侧单元格,记录滑动数据。上面的单元“数据和时间”调用该单元的数据。
④准备动态数据。
为了达到上述动态效果,气泡图中实际准备了两组数据。一组显示飓风在当前时间点之前经过的所有路径点,另一组标记飓风在当前时间点的位置。
这里我们需要使用 LOOKUP 函数,并将单元格的数据称为“Data & Time”。
对于第一组数据,我们选择小于或等于当前时间点的所有数据,并将其他数据点设置为#N/A。
对于第二组,我们选择与当前时间匹配的数据,其他数据也设置为#N/A。这里,#N/A 不在图表中显示数据点。
⑤将气泡图绑定到数据源。
在最后一步,我们将气泡图绑定到数据源,飓风轨迹图就完成了。
图表中的文本框可以通过链接单元格直接从单元格中获取数据点的信息。地图上除了气泡图之外,还增加了一组柱形图来表示风,其数据绑定操作形式与气泡图相同。
嗯,用 Excel 做飓风图的大致思路是这样的。下面是飓风厄玛的官方地图。是不是和我用 Excel 做的很像?
From Weather Underground
技巧
Excel 的功能非常强大,但是如果你想用它制作一些复杂的图表,你必须有代码库,还要学习 VBA 语言,这很费时间。我分享过一篇文章数据地图在商业分析中的 4 种用途 ,其中所有地图都是用零代码可视化工具 FineReport 制作的。操作很简单。如果不理解代码,可以尝试这个工具创建数据可视化图表。
您可能也会对…感兴趣
数据可视化中的前 16 种图表类型
新手如何设计酷炫的数据可视化?
业务仪表盘初学者指南
原载于 2019 年 7 月 25 日http://www.finereport.com。
我制作了一个机器学习模型来评估我的浏览体验
原文:https://towardsdatascience.com/i-made-a-machine-learning-model-to-evaluate-my-browsing-experience-793b5b1022f5?source=collection_archive---------20-----------------------
如果你像我一样…
你可能对机器学习有点不健康的痴迷。我当然知道…我一直把自己当成数据科学活动的小白鼠。收集关于我自己和所有人的数据很难,但令人兴奋的是现在我可以告诉你了。
我做了什么
在过去的几周里,我一直在记录我的网络浏览搜索,以及与我的浏览体验相对应的评级。我这样做的目的是
用人工智能驱动我的生活。
嗯,也许不是…也许我这么做只是为了的乐趣。与正常的数据科学项目类似,这种折磨人的活动的很大一部分实际上是收集数据。我有过许多伟大的想法,但由于数据收集这一步,这些想法根本不可行。几个失败的 arduino 项目(尝试了大脑植入,但没有成功)被遗失在我一台电脑的文件夹里。这些 绝妙的 想法大多与我的个人健康或自动化我每天做的事情有关。
举个例子,我花了整整一个月的时间开发帮助我睡眠的软件,因为我是一个失眠症患者。所以第一部分是想出一种方法来监控我什么时候醒来,什么时候睡觉……你可能会笑,但我用网络摄像头训练了一个神经网络,它可以判断我的眼睛是睁开还是闭上。
接招吧,谷歌!
事实证明,检测睁开或闭上的眼睛实际上非常困难,但我有一个工作正常的模型,我准备开始使用它。那么是哪里出了问题呢?生活充满变数,你无法真正控制,有些你可以控制,我给自己做了一个测试集,预测甚至不接近,因为我是残酷地不一致。
当我开始我的网络浏览项目时,一个完全基于软件的高级应用程序来收集某种类型的数据的想法绝对吸引了我。我打算用 Python 开发一个 web 浏览器,记录我的搜索查询(输入到浏览器中的搜索框中),每次我关闭它时,它都会要求我对我的体验进行一到十的评分。
是的,这很烦人。
我是如何做到的
项目一开始,我就遇到了第一个大问题。我无法在 GTK3+中获得任何形式的 web-kit。我几乎完全退出,而不是切换到不同的 GUI 框架。最终,我选择了 Qt,主要有两个原因:
- Kivy 是一个大得多的包,安装有点乏味…
- Qt5 有一个更老的基础,因此问题已经被提出来了,错误也已经被挤爆了。
在构建了我的极简浏览器(很高兴回到 Chrome)后,我让关闭按钮请求一个数字并转储,并设置了一个小脚本来记录我的网络浏览习惯。
大约两周后,我对我拥有的数据量非常有信心,大约有 2,500 个浏览器会话,所以我将我的数据加载到 Python 中,并决定了我的模型。我决定和我的老朋友一起使用 tfidf 变压器,
随机森林分类器
在我的模型建立并运行之后,我能够输入一个查询,并了解当时我的一天是如何进行的。回报异常的低,大多数结果低于 5,我记得最多的是 7。
但是……为什么呢?
因为我是一个愤世嫉俗的人,我倾向于连续几个小时打开浏览器,所以我用一个相当个人化的偏见量表来评价我的体验…
此外,浏览器带来了糟糕的体验。
在训练完这个模型后,我可以自信地说,我对自己彻底失望了。我确实从反过来预测中获得了乐趣,猜测我谷歌了哪些让我如此不安的短语,但这不足以弥补我以科学的名义在这个项目上花费的时间。与其他项目类似,这个项目绝对是一个失败。不管我认为我创造的东西有多糟糕,我真的很喜欢做它。希望将来我能重温这个,或者类似的想法,做出更酷的东西。也许我会花钱请人帮我使用浏览器,这样我就不用这么做了。
这是一个痛苦的经历,失去一个你如此热爱的项目,因为有一天你醒来说:
这个项目很糟糕。
但是失败也是乐趣的一部分。因为实验,数据科学是一件有趣的事情。测试总是受欢迎的,而且永远不会引起争论。希望我能接受这次失败,并在以后用更多的数据、更好的浏览器和更少的偏见来抵消它。也许有一天我会重温那个古老的睡眠计划,不管怎样,我都很兴奋去做我想做的事情。
我需要一个有人情味的人
原文:https://towardsdatascience.com/i-need-somebody-with-a-human-touch-7d749f65a440?source=collection_archive---------32-----------------------
在这个万物指数化的时代,我们在工作和个人生活中承担的任务越来越自动化。无论是点击购买电子书,在几秒钟内预订出租车,还是通过聊天机器人查询账单,我们现在都可以通过软件应用毫不费力地完成生活中的许多平凡工作,而不需要人类的接触。
因此,我们参与的许多企业已经改变了我们与他们互动的方式,采用越来越多的技术来提供他们的产品和服务,同时减少一线所需的人员。对于零售商来说,随着越来越多的业务转移到网上,他们需要的商店和员工数量已经减少。随着数字银行的兴起,零售银行大幅削减了分支网络,随着在线旅行社(OTA)取而代之,商业街旅行社正在迅速消失。
一些研究表明,我们正在进入一个新时代,随着软件和机器人蚕食价值链,许多人最终将被机器取代。然而,虽然技术已经给我们购物、饮食、旅行和工作的方式带来了巨大的变化,但认为技术将独自主宰我们生活的想法是短视的。
毫无疑问,管理性和重复性任务实现自动化的时机已经成熟。具有前瞻性思维的组织已经采用了流程、工具和技术来实现这些领域的优势,其中机器人流程自动化 (RPA)在保险索赔处理、 KYC 和反洗钱合规计划以及发票和销售订单处理中实现了高效率,这只是众多使用案例中的一小部分。
随着我们在普通程序之外的价值范围内向上移动,逻辑可能会变得“模糊”,但许多这些需要判断对错程度和内置可选性的更复杂的活动仍然在当今更高级的应用程序的范围之内。在这里,我们看到基于偏好或行为向我们呈现内容的方式更加复杂,由于上下文感知和下一步最佳行动类型的建议,地图引擎变得更加智能。
但是,当我们开始处理真正复杂的请求,平衡看似非理性和理性的思维,并引入更高程度的上下文和细微差别时,我们就进入了一个挑战机器能力极限的世界。
今天,有时一个人加上一台机器对一种情况更有价值,因为野蛮的计算能力或规模化的理性逻辑是不合适的。人们天生会处理情绪和不合逻辑的思维。他们知道最合理或最佳的答案可能不是你需要或想要的,但他们能明白为什么它有意义。
现在,以及(至少)未来十年,机器+人类的机会提供了更多。想想规模计算的强大力量,它做着繁重的工作,而人类大脑几千年的进化完成了最复杂的领域。
要考虑的一些例子:
- 医生可以搜索国家数据库来寻找潜在的匹配,然后运用她自己的医学敏锐度来做出决定。
- 律师使用该软件分析成千上万的案件,把他真正需要花时间处理的案件减少到少数几个。
- 跟单人员可以采用建议的服装系列降价曲线,并运用自己的经验取消选择她知道仍有利润潜力的商品。
- 长途卡车司机知道一个特定的城市是很难导航,由于最后一分钟的道路工程,所以当他进入市中心街道的老鼠跑关闭自动驾驶仪。
很明显,我们将越来越多地生活在人工智能辅助的世界中,但让我们平衡宣传与现实,不要低估自己。大脑里还有很多里程。
我在第一次人工智能比赛中获得了第四名。Unity 障碍塔比赛的收获
原文:https://towardsdatascience.com/i-placed-4th-in-my-first-ai-competition-takeaways-from-the-unity-obstacle-tower-competition-794d3e6d3310?source=collection_archive---------22-----------------------
在过去的几年里,我的大部分业余时间都花在了修补,学习和研究机器学习,特别是强化学习和数字演员上。
最近我决定参加障碍塔挑战。令我惊讶的是,我早期的努力短暂地名列榜首,我在第一轮中排名第二,因为我的代理人掌握了塔的前 10 层(0 到 9 层)。
虽然我的代理人在大部分比赛中处于第二位,但它从未完全掌握 10 楼,最终排名第四。
第一轮:
我的第一步是复制这篇论文的发现,“障碍塔:视觉、控制和规划的一般化挑战”,这是我使用 Rainbow 示例代码完成的。
Obstacle Tower Challenge authors found that PPO did not generalize well.
我决定改用 PPO 算法。虽然 PPO 算法在障碍塔论文中表现不佳,但是它有一个高 天花板,我想探究一下为什么它在这种环境下表现不佳。
我假设,通过实现最先进的 PPO 实现中使用的最佳实践和优化,其性能应该没有理论上限(至少与其他无模型强化学习算法相比)。
我用了论文里的代码,好奇心驱动学习大规模研究,让我的代理人在短时间内得了 9.4 分,获得第一名。在训练时,我发现好奇心奖励(参数'— int_coeff ')似乎不会影响表现。我发现我需要减少它的影响,以便算法可以学习环境(— int_coeff=0.025,— ext_coeff=0.975)
我发现 TensorFlow 框架不容易使用,所以寻找 PyTorch 替代代码库。我选择了'py torch-a2c-ppo-acktr-Gail',并围绕 PPO 算法的实现构建了我的代码。我能够复制我之前的分数。
Performance of Agent in Round One.
通过进一步的完善和培训,我能够获得稳定的 10 分,因此代理始终能够在公共和测试种子上完成挑战的前 10 层。
以下是代理完成谜题的一些示例:
Easy Key Puzzles: lower levels have relatively simple key / door placement where the key is on or close to the path through the level. The agent is able to learn without any prior semantic knowledge of the relationship between keys and door.
Hard Key Puzzles: later levels have a more complex key/door placement where the agent must search for the key.
Double Jump Puzzle: this was one of the harder puzzles in the first 10 levels. The agent learns to do a double jump. Some seeds have a blocking mechanic, whereby the agent must complete this puzzle to get the key and progress.
第一轮论文
我觉得我已经走了很长的路来证明我的假设,并利用第一轮和第二轮之间的时间进行了一些实验分析,并写了一篇技术论文, PPO Dash:在深度强化学习中提高泛化能力,附带源代码【github.com/sohojoe/ppo-dash】T2
我的代理人在基本 PPO 算法上做了一些简单但经过深思熟虑的修改,超越了当时发表的障碍塔论文的最新水平。我希望展示每个最佳实践和优化的单独价值,就像 DeepMind 的论文一样,“彩虹:结合深度强化学习的改进”
PPO Dash: Improving Generalization in Deep Reinforcement Learning
对于消融研究,我单独训练每一个修改,然后逐步组合。在 10 米的训练步骤中,我将 17 个不同的实验中的每一个都跑了 3 次,每次跑大约需要 5 个小时。
这篇论文有点失败,只有一处修改(减少动作空间)具有统计学意义。
要么其他修改没有价值,要么我们需要超过 10m 的训练步骤来分离它们的价值。我会假设是后者,但考虑到消融研究的总训练时间超过 250 小时(或 2 周),这有点令人沮丧。
我建议阅读技术文章,了解最佳实践和优化的详细分类,但是,这里有一个摘要:
- 动作空间缩减:我选择在这项任务中积极进取,因为我希望网络专注于更大的泛化目标,而不是背负着学习动作之间的语义关系的负担,这是人类想当然的。我选了一套 8 个动作(比原来的 54 个动作下降了 85%)。在论文中,我测试了 10 米台阶上 6、8、20、27 和 54 个动作空间。
Comparison of action sets and their impact on the maximum floor reached after 10m steps.
- 帧堆栈缩减:帧堆栈缩减的目标是通过减少所需网络输入的数量来提高学习性能。我发现我可以将历史画面的数量减少到一个黑白画面。
- 大规模超参数:通常 PPO 算法的超参数针对 Atari 基准进行调整。我的假设是障碍塔挑战环境更接近于布尔达等人(2019)的 Unity Maze 环境,因为这两个环境都是 3D 性质的,并且两个环境都有稀疏的奖励。我们实现了对超参数的以下改变:8 个时期,在恒定学习速率下的学习速率为 1e-4(没有线性衰减),熵系数= 0.001,小批量数量= 8,并发代理数量= 32,每个时期的步骤数量= 512
- 向量观察:添加向量观察的目的是最大化可见像素的使用,并消除策略需要学习可视编码状态信息的负担。我还将之前的动作和之前的奖励添加到向量中。
- 归一化观测值:归一化观测值的目标是帮助增加每个像素的方差。
- 悬赏黑客:我做了以下改动来增强悬赏信号。完成楼层:添加剩余生命值以鼓励政策尽快完成每个楼层(奖励范围在 1 到 4 之间)。拼图完成:给予奖励 1(默认情况下,这是 0.1)。生命拾取:拾取一个蓝点/生命拾取奖励 0.1。游戏结束:给予-1 的奖励。
- 循环记忆:增加循环记忆的动机是它将帮助策略学习解谜的时间方面。
我的直觉是,1000 万步太少了,不足以展示这些修改的影响。例如,我在没有记忆的情况下只能得 9.2 分。对于第二轮,我放弃了标准化的观察。目前还不清楚奖励黑客攻击的影响有多大,我也不确定我会不会再次使用它。
探索谜题 vs 语义谜题
许多研究人员将稀疏奖励环境的挑战(如蒙特祖马的复仇)视为“探索问题”,并提出了解决方案,如好奇心(最大化对不确定状态的探索)和赋权(最大化未来可选性)。虽然这些在解决一些谜题时很有用,例如双跳谜题,但我不认为它们能解决 10 级中介绍的方块谜题。
当一个人类玩家遇到积木拼图时,他们从多年玩视频游戏和看印第安纳琼斯电影中获得了丰富的语义知识。他们知道语义关系:“玩家可以推板条箱”,“触发开门”,以及“谜题可以重置。”
语义关系的好处是,人们可以应用图论将语义链接在一起来解决问题。我们经常把天才归因于将两个看似不相关的想法联系起来,为一个难题提供一个新颖的解决方案的行为。或许,如果我们能够在语义上模拟环境,那么我们的人工智能将会展现出一些这种天赋。
Illustration of different roles and types of natural language information in reinforcement learning. From the paper ‘A Survey of Reinforcement Learning Informed by Natural Language’
我不是第一个有这种洞察力的人。这篇名为“自然语言强化学习综述”的论文很好地概述了这一领域的活跃研究。
方糖项目
我的想法是为 visual OpenAI 创建一种图灵测试。健身房兼容的环境。想象两个终端,终端 A 和终端 B,其中任何一个都可以由一个 人 、 重放数据 ,或者一个 AI 策略来控制。
这个想法是训练两个代理——一个终端 A 代理,学习发布“指令”或“想法”加奖励,另一个终端 B 代理,学习掌握 OpenAI。健身房环境。
Project Sugar Cube: Terminal A gives instructions to Terminal B
终端 A 查看来自终端 B 的视觉环境反馈,并向终端 A 发出基于文本的“指令”或“想法”以及+1 / -1 奖励信号。
Project Sugar Cube: Terminal B tries to complete the goal
终端 B 是开放的。对健身房环境做了一些修改——它从终端 A 接收文本输入,并从终端 A 接收额外的奖励信号。
Project Sugar Cube: Terminal A gives a positive or negative reward based on Terminal B’s performance.
终端 A 然后给终端 b 正面或负面的奖励。
因为每个终端都是抽象的,所以可以采取分阶段的方法。例如,一个步骤可以集中于在预先记录的终端 A 输入和奖励上训练终端 B。
我选择花时间开发方糖项目的原型,知道这是一个长远的竞争回报,但我知道我有一个解决方块难题的 B 计划。
我即将发布支持两个人类用户的原型,以及用于数据收集的障碍塔环境。我计划在下一年用我在第一轮中赢得的谷歌云积分来收集数据。
第二轮决赛
第二回合见证了障碍塔环境的重大更新。最初,我很难再现第一轮的结果,并发现我需要在所有视觉风格中随机化。当我专注于项目方糖原型时,我离开了这个培训。
在比赛结束前两周左右,我又把注意力转移到了比赛上。我的“B 计划”是注入预先录制的人类完成积木拼图的演示。
我曾希望通过使用预先录制的输入来驱动代理,直到完成拼图之前,然后慢慢增加它必须完成的步骤数,从而使用逆向强化学习。我遇到的问题是,不知何故,当重新开始一个级别时,环境没有完全重置,所以重放经常不同步。
我改变了策略,在训练中注入了原始的观察、奖励和行动。最初,我是这样做的,当代理达到第 10 级时,它将通过该级别的预记录,然后通过使用策略。学习起来很慢,所以我实现了设置随机重放之间采取的策略步骤数量的能力。
Final agent solving the block puzzle. Note how it struggles on the first few attempts.
同样,这很慢,但它有时确实学会了完成积木拼图。它还完成了更高的级别,这是令人满意的,因为我只提供了 10 级的演示。
然而,它并没有完全概括。它会掌握一些种子,但会像掌握其他种子一样忘记它们。
此时尝试任何重要的新策略都为时已晚。我试着录制更多的演示。我试着移除演示,它会慢慢忘记如何完成积木拼图。此外,我尝试从 10 级开始,但这似乎也使它变得更糟。
通过我不同的提交,它确实在某些时候通过了每个测试种子的第 10 级,但不是在同一次运行中。我尝试了不同的训练有素的网络实例的集合,这可能有一点点帮助。
我推荐读读 Unixpickle 的 写他的获奖经纪人的;Unixpickle 还在演示中使用了 PPO 以及一些有趣的技巧。听起来好像我的经纪人在他实施 Prierarchy /用 KL 术语代替熵奖励之前达到了一个类似的平台。我想尝试在我的代码中实现 KL 项,因为如果不用他使用的其他技巧,看看积木拼图是否是可解的会很有趣。
最后的想法
我真的很享受在比赛中工作的时光,在 Twitter 上与其他参赛者互动,以及它给我的灵感,让我与方糖项目一起朝着语义学和 RL 方向努力。
我最后的分数是 10.8。我已经跌出了前三名,这意味着没有奖金(现金、谷歌云积分、旅行补助)。然而,对我来说,获胜的目标从来没有发展我的直觉、改善我的纪律以及朝着我创造数字演员的长期目标努力那么重要。
我读了一本“数据科学家统计”的书,这样你就不用看了
原文:https://towardsdatascience.com/i-read-one-of-those-stats-for-data-scientists-books-so-you-dont-have-to-4ba04af5bc93?source=collection_archive---------10-----------------------
我目前是一家大型科技公司的数据科学家,每天在工作中运用我的专业知识,自然地发展我的技能。然而,我的一个怪癖是我喜欢边学习边做事。老实说,这是我最初进入数据科学的原因,但那是另一篇博客文章的主题。
在过去的几个月里,我在周末、飞机上,甚至在工作的时候,都在漫不经心地阅读数据科学家实用统计数据。原因何在?我坚信我永远不会停止学习。有时,重新引入一个概念、工具或方法这一简单的行为可以引发新的创造性方法来解决你自己可能没有遇到过的问题。
这篇博客旨在分享一些“灵光乍现的时刻”,并整理我在阅读这本书时的想法——这样你就不必这么做了。我还在适当的地方链接了进一步的阅读材料。
但在我透露所有秘密之前,让我快速告诉你为什么我认为你应该读这本书——以及其他数据科学书籍。
在我漫不经心地读这本书的时候(还是非常漫不经心地读),我在空白处记下了适用于正在讨论的概念的当前、过去和未来的项目。有多少次,我碰巧拿起书来阅读下一章,却发现一个伟大的想法来克服我目前工作中的一个障碍,这是非常可笑的。我不知道这是不是数据科学之神在对我微笑,但它确实改变了我的一些项目。
现在,另一个重要的免责声明—我并不是说书中讨论的任何概念,或者我将在下面强调的任何概念,都是突破性的数据科学技术,而不是我不熟悉的技术。事实上,书中几乎没有什么是开创性的“新消息”。相反,我是说,在日益拥挤的数据科学技术中,信息技术的出现是新思想的完美载体。
好了,序言够了;以下是我从阅读这本书中获得的一些重要收获。
探索性数据分析
- 平均绝对偏差是测量标准偏差的替代方法。平均绝对偏差让我们了解平均值的平均变化。一个有用的应用是帮助估计抽样误差率。假设我们知道真实值是 X,那么误差(相对于 X 的平均绝对偏差)是如何随着样本的减少而增加的。
- 百分位数对于总结尾部特别有用。不要使用直方图,尝试绘制百分位值。还有其他创造性的方法来可视化分布。
- Winsorization 可以使汇总统计数据和可视化更清晰、更健壮。
- 通常情况下,你通过图形来测量偏斜度和峰度,而不是一个特定的指标。
- 对于探索性分析和可视化来说,将数值数据转换成分类数据有很多好处,可以降低数据的复杂性(和大小)。宁滨是这样做的一种方式。
- Spearman 的 rho 或 Kendall 的 tau 是基于秩的相关方法;它们对异常值更具鲁棒性,并且适用于较小的数据集。
- 当散点图有太多值时:绘制前采样,调整 alpha(透明度),使用六边形显示六边形点的密度或轮廓(看起来像地形图)。
- 列联表用于比较两个分类变量,最理想的是同时表示关系的计数和百分比。
- 调节和使用网格图形是可视化多元关系的好方法。
数据和抽样分布
- 抽样考虑包括有无替换、群体代表性以及总体分布情况。
- 重要的是要记住向平均值的回归:极端的观察结果往往会跟随着更中心的观察结果。因此,精确的估计通常最好用置信区间来代替。
- Bootstrapping 是从样本分析中获得置信区间的有效方法。相关的,bagging 是在模型上应用 bootstrapping 的另一种方式,这样您就可以看到模型参数有多少可变性。
- 当推理样本统计的分布时,正态分布很有帮助。
- QQ-Plot 拟合是一种直观检查数据是否正态分布或“标准化”的方法。要标准化数据,或者将其与正态分布进行比较,可以减去平均值,然后除以标准差。
- 了解分布是很有用的,这样你就可以识别什么时候结果是偶然产生的。
统计实验和显著性检验
- 多重比较和错误发现率对于运行测试的数据科学家来说非常重要。 Bonferroni 调整降低 alpha 到 alpha /观察次数。
- ANOVA 帮助您比较组间测试统计的差异。它帮助你衡量组间的差异是否是由于偶然。
- 箱线图是可视化指标和多个分类组之间关系的绝佳方式。
- 卡方检验测量整个样本的分布变化程度。然后 p 值是根据概率计算的。
- 费希尔精确检验是卡方检验的进一步版本,当样本数量非常少时可以使用。它依靠重采样来创建所有可能的重新排列(置换),并计算观察到的结果有多大可能。
- 卡方检验和费希尔精确检验都可以用来计算所需的样本量,以获得具有统计学意义的结果。
- 在运行测试之前,应计算功效和样本量,以确定这些值之间的关系。例如,保持功率不变,最小尺寸效应越小,需要的样本尺寸就越大。
回归和预测
- 相关性量化了关联的强度,回归量化了关系的性质。
- 预测后,残差测量拟合(预测)值与实际真值的距离。
- R 的平方范围从 0 到 1,测量模型中数据的变化比例。
- 特征重要性和特征显著性是指建模的不同方面。特征重要性是指根据系数的大小对特征进行排序。要素显著性是指要素按 p 值大小排序。
- 交叉验证是一种通过预测和比较测试样本上的结果来确认在训练样本上训练的模型的有效性的方法。
- 选择模型时,最好使用奥卡姆剃刀的原则——在其他条件相同的情况下,应优先使用简单的模型,而不是复杂的模型。
- “修剪”回归模型最常见的方法是逐步回归、向前和向后选择。
- 岭回归和套索回归通过降低系数而不是丢弃系数来惩罚模型。
- 另一种获得精确系数的方法是上下加权一些训练数据。
- 在数据范围之外推断回归模型是不好的做法。
- 如果您使用回归进行解释或分析特征重要性,请使用自举系数。如果使用回归进行预测,请使用引导预测。
- 热编码是一种将分类数据转换成虚拟/布尔数据的方法。
- 针对预测排序或有序数据的回归称为有序回归。
- 具有相关预测会使解释回归系数的符号和值变得困难(并且会增加标准误差)。多重共线性在您创建虚拟变量而忘记创建 n-1 个变量时是一个特别的问题。
- 回归的另一个问题是混淆变量,即您遗漏了回归方程中未包含的重要变量。
- 异常值可以通过标准化残差(真实值离预测值有多远)来确定。
- 部分残差图也有助于理解预测因子和结果之间的关系。这里,您在 X 轴上绘制了一个给定的特征,在 Y 轴上绘制了部分残差。部分残差=残差+估计回归系数*特征值。
- 异方差是在预测值的范围内缺少恒定的残差方差。
- 当查看变量散点图时,查看平滑线来显示关系会有所帮助。这些选项包括黄土、超级光滑和内核光滑。
分类
- 如果你试图对两个以上的类别进行分类,最好是把它们分解成多个二元分类问题。尤其是当一个病例比其他病例更常见时。
- 分类技术的一个有趣的应用是线性鉴别分析 (LDA),其目标是减少变量的数量,同时最大化类别的分离。
- 通常,我们将数据分为训练数据和测试数据,并根据测试数据评估我们的模型的准确性。您可以对 p(真实类别的预测概率)使用各种截止阈值,并评估精确度和召回率的权衡。这方面的工具包括混淆矩阵和 ROC 曲线。
- 在评估模型的有效性时,Lift 尤其重要。Lift 考虑的是与盲选或随机选择相比,性能要好得多。这在不平衡分类问题中特别有用。
- 当数据集不平衡时,一些策略是对最普遍的类进行欠采样,或者对少数类进行过采样。您也可以使用数据生成方法。
统计机器学习
统计机器学习的一个例子是 K 最近邻 (KNN)。
- 在 KNN,实际上有各种各样的距离度量和思考距离的方式,包括:欧几里德距离、曼哈顿距离和马哈拉诺比斯距离。
- 当依赖于计算距离函数的统计方法时,更重要的是将变量标准化,这样就不会意外地对某些要素赋予更大的权重。一种方法是 z 分数。
- KNN 提出的一个问题是选择哪个国王。考虑这个问题的一个方法是考虑数据的结构。高度结构化的数据允许较低的 K,而结构化程度越低或信噪比越低,K 就应该越高。
- KNN 也可以应用于特征工程。
树模型是对涉及类似决策树结构的分类和回归技术的一般描述。
- 一个重要的考虑因素是,你愿意让你的树有多深,或者有多少裂缝。分裂越多,过度拟合的风险就越高。人们可以通过硬编码来限制树的数量(通过超参数调整),也可以对树的生长进行惩罚。
- 随机森林和装袋比决策树更强大,但更难解释。
- 随机森林的一个有用输出是变量重要性的度量,它根据预测因子对模型精度的贡献对预测因子进行排序。
- 增强比打包本质上的集成方法,加上将训练集中在错误分类的数据点上的方法更复杂。
超参数需要在拟合模型之前设置;作为培训过程的一部分,它们没有得到优化。超参数调整可以通过直觉或者像网格搜索和随机搜索这样的方法来完成。
正则化是一种避免过拟合的方法。正则化修改了成本函数,以降低模型的复杂性。岭回归是一种增加惩罚的方法。
无监督学习
- 无监督学习的用途是:聚类,以确定有意义的数据组,减少数据的维数,探索性的理解。
- 聚类对于“冷启动问题”来说是一个特别重要的工具,它允许您识别和标记要研究的子群体,在营销中尤其有用。
- 主成分分析 (PCA)涉及协变预测变量的组合,是线性判别分析(LDA)的无监督版本。
- K-Means 聚类是进行无监督学习最常用的技术之一。
- 由于我们再次使用距离函数,变量的规范化(即标准化)是必不可少的。
- 解释集群的大小和方式有助于您理解底层数据中的模式。例如,不平衡的聚类可能是由遥远的异常值或与其他数据非常不同的数据组产生的。
- 肘法是选择聚类数的有效方法。
- 层次聚类是 K-Means 的替代方法,对发现异常值更敏感。当聚类可能包含其他聚类时,它们也更容易解释。
一年来,我每天都追踪自己的快乐
原文:https://towardsdatascience.com/i-tracked-my-happiness-each-day-of-2018-cafe0d048aa2?source=collection_archive---------11-----------------------
观察和分析我自己心理健康的趋势
序言
2018 年,我每天都跟踪自己的心理健康状况。我用 1-5 的等级来评价我的快乐,其中“1”是非常糟糕的一天,“2”是有点糟糕的一天,“3”是一般的一天,“4”是有点好的一天,“5”是非常好的一天。我想在这篇文章之前说,我理解尝试和量化心理健康是多么复杂和困难。我的荒谬简单,完全主观,固有偏见的评级系统绝不是试图准确地代表心理健康谱的复杂性。我的目的只是想象和观察一年中我自己心理健康的任何趋势。我根据那天我的总体感觉来选择分数。然后,我使用 Google sheets 记录了这个分数,还记下了每天发生的任何重大事件,作为补充的定性数据(稍后会详细介绍)。也就是说,我认为找到专门适合你的精神健康管理方法很重要,但我希望这个项目有助于提供一个不同的视角。
数据
这是我 2018 年每天得分的热图,以日历的形式展示出来。向所有红绿色盲的人道歉:(
Legend
My 2018 Happiness Heat Map
分析
在这一节中,我试图通过从不同角度更详细地查看数据来确定趋势。借助一些简单的公式、条件格式和过滤,我能够识别一些常见的主题。我还列出了解释这些结果的可能原因。我要再次重申,这不是一项科学研究。我给出的解释仅仅基于我自己过去的抑郁和焦虑经历,我过去作为健康顾问的经历,以及我在这个项目过程中学到的东西。
全年日均得分: 3.72 这是基线得分。我们会将其他分数与此进行比较。
各月平均得分
今年开局不利,但有明显的上升趋势,尤其是下半年。最明显的原因是我在九月中旬从旧金山地区搬到了纽约。搬到一个新的城市和州是一次具有挑战性的经历,但对我来说,它给了我专注于改善心理健康所需的精神空间和机会。我是一个城市男孩,纽约市散发出一种我无法用语言表达的能量。
搬到纽约市前的平均分: 3.51
搬到纽约市后的平均分: 4.25
很明显,三个月是一个小样本,我仍然处于蜜月期。我需要重新审视 2019 年的数据,看看搬到纽约对我的心理健康有何长期影响,但现在我会随遇而安。
不仅仅是这一举动解释了我的上升趋势。随着时间的推移,我越来越擅长管理自己的心理健康。我变得更好地认识到是什么引发了我的抑郁或焦虑,我积极地让自己远离那些会让症状变得更糟的情况。我认为这个项目在其中起了很大的作用。因为我是一个视觉型的人,看到我糟糕的一天被用醒目的红色标在电子表格上,促使我把第二天标在一个绿色方框里,或者至少标在一个黄色方框里。如果我连续看到太多的 1 或 2,我知道我必须做些什么。我计算了每个月底的平均值,所以我开始注意到每个月我的平均值都会稍微上升。我会挑战自己,在下个月取得更好的成绩。看到我的心理健康像那样被绘制出来,有助于我对自己负责。
一周中各天的平均分数
他们把星期三叫做“驼峰日”是有原因的,是吧?我确信周三的低平均水平和一周的辛苦工作有一定的关联。我想周五和周六是我最美好的日子,因为这两天我会和我所爱的和关心的人在一起。现在我知道了这些信息,我计划在周三安排更多的时间进行自我护理,以抵消较低的分数。也许我可以把跆拳道课安排在周三晚上,或者留出时间去做
按分数计数
对于所有阅读这篇文章的 redditors,我最喜欢的一个 subs 是 r/databasebeautiful,所以想象一下当数据看起来像一个几乎完美的(右偏)钟形曲线时我的喜悦。唯一令人惊讶的是,我以为我得到了更多的 1,但也许这只是我的抑郁症欺骗我相信事情比实际情况更糟。
得分“1”后第二天的平均得分: 3.86 我想特别强调一下这个统计数据。在我的抑郁或焦虑对我打击最大的日子里,我真的很容易回到我的旧习惯,只是呆在我的房间里整天悲伤。如果是 2017 年,我抑郁症最严重的时候,那肯定是这样。在我失业的大约 4-5 个月的时间里,我会熬夜到凌晨 4 点,下午 2 点醒来。我让负能量滚到了第二天。我醒来时会比睡觉时更难受。3.86 的分数实际上高于平均分,这意味着我不仅没有让自己沉溺于自己的坏想法,我还特意充分利用了第二天。这显示了与前一年相比的大幅增长,这是我为自己感到非常自豪的事情。
旅行时的平均得分: 4.00 这一项可能不会让人感到太惊讶。今年我迷上了旅行,总共花了大约 5 周时间在州外或国外旅行(不包括搬到纽约)。我能走出公寓的任何时候通常都是美好一天的标志。旅行也帮助我走出我的“泡沫”,提醒我这个世界还有很多我没有经历过的事情。如果你有财力做到这一点,我鼓励你每年至少去一个和你说不同语言的国家旅行。
“1-2”得分的主要原因 我在笔记上记下了以下原因:
焦虑和抑郁 x20,孤独,孤立,感觉自己不够,感觉生活落后,与前任争吵,被工作和研究生院拒绝,疲惫,在医院与父母,朋友和家人争吵,压力过大,精神崩溃,自卑。
“4–5”分数的主要原因 与朋友出去玩 x100,与家人共度时光,老鹰队赢得超级碗,按摩治疗,拳击,在工作之外与同事出去玩,加薪,良好的锻炼,惊喜生日派对,音乐会,旅行,权力的游戏赛季结局,卡斯科,第一次吃汉堡,搬到纽约,纽约的第一场雪,朋友来看我。
我明年的目标很简单:减少前者,增加后者。
外卖
这个项目通过让我保持责任感,直接促进了我心理健康的改善。考虑到我每天花不到一分钟的时间来跟踪,我认为这种努力是值得的。列出你所有糟糕的日子和导致它们的事情听起来可能违反直觉,但它实际上激励我更加努力地工作,以避免那些红盒子。我认为这很大程度上说明了我们的文化,以及我们面对这些负面情绪有多么害怕,但我明白了,如果你一直把它藏在心里,就很难解决它。2018 年是我奔向我的恐惧并最终解决它们的一年。我将在 2019 年继续跟踪我的心理健康,现在我知道要寻找什么,希望下次数据分析可以更详细。我分享这些数据不是为了说服你做同样的事情,而是为了鼓励你考虑通过找到一种对你有效的方法来更积极地照顾自己的心理健康。我们非常重视我们的身体健康,但对我们的精神健康却不太重视。我也鼓励你与你信任的人,但最重要的是与你自己,进行更多关于精神健康的开放、诚实和坦诚的对话。这些对话不会很舒服,但它们变得越来越有必要。
感谢收听,
NV
我训练一个网络像我一样说话
原文:https://towardsdatascience.com/i-trained-a-network-to-speak-like-me-9552c16e2396?source=collection_archive---------19-----------------------
内部 AI
而结局真的很搞笑。语言生成指南。
在过去的几个月里,我在我的个人博客上写了 100 多篇文章:【https://maelfabien.github.io/】。这是相当可观的内容。我想到了一个主意:
🚀训练一个语言生成模型像我一样说话。🚀
或者更确切地说,要像我一样把写成。这是说明语言生成的主要概念、使用 Keras 的实现以及我的模型的局限性的最佳方式。
本文的全部代码可以在这个资源库中找到:
[## mael fabien/机器学习教程
在这个库中,我上传了代码、笔记本和来自我的个人博客 https://maelfabien.github.io/…的文章
github.com](https://github.com/maelfabien/Machine_Learning_Tutorials)
在我们开始之前,我发现这个 Kaggle 内核是理解语言生成算法结构的有用资源。
语言生成
自然语言生成是一个旨在生成有意义的自然语言的领域。
大多数情况下,内容是作为单个单词的序列生成的。对于这个伟大的想法,它是这样工作的:
- 您训练一个模型来预测序列中的下一个单词
- 你给训练好的模型一个输入
- 并迭代 N 次,从而生成接下来的 N 个单词
Sequential Prediction Process
1.数据集创建
第一步是建立一个数据集,它可以被我们稍后将要建立的网络所理解。首先导入以下包:
a .加载数据
我写的每一篇文章的标题都遵循这个模板:
这是我们通常不希望在最终数据集中出现的内容类型。我们将把重点放在文本本身。
所有文章都写在一个单独的降价文件中。报头基本上携带关于标题、图片报头等的信息。
首先,我们需要指向包含文章的文件夹,在我的名为“maelfabien.github.io”的目录中。
b .句子标记化
然后,打开每篇文章,并将每篇文章的内容追加到列表中。然而,由于我们的目的是生成句子而不是整篇文章,我们将把每篇文章分成一个句子列表,并将每个句子附加到列表“all_sentences”中:
all_sentences= []
for file in glob.glob("*.md"):
f = open(file,'r')
txt = f.read().replace("\n", " ")
try:
sent_text = nltk.sent_tokenize(''.join(txt.split("---")[2]).strip())
for k in sent_text :
all_sentences.append(k)
except :
pass
总的来说,我们有 6800 多个训练句子。到目前为止的过程如下:
Sentence split
c. N-gram 创建
然后,想法是创建 N 个一起出现的单词。为此,我们需要:
- 在语料库上安装一个标记器,将一个索引与每个标记相关联
- 将语料库中的每个句子分解为一系列标记
- 存储一起出现的令牌序列
可以用下面的方式来说明:
N-gram creation
让我们实现这一点。我们首先需要安装标记器:
tokenizer = Tokenizer()
tokenizer.fit_on_texts(all_sentences)
total_words = len(tokenizer.word_index) + 1
变量‘total _ words’包含已经使用的不同单词的总数。这里,8976。然后,对于每个句子,获取相应的标记并生成 N 元语法:
变量“token_list”包含一系列标记形式的句子:
[656, 6, 3, 2284, 6, 3, 86, 1283, 640, 1193, 319]
[33, 6, 3345, 1007, 7, 388, 5, 2128, 1194, 62, 2731]
[7, 17, 152, 97, 1165, 1, 762, 1095, 1343, 4, 656]
然后,“n 元语法序列”创建 n 元语法。开头是前两个词,然后逐渐加词:
[656, 6]
[656, 6, 3]
[656, 6, 3, 2284]
[656, 6, 3, 2284, 6]
[656, 6, 3, 2284, 6, 3]
...
d .填充
我们现在面临以下问题:不是所有的序列都有相同的长度!我们如何解决这个问题?
我们将使用衬垫。Paddings 在变量“input_sequences”的每一行之前添加 0 的序列,以便每一行与最长的一行具有相同的长度。
Illustrating Padding
为了将所有句子填充到句子的最大长度,我们必须首先找到最长的句子:
max_sequence_len = max([len(x) for x in input_sequences])
在我的例子中,它等于 792。对一个句子来说,这看起来太大了!由于我的博客包含一些代码和教程,我希望这句话实际上是用 Python 代码写的。让我们画出序列长度的直方图:
Length of sequences
单个序列 200 +字的例子确实很少。将最大序列长度设置为 200 怎么样?
max_sequence_len = 200
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre'))
它会返回如下内容:
array([[ 0, 0, 0, ..., 0, 656, 6],
[ 0, 0, 0, ..., 656, 6, 3],
[ 0, 0, 0, ..., 6, 3, 2284],
...,
e .分割 X 和 y
我们现在有了固定长度的数组,它们中的大多数在实际序列之前都填充了 0。好吧,我们怎么把它变成训练集?我们需要分开 X 和 y!请记住,我们的目标是预测序列中的下一个单词。因此,我们必须把除了最后一个外的所有记号作为我们的 X,把最后一个作为我们的 y。
Split X and y
在 Python 中,就这么简单:
X, y = input_sequences[:,:-1],input_sequences[:,-1]
我们现在将把这个问题看作一个多类分类任务。像往常一样,我们必须首先对 y 进行一次热编码,以获得一个稀疏矩阵,该矩阵在对应于令牌的列中包含 1,在其他地方包含 0:
在 Python 中,使用 Keras Utils to _ categorical
:
y = ku.to_categorical(y, num_classes=total_words)
x 现在的形状是(164496,199),y 的形状是(164496,8976)。
我们有大约 165,000 个训练样本。x 是 199 列宽,因为它对应于我们允许的最长序列(200 - 1,要预测的标签)。y 有 8976 列,对应于所有词汇单词的稀疏矩阵。数据集现在准备好了!
2.建立模型
我们将使用长短期记忆网络(LSTM)。LSTM 的重要优势是能够理解整个序列的相关性,因此,句子的开头可能会对第 15 个单词产生影响。另一方面,递归神经网络(RNNs)只意味着依赖于网络的前一状态,并且只有前一个词有助于预测下一个词。如果我们选择 RNNs,我们会很快错过上下文,因此,LSTMs 似乎是正确的选择。
a .模型架构
由于训练可能非常(非常)(非常)(非常)(非常)(非常)(不开玩笑)长,我们将建立一个简单的 1 嵌入+ 1 LSTM 层+ 1 密集网络:
def create_model(max_sequence_len, total_words):
input_len = max_sequence_len - 1
model = Sequential()
# Add Input Embedding Layer
model.add(Embedding(total_words, 10, input_length=input_len))
# Add Hidden Layer 1 - LSTM Layer
model.add(LSTM(100))
model.add(Dropout(0.1))
# Add Output Layer
model.add(Dense(total_words, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')
return model
model = create_model(max_sequence_len, total_words)
model.summary()
首先,我们添加一个嵌入层。我们将它传递到一个有 100 个神经元的 LSTM 中,添加一个 dropout 来控制神经元的共同适应,最后得到一个致密层。请注意,我们在最后一层应用了 softmax 激活函数,以获得输出属于每个类的概率。使用的损失是分类交叉熵,因为它是一个多类分类问题。
该模式的总结是:
Model Summary
b .训练模型
我们现在(终于)准备好训练模型了!
model.fit(X, y, batch_size=256, epochs=100, verbose=True)
然后模型的训练将开始:
Epoch 1/10
164496/164496 [==============================] - 471s 3ms/step - loss: 7.0687
Epoch 2/10
73216/164496 [============>.................] - ETA: 5:12 - loss: 7.0513
在 CPU 上,一个历元大约需要 8 分钟。在 GPU 上(例如在 Colab 中),您应该修改所使用的 Keras LSTM 网络,因为它不能在 GPU 上使用。您可能需要这个:
# Modify Import
from keras.layers import Embedding, LSTM, Dense, Dropout, CuDNNLSTM
# In the Moddel
...
model.add(CuDNNLSTM(100))
...
我倾向于在几个步骤停止训练,以进行样本预测,并在给定几个交叉熵值的情况下控制模型的质量。
以下是我的观察:
3.生成序列
如果你已经读到这里,这就是你所期待的:生成新句子!为了生成句子,我们需要对输入文本应用相同的转换。我们将构建一个循环,针对给定的迭代次数生成下一个单词:
input_txt = "Machine"
for _ in range(10):
# Get tokens
token_list = tokenizer.texts_to_sequences([input_txt])[0] # Pad the sequence
token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre') # Predict the class
predicted = model.predict_classes(token_list, verbose=0)
output_word = ""
# Get the corresponding work
for word,index in tokenizer.word_index.items():
if index == predicted:
output_word = word
break
input_txt += " "+output_word
当损失在 3.1 左右时,下面是它使用“Google”作为输入生成的句子:
谷歌是世界范围内产生的大量数据
它实际上没有任何意义,但它成功地将谷歌与大量数据的概念联系起来。这令人印象深刻,因为它仅仅依赖于单词的共现,而没有整合任何语法概念。
🚀如果我们在训练中多等一会儿,让损失减少到 2.5,并给它输入“随机森林”:
Random Forest 是一个完全托管的分布式服务,旨在支持大量初创公司的愿景基础架构
同样,生成的内容没有意义,但语法结构相当正确。
该损失在大约 50 个时期后偏离,并且从未低于 2.5。
我认为我们在这里达到了开发方法的极限:
- 这个模型仍然非常简单
- 训练数据不像它应该的那样干净
- 并且数据量非常有限
也就是说,我发现结果非常有趣,例如,经过训练的模型可以很容易地部署在 Flask WebApp 上。
结论
我希望这篇文章有用。我试图说明语言生成的主要概念、挑战和限制。与我们在本文中讨论的方法相比,更大的网络和更好的数据无疑是改进的来源。如果您有任何问题或意见,请留下您的评论:)
来源:
- Kaggle 内核:https://www . ka ggle . com/Shiva MB/初学者指南-文本生成-使用-lstms
- 最初发布于此:https://mael fabien . github . io/project/NLP _ Gen/# generating-sequences
我训练了一个人工智能来模仿我自己的艺术风格。事情是这样的。
原文:https://towardsdatascience.com/i-trained-an-ai-to-imitate-my-own-art-style-this-is-what-happened-461785b9a15b?source=collection_archive---------8-----------------------
好吧,我们来谈谈人工智能。今天人工智能无处不在,如果你认为我们不需要另一篇人工智能文章,你可能是对的。但是在你关闭这个标签之前,请听我说完。这个不一样。
首先,我不是开发人员,也不是软件工程师。我没有创造另一个人工智能。我是一名拥有一点编码技能的设计师/数字艺术家。然而,我对所有的技术都充满热情。当我为一个大学项目研究人工智能时,我遇到了一些有趣的图像生成脚本。尤其有一个引起了我的注意:一种叫做神经风格转移(NST)的方法。
NST 所做的基本上是这样的:定义一个内容图像和一个或多个样式图像。然后,脚本试图将它从样式图像中学到的艺术风格转移到您的内容图像中,创建一些非常新的、可能非常狂野的东西。
当我得知此事时,我非常兴奋。不是我在网上看到的大多数生成的图片,我认为用梵高的《星夜》来设计你最新的自拍照有点无聊。而是这些东西创造的可能性。我以前从事过生成艺术,但 NST 似乎完全在另一个层面上。有一个问题我一直在想:
我能训练人工智能复制我自己的插图风格吗?
如我所说,我是一名数码艺术家。15 年来,我一直在做数字抽象艺术。大部分是个人的,有时是商业的。以下是我的一些作品(更多信息请访问我在 https://eightvisions.net 的作品集):
Example illustrations made during the last years.
所以我想回答这个问题。我一直在寻找自己做 NST 的方法,在 github 上找到了 Somshubra Majumdar 的神经风格转移 repo。我发现这个东西需要一个好的 NVIDIA GPU 和大量的计算能力,而我没有。幸运的是,有一些公司提供这些 GPU 的租金。我决定使用 Paperspace *,创建了一个 Ubuntu 虚拟机,并根据需要进行配置。
*附属链接! 如果你用这个链接在 Paperspace 上注册,你将获得 10 美元的信用,我将赚取一小笔佣金。感谢您的使用!
然后,好戏开始了。
在设置好脚本和所有东西之后,我做了一些初步测试,看看这是如何工作的。这个特定的 NST 脚本使用单一样式的图像,并以预定义的迭代次数运行。每一次迭代都将使最终的图像更清晰、更饱和,并使细节中的一些粗糙区域变得平滑。还有许多高级选项可以使用,如遮罩或多样式图像。
One of my first tests with a light-grey gradient
在做了一些测试后,我发现运行脚本超过 25-30 次迭代几乎没有意义,因为超过这个数目后,您只会看到微小的增强。尤其是当你用像我的插图这样非常抽象的东西来训练它的时候。我只是不需要在最后一张照片中有那么多清晰度。
让我们做一个字母表!
我一直在寻找一个有趣的用例,在我的实验中,我发现将这种东西应用到排版中会产生一些非常有趣的视觉效果,这是我以前从未见过的,也是我根本无法用手完成的:
Content image: lyrics from Muse-Algorithm // 2 style images, different iterations
这就是为什么我决定创造一个字母表。基本规则如下:
- 26 个字符(A-Z)
- 内容图片是黑白的,上面有一个无衬线字体的字母,不会对人工智能的“工作”产生太大的影响
- 每个字母被分配到一个独特的风格图像,这是我过去几年手工制作的插图之一(更准确地说,这是我的艺术作品的剪辑,展示了许多细节)。
- 人工智能的 20 次迭代
- 好奇会发生什么
The Letters (used as content images)
My handmade artworks (used as style images)
结果呢
现在,这是人工智能为我做的:
Letter A, generated by the AI
Letter B, generated by the AI
Letter C, generated by the AI
这里有一些 gif,展示了上述 20 次迭代的过程:
很有趣,对吧?
如果你想看到所有的信件,请查看我的文件夹中的完整项目:
结论
最后但同样重要的是,我想分享一些想法。
那么,人工智能真的能模仿我的艺术风格吗?
不,还没有。这些年来,我学到的不是一项技术或软件技能。这是一种对构图、色彩运用以及在一片混乱中创造和谐的感觉。我不认为今天的人工智能可以做到这一点。我不知道技术会把我们引向何方,所以也许有一天它会成为可能。
我个人喜欢人工智能生成的结果吗?
没错!这是对生成艺术的一种新的理解,它以一种我从未见过的方式在视觉上将元素融合在一起。它特别,与众不同,有时丑陋,有时美丽。你永远不知道你会从中得到什么。但是等一下,这又引出了另一个问题:
作为人类,我们甚至可以评判机器完成的艺术吗?
不知道。这是一个棘手的问题,你也许可以写一本关于这个主题的书。对于这个项目,我只是要求我的权利来判断它,因为我训练它对我自己的艺术风格。
最后,我想对 Somshubra Majumdar 及其团队表示衷心的感谢,感谢他们编写 NST 脚本并与全世界分享。当然还有在我做这个项目时支持我的人。
【2020 年 4 月更新:
一年后,很高兴看到这个项目仍然得到一些关注。非常感谢所有分享或给我发邮件的人。真的很高兴听到你所有的想法。
我还和 NST 一起做了另一个项目。有兴趣的话可以在这里找到:【https://eightvisions.net/work/the-essence-of-art/】。这个基本上是另一个实验,随机克隆 10 幅手工制作的插图。
感谢阅读!我是来自德国的产品设计师和数字艺术家。在 查看我的作品集,https://eightvisions.net或通过电子邮件向(michael@eightvisions.net 问好)或推特https://twitter.com/eightvisions
我用机器学习来预测一场终极飞盘锦标赛,它有点工作
原文:https://towardsdatascience.com/i-used-machine-learning-to-predict-an-ultimate-frisbee-tournament-and-it-kinda-worked-a39979eea022?source=collection_archive---------14-----------------------
Photo by Paul Rutherford of UltiPhotos.com
丹尼尔·沃尔顿拥有大气科学博士学位和数学硕士学位。他对统计和建模充满热情,是一名有抱负的数据科学家。你可以在 LinkedIn 上和他联系。他也是一名经验丰富的终极玩家,连续八次获得 USAU 俱乐部全国赛资格,最近一次是在西雅图 Mixtape。
挑战
我想,这只需要几个小时。著名的遗言…
Ultiworld.com,终极飞盘的主要新闻网站,刚刚发布了大学生国家队的种子。更重要的是,他们还公布了参加年度大学生国民幻想游戏的规则,该游戏名为#TheGame。总共选出五支队伍:女子组两支,男子组两支,两个组各一支。谁的五队组合在大学全国赛中得分最高,谁就获胜。等等,我们先退后一步。
终极到底是什么?
This is ultimate. (Photo by Paul Rutherford of UltiPhotos.com)
Yes, this is ultimate too. (Photo by Paul Rutherford of UltiPhotos.com)
No, this is not ultimate. This is actually Frisbee Dog.
极限飞盘或简称“极限”(也是出于商标原因)是两个七人小组之间的运动。球员通过完成传球将圆盘向前推进,并通过在端区接住传球得分。比赛通常进行到 15 分钟,两人获胜,尽管他们经常被时间限制缩短。
美国终极大学国民赛是大学赛季的终极锦标赛。这是一项为期四天的活动,其中包括女子组和男子组的 20 支最佳队伍。第一阶段是分组赛,参赛队伍被分成四组,每组五支队伍,与同组的其他队伍进行循环赛。
例如,以下是女子组的比赛:
Women’s division pools. (Overall seed is in parentheses.)
例如,在 B 组,俄亥俄州是头号种子队(B1),华盛顿是最低种子队(B5)。俄亥俄州将会在所有的桌球比赛中受到青睐,而华盛顿将会在所有的比赛中处于劣势。
获得小组前三名的球队将进入 12 支球队的淘汰赛,以确定全国冠军。以下是冠军等级:
关于支架的几点注意事项:
- 每个池中排名第一的选手有机会进入四分之一决赛
- 第二名和第三名必须参加四分之一决赛
好了,回到#TheGame。正如我所说的,一个参与者选择五个队:两个女子队,两个男子队,以及一个可以来自任何一个部门的队。其团队获得最多综合幻想点数的参与者赢得#TheGame。
梦幻积分是根据一个队的总胜场数(池赛和排位)乘以该队在池中的种子来计算的。这使得事情更加平衡,所以垫底的种子仍然可以通过扳回一些冷门来获得很多分。因此,如果你是俄勒冈州,A 组的五号种子选手,你赢得了两场比赛和一场比赛,你将赢得 3 胜× 5 分/胜= 15 分。
一个团队也可以获得奖励积分。成为泳池中的第一名值得 1 点奖励积分。赢得一场四分之一游戏可赢得 1 点奖励积分。赢得半决赛可获得 2 点奖励积分。赢得决赛可获得 3 点奖励积分。
如果北卡罗莱纳州(头号种子和最受欢迎的冠军)赢得了所有的台球比赛,并赢得了冠军,他们将获得 14 分。如果俄勒冈州,他们池中的 5 号种子,赢得了所有的桌球比赛和冠军,他们将获得 42 分。因此,较低的种子有较高的天花板,但不太可能前进。
因此,为了准确评估一支球队的梦幻价值,我们需要知道他们在锦标赛中赢得每场比赛的可能性有多大。
就像我说的,小菜一碟。比赛还有 7 天就要开始了,但我应该只需要几个小时就能编写一些 Python 代码,运行一些蒙特卡洛模拟,并计算出每个团队的虚拟积分的预计分布。
我错了。
模拟终极锦标赛
锦标赛的关键组成部分是游戏。如果我们可以模拟一场比赛以某个分数结束的可能性,那么我们就可以把锦标赛模拟成一系列的比赛。
这里有一些我们想要解释的关于终极游戏如何运作的事实:
- 各队随机决定哪个队开始进攻。该团队收到开球通知,称为“拉动”。
- 如果 A 队开始进攻并得了一分,那么另一队 B 队将开始进攻下一分。
- 如果 A 队在进攻上开始得分,没有得分,他们将继续在进攻上开始得分,直到得分。(外面的统计学家可能已经在想,“在第一次成功之前的一系列失败,这听起来像一个负二项式过程。”你说得对。]
以下是一些简化的假设:
- 当一个队得 15 分时,比赛就结束了。
- 没有时间限制,没有两分的胜算。
- 没有中场休息。
[注意:实现半场本来是很容易的。我应该这么做,因为这可能会在势均力敌的比赛中产生影响。明年!]
现在,有趣的部分。我是这样模拟游戏的:
当 a 队开始进攻时,我们通过投掷一枚有 P(正面) = pₐ 的加权硬币来模拟他们获胜。如果正面朝上,A 队得一分,B 队开始进攻下一分。如果出现反面,B 队得一分,A 队在下一分重新开始进攻。
当 b 队在进攻中开始得分时,我们抛第二枚不同重量的硬币,硬币上有 P(正面) = pᵦ ,看看 b 队是否在进攻中得分。
连续掷硬币是独立的(即团队不会受到之前分数的好/差结果的影响。)
从统计学上来说,我们的过程基本上是一系列负二项式过程,其中成功的概率取决于哪支球队开始进攻。
以下是一些常见问题:
问:为什么是两枚硬币?
答:有两个不同的硬币反映了这样一个事实,即当球队开始进攻时和开始防守时,他们通常会让不同的球员上场。A 队的进攻球员对阵 B 队的防守球员,和 B 队的进攻球员对阵 A 队的防守球员,是一场根本不同的对决。
问:这样的复杂性值得吗?
答:是的。我最初的模型,对所有的点投相同权重的硬币,产生了正确的平均分数,但是方差太大了(比游戏数据支持的更多的冷门)。
现在,要模拟 a 队和 b 队之间的博弈,我们需要知道两个概率, pₐ 和 pᵦ 。直觉上,它们应该取决于团队的相对实力。本质上,我调整了这两个参数,直到我根据实际比赛数据得到正确的预期分数和正确的冷门频率。
但是给定两个队,期望的得分和失误的频率是多少?
我来这里是为了机器学习,这有什么用?
很高兴你问了。我使用机器学习技术来模拟预期得分和冷门频率如何取决于两队的实力。但要做到这一点,我们需要实际的数据。[机器学习不是你的事?点击这里跳转到我的幻想精选。对我的代码感兴趣?都在 GitHub 上。]
为了收集数据,我用美声和熊猫浏览了 USAU 的网站。下面是我刮的代码。我搜集了所有 50 强球队比赛的 USAU 评分和比赛数据。游戏数据仅仅是每场比赛的结果(W/L)和分数。一个球队的实力等级是一个数值,根据他们的对手和比分来衡量他们的实力。大胜仗或者对抗好竞争的胜仗通常会增加一个团队的力量等级;巨大的损失或在劣势竞争中的损失通常会降低他们的额定功率。因此,力量等级评估了你的团队在所有比赛中的实力。
我抢了常规赛(2019 年 4 月 4 日)结束的收视率和季后赛,2019 年 4 月 4 日到 2019 年 5 月 23 日的比赛数据(叫分组赛和地区赛;他们在全国赛之前)。通过仅使用评级发布后的游戏数据,我们可以测试权力评级是否是对未来游戏的预测。(我们知道它们是过去游戏的反映,因为它们就是从那里产生的。)评估我们的建模框架的预测能力很重要,因为我们最终将应用相同的框架来预测全国赛将会发生什么。
Snapshot of USA Ultimate women’s power ratings from the end of the regular season (4/4/2019)
机器学习的本质。简而言之,我根据训练数据拟合模型;他们在测试数据上表现得相当好。这让我相信,我们的框架将有助于预测大学国民的比赛结果。下面是我的机器学习代码。
像任何优秀的数据科学家一样,我将我的数据分成训练集和测试集(对半分)。你们中的一些人可能会奇怪,为什么我在这么大的测试集中选择了拆分。答案是,在这个数据集中,扰动相对较少,我担心的是,如果我进行典型的 5 路或 10 路分割,我会得到根本没有扰动的测试集。
首先,我使用非线性回归将得分建模为两个团队之间功率等级差异的函数。实际上,具体来说,目标变量是调整后的胜利差额,这说明了在一些游戏中获胜者不会得到 15 分的事实。调整后的胜利差额的计算方法是,首先将一场比赛的分数标准化为 15,然后从最受欢迎者的分数中减去受欢迎者的分数。因此,如果最受欢迎的选手以 12-8 获胜,那么标准化得分将是 15-10,调整后的胜利差额将是+5。(如果处于劣势的一方以 12 比 8 获胜,那么调整后的胜率将是-5。)
所以,就像我说的,我用非线性回归来模拟胜率。我实际上使用了一个逻辑函数,因为它的形状和解释符合调整后的胜率分布。【注:这与逻辑回归不同,后者实际上是一种分类。后来,我使用逻辑回归,但对于赢/输的结果。]
Logistic curve fit to training data. Of the 229 games in the training data, there were 23 upsets (i.e. victory margin < 0).
为了预测游戏结果(高评级团队是赢还是输),我使用了逻辑回归,将功率评级差异作为预测变量。逻辑回归在这里是合适的,因为我们的数据有二元结果,我们希望能够预测这些结果的概率。
Logistic regression used to predict win probability of the higher-rated team based on rating difference.
好了,现在我们来拟合胜率和获胜概率的模型。但是,为什么我们又想知道预期的胜利差额和胜利概率呢?因为我们需要这些来限制概率 pₐ 和 pᵦ ,即每支球队开始进攻时各自得分的机会。基本上,胜利的差额告诉我们ₐ和 pᵦ的比例,而胜利的概率允许我们去拟合ₐ.
有趣的是,如果 a 队是最受欢迎的,那么期望分数大约是 15 比( pᵦ / pₐ ) 15。[我不会在这里讨论数学的细节,但是如果你愿意的话,可以在家里试一试。正是真的是e(b 队得分)/e(a 队得分) → pᵦ / pₐ,为胜分 → ∞。例如,如果 A 队得分占其进攻得分的 60 %, B 队得分占其进攻得分的 40%,那么预期得分大约为 15 到 10,因为 0.4/0.6 15 = 10。这允许我们将 pᵦ 表示为 pₐ 和调整后的胜利差额的函数:
pᵦ = pₐ (15 —可调胜利差额)/ 15
例如:如果两个队之间的预期胜利差距是 3,那么
pᵦ=pₐ(15–3)/15 =pₐ12/15 = 0.8pₐ。
现在,我们只需要约束 pₐ ,这可以通过获胜概率来实现。但是首先,让我们为 pₐ 开发一些直觉。高 pₐ 情景代表什么?让我们看一个极端的场景。如果 pₐ 真的很高(比如 1.0),那么 a 队每进攻一分就得分一分。如果他们先开始进攻,他们每次都会赢得比赛,即使 pᵦ 很高。因此, pₐ 的高值意味着非常少的扰乱。另一方面,假设ₐ相对较低(比如 0.1)。既然,a 队是热门,b 队是冷门,pᵦ<所以 pᵦ 也低。进攻得分的低概率意味着球队很可能会在防守连续得分的情况下长距离奔跑。如此长时间的跑步会导致更多的可变分数和更高的失误几率。所以,低的 pₐ值意味着更多的冷门。**
根据我从 Ultianalytics.com 得到的有限数据,pₐ对于精英团队来说似乎相当稳定,在 0.6-0.8 的范围内。如果它真的是常数,那将是非常了不起的。本质上,它会说,无论处于劣势的一方的技能如何,最受欢迎的一方都应该以同样的速度转化为进攻方。是真的吗?我的直觉告诉我,当被看好的一方比被看好的一方强得多时,这可能是不正确的。然而,它可能适用于全国赛,在全国赛中,球队之间的差距比其他比赛要小。尽管如此,我没有足够的数据来确定这种或那种方式。就我们的计算而言,它确实使事情变得简单多了。我有没有提到我快没时间了?至此,距离全国赛第一场比赛不到 24 小时。所以我做了一个简化的假设,pₐ不变。正如我们将看到的,我们得到的模型表现良好,所以这个假设并没有过度阻碍这个实验。
所以,我决定假设一个常数 pₐ ,但是它的值应该是多少呢?本质上,它是我们模型的超参数。我在参数空间中使用网格搜索来确定最佳值。根据培训数据,女性为 0.65;男性为 0.78。对这些价值观的解释是,男性最喜欢的发球比女性最喜欢的发球得分略高。因此,如果两个男队和两个女队在评分上相差相同的数量,那么我们预计男队比赛中的冷门会更少,而女队比赛中的冷门会更多。**
我使用测试集来评估模型。我将从测试数据推断出的获胜概率曲线与我的模型的获胜概率预测进行了比较。
Women’s test data (W/L; blue dots), win probability inferred from test data (blue line), and predicted win probability from my model based on training data (orange dots).
对于女性来说,预测的获胜概率(橙色点)和从测试数据中推断的获胜概率(蓝色线)之间的一致性相当好。均方根误差为 0.008。男性方面的协议较弱,均方根误差为 0.016。男性模型有一个明显的偏差,因为它低估了最受欢迎的人在测试中获胜的概率。
Men’s test data (blue dots), win probability inferred from test data (blue line), and predicted win probability from my model based on training data (orange dots).
误差似乎比预期的要低。这部分是因为大部分比赛是在极不匹配的队伍之间进行的。许多游戏都有超过 0.95 的获胜几率,所以即使模型没有完全正确,概率的差异也很小。尽管如此,即使对于不太确定的游戏,我们的模型预测的获胜概率在 0.1 以内。
此外,我不想对模型验证组件进行过多的讨论,因为现在全国赛已经举行了,我们可以直接测试模型的表现了!
但是,在我开始之前,让我们来谈谈如何做出梦幻般的选择。
幻想精选
模拟大学国民的目标是为幻想终极产生精选。但是让我们先看看单个游戏的结果是什么样的。这是一支球队在一场基于 1000 次模拟的比赛中击败男子队头号种子北卡罗来纳州的可能性。
Probability of upsetting North Carolina in the men’s division based on 1,000 simulations for each rating difference. Brown has a nearly 50/50 chance of beating North Carolina in a single game. Meanwhile, Northeastern would be expected to pull off the upset only 1 time in 10 games.
现在我们进入锦标赛本身。每支队伍晋级的可能性有多大?
回到女子组。
Chance of each team in the women’s division of reaching a given round.
我们的模拟显示北卡罗来纳州有 45%的胜算!两届卫冕冠军达特茅斯夺冠的几率只有 2%。达特茅斯今年成绩不佳,甚至不是他们的头号种子,但我想很多人仍然在他们身上下注。
去男队。
Chance of each team in the men’s division advancing to at least the given round.
模拟显示北卡罗来纳和布朗很有可能进入决赛,北卡罗来纳最有可能赢得所有比赛。正如我们将会看到的,模拟在很大程度上是正确的。
好吧,但这在幻想点数方面意味着什么?
让我们先检查一下时钟。我还剩多少时间?大学全国赛的第一场比赛在太平洋时间早上 6 点开始。这里是几点?太平洋时间凌晨 1 点。我只剩下 5 个小时了。
我一周的大部分时间都在睡觉,我几乎没有时间以完全数据驱动的方式做出选择。我会把我制作它们的方式描述为“主要是数据驱动的”。
以下是#TheGame 基于模拟大学国民 1000 次的幻想点数分布。[我知道统计学中的标准是 10,000 次模拟,但我还是没有时间。]
女子组:
Distribution of fantasy points in #TheGame for each women’s team. Columns are pools A-D.
在女性方面,北卡罗莱纳州有望获得最多的幻想得分(10.52),但它甚至没有接近。接下来是 UCSD 8.64,达特茅斯 8.63。也有一些有价值的中间种子,德州女子队(在他们的池中排名第三)预计将获得 7.79 分。我确保不选康奈尔(预期分数 0.26)。
现在是男子组:
Distribution of fantasy points in #TheGame for each men’s team. Columns are pools A-D.
最受欢迎的 UNC 和 Brown 都有望获得大量的幻想分数,分别为 9.56 和 9.17 分。然而,模拟显示了来自 2 种子俄勒冈州(9.14)和科罗拉多州(9.21),以及 3 种子威斯康星州(8.36)和华盛顿州(9.35)的一些优异值。
然而,我在思考中遇到了一个问题。如果我只是根据期望值来挑选,我会尽量提高我的平均得分。但是我真的会在比赛中赢吗?或者我会在大多数比赛中获得高分,但从来没有赢过?也许我需要一个不同的策略,一个试图最大化我成为顶级终结者的百分比机会的策略。如果#TheGame 中有大量条目,这一点尤其重要。如果选择了所有可能的组合,那么你必须选择最佳组合才能获胜。
所以,我重新定义了这个问题。我应该选择哪些团队,以便尽可能多地第一个完成?
此外,我意识到我不能独立挑选团队。一个团队的道路可能会受到另一个团队表现的影响。因此,它们的结果是交织在一起的。
所以,我想尽可能多地挑选出排名前对的队伍。
Percentage of the time that a given pair of women’s teams was the top pair.
基于这些信息,北卡罗来纳和达特茅斯最常成为最佳组合,超过 5%的几率。还有,呀。也就是说,即使我做出最佳选择,我也只有 5%的机会获胜!如果有成千上万的参赛者,这可能是非常好的。我想关键是结果有很大的随机性,没有一组球队能保证获胜。
这种分析也可以在三人一组的团队中进行。只是更难想象。结果表明,北卡罗莱纳州、达特茅斯和得克萨斯州是最常见的三甲(1.8%)。
我非常喜欢这首三重奏。它还列出了模型中没有的信息:达特茅斯队本赛季唯一的失利是在西北挑战赛上,由于受伤,他们失去了他们的顶级贡献者之一克莱尔·特罗普。另外,他们有血统,两次卫冕冠军。
所以我决定去北卡罗来纳、达特茅斯和德克萨斯。我对这个选择感觉很好,正如我们将看到的,它有起有落。
男人们来了:
Percentage of the time that a given pair of men’s teams was the top pair.
看了上面的图后,你可能会问我是否选择了北卡罗来纳和华盛顿,因为它们经常出现在最前面(6%的情况)。这是一个非常合理的选择。但是,当我到达这一点的时候,已经是凌晨 3:30 了,我很累,时间不多了。我没有听从模拟的建议,而是决定即兴发挥。
嗯,算是吧。在内心深处,我坚信北卡罗莱纳和布朗将会在决赛中相遇。我之前展示的进步概率支持了这个观点。此外,我选择 3 号种子德克萨斯是冒着风险的,我想减少我在男人方面的风险。为什么?嗯,我在女队获得前三名(1.8%)已经不太可能了,我不想在男队也获得 3 号种子华盛顿的好运。所以,我决定挑选两支大部分时间都能拿很多分的男队。
如果让我再做一次这个决定,我会用不同的方式来做。我会更容易接受风险。我会听从数据而不是回避。具体来说,我会查看五个团队的哪个组合是最常见的五元组。但是,我选择了北卡罗来纳大学和布朗大学,主要是因为这是我想要的。很抱歉,数据驱动决策,但我是必须忍受这些选择的人,而不是你。是的,当时很晚了,我正在和一个决策原则进行对话。
但是我也选择了北卡罗来纳大学和布朗大学,因为这个图表:
Chance that a men’s team scores more than x points in #TheGame.
注意北卡罗来纳(黑线)和布朗(褐线)对于大多数风险水平是最佳选择还是接近?当然,有一些球队有更高的最高分,但是如果我选择一个不同的球队,在大多数情况下,他们会比北卡罗来纳或布朗表现更差。
所以在凌晨 4 点左右,我提交了我的选择:
女子:北卡罗来纳,达特茅斯,德克萨斯
男子:北卡,布朗。
我做得怎么样?
既然锦标赛已经结束,幻想点数也已经计算出来,我们可以回顾一下,看看我的选择有多好,我的模型是否有用。
以下是锦标赛的结果:
女子组
Women’s pool play results.
在 A-C 组中,头号种子队在小组中获得第一名。在 D 组,2 号种子选手达特茅斯击败 1 号种子选手卡尔顿学院赢得比赛。加油达特茅斯!我的另一个团队德克萨斯队在 D 组中获得第四名,仅获得 3 分,未能晋级。悲哀。
Women’s bracket results.
加州大学圣迭戈分校在一场激动人心的决赛中以 12 比 11 击败达特茅斯。北卡表现不错,在半决赛中输给了达特茅斯。
男子组
Men’s pool play results. Top-seeded teams finished first in each pool.
Men’s bracket results.
我的队伍,北卡罗来纳和布朗,在决赛中相遇!然后,布朗以 14-8 击败卫冕冠军,将王冠带回家。
但是我的模拟准确吗?明星队平均以正确的比率和正确的数量获胜了吗?
胜利差额
这个模型在预测胜率方面表现如何?嗯,偏向是女队-0.51 球,男队+0.73 球。所以,在女队方面,失败者的表现比我预测的要好,而在男队方面,最受欢迎者的表现比我预测的要好。在两个分区中,实际拟合(虚线)与预测拟合(实线)非常吻合。
2019 Women’s College Nationals results with predicted and actual fits.
根据我们的模型,最令人惊讶的女子比赛(根据胜利差额)是 UCSD 在半决赛中以 15 比 5 击败俄亥俄州立大学,以及 Dartmouth 在台球比赛中以 15 比 5 击败 Carleton College。
2019 Men’s College Nationals results with predicted and actual fits.
根据我们的模型,最令人惊讶的男子比赛是维多利亚(5 号种子选手)以 14-9 的比分战胜匹兹堡(1 号种子选手)。由于在评分上落后 400 多分,维多利亚队击败匹兹堡队的可能性只有二十分之一。比胜利本身更令人印象深刻的是 5 个百分点的差距——它甚至没有接近!
获胜概率
男子组的冷门比预期的稍微多一点,而女子组的冷门恰到好处。
Win probabilities and actual game outcomes from 2019 College Nationals. A vertical stagger is added to help visually separate the men’s and women’s games.
我还可以用其他方法评估这个模型,包括使用对数损失函数。但是我选择了上面的方法,因为它们有一个相当清晰的解释:团队是否以正确的频率和正确的数量赢得了胜利?我认为答案基本上都是肯定的。
幻想分数
全国赛后几天就公布了梦幻得分。我一直在急切地等待结果。我的主要由数据驱动的方法真的会有回报吗?
让我们看看我的选择如何:
女性:
达特茅斯(决赛选手——耶!):16 分
北卡罗来纳大学(半决赛):7 分
德克萨斯(打完台球出去——哎哟!):3 分
男子:
布朗(冠军——耶!):14 分
UNC(决赛选手):10 分
总分:50 分
因此,布朗大学、北卡罗来纳大学男子分校和达特茅斯大学都超出了预期,但得克萨斯州和北卡罗来纳大学女子分校表现不佳,这很伤人。德克萨斯州只差一分就能击败威斯康星州,在 D 组中获得第三名,这将使我获得额外的 3 分,外加一个在这个组别中挣更多钱的机会。北卡罗来纳大学和达特茅斯大学在半决赛中相撞,因此,不幸的是,只有一个人能晋级。达特茅斯超出模型预期最多,获得 16 分(预期分:8.63)。布朗通过赢得他们所有的比赛和冠军,最大限度地提高了他们的分数,这很好。我很确定北卡罗来纳大学和布朗大学会成为男子组的决赛选手,他们确实是。总的来说,我肯定在桌面上留下了一些点,但感觉像是一个坚实的努力。
所以,最大的问题是。获胜的分数是多少?
获胜分数高达 64 分!获胜者选择:
UCSD (W 冠军):13 分
达特茅斯(西部决赛):16 分
布朗(男子冠军):14 分
北卡罗来纳州(男子决赛):10 分
科罗拉多州(男子半决赛):11 分
我有三个这样的团队!
胜利者的 64 分离最优组合(67 分:UCSD,达特茅斯,布朗,密歇根,威斯康星女)只差 3 分。这一证据支持了我的假设,即赢家必须拥有最优组合——或者接近最优组合。
我到底排在哪里?我排在第 70 位,在 696 名参赛者中并列第 200 名。
这是分布图的样子:
Distribution of score in #TheGame. My score of 50 was in the 70th percentile. Full results are here.
只剩下一场比赛了,很难评价我的选择策略是否正确。把过程和结果分开很重要。即使您根据模型预测选择了最有可能获胜的组合,该组合仍然只在大约 1%的情况下获胜。因此,使用模型可以帮助你做出明智的选择,但锦标赛的实际结果仍有很大的随机性。
总结想法
即使我的选择没有赢得#TheGame,我也觉得建模练习是成功的。全国赛的比赛分数和获胜概率很大程度上符合我的预测。
这个模型最显著的失败是低估了达特茅斯的优势。达特茅斯只有 10%的机会进入决赛,但他们有时看起来很有统治力,在通往决赛的路上击败了排名第 4 的卡尔顿、排名第 6 的西华盛顿和排名第 1 的北卡罗来纳大学。事实上,他们距离击败第二名 UCSD 并赢得冠军只有一分之差。与此同时,该模型给他们只有 2%的机会成为冠军。
模特怎么会错过这个?嗯,它没有考虑像风、血统(球队是否有在全国大赛中比赛的经验)和伤病这样的重要因素。该模型只有一个预测指标:额定功率。权力评级并没有抓住一个事实,即达特茅斯的五场常规赛失利发生在一个周末,他们失去了关键球员克莱尔·特罗普。这也不考虑他们的血统(两届卫冕冠军)。
明年,如果我加入其他预测因素,看看这个模型会有多大的改进将会很有趣。使用前几年的数据,系谱可以直接并入。纳入条件将涉及更困难的天气数据,主要是温度和风速。今年的全国赛在德克萨斯州举行,天气刮风而且非常热。我也可以考虑终极世界的权力排名,这是对团队质量更主观的衡量。
虽然其他预测可能是有用的,但这一分析的普遍成功证明了 USAU 功率等级的价值。它们是一个有用的预测器,可以预测一个队击败另一个队的机会。
#TheGame 的创造者正在考虑改变评分系统的可能性,这样头号种子队的价值就会降低,而更多不同的球队会被选中。有没有办法逆向工程我的模型,以确定更公平的乘数和奖金点?这可能是一个有趣的练习。
明年我肯定还会这么做。它是非常有趣的。
想看看我的代码吗? GitHub 上有。想聊终极,统计学,还是机器学习?你可以发邮件给我,地址是沃尔顿(at)加州大学洛杉矶分校(dot) edu 分校,在LinkedIn上联系我,或者在 Twitter 上关注我@ Daniel _ walton*。*
我没有被聘为数据科学家。所以我寻找关于谁的数据。
原文:https://towardsdatascience.com/i-wasnt-getting-hired-as-a-data-scientist-so-i-sought-data-on-who-is-c59afd7d56f5?source=collection_archive---------0-----------------------
我们可以看看数据科学家之前实际做了什么,而不是关注他们被认为需要的技能
Acquiring data about what I wanted to be. (Image by David S.A from Pixabay)
在我写这篇文章的时候,我的“走向数据科学”主页上的每一篇热门文章都在谈论应用或学习数据科学中的特定技能。每一个人。最重要的是宏观技能,如如何作为数据科学家与利益相关者合作和如何成为数据工程师,接下来是一系列非常具体的技能,包括关于批量梯度下降与随机梯度下降、多类文本分类、更快的 R-CNN 等等的技术入门。作为数据科学中“共享概念、想法和代码”的专用媒体平台,这种学习资源在数据科学追随者中获得很高的人气并不奇怪,他们可能正在浏览以数据为中心的项目和职业。但是对于一个新手来说,优先考虑什么是最重要的,很快就会变得令人生畏。一个人应该接受训练成为一名卡格勒大师吗?将神经网络应用于图像识别或自然语言处理?都不是?既然都是关于将模型投入生产,那么 Kubernetes 和学习部署模型怎么样?Hadoop 到底怎么了?
我的 LinkedIn 简介描述我是一名软件工程师和数据科学家。根据我的工作经历,前一半可能更准确,因为我只获得过数据科学方面的短期合同。在自愿放弃之前的医疗统计职业后,我开始对试图在我的工作地新加坡找到一份全职数据科学家的工作感到烦恼。我见过一些熟人,只有学士学位,却很容易获得职位,而我的医学统计学硕士学位和 Web 开发大会证书似乎没有给他们带来我希望的毁灭性打击(在康威维恩图中,三分之二的人是这样认为的)。我的耐心也随着一些“我如何得到某某角色”类型的网上泛滥的沾沾自喜的建议而变得越来越少,毕竟,只有 1 个样本。
我开始意识到,我已经将数据科学的实践与战略融合在一起,成为了它的一部分。令我惊讶的是,这些竟然不是一回事。像大多数新手一样,我从博客帖子、数据科学招聘信息的需求部分以及该领域人士的道听途说中收集信息。这些来源对技能的高度关注,更不用说数据科学家能够并且应该学习一大堆东西的 的 鞭挞和经常说教的语气了,讽刺的是,这可能会使初学者陷入一个追逐最新技能的永无止境的循环中,而最有效的策略可能是首先迅速获得一个与数据相关的职位,然后在工作中学习技能。
丹尼尔·卡内曼称之为成为可用性启发式受害者的一个例子。我认为我需要在早餐前掌握 10 项不可能的技能,因为这是我读到的关于数据科学家的样子,没有停下来考虑可能有成千上万的数据科学家已经被成功聘用,他们中的大多数(根据定义)不是超级明星。我需要的不是另一篇关于数据科学家所需的顶级技能的自鸣得意的文章,而是关于那些成功转型到数据科学的人的真实数据。他们之前在做什么?
我需要的是… 成功转型到数据科学的人的实际数据
关于数据科学家的数据
虽然有一些关于谁是数据科学家的公开的大规模调查,但我发现这些数据存在几个问题:
- 自选偏倚。因为这些调查隶属于某些类型的组织,并且完全是自愿的,所以在样本中,某一类回答者可能被过度代表。我看到了一个特别的问题,过度热情的 TensorFlow 实践者主导了 Kaggle 数据科学调查,这可能与数据科学在商业中的实际应用非常不同。
- 回答者偏差。由于完全出于自愿,并且对受访者没有任何反馈(你不会因为错误陈述自己而遭受任何后果),个人受访者可能更不愿意夸大他们的头衔或学历或其他类型的数据。
- 市场代表。我的主要动机是找出那些在我的目标市场(新加坡)中被成功聘用为数据科学家的人的资料。据我所知,调查数据中充斥着数据科学的追求者(主要是学生),而关于新加坡数据科学家的具体数据却很有限。
毫无疑问,LinkedIn 是我需要获取数据的地方。虽然可能仍然存在一些选择偏差(LinkedIn 的算法可能不会向我展示一个真正随机的数据科学家样本),但我认为它被求职者和招聘行业广泛采用,作为一种内置的检查,以最大限度地减少受访者的偏差,并确保其简介的真实性。可以说,LinkedIn 的个人资料受制于实际就业市场的压力。
此外,LinkedIn 允许我指定我希望在搜索查询中分析的资料的地理位置,如果需要的话,可以将其限制在新加坡。只有一个问题:获取数据本身。
刮数据:别说我没警告你
围绕抓取 LinkedIn 数据的合法性一直存在一些争议。虽然最近的先例确定这些信息是公开的,因此可以被任何人提取,但法律地位远未确定。无论如何,当你试图收集 LinkedIn 数据时,你会遇到几个障碍:
- 你将违反 LinkedIn 的用户协议。虽然这类合同的可执行性仍不明朗,但你有可能因违反服务条款而被暂停账户。
- LinkedIn 为你可以在免费层点击的个人资料数量设置了上限,你的小 selenium bot 会很快达到这个上限(特别是如果你花了很多时间只是调试 scraper)。
- LinkedIn 一直在悄悄地、频繁地改变他们的 HTML 标签,因此基于任何当前标签属性集的抓取具有相当短的保质期。
可以说,在标签被替换和代码过时之前,我编写的 scraper 在足够长的时间内仍然有用,可以获得相当大的数据集(1027 个 LinkedIn 个人资料)。(如果您想了解更多关于代码的信息,请随时联系我)。
使用搜索查询“数据科学家和新加坡”,我从 LinkedIn 的人员部分提取了尽可能多的个人资料。我认为真正相关的数据元素只有三个:当前职位(职位和雇主名称)教育(最近的机构和研究领域)和经历(职位、组织和以前角色的持续时间)。将自己限制在这三个要素上不仅节省了编写和调试 scraper 的时间,也是我试图将不遵守 LinkedIn 服务条款的潜在责任范围最小化。
在过滤掉数据科学有志者、学生和信息不足的个人资料后,我只剩下 869 份数据科学家个人资料。现在我可以开始提问了:目前受雇的数据科学家有哪些共同特征?
发现 1:大多数数据科学家都有研究生学位
从数据中最引人注目的发现是,大多数(73%)目前受雇的数据科学家不仅仅拥有学士学位,这一发现在其他地方也得到了证实。多数人(44%)拥有硕士学位,而博士学位的比例为 29%比 21%,高于学士学位。只有 6%的数据科学家将某种形式的 MOOC、训练营或非传统认证作为他们的主要资格。这表明,未来的雇主信任高级学位提供的信号,以满足数据科学家职位的复杂要求。它还摒弃了数据科学训练营或其他非传统认证项目足以替代此类学位的观念。
Most recent education qualification reported by a sample of data scientists from LinkedIn
发现 2:计算机科学和工程,但商业分析也占据了研究领域
计算机科学、数学和统计学以及工程学科构成了数据科学职业生涯的基石,这一共同概念在一定程度上得到了数据的证实。但是,还是有区别的。迄今为止,计算机科学超过了所有其他单一领域,占所有研究学科的 14%。工程是一个多样化的类别,包括化学、电气和电子以及所谓的知识工程等不同领域,累计占所学学科的 22%。数学和统计也以各种名义出现,包括应用数学、数学物理、统计和应用概率,但似乎分量较小,累计只占研究学科的 12%。在数据科学教育赌注中,一个令人惊讶的赢家是商业分析和其他分析领域,它们总共占学科的 15%。事实上,对于那些声称拥有硕士学位是最高学历的数据科学家来说,这是排名第一的领域。
其他排名靠前的领域还有物理 (3.5%)和信息技术 (2.2%)。出现的情况是,虽然计算和工程相关领域已经证明了成为数据科学家的持续相关性,但数学和统计学在某种程度上被更新的面向商业的分析领域(及其变体)所掩盖。然而,其他领域的一个非常长的尾巴代表了当前数据科学家所追求的学科的广泛多样性。
Top fields of study reported by a sample of data scientists from LinkedIn (tail distributions hidden). Percentages are out of fields of study across all levels
发现 3:目前受雇的数据科学家往往处于职业生涯中期
在这个样本中,数据科学家报告的工作经验的典型年数在4-6 年之间,取决于他们的最高资格水平。这似乎是显而易见的,但也许值得重复一遍的是,大多数数据科学家不是直接从他们英勇的 MOOC 征服中毕业的大学毕业生,这有时似乎是关于如何进入该领域的博客帖子给人的印象。与大多数其他空缺职位一样,填补该职位的一般人可能会是有经验的人。
另外一个有趣的事实是,报告非传统认证项目的数据科学家中没有一个是新聘人员,之前至少有一年的工作经验。
Cumulative years of work experience reported by a sample of data scientists from LinkedIn
调查结果 4:大多数数据科学家职位都是新的
证实上述发现的另一个数据点是,大多数数据科学家(76%)担任当前职位的时间不到 2 年,其中许多人(42%)任职时间不到 1 年。这表明,虽然大多数数据科学职位空缺都是相对较新的,但填补这些空缺的人已经在就业市场上呆了一段时间。
Years in current role reported by a sample of data scientists from LinkedIn. ‘0’ indicates 0–1 years (exclusive)
发现五:研究员、软件工程师、分析师还是数据科学实习生?很好。现有数据科学家?甚至更好。
找出数据科学家在他们当前职位之前正在做什么是我想要得到的核心见解。也许不出所料(考虑到样本中研究生学位持有者的优势),他们中的很大一部分(11%)报告说以前是科学家或研究人员(包括研究助理和研究员)。相当一部分人(11%)报告了某种形式的软件工程职位,包括开发人员和解决方案架构师。另一部分数据科学家以前是各种形式的分析师 (11%),包括数据分析师和系统分析师。有趣的是,实习生和培训生 (11%)也是成熟的数据科学家角色的一个可行的前身,他们通常采取数据科学或分析实习的形式。其他排名靠前的职位包括咨询 (5%)、各种管理职位(5%)和数据科学指导 (3%)。
值得注意的是,在尝试获得一个新的数据科学职位时,没有什么比已经是一名数据科学家更好的了。足足有 28%的样本报告数据科学家是以前的职位。此外,这种在职优势似乎还在增加,例如,29%的在职 1 年或不到 1 年的雇员报告他们以前的职位是数据科学家,相比之下,只有 12%的在职 3-4 年的雇员。
对我来说,值得注意的是,统计学家****和精算师处于现有数据科学家的最底层。
Most recently held position reported by a sample of data scientists from LinkedIn, grouped by years in current role. ‘0’ indicates 0–1 years (exclusive)
发现 6:一半的数据科学家来自非科技公司
虽然资金雄厚的成熟技术公司(如谷歌或亚马逊)往往在获得数据科学家职位的理想地点方面受到关注,但值得注意的是,该样本中近一半(49%)的数据科学家来自不直接创造技术产品的地方。这些往往是来自金融和保险** (11%)、咨询 (9%)、政府 (5%)、制造业 (5%)和学术界 (2.4%)的公司和机构。在技术类别中,代表性较好的行业包括交通 (8%,主要是由于新加坡的打车应用 Grab)企业 (8%,包括 IBM、SAP 和微软)电子商务 (5%)和金融 (5%)。在这里,我们看到了像星展银行这样招聘数据科学家的金融机构与像路孚特这样利用数据科学为这类机构创造技术产品的金融科技公司之间的区别。**
有一大类科技公司被我标为 AI ML T21(6.5%)。这包括像 DataRobot 这样拥有交付实际自动化机器学习产品记录的公司,也包括像 Amaris 这样的新公司。AI 。
如果非技术公司和技术公司的数据科学家之间的这种分裂与其他地方提出的A 型和 B 型数据科学家的特征完全一致,那就太方便了,因为它表明就业市场(至少在新加坡)在为这两种类型提供机会方面一直相当公平。然而,这将是一个有趣而有价值的假设来测试。
Category of employers reported by a sample of data scientists from LinkedIn
结论:这一切对我意味着什么?
如果你真的想获得一个数据科学家的职位,而不是通过阅读随机的博客帖子来烦恼你需要什么样的技能,那么了解一下到底是谁在这方面取得了成功可能会更有帮助。最常见的特征组合可能是拥有计算机科学、工程、数学或分析硕士或博士学位的人;在工业部门工作了大约 4-6 年的人;前世是研究员、软件工程师、分析师或数据科学实习生。然而,不要错误地认为这种组合构成了大多数数据科学家,因为它代表了概率的倍增(这些概率本身可能并不独立)。正如这篇文章和其他研究所指出的,数据科学家的背景极其多样化,比软件工程师等其他职位更加多样化。尽管如此,出现的情况是,某些个人资料确实更受青睐,人们对你简历“脱颖而出”程度的期望可能与简历偏离这些个人资料的程度成正比。
最后,我要指出的是,尽管数据没有提到从 MOOCs 和 bootcamps 等非传统认证中获得技能的必要性,但它确实暗示了一些关于它们的充足性的事情:它们显然不是。研究生学位是一个更好的数据科学就业前景指标。这并不是说获得这样的技能不重要;数据科学正在快速发展,许多最重要的算法和技术将不会被传统的学术大纲所涵盖。这只是表明,获得特定技能可能是为了满足一种需求,而不是满足你作为数据科学家的直接就业能力。****
无数关于数据科学的专业课程不断涌现,这些课程似乎旨在利用有志之士的不安全感,他们一次又一次地被告知,他们需要特定的技能组合来实现突破。了解谁实际上被聘为数据科学家的数据,给这种存在主义的考虑泼上了一盆冷水。
笔记
如果有任何理由对数据吹毛求疵,那就是怀疑样本的代表性。LinkedIn 只显示与你至少有三级关系的个人资料,这些个人资料可能已经通过非随机算法进行了排序(我的 scraper 按顺序提取了顶部的个人资料结果)。需要说明的是,我没有最佳连接,无法从目标市场获得真正随机的数据科学家样本(例如,我的网络中没有足够的集线器节点)。从其他 LinkedIn 账户获取更多个人资料,并进行敏感性分析,会让这个问题变得更加明朗。
这篇文章中的所有可视化内容(以及更多内容)都被放在一个名为“谁是新加坡的数据科学家”的生动故事中?”。如果你对数据或代码有任何实质性的问题,请考虑这篇文章的回复部分,或者写一封电子邮件发给 hanif.samad.sg@gmail.com。
【https://github.com/claussian/Li-Scraper】2020 年 10 月 11 日更新:用于抓取 LinkedIn 的代码现在可以在以下资源库中找到:
Also on KDnuggets.
And mentioned on Hacker News.
我希望当我第一次开始从事数据科学时,我能读到这本书
原文:https://towardsdatascience.com/i-wish-i-read-this-book-when-i-first-started-out-in-data-science-a47196329cec?source=collection_archive---------15-----------------------
这可以让我避免大量的错误,让我的学习之旅更加有效
在挖掘我所知道和信任的令人敬畏的资源之前,有一个重要的披露:
下面的一些链接是附属链接,这意味着如果你选择购买,我将赚取佣金。这项佣金不会增加你的额外费用。请理解,我对所有这些资源都有经验,我推荐它们是因为它们有帮助和有用,而不是因为如果你决定买东西,我会给你一些小佣金。请不要在这些资源上花钱,除非你觉得你需要它们或者它们会帮助你实现你的目标。
好了,现在我们有了完整的披露。让我们直入主题吧。
如果你读过我的文章— 如何进入数据科学?,特别是在我为初学者推荐了一系列书籍以开始他们的数据科学之旅的部分,这本书— 自信的数据技能 还不在列表中,因为我在写作时还没有读过这本书,直到现在才读。
老实说,我通过反复试验学到了本书中提到的技能——基本上是错误和艰难的教训——我最终记录了我在实际工作经验中从数据科学中学到的 5 条经验。
不要误解我。
我并不是说在你的旅程中从错误中学习不是一个好方法。
这是一个好方法,但也许不是最好的方法。
我想说的是从导师那里学习——那些已经成功并经历过你现在所处的道路的人——更有效,并且能够通过站在他们的肩膀上并从他们的经验中学习来大大缩短你的学习时间。
是的,找到可以帮助你在数据科学领域的职业道路的导师,无论是人、书、课程、网络研讨会还是辅导计划。
最近,我有机会阅读了这本书——自信的数据技能 ,作者是基里尔·叶列缅科—超级数据科学的创始人和主管,也是 Udemy 上一些顶级数据科学课程的讲师。
也许你是一名雄心勃勃的数据科学家,刚刚起步,想要从最好的资源中学习。
也许你已经是一名分析专家,想要让你的职业生涯更上一层楼。
或者你可能只是好奇在这个数据被视为另一种新石油的数字时代,数据能做什么。
我希望通过分享我对这个资源的想法,能让你对现在和将来如何提高数据科学技能有一个更清晰的方向。
我们开始吧!
为什么选择这本书——自信的数据技能?
(Source)
好吧,我要告诉你一些事情——这本书没有代码。
是的,零代码。
这不仅仅是另一本技术书籍,它用大量的数学和代码淹没了你,却很少解释幕后发生的事情。
事实上,这本书旨在引导你一步步了解从项目开始到结束的完整数据科学工作流程:
- 确定问题
- 数据准备(数据清理)
- 数据分析(数据探索、机器学习模型等。)
- 数据可视化
- 展示你的发现
因此,如果你一直想知道数据科学家每天都在做什么,现在你会有更好的理解。
我记得当我刚开始从事数据科学时,我只关注第三和第四步。剩下的我就跳过了。
我不知道前两步——确定问题和数据准备是工作流程中最重要的步骤。
我为此付出了巨大的代价——这是我从艰难的道路和时间中学到的最大的教训。
我很高兴这本书确实指出了大多数有抱负的数据科学家或想进入这一领域的人经常忘记或忽视的显而易见的问题。
不仅如此,您还将看到顶级科技公司的一些数据使用案例,以及这些案例如何影响我们作为消费者的生活,从而向您展示数据的普及性和重要性。
最后的想法
(Source)
感谢您的阅读。
归根结底,数据科学是一个涵盖不同学科的广阔领域。
承认吧。在数据科学领域找工作很难。
但这绝对是可能的,前提是你走在正确的道路上,并从正确的资源中学习。
我希望通过分享我对这本书的想法,能够给你一个更清晰的方向,告诉你如何提高你的数据科学技能,无论是现在还是将来。
如果你觉得这本书对你有帮助,请在下面的评论中告诉我!
一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄
关于作者
阿德蒙德·李 目前是东南亚排名第一的商业银行 API 平台 Staq — 的联合创始人/首席技术官。
想要获得免费的每周数据科学和创业见解吗?
你可以在 LinkedIn 、 Medium 、 Twitter 、脸书上和他联系。
[## 阿德蒙德·李
让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。
www.admondlee.com](https://www.admondlee.com/)
我艰难地结束了我的 Spotify 历史。
原文:https://towardsdatascience.com/i-wrapped-my-spotify-history-the-hard-way-93dc832d9b47?source=collection_archive---------12-----------------------
用 Go 和 PostgreSQL 分析一年的流。
到目前为止,各地的 Spotify 用户已经获得了他们的 2019 年包装结果。我对自己的经历并不感到惊讶,部分原因是我知道自己花了很多时间在一支 90 年代即将回归的乐队的音乐中锻炼,还因为我最近使用了 Spotify 的隐私数据下载来直接查看我过去一年的历史,Spotify 保留了所有细节。
从 Spotify 获取我的播放历史
它始于在https://www.spotify.com/ca-en/account/privacy/的一个请求,在那里(靠近底部),Spotify 用户可以请求下载,包括“你的播放列表副本、搜索、过去一年的流媒体历史、你的库中保存的项目列表、你的粉丝数量、你关注的其他用户和艺术家的数量和姓名,以及你的付费和订阅数据。”
那似乎是很多!网站上说最多需要 30 天(按照 GDPR 的要求),但是根据我的经验(两次请求),收到一封包含链接的邮件需要三四天。该链接指向一个可使用两周的 zip 文件。解压存档文件时,我找到了这些文件:
$ ls -s
total 4428
4 CarThing.json 16 SearchQueries.json
4 FamilyPlan.json 1404 StreamingHistory0.json
4 Follow.json 1412 StreamingHistory1.json
0 KidsAccount.json 980 StreamingHistory2.json
4 Payments.json 4 Userdata.json
92 Playlist1.json 160 YourLibrary.json
344 'Read Me First.pdf'
关于 Spotify 如何使用它的详细信息在 Spotify 的隐私中心中,但是文件名大部分是不言自明的。你会看到信用卡的详细信息被屏蔽了,我们没有得到任何我们关注的帐户的身份,但如果你想知道你的收听历史,它都在这里!查看名为StreamingHistory[0-2].json
的文件,我发现每个文件有多达 10,000 条记录,每条记录描述了一个流媒体播放,包括其时间和持续时间。比如 2018 年 11 月 22 日,我正在怀旧地听 Rush :
{
"endTime" : "2018-11-22 20:57",
"artistName" : "Rush",
"trackName" : "Subdivisions",
"msPlayed" : 334722
},
部分播放包括在内,流可能短至 0 毫秒,我猜这相当于快速跳过播放列表。
你可能会惊讶地发现(就像我一样),这不包括艺术家和歌曲的 Spotify URIs。例如,分部的 Spotify URI 是spotify:track:0Z0s6dw0zw2ENU1gVjlLV6
,而 Rush 的 URI 是spotify:artist:2Hkut4rAAyrQxRdof7FVJq
。但这可能只是意味着这些数据更多的是给人类使用,而不是给机器使用。
我决定用 Go 来分析我的流历史,并从编写一些代码来读取我的一个流历史文件的内容开始:
package mainimport (
“encoding/json”
“fmt”
“io/ioutil”
)type Play struct {
EndTime string `json:”endTime”`
ArtistName string `json:”artistTime”`
TrackName string `json:”trackName”`
MSPlayed int32 `json:”msPlayed”`
}func main() {
b, err := ioutil.ReadFile(“StreamingHistory0.json”)
if err != nil {
panic(err)
}
fmt.Printf(“%d\n”, len(b))
var plays []Play
json.Unmarshal(b, &plays)
fmt.Printf(“%d\n”, len(plays))
}
将我的游戏历史加载到 PostgreSQL
我可以直接在 Go 中完成剩下的工作,但是因为我也想温习一下 PostgreSQL,所以我决定将这些记录加载到本地数据库中,用 SQL 对它们进行分析。
因为我已经在我的桌面 Ubuntu 机器上安装了 PostgreSQL(这里的指令是),所以我的第一步是为数据设计一个模式。我决定将它正常化,将艺术家、曲目和流式播放分离到单独的表中。
CREATE TABLE artists (
id SERIAL PRIMARY KEY,
name TEXT UNIQUE NOT NULL
);CREATE TABLE tracks (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
artist_id INTEGER NOT NULL REFERENCES artists (id)
);CREATE TABLE streaming_plays (
id SERIAL PRIMARY KEY,
end_time TIMESTAMPTZ NOT NULL,
ms_played INTEGER NOT NULL,
track_id INTEGER NOT NULL REFERENCES tracks (id)
);
我将它放在一个文件中,并从命令行直接加载到 PostgreSQL 中(首先用createdb playtime
创建了playtime
数据库之后):
psql -U postgres -d playtime -a -f schema.sql
接下来,我需要一种将数据从 Go 加载到 PostgreSQL 的方法。在浏览各种选项时,我发现了 gnorm 和 postgres-go ,它们直接从数据库模式生成 go 支持代码。 postgres-go repo 包含了 gnorm 使用的模板,并做了一些假设,让我回去修改我的数据库模式。来自自述:
这些模板假设了一些事情——如果一个列有一个默认的主键,我们将在插入时忽略这个主键,让数据库生成这个键(例如,一个 uuid 或自动递增的整数)。这避免了 Go 代码的零值是有效值的问题,因此您忘记了设置 id,它被插入 ID == 0(这通常是错误的)。
其他假设—名为 updated_at 和 created_at 的列被假设为由数据库生成,因此永远不会手动插入或更新,并且在插入时使用 Postgres 的 RETURNING 语句返回(连同 id)。
下面是我完全修改过的数据库模式:
CREATE OR REPLACE FUNCTION trigger_set_timestamp ()
RETURNS TRIGGER
AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$
LANGUAGE plpgsql;DROP TABLE IF EXISTS streaming_plays;
DROP TABLE IF EXISTS tracks;
DROP TABLE IF EXISTS artists;CREATE TABLE artists (
id SERIAL PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);CREATE TABLE tracks (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
artist_id INTEGER NOT NULL REFERENCES artists (id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);CREATE TABLE streaming_plays (
id SERIAL PRIMARY KEY,
end_time TIMESTAMPTZ NOT NULL,
ms_played INTEGER NOT NULL,
track_id INTEGER NOT NULL REFERENCES tracks (id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);CREATE TRIGGER set_timestamp
BEFORE UPDATE ON artists
FOR EACH ROW
EXECUTE PROCEDURE trigger_set_timestamp ();CREATE TRIGGER set_timestamp
BEFORE UPDATE ON tracks
FOR EACH ROW
EXECUTE PROCEDURE trigger_set_timestamp ();CREATE TRIGGER set_timestamp
BEFORE UPDATE ON streaming_plays
FOR EACH ROW
EXECUTE PROCEDURE trigger_set_timestamp ();
有了这个加载到我的数据库中,我就能够用gnorm gen
生成支持代码,并扩展我的 Go 程序来循环遍历我的播放历史,并为列出的艺术家、曲目和播放创建条目。下面是我最后一个main.go
的要点。
用 SQL 分析我的游戏历史
将我的历史加载到 PostgreSQL 后,生成我的“包装”列表只需要运行正确的 SQL 命令。这里有一个返回我播放时间最长的十首歌曲:
SELECT sum(ms_played)/(60*60*1000.0), artists.name, tracks.name
FROM streaming_plays,tracks,artists
WHERE track_id = tracks.id
AND artist_id = artists.id
GROUP BY tracks.name, artists.name
ORDER BY sum(ms_played) DESC LIMIT 10
用psql -U postgres -d playtime -a -f toptracks.sql
运行它产生了下表:
?column? | name | name
--------------------+--------------------------+--------------------
4.6896372222222222 | Rage Against The Machine | Killing In The Name
3.6687563888888889 | Rage Against The Machine | Wake Up
3.5106108333333333 | Dave Grohl | Play
3.4357252777777778 | Rage Against The Machine | Renegades Of Funk
3.0494194444444444 | Rage Against The Machine | Know Your Enemy
2.8526719444444444 | Rage Against The Machine | Bombtrack
2.5247416666666667 | Rage Against The Machine | Bulls On Parade
2.4658491666666667 | Gwen Stefani | Harajuku Girls
2.4145450000000000 | Rage Against The Machine | Take The Power Back
2.3744705555555556 | Jessie Ware | Alone
(如前所述,今年我和 RATM 一起跑了很多次!)下面是一个查询,它返回了我的前十位艺术家:
SELECT sum(ms_played)/(60*60*1000), artists.name
FROM streaming_plays,tracks,artists
WHERE track_id = tracks.id
AND tracks.artist_id = artists.id
GROUP BY artists.name
ORDER BY sum(ms_played) DESC LIMIT 10?column? | name
----------+--------------------------
54 | Rage Against The Machine
31 | AC/DC
18 | Foo Fighters
15 | Hole
15 | Britney Spears
13 | Cibo Matto
13 | Nine Inch Nails
12 | Beastie Boys
11 | Rush
10 | Weezer
我还没有进一步探索,但可以想象按月、按一周中的某一天、或按一天中的某个时间来排列我的热门曲目(“热门锻炼曲目”、“热门早间音乐”等)。
使用 Hasura 探索我与 GraphQL 的历史
2018 年宣布, Hasura 为 PostgreSQL 数据库创建 GraphQL 接口。稍微阅读了一下,我发现我可以在 Docker 容器中运行 Hasura,并将其附加到我的本地数据库:
#!/bin/bash
docker run -d --net=host \
-e HASURA_GRAPHQL_DATABASE_URL=postgres://postgres:test@localhost:5432/playtime \
-e HASURA_GRAPHQL_ENABLE_CONSOLE=true \
hasura/graphql-engine:v1.0.0-rc.1
这给了我一个本地控制台,我可以用它来研究我的数据库,只需几次点击,我就可以接受 Hakura 的缺省值,并将我的键关系转换成一个丰富的 GraphQL 模式。这是一个 GraphQL 查询,查询的是歌手的歌曲:
这里有一个查询,显示每次我流纸浆的普通人:
从 Spotify API 获取摘要和更多内容
有了 Spotify APIs,可以实时获得更多信息。这里有一个很好的教程,描述了如何使用 React 和 Node 查看您的实时 Spotify 历史。它使用 Spotify Web API 来获取当前用户最近播放的曲目。其他 API 函数包括 one to 获取用户的顶级艺术家和曲目和方法获取关于用户当前回放的信息和开始/恢复用户的回放。有人想建一个共享点唱机吗?
我写了一个程序,说得像海峡时报论坛的集体智慧
原文:https://towardsdatascience.com/i-wrote-a-program-that-speaks-like-the-collective-hive-mind-of-the-straits-times-forum-41c96e7d8d71?source=collection_archive---------17-----------------------
新加坡主要报纸之一《海峡时报》的论坛版块是国家财富。论坛部分专门为干瘪而热情的新加坡人提供一个平台,分享他们对新加坡文化和社会的看法。
Photo by Elijah O'Donnell on Unsplash
在众多开创性的作品中,有“在火车上缝纫不安全”——其中一位关心此事的市民呼吁对火车上的缝纫进行严格监管,因为有人在公共交通工具上缝纫可能会对其他乘客造成身体伤害。如果有人被刺穿眼睛怎么办?他们如何寻求帮助?
还有我个人最喜欢的,“ 武吉提马带学校培养精英学生 ”,热情地呼吁学生不要在星巴克浪费宝贵的钱,这样论坛信作者就可以牺牲她少得多的钱来买完全一样的饮料。
我发现我不能一天不在海峡时报论坛上搜罗现代新加坡完全缺乏的传统智慧。
因此,我决定创建海峡时报论坛信件生成器(STFLG ),不断告诉我需要做些什么,才能让新加坡社会不至于分崩离析。
如果你想试一试,可以在这里找到: 海峡时报论坛信函生成器 。我将在下一节解释 STFLG 使用的算法——跳到最后,看一些我最喜欢的 STFLG 制作的作品。
在碧昂斯的帮助下解释马尔可夫链
STFLG 的目标是创建一篇文章——本质上是一堆文本——采用海峡时报论坛版块的风格。
我为 STFLG 选择的底层算法是马尔可夫链,这是一种在手机上预测下一个单词和预测股票价格的常用技术。或者在其他令人捧腹的应用程序中,如Trump tweet generator——它与 STFLG 真的没有太大区别。
无论如何,马尔可夫链是一个非常简单的算法,但经常被不必要的复杂数学符号所掩盖。让我试着用 的一句歌词来解释马尔可夫链,这首歌词来自碧昂斯** 的《热恋中的 T4》:
哦哦哦哦哦哦哦不不
假设我们要创作一首和热恋风格相同的歌词。我们的算法必须做两件事:(1)学习歌曲的风格,以及(2)生成具有该风格的歌词。
请记住,我们的目标不是精确地复制歌词,而是创作一首本质上相似的新歌词。
具体地说,(1)可以通过研究一个语料库(文本主体)并计算一个单词出现的概率来实现,假设已经选择了另一个单词。
这听起来像抽象的天书,所以让我们看一个具体的例子。
在上面的歌词中,我们知道“哦”100%都是在“嗯”之后。我们还知道,50%的情况下“哦”在“不”之后,25%的情况下“哦”在“哦”之后。鉴于这些概率,我们可以说:
如果当前单词是:
“呃”,下一个词是“哦”——100%* “哦”,下一个词是“呃”——50%,“哦”——25%,“不”—— "<结束>"—50%的时间分别为 " <开始>",接下来的话就是“呃”—的时间***
我们刚刚创建了我们的马尔可夫链!
现在让我们执行步骤(2):使用我们的马尔可夫链生成一个新的歌词。
先从“ <开始> ”开始,掷骰子挑下一个字。既然“ <开始> 之后的下一个词是“呃”100%的时候,我们选择“呃”。现在我们掷骰子来选择下一个单词。在“呃”之后的下一个词是“哦”一个 100%的时候也是,所以我们挑“哦”。****
我们现在有:
呃哦”
这就是有趣的地方。
假设我们有“哦”这个词,我们的下一个词可能是“呃”、“不”或“哦”。假设我们在这一时刻掷骰子,这个词恰好是“哦”。但是如果我们重新做整个过程,选择的单词可能是“不”或者“呃”。因此,我们可以:
"
嗯哦嗯……— 50%的时间
" <开始>嗯哦……—25%的时间 " <开始>嗯哦不…"—时间的 25%**
如果我们有三个词,现在有三种不同的可能结果,当我们有四个词时,我们可以有六种结果:
“
嗯哦嗯哦”—— 50%的时间 “<开始>嗯哦哦嗯”——12.5%的时间 “<开始>嗯哦哦哦”——6.25%** >呃哦不不”——12.5%的时间 <开始>呃哦不<结束>————的时间**
经过一些# quickmaths 之后,我们得到了原来的歌词:
呃哦呃哦呃哦哦不不不 0.78125%的时间——
Skrrat, skidi-kat-kat. Boom.
然而,我们得到的是相似但不完全相同的歌词(不同之处用粗体突出显示):
"
呃哦呃哦呃哦 呃哦不不不<结束>"—0.78125%时间 " <开始>呃哦哦哦哦哦不不不不不<结束>—0**
Skidiki-pap-pap 和一个 pu-pu-pudrrrrr-boom。
Skya,嘟-嘟-库-库-敦-敦。
#快速数学。
抱歉,我走神了。
有趣的是,在语料库中只有一个歌词的这个玩具示例中,生成原始歌词的概率是 0.78125%,但是生成上述 3 个相似歌词中的任何一个的概率要高得多(4.3%)。**
因此,随着马尔可夫链的增长,生成的歌词不太可能与原始歌词完全相同,但很可能是相似的。
这就是马尔可夫链背后的直觉。
改进我们的算法:二阶马尔可夫链
上述算法被称为一阶马尔可夫链;它在大多数情况下工作正常,但在某些情况下会出现故障。**
考虑下面的例子。我们生成了三个词,“我吃了一个”。一阶马尔可夫链试图找到下一个单词。然而,它有五个选项可供选择——并非所有选项对人类读者都有意义。**
一阶马尔可夫链 当前词:“一个”
下一个词:“鸭子、窗户、长颈鹿、微风、胡萝卜”****
但是该算法选择“窗口的可能性与选择“鸭子”的可能性一样大。我不知道你怎么想,但我不认为自己是窗户的行家。**
这是一阶马尔可夫链出错的地方。我们可以通过使用二阶马尔可夫链来改进生成器。除了一个关键细节之外,二阶马尔可夫链类似于上述一阶马尔可夫链。**
二阶马尔可夫链不是基于前一个单词是什么来选择下一个单词,而是基于前两个单词是什么来选择下一个单词。
考虑下面的例子:
二阶马尔可夫链 当前两个字:吃了一个下一个字:鸭子,胡萝卜****
二阶马尔可夫链比一阶马尔可夫链更有可能产生可信的文章,因为它们有更多的“历史背景”。
人们可以想象实现更高阶的马尔可夫链来提高生成器的预测能力。对于股票价格或蛋白质折叠预测的应用来说,情况确实如此,人们希望预测尽可能准确。但在我们的情况下,我们只是想要可信的东西,而不是现有的海峡时报论坛信件的精确副本。
结果
我非常努力地研究了数以千计的《海峡时报》论坛信件,并能够创建一个二阶马尔可夫链来捕捉论坛信件的“风格”。然后我用上面提到的二阶马尔可夫链生成了自己的文章——你可以在这里摆弄一下:【海峡时报论坛信函生成器】 。
这里有一些我最喜欢的由 STFLG 生成的文章。我真的认为其中一些是诗歌。
免责声明:这些文章中没有一篇反映我的任何观点…或者任何人的观点。
一起张贴作品。
在病房里,如果你是一个强加了严格的行为准则和水印的和平在许多政府拨款和给予应有的重视,我们的环境立即,但没有被授予,也许更多的室外座位提供给企图自杀的人;9 月 9 日)。这可以说是最有效的生活方式,却是不合理的。
而我们大多数人需要使用泰瑟枪来抑制暴力或挥舞武器的对象。
而不是嫉妒部长们的高薪。
学校,需要尊重和要求表面空间。
例如,夕阳产业。我希望所有人都能买得起小贩的食物。
学校里不超过 400 个 SCC
而投资于国家反馈单位——保证获得负担得起的、高质量的商品和抗击抑郁症的人被贴上“被宠坏”或“虚弱”的标签。
或许去新加坡休息。
有账户,ATM 卡可以保障和便利但不拥有汽车。
它们帮助新加坡人理解纳税人进入公众视野的主要驱动力。
上个月提供的估计支出是因为领导人也是自然资源极其匮乏的人,以确保这些机构在不解决固有问题的情况下继续增加土地销售计划,同时通过一个银行账户抑制市场情绪,使外籍家政工人能够获得社会援助,以帮助少数在劳动力市场表现良好的新加坡人获得社会援助。
我们为获得这一最高荣誉而自豪。
一周信#1:新加坡应柔佛要求对马来西亚作出对等回应;1 月 6 日)。
我也想知道有多少允许我们回到马车上,发现这意味着针对特定群体的国家发展。
保护区,改善乌宾岛的生活社区,这使得乌宾岛正在组织“尽情吃”榴莲马来西亚之旅。
因此我们应该收养。
最近的网络攻击,我意识到这将是勇敢和强大的公司治理,往往以技术为基础。
社会和家庭发展部
狮子缺少罢工者
新加坡最大的资源就是实力。
我已经看到这些如何一直使用国内生产总值(GDP)和人均 GDP 公用事业使用率更客观地更好地了解过去的有效性和通过短信发送的约会提醒。
我们相信,一个分裂的东盟将会对一些他们没有停止的事情作出回应,比如最近的 SNEC 事件,它会定期指控是否基于他们的食品避税。
一点一点地,我们都可以读到我投票选出的最佳新兵的照片——很少有人会不同意 Seah Yam Meng 先生的信(在 PMD 的舒适环境下对我们的湿货市场进行机场般的检查,彻底管理乱停车)。
外卖食品
这是你的另一个有趣而无聊的项目,主要是因为我卧病在床。哦,软件工程师做的事情是为了娱乐/而不是恢复。
以下是我的建议:
- 我惊讶于实现我自己的二阶马尔可夫链是如此容易。
- 一两年后,我可能会后悔制作了一个模仿《海峡时报》论坛集体思维的节目。
如果你喜欢这个,一定要看看我的其他作品,比如我做的一个关于 机器学习鸡米分类器 的作品。
IBM 和加多图像演示人工智能模型发布任务原型
原文:https://towardsdatascience.com/ibm-and-gado-images-to-demonstrate-ai-model-release-assignment-prototype-17f33345a23c?source=collection_archive---------27-----------------------
系统自动检测图像中可能需要模型发布表单的人
New system identifies people who may need a model release form, even if their faces are obscured. Here, the system distinguishes a person from another object (a car). Underlying photo credit Gado Images.
视觉人工智能可以做一些不可思议的事情。2019 年,使用来自多家供应商的现成人工智能和机器学习解决方案,媒体许可方可以自动标记海量图像库,在图像中找到地标或标志,甚至可以获得全文字幕,看起来像是由一个人写的。光学字符识别(OCR)可以从图像中提取文本,即使是手写的,或者是一些微小的视觉元素,如路标,并自动将其翻译成 100 多种语言。
考虑到人工智能仅在几年前所处的位置,这些现成的能力是非凡的。对于许多用户来说,预先训练的模型和现成的解决方案为他们的应用提供了足够多的智能,而且通常成本很低。但是,如果您的解决方案更复杂,并且特定于媒体许可行业,该怎么办呢?
将模型发布形式分配给图像是当今许可行业面临的一个特别具有挑战性的问题。对于用于商业目的的图像(如在广告或政治活动中),图像中任何可识别的人都必须签署一份授权使用其肖像的发布表格。当投稿人向媒体许可方上传新图像时,许可方需要确定该图像是否包含可识别的人,以及这些人是否签署了发布表格。
起初,在图像中寻找人似乎是一项简单的人工智能任务。但是,看看任何主要的图像库,复杂性立刻就清楚了。如果一个人背对着镜头呢?如果他们戴着口罩,或者使用某种设备来部分遮挡他们的脸,比如呼吸器或外科口罩,会怎么样?如果图像使用了像运动模糊或选择性聚焦这样的创造性技术,一些人脸模糊或扭曲了怎么办?所有这些因素使得识别图像中的人,从而分配适当的释放形式,比它最初出现时更具挑战性的人工智能问题。
考虑到分配模型发布的复杂性(以及出错时可能承担的责任风险),许多媒体授权机构会付钱给审查人员,让他们查看收到的每张图片,手动识别人员,并确保每个需要发布表格的人都有一份存档。这既费时又费钱。
这就是定制人工智能解决方案的用武之地。许多供应商提供定制的人工智能解决方案,但该行业中一个突出的参与者是 IBM Watson。自从 2011 年在电视节目《危险边缘》中战胜人类对手以来,沃森一直是全国关注的焦点。从那时起,IBM 已经将 Watson 从一个为特定任务而专门构建的人工智能带到了一个平台,该平台正在各个行业对人工智能和机器学习的实施进行革命性的变革,从制造和建筑到文化遗产和媒体许可。
在 10 月份的 DMLA 第 24 届年会上,作为以谷歌云、Imagga 和 CloudSight 为特色的实用人工智能会议的一部分,加多图像和 IBM Watson 将展示一个新的定制人工智能系统的原型,该系统专门用于为图像分配模型发布表单。该系统将查看一幅图像,自动找到图像中的所有人,无论他们是在看相机(就像在一幅直截了当的肖像中),站在人群中,背对着,甚至穿着遮住他们面部的衣服。仅这一功能就向许多机构的工作流程自动化迈出了一大步。
The system has successfully identified a person who would need a model release form for this image to be used commercially. Underlying photo credit Gado Images.
该系统最终将超越这一点,确定人脸是否足够小、模糊或选择性聚焦,从而不需要发布表单。
如果该系统获得成功,它将为定制人工智能解决具体的、具有挑战性的行业问题的能力提供一个很好的例子。
Crowd scenes, especially in low light, are challenging, but the system correctly identified the people present in the scene. Some people in the scene are facing away from the camera and are obscured enough that a release form may not be needed. Underlying photo credit Gado Images.
数字媒体许可协会第 24 届 DMLA 年会将于 10 月 27 日至 29 日在加州玛丽娜·德尔瑞举行,而实用人工智能会议将于 10 月 28 日星期一上午 11 点举行。
使用机器学习的 ICC 2019 板球世界杯预测
原文:https://towardsdatascience.com/icc-2019-cricket-world-cup-prediction-using-machine-learning-7c42d848ace1?source=collection_archive---------4-----------------------
Photo by Aksh yadav on Unsplash
用数据做很酷的事情
被困在付费墙后面?点击这里阅读完整故事与我的朋友链接!
2019 年 ICC 男子板球世界杯准备于周四(5 月 30 日)开始。第 12 届板球世界杯将在英格兰和威尔士进行近一个半月。本次锦标赛将有 10 支球队参加,他们将在一个循环赛小组中进行比赛,小组赛结束时的前四名将进入半决赛。
预测未来听起来像是魔术,无论是提前发现潜在客户购买你产品的意图,还是计算出股票价格的走向。如果我们能够可靠地预测某事的未来,那么我们就拥有巨大的优势。机器学习只是放大了这种神奇和神秘。
应用程序
体育预测的主要目的是提高团队的表现,增加赢得比赛的机会。一场胜利的价值以不同的形式表现出来,比如涓涓细流渗透到体育场座位上的球迷、电视合同、球迷商店商品、停车、优惠、赞助、注册和保留。
数据
真实世界的数据是肮脏的。我们不能指望像 Kaggle 提供的那样有一个良好的格式和干净的数据。因此,数据预处理至关重要,我怎么强调都不为过。这是最重要的阶段,因为它可能占据整个工作流程的 40%-70%,仅仅是清理要提供给模型的数据。
我从 Crickbuzz 网站上刮了三个脚本,包括截至 2019 年 5 月的球队排名,2019 年世界杯的比赛细节以及每支球队在历届世界杯上的历史细节。我将上述数据存储在三个单独的 csv 文件中。对于第四个文件,我从 Kaggle 的另一个 csv 文件中抓取了 1975 年至 2017 年间比赛的 odi 数据集。在这个文件中,我删除了 1975 年到 2010 年的所有数据。这样做是因为过去几年的结果只会影响我们的预测。由于我没有得到 2018 年和 2019 年的数据,所以这个模型可能不是那么准确,但我仍然相信这给出了一个相当好的想法。然后,我根据我的需要对数据进行了手动清理,以制作一个机器学习模型。
环境和工具
- Jupyter 笔记本
- Numpy
- 熊猫
- 海生的
- Matplotlib
- sci kit-学习
我一步一步地遵循一般的机器学习工作流程:
- 数据清理和格式化。
- 探索性数据分析。
- 特征工程和选择。
- 在性能指标上比较几种机器学习模型。
- 对最佳模型执行超参数调整。
- 评估测试集上的最佳模型。
- 解释模型结果。
- 得出结论并记录工作。
Machine learning workflow
代码在哪里?
事不宜迟,让我们从代码开始吧。github 上的完整项目可以在这里找到。
我从导入所有的库和依赖项开始。
然后我加载了包含历届世界杯各队历史详情的 csv 文件。我还加载了包含 2010 年和 2017 年之间比赛结果的 csv 文件。
1.数据清理和格式化
接下来,让我们显示印度队比赛的详细情况。
接着,我创建了一个专栏来展示 2010 年的比赛细节,并将其作为未来工作的参考。
2。探索性数据分析
之后,我把今年参赛的队伍的详细情况和他们过去的成绩合并在一起。
我删除了比赛日期、胜算和比赛场地等栏目。这些特征看起来对我们的预测并不重要。
3。特征工程和选择
这可能是机器学习工作流程中最重要的部分。由于算法完全取决于我们如何将数据输入其中,因此对于每个机器学习项目来说,特征工程应该被赋予最高的优先级。
特征工程是将原始数据转化为特征的过程,这些特征可以更好地代表预测模型的潜在问题,从而提高未知数据的模型准确性。
特征工程的优势
减少过度拟合:冗余数据越少,基于噪声做出决策的机会就越少。
提高精度:误导性数据少意味着建模精度提高。
减少训练时间:数据点越少,算法复杂度越低,算法训练越快。
所以继续工作,我创造了这个模型。如果团队 1 赢了比赛,我给它分配标签 1,否则如果团队 2 赢了,我给它分配标签 2。
然后,我使用 pandas 函数 pd.get_dummies 将 team-1 和 team-2 从分类变量转换为连续输入。此变量只有两个答案选择:团队 1 和团队 2。它创建一个由 0 和 1 组成的新数据帧。在这种情况下,数据帧将有一个 1,这取决于特定游戏的团队。
此外,我将训练集和测试集分开,分别占训练集和验证集的 70%和 30%。
Train/Test Split
4。在性能指标上比较几个机器学习模型
我使用逻辑回归、支持向量机、随机森林和 K 近邻来训练模型。
随机森林以 70%的训练准确率和 67.5%的测试准确率超过了所有其他算法。
Photo by Lukasz Szmigiel on Unsplash
随机森林结合了数百或数千棵决策树,根据一组略有不同的观察值训练每棵树,考虑有限数量的特征来分割每棵树中的节点。随机森林的最终预测是通过对每棵树的预测进行平均而得到的。
RFs 使用随机数据样本独立训练每棵树。这种随机性有助于使模型比单个决策树更健壮,并且不太可能过度适应训练数据。
5。对最佳模型进行超参数调整
Training set accuracy: 0.700
Test set accuracy: 0.675
随机森林模型的流行是由它的各种优势解释的:
- 在大型数据库上运行时准确高效
- 多个树减少了较小集合或单个树的方差和偏差
- 抗过度配合
- 可以在不删除变量的情况下处理数千个输入变量
- 可以估计哪些变量在分类中是重要的
- 为估计缺失数据提供有效的方法
- 当大部分数据丢失时保持准确性
Decision boundary from random forests (as more trees are added)
6。评估测试集上的最佳模型
我们继续。我增加了 ICC 的球队排名,今年优先考虑排名更高的球队获胜。
接下来,我添加了新的列,为每支球队排名,并对前 45 场比赛的数据集进行切片,因为总共有 45 场联赛阶段的比赛。
然后,我根据每个团队的排名位置将团队添加到新的预测数据集中。
之后,我添加了获取虚拟变量的脚本,并添加了与模型训练数据集相比缺少的列。
7。解释模型结果
最后,下面的代码是为了得到每个联赛阶段比赛的结果。
有关结果,请随意参考相应的 jupyter 笔记本。因此,进入半决赛的四支队伍是新西兰、印度、英格兰和南非。
然后我创建了一个函数来重复上面的工作。这是预测 2019 年 ICC 板球世界杯冠军的最终函数。
我运行了半决赛预测功能。
新西兰和印度
冠军:印度
南非和英格兰
冠军:英格兰
因此,进入决赛的两支队伍是印度和英格兰,这是显而易见的,因为他们被认为是今年的夺冠热门。此外,他们是国际商会排名第一和第二的球队。
8。得出结论并记录工作
最后运行主函数。
印度和英国
获胜者:英国
按照这种模式,英格兰很有可能赢得本届世界杯。
本文旨在展示如何使用机器学习来计算模拟中的概率,并不试图实际获得正确的结果,因为使用的数据还不够(或者事件本身根本不可预测)。请把这当成一个教程,用世界杯比赛只是因为这是一个很酷的和最新的主题。应该使用更深入的方法来获得更好的结果,并使它们更有意义。
需要进一步改进的领域
- 数据集——为了改善数据集,你可以通过从 ESPN 网站上抓取 2018 年和 2019 年的数据来考虑它们,也可以使用球员的数据来评估每个团队球员的质量。
- 尝试更复杂的机器学习算法,如 Xgboost 和微调 hyper 参数
- 一个混淆矩阵将会很好地分析模型出错的游戏。
- 我们可以集合,也就是说,我们可以尝试将更多的模型堆叠在一起,以提高精确度。
- 更进一步,基于玩家统计数据建立一个模型。
参考资料/进一步阅读
[## 为什么随机森林是我最喜欢的机器学习模型
“模特就像一副护目镜。它让某些事情成为焦点。”—我的数据科学导师。
towardsdatascience.com](/why-random-forest-is-my-favorite-machine-learning-model-b97651fa3706) [## 运动成绩预测的机器学习框架
您的浏览器禁用了 JavaScript。请启用 JavaScript 以使用此页面上的所有功能。机器学习…
www.sciencedirect.com](https://www.sciencedirect.com/science/article/pii/S2210832717301485) [## 为什么人工智能在 2018 年 FIFA 世界杯上失败了?
以下是我们从人工智能未能预测 2018 年俄罗斯世界杯结果中学到的东西。
medium.com](https://medium.com/futuristone/artificial-intelligence-failed-in-world-cup-2018-6af10602206a)
在你走之前
github 上相应的项目可以在这里找到。
[## abhinavsagar/ICC-2019-WC-预测
我用机器学习做了一个模型,用 scikit-learn,pandas,numpy,seaborn 和 matplotlib 来预测…
github.com](https://github.com/abhinavsagar/ICC-2019-WC-prediction)
2019 年 15 月 7 日更新 1 —英格兰确实赢得了世界杯。
Eoin Morgan holding the trophy
联系人
如果你想了解我最新的文章和项目,请关注我的媒体。以下是我的一些联系人详细信息:
- 个人网站
- 领英
- 中等轮廓
- GitHub
- 卡格尔
快乐阅读,快乐学习,快乐编码!
ICLR 19 集锦(诸如此类)
原文:https://towardsdatascience.com/iclr-19-highlights-and-all-that-jazz-659c294f991d?source=collection_archive---------30-----------------------
会议关于强化学习、GANs、公平和其他主题的笔记
与 Ofri Mann 的联合帖子
我们去 ICLR 展示了我们在使用不确定性和注意力调试 ML 模型方面的工作。在美妙的新奥尔良的鸡尾酒会和爵士乐表演之间(我们能在 NOLA 举行所有的会议吗?)我们也看到了很多有趣的讲座和海报。以下是我们从会议中得到的主要收获。
主要主题
伊恩·古德费勒在的演讲中对这些主题做了一个很好的总结,他在演讲中说,直到 2013 年左右,ML 社区一直专注于让 ML 发挥作用。现在,在给定足够数据的情况下,它正在许多不同的应用程序上工作,重点已经转向为我们的模型添加更多功能:我们希望它们遵守一些公平、问责和透明的约束,保持稳健,有效地使用标签,适应不同的领域等等。
伊恩·古德费勒演讲中关于人工智能主题的幻灯片
我们注意到几个话题引起了很多关注:强化学习,GANs 和对立的例子,公平是最突出的。在训练和优化技术、VAEs、量化和理解网络的不同行为方面也做了大量的工作。
虽然会议的最后一天展示了许多关于不同 NLP 任务的论文,但计算机视觉对我们来说就像是一个已解决的问题,很少有应用的视觉论文。然而,大多数关于优化、理解网络、元学习等的工作实际上都是在图像上完成的。尽管会议的重点是学习表示,但在结构化或表格数据的学习表示方面并没有太多的工作。
下面的笔记是根据主题分类的。
强化学习
有三个研讨会和整个海报会议(约 90 篇论文)致力于强化学习。
今年讨论的一个突出主题是稀疏奖励或无奖励强化学习。这个主题在任务不可知强化学习 研讨会中得到了很好的体现,多张海报和简短的演讲,以及 Pierre-Yves Oudeyer 的精彩演讲,讨论了好奇心驱动的学习,其中信息增益被用作内在奖励,允许算法探索它们的环境并专注于信息增益最高的领域。这些内在的奖励可以和外在的奖励结合起来,几乎不需要明确的练习就能完成任务。在他的演讲中,Oudeyer 展示了机器人如何在没有事先练习的情况下学会操纵环境和执行任务,以及一种新颖的数学教学方法,其中好奇心驱动的算法用于个性化每个孩子的课程,专注于他/她较弱的科目。
另外两个研讨会讨论了 RL 中的结构:
强化学习中的结构&先验 研习班专注于学习结构的不同方式,并将先验引入 RL 任务,以便允许它们从更少的示例中学习,并以更低的计算成本获得更高的泛化能力。
深度强化学习符合结构化预测 研讨会建议将结构预测视为一个连续的决策过程,并专注于利用深度强化学习的进步来改进结构化预测的论文。
生成对抗模型和对抗范例
除了 Goodfellow 的主题演讲(重点介绍 GAN 在不同 ML 研究领域的应用)之外,还有一个完整的海报会议专门讨论 GAN 和对立的例子。这些也在调试 ML 模型 研讨会、高度结构化数据的深度生成模型 研讨会和安全机器学习:规范、健壮性和保证 研讨会中得到了很多关注。
例如,在他的演讲“对立例子的新观点” 中,Aleksander Madry 声称模型从健壮的特征和与标签相关的非健壮特征中学习,健壮的特征捕捉一些对人类可解释的意义。由于非鲁棒特征对于最大化模型的准确性同样有用,所以模型也关注它们。因此,他声称,我们不能指望训练后的可解释性,因为模型的一些预测能力来自于非稳健的特征。我们称这些特性为对立的例子,但是从模型的角度来看,健壮特性和非健壮特性之间没有真正的区别。为了提高可解释性,Madry 提出了一些方法来迫使模型在训练过程中只关注健壮的特征。
公平、问责、安全和人工智能对社会有益
今年有很多(不一定是技术性的)关于公平、安全和人工智能对社会公益的相关问题的讨论。
Cynthia Dwark 做了一个很棒的主题演讲关于算法公平的最近发展,她在演讲中提出了两个公平的概念——群体公平,它解决了不同人口统计群体的相对待遇,以及个体公平,它要求对于给定的分类任务,相似的人应该被该任务的分类器相似地对待。她谈到了与这两个概念相关的挑战,以及最近旨在弥合这两个概念之间差距的工作,强调了多重校准的概念——针对不同的群体进行校准,以及公平的排名和评分。
另一个旨在引发对 ML 中可能存在的危险的讨论的演讲是 Zeynep Tufekci 的“虽然我们都担心 ML 的失败,但如果它(大部分)有效,会潜伏什么危险?”。
AI for social good 研讨会的重点是应用人工智能来解决医疗保健、教育和农业等重要的社会问题。 Safe ML 车间,专注于指定系统用途,使其更加健壮并对其进行监控。ML 车间的再现性和调试 ML** 车间(我们在此介绍了我们关于不确定性和注意力的工作),主要关注公平性和可解释性。**
我们认为会议组织者对公平性、问责制和透明度(FAT)的高度重视是公开邀请机构群体参与这一重要讨论,作为主要 ML 会议的一部分。虽然大多数相关论文都发表在指定的会议上,如 FAT conference ,并且今年没有太多相关论文出现在主赛道上,但我们预计这种情况在未来几年将会改变。
我们喜欢的其他东西
除了上述主题之外,还有许多其他有趣的论文。很难从发表在《ICLR 19》上的 500 多篇论文中选出几篇。
针对我们感兴趣的一些话题,我们整理了几个。
迁移学习
伊利诺伊大学的一个研究小组提交了一篇非常有趣的论文,知识流——改进你的老师。该思想是一种新颖的迁移学习方法——“知识流”架构。
在新任务上训练的“学生”网络使用来自一个或多个“教师”网络的中间层权重,在其他任务上预先训练。通过使用可训练的变换矩阵和权重向量,该模型学习每个教师对网络不同部分的学生做出多少贡献。
此外,知识流动损失函数包括学生对教师的依赖,这种依赖随着培训的进行而减少。
使用这种方法,教师对初始培训步骤的贡献很大,允许学生网络的快速“热启动”。当学生在新的任务上训练时,老师的影响减少了,直到最后的训练步骤,当学生变得独立于老师,只使用自己的重量。
这在监督和强化学习任务上都有效,并在几个测试集上取得了最好的结果和更快的收敛。
我们发现另一篇有趣的迁移学习论文是K for the price of 1:Parameter efficient multi task and transfer learning。
它展示了迁移和多任务学习的统一框架。这个想法是使用模型补丁——一组特定于每个任务的小的可训练层,与现有层交错。
这些补丁可用于迁移学习,方法是仅微调新任务上的补丁参数,同时使其余预训练层保持不变。对于多任务学习,这意味着除了任务特定的补丁之外,模型共享大部分权重。
不确定性(我们最喜欢的主题!)
深度神经网络的偏差减少的不确定性估计,显示了不确定性估计的类似“过拟合”的现象,在较简单的情况下,不确定性估计在训练开始时有所改善,但在多次迭代后会下降。为了防止这种情况,建议对训练或早期停止的不同检查点进行平均。
用对冲实例嵌入对不确定性建模:如果我们学习概率嵌入而不是学习确定性嵌入,会怎么样?暹罗网络使用建设性损失进行训练,但不是像往常一样输出 z,而是输出期望值和标准偏差,定义表示嵌入的高斯。高斯的大小以后可以作为不确定性估计来处理。
为什么批量归一化工作?
我们有三篇值得一提的论文阐明了批处理规范化是如何工作的:走向理解,批处理规范化中的规范化, 批处理规范化的平均场理论,以及批处理规范化自动速率调整的理论分析
关于出勤的几点思考
听众是学术界和工业实验室的混合体。大量的论文来自行业研究中心——deep mind 大约有 50 篇论文,谷歌大约有 55 篇,微软和脸书各有大约 30 篇。还有相当数量的工作来自工业公司。
我们玩得很开心,带回了许多我们迫不及待要开发的想法!
ICLR 2019:克服有限的数据
原文:https://towardsdatascience.com/iclr-2019-overcoming-limited-data-382cd19db6d2?source=collection_archive---------13-----------------------
从几个例子中学习的论文摘要
上周(5/6/19)标志着学习代表国际会议(ICLR)的开始。因此,我想我会深入研究一些我认为最有趣的 ICLR 文件。这些论文中的大多数都与我个人感兴趣的领域相关(无监督学习、元学习、注意力、NLP),但我选择其中一些只是因为它们在各自领域的高质量和影响力。这第一部分将解决小数据集深度学习领域的突破。第二部分将讨论解决 NLP 和其他类型的序列数据的突破的论文。最后,第三部分将是我觉得有趣的杂七杂八的论文。
迁移、元学习和无监督学习
训练数据有限的问题影响了很多行业,包括医疗保健、农业、汽车、零售、娱乐等。在其他情况下,有很多数据,但是没有注释。由于收集和注释数据的时间/成本过高,这个问题经常成为深度学习集成的障碍。
学习无监督学习规则 s
这篇论文建立在元学习和无监督学习的思想之上。具体来说,该论文提出利用元学习以无监督的方式学习下游任务的有效表示。这篇论文的重点是“半监督”分类,但它特别有趣的是,至少在理论上,学习规则“可以被优化,以生成任何后续任务的表示。”这是有用的,因为在大多数关于表示的无监督学习的工作中,作者定义了特定的训练算法或损失函数。而在这里,模型“学习【s】创建由元目标确定的有用表示的算法这些自定义规则通常需要大量的实验和领域知识,因此不容易适应新的领域。这方面的一个例子是使用自动编码器,它通过尝试编码来学习表示,然后解码与原始输出相同的输出。自动编码器通常需要专门的损失函数。
为了准确理解这是如何工作的,回想一下元学习通常有一个内部循环和一个外部循环。在内部循环中,模型处理特定的任务,例如在图像分类中,这可以是识别狗和猫。正常情况下,内部循环将在一定数量的 n 个示例上运行(通常 n 在 1 到 10 之间)。然后,外环将使用来自内环的一些参数(权重本身、累积损失或其他)来执行元更新。这种元更新的细节因模型而异,但它们通常遵循这种方法。
Overview of the meta-learning process.
考虑到这一点,他们模型的架构本质上是元学习一种在创建表示后更新内部模型的方法。此规则在创建表示后更新内部模型时有效地取代了 SGD。此外,无监督更新规则在循环结束时更新,这与 MAML 如何更新权重本身或者在 SNAIL 的情况下更新注意力模型的权重形成对比。这意味着这种无监督学习规则不仅可以应用于类似的任务,还可以应用于全新的任务、新的基础模型,甚至是新的数据形式(例如从图像到文本)。
作者首先通过展示先前方法的问题来评估他们的结果。例如,随着时间的推移,VAE 会遭受目标函数(即损失)不匹配的影响,从而导致性能下降。而原型网络传递特征,因此如果任务之间的特征维度不同,它就开始崩溃。相比之下,因为 Metz 等人的方法学习更新,所以在少数镜头分类任务中,它可以比 VAE 更好地概括。他们还在训练元更新时显示,网络可以概括为改进文本分类,即使它只在图像分类任务上训练(尽管他们确实看到,如果元函数在图像分类任务上训练太长时间,因为它过度适合图像任务,则性能会急剧下降)。
总的来说,这是一篇非常好的论文,也是无监督技术的一大进步。尽管它没有设定任何最先进的结果,但它肯定可以应用于许多数据匮乏的领域。这篇论文的作者代码可以在下面的链接中找到。
通过元学习的无监督学习
有趣的是,ICLR 今年发表了两篇论文,都提议将元学习和无监督学习结合起来,尽管是以两种完全不同的方式。在本文中,不是使用元学习来学习无监督学习规则,而是使用非监督学习来划分元学习数据集。
这篇论文是我的最爱之一,因为它为没有明确任务描述的元学习打开了大门。元学习的部分问题是,它通常需要非常明确的任务集。这将元学习限制在拥有非常大的带注释的元数据集(已经被划分成不同的子数据集)的领域。这种方法提出将数据集自动划分成不同的子集。作者发现,即使使用简单的无监督聚类算法,如 K-means,元学习者仍然能够从这些任务中学习,并在随后的人类标记的任务中比直接在这些嵌入中学习的方法表现得更好(如无监督学习后进行监督分类的情况)。他们使用的两种元学习技术是质子和 MAML。本文演示了一种有趣的半监督学习形式,其中我们有无监督的预训练,然后是监督学习。在这种情况下,“受监督的”组件正在进行少量的学习。
作者在四个数据集(MNIST、Omniglot、miniImageNet 和 CelebA)上将他们的方法与无监督学习方法进行了比较。最后,他们发现他们的方法比所有其他非监督+监督学习方法都要好,包括聚类匹配、MLP、线性分类器和 KNN。总的来说,这篇论文在使元学习更容易处理各种不同类型的问题,而不仅仅是那些有明确任务划分的问题方面迈出了很好的一步。
【潜在嵌入优化元学习】
本文旨在将基于梯度的元学习与潜在表征网络相结合。LEO 分两步操作:首先它学习模型参数的低维嵌入,然后在模型的低维嵌入空间上执行元学习。具体来说,首先给模型一个带有输入的任务 T,然后输入被传递给编码器。编码器产生一个潜在代码,然后被解码成一组参数。关系网络是这个编码器的一部分,它帮助代码变得依赖于上下文。然后在内环中优化这些参数,而在外环中优化编码器、解码器和关系网。作者指出,他们工作的主要贡献是表明元学习在低维嵌入空间中比在高维空间中工作得更好,如 MAML 使用的空间。LEO 在 tieredImageNet 和 miniImageNet 数据集上都取得了很好的实验结果(包括在 1-shot 5 way 基准上令人印象深刻的 61%的准确率和在 5 shot 5 way 上的 77%)。像许多其他论文一样,它只对图像数据进行测试,所以还不清楚它对其他类型数据的推广效果如何。
跨流程转移学习
由于这篇论文的作者已经发布了一篇关于它如何工作的详细的 Medium 文章,所以我不会对技术方面进行过多的描述。在其他元学习论文的大背景下,这篇论文有几个值得强调的部分。首先,它评估了少量学习场景和大量数据场景。这很重要,因为元学习算法通常不考虑元优化在有大量例子时的工作情况,但仍然太少,无法从头训练模型。它还着眼于其他几个尚未探索的领域。具体来说,它解决了“远迁移”这一经常未被充分探索的领域,远迁移是在显著不同的任务之间实现积极的知识转移。
学习深度多维聚类的变分自动编码器中的潜在超结构
本文讨论了使用一种新型的变分自动编码器(VAEs)来更好地聚类高维数据。将项目聚类成不同的组是无监督学习中重要的初步步骤。作者指出,许多类型的数据可以通过其属性的许多不同部分进行聚类。作者指出,“LTVAE 产生多个数据分区,每个分区由一个超级潜在变量给出。”
LT-VAE 不仅学习每个聚类的位置以最好地表示数据,还学习它们的数量和底层树的层次结构。这是通过三步学习算法实现的。步骤 1 是编码器和解码器神经网络的传统训练,以改善它们对数据的拟合。步骤 2 是类似 EM 的优化,以在学习后验之前更好地拟合潜在的参数。并且步骤 3 调整潜在先验的结构以提高其 BIC 分数[3],这平衡了潜在后验与潜在先验的参数数量(以及因此的复杂度)的良好拟合。
这种方法的主要优点是,即使总体结果在对数似然性方面不尽如人意,它也能提高聚类的可解释性。此外,基于特定方面进行集群的事实使得它对许多实际应用程序很有吸引力。虽然这篇文章不同于许多其他的论文,并且没有明确地解决少数几次学习的问题,但是我认为它的聚类方法在与少数几次学习方法相结合时会被证明是有用的。例如,它可能被用作“通过元学习设置的无监督学习”中的任务划分
通过元学习进行深度在线学习
本文关注于使用元学习和一个中国餐馆过程来快速更新在线运行的强化学习模型。这是受到这样一个事实的启发:人类经常面临我们以前没有(确切地)经历过的新情况;然而,我们可以利用过去的经验结合新经验的反馈来快速适应。
作者的方法首先利用 MAML 对模型进行初始训练。在 MAML 给出一个有效的先验后,就出现了在线学习算法的使用。在线学习算法利用中国餐馆过程来产生具有适当初始化的新模型或者选择现有模型。然后使用 SGD 根据结果更新模型参数。作者将这种提议的方法命名为在线学习的元学习(简称为 MoLE)。
作者在几个 RL 环境中评估了他们的方法。第一个环境是模拟猎豹穿越不同难度的斜坡。第二个环境是腿残废的六足履带式机器人。MOLe 优于基于模型的 RL、具有元学习的 k-shot 适应以及具有元学习的连续梯度步骤(尽管有趣的是,它仅略微优于具有 ML 的梯度步骤)。
通过最大化迁移和最小化干扰来学会学习而不遗忘
当神经网络学习一系列任务时,它通常会遇到一个叫做灾难性遗忘的问题。随着灾难性的遗忘,神经网络不再能够很好地执行它之前被训练的任务。灾难性遗忘可以被认为是迁移学习的一个特例,其中存在显著的负向迁移。迁移学习(正如大多数人所说的)和元学习通常寻求在最终任务上最大化正向迁移,但通常不注意对原始任务的影响。本文试图在他们仍然希望进行正迁移的地方取得更多的平衡,但不能以灾难性遗忘(干扰)为代价。
为了解决这个问题,里默尔等人提出了一种称为元体验回放(mer)的方法。MER 利用标准的经验重放,其中过去的训练示例与当前的训练示例交错,以防止灾难性的遗忘。这些过去的例子给出了较低的学习率。其次,MER 采用流行的元学习算法爬虫对新数据进行训练。然而,MER 将来自存储缓冲器的先前样本与新进入的样本交织到由爬行动物驱动的内部训练循环中,以防止灾难性的遗忘。
我喜欢这篇论文同时探讨了正迁移和负迁移的观点。它在 Omniglot 和强化学习设置上的结果看起来相当不错。然而,特别是在监督分类设置中,作者只对“玩具”数据集进行测试。他们还应该在 CIFAR-10 benchmark、CALTech-Birds 或 CORRE50 上进行测试。在这一点上,当有许多其他更现实的 CL 数据集时,没有真正的理由只在置换 MNIST 或 Omnigolt 上进行测试。另外。我发现他们的一些术语令人困惑,因为作者“重命名”了几个以前命名的概念。此外,理想情况下,在连续学习的情况下,我们不必对任何先前的数据进行再训练(因为再训练增加了计算成本)。然而,所有这一切都是朝着正确的方向迈出的一步,我希望更多的论文关注正向迁移和反向迁移。关于这篇论文的更多信息,IBM 有一篇博客文章和代码位于这里。
样本高效自适应文本到语音转换
这是元学习在 seq2seq 建模中的一个有趣应用。在这种情况下,作者使用元学习来实现对说话者声音的少量调整。这很重要,因为很多时候你可能没有一百个或一千个特定人声音的例子。具体来说,作者扩展了 WaveNet 架构,以便整合元学习。有趣的是,根据作者的说法,MAML 在他们的初步实验中没有产生有意义的先验。因此,他们不得不开发自己的架构。
该体系结构在三个步骤中起作用:(1)在来自各种说话者的文本说话对的大型语料库上训练模型;(2)在来自单个说话者的几个文本说话对上调整模型;以及(3)最后对纯文本执行推理并将其转换成适当的语音。作者讨论了少镜头学习的两种情况:带有嵌入式编码器的参数化少镜头适应(SEA-ENC)和带有微调的非参数化少镜头适应(SEA-ALL)。在 SEA-ENC 的情况下,作者训练辅助嵌入网络,该网络在给定新数据的情况下预测说话人嵌入向量。相比之下,对于 SEA,所有作者一起训练网络和嵌入。在评估中,SEA-ALL 似乎表现最好,尽管作者指出该模型似乎过度拟合了 SEA-ALL。因此,他们建议使用早期停止。(只有在 10s 范围内,他们的模型优于以前的论文)。
这篇论文是一个很好的例子,它将少量镜头学习应用于典型图像分类领域之外的棘手问题,并为其实际工作进行必要的调整。希望在未来,我们能看到更多将少量学习应用于生成模型的尝试。作者有一个网站,你可以在那里演示他们的 TTS 模型,不幸的是,它似乎不包含他们的实际代码。
ICLR 大学其他相关论文的简短摘要
K 为代价 1:参数高效多任务与迁移学习
Mudrarkarta 等人介绍了一种模型补丁,它由少量可学习的参数组成,这些参数将专用于每个任务。这种方法代替了微调网络最后一层的常见做法。作者发现,这种方法不仅减少了参数的数量(从 100 多万减少到 35k),而且提高了迁移和多任务学习环境下的微调精度。唯一的缺点是这个补丁看起来相当特定于架构。
距离度量学习的无监督域适应
尽管这篇论文的第一部分标题是“无监督的领域适应”,但它实际上是针对迁移学习的。回想一下,对于域自适应,目标域通常具有相同的标签集。然而,在这种情况下,作者假设一个未标记的目标域。正如一些评论者指出的,由于这个原因,这篇论文令人困惑;然而,它仍然有几个值得带走。作者提出了特征转移网络 FTN,以分离源领域和目标领域的特征空间。作者实现了跨种族人脸识别的艺术表现。
学习语法引导程序综合的元解算器
本文讨论了如何应用元学习来合成程序。在这本书里,他们构建了一个语法引导的程序,该程序采用一个逻辑公式和一个语法,然后生成一个程序。这是一个很好的应用元学习的例子,超越了典型的少数镜头图像数据集。
深度线性网络中泛化动力学和迁移学习的分析理论
本文探讨了学习和迁移学习的理论。作者声明“我们的理论揭示了知识转移敏感地,但可计算地依赖于[信噪比]和成对任务的输入特征排列。”总的来说,这篇论文对那些喜欢钻研理论的人来说很有趣。
结论
我希望这能很好地概述今年 ICLR 大学的大部分少数几个学习论文(尽管我可能错过了一些)。正如你所看到的,有各种有趣的新技术正在开辟在数据受限的情况下使用深度学习的方法。请继续关注我的三部分 ICLR 系列的第二部分,在那里我将讨论 NLP 的进展(包括面向目标的对话),新的和更好的注意机制,以及一些有趣的新型递归架构。
ICLR 再现性访谈#4: Aniket Didolkar
原文:https://towardsdatascience.com/iclr-reproducibility-interview-4-aniket-didolkar-c0b1c1a15960?source=collection_archive---------28-----------------------
再现 h-分离:朝着更好的优化修改 LSTM 梯度
我们对 Aniket Didolkar 的最后采访涵盖了他的工作,再现了一种解决 LSTMs 中爆炸梯度问题的方法。安妮特是 ICLR 再现性挑战中唯一的单独参与者。
继续读下去,看看我们围绕处理长期培训工作的技巧和再现研究时组织的重要性的讨论。
采访摘要(TLDR):
- 由于时间限制,Aniket 能够从论文作者那里检索代码库,并重现所有实验,除了一个关于图像字幕任务的实验。
- 对于一个市场来说,再现性意味着拥有关于超参数的细节、调整学习速率、库和包版本、预处理、数据指针等等。以一种有组织的方式与代码库一起工作,并且围绕测试的、失败的超参数有更多的透明度,可以帮助社区更接近可再现性。
- 如果有更多的资源,Aniket 就不必在实例耗尽之前保存所有数据,也不必重复下载数据。他也会用更多的种子进行实验。注意:作者确实指出训练较慢,因为他们是按顺序训练的(通常 PyTorch 和 Tensorflow 并行发送数据)
再现性报告详情:
- 原文:https://openreview.net/pdf?id=ryf7ioRqFX
- 代号:【https://github.com/dido1998/h-detach
- 举报:https://github . com/Dido 1998/iclr _ 2019/blob/master/papers/TeamYakataka-ryf 7 iorqfx/TeamYakataka _ camera _ ready . pdf
- PR(包含评论):https://github . com/reproducibility-challenge/iclr _ 2019/pull/148
团队成员:
- Aniket Didolkar|Github//Linkedin//Twitter
面试
>为便于阅读,本次采访经过编辑
Cecelia: 开球。我很乐意让你介绍一下自己。
是的。我的名字是阿尼基特。我是印度马尼帕尔大学的三年级本科生。我第一次对深度学习感兴趣是在去年的第三个学期,从那时起,我在我的大学里选修了很多课程,并参与了一个与机器人相关的学生项目,我还在一家与 NLP 合作的公司实习。这基本上是我在机器学习方面所做的全部工作。
Cecelia: 你是如何发现再现性挑战的?
Aniket: 我是在 Quora 上的一个问题回答中发现的。有哪些对 AI 有贡献的好方法?怎么做才能让自己变得更好?我不记得是谁,但答案是来自 Yoshua Bengio 教授接受这个再现性的挑战。
Cecelia 你为什么有兴趣参加?
因为我实际上对深度学习非常感兴趣,我想做一个好的项目,我认为再现性将是一个非常好的机会,可以对我所做的论文进行大量深入的学习。有时我在读一篇论文,但我不能完全理解它,但实际上进入并实施它有助于更深入、更好地理解它。
Cecelia: 你如何定义再现性?
Aniket: 如果作者报道了某些实验,那么这些实验在任何情况下都应该可以被任何人复制。比如这个问题我觉得我发现了很多。每当我工作的时候,特别是强化学习的时候,会有很多论文,但是你真的不能复制结果,我认为这是一个问题。但是我认为再现性挑战是一个伟大的倡议,因为他们有这样的条件,一些实验,你必须再现它们,这对社区真的很好。
Cecelia: 对于你试图复制并遇到挑战的论文,你遇到了什么样的问题?
Aniket: 举例来说,我在从事强化学习,我们正在研究某些算法,比如 PPO,但我们无法让我们的网络收敛。我们一直在关注报纸,但在某些事情上,他们就是不一致,我们不知道哪里出了问题。我认为最重要的原因之一是没有支持代码。我认为当有代码时,人们很容易在纸上阅读它,并更清楚地理解它。
你认为再现性很重要吗?如果是,为什么?
是的,这很重要,因为研究界不断发表许多新技术和新论文,但他们应该能够将这些应用到现实生活中。有如此多的初创公司正在崛起,行业中有如此多的公司应该能够应用它们,并且许多这些算法应该是可复制的。对其他研究人员来说,在这些算法的基础上进行开发会更容易。
Cecelia: 你能描述一下你选择这份报纸的具体原因吗?
Aniket: 本文基于 LSTMs。这是一种训练 LSTMs 的新算法,处理 LSTMs 中的爆炸梯度问题。我选择这个的原因是因为我觉得和 LSTM 在一起有点舒服。我以前和他们一起工作过,对此我很有信心。我真的很喜欢这个想法——我认为它很简单,我认为它非常有效,我能够重现结果,所以它非常有效。
作者报告说,当 LSTM 的权重很大时,沿着线性时间路径的梯度得到抑制。这条路径很重要,因为它携带了关于时间依赖性的信息。为了防止这种情况,h-分离块随机地渐变通过 h-状态..
你能描述一下你是如何从头到尾复制这篇论文的吗?
Aniket: 基本上,首先我读了论文两三遍,然后我实际上实现了一个较小的版本,我发现它与我之前运行的其他 LSTM 模型相比有点慢,就像通常的 LSTMs 实现是在 PyTorch 或 Tensorflow 中。所以我联系了作者,他们非常友好,给了我他们自己实现的代码库,他们说这很慢,因为他们是按顺序训练的,一般来说,PyTorch 和 Tensorflow 是并行发送数据的。他们这样做是为了确保他们算法的正确性,之后我用了他们的库,因为我可能犯了一些小错误。有了他们的回购,我可以专注于调整超参数和所有。所以我直接使用了他们的回购协议,并进行他们在论文中给出的实验。所以基本上有复制任务,最初给 LSTM 一个特定的数字序列,并要求在特定的时间间隔后复制该序列。有一个连续的 MNIST 任务,其中 MNIST 数据给 LSTM 像素。然后,他们必须进行消融研究,以证明他们的方法与正常的 LSTMs 相比非常有效。事实上,它与另一种称为 c-detach 的算法进行了比较——基本上是分离 lstm 的 c 状态中的梯度,而不是我告诉过你的其他部分。而且,在他们的实验中,他们证明了这真的很有效…有一个实验我没有重现,叫做转移复制任务,因为时间不够。
Cecelia: 从开始到结束——从你看报纸到完成这个挑战——你花了多长时间?
安妮特:这花了我大约一个半月的时间。主要的瓶颈基本上是网络的培训。对于每个实验来说,大约需要三四天。
好的。你提到你联系了作者,他们实际上给了你这个代码库,这很好。你知道为什么他们一开始没有在论文中包括代码库吗?
我不确定。是啊。他们没有包括它。他们现在可能已经包括它,但是我还没有检查它。当时,他们没有包括它——我不确定,也没有问他们这个问题。
塞西莉亚:明白了。你是通过公开评论与作者交流,还是通过某种方式获得了他们的联系方式?
Aniket: 我得到了他们的邮件信息,我通过邮件联系了他们。
找到你了。好的,看起来一旦你有了代码库,事情就变得非常简单了,但是在你有代码之前,你在试图复制论文时遇到了哪些挑战?
首先,最初我看了报纸。我对算法有一个相当好的想法,但是我不确定我是否完全正确,所以我不得不从头到尾读两三遍。我想出了一个小的实现方案,并对它进行了测试,结果显示效果不错,但我仍然不确定。就像我告诉你的,真的很慢。他们的实现需要三到四天,但我的实现甚至更慢,所以我有点担心,因为我不确定我是否能完成所有的实验。这也是我联系他们,询问这件事的原因。
Cecelia 你将你的实现描述为一个小的实现。你能说得更详细些吗?你说小是什么意思?
Aniket 基本上我所做的就是获取一个样本数据集,我只是在 PyTorch 中实现了他们提到的同一个 LSTM 实现,并直接使用了它。
抓到你了。所以你只是从某处获取了一些样本数据。
但是那时我还没有建立一个合适的知识库来记住所有我必须运行的实验。只是试运行。
Cecelia 那么当他们给你这个他们工作过的仓库时,里面有什么?这只是一个代码,还是他们也包括他们使用的数据?
Aniket 数据是…所以对于复制任务,数据是由代码本身生成的。有了 MNIST,数据可以被下载,下载数据的代码包含在他们的代码中,他们有不同的分支,用于他们独立进行的实验。这相当简单——我克隆了它,它马上就运行了。我不需要做任何改变。
Cecelia 明白了。好在它是可运行的代码。当您最初运行这些实验时,需要三到四天的时间才能完全运行。你最初用什么做实验?
最初,我是在 Google Colab 上运行它们的。
好的,他们使用了什么样的环境?
T21:代码是用 PyTorch 写的,我用起来很舒服。测试代码也在 PyTorch 中。我不确定他们用的是哪种 GPU,但我用的是 Colab。我有一段时间可以在中间使用 GTX 1060,那段时间我使用它,但大多数时候,我使用 Colab。
明白了。你也是…实验一开始进行得很慢,但你会说当你试图复制论文时,你面临着计算极限吗?
是的。例如,主要的事情是它花了三天运行。因此,在一次实验中,Google Colab 只运行了十二个小时。所以我不得不不断重启,保存所有东西,一次又一次地下载数据,这是主要的限制。
塞西莉亚:明白了。这真是令人沮丧。如果你有更多的时间或资源,你会做些什么不同的事情呢?
Aniket: 如果我有更多的资源……目前我可以进行实验,但是我只进行了两个种子的实验,而作者报告了许多种子的结果。如果有更多的资源,我会这么做。我会用更多的种子来测试算法。有一个实验(围绕图像字幕任务)我没有重复,如果我有更多的时间,我会做这个实验。
这篇论文的作者似乎很容易接受。
他们非常支持我。我甚至对算法本身和论文中的概念有些怀疑,我只是给他们发了电子邮件,他们给了我一个回复,并对其进行了适当的解释。
Cecelia: 你能解释一下为什么吗,因为其他一些参加挑战的人在 Open Review 上发帖,他们找不到作者的电子邮件。那么,如果你找不到所有这些电子邮件,你会如何尝试与他们沟通?你会在公开评论上提问吗?
Aniket: 我在公开评论上提问时会更加小心。我会试着自己弄清楚,因为这是一个公共论坛,但我很容易就获得了电子邮件 ID,我认为给他们发电子邮件会很容易。
Cecelia: H 完成挑战后,你描述了你之前对再现性的看法,挑战改变了你对机器学习研究的看法吗?
Aniket: 不,没变。我希望机器学习研究朝着我们不断发表论文的方向发展,但我想改变的一点是,每篇论文都应该发布一些代码,以便向人们提供如何使用论文中算法的基本想法。
所以要复制一个实验,你认为代码是必要的吗?
T21:是的,我认为代码或者甚至每篇论文都应该有一个部分来解释他们的方法和一切是如何工作的。
完成挑战后,你会如何以不同的方式对待自己的工作?
是的,我认为完成这个挑战后,我会做的不同的是,每当我开始做某事时,我会尝试首先创建一个存储库,组织它,并从项目开始到结束保持它的组织性。所以这是我从做这个项目中学到的一件事——以一种更有组织的方式使用你的代码库。
Cecelia: 那么如果你现在就开始建立一个存储库或者推荐一个存储库结构,那么这个存储库中会包括什么呢?
Aniket: 所以基本上不同的分支都有我要报告的每个实验的代码。无论我的算法需要什么数据,指针都应该有数据和下载方法,以及数据需要的任何预处理。我认为任何 NLP 项目的代码库都应该有预处理步骤。
你认为如果你与多人合作,或者如果你有一个团队,你的体验会有所不同吗?
如果我们有一个小组,我们可以做更多的实验,但这是唯一的事情:我们可以做更多的实验。但除此之外,我不认为会有任何不同。
Cecelia: 你认为什么将有助于使机器学习研究更具可重复性,并且接下来——可以说是框架第一个问题——你认为研究人员今天在使他们的工作可重复性方面面临的挑战是什么?
我认为在机器学习方面有很多事情需要收敛:这些小的超参数会产生很大的影响,你如何调整学习速率等等。所以我认为这是再现性的主要障碍之一。有时候代码库——我也遇到过这种情况,我见过一些人——是如此的混乱,以至于他们实际上并没有发布它。其次,有很多东西你必须从外面进口,你必须使用不同的软件。这对于开源代码来说可能是不可行的。包含如何运行它的文档会非常冗长。有时运行任何一段代码都会发生这种情况,这取决于你使用的软件和不同的版本。报告所有这些有时会非常冗长,这就是人们不开源代码的原因。
Cecelia: 你描述了几个不同的挑战——围绕所有超参数、外部导入的事情,就像所有这些细微差别一样——你会将这些细节视为代码的一部分还是代码的外部?
我认为,有时当人们展示他们的结果时,他们只会展示某一组超参数,而不会谈论他们尝试过但失败了的其他超参数。对于我的论文,作者尝试的超参数在同行评审网站上,而不是在论文或代码库中。当我开始复制这篇论文时,评论还没有公开,随着时间的推移,它们堆积了起来。
Cecelia: 对,所以最初的讨论很有帮助。你认为有什么工具或最佳实践可以让这个过程变得更容易、更好吗?
Aniket: 我不认为有固定的最佳实践,但这一倡议,可再现性挑战,可以在每个会议上进行,而不仅仅是在 ICLR,进行适当的审查应该是所有主要会议都可以采用的实践。
你认为机器学习的某些领域比其他领域更容易重现吗?
从我的经验来看,我认为每当我从事 NLP 或计算机视觉之类的工作并完成某篇论文时,我都能够重现它,但当我从事强化学习时,我会遇到很多问题。
你认为这是为什么?
我不确定实际上是什么,但确实是个东西。我没有答案。我不是很确定,但是我观察了很多次。我认为这可能是由于 RL 算法难以理解,但如果提供支持代码,就更容易理解这篇论文。此外,有时在一种环境下运行良好的算法在其他环境下并不运行良好。因此,我认为研究社区专注于构建 RL 算法非常重要,这些算法可以在不同的环境中进行归纳并给出一致的结果。
有兴趣了解更多关于再现性挑战的信息吗?点击阅读我们的开篇文章
想了解 Comet 如何帮助你跟踪、比较、解释和重现你的机器学习实验吗?了解更多。
深度预后:预测 ICU 的死亡率
原文:https://towardsdatascience.com/icu-mortality-5d0e80539b9e?source=collection_archive---------31-----------------------
在医学院,我们学习识别实验室异常,它们的原因和治疗。当观察到患者的血钾为 5.5 毫摩尔/升时,医生可以迅速确定罪魁祸首(如肾衰竭、急性肾损伤、ACE 抑制剂诱导等)。)根据患者的病史和表现。
对提供者来说,更困难的问题是:这位患者的高钾血症究竟如何影响她未来的健康结果?如果病人的钾是 5.2 而不是 5.5 mmol/L 会怎样?如果她的血钾在 3 天内而不是 5 天内从基线水平上升会怎样?如果她有慢性肾病病史呢?此外,病人“问题清单”上和她过去病史中的所有其他项目如何影响她的结果分布?如果它们的相互作用不仅仅是相加的呢?我们有希望理解成百上千个因素之间的相互作用吗?这些因素决定了一个病人的结果。
如果我们希望成功,我们应该关注复杂的患者,他们可能提供最大的洞察力和机会。重症监护室(ICU)里的病人是医院里最复杂的病人。在我用于这个项目的数据集中,仅在 ICU 时,平均每个病人就被赋予 13 个独特的 ICD-9 诊断代码。这些患者在医院中死亡率最高:美国每年有 400 万 ICU 入院,其中约 50 万导致死亡。他们的护理是最昂贵的:使用包括机械通气、透析和输液在内的强化治疗,住在 ICU 每天的费用可能超过 10,000 美元。对于这个项目来说,最重要的是,这些患者产生了大量的数据——生命体征、实验室结果、干预措施、进度记录等。
有可能用这些丰富的数据来预测这些患者的存活率吗?
这种模型将能够回答上述难题。此外,它将提供一个单一的指标,病人的敏锐度,可以很容易地解释由大型和各种医院团队。它将提供客观的信息,有助于提供者、患者和家属之间的临终讨论。重要的是,该工具可以保持灵活性,以便它可以预测死亡以外的事件。
数据:预处理和特征工程
Overview of the Data
我在这个项目中使用了 eICU 合作研究数据库。由麻省理工学院管理,由 Physionet 发行,它是公开的,在访问之前只需要 HIPAA。它是在两年多的时间里(2014 年和 2015 年)从美国各地的 ICU 收集的,包含了超过 200,000 名 ICU 住院患者的大量数据。在这些住院病人中,超过 10,000 人的住院导致了死亡。
数据预处理
首先,将 16 岁以下的患者和在 ICU 停留不到 7 小时的患者从数据集中剔除。
每种类型的数据集都需要不同的清理步骤:诊断、治疗、既往病史、周期性生命体征、非周期性生命体征和实验室结果。每一个都是根据需要独立加载和预处理的。
为了训练该模型,需要识别阳性和阴性患者,并且需要保存这些事件的时间点以用于以后的特征提取。因为我选择保持模型的灵活性,所以需要不同的标注算法来识别数据集中的死亡率和其他事件。在死亡率预测的情况下,所有过期的患者被识别,并且该患者的最后事件(治疗或诊断)被用作时间戳。在诊断的情况下,仅选择在入院后三个小时以上收到该诊断的患者,并将该诊断的第一个实例用作时间戳。
特色工程
在选择阳性和阴性患者后,为所有这些例子生成特征向量。我使用了三类数据——分类数据、数字数据和序列数据。
分类特征包括种族、性别、入院单位等。这些是一次性编码的。
数字特征代表了特征工程工作的大部分,包括生命体征、实验室结果和静态值,如入院体重。我在这里创造了 66 个特征,运用了我的医学教育。例如,一个特征是血尿素氮(BUN)与血清肌酸酐的比率,其用于指示急性肾损伤的位置。对于每个特征,最大值、最小值或平均值是在三个窗口之一上计算的,即“当前时刻”(即预测时间点)之前的 4 小时窗口,从入院到当前时刻的窗口,或持续入院前六个小时的基线窗口。其他特征,如尿素氮与肌酐的比率、肌酐相对于基线的变化或动脉与吸入氧的比率(PF 比率)都是从这些第一特征中计算出来的。这些特征允许有缺失值,尽管缺失最大数量特征的 10%的示例被移除。剩余的缺失值将替换为特征平均值并进行缩放。
最后,顺序特征包括过去的病史诊断(以英语给出)、直到当前时刻在 ICU 中给出的诊断(以英语和 ICD-9 代码给出)以及直到当前时刻的治疗和诊断干预。在将所有过去的病史诊断翻译成通用语言 ICD-9 代码后,所有这些事件都按时间戳排列——按照它们实际发生的顺序。
多模态深度学习模型
A flexible, multimodal model for predicting diagnoses or survival from ICU data.
我选择按顺序对每个病人进行诊断和治疗,以保留我认为重要的临床模式。例如,一个有恶性肿瘤病史的病人,现在有单侧腿部肿胀,相对来说很可能被诊断为肺栓塞。
我需要一个尊重顺序信息的模型架构,所以我使用了一个长短期记忆(LSTM)网络,它有一个双向包装器和 32 个单元。我还希望模型能够学习每个诊断和治疗的表示,所以我使用了一个包含 32 个元素向量的嵌入层,模型在训练时会学习这些向量。
使用三个 16 单元隐藏层,如通过超参数调谐所确定的,RNN 实现了 0.85 的 ROC 曲线下面积(AUROC)。
接下来,我只对分类数据和数字数据训练了一个 DNN。三个隐藏层各有 32 个单元,每层之间有 50%的压差,在这里效果最好,经过特征选择和工程设计,DNN 达到了 0.87 的 AUROC。
为了将两个模型结合起来,我去掉了每个模型的最后一层,并将输出连接起来。该层用作 3 层 64 单元 DNN 的输入。来自分类/数字 DNN 的附加辅助输出确保网络的一部分学习对最终任务有用的表示。那么复合模型表现如何呢?
结果
在最后的时间点,复合材料模型达到了 0.91 的最先进的 AUROC。但是,即使距离最后一次观察还有几天,该模型也表现良好——可靠地识别出预后最差的患者。
At every timepoint, the composite model performs best. Even days out, the model performs well.
如果我们观察一段时间内单个患者预测的例子,我们可以看到模型如何对新信息做出反应:
The model recognizes a patient’s worsening clinical picture.
随着患者的临床状况随着一系列不吉利的事件(中风、呼吸衰竭、肺炎、休克)而恶化,该模型正确地提升了其输出,表明分数可以被视为严重性指数。
查看模型已经学习的嵌入的第一个主要组件的表示,我们看到一个有趣的模式:
升压药在最右边——去甲肾上腺素,血管加压素,去氧肾上腺素。机械通风也在那里。这是有道理的,因为血液动力学不稳定和通气应该是预后不良的标志。
但是如上所述,我希望模型保持灵活性——这样新的模型就可以通过改变诊断来训练。
Training a new model is as easy as changing one input.
我包括了各种各样的特征——肾、肺、肝和心血管——因此该模型在其他诊断中表现良好。
The model performs well across a variety of diagnoses.
结论
总之,我为提供商、医院和保险公司建立了一个多模态、灵活的深度学习模型和工具,它不仅可以为患者的严重程度和死亡可能性提供单一指标,还可以预测其他事件。
我在这个项目中获得了很多乐趣。感谢阅读!
莱姆和 SHAP 背后的想法
原文:https://towardsdatascience.com/idea-behind-lime-and-shap-b603d35d34eb?source=collection_archive---------2-----------------------
ML 解释模型背后的直觉
在机器学习中,在模型复杂性和模型性能之间存在权衡。复杂的机器学习模型,如深度学习(其性能优于线性回归等可解释模型),已被视为黑盒。Ribiero 等人(2016 年)题为“我为什么应该相信你”的研究论文恰如其分地用 ML 黑箱概括了这个问题。模型可解释性是一个不断发展的研究领域。请在此阅读了解机器可解释性的重要性。这篇博客讨论了石灰和 SHAP 背后的 理念 。
这个博客不是关于如何使用/编码/解释莱姆或 SHAP 的(这方面有很多好的资源)。这些资源显示了如何单独使用给定自变量的石灰和 SHAP 值(一个数据点的一个变量对应一个石灰/SHAP 值)。这个博客是关于理解 我们是如何得到这些值的,以及我们在使用石灰和 SHAP 库 时实际在做什么。先跳石灰再跳 SHAP,几个引物比较好理解。**
本地与全球可解释性
在线性回归模型中, Beta 系数解释所有数据点的预测(如果变量值增加 1,则每个数据点的预测增加 Beta )。这是全球保真。在因果分析中,它被称为“平均”因果分析。但是,这并不能解释个体差异(异质性)。一个变量对一个用户的影响可能不同于另一个用户。这就是局部保真度(对独立变量联合分布的单个数据点或局部子部分的解释)。局部函数解释(预期的)可能比全局解释更准确,因为在局部区域,函数(更高的概率)是线性和单调的。甚至局部区域也可能是高度非线性的,并且局部可解释性将失败——这些方法的限制。(这也是平滑度假设的一部分——没有平滑度假设,很多情况下都无法实现,因为很多优化模型都会失败)。莱姆和 SHAP 探索并使用局部可解释性的属性来构建黑盒机器学习模型的代理模型,以提供可解释性。图 1 中的几个例子。
Figure 1. Global vs Local and Surrogate model
代理模型
莱姆和 SHAP 是代理模型(图 1)。这意味着他们仍然使用黑盒机器学习模型。他们稍微调整输入(就像我们在敏感度测试中做的那样)并测试预测中的**变化。这种调整必须很小,以便它仍然接近原始数据点(或在局部区域中)。莱姆和 SHAP 模型是替代模型,用于模拟预测中的变化(根据输入的变化)。例如,如果通过调整变量的值,模型预测没有太大变化,则该特定数据点的变量可能不是重要的预测值。因为代理模型仍然将 ML 模型视为黑盒,所以这些模型是 模型不可知的 。****
可解释的数据表示
必须将数据点转换成一种更易于构建代理模型的格式(在原始数据点附近采样数据点)。这种表示被称为可解释的(在 LIME paper 中),因为它是人类可以理解的(它将数据转换为二进制)。如图 2 所示,x: d 维数据转换为x:d '-维 二进制矢量数据用于其可解释性表示。图 2 给出了一些例子。图 2 还展示了 LIME 如何在代理模型中使用可解释的数据格式来提高可解释性。目标(粗略地)是最小化 x 和它的邻居之间的响应(预测)差异。
Figure 2. Interpretable data format and LIME as a surrogate model
石灰
现在我们有了了解石灰的背景。如果我们选择一个点 x,我们可以通过关闭一些二进制维度(来自 x’)表示(通过邻近度测量加权)来围绕 x 绘制个样本(z’)。一旦我们得到了样本,从 z '中恢复一个变量 z。比如 (1) 设 f(z)是检测一个句子是否可恶的深度学习模型。我们的数据集包含句子。 (2) 如果我们考虑一个数据点(一个句子 x),我们先把它转换成 x’(单词有无)的格式。 (3) 从 x’开始,我们在 x’的邻域周围采样 z’(通过均匀地关闭一些二元向量)。 (4) 这些样本转换成 z(句子恢复)。在 z 中,有些单词可能不存在。 (5) 用 z 作为输入,得到值 f(z)。图 3 显示了一个采样示例。它还包括什么是单个数据点(和每个变量)的 LIME " 值 " 以及我们如何获得它。它展示了我们如何从一个变量的局部重要性(可解释性)得到全局重要性。粗略地说,这意味着将局部权重相加,从而最大限度地覆盖关闭的维度(当我们穿过 SHAP** 时,记住这一点很有用)。如前所述,有很多好的资源告诉我们如何使用(或解释)这些价值观,所以本博客不会涉及这些内容。**
Figure 3. Example of sampling in the neighborhood of a data point x and Getting the LIME values
石灰的缺点
虽然 LIME 具有可加性(单个影响的总和等于总影响)这一理想属性,但它在缺乏稳定性、一致性(如果变量的贡献增加或保持不变,改变模型不会减少变量的属性)和缺失(缺失变量的属性应为 0)方面受到了一些批评。所有这三个属性都由 SHAP 实现(因此更常用)。还有,LIME 需要定义“本地”。
SHAP
SHAP 值使用与石灰相似的概念。SHAP 基于沙普利值的博弈论概念提供了理论保证。请看** 这段 关于 Shapley value 的短视频阅读前进一步了解 SHAP。Shapley 值的理论背景也可以看这个。**
SHAP 代表上海、应用、T2 和 T4。“添加剂”是一个重要的关键术语。像石灰一样,SHAP 具有加性属性。一个数据点的所有变量的 SHAP 值之和等于最终预测值。如图 4 所示,只要记住石灰,就可以理解 SHAP。图 4 显示了 SHAP 值是如何计算的。在 SHAP,我们不需要建立一个局部模型(像 LIME 中的线性回归),而是使用相同的函数 f(x)来计算每个维度的 shapley 值。
Figure 4. SHAP calculation
Shapley 值保证每个变量的公平分配(LIME 不提供这种保证)。莱姆假设局部模型是线性的,SHAP 没有任何这样的假设。SHAP 值计算非常耗时(因为它检查所有可能的组合:它通过蒙特卡罗模拟而不是蛮力来完成)。SHAP 值是而不是有和没有变量的预测之间的差,而是变量对实际预测和平均预测之间的差的贡献。通过将每个单独数据点的 SHAP 值的绝对值相加,给出了全局级别的变量重要性。虽然 SHAP 使用了所有的变量,但如果我们想减少变量的数量,我们可以选择一些变量重要性更高的变量,丢弃其他变量并重新运行 SHAP(因为像一致性这样的属性,变量重要性的顺序不会改变,所以不太重要的变量可以忽略)。
最后的话
我希望我们在莱姆和 SHAP 所做的事情的背景更加清晰。两者都是模型不可知的,并且该库可用于标准的机器学习模型。由于其理论保证和简单性,SHAP 被广泛使用,也许更容易接受[6]。现在,我们需要定义我们是如何看待一个“邻居”的。此外,我们构建了一个线性局部模型,它在一个非常复杂的决策面中可能不是线性的(甚至在局部级别)。在 SHAP,我们可以使用使用训练数据训练的相同模型。
参考
这篇博客摘自里贝罗等人的论文
【1】莱姆
【2】SHAP伦德伯格和李
以下与本博客一脉相承,从较低层次解释石灰与 SHAP:
【3】石灰前必读
【4】SHAP 前必读
【5】关于石灰的中等博客由 Lar
关于我们为什么要考虑可解释性的其他来源:
【6】H20 视频
【7】Scott Lundberg 的博客
【8】白盒 vs 黑盒
这个博客不是关于如何使用莱姆和 SHAP 图书馆或者如何解释他们的结果。你可以在以下网址找到如何使用它们:米格尔的
【9】中型博客
【0】中型博客
想法:数据冲刺的设计方法
原文:https://towardsdatascience.com/ideas-design-methodologies-for-data-sprints-9d10a32090e4?source=collection_archive---------17-----------------------
Photo by William Iven on Unsplash
我最近在一个研究实验室呆了四天,与一群数据科学家和一些行为科学家一起深入一个庞大而杂乱的数据集,看看我们是否能找到与群体动力学相关的见解。它被设计为一个初步的潜水,四处看看,对有用的研究见解的潜力进行初步评估,然后根据那周的发现建立一个两到三个月的工作提案。
理论上,我是以行为科学家的身份参加的,但由于我也痴迷于创造性的问题解决过程,或设计思维(我非常固执己见),以下是对我们使用的过程的一些反思和下一步的想法。
大量的过程方法论占据了软件开发、数据分析和创造性问题解决学科之间重叠的空间:UX、设计思维、思考错误、谷歌设计冲刺、敏捷、看板、用于小组冲刺的新兴数据分析方法等。这很棒,因为如果你很好奇,你可以获得一个相当大的工具集,让一群人聚在一起,在不同的时间内对各种不同类型的问题进行创新——从两个小时的会议到 18 个月的项目。挑战,或者说作为一个主持人对实践的掌握,不仅仅是学习方法论或练习本身的术语,而是学习群体动力学、创造力、心理学和神经科学背后的潜在科学。
在这次研讨会期间,我们有两种不同类型的专业人员在房间里——社会科学和数据科学,每一种在这些分组中都有互补的技能组合。它们对数据集来说都是全新的,当我们第一次看它时,它相当混乱。sprint 赞助商的指导非常广泛,在为期三天的 sprint 中,我们可以了解到这些员工对团队动力的总体认识。
不幸的是,直到第二天下午,我们才清楚地确定了什么样的见解最有用的方向。在那一点上,社会科学组分开来头脑风暴一系列不同的问题,可以问关于群体动力学,以及哪些理论和研究问题正在成为该领域特别感兴趣的问题。除了确保整个团队对研讨会的方向有一个清晰的想法,以及关于团队动力的什么问题主题是最有用的(即小型工作团队的表现,团队组成随时间的变化,在聚集在一起的人群中寻找模式,等等)我们也需要设计约束,但是没有识别它们。介绍设计思维使用一般的文氏图来说明设计必须成功满足的标准,以获得资金/努力开发高保真解决方案的许可。各公司制定了自己的特定标准,这些标准通常属于这些范畴。在没有确定我们自己的情况下,团队依靠聚集在房间里的人的专业知识和直觉。不错——每个人都非常聪明,非常了解自己的领域;但如果你想最大限度地利用资源来理解最重要/最有影响力的问题,这并不太好。
via Legacy Innova
在前两天,我们的主持人采用了 UX 和设计思维练习——人物角色和需求陈述。他们的目的是让小组确定具体的问题,然后由整个团队投票决定。第三天,几个小组被分开,每个小组回答一两个可能会被问到的数据问题。通常,人物角色和需求陈述是一种非常可靠的方法;他们在各种情况下工作。但是在这个冲刺阶段,许多人发现当他们被告知要寻找关于群体动态的洞察力,而不是个人角色时,他们感到沮丧。
人物角色方法的第一个挑战是,它们被设计为与深思熟虑的思维模式或系统 2(从快速思考和慢速思考)一起使用,该系统 2 获取各种各样的、看似不相关的信息——通常是定性的人种学——并将其综合以得出一些详细的需求陈述。由于事先没有关于数据集中的人的信息,我们只能查看原始数据的电子表格,并将卡通人物虚构为角色。整个团队勇敢地去做,并试图利用它,但时间可以更好地利用。
关于选择人物角色方法的第二个挑战是,它们应该在设计过程中使用,而设计过程的结果是为原型个体服务的产品或服务。人物角色的问题和解决方案——解决人物角色的需求——之间有关系。对于本次研讨会,我们的团队并不打算生产产品或服务,而是交付见解。而不是人物角色,我们应该探索和绘制群体动力学的复杂概念的空间。
在这个工作坊中,一些设计思维/ UX 方法的笨拙使用和对其他方法的拒绝是完全可以理解的。随着设计冲刺成为一种受欢迎的、合理的工具,让企业将多学科团队聚集在一起,开发新颖的概念和产品,设计和软件开发方法的广阔空间已经进入了一个陌生的领域——数据分析。虽然我对评论设计方法很有经验,但数据科学对我来说还是一个新领域。根据我所做的文献综述,以及分析团队有限的商业经验,似乎他们自己也在纠结什么方法最适合群体数据冲刺。传统上,分析是单独进行的,或者并排进行,不需要更正式的团队流程。三种力量正在推动数据科学家开发群体分析方法:数据科学领域随着专业化和工具数量的不断增加而分成两个部分,数据量呈指数级增长,数据科学正在向以前使用几乎无处不在的定性方法和工具进行分析的学科蔓延,因此多学科团队正在成为常态。在过去的五到七年里,有几篇学术文章和博客描述了群体数据分析过程。
- 关于管理数据科学团队工作流的思考 : Medium 文章更多地介绍了数据科学团队如何在多年的开发、研究、工程和服务中分配工作,而不是针对特定分析问题或冲刺的流程。
- 管理科技行业数据科学项目的方法:关于将敏捷的核心价值观应用于研究方法的中间文章。
- 敏捷、商业智能和数据科学的回顾和未来方向 : 2016 年学术文章,讨论敏捷原则和实践以及数据科学实践如何作为商业智能的一部分发展
- 走向运营环境中视觉分析的设计原则:尽管只针对视觉分析、vice statistics 和机器学习数据科学,但加州理工学院 2018 年的这篇文章为他们开发视觉分析的研究过程提供了一个有用的视角。
我的博士研究包括开发一个联合设计过程,利用 3D 数据可视化软件来分析一个复杂的概念——幸福。我一直在思考我们如何让团队一起调查和交流复杂的概念,团队和个人的早期工作需要发现,以便最终做政策,服务和产品设计。试图理解复杂的系统和复杂的概念是一件完全不同的事情,甚至比综合人物角色细微的心理和社会需求还要难。口头文化有非常不同的思考和讨论复杂性的方法,我相信我们西方占主导地位的,有文化的,技术文化有很多东西可以向他们学习,关于如何分析复杂性。
我想把这些想法提供给多学科团队,他们致力于在庞大、杂乱的数据集中发现真知灼见。我很好奇其他人在做什么,并希望得到一些反馈。
首先,这是我用来组织设计冲刺的框架,围绕着解决特定原型人物角色的特定需求。四个象限对应于通常与设计思维相关的四个阶段:采访和观察用户,需求综合,构思,原型和测试。我发现这有助于我作为一名辅导员理解我试图引导我的参与者练习不同方法的思维模式。将思考模式与问题和解决方案之间的清晰界限结合起来也是有帮助的。试图同时对问题和解决方案进行头脑风暴是一种混乱的方法,会偏离轨道。这个 2x2 的框架在为围绕理解用户需求和开发一些东西来解决它的研讨会设计练习时最有用——一个软件产品界面,一个家庭用品,一个社会服务。
复杂性,即群体动力学,需要一个不同的框架来思考在冲刺阶段选择哪种方法和使用哪种思维模式。在我们的 sprint 中,工作围绕着获得洞察力、提炼原始数据集和梳理复杂的主题。再次使用 2x2 矩阵,复杂的概念和原始数据集在其中一个轴上代替了问题和解决方案。对于第二个轴,我们可能会使用不同的闪耀和聚焦模式,而不是那些服务于思考个体原型的定义需求的模式,两个例子是归纳/演绎和陈述/模态。Rottman 商学院的 Mihnea Moldoveanu 博士领导了一项长达十年的研究工作,以了解超越学科界限的思维模式或适应性智能。他的训诫本质上是有意识地选择最适合问题和手边人群的思维模式,或思维模式的模式。
另一个数据冲刺的一组假设的方法可能是:1)绘制与所讨论的复杂概念相关的尺度、层和理论,2)向下选择最重要的一组主题或元问题来询问数据集,3)对原始数据集的探索性分析,4)开发一个模式并开始清理数据并将其组织到一个易于访问的数据框架中, 5)分成小组,每个小组处理一个主题或元问题,并使用交替闪烁和集中的思维模式,如归纳/演绎和陈述/模态,以迭代方式分析数据,开发假设性见解,并通过更多的数据分析来完善它们。
这个方法论空间——尤其是 sprint 方法论——使用多学科团队来询问大数据集的复杂问题,确实令人兴奋。我们的政策制定者、科学家和研究人员所面临的许多最有趣的问题都坐在传统上不必找到共同语言就能合作的领域的交叉点上的大量数据上。主持人、数据科学家和设计从业者可能会开发出新的理论,说明如何更好地组织团队,以便更快、更有效地从大型、混乱的数据集中获得洞察力。不可避免地,有人会试图用漂亮的图形图标和简化的描述来将它商品化。但现在这是一个有趣的、协作的社区探索空间,因为我们想出了如何将更多的学科和专业与数据科学家和原始数据结合在一起。
Photo by Startaê Team on Unsplash
使用词云识别热门话题
原文:https://towardsdatascience.com/identify-top-topics-using-word-cloud-9c54bc84d911?source=collection_archive---------8-----------------------
Photo by AbsolutVision on Unsplash
我最近在处理文本数据时发现了单词云。我真的很着迷于它们是如何通过一张图片揭示如此多的信息,以及它们是如何通过一个库轻松创建的。因此,我决定做一个快速项目来理解它们。
单词云或标签云是词频的图形表示,对在源文本中出现频率更高的单词给予更大的重视。— 更好的评估
基本上,单词云以云的形式显示一组单词。一个单词在文本中出现的频率越高,它就会变得越大。因此,通过简单地看一看云,你就能识别出关键词和热门话题。
词云使用的众多领域
我发现云这个词实际上可以用在很多领域。其中一些是:
- 社交媒体上的热门话题:如果我们可以阅读并获取用户发出的帖子/推文的文本,我们可以从中提取热门词汇,并可以在趋势部分使用它们来分类和组织各个部分下的帖子/推文。
- 热门新闻话题:如果我们可以分析各种新闻文章的文本或标题,我们可以从中提取出热门词汇,并确定一个城市、国家或全球最热门的新闻话题。
- 网站导航系统:每当你访问一个由类别或标签驱动的网站时,实际上可以创建一个词云,用户可以直接跳转到任何主题,同时知道该主题在整个社区中的相关性。
项目—发现热门新闻话题
我做过一个项目,从这里的获取新闻文章的数据集,并根据新闻文章的标题创建一个单词云。完整的代码以 Jupyter 笔记本的形式出现在 Word Cloud repository 中。
导入库
当使用导入库时,我发现我没有包wordcloud
。Jupyter 提供了一种在笔记本内部执行命令行命令的简单方法。只需在命令前使用!
,它就会像在命令行中一样工作。我用它来得到wordcloud
包。
!pip install wordcloud
我现在有了我需要的所有库,所以我把它们都导入了。
我们让库numpy
、pandas
、matplotlib
、collections
使用 Counter 和wordcloud
来创建我们的单词云。
使用数据集
首先,我首先将数据集文件导入 pandas 数据帧。注意,为了正确读取,该文件的编码是latin-1
。然后,我输出列名来识别哪个与标题匹配。
我们可以看到有 6 列:作者、日期、标题、read_more、text 和 ctext。然而,在这个项目中,我将与头条新闻。因此,我使用lower()
方法将所有的标题转换成小写,并将它们组合成一个变量all_headlines
。
词云
现在,我们准备创建我们的单词云。做了一轮分析后,我确定其中一个顶上的词是will
。但是,它没有提供关于该主题的任何有用信息。因此,我将它包含在停用字词集中,以便在从标题中识别顶部字词时不考虑它。
然后,我使用这些停用词调用WordCloud
方法,将输出图像的背景设为white
,并将最大字数设为1000
。图像保存为wordcloud
。
我用rcParams
来定义图形的大小,并将axis
设置为off
。然后我用imshow
显示图像,用show
显示图像。
Word Cloud
从图像中,我们可以清楚地看到前两个话题分别为India
和Delhi
。可以清楚地看到,词云对于识别文本集合中的顶级词是多么有用。
我们甚至可以使用条形图来验证热门词汇。
我首先从组合标题中分离出所有单词,同时避开停用词,从而得到filtered_words
。然后,我用Counter
来统计每个单词的出现频率。然后,我提取前 10 个单词及其数量。
接下来,我绘制数据,标记轴,并定义图表的标题。我用barh
显示了一个水平条形图。
Bar Chart of top 10 most frequent words
这也与来自单词云的结果一致。而且由于Delhi
的计数更高,在字云中比India
更粗更大。
结论
在这篇文章中,我讨论了什么是词云,它们潜在的应用领域,以及我为理解它们所做的一个项目。
一如既往,请随时分享您的观点和意见。
识别和纠正机器学习中的标签偏差
原文:https://towardsdatascience.com/identifying-and-correcting-label-bias-in-machine-learning-ed177d30349e?source=collection_archive---------6-----------------------
随着机器学习(ML)变得越来越有效和广泛,它在具有现实生活影响的系统中变得越来越普遍,从贷款建议到工作申请决策。随着使用的增加,偏见的风险也随之而来——有偏见的训练数据可能导致有偏见的 ML 算法,这反过来又可能使社会中的歧视和偏见永久化。
在谷歌的一篇新的论文中,研究人员提出了一种新的技术,即使在有偏见的数据集下,也可以公平地训练机器学习算法。该技术的核心思想是,有偏见的数据集可以被视为经过有偏见的代理操纵的无偏数据集。使用这个框架,有偏数据集被重新加权以适应(理论上的)无偏数据集,然后才作为训练数据输入到机器学习算法中。该技术在几个常见的公平性测试中获得了最先进的结果,同时呈现相对较低的错误率。
背景
当试图评估算法中的偏差时,研究人员通常会查看四个关键指标:
- 人口统计均等-分类器应该以与整个人口相同的比率对受保护的人口群体做出正面预测。
- 完全不同的影响-类似于人口统计均等,但分类器不知道存在哪些受保护的人群以及哪些数据点与这些受保护的人群相关。
- 机会均等——分类器在受保护人群中的真阳性比率应与整个人群中的比率相等。
- 均衡优势分类器在受保护人群中应具有与整个人群相同的真阳性和假阳性率。
每个高级度量都表示为一个非负数,它描述了分类器与完全公平的接近程度,0 分表示没有偏差。
近年来,研究人员提出了几种方法来减少算法中的偏差。这些可以分为三个关键类别:数据预处理、数据后处理和算法增强(拉格朗日方法)。
数据预处理
在预处理中,研究人员试图通过在训练算法之前操纵训练数据来减少偏差。预处理在概念上是简单的,因此具有潜在的吸引力,但是存在两个关键问题:
- 技术数据可能会以复杂的方式产生偏差,这使得算法很难将其转换为既准确又无偏差的新数据集。
- 合法-在某些情况下不允许在非原始数据上训练决策算法。
数据后处理
在后处理中,研究人员试图通过在训练算法后操纵训练数据来减少偏差。与预处理一样,后处理的一个关键挑战是找到能够准确识别偏差的技术,从而降低偏差并保持算法精度。
算法增强(拉格朗日方法)
最近的一种方法是通过惩罚有偏差样本的影响,将公平性纳入训练算法本身。这是通过一种叫做拉格朗日乘数的数学技术来完成的,它接收公平性约束(例如,老年人应该以与年轻人相同的比率被接受)作为输入,并使用它们来影响训练算法中的损失。拉格朗日方法是目前最流行的,但通常难以实施,并给训练过程增加了相当大的复杂性。
偏差校正框架
如前所述,在提出的框架中,我们假设有偏数据集(y_bias)是对(理论上的)无偏数据集 y_true 进行操作的结果。这可以表现为:
该技术的第一步是学习λk 的值,λk 表示无偏数据集 y_true 和有偏数据集 y_bias 之间的联系。学习的λk 值用于计算每个训练样本的权重 wk,有偏样本得到低权重,无偏样本得到高权重。然后,ML 算法接收数据点和权重作为输入,并使用它们来训练无偏的分类器。
On the left is y_true, the middle is y_bias, and the right (“Our loss”) represents the result of the unbiased classifier. The different hues of red represent the different label values, which change due to the biasing process. The model learns the weights in order to undo the work of the theoretical “biased labeler” (Image: Jiang & Nachum)
如论文中所述,学习λk 的工作方式如下:“其思想是,如果对于一个保护类 G 的正预测率低于整体正预测率,那么相应的系数应该增加;即,如果我们增加 G 的正标签样本的权重并减少 G 的负标签样本的权重,那么这将鼓励分类器增加其对 G 中的正标签样本的准确度,而对 G 的负标签样本的准确度可能下降。”
在实践中,我们的过程包含两个部分——系数学习过程,以及基于无偏数据的 ML 模型的最终训练。重要的是要注意,虽然约束学习过程使用分类器来发现λk 偏差系数,但是在构建 ML 模型时不需要使用相同的分类器。
在实践中,我们的过程包含两个部分——系数学习过程,以及基于无偏数据的 ML 模型的最终训练。重要的是要注意,虽然约束学习过程使用分类器来发现λk 偏差系数,但是在构建 ML 模型时不需要使用相同的分类器。
系数学习过程包括四个不同的阶段:
- 评估人口统计约束,提供约束违反损失函数。
- 根据约束违反更新λk 系数,意味着尝试最小化损失函数。
- 计算每个训练样本的权重 wk。
- 用更新的权重重新训练分类器。
重复这些阶段,直到不再违反约束,这意味着数据集不再存在偏差。此时,计算的权重可用于模型构建阶段,每个训练样本基于其预期偏差接收不同的权重。
结果
在五个常见的 ML 偏差框架中使用逻辑回归测试了所提出的技术——银行营销(对直接营销活动的反应)、社区和犯罪(各种社区的犯罪率)、COMPAS(累犯)、德国 Statlog 信用数据(个人的信用风险)和成人(收入预测)。将结果与领先的预处理(“Unc”)进行比较),后期处理(“Cal。”)和拉格朗日(“Lagr。”)关于四个常见偏差指标的方法——人口统计均等(“Dem。标准杆。”),不同的影响(“Disp。小鬼。”),机会均等(“情商。Opp。”)和均衡赔率(“Eq。赔率”)。在大多数情况下,所提出的技术(“我们的……”)在牺牲很少准确性的情况下取得了最好的结果。没有其他技术是类似的准确和公正。
In each column, the “Err.” (left) represents the error of the unbiased classifier and the “Vio.” (right) is the numerical bias value. (Image: Jiang & Nachum)
研究人员还通过创建标签偏差在 MNIST 上测试了该技术,随机选择 20%的训练数据点,并将它们的标签更改为 2。然后,他们将数据输入算法,约束条件是“每个数字应该出现 10%的时间”,并将结果与预处理、后处理和拉格朗日方法进行比较。结果再次是所提出的无偏倚技术(“我们的方法”)的最高分:
Unconstrained = pre-processing method, Calibration = post-processing method (Image: Jiang & Nachum)
实施细节
该技术是用于偏差校正的通用框架,因此独立于任何软件平台或实现。自然地,增加一个体重发现阶段将会延长任何使用它的训练过程。
结论
在他们的偏差校正框架中,Jiang 和 Nachum 提出,在有偏差的数据集背后,可以假设一个隐藏的无偏数据集,并表明相应地重新加权有偏差的数据集可以在几种偏差减少技术中获得最佳结果。随着越来越多的最大似然算法涉及到我们的日常生活,预计偏差减少技术将变得越来越重要,并且看起来 Jiang 和 Nachum 技术现在是这种技术的新基准。
使用单词矢量化和 K-Means 聚类识别竞争对手
原文:https://towardsdatascience.com/identifying-competitors-using-word-vectorization-k-nearest-neighbors-412f1cea2506?source=collection_archive---------29-----------------------
面向小型企业的数据科学
构建一种算法来帮助小企业利用 Yelp 数据。
Yelp 为企业提供了丰富的信息来源,在分析相对于竞争对手的销售和服务表现时可以加以利用。利用这些数据是完全不同的事情。我想创造一种算法,让小企业相对容易地做到这一点。
在本帖中,我们将探讨如何使用分类标签,通过词汇矢量化和 k-means 聚类来确定企业最相关的竞争对手。为了便于说明,我们将使用纽约市我最喜欢的当地餐馆之一: Chano's Cantina 。使用 Yelp API ,我获得了阿斯托里亚墨西哥餐馆&酒吧的前 50 个搜索结果,并将它们保存到 dataframe 中。
我们的目标是确定 Chano's 与其竞争对手相比如何,确定餐厅做得好的地方和有待改进的地方。然而,试图将一家餐厅与 49 家潜在竞争对手进行比较可能会引入太多噪音,以至于很难提取出任何有意义的结果。相反,我们想找出 5-10 个在价格和产品供应方面与 Chano 最相似的竞争对手。我们如何找出哪些餐厅在这方面最相似?k-均值聚类!
数据选择
让我们看看 Chano 的 Yelp 页面,看看哪些信息可能最适合手头的任务。
https://www.yelp.com/biz/chanos-cantina-astoria
从上面,我们看到了一个带有两个美元符号的价格估计,以及几个关于鸡尾酒吧和新墨西哥美食的标签。很自然,我们希望将 Chano's 与类似的餐厅进行比较,因此我们希望找到标签和价格范围相同的餐厅。问题是大多数餐馆不会完全匹配,所以我们想尽可能接近。
如果我们回顾我们的 API 结果,我们会看到相关信息在列类别和价格中。请注意,我们没有使用评级变量,因为这将是我们以后的目标。让我们清除一些混乱,以便更好地理解我们正在处理的内容。
预处理
这里我们有 50 条记录,我们希望使用类别和价格数据将其减少到不到 10 条。两个问题:
- 类别是以字符串形式保存在内存中的字典列表。
- 用美元符号表示的价格,不容易被机器解释。
价格是更容易处理的问题:我们可以用一个表示美元符号数量的整数来代替这个值。然后我们可以用四舍五入到零位的平均价格来填充空值。
df.price.replace(to_replace = ['$', '$$', '$$$', '$$$$'],
value = [1, 2, 3, 4],
inplace = True)df.price.fillna(np.round(df.price.mean(), 0), inplace = True)
关于分类标签,我们需要 Python 将每个企业的字符串值作为代码读取,这样我们就可以分离出我们需要的信息。例如,Chano's Cantina 的类别保存为:
"[{'alias': 'cocktailbars', 'title': 'Cocktail Bars'}, {'alias': 'newmexican', 'title': 'New Mexican Cuisine'}]"
我们希望 Python 将这个字符串解释为字典列表,而不是将其作为字符串读取。幸运的是,通过使用抽象语法树库并调用 literal_eval 方法,然后将结果保存为变量,我们可以很容易地做到这一点。从这里开始,只需遍历每条记录,获取标题单词,删除标点符号,并将所有单词转换为小写。我们可以将这些结果与价格值结合起来,并将结果保存到一个名为标签的列中。代码以及 Chano 的相关输出如下。
import ast
import redf['tags'] = ''for ix in df.index:
*# Evaluate categories as code* cat = ast.literal_eval(df['categories'][ix])
*# Save tags as single string* words = ''
for tag in cat:
words += f"{tag['title']} "
*# Remove punctuation* words = re.sub(r'[^\w\s]', ' ', words)df.loc[ix, 'tags'] = ' '.join([words.lower(), str(int(df.loc[ix, 'price']))])OUTPUT:
'cocktail bars new mexican cuisine 2'
我们可以使用自然语言工具包(NLTK)将这些输出转换成单词标记列表。
from nltk import word_tokenize
df['tags'] = df['tags'].map(word_tokenize).valuesOUTPUT:
['cocktail', 'bars', 'new', 'mexican', 'cuisine', '2']
您可能会问自己,为什么我们不为类别创建虚拟变量。这种方法会是一种更直接的方式;然而,这也将导致对类别的解释是独特的离散。这种方法的问题是,诸如“墨西哥”和“新墨西哥美食”的标签非常相似。通过使用虚拟变量,我们会错过这种细微差别。为此,我们将使用单词表示的全局向量 (GloVe)来解释分类标签。
单词矢量化
如果你不熟悉的话,单词矢量化是一种在高维空间中用数字表示单词的方法。那是什么意思?好吧,假设我们想根据动物的毛绒绒程度和友好程度来比较它们,我们把它们放在 1-10 的范围内。一只博美犬可能因为非常蓬松而得到 10 分,因为非常友好而得到 9 分。(我妻子告诉我博美犬不是特别友好,但让我们假装它们是!)
另一方面,一只短吻鳄可能在两个评分中都得到 1 分。我们可以用图表直观地表示这些单词:
使用这些维度,我们可以将每种动物表示为一个向量,第一个值表示蓬松度,第二个值表示友好度。更重要的是,我们可以想象在这条线上的不同点可能存在其他动物。你能想到一种比短吻鳄更蓬松、更友好,但没有博美犬蓬松、友好的动物吗?狒狒怎么样?如果我们计算这两个向量的平均值,我们就能算出狒狒在图上的位置。我们可以用算法将这一过程表示如下:
pomeranian = np.array([10, 9])
alligator = np.array([1, 1])baboon = (pomeranian + alligator) / 2
baboonOUTPUT:
array([5.5, 5.])
输出表示在图表上放置狒狒的坐标。我们可以无限地扩展这个概念来描述各种各样的词,并理解它们之间的关系。面对如此无限的可能性,我们该从哪里开始呢?幸运的是,我们不必回答这个问题,因为斯坦福大学已经建立了一个模型,包含英语中 60 亿个单词的单词向量:这是 GloVe。每个单词都被表示为一个 50-300 维的向量,并且可以免费访问以用于您自己的模型。可以这里下载;请记住,该文件高达 822 兆字节。
用手套来代表单词
zip 文件包含四个以 UTF 8 格式编码的文本文件。每个文件包含相同的单词库,每行代表该单词的向量。文件之间的区别在于维数:50、100、200 和 300。出于我们的目的,我们将使用 50 个维度,因此我们首先将文件 glove.6B.50d.txt 保存到与 Jupyter 笔记本相同的路径。
将向量分配给唯一单词的过程非常简单。
- 创建一个在我们新创建的标签栏中使用的独特词汇列表。
- 从 GloVe 中获取代表每个单词的向量。
- 将结果保存为字典,使用单词作为键,向量作为值。
*# Get unique words* total_vocabulary = set(word.lower() for tag in df['tags'] for word in tag)def get_vectors(vocabulary):
*# Function to get vectors for words in vocabulary*
glove = {}
with open('glove.6B.50d.txt', 'rb') as f:
for line in f:
parts = line.split()
word = parts[0].decode('utf-8')
if word in vocabulary:
vector = np.array(parts[1:], dtype=np.float32)
glove[word] = vector
return gloveglove = get_vectors(total_vocabulary)
有了我们的相关向量字典,我们现在想将它们应用到每个企业的特定标签集,获得每个公司的平均向量。我们可以创建一个类来完成这项工作,使用 map 函数将它应用到 tags 列。
class W2vVectorizer(object):
def __init__(self, w2v):
*# Takes in a dictionary of words and vectors as input*
self.w2v = w2v
if len(w2v) == 0:
self.dimensions = 0
else:
self.dimensions = len(w2v[next(iter(glove))])
def fit(self, X, y):
return self
def transform(self, X):
*# Get mean value of vectors from a list of words*
return np.array([
np.mean([self.w2v[w] for w in words if w in self.w2v]
or [np.zeros(self.dimensions)], axis=0)
for words in X])
该类接受单词和向量的字典,并通过调用 transform 方法为任何单词列表提供平均向量。
不戴手套的话
超过 40 万个单词有 60 亿个代币,很难想象一个单词不会在手套中找到。然而,在这个例子中我们确实遇到了一种:腹足类。有趣的是,这个单词的单数形式是存在的,所以使用词干和词汇化是这个问题的第一个潜在解决方案。然而,在 NLTK 库中也没有找到这个单词。是时候发挥创造力了!
我的下一个想法是使用韦氏词典查找音节,但是没有。最简单的解决方案是为丢失的单词插入零向量,或者从所有标签中删除它,但是我不想丢失信息。相反,我们可以从韦氏词典获得字典定义,并应用与上面类似的方法获得单词定义的平均向量。
这个任务从使用美汤的一些网页抓取开始。作为下一篇文章的一部分,我们将更详细地讨论网络抓取这个话题,所以,现在,我将只向您展示从韦氏词典的网站上获取任何单词的定义的代码。
from nltk import word_tokenize
import requests
from bs4 import BeautifulSoup as bsdef get_definition(word):
*# Get webpage data for word definition* url = f'https://www.merriam-webster.com/dictionary/{word}'
r = requests.get(url)
*# Parse html* soup = bs(r.content, 'lxml')
definition = soup.find("span", {"class" : "dt"})
tag = definition.findChild()
definition = tag.find('strong').next_sibling.strip()
*# Clean text & return tokenized definition* clean_def = re.sub(r'[^\w\s]', ' ', definition)
return word_tokenize(clean_def)
有了这个函数,我们就可以搜索 GloVe 中没有的单词,获得标记化的定义,然后使用我们的 vector 类获得相关单词的近似向量。
*# Get tokenized definitions for words not in Glove* no_vectors = {}
for word in total_vocabulary:
if word not in glove.keys():
no_vectors[word] = get_definition(word)*# Add unique words from tokenized definitions to glove dictionary* for key in no_vectors.keys():
words_to_add = []
for word in no_vectors[key]:
if word not in list(glove.keys()):
words_to_add.append(word)
words_to_add = list(set(words_to_add))
new_vects = get_vectors(words_to_add)
glove.update(new_vects)*# Calculate vectors for missing words to glove* vectors = W2vVectorizer(glove)
for key in no_vectors.keys():
vect = vectors.transform(no_vectors[key])
**glove[key] = np.average(vect, axis=0)**
print(sorted(list(glove.keys())))OUTPUT:
['1', '2', '3', 'a', 'american', 'bar', 'bars', 'beer', 'breakfast', 'brunch', 'chicken', 'cocktail', 'coffee', 'cuisine', 'event', 'gastropubs', 'grocery', 'high', 'irish', 'italian', 'latin', 'lounges', 'meals', 'mex', 'mexican', 'new', 'of', 'offers', 'or', 'peruvian', 'plates', 'pub', 'pubs', 'quality', 'seafood', 'small', 'southern', 'spaces', 'spirits', 'sports', 'tacos', 'tapas', 'tavern', 'tea', 'tex', 'that', 'traditional', 'venues', 'wine', 'wings']
需要记住的一点是,向量的平均值返回高维空间中的值。但是,我们希望返回一个与所有其他单词形状相同的值,这由加粗的代码行处理。
随着我们所有的标签被正确地矢量化,我们现在可以继续进行聚类,以确定 Chano 的最直接的竞争对手。
k 均值聚类
有很多博客文章详细介绍了 k-means 聚类的无监督学习机制,所以我在这里不打算全部重复。主要要知道的是,k-means 聚类是一种无监督的学习方法,它根据数据点的相似程度对它们进行分组。
为了说明这一点,让我们回到短吻鳄和博美犬的比较。这一次,我们将在图表中添加一些其他动物。k-均值聚类的目的是识别一组随机动物的适当分组。
在这里,我们可以看到青蛙比鳄鱼友好一点,但一点也不蓬松。哈巴狗不如博美犬蓬松,但它更友好一些。然后还有蜜獾和狼蛛,有点蓬松,但不是特别友好。基于他们的分数,k-means 聚类旨在找出如何最好地对他们进行分组。
这个任务看起来很简单,但是如果我告诉你有必要把这些分成两组而不是三组呢?或者改为四组怎么样?我们可以想象,如果不知道最佳的组数,任务会变得更加复杂。
我们的目标是根据他们的 Yelp 标签和价格估计,找出 5-10 个与 Chano 最相似的竞争对手。对于本分析的其余部分,我们将重点关注 k-means 聚类的实现。尽管如此,如果你不熟悉算法的机制,我还是建议你看一看甲骨文的这篇简介。
寻找最佳的聚类数
有两种传统的方法来为 k-means 算法找到最佳的聚类数:
- 肘法
- 剪影法
对于每种方法,我们为一组组构建多个 k 均值算法,组的数量由字母 k 表示。在这种情况下,我们将设置 2 到 10 个组或集群。使用肘方法,该算法估计每个分类的中心,然后测量分类中每个点离中心的平均距离。取这些距离的平均值得到了误差平方的组内和(WCSS)。随着星团数量的增加,我们可以绘制 WCSS,寻找 WCSS 趋于平稳的点。
为了说明这一点,我们随机生成一组点来代表 100 种不同的[理论上的]动物,并绘制在下面。
我们可以看到有三个不同的集群。让我们为 2–10 个集群构建 k-means 算法,看看 WCSS 会发生什么。
我们可以看到,在 3 个星团中,WCSS 到达了一个山谷。直觉上这是有道理的,但是区别并不总是清晰的,使得解释有些主观。更重要的是,我们不希望每次运行算法时都必须进行视觉检查。相反,我们将使用剪影法。
剪影法
使用剪影方法,我们查看一个簇中的点之间的平均距离,这被称为内聚。这个数字与组间的平均距离进行比较,这是对间距的测量。用非常简单的术语来说,我们寻找分离和内聚之间的差异最大化的簇的数量。和肘法一样,我们可以画出这些点。
同样,我们可以看到最佳聚类数是 3,因为这是轮廓得分最大化的地方。然而,与 Elbow 方法不同,我们得到了一个清晰的最大值,可以很容易地通过编程来识别。
把所有的放在一起
有了手套向量和寻找最佳聚类数的方法,我们现在可以确定与 Chano 最相似的竞争对手。您可能已经从上面推断出,我们将需要多次实现该算法。幸运的是,这是这个过程中最简单的部分。
第一步:导入 K 均值算法。
*from sklearn.cluster import KMeans*
步骤 2:将标签转换为向量。
*vectors = W2vVectorizer(glove)
X = vectors.transform(df['tags'])*
第三步:找到最佳的聚类数。
*sil = []
kmax = 10for k in range(2, kmax+1):
kmeans = KMeans(n_clusters = k).fit(X)
labels = kmeans.labels_
sil.append(silhouette_score(X, labels, metric = 'euclidean'))
maxpos = sil.index(max(sil))
n_clusters = maxpos + 2*
步骤 4:分配组标签并保存到数据帧。
**# Divide into k groups using k-mean clustering* model = KMeans(n_clusters=n_clusters, init='k-means++',
max_iter=300, n_init=100)
model.fit(X)
*# Create group label column* df['group'] = list(model.labels_)*
第五步:筛选与 Chano 不在一个组的企业。
*group = df[df['name'] == "Chano's Cantina"]['group'].values[0]
new_df = df[df['group'] == group].reset_index(drop=True)*
步骤 6:对新的数据帧重复步骤 2 到 5,直到记录数少于 10。
结果:下面,我们可以看到 Chano's 及其主要竞争对手的基本数据。
后续步骤
既然我们已经正确地确定了 Chano 的主要竞争对手,我们就可以开始深入评论了。查看 review_count 列,我们可以看到我们有近 1000 条评论要解析,但是 Yelp API 对可以访问的评论数量有严格限制。要绕过这一点,需要使用漂亮的汤进行一些繁重的网络抓取,但这是另一天的主题。
通过机器学习识别 OpenStreetMap 覆盖中的缺口
原文:https://towardsdatascience.com/identifying-gaps-in-openstreetmap-coverage-through-machine-learning-257545c04330?source=collection_archive---------23-----------------------
本帖由 冉戈特 、新光科技、、GFDRR Labs/World Bank。
OpenStreetMap (OSM)是数字时代的奇迹之一:成立于 2004 年,它允许志愿者绘制大约 4200 万座建筑物和 100 万公里道路的地图——创造了一个在完整性和易用性方面往往超过官方地图的宝贵资源。
在很少情况下,完整的地图比备灾和救灾更重要。巴哈马的飓风道林只是最新的例子,救援机构依靠 OSM 的数据来了解受灾房屋、学校和诊所的位置。
但是我们如何评估 OSM 在给定区域覆盖的完整性呢?请继续阅读我们使用的关键步骤——以海地为例——以区分完全测绘的地区和额外测绘(例如通过众包活动)将带来最大收益的地区。
评估 OSM 完整性
麦吉尔大学最近的一项研究发现,OSM 拥有世界上大约 83%的街道和道路,但在治理薄弱和互联网接入较少的国家,覆盖差距更大。在本帖中,我们将特别关注构建足迹。
你已经可以使用人道主义 OpenStreetMap 团队的缺口检测地图,将 OSM 建筑的足迹与全球人类居住层进行比较。有了机器学习工作流,我们可以走得更远一点。我们将利用免费和开源的卫星数据,以更高的分辨率对 OSM 覆盖范围的缺口进行建模,评估模型的准确性,并预测地图绘制不足的区域。
1.获取和检查 OSM 数据
对于一个地区的 OSM 数据的探索性可视化,Python 库 OSMNx 是一个非常有价值的资源-它有助于精确调用 transition API,将您需要的数据段提取到笔记本环境中。
在下图中,我们展示了城市三个人口密集区的建筑足迹。这些平方英里地块的坐标是通过在谷歌地图上放一枚大头针选择的,卫星图像显示那里有密集的建筑覆盖。
显然,太子港的一些地区已经开展了大量的制图工作,但其他地区还没有。为了进行全面的分析,我们获取了整个海地的建筑足迹数据(使用诸如 GeoFabrik 这样的服务器)。
Python code: Download OSM building footprints for selected locations in Haiti
Building footprints: Three square mile plots for dense areas of Port-au-Prince (note differential coverage)
2.构建一组预测功能
一些地理空间层可能被证明可以预测建筑密度,特别是那些来自免费、公开获取的最新卫星图像的地理空间层。现有产品,如全球人类住区图层(GHSL)在描绘城市区域方面做得很好,但它们没有捕捉到自发布日期以来的任何变化-将实时卫星数据引入我们的工作流可以弥补这一点。
我们评估了几种遥感方法作为建筑物覆盖范围的潜在预测指标,包括:
夜间发出的光的强度(VI IRS);
源自 Sentinel-2 图像的植被和建筑区光谱指数(如 NDVI、NDBI、SAVI);
表面结构(基于 Sentinel-1 的合成孔径雷达数据);
海拔和坡度;
其他 OSM 衍生图层,包括道路交叉点的密度。
就像机器学习一样,更高质量的特征意味着更好的预测精度和更少的噪声。我们评估了 16 个预测要素,利用谷歌地球引擎(GEE)有效地创建和聚合遥感衍生层。下面的代码片段突出了 GEE 提供的便利和强大功能;在这里,我们引入了过去三年的 VIIRS 图像,这是一个高分辨率数据集,从 2012 年开始作为当地经济增长的替代物提供了巨大的好处,并绘制了整个海地的中值夜间照明强度。
Google Earth Engine code (Javascript): Median night-light intensity over Haiti, 2015–2018
3.创建培训和测试数据
我们将区域划分为网格(您可以使用 QGIS 来实现)。我们将单元格的大小设置为 500m500m,但是如果您愿意,也可以使用任何其他大小。我们的目标是根据预测值预测像元中 OSM 建筑物覆盖区的覆盖范围(覆盖区的总面积)。*
为了创建训练数据,我们手动标记网格单元,其中我们评估至少 75%的要完全绘制的建筑物(我们依靠高分辨率卫星图像作为此评估的基础层)。大约 1,600 个细胞被标记为完全映射。
然后,我们将这些细胞中的 70%作为训练数据,并将剩余部分作为测试数据——它在模型训练期间保持不可见。
Left: Complete cells are tagged to create training and test data; Right: Remote sensing layers such as night-lights intensity (pictured) serve as predictive features.
4.构建和评估模型
我们的训练数据包括我们判断接近完全 OSM 映射的区域上的大约 1,100 个像元(即,根据目测,至少 75%的建筑物出现在 OSM 上)。
多元线性回归分析表明,九个变量的综合效应可以解释一个单元中 OSM 建筑占地面积变化的 82%。这些变量加在一起的预测精度远远高于每个变量独立的预测精度:例如,仅使用世界定居足迹只能解释 62%的变异。
Model evaluation: actual vs. predicted building floorspace
使用随机森林算法,我们看到了更高的预测精度。该模型预测每个单元的 OSM 建筑占地面积的 89%的变化。模型中最重要的预测因子是全球城市足迹和世界住区足迹,其次是 NDBI、道路交汇点数量和 VIIRS 夜间照明。
产出:已确定的 OSM 差距
发现我们的模型足够有效后,我们将其应用于预测整个海地的 OSM 建筑足迹,以及预测将被完全映射但实际上未被 OSM 覆盖的标志单元。
海地的许多地区缺乏他们建筑的完整地图。检查太子港的预测,我们看到这些地图黑点与 OSM 覆盖密集、详细且相对完整的其他单元共存-考虑到许多发展中国家社区地图的间歇性,这可能并不奇怪,在这些国家,2010 年地震等紧急情况激发了人们的努力。
当住宅、学校、诊所和其他重要基础设施所在的区域没有被绘制成地图时,规划和应对极端事件就变得非常困难。但是一个简单的机器学习工作流程可以通过指出额外的地图绘制活动提供最大利益的区域来帮助通知众包工作。
致谢:感谢新光科技的珍妮·曼尼克斯和布拉德·博顿斯为这个项目做出的贡献。
识别特定于音乐流派的语言
原文:https://towardsdatascience.com/identifying-langauge-specific-to-a-musical-genre-58dc27bb74c3?source=collection_archive---------33-----------------------
"音乐是人类的通用语言." ― 亨利·沃兹沃斯·朗费罗
不管说什么语言,人类都有一种与他们所听的音乐建立联系,并通过他们创作的音乐与他人交流的天生能力。随着音乐的发展,我们已经开发出了通过口语和书面语谈论音乐的新方法。例如,音乐记谱法被作为一种以书面形式记录一段音乐的手段,这样任何熟悉这种记谱法的人都可以拿起它来演奏。
在现代社会,音乐变得更加容易理解和广泛传播,音乐风格也更加多样化。这种现象导致了基于流派对音乐进行分类的关注。在许多情况下,这些流派围绕它们发展出了完整的亚文化。一种特定音乐风格的粉丝可能会在更多方面认同这些亚文化,而不仅仅是他们选择听的音乐。他们可能穿着特定的时尚,经常去特定的场所,甚至发展出一种特定的方式来谈论他们喜欢的音乐。
人们通常用一些术语来描述音乐,但我想看看我是否能分析人们在特定流派中使用的语言的差异。为了做到这一点,我创建了一个机器学习模型,以测试计算机能够在多大程度上根据一个人正在使用的单词来确定他可能在谈论什么类型。作为案例研究,我选择了比较两种特定的流派:EDM 和 Rock。用于分析的数据来自 Reddit 上关于这两种类型的帖子。我从 subreddit r/EDM 中抽取了一组帖子,从 r/rock 中抽取了另一组帖子,以获取人们专门谈论这两种音乐的文本数据。这个项目的链接可以在这里找到。
这个过程的下一步是清理文本,以便可以正确处理它。因为这些是 Reddit 的帖子,里面有很多东西不是真正的单词,比如 YouTube 视频和播放列表的链接,所以这些必须被删除。因为单词本身是唯一相关的内容,所以所有的标点都被删除了。除了帖子本身的内容之外,我选择使用帖子的标题,因为对于这些特定的子主题,在许多情况下,标题和内容一样重要。
一旦文本都被适当地清理了,就该使用自然语言处理来分析文本了。我通过计数矢量器运行了所有帖子,它识别了帖子中所有独特的单词,并计算了每个单词在每个帖子中出现的次数。我还尝试了一种稍微不同的方法,使用 TF-IDF 矢量器处理该文本,它不是简单地计算所有单词,而是考虑包含该单词的帖子的数量。这些结果现在可以通过一个模型来运行,该模型能够预测一个给定的帖子来自两个子帖子中的哪一个。我还分析了同时出现的两个单词的任何组合,这有助于考虑单词的上下文,从而提高模型的性能。
我试用了几种型号,比较了一下,看看哪种性能最好。每个模型使用不同的算法根据帖子的内容将帖子分类为 r/EDM 或 r/rock。我选择比较的模型是朴素贝叶斯、逻辑回归、随机森林和 K-NN。每个模型都用计数矢量器和 TF-IDF 矢量器进行了测试。每个模型预测文章类型的准确度结果如下所示:
性能最好的模型是朴素贝叶斯,它在与 TF-IDF 矢量器一起使用时比与计数矢量器一起使用时表现更好。该模型能够正确预测近 90%帖子的类型,要么是 EDM,要么是 Rock。这表明,人们用来描述不同音乐流派的语言存在显著差异,足以让一个模型能够仅根据分析人们使用的词汇来区分这些方言。
我们甚至可以识别与特定风格高度相关的特定单词,这提供了一些关于哪些特定单词使每种风格独一无二的深刻见解。随着越来越多的人在谈论某种音乐时更频繁地使用这些词,他们开始围绕一种音乐流派塑造语言和文化。为了进行预测,我的模型会学习哪些单词是最重要的,并相应地对它们进行加权。为了确定最重要的词,我检查了哪些词在我的模型中权重最高,并找出了 EDM 和 rock 的前 15 名。
从上面的图表中可以看出,与某个流派联系最紧密的词符合你期望看到的行话。直观地说,这两种类型的第一个词就是类型本身的名字。对于摇滚流派,我们可以看到“乐队”这个词的排名几乎和“摇滚”一样高。这表明“乐队”这个词在人们谈论摇滚音乐时非常流行,这是有道理的,因为大多数摇滚艺术家都是乐队。我们会看到“吉他”或“金属”这样的词在这张图上排名靠前,这也是有道理的,因为摇滚通常涉及大量的吉他演奏,而金属是摇滚乐中一个受欢迎的子类别。
对于涉及 EDM 的最重要的词,我们可以看到类似的趋势。例如,像“混音”、“DJ”、“节日”和“下降”这样的词,出于不同的原因,都与电子音乐高度相关。大多数 EDM 艺人都是 DJ,这些 DJ 通常会将另一位艺人的歌曲进行混音。许多现场 EDM 活动是大型音乐节,歌曲通常围绕一个被称为“下降”的高潮部分我们对这些热门词汇了解得越多,我们就越能了解每种音乐风格的文化。
这个概念当然可以应用到其他流派,我希望能找到与上述每种流派相关的独特语言。人们确实以非常不同的方式谈论不同风格的音乐,在这个领域总有更多的东西可以探索。通过更多的数据和对我的清理和建模过程的微调,我相信我可以提高这个模型的准确性,甚至超过 90%,但这些结果仍然显示了自然语言处理在确定特定风格音乐周围的独特方言方面的有效性。我有兴趣在未来的其他音乐领域尝试一下,但我发现这是一个非常有趣的案例研究。我希望你也是!
使用随机森林算法识别传奇神奇宝贝
原文:https://towardsdatascience.com/identifying-legendary-pokémon-using-the-random-forest-algorithm-ed0904d07d64?source=collection_archive---------17-----------------------
okémon,一群可爱的动物和平地居住在一个星球上,直到人类出现并让它们互相争斗,以获得闪亮的徽章和自称为神奇宝贝大师的权利,听起来很疯狂,对吗?
在这个世界上,存在着一群稀有且往往强大的神奇宝贝,被称为传奇神奇宝贝。
Legendary Pokémon Mew
不幸的是,没有明确的标准来定义这些神奇宝贝。
识别传奇神奇宝贝的唯一方法是通过官方媒体的声明,如游戏或动漫。
这个问题突然出现在我的脑海里。
如果我们可以使用机器学习来识别传说中的神奇宝贝会怎么样?
为了回答这个问题,我们将使用随机森林算法。
随机森林
随机森林是一种灵活、易于使用的机器学习算法,即使没有超参数调整,也能产生很好的结果。
它是一个由许多决策树组合而成的集成分类器。它在随机数据子集上构建每棵树,这是一种被称为打包的技术。
集成分类器聚合每棵树的单个预测,并使用多数投票将它们组合起来以做出最终预测。
随机森林通常防止过度拟合并降低方差,由于其随机性(双关)。
Example Random Forest constructed from 2 trees
数据集
对于这个项目,我们将使用统计数据数据集口袋妖怪。
Pikachu
它包含 800 只神奇宝贝的数据,包括它们的名字、统计数据,最重要的是它们是否是传奇。
首先,让我们看看典型的神奇宝贝在数据集中是什么样的。
dataset = pd.read_csv("../input/Pokemon.csv")
# Display first row of dataset
dataset.head(1)
First row in dataset — Bulbasaur
神奇宝贝的类型表明它具有哪些属性(可能有一种或两种类型)。目前游戏中有 18 种类型,从火和水到龙和精灵。
与神奇宝贝相关的统计数据( stats )决定了游戏中战斗的各个方面。
例如,速度统计决定了神奇宝贝在战斗中的行动顺序,例如,速度较高的神奇宝贝通常会在速度较低的其他神奇宝贝之前先行动。
我们将使用类型和统计作为随机森林的输入,这些输入被称为特性。
一个热编码
接下来,所需的数据将被预处理成适合随机森林分类器的格式。大多数机器学习算法不能对标签值进行操作,而是需要输入数值。这是由于这些算法的有效实现,而不是苛刻的限制。
所以我们通常使用 一热编码 将这些标签值编码成二进制形式。
在这个数据集中,有两个特征需要编码:类型 1 和 类型 2。
Bulbasaur is a grass and poison type
如前所述,一个类型可以有 18 个不同的值。
一个热编码将把每种类型的特征转换成 18 个独立的特征,例如‘是草’,‘是毒’等等。
这些新特性中的每一个都将填充一个 1 或 0。
幸运的是,我们可以使用一个名为 get_dummies 的熊猫内置函数来执行编码。
dataset = pd.get_dummies(dataset)
Bulbasaur’s Type 1 is Grass
这种数据的二进制编码使模型能够更好地从数字上解释我们的数据,并更准确地进行预测。我们现在总共有 42 个特征被输入到算法中。
分成训练和测试数据集
对数据进行编码后,我们需要将数据划分为训练集和测试集。在此之前,回答以下问题会超级有帮助:
数据集中到底有多少传说中的神奇宝贝!?
Number of Legendary Pokemon in Dataset
从上面我们可以看到,数据内有 65 个传说中的神奇宝贝,只占数据集的 7%!
这种数据的不平衡在训练我们的森林时不会有帮助,因为它会导致过度拟合。
过度拟合是指我们的模型不能很好地从训练数据归纳到看不见的数据。这是因为数据中特定类别的过度表示,从而使模型更难学习数据中的潜在信号。
为了解决这个问题,我使用了两种常用的统计方法来减少不平衡:
- 多数类的欠采样(正常神奇宝贝)
- 小众类的过采样(传说中的神奇宝贝)
欠采样普通口袋妖怪
为了对多数类进行欠采样,我将数据集中普通神奇宝贝的数量减少到了 100 个。
然后我在数据集上应用了一个 70/30 列车测试分割。x
是每个神奇宝贝的特征,y
是相应的真相标签(如果是传奇,则为真)。
X_train, X_test, y_train, y_test = train_test_split(x,y, random_state = 47, test_size = 0.30)
使用 SMOTE 对传奇神奇宝贝进行过采样
为了对传说中的神奇宝贝进行过采样,我使用了 SMOTE 算法(这里用很好地解释了)。
SMOTE 算法能够通过使用现有的示例数据来合成新的传奇神奇宝贝。这意味着我们可以增加训练数据中传奇的数量,在训练数据中产生 1.0 的比率!
from imblearn.over_sampling import SMOTEsm = SMOTE(random_state=12, sampling_strategy= = 1.0)X_train_res, y_train_res = sm.fit_sample(X_train, y_train)
这种过采样技术只有应用于训练集,以防止测试数据流入 SMOTE 算法。这确保了该模型在尚未用于创建合成数据的数据上得到验证。
训练随机森林
有了训练数据,我们现在可以建立我们的森林了!
from sklearn.ensemble import RandomForestClassifiermodel = RandomForestClassifier(n_estimators=100,max_depth=7)model.fit(training_data,training_labels)
n_estimators
参数决定了林中使用的决策树的数量。森林中每棵树的max_depth
被设置为 7 级,主要是为了可视化的目的。我们不想看巨大的树!
估价
那么,森林如何处理这些数据呢?
Accuracy Score on train data: 0.99
Accuracy Score on test data: 0.96
我们可以看到森林在测试数据上达到了 96% 的准确率简直牛逼!这表明森林已经避免了过度适应,并且能够很好地概括看不见的例子!
特征重要性
由于决策树的贪婪本性,它们能够在分类时突出哪些特征是重要的决定因素,这被称为特征选择。
这将有助于我们理解在决定神奇宝贝传奇的过程中,哪些特征相对重要。
Sk-learn 有一个被称为[feature_importances_](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.feature_importances_)
的简洁功能,它可以通过查看该功能平均降低森林熵的程度来衡量该功能的重要性。它对结果进行缩放,使所有重要度之和等于 1。
得分最高的功能如下所示。
Top 10 Important Features
有趣的是,似乎最具决定性的特征是 Total ( 所有基础统计的总和)。
传说中的神奇宝贝通常比普通的神奇宝贝更强大,所以总属性是传说中地位的一个重要指标是有道理的。
此外,我们可以看到重要性值从总体到次要特征快速下降。这向我们表明,某些特征,如类型实际上并没有给我们多少识别传奇口袋妖怪的信息。(Type 1_Bug 只降低熵 0.6%的时候!)
所以它们可能会被从我们的数据集中删除,因为它们只是噪音。
让我们想象一棵森林中的随机树,看看它是如何利用这些特征进行预测的!
Random tree from the forest
在这个特殊的树中,总数、攻击和防御统计被用作决定因素。我们可以看到,这棵树已经学会了避免将总数高而攻防低的口袋妖怪错误归类为传奇,这很酷!
结论
在这篇文章中,我们了解到,我们可以仅使用统计数据来准确识别传奇神奇宝贝!
神奇宝贝的世界里没有太多的传奇故事,不幸的是,这意味着我们可以利用的数据更少了。然而,随着时间的推移和传奇数量的增加,这也意味着传奇的标准可能会发生变化。所以某些特性的重要性也必然会改变!
随机森林工作起来很有趣,但是由于它们的大小,很难可视化和分析。尽管如此,使用森林的features_importances_
属性让我们从数据中掌握了什么是传奇神奇宝贝的有用指标。
感谢您的阅读!我希望这篇文章已经向您展示了如何将 ML 应用于最牵强的问题。如果你有什么问题或者只是想聊聊天,就在下面留言评论吧!
我的 python 笔记本可以在这里找到
下次再见:)
Photo by Kamil S on Unsplash
用 R 确定英国围产期精神健康指标的地区差异
原文:https://towardsdatascience.com/identifying-regional-differences-in-perinatal-mental-health-indicators-in-the-uk-with-r-1e8a8f1e7fb0?source=collection_archive---------14-----------------------
fingertipsR 包提供了一个简单的接口来访问指尖 API。该库包含由英国公共卫生部管理的大量公共卫生指标。
我将重点关注与围产期心理健康相关的数据,因为我们的实验室对早期逆境的表观遗传嵌入(以及其他方面)感兴趣。围产期心理健康问题发生在怀孕期间或孩子出生后的第一年。多达 20%的女性患有围产期精神疾病。围产期心理健康问题也会对儿童的情感、社交和认知发展产生长期影响。如果不进行治疗,它会对妇女及其家庭产生重大而持久的影响。
我认为在监测指标上使用主成分分析和中等量分割来识别区域差异会很有意思,这可以为这些区域的控制提供改进(就像对 TB 所做的那样)。
# load the needs package to load a bunch of libraries quickly (or install them if you don't already have them)
library(needs)needs(purrr,
dplyr,
tibble,
fingertipsR,
tidyr,
magrittr,
FactoMineR,
impute,
DT,
broom,
stringr,
skimr,
cluster,
ggplot2,
ggfortify,
viridis,
hrbrthemes,
ggthemes,
cluster,
maptools,
gpclib
)
让我们看看指尖 API 中有什么
profiles() 功能用于搜索 profiles —与特定疾病或风险因素相关的指标。
profs <- profiles()
DT::datatable(profs, rownames= FALSE)
如前所述,我对围产期心理健康感兴趣,所以我会选择这些档案。
sel_profs <- profs[grepl("Perinatal Mental Health", profs$ProfileName),]
DT::datatable(sel_profs, rownames = FALSE)
有四个领域与围产期心理健康相关。在这些领域中,有许多在不同时期、不同地域、不同性别、不同年龄段等出现的指标。
peri_inds <- indicators(ProfileID = sel_profs$ProfileID)
DT::datatable(peri_inds, rownames= FALSE)
这给了我们 49 围产期心理健康指标,我们现在可以使用指尖 _ 数据()函数结合调用 purrr::map() 来提取这些指标。
peri_df <- peri_inds$IndicatorID %>% map(~fingertips_data(IndicatorID = .))
这导致 49 不稳定;但是,许多是空的,需要删除。
我将对这 49 个指标使用降维(PCA)和聚类(PAM)来生成具有类似围产期心理健康指标特征的县的聚类。这可能有助于确定区域差异,并可能有助于改进研究和控制工作的未来框架。
我将从风险&相关因素领域中选择抑郁症:%记录患病率(18 岁以上)作为所有其他指标匹配的关键指标。下面的代码在县一级提取这些数据,将值变量重新编码为最近的发病率,并提取病例的总体发病率。我过滤掉缺失的数据,并调整时间段来代表每个滚动平均值的最后一年。
peri_inc <- as_tibble(peri_df[[10]]) %>%
dplyr::filter(AreaType %in% "County & UA") %>%
dplyr::select(AreaName, Timeperiod, rec_inc_rate = Value) %>%
mutate(Timeperiod = Timeperiod %>%
str_split("/") %>%
map_chr(first) %>%
as.numeric() %>%
{. + 2} %>%
as.character())peri_df_extraction <- function(peri_df, var_name, area_type = "County & UA") {
df <- peri_df %>%
filter(AreaType %in% area_type) %>%
dplyr::select(AreaName, Value, Timeperiod) %>%
rename_at(.vars = vars(Value), funs(paste0(var_name)))
return(df)
}var_names <- c("fertility_rate",
"booking_under_20",
"reproductive_age",
"non_UK",
"birth_under_20",
"booking_over_40",
"booking_BAME",
"poverty",
"IDACI",
"homelessness",
"contraceptions_under_18",
"single_parent",
"sever_mental_illness",
"drug_treatment",
"alcohol_treatment",
"child_protection",
"child_in_need",
"infant_mortality",
"child_looked_after",
"sole_birth",
"complex_social_factors",
"multiparity",
"caesarean",
"preterm",
"stillbirth",
"abuse",
"skin_contact",
"distress_lb",
"distress_ub",
"mild_depressive_lb",
"mild_depressive_ub",
"chronic_SMI",
"postpartum_psychosis",
"PTSD",
"severe_depressive",
"booking_detection",
"booking_substance",
"booking_support",
"booking_alcohol",
"booking_complex_social_factors",
"booking_early",
"less_14_days",
"review_8_weeks",
"review_12_months",
"antenatal_MH_detection",
"postnatal_MH_detection",
"postnatal_emotional_change",
"postnatal_MH_support"
)extracted_tb <- map2(peri_df[-10], var_names, ~peri_df_extraction(.x, .y)) %>%
reduce(full_join, by = c("AreaName", "Timeperiod"))com_peri_df <- peri_inc %>%
left_join(extracted_tb, by = c("AreaName", "Timeperiod")) %>%
mutate(year = Timeperiod %>% as.numeric) %>%
mutate_if(is.character, as.factor) %>%
dplyr::select(-Timeperiod)skimr::skim(com_peri_df)
我们需要检查数据的完整性:
get_frac_missing <- function(df) {
df %>%
nest() %>%
mutate(missing = map(data,~map_dfr(. ,~sum(is.na(.))/length(.)))) %>%
dplyr::select(-data) %>%
unnest(missing)
}## Get the proportion missing per variableby year
peri_miss_per_year <- com_peri_df %>%
group_by(year) %>%
get_frac_missing %>%
mutate_all(~round(., 2)) %>%
arrange(year)## Drop full missing variables
peri_partial_miss_year <- peri_miss_per_year %>%
select_if(~!sum(.) == length(.))## Full missing variables
com_miss_vars <- setdiff(names(peri_miss_per_year), names(peri_partial_miss_year))## Which year has the most complete data
peri_complete_years_all_vars <- com_peri_df %>%
group_by(year) %>%
nest() %>%
mutate(missing = map(data,~mean(colSums(is.na(.))/nrow(.)))) %>%
dplyr::select(-data) %>%
unnest(missing) %>%
mutate(missing = round(missing, 2)) %>%
arrange(year)DT::datatable(peri_complete_years_all_vars, rownames = FALSE)
通常我会用最新的可用数据;然而,在这种情况下,它是相当稀疏的,所以让我们看看来自 2015 年的数据。
peri_df_2015 <- janitor::remove_empty(com_peri_df) %>%
filter(year == 2015) %>%
filter(rec_inc_rate > 7.39) %>%
select(-year)DT::datatable(peri_df_2015, rownames = FALSE)
这给我们留下了 2015 年以来 38 个县的 8 个孕产妇心理健康指标的整洁数据集。
降维
我们现在准备对数据进行一些聚类分析。第一步是使用 PCA 降低数据的维数。我们使用 FactoMineR 包中的 estim_ncp 函数(该函数使用本文中概述的方法)来估计所需的主要组件的数量。然后,我们执行主成分分析,并绘制每个成分解释的方差,作为对 estim_ncp 的检查。以下所有分析都是使用嵌套 tibbles 完成的,因此可以很容易地推广到更高维的用例。
让我们使用 estim_ncp 函数计算主成分的最佳数量,使用 prcomp 函数执行 PCA,并绘制每个成分解释的方差,作为对 estim_ncp 的检查。
df <- as.data.frame(peri_df_2015)
FactoMineR::estim_ncp(df[2:9], ncp.min = 2, ncp.max = 10)
组件的最佳数量为 4。
peri_pca <- peri_df_2015 %>%
nest() %>%
mutate(
numeric_data = map(data, ~select_if(., is.numeric) %>%
as.data.frame()),
optimal_pca_no = map(numeric_data, ~estim_ncp(.,
scale = TRUE,
ncp.min = 2,
ncp.max = 6)) %>%
map_dbl(~.$ncp),
pca = map(numeric_data, ~prcomp(.x,
center = TRUE,
scale = TRUE)),
pca_data = map(pca, ~.$x),
pca_aug = map2(pca, data, ~augment(.x, data = .y)))## Variance explained
var_exp <- peri_pca %>%
dplyr::select(-optimal_pca_no) %>%
unnest(pca_aug) %>%
summarize_at(.vars = vars(contains("PC")), .funs = funs(var)) %>%
gather(key = pc, value = variance) %>%
mutate(var_exp = variance/sum(variance) * 100,
cum_var_exp = cumsum(var_exp),
pc = str_replace(pc, ".fitted", "") %>%
str_replace("PC", ""))## Plot variance explained
var_exp %>%
rename(
`Variance Explained` = var_exp,
`Cumulative Variance Explained` = cum_var_exp
) %>%
gather(key = key, value = value, `Variance Explained`, `Cumulative Variance Explained`) %>%
mutate(key = key %>%
factor(levels = c("Variance Explained",
"Cumulative Variance Explained"))) %>%
mutate(value = value / 100) %>%
mutate(pc = factor(pc, levels = as.character(1:max(var_exp$pc %>% as.numeric)))) %>%
ggplot(aes(pc, value, group = key)) +
geom_point(size = 2, alpha = 0.8) +
geom_line(size = 1.1, alpha = 0.6) +
facet_wrap(~key, scales = "free_y") +
theme_bw() +
labs(
title = "Variance Explained by Principal Component",
subtitle = paste0("The optimal number of principal components suggested by estim_ncp was ",
peri_pca$optimal_pca_no, " which explains ", round(var_exp$cum_var_exp[[2]], 0), "% of the data."),
x = "Principal Component",
y = "Variance Explained (%)",
caption = "[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)"
)
## Perform pam on pca data 1 to 6 groups
peri_pca_pam <- peri_pca %>%
mutate(centers = list(2:10)) %>%
unnest(centers, .preserve = everything()) %>%
dplyr::select(-centers, centers = centers1) %>%
group_by(centers) %>%
mutate(
pam = map(pca_data,
~ pam(x = .x[, 1:optimal_pca_no], k = centers, stand = TRUE)),
clusters = map(pam, ~.$clustering),
avg_silhouette_width = map(pam, ~.$silinfo$avg.width),
data_with_clusters = map2(.x = data, .y = clusters, ~mutate(.x, cluster = factor(.y, ordered = TRUE)))
) %>%
ungroup## Get max silhouette width
max_silhouette_width <- peri_pca_pam %>%
dplyr::select(centers, avg_silhouette_width) %>%
unnest(avg_silhouette_width) %>%
arrange(desc(avg_silhouette_width)) %>%
slice(1)
## Plot average silhouette width
peri_pca_pam %>%
dplyr::select(centers, avg_silhouette_width) %>%
unnest(avg_silhouette_width) %>%
ggplot(aes(x = centers, y = avg_silhouette_width)) +
geom_line(size = 2, alpha = 0.4) +
geom_point(size = 3, alpha = 0.8) +
theme_bw() +
scale_x_continuous(breaks = seq(1, 10, 1), minor_breaks = NULL) +
scale_y_continuous(limits = c(NA, NA), breaks = seq(0, 1, 0.01), minor_breaks = NULL) +
labs(title = "Average Silhouette Width by Number of PAM Clusters",
subtitle = paste0("The optimal number of clusters identifed by avg. silhouette width was ",
max_silhouette_width$centers,
" with an avg. silhouette width of ",
round(max_silhouette_width$avg_silhouette_width, 2)
),
x = "Clusters",
y = "Avg. Silhouette Width",
caption = "[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)")
## Plot clusters
pca_plot <- peri_pca_pam %>%
filter(centers == max_silhouette_width$centers) %>%
select(data_with_clusters, pca) %>%
mutate(pca_graph = map2(.x = pca,
.y = data_with_clusters,
~ autoplot(.x, x = 1, y = 2,
loadings = TRUE, loadings.label = TRUE,
loadings.label.repel = TRUE,
loadings.label.size = 2, loadings.alpha = 0.8,
loadings.label.vjust = -1, data = .y,
label = TRUE, label.label = "AreaName",
label.size = 1.5, label.vjust = -1,
alpha = 0.3, frame = TRUE,
frame.type = 'convex', frame.alpha= 0.05,
colour = "cluster", size = "rec_inc_rate") +
theme_bw() +
labs(x = paste0("Principal Component 1 (Variance Explained: ",
round(var_exp$var_exp[[1]], 1), "%)"),
y = paste0("Principal Component 2 (Variance Explained: ",
round(var_exp$var_exp[[2]], 1), "%)")) +
guides(colour=guide_legend(title = "Cluster", ncol = 2),
fill=guide_legend(title= "Cluster", ncol = 2),
size = guide_legend(title = "Depression: % recorded prevalence",
ncol = 2)) +
scale_color_manual(name = "Cluster",
values = c("#6b5b95",
"#feb236",
"#d64161",
"#ff7b25",
"#87bdd8")) +
scale_fill_manual(name = "Cluster",
values = c("#6b5b95",
"#feb236",
"#d64161",
"#ff7b25",
"#87bdd8")) +
theme(legend.position = "bottom",
legend.box = "horizontal") +
labs(
title = "Maternal Mental Health in England",
subtitle = "The arrows are variable loadings and points are counties coloured by cluster membership",
caption = "[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)"
)
)) %>%
pull(pca_graph) %>%
firstpca_plot
sum_peri_df <- peri_pca_pam %>%
filter(centers == max_silhouette_width$centers) %>%
pull(data_with_clusters) %>%
map(~ gather(., key = "Variable", value = "value", -AreaName, -cluster)) %>%
first %>%
rename(Cluster = cluster)plot_cluster_diff <- sum_peri_df %>%
ggplot(aes(x = Variable, y = value, col = Cluster, fill = Cluster)) +
geom_violin(draw_quantiles = c(0.025, 0.5, 0.975), alpha = 0.2, scale = "width") +
geom_jitter(position = position_jitterdodge(), alpha = 0.3) +
coord_flip() +
theme_minimal() +
scale_y_continuous(breaks = seq(0, 100, 6), minor_breaks = NULL) +
scale_fill_manual(name = "Cluster",
values = c("#6b5b95",
"#feb236",
"#d64161",
"#ff7b25",
"#87bdd8")) +
scale_color_manual(name = "Cluster",
values = c("#6b5b95",
"#feb236",
"#d64161",
"#ff7b25",
"#87bdd8")) +
theme(legend.position = "bottom") +
labs(
title = "Maternal Mental Health in England; Summarised by Cluster",
subtitle = "Violin plots are scaled by width, with the 2.5%, 50% and 97.5% quantiles shown.",
x = "Variable",
y = "Recorded % depression prevalance (aged 18+) for rec_int_rate, otherwise proportion (0-100%)",
caption = "[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)")plot_cluster_diff
从这些图中,我们看到,显示较高近期增长率的第三组有较高比例的产后精神病、轻度抑郁和苦恼。
我们可以在地图上用英国数据服务提供的英国各县的轮廓来绘制每个县的聚类成员关系(在此下载 ShapeFiles,在此下载)。
peri_cluster_map <- function(peri_pca_pam) {
gpclibPermit()england_counties <- rgdal::readOGR("england_ct_2011.shp") %>%
fortify(region = "code") %>%
as_tibbleengland_urban_areas <- rgdal::readOGR("england_urb_2001.shp") %>%
fortify(region = "name") %>%
as_tibble %>%
filter(id %in% c("Sheffield Urban Area",
"Plymouth",
"Skelton (Redcar and Cleveland)",
"Brighton/Worthing/Littlehampton",
"Leicester Urban Area"
))## Make custom positions for urban area labels
urban_area_labels <- england_urban_areas %>%
group_by(id) %>%
slice(100) %>%
ungroup() %>%
mutate(long = long - 200000,
lat = lat + 20000)
peri_cluster_results <- peri_pca_pam %>%
filter(centers == max_silhouette_width$centers) %>%
pull(data_with_clusters) %>%
firstperi_cluster_results <- peri_df[[14]] %>%
dplyr::select(AreaName, AreaCode, AreaType) %>%
filter(AreaType %in% "County & UA") %>%
unique %>%
left_join(peri_cluster_results,
by = "AreaName") %>%
left_join(england_counties, by = c("AreaCode" = "id"))peri_cluster_results %>%
rename(Cluster = cluster) %>%
drop_na(Cluster) %>%
dplyr::select(long, lat, Cluster, group) %>%
ggplot(
aes(x = long,
y = lat,
fill = Cluster)) +
geom_polygon(data = england_urban_areas,
aes(group = group, fill = NULL),
alpha = 0.4) +
geom_path(data = peri_cluster_results,
aes(group = group, fill = NULL),
alpha = 0.4) +
geom_polygon(data = peri_cluster_results,
aes(group = group, fill = NULL),
alpha = 0.1) +
geom_polygon(aes(group = group), alpha = 0.6) +
geom_line(data = urban_area_labels %>%
bind_rows(urban_area_labels %>%
mutate(long = long + 200000,
lat = lat - 20000)),
aes(fill = NA, group = id), alpha = 0.8) +
geom_label(data = urban_area_labels,
aes(label = id), fill = "grey") +
scale_fill_manual(name = "Cluster",
values = c("#6b5b95",
"#feb236",
"#d64161",
"#ff7b25",
"#87bdd8")) +
coord_equal() +
theme_map() +
theme(legend.position = "bottom") +
labs(title = "Maternal Mental Health Indicators; Map of County Level Clusters in England",
subtitle = "Using data from 2015",
caption = "Selected urban areas are shown (dark grey) and labelled.
[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)
Contains National Statistics data © Crown copyright and database right 2019\.
Contains OS data © Crown copyright and database right 2019")
}plot_peri_cluster_map <- peri_cluster_map(peri_pca_pam)plot_peri_cluster_map
用掩蔽 R-CNN 模型识别低分辨率图像上的屋顶
原文:https://towardsdatascience.com/identifying-rooftops-on-low-resolution-images-with-masked-r-cnn-model-6edd79310ec0?source=collection_archive---------25-----------------------
工作由 传承巴胡古纳*拉西卡乔希 完成。*
在我之前的帖子中,我写了我们如何使用 U-Net 模型来识别低分辨率卫星图像中的屋顶。我还写了我们如何利用一个 ML 爱好者社区来构建解决方案。在这篇文章中,我将分享另一个模型的结果,即掩蔽 R-CNN。如果你想了解更多关于我们正在解决的问题,请阅读机器学习如何在清洁能源领域带来一个新时代。
由于来自印度(和大多数发展中国家)的卫星图像的质量是低分辨率的,手头的任务的复杂性增加了。类似的解决方案如谷歌天窗项目只适用于高分辨率图像,不适用于大多数发展中国家。
面具 R-CNN 是由脸书人工智能研究小组制造的。Mask R-CNN 的工作原理相当简单。研究人员将两个先前存在的模型结合在一起,并对线性代数进行了研究。该模型可以分为两部分——区域建议网络(RPN)和二值掩码分类器。第一步是获得一组可能包含相关对象的边界框。第二步是给盒子上色。
我们使用该模型的目的是分割或分离图像中的每个屋顶实例。
Example of outputs we want
我们的挑战始于缺乏数据,因为没有屋顶数据集。
我们使用在“coco”数据集上训练的来自 Mask R-CNN 网络的权重作为我们模型的起点,该数据集最初被训练来识别 80 个类,但是没有屋顶。Resnet 101 被用作主干结构。我们开始为“头”层训练我们的模型,即网络的 RPN、分类器和掩码头;因为训练整个网络将需要大量的数据,并且因为它是在许多不同的类上预先训练的模型,所以这将是一个好的开始。然后,为了查看它在预测中产生的差异,我们将培训提升到 Resnet 101 体系结构的第 4 和第 5 阶段。
我们也尝试了不同的变化。图像大小从 1024X1024 更改为 320X320,因为我们的训练图像大小为 300X300,而填充将其增加到 1024 似乎不是一个好主意。
Multiple models that we used with changing image size and processing
下面是一些输入图像的结果。
Original Image (1)
我们比较了另外 20 个屋顶的结果,我们的结果显示模型 4 通常表现最好。
然后,我们尝试将最小检测置信度阈值从 0.9 更改为 0.7。低于该值的感兴趣区域(ROI)将被跳过。这样做是因为对于检测屋顶来说,0.9 似乎是一个非常高的阈值,当它可以被降低到足以预测任何区域作为屋顶时,因为屋顶不是复杂的,定义良好的和非常具体的区域;因此,任何地区,可以成为一个很好的候选屋顶应予以考虑。值为 0.7 时,我们有更多的区域,但它也显示了许多重叠的屋顶区域,而值为 0.9 时,我们有几个大斑点将所有相邻的屋顶作为一个区域。
Detection confidence 0.7
Detection confidence 0.9
除此之外,我们试图通过将优化器从随机梯度下降(SGD)改为 Adam 优化器来训练模型。
以下是使用 SGD 和 Adam optimizer 训练的模型的结果图像。训练是有 70%和 90%的把握完成的。对每个训练好的模型进行 70%和 90%置信度的测试。
Adam Optimizer 0.7 threshold
SGD 0.7 threshold
Adam Optimizer threshold 0.7
SGD threshold 0.7
我们的发现:
1.与 SGD 训练模型相比,Adam optimizer 训练模型无法预测所有实例,也无法区分相邻屋顶。
2.SGD 训练的模型比 Adam 训练的模型预测更清晰的遮罩。这表明 SGD 对我们的模型更好,我们将继续使用它。
关于 SGD 变化:
1.以 70%的置信度训练模型增加了遮罩的数量,因为它已经被训练为也考虑低概率屋顶,这导致重叠遮罩。而 90%的训练是给更干净更少的面具。所以,用 90%训练似乎是更好的选择。
2.现在,用 70%的置信度还是 90%的置信度来预测口罩?90%太精确,可能会删除其他选项,而 70%将包括它们,如图 4 和 7 所示。因此,在训练了更多数量的图像(目前训练了超过 95 张图像)之后,我们将能够看到哪一张能够最终被使用。
作为识别各个屋顶的最后一步,我们做了一些后期处理。我们从奇怪的彩色形状中创造出规则的形状。在 607 幅图像的数据集上进行后处理。
Output from Masked R-CNN
Individual rooftops
**
最后,我们还要感谢 Paul 和 Piyush 提供了培训数据。如果有人想进一步帮助我们,请加入我们的 git repo 或联系 rudradeb@savera.ai
确定纽约曼哈顿对狗最友好的社区
原文:https://towardsdatascience.com/identifying-the-most-dog-friendly-neighborhoods-in-manhattan-new-york-city-732080688353?source=collection_archive---------24-----------------------
介绍
无论你是狗主人还是狗护理行业的企业,确定城市中对狗友好的地点始终是一项重要的任务。在世界各地的大都市中,纽约市(NYC)被认为是对狗最友好的城市之一,它有许多公园、狗场和适合散步的社区。根据纽约市政府的在线数据平台纽约开放数据(New York Open Data)的数据,截至 2019 年 7 月 26 日,该市有 345,727 只狗拥有有效的许可证。这份报告旨在确定曼哈顿对狗最友好的社区,这是纽约市狗最密集的一个区。
A heat map of New York’s dog population per capita by Nate Rattner showing that Manhattan is the most dog-dense borough in New York City
目标
这份报告评估了曼哈顿社区的友好程度,从而为这个大都市的狗主人和狗护理企业确定了最佳社区。为此,我们主要集中分析曼哈顿社区养狗所需的公共设施的可用性,即公园、狗场和宠物设施。这份报告的发现将为纽约市,尤其是曼哈顿的狗主人和狗护理行业的企业提供有用的信息来源。
数据
为了实现其目标,该报告使用了以下数据:
·纽约大学的纽约市社区列表,包含 5 个区的 306 个社区:https://geo.nyu.edu/catalog/nyu_2451_34572。
使用 Python 地理编码包
获得每个社区的经度和纬度;使用 Foursquare API 获得每个社区的场地数据。特别是,Foursquare API 提供了基于位置的体验,提供了关于地点、用户、照片和签到的各种信息。它支持实时访问地点,将用户分配到特定位置。
方法学
首先,我们需要创建一个数据框,其中包含曼哈顿所有街区的完整列表及其坐标纬度和经度。此步骤需要:
从纽约大学的空间数据存储库中加载 2014 年纽约市街区名称数据集,并将其转换为 panda 数据框。
使用 Geocoder 检索每个街区的经度和纬度,这是一个允许我们将位置地址转换为地理坐标的包。
下一步,我们将使用 Foursquare API 探索曼哈顿附近的场地位置。Foursquare API 是一种社交定位服务,允许用户探索他们周围的世界。有了 Foursquare 开发人员帐户,我们可以使用我们的用户凭证来搜索附近特定类型的场馆,探索特定的场馆,以及搜索某个位置周围的热门场馆。
出于这个项目的目的,我们将主要关注公共公园和遛狗场,这两个设施对于任何一个对狗友好的社区都是必不可少的。使用 Foursquare API,我们可以很容易地在曼哈顿的各个街区检查公园和狗跑的出现频率的平均值。从这里开始,我们评估曼哈顿社区对狗友好程度的任务可以归结为找出公园和狗赛跑出现频率最高的社区。为了使结果在视觉上引人入胜,我们还会将邻域分组,并为每个分组分配颜色和标签。这一步将通过采用 k-means 聚类来完成,k-means 聚类是最简单和最流行的无监督机器学习算法之一,它将数据点分组到以质心为中心的最近的聚类中。
最终结果将是代表曼哈顿公园和狗群不同聚集程度的彩色编码地图。
结果和观察
我们的数据分析显示,曼哈顿公园最集中的 3 个街区是:
·斯图文森镇
·巴特利公园市
·晨边高地
Manhattan’s neighborhoods with the highest concentration of parks
A Map of Stuyvesant Town showing that the neighborhood has plenty of parks and open spaces
A map of Manhattan showing clusters of neighborhood by the concentration of parks
值得注意的是,对公园最集中的社区 Stuyvesant Town 的场馆的进一步检查表明,在该社区 1 公里范围内的 30 个顶级场馆中,不仅有各种公园,还有一条小径、一个风景了望台、一家宠物咖啡馆甚至一家宠物服务店!这表明 Stuyvesant 镇确实是一个有各种选择或享受活跃的狗的社区。
关于狗跑,以下 3 个街区是最集中的区域:
Maps of Roosevelt Island showing that the neighborhood has plenty of parks and open spaces
对罗斯福岛附近热门场馆的进一步调查还显示,该岛附近 30 个顶级场馆中有 7 个是开放空间,包括 4 个公园、一个观景台、一个休闲公园和一个滨水区!在像纽约这样的混凝土丛林中,狗友好型社区是多么好的选择啊!
Map of Manhattan showing clusters of neighborhoods by the concentration of dog runs
讨论
有趣的是,在我们的分析中,炮台公园城是第二个最集中的公园社区,也被美国房地产市场 Street Easy 选为 2017 年纽约市对狗最友好的社区。Street Easy 的分析是基于每个社区的以下关键变量:(1)宠物友好型租赁单元的份额(2)狗保姆的份额(3)狗公园、狗跑道和非牵引带区域的数量(4)兽医的份额。我们的分析和 Street Easy 的相似性表明,公园和遛狗场等开放空间的高度集中确实是决定任何社区对狗友好的一个重要因素。
然而,我们也注意到,除了这些开放空间,还有相当多的其他设施对享受狗的乐趣同样重要,但我们没有能力包括在这份报告中,如步行人行道,宠物友好型餐厅和咖啡店,兽医诊所和宠物护理店。此外,除了所有必要的设施之外,一个社区只有在拥有大量健康的狗和热情的主人的情况下,才能真正做到对狗友好。事实上,在像纽约这样的大城市找到一个具备所有这些元素的社区并不容易。希望有了越来越多的有用信息,比如这份报告中提供的信息,狗的父母将会在为他们自己和他们毛茸茸的孩子选择最好的家时得到充分的信息。
局限性和进一步研究的建议
正如在讨论中提到的,在这项研究中,我们只研究了公园和遛狗区这两个对狗友好的社区的基本设施。我们认为,有相当多的其他变量应该包括在内,以提高研究的全面性。这些变量包括(但不限于)可步行性、安全性、宠物友好型餐厅和咖啡店的可用性、兽医诊所以及拥有有效许可证的狗的数量。据我们所知,纽约市/曼哈顿区的此类变量数据仅以邮政编码为单位。由于邮政编码不是一个通用的地理区域,而是由美国邮政服务为邮件投递创建的路线和地址的集合,因此通常更难处理。未来的研究可以找到一种方法将这一单位转换成相应的地理区域,以便上述数据可以很容易地投入使用。
参考资料:
- https://www . nytimes . com/interactive/2018/02/08/real estate/dogs-of-new-York . html
- https://medium . com/@ nater attner/new-York-city-most-dog-dense-zip-codes-3697 e 2993908
- https://street easy . com/blog/nycs-most-dog-friendly-neighborhoods/
- https://data . cityofnewyork . us/Health/NYC-Dog-Licensing-Dataset/nu7n-tubp/data