增强你在机器学习项目中的研究的 4 种技术
在我的帖子机器学习项目的研究指南中,我解释了如何将任何机器学习项目分成两个阶段(研究和开发)以及一些推动研究阶段的技巧。
在这篇文章中,我将深入研究一些技术和工具,帮助你掌握你的研究。在这个阶段工作时,你应该力求简单和专注。
项目布局
这是我倾向于在任何 ML 项目开始时使用的文件夹布局。只要项目需要成长,这个布局就可以扩展(例如添加一个tests
文件夹、deploy
文件夹等)。
project # project root
├── data # data files
├── models # machine learning models
├── notebooks # notebook files
└── src # helper functions
与常规的软件开发项目不同,ML 项目有三块基石:由代码消耗/产生的源代码(笔记本和 src)、由代码和数据构建/消耗的数据和模型。
📁数据
在获取数据之后,我的建议是分阶段处理数据,每个阶段都有自己的文件夹。例如:
data
├── raw # original files
├── interim # preprocessed files
└── processed # result files
从这个布局中,您可以像在管道中一样跟随数据流:从raw
到interim
,然后到processed
。
首先是📁raw
文件夹以原始格式存储数据。如果您可以使用离线数据,那么总是保存一份数据的冻结副本(只读)会非常方便。第二📁interim
文件夹用于存储数据转换产生的数据。很可能,这些转换最终会扩大数据集。这就是我倾向于使用二进制格式的原因,二进制格式可以在序列化/反序列化任务中获得更好的性能。最常用的二进制格式之一是 拼花 (查看如何使用pandas
读取/保存拼花数据)。
加载. csv 文件的时间与加载拼花文件的时间
最后,在📁processed
文件夹用于存储机器学习模型的结果。
即使raw
文件夹可以存储多种格式的文件()。csv ,。json ,。xls 等),我的建议是在interim
文件夹中使用一些常用的格式(例如:二进制格式如*)。拼花地板*、。羽化,或 raw 格式,如*。csv* 、。png )并在processed
文件夹中使用用户友好的格式(例如:)。csv 或 excel 文件允许利益相关者查看您的模型的结果)。有时,包含模型结果的汇总图是有意义的(例如:在构建推荐系统时,您的推荐分布是否遵循与您的销售分布相似的模式?)
📁笔记本电脑
在研究阶段工作时,我使用 Jupyter 笔记本作为我的执行平台/IDE。这就是为什么大多数支持机器学习生命周期的代码都存放在 Jupyter 笔记本上的原因
机器学习(简化)生命周期
因此,笔记本文件夹类似于(在某种程度上)ML 生命周期:
notebooks
├── 1__ingestion # |-> data/raw
├── 1_1__eda
├── 2__preprocessing # |<- data/raw
│ |-> data/interim
├── 2_1__eda
├── 3_1__model_fit_variant_1 # |-> model/variant_1.pkl
├── 3_2__model_fit_variant_2 # |-> model/variant_2.pkl
├── 3_3__models_validation
└── 4__model_predict # |<- data/interim, model/*.pkl
|-> data/processed
我不会深入研究每个笔记本负责什么的细节,因为我认为你们大多数人应该与机器学习生命周期有关。
在任何情况下,你都应该应用适合你工作方式的布局和命名约定(如果你愿意,也可以使用更复杂的布局模板)。也许你需要几次或更多的迭代来找到你自己的蓝图,但是把它作为学习过程的一部分。例如,我喜欢将 EDA 分成两部分,第一部分仅使用原始数据,第二部分关注预处理阶段后产生的“新数据”。但是,如果你喜欢做一个单一的 EDA,这也很好。这里展示的这些项目布局是为了让你有目的地做事,而不是按照你的自由意志行事。一旦您将项目移交到下一个阶段(开发),这将非常重要,因为您的团队成员将能够识别您的项目的形状和组件。**
📁模型
建模笔记本的结果(训练后的 ML 模型)可以存储在该文件夹中。大多数 ML 框架(如 scikit-learn、spacy、PyTorch)都内置了对模型序列化的支持()。pkl 、 .h5 等);否则,检查出宏伟的 cloudpickle 包。
📁科学研究委员会
研发阶段的一个区别是,在研发阶段,src
将会很小(包含助手和笔记本使用的其他常用功能),而在研发阶段,这个文件夹将会被其他文件夹和填满。py 文件(为生产部署准备的代码)。
WSL2
【Linux 的 Windows 子系统 (v2)是这个领域的新成员。如果您已经在使用 Linux 或 MacOS,可以跳过这一节。否则,如果你属于 Windows 用户类别,你应该继续阅读。大多数 python 包与 Windows 系统兼容;但是你永远不知道什么时候会面临不兼容 OS 包的逆境(比如:apache airflow 不在 Windows 环境下运行)。在这段时间里,您将学会爱上 WSL,因为它的行为就像一个完全成熟的 Linux 系统,无需离开您的 Windows 环境。性能相当不错,大多数 IDE 都兼容 WSL。
运行 WSL 的 Windows 终端
例如, Visual Studio 代码有对 WSL 的原生支持。这意味着使用常规插件加载任何 python 项目/文件夹,并执行或调试代码。因为 WSL 将主机驱动器挂载在/mnt
文件夹中,所以您仍然可以访问 windows 主机文件夹。如果您最终在 Windows 和 WSL 中使用同一个项目,请考虑您可能会遇到一些互操作性问题。例如,由于文件权限或 CRLF 行尾,git 可能会错误地将文件检测为已更改。要解决这些问题,您可以在 WSL 中执行以下命令:
git config --global core.filemode false
git config --global core.autocrlf true
WSL 的未来充满希望:原生访问 GPU (=使用 GPU 训练深度学习模型)和 Linux GUI (=不仅支持终端应用,也支持 GUI 应用)。最后,不要错过与 WSL 一起使用令人惊叹的 Windows 终端的机会。
Jupyter 笔记本
毫无疑问,Jupyter 笔记本是我进行探索和研究的首选工具。但与此同时,Jupyter 笔记本电脑并不是将您的模型投入生产的最佳工具。在这两个对立的术语(研究/开发)之间,有一个共同点,那就是您可以改进如何使用 Jupyter 笔记本电脑。
装置
我推荐使用 Anaconda 和 conda 环境安装 Jupyter 笔记本。但是你可以使用任何其他的包管理工具(比如 virtualenv 、 pipenv 等)。但是你必须使用某人,因此,也在你的项目中使用它。
如何安装 Jupyter Notebook(或者更确切地说,我是如何将其安装在我的机器中的):
使用 Anaconda 安装 Jupyter 笔记本(因此,首先需要安装 Anaconda);然后在基本/默认(conda)环境中安装 Jupyter Notebook,执行以下命令:
conda activate base
conda install -c conda-forge notebook
这听起来违背了所有的良好实践(Jupyter Notebook 应该是一个项目依赖项),但我认为作为 Visual Studio 代码(或name-your-preferred-IDE-here)本身,Jupyter Notebook 应该是一个机器级的依赖项,而不是项目级的依赖项。这使得以后的定制更容易管理:例如,在使用 Jupyter 扩展的情况下(下一节将详细介绍),您只需配置一次扩展,然后它们就可以用于所有的内核/项目。
安装 Jupyter 笔记本后,就轮到 Jupyter 笔记本扩展了;在控制台中运行以下命令:
conda install -c conda-forge jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
conda install -c conda-forge jupyter_nbextensions_configurator
然后,每当您创建一个新的 conda 环境时(您应该在每次启动一个新项目时创建一个新的环境),您需要使它作为 Jupyter 内核可用,执行以下命令:
python -m ipykernel install --user --name retail --display-name "Python (retail)"
最后,要启动 Jupyter Notebook,您应该在基本环境中,然后执行:
project # project root (launch jupyter notebook from here,
│ # using the base/default conda environment)
├── data
├── models
├── notebooks
└── srcconda activate base
jupyter notebook
Jupyter Notebook 在您的网络浏览器中启动后,您可以为您的笔记本选择所需的环境(内核):
Jupyter 笔记本—更改内核
第一次在笔记本中设置内核时,它将被记录在笔记本元数据中,您无需在每次启动笔记本时进行设置。
笔记本扩展
使用 Jupyter 笔记本扩展。只是为了启用Collapsing headers
扩展。当您使用大型笔记本时,这对于将信息组织到您的笔记本中非常有帮助,并且不会忘记在笔记本中来回翻页。我认为这是必须的。句号。
交付笔记本电脑时,您应该提供的最重要的事情之一是可执行性(一旦设置了依赖关系——内核和源文件,笔记本电脑必须从上到下都是可运行的)和可再现性(当笔记本电脑被执行时,应该总是返回相同的结果)。
但是由于我们处于研究阶段,我们可以允许一定程度的不确定性。支持这一点的一个很好的工具是Freeze text
扩展,允许我们保存您过去实验的结果。使用工具栏,您可以将单元格变为只读(可以执行,但其输入不能更改)或冻结(不能更改或执行)。因此,如果您不能强制执行可再现性,至少您可以保留一些基本结果来与您当前的执行进行比较。
Freeze text
Jupyter 笔记本扩展
例如,在上图中,您可以比较最后一个纪元和执行时间的准确性。此外,考虑到为了记录/跟踪您的实验,有更好的工具,如 mlFlow 和 wandb (尽管我认为这些工具在开发阶段更相关)。
最后,我鼓励你去看看其他可用的扩展(比如 scratchpad,autopep,code folding 等等)。如果你按照我的安装设置,应该有一个名为Nbextensions
的选项卡可供你配置笔记本扩展:
Jupyter 笔记本扩展管理器
否则,您可以通过命令行启用扩展。
笔记本测试和源代码控制
Jupyter 笔记本在测试和源代码控制方面都表现不佳。在测试的情况下,使用造纸厂和 nbdev 会有一些帮助。另外,我强烈推荐使用老派技巧作为assert
命令来验证你的代码假设。例如,在每个pd.merge
之后,检查结果数据帧的基数(初始行数==最终行数)总是一个好的做法:
nrows_initial = df.shape[0]
df = pd.merge(df, df_sub, how="left")
assert nrows_initial == df.shape[0]
在源控制的情况下,可以检查[nbdime](https://github.com/jupyter/nbdime)
,进行区分和合并笔记本。通常git
在检测笔记本文件的变化方面提供的体验很差,但是相比之下nbdime
是一个强大的工具,你可以从命令行(提供了与 git、bash 和 PowerShell 的集成)或者从 web 界面使用,这提供了更丰富的体验(也提供了与 Jupyter Notebook 的集成)。我非常欣赏nbdime
根据输入单元格的变化、输出单元格的变化和单元格元数据的变化对更新进行分类。
笔记本魔术命令
使用 Jupyter 笔记本的另一个建议是充分利用内置的 %magic commands 。我最喜欢的魔法命令是:
%load_ext autoreload
%autoreload 2
%matplotlib inline
在不重启内核的情况下,在内存中重新加载模块和包时,%autoreload
这个神奇的命令变得非常方便。例如,如果你正在处理存储在经典中的代码。py 文件,当源文件被更新时,只要你执行笔记本中的一个单元格,新的源文件就会被重新加载到当前内核中,所做的更改就可以使用了。这种技术的另一个好处是,您可以在笔记本的环境中安装新的包,并且(大多数情况下)它可以导入到当前的笔记本中(同样,不需要重新启动内核)。另一方面,魔术命令%matplotlib
用于将matplotlib
输出重定向到当前画布笔记本。
另一个鲜为人知的魔法命令是:
%%time
当您需要分析在笔记本中执行一个单元格所花费的时间时。我喜欢对需要长时间执行的复杂单元使用这个命令,因为我知道完成执行需要多少时间。如果你想了解更多这方面的信息,你可以阅读优秀的剖析和计时代码——Python 数据科学手册章节。
使用%%time
分析执行时间
另一种分析代码的方法是使用 tqdm ,当执行“成批代码”时,它会显示一个漂亮的进度条。根据执行上下文(python、interactive 或 Jupyter Notebook),输出可以很好地适应。
如果您需要并行执行“成批代码”并显示它们的进度,您可以使用 pqdm 。
%debug
( 可以调试),当一个单元因错误而执行失败后,执行下一个单元的%%debug
魔法命令。在此之后,您将进入(华丽【挖苦本意】)pdb
调试界面;请记住,没有设置断点的花哨用户界面,只有“老式的”命令 alas ’ s ’ for step,q ’ for quit,等等;您可以检查其余的 pdb 命令以自娱自乐。
预处理
数据管道
在我的上一个项目中,我从这篇文章中获得了很大的灵感,这篇文章解释了如何构建机器学习预处理管道。最重要的想法是而不是推迟之前可以做的事情,并按照以下顺序转换数据:
- 预处理:列操作(即
map
转换) - 特征工程:逐行操作(即
group by
变换) - 合并:数据帧方式操作(即
merge
转换) - 上下文:跨数据帧操作(即
map
跨上下文操作)
压型
从头开始做 EDA 很费力,因为你需要事先查询数据,以便知道要显示什么(或寻找什么)。这种情况最终导致编写重复的查询来显示数值变量的直方图、检查列中缺少的值、验证列的类型等。另一个选择是自动生成这些信息,使用像 pandas-profiling 这样的包,它可以报告各种信息。
检查缺失数据的经典方法是使用df.isna().sum()
中的pandas
API;同样,您可以查询执行df.species.value_counts()
的数据频率。但是这些命令的输出是“不完整的”,因为只返回绝对数字。欢迎使用 sidetable ,它以一种漂亮的表格方式丰富了过去的查询:
熊猫value_counts()
vs 侧桌freq()
sidetable
和pandas-profiling
API 完全集成到pandas
DataFrame API 中,支持 Jupyter 笔记本。
PS: 这个区域目前“炙手可热”,所以期待未来会有更多的包裹到来( klib )
形象化
对我们许多人来说,Seaborn 是一个老伙伴。下一个版本(0.11)要带来我期待了一段时间的东西:堆积条形图。
如果你在这个特性还没有发布的时候读到这篇文章,记住你可以使用下面的命令直接从 GitHub 安装“开发”包:
pip install [https://github.com/mwaskom/seaborn.git@4375cd8f636e49226bf88ac05c32ada9baab34a8#egg=seaborn](https://github.com/mwaskom/seaborn.git@4375cd8f636e49226bf88ac05c32ada9baab34a8#egg=seaborn)
您也可以在您的requirements.txt
或environment.yml
文件中使用这种 URL,尽管我建议确定存储库的提交散列(如后面的代码片段所示)。否则,您将安装“安装时可用的最新存储库版本”。此外,在产品中安装“测试”或“开发”版本时要小心。警告你
【更新】Seaborn 0.11 版本目前已经上市,不需要从 GitHub 安装开发版。尽管如此,为了知识的缘故,我将留下关于安装开发版本的注释。
在我的上一个项目中,我了解了一个非常方便的软件包,用于可视化地图和统计信息: kepler.gl ,这是一个最初的 node.js 模块,最近被移植到 Python,并且还获得了一个友好的扩展,可以将地图加载到 Jupyter 笔记本。
我喜欢 kepler.gl 最重要的特点是:
- 与
pandas
API 紧密集成。 - 我能够制作一个令人印象深刻的 3D 地图可视化,包括一个在短时间内自动动画的动态时间轴。
- UI 具有许多 GIS 功能(图层等),因此地图具有高度的交互性和可定制性。但最棒的是,你可以保存这些 UI 设置,并将其导出为一个 python 对象(准确地说是一个 python 字典);下次加载地图时,可以传递这个 python 对象,避免从头开始重新设置地图。
from keplergl import KeplerGl
sales_map = KeplerGl(height=900,
data={"company sales" : df,
"box info" : df.drop_duplicates(subset=["product_id"]),
"kid_info" : df.drop_duplicates(subset=["user_id"]) },
config=config # configuration dictionary
)
sales_map
感谢你花时间阅读这篇文章。
- 我在这篇文章中解释的大多数问题都是基于我在 ML 项目中的工作经验。但它们不一定适合你的工作环境,但至少,我希望它们能为你提供一些思考的素材。
- 请记住,这篇文章关注的是研究阶段的实验,所以我允许一些许可,但我不会允许自己出现在最终产品中。同时,我尝试使用正确的工具来加强容易覆盖的领域(例如:使用
assert
的简单测试,管道的良好实践,等等)。 - 我不描述机器学习模型问题(训练、验证和部署)似乎会适得其反。但是在开始的时候,你将会花更多的时间来计划你的项目,转换你的数据和处理软件相关的麻烦,而不是执行 fit/predict 方法。
- 请在评论中分享你的笔记或经历。正如我之前所说的,我离开了多个领域,没有进一步的细节,但如果你对其中任何一个感兴趣,请说出来。这将有助于推进这个了不起的社区。
关于数据,开发者可以教给我们的 4 件事
“到 2022 年,只有 20%的分析洞察会带来业务成果。”—高德纳[1]
数据在两个世界之间建立了一个家。最常见的情况是,数据团队夹在业务的技术层面和运营层面之间。虽然这常常会让我们觉得自己是格格不入的,但它实际上让我们处于一个不可思议的位置,在我们自己的领域中利用这些世界中最好的东西。
在过去的 2 年里,我在一家小型初创公司工作,整天都被夹在我们的开发团队和运营团队之间。作为唯一的数据人员,我不得不开始从我周围的人那里学习我能学到的东西——并在这样做的过程中了解其他领域,如软件开发,如何教会我如何大幅改善我的数据团队的运营。我很快意识到这些原则可以让所有数据团队受益。
这个数据团队效率的概念已经有了一个名字— DataOps 。它源于它年长、成熟的表亲 DevOps。DevOps 和敏捷方法论的出现是为了对抗软件开发人员在工作时面临的低效率。他们专注于:
- 如何更有效的协作,
- 如何快速部署事情
- 如何保持高水平的质量
DevOps 原则非常成功,现在几乎世界上每个软件团队都在使用它们。数据操作呢?嗯,那还在找它的脚。但是随着对数据需求的持续增长,这是我们很快需要考虑的事情。为什么不从我们能从邻居身上学到的开始呢?
这是我认为数据团队应该尽快融入我们工作方式的 4 件事。
1.版本控制
将其用于:协作和质量
【分支合并…懂了吗?]照片由派恩瓦特在 Unsplash 上拍摄
即使您不是开发人员,您也会非常熟悉缺乏版本控制的痛苦。回想一下你和你的团队最后一次尝试一起编辑电子表格的情形。
在过去的十年中,版本控制一直是软件开发人员的英雄(尽管这个概念比那要古老得多),然而它在大多数数据团队中仍然相对缺席。在我之前的角色中,我拥有的最接近版本控制的东西是我放在桌面上的一个名为“The OG 的 SQL 查询,我将用它作为我所有其他 SQL 查询的起点。
虽然版本控制正慢慢地被用于数据科学模型和 ETL 脚本,但我们可以,也应该做得更多。这两个领域最类似于软件代码,但是数据管道的其余部分是…混乱的。像报告这样的东西是如何得到版本控制的?而数据呢?你能控制它的版本吗?而自助工具呢?他们需要版本控制吗?
答案是肯定的,各位。如果昨晚你的报告更新时,上游出了问题,所有东西都坏了。应该有办法还原到昨天的报告(或数据)。或者,如果您的新员工只是想下载您的 SQL 查询的副本,但实际上更改了实时版本,现在没有回头路了,该怎么办?现在我们明白为什么我把 OG 放在我身边了。这些是我们经常面临的问题,但是我们还没有对它们采用版本控制解决方案……还没有。
2.同行审查
用它来:协作,和质量
约翰·施诺布里奇在 Unsplash 上的照片
每当开发人员提交一段代码时,它所经历的许多步骤之一就是同行评审。团队中的其他人亲自阅读他们的代码,并对其进行评论。最终,他们必须在投入生产前批准它。有些人可能会认为这很突兀,甚至是低效的。但是我爱死它了。
我从未对我的任何数据角色进行过这种级别的审查;仪表板可能被掩盖了,SQL 查询在我的肩膀上看着,但是团队中几乎没有人知道我在做什么,更不用说它是否达到了某种标准。
在数据团队中工作最糟糕的事情之一(至少对我来说)是你几乎没有和任何人一起工作过。你们很少一起解决问题。你肯定是在一个跨职能团队中,但是数据问题是你的,而且是你一个人的问题。这个简单的添加同行评审的行为增加了一个协作层,而这个协作层以前并不存在。
团队合作和质量+2。再加上这个不一定需要什么技术。当然,技术可以改进它,但是你可以很容易地在你的工作流程中增加一个步骤,允许你的每个报告或查询在发送之前得到团队中另一个成员的批准。
3.自动化测试
用它来:质量,速度
开发人员被告知他们工作的 10-20%应该被指定用于设计和实现他们工作的自动化测试[2]。如果这些测试失败了,你的客户就是最终测试你代码的人。他们往往会在这样做太多次后离开。这些测试通常是好的开发团队(和好的产品)的标志。
最棒的是这一切都是自动完成的!如果代码没有通过这些测试,它将不会被合并。伙计们,我们要建一堵墙。
数据也应该如此。当我过去为我的报告构建 SQL 查询时,甚至当我编写数据科学模型时,我的代码所经历的测试级别总是由我决定。我可以选择大力抽查结果,并尝试不同的模型版本,直到我感到满意,如果有必要,我可以捍卫它。但更多的时候,是最终客户发现了错误。这些交互中的每一个都会削弱数据和业务之间的信任。您的数据客户不应该发现您的错误。所以让我们建起那堵墙吧![高质量测试墙,非常清楚。]
4.连续交货
用于:质量,速度
这个想法指的是产品变化的速度。代码库将被迭代,并经历小的增量变化。
数据恰恰相反。项目往往需要很长时间,而且有很多一次性的请求。一旦发货,它就完成了,脱离了我们的控制,除了一些后续的请求。
我们需要更快地发布信息和迭代直到我们的数据和报告变得有用。这确实是我们让数据对业务更有价值的唯一方法,并有望在令人震惊的 20%的统计数字上有所提高。
我们如何做到这一点?
就像我上面提到的,其中一些已经发生了,但几乎只发生在数据工程和数据科学工作流中。这正在创建我们自己的数据孤岛,与最初带来 DevOps 的数据孤岛没有什么不同。我们需要将这些想法扩展到我们领域中最像软件的部分之外,并着眼于将这些想法应用到像报告、可视化和特别查询这样的事情上。
我们世界的这些部分与软件非常不同,所以这不会像将它们所有的过程和工具复制粘贴到我们的环境中那么简单。
为了利用这些知识,我们需要对它们进行调整。幸运的是,这不仅与流程有关,也与技术和工具有关。
关于流程
这些是立竿见影的效果。
- 在向客户发布之前,向所有报告添加同行评审流程是简单的第一步。你团队中的一些人可能会对增加的工作量犹豫不决,但是你需要确保相应地分配时间。
- 开始做更多的连续交付。这将需要重新设定内部客户的期望,但我希望他们会欢迎在输出中有更多发言权的机会。
关于工具
我两年前加入的那家初创公司实际上一直在试图建立一种数据工具,以优先考虑这些数据操作原则。我们已经将 DevOps 原则应用于数据,如版本控制和自动化测试。此外,它的设计考虑到了分析师和非分析师,因此数据管道的所有部分都可以在不知道如何编码的情况下做出贡献(但如果您愿意,您可以这样做)。
我们在这一领域刚刚起步,正如您所看到的,还有很大的发展空间。如果你想一起来,你可以在这里了解更多:
组合、组织和可视化数据的最快方式。Count 是您和您的……
count.co](https://count.co?utm_medium=blog&utm_source=Medium&utm_campaign=cm&utm_content=de)
参考
[1] A. White,“我们的顶级数据和分析预测 2019 年”(2019),Gartner
[2] C. Bergh,“数据厨房中的数据操作 vs 开发操作—第 73 集”(2019),数据工程播客
[3] C. Caum,“连续交付与连续部署:有什么不同?(2013),puppet.com
我从贝叶斯推理招聘中学到的 4 件事
马尔科姆·莱特曼在 Unsplash 拍摄的照片
一步一步地演示如何使用贝叶斯定理来改善你的招聘过程。
R 最近,我写了一篇关于如何雇佣开发人员的文章,我以一个笔记开始,我预计几年后我会重温它。这是 51 天后的总数,我已经有所补充了。
我最近一直在思考贝叶斯推理,以及它如何应用于各种环境。它的力量在于,给定一个环境和一条新信息,你可以计算这条新信息有多重要。寻找新开发人员的过程正是遵循这种模式。起初你对他们一无所知,然后你收集更多的信息来帮助你做决定。
贝叶斯推理的飞行之旅
贝叶斯推理的核心思想如下:
- 你有一个基本概率。在这种情况下,不管你有什么关于他们的具体信息,一个申请人成为一个好的开发人员的基本几率是多少?即。如果你接受了第一个申请这份工作的人,那么这个人有多大的机会是好的?
- 然后,当你得到一个新的信息时,你会考虑它如何改变你的基线概率。在这种情况下,你的新信息可以是一份简历。通常人们会高估这些新信息的重要性,这也是下一步的切入点…
- 你要考虑假阳性和真阴性的概率。即。他们给你一份很棒的简历,但是一个糟糕的开发人员搞砸了一份好看的简历,或者一个好的开发人员不擅长自我推销,并且把它搞砸了,这种可能性有多大呢?
贝叶斯用数学公式表达了上述内容。
在惠普 Autonomy — mattbuck(类别)/CC BY-SA(https://creativecommons.org/licenses/by-sa/2.0)的办公室里,一个蓝色的霓虹灯招牌显示着贝叶斯定理的简单陈述
具体的计算我就不探究了,因为这是关于这个设置中的应用,其他地方很多地方都有涉及——像维基百科的。
市面上有一些方便的计算器——比如这个——可以省去“数学”工作。
贝叶斯推理如何工作,即使是主观数字
“如果我必须自己想出概率,那么这个公式给了我什么?”
的确,我们这里没有硬数字。在大多数情况下,你必须运用你对概率的主观看法。这个过程的力量在于将你的直觉和数学推理结合起来,产生比任何一种方法单独使用都更准确的东西。正如生活中的许多事情一样,诀窍不在于知道答案,而在于知道该问什么样的问题。贝叶斯推理提供了正确的问题。
贝叶斯推理在实践中
让我们假设你正试图招聘一个通用的职位“开发人员”。首先,你需要知道找到一个好的开发人员的几率——如果你是随机选择的话。根据你的位置、薪水等,你会有不同的答案。根据我的经验,我们看到的概率大约是 0.1。
接下来你收到他们的简历,看起来不错。你自己有一个假设。
这个人是一个好的开发人员,因为他们有一个好的简历。
但是等等,还有两个问题你需要问自己。首先,假设他们是一名优秀的开发人员,他们拥有这么好的简历的可能性有多大?我觉得大约是 0.75。第二,假设他们是一个糟糕的开发人员,他们有这么好的简历的可能性有多大?我倾向于 0.5 分——简历通常会误导人。
很好,你已经得到了所有你需要的信息,现在你可以把它代入等式了。当你这样做的时候,你会得到如下结果:0.144285。
你可能会对此感到惊讶,也可能不会。当你看到一份优秀的简历时,你很容易得出这个人会一直走下去的结论。贝叶斯告诉我们的是,他们成为你要找的人的可能性从随机的 10%上升到现在的 14%。不是一个很大的跳跃,但是正如你从上面看到的,你还没有得到太多关于他们的信息。
我们从中可以学到的主要一点是,你不应该花太多时间看简历。你永远也不会从 it 部门雇佣人,你只是略读一下,看看是否有什么东西把他们完全排除在外;一份好的或糟糕的简历不会使可能性从基线的 10%有很大的变化。除了彻底的灾难,你还需要收集更多的信息…
接下来我们进行电话采访。我从上一步得到我的基线。我目前看到的概率是 0.14。电话面试也很棒?继续假设 2。
这个人是一个很好的开发人员,因为他们进行了一次很好的电话面试。
好的,同上。假设他们很好,我会说他们有 0.8%的机会进行一次好的电话面试——允许有一点紧张的空间。假设他们不好,我给他们大约 0.4 的机会——他们可能会虚张声势,但我希望抓住他们。再次插入它,我们有一个新的数字:0.24561403508。
还是很低吧?我们有很棒的简历,很棒的电话面试,我们仍然只有 25%的信心他们是合适的人选。
接下来我们进入技术测试,或者说面对面面试的技术部分。我们现在开始例行公事了。他们做了很好的技术测试。假设 3。
这个人是一个好的开发人员,因为他们有一个很好的技术测试。
以我的经验来看,这是整个过程中最具启发性的部分。如果他们表现好,我会说有 0.8%的机会,但如果他们表现不好,我会说只有 0.2%的机会。这个很难唬住。基线是我们从电话采访中得到的 0.25。插上电源,砰:0.5742857142。
我们达到了 57%。好多了!现在形势对他们有利。尽管如此,他们仍有 43%的可能不会成功。有足够的空间犯下代价高昂的错误。
我们终于面对面了。再说说进展顺利吧。
这个人是一个好的开发者,因为他们面试得很好。
这很难。我知道有些人跳过了这个过程的其他部分,认为他们可以从这一步得到他们需要的一切。以我的经验来看,他们的招聘更多的是碰运气。我们在这里必须小心。这是我们无意识偏见最有可能影响我们判断的一步。关于面试如何在第一个 x 秒结束的理论比比皆是——这只是的一个例子——基于服装、肢体语言等等。我不是说第一印象不重要。例如,如果你正在招聘一名销售人员,这将是至关重要的。但重要的是要把它放在上下文中。
我要用和我的电话面试相似的权重。0.8 对 0.3。插上电源:0.80922803904。
81%
非常好。它不像我希望的那样自信。根据这些几率,你会认为五分之四的招聘是好的。
结论
通过这种方式,我学到了 4 条重要的经验。回想起来,它们现在看起来都很明显,但有时需要通过它来拼写出来。
- 贝叶斯推理非常清晰地向我们强调了一件事,即最能增强我们信心的事情是好的开发人员肯定会做对的事情,而坏的开发人员肯定会出错的事情——在这种情况下,你不太可能得到假肯定和真否定。如果你能想出一个符合描述的问题,你可以跳过整个面试过程,只问那个问题。这个问题必须能够捕捉到他们的理论/实践经验、他们的团队适应度和抱负。
- 另一点我们可以从这里学到的是,我们希望尽早带来那些精辟的问题。你越早调整胜算,你就越不可能在未来浪费时间。
- 不要在简历上花太多时间。你在略读,看看是否肯定不行。
- 我从中得出的最后一个见解是,如果你跳过了这些步骤中的任何一个,那么要么你很有可能找错了人,要么你在这个阶段遇到了一系列非常尖锐的问题。我总是建议至少做上面提到的几个阶段。你花了几天时间去认识新的人。现在多花几个小时面试——确保你雇佣了正确的人——可以节省你更多的入职时间。
祝一切顺利,
缺口
雇用数据科学家时要考虑的 4 件事
顶尖数据科学候选人每天都会收到许多机会选项。为了避免候选人被遗漏,你必须考虑这四件事。
作为一家人事代理机构,我们的专业之一是数据科学,我们知道在招聘数据科学人才时应该注意什么。
数据科学仍然是 2020 年技术领域的热门词汇之一,但让我们回到过去,看看这一切是从哪里开始的。
2012 年,《哈佛商业评论》( HBR)称,数据科学家是 21 世纪最性感的工作。近十年后,可以说它更加性感了。
LinkedIn 以 37%的年增长率将其列为 2020 年新兴工作的第三名。随着人工智能(AI)和大数据现在成为我们日常对话的一部分,无法想象数据科学消亡的世界。这是大家关注的重点。难怪这个角色登上了 Indeed.com 的“2020 年最佳角色”榜单。
所以我们知道需求是存在的,问题是:当招聘一名数据科学家时,你在寻找什么,你在和谁竞争?
数据科学家的预算应该是多少。
嗯,有几个因素会影响数据科学职位的预期薪资。正如你所料,最大的贡献者之一是他们的技能。本质上,他们如何实现投资回报?
数据科学的问题是没有足够的合格候选人来填补空缺职位(即使在经济困难时期)。在候选人驱动的市场中,很难找到精英数据科学家,而在雇主驱动的市场中,你可能会浪费几个小时来筛选不合格的简历,从而找到几份值得面试的。
有数百名候选人拥有这一头衔,但缺乏与之匹配的技能。2011 年,麦肯锡数字公司估计,到 2018 年,数据科学家将短缺约 14 万至 19 万人。他们是对的。2018 年,领英报告称,数据科学家短缺 151,717 人。
但这正是好消息的来源——当具备合适资格的申请人出现时,他们拥有更大的谈判能力。他们可以获得高薪和丰厚的福利。
在美国,大多数数据科学家(54%)至少拥有硕士学位,其中 23%拥有博士学位。他们通常有物理学、数学、统计学或工程学的背景。略占多数(57%)的数据科学家精通脚本和建模,而 43%的数据科学家更擅长生产和工程。
根据威斯康星大学的数据,截至 2019 年,数据科学家的基本工资中值为 13 万美元。对于有一到三年经验的一级科学家来说,他们的预期工资约为 95,000 美元,而经验丰富的专业人士和管理人员的工资可以从 146,000 美元到 257,000 美元不等。
图片由布列塔尼·福克斯拍摄
至于数据科学经理,根据经验水平的不同,工资中位数在 146,000 美元至 257,000 美元之间。
数据科学家最有收入潜力的州:
图片由布列塔尼·福克斯拍摄
至于福利,众所周知,IT 专业人员拥有一些最好的福利。因此,如果你从事 IT 行业,你已经进入了正确的行业。这些是数据科学家获得的一些最常见的好处:
- 远程工作
- 弹性工时
- 购股选择权
- 签证担保
- 通勤援助
- 无限带薪休假
数据科学家很难留住
像大多数 IT 职位一样,数据科学职位非常适合那些不断寻找新刺激的人。数据科学家往往会在一家公司工作一到三年后离开,然后去寻找更好的机会——更具体地说,是更高的薪水。
Big Cloud 进行的一项调查显示,数据科学家发现找新工作非常容易。他们通常愿意搬到任何地方,并期望加薪 11%至 20%。
这项研究还显示,拥有“数据科学家”头衔的受访者中,近一半(42%)对自己目前的职位不满意。所以问题来了,如何留住数据科学家,让他们不去找别的地方?
数据科学家寻找新机会的常见原因包括:
- 更好的工作/生活平衡。
- 从事有意义项目的机会。
- 职业发展机会。
- 更好的文化契合度。
能够向他们的数据科学团队提供上述内容的公司可能会击败统计数据。数据科学家寻找更好机会的另一个重要原因是缺乏公司内部的支持。通常,公司在没有完全理解其含义的情况下就对雇佣数据科学家感到兴奋。这可能会赶走合格的专业人员,他们(理所当然地)不愿意加入没有其他科学家、工程师或建筑师支持项目的公司。
这就是为什么公司必须对他们的人才需求有一个清晰的认识,以便能够留住他们。
寻找什么样的技能组合以及如何给它们定价。
主生产级编码
成为数据科学家的好处在于,根据行业和公司的不同,这个角色可能需要不同的专业知识。例如,一些数据科学家专注于分析数据和开发预测模型。然后,一些数据科学家专门研究模型的部署和集成。
大多数数据科学家属于第一类。然而,最近出现了对数据科学家的需求,他们知道如何做到这两者,并能编写生产级代码,即模块化、可读、经过测试和优化的代码。他们被称为“全栈”数据科学家,这个术语来自 web 开发世界,用来描述精通该领域所有领域的人。
如果你能向未来的雇主展示这种多才多艺,那就更容易谈成更高的薪水。
技术&技能
作为一名数据科学家,Python、R 和 SQL 应该已经是你的拿手好戏了。但是如果你想走得更远,增加一些可以提高你的价值。
让我们来谈谈数字——据《跳板》报道,像 Spark 和 Scala 这样的学习工具可以带来 1.5 万英镑的加薪。以下是一些影响数据科学薪酬的流行技能和工具:
技能:
- Apache Hadoop
- Hadoop
- 机器学习
- 大数据分析
- 数据挖掘
- 斯堪的纳维亚航空公司
工具:
- 张量流
- (舞台上由人扮的)静态画面
- 神谕
- 储备
- D3.js
- BigQuery
- Hadoop
- 朱皮特
- 亚马逊网络服务
- 蔚蓝的
拥有博士学位的候选人
如上所述,大多数数据科学家至少拥有硕士学位。2019 年的数据显示,拥有博士学位的数据科学家将比只有硕士学位的人多赚大约 11,000 美元——这是在所有经验水平上。
然而,对于数据科学经理来说,对于零到三年管理经验的新经理来说,获得博士学位只会产生 6K 美元的差异。
软技能——有效沟通他们的行话
理解数据是一回事,能够解释数据是完全不同的另一回事。作为一名数据科学家,很多工作都是技术性很强的。然而,他们直接团队之外的人不太可能理解他们的模型。这就是为什么他们必须有沟通技巧和商业头脑来与利益相关者讨论他们的发现。
如果你不能把数据转化成可以理解的东西,你总是会遇到障碍。说到底,如果没有人能够理解数据见解,那么这些数据见解又有多大帮助呢?
数据科学家想在哪里工作,为什么
确定具有竞争力的薪酬以吸引顶尖人才的最佳方式是,查看提供最具竞争力薪酬的行业和/或公司。在全球范围内,技术是对数据科学家需求最高的行业。
在美国,我们知道技术引领潮流,其次是教育/学术领域。
如果你想要顶尖的数据科学人才,重要的是要明白你正在与 IBM、亚马逊、微软和脸书等公司竞争,众所周知,这些公司为专注于数据的角色提供最好的福利和薪水。
总之,在你开始招聘的时候考虑这四件事会给你带来优势。你需要了解每个职位的市场价格,以准备可靠的报价。你还需要了解如何留住顶尖人才的心理学(我们提供了如何留住顶尖人才的指南)。最后,了解大多数数据科学家的工作目标会让你知道你能提供什么好处和服务。
关于 Python 函数你可能不知道的 4 件事
Python 函数远比你想象的有趣
来源:https://unsplash.com/photos/feXpdV001o4
Python 作为一种多范式编程语言,因其符合任何程序员风格的能力而备受喜爱,这无疑使它成为世界上最流行的编程语言之一。尽管函数的性质千变万化,但它仍然是语言必不可少的一部分,真正理解语言的这一部分对掌握语言本身大有帮助。这就是为什么在本文中,我将讨论 Python 函数的四个鲜为人知的方面,这将有望让您对 Python 的威力有新的认识,无论您是 Python 老手还是完全的新手。
1.反思你的功能
在编程上下文中,自省是检查您用更多代码编写的代码。这里要记住的关键是 Python 函数本质上是对象,这意味着它们有相关联的属性和方法,这些属性和方法可以给你关于函数本身的信息。这些属性中的大多数是在声明函数时创建的,但是您也可以在事后添加新的属性,就像您对任何其他对象所做的那样。
def example():
""" This is an example docstring
through which I can provide more information
about the function
""" print("Hello World")example.__doc__ #Returns the docstring attribute
example.__annotation__dir(example)#['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']# These are all the built-in function attributes
事实上,我们定义的任何函数都包含了大量的属性。要查看所有这些函数,只需将您的函数传递给 dir()函数(如上所示),就会返回所有可用方法和属性的数组。
一些有趣的属性如下:
- 功能。defaults:返回所有默认参数值的元组
- 功能。doc:返回文档字符串
- 功能。name:以字符串形式返回函数的名称
- 功能。globals:返回一个字典,其中包含函数可以访问的所有全局变量
- 功能。code:返回 code 对象,该对象本身具有各种参数,与函数中的实际代码相关(使用 dir()函数来检查该对象的所有相关方法和属性)。
用函数自省可以做的事情还有很多,我无法用一篇文章的篇幅来介绍,所以一定要打开你的 IDE,开始深入研究你自己的函数!
2.函数类型注释
Python 的灵活性部分来自于它作为动态类型编程语言的本质,在函数的上下文中,这意味着您可以传入任何类型的参数(字符串、整数、数组、布尔值),并且错误只会在运行时出现(例如,如果您试图将字符串添加到函数中的数组,此时您的程序将会抛出一个 TypeErrror)。
这是一种更灵活的编程方法,因为在静态类型的语言中,如 Java 和 C++,函数参数的类型必须预先确定,并且事后不能更改。这使得编程更加严格,需要更多的远见,但它有利于在运行时消除错误,并节省运行时错误检查的性能成本。
然而,一些 Python 程序员选择使用函数注释,通过为所有函数输入和输出提供建议的类型,来帮助 Python 表现得更像静态类型语言(尽管代码仍然是动态类型的)。例如:
def a_function(a: 'Int', b: 'String') -> "Repeats a String":
return a * b# The annotations inside the brackets indicate what type each argument should be. (Notice the use of colons, as opposed to the equals signs, as in the case of argument defaults)# The annotation after the function indicates the type of the return valuea_function.__annotations__#{'a': 'Int', 'b': 'String', 'return': 'Repeats a String'}
# Returns a dictionary of all the associated annotations
通过使用注释,您仍然可以将不正确的数据类型传递给函数,但是您至少可以得到正确类型的指示,从而减少用户出错的机会。您还可以通过在函数上运行 help()函数来访问这些注释,或者等效地,使用 Jupyter 笔记本中的 Shift + Tab 快捷键,它会返回文档字符串、注释和其他函数信息。
3.Args,Kwargs,参数排序和可迭代解包
在解释*args 和**kwargs 的值和用法之前,我需要先解释一下 Python 中打包和解包的概念。
假设我们有一个值数组,我们希望将每个值存储到单独的变量中。我们可以这样写:
a, b, c = [1,2,3]#a = 1
#b = 2
#c = 3
然而,当数组的长度未知时,这个操作变得更加棘手,因为我们不知道需要多少个独立的变量。此外,我们可能希望将第一个值存储为单个变量,但将其余的值保存在一个新数组中。这就是 Python 中解包功能的来源。使用’ * '符号,我们可以将剩余的值存储在一个数组中,如下所示:
a, *b = [1,2,3,4,5,6]# a = 1
# b = [2,3,4,5,6]
星号基本上是说:“取任何尚未赋值的值,并将其存储到一个变量中”。这种技术适用于任何可迭代对象,但在函数中打包参数的情况下尤其有用。它允许我们拥有不确定数量的位置和关键字参数,然后我们可以在函数表达式中索引/迭代这些参数。例如:
def my_func(*args, **kwargs):
sum(args) # Note that although it is convention to use the variable names args and kwargs, you can name the variables whatever you'd like
请注意,当谈到函数参数时,我们必须按照特定的顺序放置参数:
- 位置参数
- *参数
- 关键字参数
-
- *克瓦查
这意味着,在我们将 a *args 放入函数参数之后,后面的参数将被自动视为关键字参数。另一个例子很好地说明了这一点:
def myfunc(a, b, *args, kw, **kwargs):
print(args)
print(kwargs)myfunc(1, 2, 3, 4, 5, kw = 6, kw2 = 7, kw3 = 8)# (3, 4, 5)
# {'kw2': 7, 'kw3': 8}
如您所见,所有在前两个位置参数(a 和 b)之后但在第一个关键字参数(kw)之前的位置参数将存储在一个元组中,该元组可以作为变量“args”引用。*args 参数实际上用尽了所有剩余的位置参数。同样,kw 之后的所有关键字参数都将存储在一个字典中,可以用变量“kwargs”引用该字典。
*Args 和**Kwargs 在您不确定一个函数将接受多少个参数作为输入的情况下非常有用,并且允许您在用 Python 编写函数时更加灵活。
4.利用 Lambda 表达式
Lambda 函数是 Python 对匿名函数的实现。如果您不熟悉这个概念,匿名函数本质上是普通函数的单一使用版本,没有名称,通常用于传递给更高阶的函数。
创建 lambda 函数的语法如下:
lambda [parameters]: expression#for example:lambda x: x + 3# Takes a value x, and returns x + 3
lambda 关键字表示您正在创建一个内联函数。然后,向 lambda 函数提供参数,类似于在函数定义的括号中提供的内容。最后,在冒号之后,编写表达式本身,在调用 lambda 函数时对其求值。
lambda 函数的一个很好的用例是在 map 或 filter 中,因为它有助于编写高度 Pythonic 化和紧凑的代码。例如,如果我们要过滤数组中大于 10 的值:
arr = [1,3,6,2,13,15,17]list(filter(arr, lambda x: x > 10))# the above function will return a new list where the array values are greater than 10
这就是我所说的将函数传递给高阶函数的意思,因为这里我们将 lambda 函数传递给 filter()函数,后者将 iterable 和函数作为位置参数。
实际上,您也可以使用 lambda 函数创建一个常规函数,只需将它赋给一个变量名。该函数现在可以像任何其他函数一样被重用和调用。
我希望你能从这篇文章中学到一些新的东西,如果你对我写的东西有任何问题,欢迎在下面发表评论!
如何在你的第一份数据分析师工作中提升的 4 个技巧
这是一个令人害怕又令人兴奋的新世界,但是这些建议将帮助你踏上成功之路。
由 Adobe Stock 通过 epiduare 授权
如果你正在读这篇文章,那么恭喜你。你阅读了所有关于如何学习 SQL、Python、R 等的中级文章。数据分析世界的注意事项,现在你得到了你的第一份数据分析工作。
这是通过大量艰苦工作和耐心取得的巨大成就,但现在你需要利用一套不同的技能来加速并充分利用这个新机会,克服我们在进入一个新的未知空间时都会感觉到的冒名顶替综合症。
这里有四个快速提升新工作的小贴士。
1.开始和工作中的人联系
当我开始我的第一份数据分析师工作时,我感到非常幸运,因为我的老板没有把我扔在没有游泳池浮动的深水区,而是给我安排了第一个任务,与公司内的关键人物会面。这让我一开始就接触到了所有合适的人。如果我有关于如何连接到特定数据源的最简单的问题,或者什么是连接两个表的最佳方式,我已经有了一个起点。
如果你的老板没有给你分配和某些人联系的任务,问问他们你应该在第一天和哪些人联系。如果你需要更明确的表达,请询问以下类型的人:
- 曾经使用过许多与您将要使用的表和数据库相同或相似的表和数据库的分析师。
- 熟悉如何构建模式和表的工程师。
- 一名出色地交付报告、仪表板和其他文档的员工。
- 众所周知,员工在公司内人脉很广或非常合群。
与这些人建立关系网将有助于你回答开始新工作时可能会遇到的许多问题。从最佳实践、系统权限和设置,以及如何进一步与能够提供帮助的其他人联系,无所不包。
当我开始这些会议时,我会保持简短,最多 30 分钟。我首先简单介绍一下我是什么时候开始的,我的角色包括什么,然后我请他们分享他们的角色,以及你如何帮助他们完成他们的工作。这就形成了一种相互理解,即尽管你是新来的,但你愿意尽可能地提供帮助和分享信息。这对在工作场所建立牢固的关系大有帮助。
2.了解你的客户
我所说的顾客,并不是指你公司的销售对象。你的客户是你必须向其交付产品或服务的任何人。每月向副总裁汇报 KPI?副总裁是你的客户。
了解你的客户在任何工作中都是至关重要的。您的成功取决于您向客户交付产品的质量。
你的客户可能是你的老板,也可能是其他部门的人。例如,我必须计算我们团队的支出,并在每个月初提交给会计部门,以便他们计算他们的应计费用。因此,我看到他们,把他们当作我的顾客。我确保了解他们想要什么,如何想要,以及何时想要。我尽我所能让我的顾客满意。
尽早识别和联系你的客户是很重要的。在开始的时候,你可能看不出你的团队之外还有其他客户,但是由于你对数据的访问和接近,你最终会有一些你必须支持的辅助任务。最好提前认识到这些客户和任务,这样当您计划工作负载时,就可以将与交付给所有客户相关的时间考虑在内。
3.了解你的行业
知道如何访问和解释数据是数据分析师的第一步。充分利用你所掌握的数据来了解这个行业,以及是什么让它前进是你的下一步。是的,你的经理和团队会帮助你快速了解这家公司,他们的收入模式等等。这取决于你去深入挖掘,找出所使用的行业标准,什么是可以影响你的行业的市场因素,管理你的公司活动的法律和法规。
如果你在一家上市公司工作,最好的第一步是查看公司的年度和季度文件,也就是 10-K 和 10-Q。这里有一个谷歌 2019 款 10-K 的例子。需要逐字读吗?不,但你应该阅读第一部分的大部分内容,以更好地理解你公司的目标和风险,阅读财务数据会让你对你所在行业的重要指标有一个很好的了解。
如果你的公司没有上市,尽量找一个相关的已经上市的公司。例如,Squarespace 不是上市公司,但他们的竞争对手 Wix 是。您可以查看 Wix 的 10-K,了解哪些指标对行业很重要。
了解这些信息对于您如何执行分析以及如何展示您的发现至关重要。如果你能把你的发现以一种真正考虑到你的公司、行业和市场的方式联系起来,这将是一个巨大的增值。
4.写一份计划来提升你的技能
我的第一份数据分析师工作是通过学习 SQL 并从我能找到的任何与 SQL 相关的小工作中获得经验。得到这份工作是巨大的第一步,但还有更多的步骤要走。如果你想成为一名数据分析师,那么你需要制定一个路线图,告诉你下一步该学什么,以及如何应用你所学的知识。为了获得最好的结果,花几个月的时间在工作上,并记下事情如何改进。有没有可以自动化的报告?您是否经常收到可以转变为自助仪表盘的请求?如果有人来要求你证明你的工作,你所有的数据来源的完整性和准确性能得到验证吗?看看现在什么与你的工作相关,然后在此基础上制定一个学习计划来帮助满足这些需求或满足这些需求。
你的工作不会随着你的日复一日而结束,你需要继续学习、应用和成长,以摆脱骗子综合症的感觉。如果 SQL 是你到目前为止唯一学到的东西,下面是一些接下来要解决的主题的想法:
- 使用 Python 进行分析/统计建模(学习熊猫和 NumPy 库)
- Tableau 和 Looker 等数据可视化工具
- 使用 MatPlotLib 和 Seaborne 的 Python 数据可视化脚本
- 机器学习入门课程
- 当地社区大学的应用统计学课程
以下是我目前正在参加的 Udacity 课程,旨在进一步提高我在数据分析方面的知识和技能,并进一步增强我现有的技能(下面的链接是一个附属链接,如果你报名参加课程,我可能会得到报酬):
[## 在线数据分析师课程| Udacity | Udacity
纳米学位计划与下载教学大纲的先决知识,你应该有工作经验…
www.jdoqocy.com](https://www.jdoqocy.com/click-100010396-13953679)
第一步总是最难的,现在你已经翻过了第一座山。你有知识和经验去走得更远,没有什么可以阻挡你。不断学习,不断成长。祝你一切顺利!
快乐学习。
如果你觉得这篇文章很有帮助,并且正在寻找更多类似的建议,那么考虑在这里注册我的每月简讯。
增强数据科学项目演示的 4 个技巧
赢得数据科学面试
之前读大学的时候,我是那么想进入数据科学领域。
我继续学习大量的统计学,希望能在数据科学面试中胜出。
但是,我一直失败。
在那之后,我花了一些时间,试图回忆是否有大多数招聘经理都在寻找的共同领域。
我发现我实际上没有一个好的数据科学项目可以展示。
因此,我花了一些时间,试图设计一个数据科学项目,并认为这次我会成功。
然而,我还是失败了。因为我没有注意到项目的一些细节。
在一次又一次地改进我的项目后,我终于设法获得了一份数据科学实习。
在本文中,我将向您介绍我所做的一些改进,这些改进带来了一个数据科学实习机会。
1.理解你的机器学习模型
你可能认为实现一些奇特的模型会增加你赢得面试的机会。事实上,如果不真正理解你的模型,它实际上会伤害你。
例如,你实现了一个非常复杂的深度学习模型。然而,你知道它为什么工作。你只是从 GitHub 上克隆了别人的作品,得到了很高的准确率分数。
然后,当面试官要求你解释你实现的模型,或者在哪种场景下,你的模型不会很好地工作时,你会愣住,然后离开面试。
以下是我想分享的信息。
你需要准备一些招聘经理会问你的关于模特的问题。如果你没有太多时间准备数据科学面试,但至少要确保你清楚地理解了你所使用的模型。
下面是一些你可以准备的问题的例子。
- 有没有什么基准业绩可以比较?
- 在什么情况下你的模型不能给出准确的结果?
- 如果你有更多的时间,你会对你的模型做什么样的改进?
您可以将此作为演示幻灯片或您将要演示的 markdown 文件中的旁注。两种方式都可以!
2.保持你的分析简洁
当你在做项目时,总会有一些你感兴趣的见解。你将花一些时间,绘制不同种类的图表,并希望给招聘经理留下深刻印象。
绘制一些图表是很棒的。然而,一定要画出一些重要的图表。例如,绘制一些与您的结果或模型的特征相关的图表,或者您的训练示例中每个类别的分布。
有一点要注意的是,也要为你的情节或分析准备一个故事。
例如,不要只是说,五月的销售高峰。相反,你可以说,在 5 月份,每个渠道的销售转换率都要高得多,因此会导致销售激增。
当你发现一些有趣的发现时,花点时间去找出背后的原因。
3.解释你为什么选择这些功能
特征对我们的机器学习模型极其重要。有了正确的特征,您就可以在不使用复杂模型的情况下获得出色的准确性。
会有各种各样的功能供你选择。解释选择可用特征子集的潜在原因将表明你知道特征提取在机器学习中的重要性。换句话说,你不是随机输入,然后把它们扔给模型。
此外,您可能希望包括选择正确功能的过程。例如,你试图预测房价。你正在考虑使用的特征包括,到最近的公共交通站的最小距离,卧室的数量,房子的大小等等。
假设您发现到最近的运输站的最小距离并不是一个重要的特性。它损害了你的模型的性能。请务必在您的数据科学项目报告中包括这一点。数据科学不仅仅是最终结果,有时,寻找解决方案的过程才是最重要的。
4.准备 Powerpoint 幻灯片和 Jupyter 笔记本
你可能会问,为什么我们两个都要准备?
我没有时间两者都准备好,我想向面试官展示代码就足够了?
这实际上取决于你的情况。对我来说,两者兼得更好。例如,当你使用 PowerPoint 幻灯片演示时,面试官想知道你是如何处理数据的,出于某种原因,你没有将这些信息放在演示幻灯片上。
如果你已经准备了你的代码和注释,你就可以当场展示给他或她看。
另一种情况是,你只准备 Jupyter 笔记本,并期望向面试官逐行解释代码。根据我的经验,这不是一个好的表达方式。面试官只是想知道你是如何解决问题的,因此,用 PowerPoint 总结你的思维过程会是一个更好的主意。
因此,我的建议是使用 PowerPoint 作为主要的演示材料。同时,准备好你干净整洁的 jupyter 笔记本作为辅助材料。
最终想法
拥有一个出色的数据科学项目来展示无疑是从其他候选人中脱颖而出的最重要因素之一。
在准备项目的过程中,你会发现有很多工作需要投入。虽然你已经付出了很多努力,但不要忽略一些重要的细节,因为这可能会毁了你的演示。
所有这些建议都是根据我的经验提供的。如果您有任何问题或其他不同的想法,请随时评论!
谢谢你一直读到最后,下期帖子再见!
关于作者
Low 魏宏是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。
他提供爬行服务,可以为你提供你需要的准确和干净的数据。你可以访问这个网站查看他的作品集,也可以联系他获取的抓取服务。
在媒体上阅读低纬鸿的作品。数据科学家|网络抓取服务:https://www.thedataknight.com/.每…
medium.com](https://medium.com/@lowweihong?source=post_page-----6bef8cb1477a----------------------)
加速数据科学写作的 4 个工具
用这四个工具实现你的写作目标
我在 Medium 上写数据科学已经两年多了。写作,尤其是技术写作可能很费时间。你不仅需要想出一个主意,写好,编辑你的文章的准确性和流动性,并进行校对。对于技术文章,你通常还需要编写代码来说明你的解释,确保它是准确的,并将代码从你用来编写它的工具转移到你的文章中。
我试着一周发表一两次。当我第一次开始写作时,我发现这个过程非常耗时,而且很难在一份全职工作中保持这个时间表。
随着时间的推移,我发现一些工具大大加快了我创作和发表文章的时间。尤其是包含编码示例的那些。以下工具帮助我实现了每周围绕我的其他生活承诺发表一到两篇文章的目标。
1.Jupyter 到 Medium
在 jupyter_to_medium 的帮助下,直接从您的笔记本中将 Jupyter 笔记本发布为中型博客文章。你……
pypi.org](https://pypi.org/project/jupyter-to-medium/)
这个工具今年 5 月才由 Ted Petrou 发布,但是如果你在 Jupyter 笔记本上写代码,它将会改变游戏规则。使用这个 Python 包,您可以将笔记本的全部内容作为博客文章直接发布到您的 Medium 帐户中。
要使用这个工具,首先您需要将它 pip 安装到您的项目环境中。
pip install jupyter_to_medium
您可能还需要在启动笔记本的环境中安装此扩展。
jupyter bundlerextension enable --py jupyter_to_medium._bundler --sys-prefix
安装完成后,当你打开 Jupyter 笔记本并导航到文件> >部署为时,你会发现一个选项来部署为中型文章。
当你选择这个选项时,你会看到一个表格。在顶部,它要求一个集成令牌。如果您是 Medium 上的常规作者,您可以在 Medium 帐户的设置中访问此内容。如果您的设置中没有令牌,您需要通过此电子邮件地址 yourfriends@medium.com 联系 Medium 申请一个令牌。
根据我的经验,你会很快得到回复,通常在 1 到 2 天内。
您可以每次都将您的集成令牌粘贴到该表单中,或者为了避免重复访问,您可以将令牌保存为一个文件和目录,并以下面的方式进行标记.jupyter_to_medium/integration_token
。
Jupyter to Medium 将以文本形式发布您的降价信息,以代码块形式发布代码,并以草稿形式直接将图像发布到 Medium。我发现你通常只需要做最少的编辑就可以发表一篇博文。
2.Github Gists
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
gist.github.com](https://gist.github.com/)
Github 有一个名为 Github Gists 的工具,可以让你轻松地将代码片段直接嵌入到你的博客文章中。在您的文章中使用 Gists 而不是代码块的好处是,它们可以更好地保留代码的格式,它们可以提升您的 Github 帐户,并且读者可以更容易地访问您的代码,亲自尝试这些示例。
你需要一个 Github 帐户来创建一个 Gist。一旦你有一个简单的导航到 Gists 页面在gist.github.com。创建一个要点非常简单,只要给它一个名字,粘贴你的代码,点击发布。发布后,您将看到此页面。要将要点嵌入到你的文章中,只需将网址编码在“嵌入”下面,然后粘贴到你的文章中。
代码显示在您的媒体文章中,如下所示。
3.Jovian.ml
[## Jovian:所有数据科学项目的平台——Jovian 文档
对于你的数据科学项目、Jupyter 笔记本、机器学习模型、实验等等,Jovian.ml 是一个更好的地方
jovian.ml](https://jovian.ml/docs/index.html)
Jovian.ml 是一个在线托管 Jupyter 笔记本的工具,对于从您的本地环境外部共享分析非常有用。Jovian 最近发布了一项功能,可以将整个笔记本、代码片段、单元格输出和 markdown 直接嵌入到你的中型帖子中。
要开始使用 Jovian,你需要在 jovian.ml 上创建一个账户。免费层给你无限的公共项目,这是理想的,如果你使用它来分享通过一个中型博客。然后,您需要将 pip 安装到本地环境中。
[p](https://www.jovian.ml/)ip install jovian
要将本地 Jupyter 笔记本上传到您的在线 Jovian 帐户,只需在您的笔记本中运行以下命令。
import jovian
jovian.commit()
这将提示您输入一个 API 密钥,您可以在您的帐户中找到它。
在单元格中嵌入特定的代码片段。导航到您已上传到您的在线帐户的笔记本和包含您要共享的代码的单元格。点击嵌入单元格。
这将给你一个链接,你可以粘贴到你的媒体文章。
这将显示如下。
4.语法上
加入数百万作家的社区。Grammarly 受到学生、专业作家、商业人士的信任…
app.grammarly.com](https://app.grammarly.com/)
Grammarly 是一个相当知名的应用程序,它可以检查你的内容中的拼写错误、语法错误,甚至是你文本的情感。虽然这是一个显而易见的写作工具,但我花了一段时间才开始使用它,而且它对我的文章的编辑时间产生了如此大的影响,所以我认为它值得在这里分享。
Grammarly 可以作为浏览器扩展安装,本地作为桌面应用或移动应用。为了最大限度地利用我的时间,我在许多不同的环境中写作,所以如果我离线写作,在我的浏览器中安装语法是有用的,如果我在移动中写作,则在我的浏览器中安装语法。
如果你对关于数据科学写作的文章感兴趣,你可能会发现我以前写的关于这个主题的文章也很有用。
撰写数据科学(或任何其他主题)的顶级技巧
towardsdatascience.com](/how-i-write-a-data-science-blog-62e4108fe478) [## 我为什么写数据科学博客
写博客加速了我在数据科学方面的学习,原因如下
towardsdatascience.com](/why-i-write-a-data-science-blog-7726c3c7d3d9)
感谢阅读!
我每月都会发一份简讯,如果你想加入,请点击此链接注册。期待成为您学习旅程的一部分!
将在 2020–2021 年扰乱您的数据和分析战略的 4 种趋势
持续智能、数据操作、数据民主化和数据网状化是我最近观察到的数据分析的四大趋势。所有这些都可能在 2020-21 年与你的业务相关,不是因为它们是“最新的东西”,而是因为有三种主要的潜在力量推动这些趋势向前发展。他们会以这样或那样的方式来找你。
Analytics &数据战略:三种力量,数据需求、数据增长和复杂性增长伴随着四种趋势。图片由作者提供。
在这篇文章中,我将解释:
- 定义未来十年分析策略的三大力量是什么。
- 这三种力量目前形成的四种趋势是什么,将在 2020-21 年相关。
- 趋势是什么在有些细节有资源链接,比我能更好地解释它们。
让我们来了解一下会扰乱您的分析策略的三种力量和四种趋势!
趋势概述
我一次又一次地偶然发现了四个趋势,我相信它们将在 2020-21 年与分析领域的几乎所有人相关。这四个趋势是
- **数据网格:**数据不是副产品,而是实际产品。生产团队的所有权。 ThoughtWorks 推出的一个概念。
- **数据民主化:**公司中的每个人都可以访问大量数据,包括非技术员工,例如 AirBnB(采用率接近 50%)。
- 持续智能:通过机器学习和大量持续数据摄取&处理进行自动近实时决策支持&。
- DataOps :专注于通过数据传递价值,并将现在常见的软件工程实践,如持续集成(CI) &持续交付(CD)等引入数据管道。
但是为什么这四个趋势会变得如此重要呢?我觉得会的,因为有三股主要力量在推动这些趋势。
推动这些趋势的潜在力量
据我所知,推动这些趋势的潜在力量将在未来 10 年内继续发展。这就是我相信这些趋势还将持续相当长一段时间的原因。
不断增长的数据需求:随着机器学习者、数据科学家和其他人发现越来越多的应用,对作为产品的数据的需求正在飙升。4 年前,几乎任何公司的数据科学家和机器学习工程师都很乐意将数据作为副产品,从他们能找到的任何地方提取出来。现在,越来越多的公司拥有 100 多名数据科学家&机器学习工程师,他们都需要适当的数据。公共 API 的使用正在爆炸式增长。出于数据科学目的的公共和公司内部数据集也是如此。
**不断增长的海量数据:可用数据以及数据采集设备的数量正在飞速增长,而且似乎每三年翻一番。
(来源:数据时代 2025,https://www . Forbes . com/sites/tomcoughlin/2018/11/27/175-zetta bytes-by-2025/# 7f 03 b 9085459)
***市场越来越复杂:*我确实相信,市场和我们所处的竞争环境会变得越来越复杂。例如,在本书“Edge:价值驱动的数字化转型”中给出了定性原因。我也相信知识的增长与世界的复杂性相关,因此学术论文的指数增长可能是另一个观察复杂性增长的好点。
(来源:金哈,Arif。(2010).5000 万篇:对现存学术文章数量的估计。学过出版。23.258–263.10.1087/20100308.)
所有这些力量本质上为掌握处理数据并将其转化为决策和行动的公司带来了巨大的竞争优势。让我们来详细探讨有助于建立这种竞争优势的四种趋势。
趋势 1:持续的详细情报
持续智能是现在存在的一种可能性,以前是不存在的。
使从数据到决策的循环成为可能&行动是连续的,而不是“一次性的”!
事实证明,一个在Amazon.com上向你展示产品推荐的基本“推荐引擎”可以对用户行为的变化或 A/B 测试的结果做出极快的反应。这些推荐引擎已经完成了从数据到行动的循环,形成了一个连续的流程。
但是这种技术,在变体中,可以应用于几乎任何类型的动作和任何类型的数据。它可能以其他形式出现,如“决策支持”或统计,但它确实存在。
在其他公司,这种循环只是一次性的线性事情,但在一些公司,这已经变成了巨大的竞争优势。比如搜索中的 Google,推荐中的 Amazon,二手车定价中的 wirkaufendeinauto.de 等等。
智能循环是将行动产生的原始数据再次转化为新的决策和行动的方式。思想作品是这样描述的:
***#1 如何应对这一趋势:*将你的公司置于智能成熟度模型之上。然后花一分钟思考一下你所在行业的其他公司在这个领域可能处于什么位置。这真的决定了你是在追赶,还是能够获得竞争优势。
***#2 不评价这个趋势的理由:*我觉得没有不评价这个趋势的理由。持续智能已经应用于您不会想到的行业、医院、工业组织,以优化机器吞吐量并发现错误或损坏机器,以及整个行业。如上所述,数据呈指数级增长,随之而来的是其他公司破坏您的数据的机会。不过,我确实认为贵公司的时间框架取决于你们的竞争环境以及你们的内部情况。
***#3 首先考虑其他趋势的理由:*如果你没有投入任何努力使数据在你的公司可用,不要认为自己是数据驱动或数据启发的,那么你可能要首先考虑其他趋势。
#4 其他资源: ThoughtWorks 提供了关于这个主题的大量资源,很好地解释了机器学习连续循环是如何工作的,以及决策支持是如何工作的:
- ThoughtWorks 智能企业系列第 1 部分。
- 智造企业系列第二部。
- ThoughtWorks 智能企业系列第三部分。
趋势 2:详细数据操作
数据操作是一种趋势的名称,现在已经有了适当的形式。这是将产品和价值观点以及软件工程的最佳实践整合到通常的数据工作中的趋势。
这一趋势是由数据操作宣言、数据厨房、数据砖块和数据砖块推动的。
DataOps 意味着我们应用 DevOps 思维,结合精益制造的常用方法和敏捷思维来处理数据。主要模型包括下面描述的数据和想法管道的想法:
(来源:(https://medium . com/data-ops/data ops-is-not-just-devo PS-for-data-6e 03083157 b 7)
***#1 为什么这一点现在如此重要?*这三种力量都在挤压数据&分析部门专注于在快速变化的环境中提供价值。实际上,dataOps 只是将需要做的事情整理成文,以获得正确的关注。
***#1 评估这一趋势的理由:*如果你的公司&你的竞争环境变得越来越复杂,你的数据世界也会随之而来。
评估这一趋势的第二个理由:如果你的数据分析团队正努力在像 SCRUM 这样的敏捷框架中工作,因为他们应该这样做。如果你没有产品经理负责你的分析数据团队,因为你应该有。
***#3 进一步的资源:*这种趋势还没有形成系统,但是一些信息是可用的,比如宣言和一些博客帖子。这是其中的两个:
数据民主化的细节
数据民主化用一句话来说就是“把数据访问权给所有人”。Airbnb、Zynga、易贝和脸书等公司多年来一直在积极实践数据民主化。这些公司有很多陷阱,也有很多值得我们学习的地方,这就是为什么我已经写了这些:
(资料来源:我在一篇关于数据民主化的文章中写的)
#1 为什么这一点现在如此重要?世界变得越来越复杂,这意味着决策实际上需要更多的数据。没有它,在一个日益复杂的世界里,另一种决策方式——直觉——迟早会失灵。不断增长的数据量实际上意味着有更多的数据你必须给人们访问。
***#2 评价这种趋势的理由:*你们公司有多少人可以接触到数据?30%或更少?那么你肯定低于采取行动的门槛(行业平均水平在 30-40%之间)。
#3 不评估这一趋势的理由:您有大型自助分析设置?直接 SQL 访问或贵公司大多数人可比拟的东西?那就没有理由去深究这个趋势了。
#4 资源:
详细数据网格
DDD,微服务在过去的十年里改变了我们开发软件的方式。然而,分析部门的数据却赶不上这一速度。为了在采用现代开发方法的公司中加快基于数据的决策制定,分析软件团队需要改变。
(1)软件团队必须将数据视为产品*,他们为其他所有人服务,包括分析团队*
(2)分析团队必须以此为基础,停止囤积数据,转而按需获取数据
(3)分析团队必须开始将他们的数据湖/数据仓库也视为数据产品*。*
数据网格可能看起来像这样:
(来源:z . Dehghani:https://Martin fowler . com/articles/data-monolith-to-mesh . html)
***#1 考虑构建数据网格的理由:*复杂的领域、庞大的组织结构、大量的数据以及不断增长的内部数据需求都是考虑这一趋势的好理由。
#2 不考虑数据网格的理由:*如果你觉得你的领域仍然很简单,很容易由一个分析部门来管理,那么我看不出有什么理由要转向数据网格。正如微服务一样,数据网格是灵活性(通过数据网格获得)和复杂性(通过数据网格增长)之间的权衡。如果复杂的成本不值得,保持一个中心的方法。*
***#3 资源:*基于数据网格的资源基础在不断增长,我想在这里强调三个。
- 来自 ThoughtWorks 的 Z. Dehghani 的原始数据网格文章。
- 一个更实用的版本我就这个题目写了。
- Zalando 网络研讨会解释了他们与 ThoughtWorks 一起实施的数据网格版本。
- Zalando 解释了他们的数据网格版本。
就是这样!
我希望听到一些关于我可能错过的其他趋势的反馈,你认为这三种力量如何推动未来的分析策略。
您应该知道的用 Pandas read_csv()解析日期列的 4 个技巧
一些最有用的熊猫把戏
布莱斯·巴克在 Unsplash 上拍摄的照片
导入数据是任何数据科学项目的第一步。通常,您会处理 CSV 文件中的数据,并在一开始就遇到问题。
在这些问题中,解析日期列是最常见的。在本文中,我们将讨论以下最常见的解析日期列问题:
- 从 CSV 文件中读取日期列
- 日首格式(日/月、日/月或日-月)
- 将多个列组合成一个日期时间
- 自定义日期解析器
请查看我的 Github repo 获取源代码。
1.从 CSV 文件中读取日期列
默认情况下,从 CSV 文件加载数据时,日期列表示为对象。
例如 data_1.csv
date,product,price
1/1/2019,A,10
1/2/2020,B,20
1/3/1998,C,30
使用默认的read_csv()
将 日期 列读取为对象数据类型:
df = **pd.read_csv('data/data_1.csv')**
df.info()RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 date 3 non-null object**
1 product 3 non-null object
2 price 3 non-null int64
dtypes: int64(1), object(2)
memory usage: 200.0+ bytes
为了正确读取 日期 列,我们可以使用参数parse_dates
来指定日期列的列表。
df = pd.read_csv('data/data_3.csv', **parse_dates=['date']**)
df.info()RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 date 3 non-null datetime64[ns]**
1 product 3 non-null object
2 price 3 non-null int64
dtypes: datetime64[ns](1), int64(1), object(1)
memory usage: 200.0+ bytes
现在,数据帧应该看起来像这样:
2.日首格式(日/月、日/月或日-月)
默认情况下,parse_dates
参数会先读取月( MM/DD 、 **MM DD、**或 MM-DD )格式的日期数据,这种安排在美国是比较独特的。
在世界上大多数其他地方,首先写的是日期( DD/MM 、 DD MM 或 DD-MM )。如果你想让熊猫先考虑日子而不是月份,你可以将参数dayfirst
设置为True
。
pd.read_csv('data/data_1.csv',
parse_dates=['date'],
**dayfirst=True**)
或者,您可以定制一个日期解析器来处理第一天的格式。请查看" 4 中的解决方案。定制日期解析器”。
3.将多个列组合成一个日期时间
有时日期被拆分成多列,例如, 年 , 月 ,以及 日
year,month,day,product,price
2019,1,1,A,10
2019,1,2,B,20
2019,1,3,C,30
2019,1,4,D,40
为了将它们组合成一个日期时间,我们可以将一个嵌套列表传递给parse_dates
。
df = pd.read_csv('data/data_4.csv',
**parse_dates=[['year', 'month', 'day']]**)
df.info()RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 year_month_day 4 non-null datetime64[ns]**
1 product 4 non-null object
2 price 4 non-null int64
dtypes: datetime64[ns](1), int64(1), object(1)
memory usage: 224.0+ bytes
注意,列名year _ month _ day是自动生成的。为了指定一个定制的列名,我们可以传递一个字典来代替。
df = pd.read_csv('data/data_4.csv',
parse_dates=**{ 'date': ['year', 'month', 'day'] }**)
df.info()RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 date 4 non-null datetime64[ns]**
1 product 4 non-null object
2 price 4 non-null int64
dtypes: datetime64[ns](1), int64(1), object(1)
memory usage: 224.0+ bytes
4.自定义日期解析器
默认情况下,使用来自dateutil.parser.parse
的 Pandas 内置解析器解析日期列。有时,您可能需要编写自己的解析器来支持不同的日期格式,例如, YYYY-DD-MM HH:MM:SS :
date,product,price
2016-6-10 20:30:0,A,10
2016-7-1 19:45:30,B,20
2013-10-12 4:5:1,C,20
最简单的方法是编写一个 lambda 函数,它可以读取这种格式的数据,并将 lambda 函数传递给参数date_parser
。
from datetime import datetimecustom_date_parser = lambda x: datetime.strptime(x, "**%Y-%d-%m %H:%M:%S**")df = pd.read_csv('data/data_6.csv',
parse_dates=['date'],
**date_parser=custom_date_parser**)
df.info()RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 date 3 non-null datetime64[ns]**
1 product 3 non-null object
2 price 3 non-null int64
dtypes: datetime64[ns](1), int64(1), object(1)
memory usage: 200.0+ bytes
现在,熊猫数据框中的日期栏已被正确读取。
好了
感谢阅读。
源代码请查看我的 Github 上的笔记本。
如果你对机器学习的实用方面感兴趣,请继续关注。
一些相关文章
- 你应该知道的 6 个熊猫技巧,以加速你的数据分析
- 数据科学项目开始时应该包括的 7 个设置。
您的数据科学投资组合中必须包含 4 类项目
获得一份 DS 工作并不容易,但拥有这些项目可能会增加你的机会。
在数据科学领域找到一份好工作可能是一项极具挑战性的艰巨任务。尽管数据科学正在快速发展,但对该领域感兴趣或出于财务原因加入的人数正在呈指数级增长。
因此,尽管对优秀数据科学家的需求很高,但找到一份数据科学家的工作却极其困难。为了得到一份工作,你需要从成百上千的申请者中脱颖而出。
一个好的数据科学家有很多方面,有些是技术方面,有些不是。作为一名数据科学家,你需要有一个强有力的投资组合,清楚地展示他们的技术技能,以及他们的软技能。最重要的是,他们的作品集需要证明他们有一颗渴望学习的心。
数据科学不仅仅是数据
towardsdatascience.com](/4-essential-skills-often-underestimated-by-data-scientists-4650a7c11eee)
数据科学是一个非常广泛的领域,统称“数据科学”涵盖了许多主题。它涵盖了机器学习、计算机版本、人工智能和自然语言处理的所有子领域。
尽管有各种各样的主题,为了证明你作为数据科学家的价值,你只需要展示你在数据科学核心概念方面的能力。
本文讨论了 4 种类型的数据科学项目,它们可以让你的投资组合脱颖而出,增强你的技能组合,增加获得理想工作的机会。
开启数据科学未来的 10 步路线图
towardsdatascience.com](/a-learning-path-to-becoming-a-data-scientist-56c5c2e8ae3f)
数据清理
作为一名数据科学家,您可能会花将近 80%的时间清理数据。你不能在一个不干净和没有组织的数据集上建立一个有效和可靠的模型。
当您清理数据时,可能需要花费数小时的研究来弄清楚数据集中每一列的用途。有时候,经过几个小时甚至几天的清理后,您会发现您正在分析的数据集并不真正适合您想要实现的目标!然后,你需要重新开始这个过程。
清理数据可能是一项非常令人沮丧和令人畏惧的任务。然而,这是每个数据科学工作中非常重要的一部分,为了让它不那么令人生畏,您需要练习。
那里有数据集,你可以用来练习数据清理。当您为数据清理项目寻找一个好的数据集候选者时,您需要确保
- 数据集分布在多个文件中。
- 有许多细微差别、空值和许多可能的清理方法。
- 需要大量的研究才能完全理解。
- 最重要的是,它需要尽可能接近现实生活中的应用。
好的清洗数据集——或者我称之为非常杂乱的数据集——通常可以在收集和聚合数据集的网站上找到。这些类型的网站从各种来源收集数据,而不会吃掉它们。这使它们成为清洁项目的绝佳候选。
这类网站的例子有:
- Data.world 。
- Data.gov。
- Reddit 数据集。
探索性数据分析
一旦您的数据是干净的和有组织的,您将需要执行探索性数据分析(EDA)。EDA 是每个数据科学项目中的重要步骤之一。执行 EDA 有许多好处,例如:
- 最大化数据集洞察力。
- 揭示潜在模式和结构。
- 提取重要信息。
- 检测异常情况。
我们可以遵循许多技术来实现高效的 EDA,其中大多数技术本质上都是图形化的。这背后的原因是,当数据以可视化的方式呈现时,更好地发现数据中的模式和异常。EDA 任务中使用特定图形技术非常简单,例如:
- 绘制原始数据以获得初步见解。
- 绘制原始数据的简单统计数据,如均值图和标准差图。
- 将分析集中在数据的特定部分,以获得更好的结果。
用引人注目的视觉效果讲述您的数据故事。
towardsdatascience.com](/data-visualization-101-7-steps-for-effective-visualizations-491a17d974de)
您可以从许多来源学习 EDA 的基础知识,并培养探索和投资数据模式的直觉;关于这个话题,我最喜欢的课程之一是约翰霍普金斯大学在 Coursera 上提供的课程。
数据可视化
当数据科学家构建任何类型的数据科学项目时,他们通常是为了揭示秘密和信息,从而以某种方式帮助改进或理解数据。
大多数时候,这是以学术或商业为导向的方式进行的。每个数据科学家必须掌握的技能之一是用他们的数据讲述一个令人信服的故事的能力。
讲述一个故事的最好方式是,把它形象化。
有许多公开可用的数据集可用于实践数据可视化、构建仪表盘以及用数据讲述故事。我最喜欢的几个包括:fivethirtyeeight、 Google 的数据集搜索、数据是复数,当然谈数据集不能不提 Kaggle 。
为了脱颖而出,你需要成为一个善于讲故事的人。您的数据需要有效地可视化。幸运的是,有许多资源可以让您学习和练习数据可视化技能。你可以阅读关于可视化的文章,或者浏览有效的可视化课程。
[## 用 Pygal 实现 Python 中的交互式数据可视化
一步一步的教程,创造惊人的可视化
towardsdatascience.com](/interactive-data-visualization-in-python-with-pygal-4696fccc8c96)
机器学习
决定你能否获得数据科学工作的因素之一是你机器学习的流利程度。有时,当新人加入这个领域时,他们往往会跳过基础知识,直接进入这个领域更高级的“行话”。
但是,
在深入研究这些高级主题之前,你需要确保你已经打下了坚实的机器学习基础。掌握基础知识不仅会巩固你的技能基础,还会给你必要的知识,让你更快更轻松地掌握任何先进的新概念。
确保拥有涵盖所有机器学习基础的项目,例如回归(线性、逻辑等。)、分类算法和聚类。我最喜欢的一些机器学习基础资源是深度学习书籍*的机器学习基础章节、*和 CodeAcademy 机器学习课程。
以下是一些简单而强大的机器学习项目想法:
倾听你的数据,追随你的目标…
towardsdatascience.com](/how-to-choose-the-right-machine-learning-algorithm-for-your-application-1e36c32400b9)
外卖食品
由于大量的申请者和对该领域感兴趣的人,在数据科学领域找到一份好工作可能相当具有挑战性。为了脱颖而出,您的投资组合需要证明您对数据科学的基本概念有坚实的基础。
强大的基础意味着你将能够轻松地学习、实现和适应新的模型和算法。这篇文章列出了 4 种类型的数据科学项目,可以帮助你增加获得理想工作的机会。这 4 类项目是:
- 数据清理项目。
- 探索性数据分析项目。
- 数据可视化项目(最好是交互式项目)。
- 机器学习项目(聚类、分类和 NLP)。
有这些项目就证明你有扎实的数据科学基础。然而,拥有这些项目并不足以让你得到一份工作;你还需要提高你的软技能,比如沟通、讲故事和对基本商业模式的理解。以及一些显示你知识程度的高级项目。
4 种类型的树遍历算法
在 7 分钟内你需要知道的关于树遍历的一切(带动画)
DFS 和 BFS 算法||由阿南德·K·帕尔马设计
如果你是一名职业程序员或者在软件行业工作多年,那么这个话题对你来说可能显得很琐碎。但是这种算法的用例以及不同的变体可能会在初学者的头脑中造成混乱。因此,我试图把所有你需要知道的关于树遍历的知识放在这篇文章中(带动画)。
”动画可以解释人类大脑所能想到的一切。这种功能使它成为迄今为止为大众快速欣赏而设计的最通用、最明确的交流方式。”―华特·迪士尼
这篇文章不仅仅是关于这些算法的理论,你还将学习如何通过代码实现这些算法。
时间表
- 树形数据结构
- 树遍历-简介
- 让我们开始吧——实用指南
- 有序遍历
- 前序遍历
- 后序遍历
- 层次顺序遍历
- 最终注释
1.树形数据结构
在进入树遍历算法之前,让我们先将树定义为一种数据结构。这将帮助你以一种有意义的方式掌握概念。
Tree 是一种分层数据结构,它以分层的形式自然地存储信息,不像线性数据结构,如链表、堆栈等。树包含不应形成循环的节点(数据)和连接(边)。
以下是树形数据结构的几个常用术语。
节点— 节点是一种结构,它可以包含一个值或条件,或者表示一个单独的数据结构。
根— 树中的顶层节点,主要祖先。
子节点— 离开根节点时直接连接到另一个节点的节点,即直接后代。
父母— 孩子的相反概念,直系祖先。
叶— 没有子节点的节点。
内部节点— 至少有一个子节点的节点。
边缘— 一个节点与另一个节点之间的连接。
深度— 节点与根之间的距离。
级别— 节点和根之间的边数+ 1
高度— 节点和后代叶子之间最长路径上的边数。
宽度— 叶子的数量。
子树— 树 T 是由 T 中的一个节点及其在 T 中的所有后代组成的树。
二叉树— 是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉查找树 —是一种特殊类型的二叉树,具有以下属性。
- 节点的左子树只包含键小于该节点键的节点。
- 节点的右边子树只包含键大于节点键的节点。
- 左侧和右侧的子树都必须是二叉查找树。
注意:为了简单起见,我们将以二叉树为例来理解树遍历算法。但是这些算法也可以推广到其他类型的树。
2.树遍历-简介
在计算机科学中,树遍历(也称为树搜索)是图遍历的一种形式,指的是访问(检查和/或更新)树数据结构中的每个节点,恰好一次的过程。这种遍历按照节点被访问的顺序进行分类—维基百科
Wikipedia 定义不言自明,可以理解树遍历的含义。但是我想详细说明定义的最后一行,这将有助于我们理解树遍历的类型以及它们之间的区别。
根据节点被访问的顺序,树遍历算法可以大致分为以下两类:
- **深度优先搜索(DFS)算法:**它从根节点开始,首先尽可能深地访问一个分支的所有节点,在回溯之前,它以类似的方式访问所有其他分支。这下面有三个子类型,我们将在本文中介绍。
- **广度优先搜索(BFS)算法:**它也从根节点开始,在移动到树中的下一个深度之前,访问当前深度的所有节点。我们将在下一节讨论一种 BFS 类型的算法。
3.让我们开始吧——实用指南
是时候用实际的方法来理解这个概念了。我将使用 Java 编程语言来解释代码。但是这些算法可以用你喜欢的编程语言编写,就像我们用 Java 编写一样。
下面是我们的节点类的蓝图,它将作为树数据结构的原子成员。我们将称之为 TreeNode ,它将数据保存为一个整数值,左右是相同类型的子节点(TreeNode)。您可以使用任何其他数据结构将 as 数据保存在 TreeNode 下。
4.有序遍历
Inorder 遍历是 DFS(深度优先搜索)遍历树的一种最常用的变体。
正如 DFS 所建议的,我们将首先关注所选节点的深度,然后再去关注该级别的广度。因此,我们将从树的根节点开始,以递归的方式越来越深入到左边的子树。
当我们通过上面的步骤到达最左边的节点时,我们将访问当前节点并转到它的右边子树的最左边的节点(如果存在的话)。
应该以递归方式遵循相同的步骤来完成有序遍历。这些步骤的顺序如下(在递归函数中)…
- 转到左侧子树
- 访问节点
- 转到右侧子树
顺序遍历||由阿南德·K·帕尔马设计
重要事实: Inorder 遍历二叉查找树总会给你节点排序的方式。
5.前序遍历
前序遍历是 DFS 的另一种变体。其中递归函数中的原子操作与顺序遍历相同,但顺序不同。
这里,我们首先访问当前节点,然后转到左边的子树。在覆盖了左侧子树的每个节点之后,我们将向右侧子树移动,并以类似的方式进行访问。
这些步骤的顺序如下…
- 访问节点
- 转到左侧子树
- 转到右侧子树
前序遍历||由 Anand K Parmar 设计
6.后序遍历
后序遍历也是如此。其中我们在递归中访问当前节点之前先访问左子树和右子树。
因此,这些步骤的顺序将是…
- 转到左侧子树
- 转到右侧子树
- 访问节点
后序遍历||由 Anand K Parmar 设计
7.层次顺序遍历
这是一个不同于我们上面所讨论的遍历。层次顺序遍历遵循 BFS(广度优先搜索)来访问/修改树的每个节点。
正如 BFS 所建议的,树的广度优先,然后向深度移动。简而言之,我们将从左到右逐个访问同一级别的所有节点,然后移动到下一个级别,访问该级别的所有节点。
层次顺序遍历||由 Anand K Parmar 设计
与上面三个遍历相比,这里的实现稍微有点挑战性。我们将使用队列(FIFO)数据结构来实现层次顺序遍历,其中在访问一个节点后,我们简单地将它的左右子节点按顺序放入队列。
这里,在队列中添加孩子的顺序很重要,因为我们必须在同一级别从左到右遍历。查看以下要点以获得更多理解。
8.最终注释
树遍历算法可以大致分为两类:
- 深度优先搜索(DFS)算法
- 广度优先搜索(BFS)算法
深度优先搜索(DFS)算法有三种变体:
- 前序遍历(当前-左-右)-在访问左或右子树中的任何节点之前,先访问当前节点。
- in order Traversal(left-current-right)-在访问左侧子树中的所有节点之后,但在访问右侧子树中的任何节点之前,访问当前节点。
- 后序遍历(左-右-当前)-在访问左、右子树的所有节点后访问当前节点。
广度优先搜索(BFS)算法有一个变种:
- 层级顺序遍历—在同一层级以从左到右的方式逐层访问节点。
查看我的 Github 库获取详细代码。
**重要事实:**还有其他的树遍历算法,既不是深度优先搜索,也不是广度优先搜索。一种这样的算法是蒙特卡罗树搜索,它集中分析最有希望的移动,基于搜索空间的随机抽样扩展搜索树。
您的机会…
加入我的部落后,获得我的个人 Java 收藏清单作为免费的欢迎礼物。 马上获取!
关于作者
Anand K Parmar 是一名软件工程师,热爱设计和开发移动应用程序。他是一名作家,发表关于计算机科学、编程和个人理财的文章。在 LinkedIn 或 Twitter 上与他联系。下面是他的最新文章。
理解计算机科学基础的简单指南
medium.com](https://medium.com/swlh/differences-between-data-structures-and-algorithms-eed2c1872cfc)
管理不平衡分类场景的 4 种独特方法
内部 AI
大多数业务案例都与预测少数群体事件有关,如欺诈、联合检测等。基于不平衡数据训练的机器学习模型对罕见事件的预测精度非常差。
在数十亿笔金融交易中,只有少数涉及欺骗和欺诈。在公路上行驶的数百万辆汽车中,只有少数在公路中间抛锚,其余的都开得很好。如果我们密切关注我们的日常活动,那么也可以发现一些例外事件。相同的倾斜数据存在于许多数据点中,其中一个或几个类别覆盖了大多数情况。
当我们向机器学习算法提供这些不平衡的数据点时,少数多数类会以忽略少数类为代价产生严重影响。大多数业务案例都与预测少数群体事件有关,如欺诈、联合检测等。在不平衡数据上训练的机器学习模型对罕见事件的预测精度非常差。
在本文中,我将讨论处理不平衡数据集和提高少数类预测准确性的四种独特方法。此外,我们还将了解为什么仅考虑分类指标分数(如 F1 分数或准确度)会误导罕见事件预测中的模型预测性能。
我们将使用 Scitkit-Learn 中的 make_classification 方法来生成不平衡数据集。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import f1_score,accuracy_score
from sklearn.metrics import plot_confusion_matrix
import matplotlib.pyplot as plt
我们将学习五种独特的方法来处理 5000 个样本的不平衡数据集,其中一个类包含 98%的案例。
X, y = make_classification(n_samples=5000,weights=[0.02, 0.98],
random_state=0,n_clusters_per_class=1)ycount=pd.DataFrame(y)
print(ycount[0].value_counts())
样本数据集中多数类和少数类的比例(上面代码的输出)
在 5000 个样本记录中,我们有 4871 个 1 类记录和 129 个 0 类记录。让我们考虑等级 1 表示正常交易,等级 0 表示欺诈交易。
样本数据集分为两部分,即。训练和测试设备。训练集是训练机器学习模型,测试集是检验模型的预测。
我们将使用 80%的样本数据集来训练模型,剩余的 20%模型以前没有见过的记录保留给测试集。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,random_state=42,stratify=y)
为了理解不平衡数据集甚至对像随机森林分类器这样的复杂算法的影响,让我们首先用不平衡训练集直接训练标准随机森林分类器,并且没有任何权重参数。
clf =RandomForestClassifier(max_depth=2,random_state=0).fit(X_train, y_train)print("F1 Score is ", f1_score(y_test,clf.predict(X_test)))
print("Accuracy Score is ", accuracy_score(y_test,clf.predict(X_test)))
经过训练的随机森林分类器模型在测试数据集上的 F1 分和准确率分都很高。但是,在不平衡数据集的情况下,仅考虑这些度量来判断模型的预测性能可能是非常误导的。
F1 和在不平衡数据集上训练的随机森林分类器的准确度分数(上述代码的输出)
仅基于这两个指标部署这样一个模型,而不了解分类模型在哪些方面出错,成本可能会非常高。
像混淆矩阵这样的视觉指标在几个方面胜过其他指标。我们可以即时了解模型在分类方面的性能,以及模型的优势和需要微调的方面。基于业务用例,我们可以从假阳性、假阴性、真阳性和真阴性计数中快速判断模型是否准备好进行部署。
您可以在文章准确性可视化:监督机器学习分类算法中深入了解混淆矩阵
fig=plot_confusion_matrix(clf, X_test, y_test)
plt.show()
正如预期的那样,多数类已经完全影响了模型,并且经过训练的模型已经将测试数据集中所有记录的分类预测为多数类。在罕见的欺诈检测或罕见的恶性疾病预测的情况下,这种错误分类预测是非常有害的。
通过在不平衡数据集上训练的随机森林分类器预测测试数据集的混淆矩阵(上述代码的输出)
幸运的是,Random Forrest 分类器有一个参数“class_weight ”,用于在不平衡数据集的情况下指定每个类的权重。
在样本数据集中,类 1 比类 0 普遍大约 38 倍。因此,我们将按这样的比例提及“类权重”,以便算法在训练期间进行补偿。
weighted_clf = RandomForestClassifier(max_depth=2, random_state=0,**class_weight={0:38,1:1}**).fit(X_train, y_train)print("F1 Score for RandomForestClassifier with class_weight parameter is ", f1_score(y_test,weighted_clf.predict(X_test)))print("Accuracy Score for RandomForestClassifier with class_weight parameter is ", accuracy_score(y_test,weighted_clf.predict(X_test)))
具有类别权重补偿的随机森林分类器模型的 F1 分数和准确度分数也很高,但是我们可以通过检查混淆矩阵来确定真实性能。
F1 和在具有 class_weight 参数的类优化数据集上训练的随机森林分类器的准确度分数(上述代码的输出)
我们可以看到,大多数类还没有完全超越权重调整的随机森林分类器模型。
fig=plot_confusion_matrix(weighted_clf, X_test, y_test)
plt.show()
在测试数据集中总共 1000 条记录中,它只错误分类了 14 条记录。此外,它还对测试数据集中 26 个少数类记录中的 20 个少数类样本记录进行了正确分类。
在权重优化数据集上训练的随机森林分类器预测测试数据集的混淆矩阵(上述代码的输出)
我们学习了在随机 Forrest 分类器中处理带有 class_weight 参数的不平衡数据集的方法,提高了少数类的预测精度。
接下来,我们将学习使用不平衡学习库中的 BalancedRandomForestClassifier 管理不平衡输入训练数据集的不同方法。
用 pip 安装不平衡学习库
pip 安装不平衡-学习
在下面的代码中,我们用训练数据集训练了 BalancedRandomForestClassifier,然后检查了测试数据集上的指标得分。
from imblearn.ensemble import BalancedRandomForestClassifierbrfc = BalancedRandomForestClassifier(n_estimators=500,
random_state=0).fit(X_train,y_train)print("F1 Score for Balanced Random Forest Classifier is ", f1_score(y_test,brfc.predict(X_test)))print("Accuracy Score for Balanced Random Forest Classifier is ", accuracy_score(y_test,brfc.predict(X_test)))
和前面两个例子一样,它也表示高 F1 和准确度分数。
F1 和训练的平衡随机森林分类器的准确度分数(上述代码的输出)
我们可以在混淆矩阵中看到,与没有 weight_class 参数的 RandomForestClassifier 相比,BalancedRandomForestClassifier 在内部很好地处理了类权重。
fig=plot_confusion_matrix(brfc, X_test, y_test)
plt.show()
在 1000 个测试记录中,它正确地预测了 968 个记录的分类。通过正确地分类少数类中 26 个记录中的 21 个记录,它也比具有 class_weight 的随机 Forrest 分类器表现得稍好。
平衡随机森林分类器预测测试数据集的混淆矩阵(上述代码的输出)
接下来,我们将使用完全不同的过采样方法来管理训练数据集中的少数类。
接下来,我们将使用完全不同的过采样方法来管理训练数据集中的少数类。基本思想是在少数类中随机生成示例,以获得更平衡的数据集。
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X_train, y_train)
print("Number of records for X_train is ", X_train.shape)
print("Number of records for X_resampled oversampling is ",X_resampled.shape)
之前,我们将 5000 条记录的样本数据集分为分别具有 4000 条和 1000 条记录的训练数据集和测试数据集。
RandomOverSampler 上的训练数据集 fit 随机生成少数类记录,重采样的平衡训练数据有 7794 条记录。
使用过采样策略随机生成的少数类记录对训练数据集进行计数,以平衡训练数据集(上述代码的输出)
一旦训练数据集被人工平衡,那么我们可以在没有“class_weight”参数的情况下训练标准随机森林分类器。
oclf = RandomForestClassifier(max_depth=2, random_state=0).fit(X_resampled, y_resampled)
我们看到,在过采样的人工平衡训练数据集上训练的标准随机森林分类器可以很好地预测。
过采样有助于随机分类器克服多数分类器的影响,以高精度预测测试数据记录类。
由在过采样数据集上训练的随机森林分类器预测的测试数据集的混淆矩阵(上述代码的输出)
在 1000 个测试记录中,它正确地预测了 985 个记录的分类。它的性能也几乎与 BalancedRandomForestClassifier 相当,对少数类中的 26 个记录中的 20 个进行了分类。
最后,我们将了解处理不平衡数据集的欠采样策略。这是一种与我们之前学习的过采样完全不同的方法。随机删除多数课上的例子。关键思想是随机删除多数类记录,以获得更平衡的数据集。
from imblearn.under_sampling import RandomUnderSamplerrus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)print("Number of records for X_train is ", X_train.shape)
print("Number of records for X_resampled undersampling is ",X_resampled.shape)
随机删除的多数类记录的数量,以便用 4000 条数据记录中的 206 条记录来平衡训练数据集。
使用欠采样策略的训练数据集计数。随机删除多数类记录以平衡训练数据集(上面代码的输出)
一旦训练数据集达到平衡,我们就可以直接使用它来训练模型,就像前面讨论的过采样策略一样。
uclf=RandomForestClassifier(max_depth=2,
random_state=0).fit(X_resampled, y_resampled)
似乎欠采样策略能够像本文中讨论的其他策略一样以相似的精度预测罕见的少数类事件,但与其他策略相比,它在预测多数类方面表现得相当差。它错误地预测了测试数据集中的 82 个多数类记录。
fig=plot_confusion_matrix(uclf, X_test, y_test)
plt.show()
由在欠采样数据集上训练的随机森林分类器预测的测试数据集的混淆矩阵(上述代码的输出)
关键要点和我的方法
大多数机器学习分类算法期望训练数据集是平衡的。在用数据训练机器学习模型之前,检查训练数据集是否不平衡并采取适当的预处理措施至关重要。
GIGO —垃圾输入和垃圾输出:如果我们用不平衡的数据训练一个模型,那么这个模型很有可能会错过对生产中少数类的预测。
数据是非常有价值的。我不喜欢欠采样策略,因为它会强制删除与多数类相关的数据。我们看到,由于这一点,即使该模型能够以与本文中讨论的其他策略几乎相同的精度预测少数类记录,但它在预测多数类记录时表现很差。
我更喜欢带’ class_weight '参数的随机森林分类器和不平衡学习库中的 BalancedRandomForestClassifier。
我建议您在为您的项目选择任何一个策略之前,用本文中讨论的所有策略检查训练样本的性能。
您可以通过探索性数据分析深入了解不平衡的数据集。要了解更多信息,请阅读文章- 探索性数据分析(EDA)的 5 种高级可视化
如何计算熊猫的组内百分比?
和其他分组提示
伊洛娜·弗罗利希在 Unsplash 上的照片
(这个帖子的所有代码你可以在我的 github 里找到)
( #2 关于熊猫的帖子提示:如何显示熊猫数据帧的所有列/行?)
你好!Pandas 是数据科学中最重要的 Python 库之一。Groupby 是对熊猫进行分析的最强大的功能之一。它类似于 SQL 的 GROUP BY。
在我作为数据科学家的日常生活中,我发现了一些非常有用的分组技巧。但是熊猫群是什么?
分组依据
正如 Pandas 文档中所指出的,Groupby 是一个涉及以下一个或多个步骤的过程:
- 根据某些标准将数据分组。
- 将函数独立应用于每个组。
- 将结果组合成数据结构。
在大多数情况下,我们希望将数据分成组,并对这些组做一些事情。通常是聚集,转化,过滤。
我将使用这个玩具销售数据框架来说明这些技巧:
玩具销售数据框架
每组内的相对频率
这是我用的最多的功能。很多时候我使用 Groupby 来汇总一些值,我想知道每个组中的值所占的百分比,而不是所有数据中的百分比。
如果我们在汇总数据框中直接计算百分比,将使用所有数据计算结果:
groupped_data = df.groupby(['week', 'day']).agg({'sales': 'sum'})
groupped_data["%"] = groupped_data.apply(lambda x: 100*x / x.sum())
groupped_data
每天和每周的销售额,但百分比是使用全部数据计算的
例如,第一行的百分比(19.23%)是 10 除以 52(所有销售额的总和)。要计算与每周相关的百分比,我们必须使用 groupby(level = 0):
groupped_data["%"] = groupped_data.groupby(level=0).apply(
lambda x: 100*x / x.sum()
)
groupped_data
每天和每周的销售额,但百分比仅使用每周的数据计算
现在,第一行中的百分比(55.55%)只比较 a 周的销售额,groupby("level=0 ")选择层次索引的第一级。在我们的例子中,第一级是天。
累积和
很多时候我想做一个累加和。在我们的示例中,验证我们每天完成了多少销售。为此,我们需要使用 cumsum()函数:
groupped_data.cumsum()
销售的累计总额
要计算每周的累积和,您可以使用上一个主题的相同技巧(groupby(level = 0)):
groupped_data.groupby(level=0).cumsum()
每周的累计销售额
更改聚集度量的名称
如果希望在聚合时更改聚合指标的列名,只需传递一个包含新列名和聚合函数的元组:
df.groupby("week").agg(
{"sales": [("max_sales","max"), ("mean_sales","mean")]}
)
具有不同列名的聚合列。
如果您想删除级别 sales ,这可能会很有用:
groupped_data.columns = groupped_data.columns.droplevel()
移除数据帧的一个级别
将值放入列表中
如果你想把一个组的所有值放入一个列表,你只需要这样做:
pd.DataFrame(df.groupby('week')['sales'].apply(list))
每周的销售额都在列表中
它将应用函数在每周的每个组的销售列中创建一个列表*。*
来源
- https://pandas . pydata . org/pandas-docs/stable/user _ guide/group by . html
- https://stack overflow . com/questions/23377108/pandas-percentage-total-with-group by
- https://stack overflow . com/questions/22219004/grouping-rows-in-list-in-pandas-group by
目前就这样。但我会回来发布更多关于熊猫和其他数据科学主题的文章。请随意添加您的评论
分析疫情数据的 4 种方法(新冠肺炎)
从数据科学的角度来看,跨地区和大洲
新冠肺炎互动统计制图(点击此链接
自从在中国发现一组不寻常的呼吸道病例以来,直到本文撰写之日,有两件事已经很清楚了。
第一,我们将在与我们的亚微观地球居民共存方面学到一个重要的教训。
第二,实现这种学习所需的数据将是丰富的。
在世卫组织官方宣布疫情的几个月前,许多国家和机构已经在收集和公开发布与新冠肺炎有关的数据。所有这些都是为了鼓励国际合作应对这一病毒威胁。
从数据科学的角度来看,这既有趣又令人沮丧。
有趣的,因为它提供了一个从不同领域(流行病学、公共卫生、社会行为等)跨受影响地区进行分析和统计比较的机会。
令人沮丧的因为许多信息渠道利用一维数据点的切片得出不负责任的结论并传播错误信息。例如,不应将一个国家确诊感染病例的绝对数量与另一个国家的绝对数量进行比较,而不考虑一个适当的时间因素,即这些国家目前所处的流行病生命周期阶段。
这篇文章的目的是建议和说明在组合和分析新冠肺炎数据集的不同观点。
内容:
1.新冠肺炎和人口数据
2。数据可靠性和测试的重要性
3。社交搜索趋势和健康意识
4。政府对新冠肺炎的回应
你可以在这里找到我的完整的 互动新冠肺炎统计跟踪器 。
1。新冠肺炎和人口数据
流行病的研究,恰当地称为流行病学,是研究疾病在人群中的分布。
就已经发展成为全球性疫情的新冠肺炎而言,需要进行跨国和跨区域的比较,以便更好地了解这种疾病的特性。然而,为了做到这一点,必须进行一些标准化以增加可比性。
一个国家/地区的总人口数量和平均人口密度,都会影响给定地区传染病的传播速度。这是因为它增加了在规定时间内人类宿主之间近距离接触的次数,以及在“封闭”环境中暴露于疾病的最大人类总数。
按正常确诊病例排名的国家(点击此链接
截至本文撰写之日(2020 年 4 月 17 日),上图显示了按人口密度标准化的新冠肺炎确诊病例总数。
惊讶于这与你在电视上看到的普通图形相比有多么不同吗?
根据人口规模进行调整后,瑞士和比利时突然成为每百万人口中确诊病例数最高的前三名。美国尽管拥有最高的确诊病例绝对数量,但由于其相对较大的人口规模,现在排名第七。
思考什么是有意义的,以及哪些因素会影响被衡量的结果。例如,如果您希望按城市来比较传染病传播,那么调整城市和农村地区之间的人口密度可能也是有意义的。
2。数据可靠性和测试的重要性
对于我们所有人心中的怀疑者(或大或小)……
另一个要考虑的角度是我们的计算和成功(或失败)标准所基于的度量的可靠性。显而易见,这是由于该疾病而被确认感染或死亡的人数。
报告的确诊病例数的可靠性取决于严格和广泛的检测。
这是有意义的,因为测试做得越多,你就能发现越多的病例。根据这一推理,进行较少检测的国家报告的病例数也可能相应减少,换句话说,报告的数字估计数偏低。
测试数据从ourworldindata.org获得
正如预期的那样,对 57 个国家进行的快速相关性分析发现,总检测数和总确诊病例数之间存在 0.88 的强相关性。
感染估计越可靠,国家在协调遏制努力方面就越有能力。
测试:确认比率
那么有没有办法建立可靠性的基准呢?
是的有。我们可以期待那些已经采取了早期检测措施的国家,并根据它们的检测实践和确诊病例数建立一个衡量标准。
介绍**‘测试:确认比率’**
以确诊病例数为分母,任何国家的理想比值都将远大于 1。看看这是如何绘制成下图的:
测试互动图解:确认比率(点击此链接
对数图显示了各国通过已进行检测的数量(x 轴)与确诊病例数量(y 轴)的相对位置。
右下象限的国家尽管确诊病例相对较少,但仍进行了大量检测。
你注意到“浅色”国家的趋势线了吗?这能帮助我们指出我们的可靠性基准吗?
这条无形趋势线上的 7 个国家(南韩、澳洲、阿联酋、南非、纽西兰、巴林和立陶宛)的平均检验:确认比率为的 43.91 。也就是说,每确诊一名感染者,就有 44 人接受了检测。
3。社交搜索趋势和健康意识
疫情的另一个研究视角是人类的社会行为。正如我们最近观察到的,拥有世界上最好的医疗保健系统之一并不能保证成功缓解失控的病毒群。
人们在危机时期的行为(或不当行为)对结果的影响要大得多。协议只有在被遵守的情况下才有效。
下面的简单图表显示了与 Covid/冠状病毒(橙色)相关的术语的确诊病例**(蓝色)相对于谷歌搜索流行度的增长时间表。**
请注意,尽管确诊病例激增,但整个 2 月份公众的搜索兴趣(表明意识)仍然相对较低。
搜索量仅在 2020 年 3 月 12 日左右达到峰值,当时世卫组织宣布了疫情级别的威胁。
尽管全球病例激增,但公众反应却滞后了整整一个月,你对此感到惊讶吗?
按洲搜索兴趣
下一个互动观想没有上面那个重要,但看起来更有趣。
如果你点击提供的链接中的互动【播放】按钮,你会看到一幅有趣的图片,展示了与 Covid 相关的谷歌搜索在各大洲的变化。
与新冠肺炎相关的谷歌搜索的互动插图(点击此链接)
垂直段=大陆
气泡=国家(气泡大小:确诊病例总数)
x 轴=与 Covid 相关的谷歌搜索(对所有搜索进行归一化)
y 轴=新冠肺炎确诊病例总数
政府对新冠肺炎的回应
另一个需要考虑的重要角度是政府对新冠肺炎的反应。流行病学研究的结果经常被用来为政府政策的改进提供信息。
一段时间内的政府行为
下图显示了世界各国政府在过去几个月采取的限制性措施。
全球政府反应图解(点击此链接
观察哪些限制是先实施的,哪些是后实施的,以及这些限制是如何随着时间的推移而变化的。这个顺序有意义吗?
中间的方框标志着我所说的“关键行动期”,左边是世卫组织宣布 2020 年 1 月 30 日进入全球紧急状态,右边是世卫组织宣布疫情级别的威胁。
政府回应
和这篇文章中的其他分析一样,有一个指标让我们能够快速比较不同国家采取的措施是很有用的。
为此,我提出了一个衡量政府对新冠肺炎反应的准备时间的方法:政府反应度。为了保持这篇文章的技术性,我将省略计算。****
该指标的一个用途是让我们测试在什么时间实施的哪种形式的政府应对措施(以及与特定关键事件相关的延迟)对测量 Covid 感染率最重要。
跨洲计算的政府响应度指标(点击此链接)
上图汇总了 9 种政府行为在洲一级的响应度。浅色方框表示政府管理部门迅速采取先发制人的行动,而深色方框表示反应较慢。
请注意,为了便于说明,我特意在洲一级进行了汇总。这解释了为什么大洋洲作为一个国家较少的大陆,在颜色模式上有更多的极端变化。
感谢阅读!
如果你觉得这篇文章有用,请分享!如果你想看我以上实验的更多故事,请告诉我。
数据来源 COVID 案例报告——约翰霍普金斯 CSSE
人口数据——世界银行 wbdata API
检测数据——ourworldindata.org 社交搜索行为——谷歌 pytrend API
政府响应——牛津新冠肺炎政府响应跟踪器
编者注: 走向数据科学 是一份以研究数据科学和机器学习为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
增强体验再现的 4 种方法
让代理记住重要的事情
开始做事
经验回放是政策外学习的重要组成部分。它让代理人获得最大的“性价比”,从过去的经历中挤出尽可能多的信息。然而,与更复杂的采样方法相比,从重放中均匀采样已被证明具有次于标准的结果。在本文中,我们讨论了四种不同的体验回放,每一种都可以根据上下文提高学习的鲁棒性和速度。
1.优先体验重放(PER)
上下文:最初是为双 DQN 算法设计的,以提高采样效率,但自然也适用于任何 RL 算法。
PER 利用了这样一个事实,即代理人可以从某些经验中学到比其他人更多的东西。有些过渡可能很少但很重要,所以应该给予更多的关注。有些过渡可能是多余的,并且已经学习过,所以代理的时间最好花在学习其他东西上。
并非所有的经历都是平等的
直觉上,我们希望对模型中损失较大的点进行采样,因为损失越大,代理学习的空间就越大。因此,我们使用一个转换的时间差(TD)误差来衡量它的重要性。
双 DQN 中的 TD 误差
然而,我们不想天真地在每次迭代中选择具有最高 TD 误差的转换。请记住,在迭代算法中,TD 误差会缓慢减少*,因此我们会将大部分时间用于重放的一小部分,冒着过度拟合的风险。因此,我们提出一种采样方法,其中转移采样概率与 TD 误差成比例。*
过渡抽样概率
其中α是 0 到 1 之间的可调参数。我们还定义了变量:
将变量 P 定义为绝对 TD 误差加上小值
注意,α值越低,我们越接近均匀采样。因此,我们可以将 alpha 视为一个参数,用于调整“我们希望优先处理具有较高 TD 误差的转换的程度”
有一个问题。用这些优先化的样本训练代理可能导致偏差错误,从而导致可能的训练不稳定。我们通过将过渡的渐变更新乘以一个权重来纠正这一点,该权重定义为:
校正偏差误差的权重
其中 N 是重放中的样本数,β是可调超参数。β是一个介于 0 和 1 之间的值,表示我们希望补偿偏置误差的程度。论文[1]建议将β退火为 1,因为无偏更新在训练周期结束时比开始时更重要。作者还建议将每个权重除以所有更新权重的最大值,以获得“标准化”效果。
更新步骤如[1]所示
1.5.分布式优先体验重放
背景:分布式强化学习方法(同步和异步)。虽然最初是为分布式 DQN 和 DPG 变体 Ape-X 提出的,但它自然适合同一伞下的任何算法。
顺便提一下,PER 有一个适应分布式设置的变体!典型地,分布式算法有相同环境的几个实例。虽然我们仍然训练一个单个代理,我们给每个环境一个代理的副本*。然后,来自所有这些环境的经验被汇集成一个单一的重播。最后,我们从优先重放中采样(类似于 PER)并训练学习代理,偶尔用原始的更新参数更新每个副本。*
通过这种方式,我们可以利用不同的策略积累更多的经验。虽然 Ape-X [2]有更多的细微差别,但使用单一、共享的经验回放的想法在学习中提供了许多好处。
2.马后炮经验回放(她)
背景:主要是通过鼓励更有意义的探索,而不是漫无目的的游荡,来解决回报微薄的问题。选择与之耦合的 RL 算法是任意的。
假设一个代理被给予一个带有某个目标的任务 g. 然后,假设每一个没有导致我们的目标状态的转换都有一个-1 的奖励,否则为 1。这是一个回报很少的环境(或者说,就回报而言,大多数转型看起来都很相似的环境)。对于普通的 RL 算法,在这些环境中学习是非常困难的。她试图解决这个问题。
假设我们训练了政策和价值函数,它们不仅以国家为目标,还以为目标。我们定义奖励函数,如果目标没有实现,返回负奖励 r ,否则返回任意更高的奖励。然后,存储到体验重放的过渡将如下所示:
体验目标回放过渡
然而,我们仍然有稀疏的问题!如果我们很少达到目标,我们很少看到回报的变化。她背后的想法是:用子目标来分割任务。换句话说,不是只存储一个带有总目标 g 的转换,我们也存储相同的转换*,但是用一些其他子目标*g’替换目标 g !通过这种方式,代理可以更频繁地看到一些奖励差异。
体验带有子目标的重放转换
但是,这有什么用呢?在我们只关心一个目标的任务中,这是如何工作的?我们可以把生成这些子目标看作是将我们的代理人“圈”向最终目标的一种方式。我们会留下一些饼干屑让探员追踪。
然后,问题来了,我们如何选择我们的子目标。我们不想明确地告诉代理子目标是什么,因为这需要特定领域的知识。另外,它不能推广到多项任务。
她的结果如[3]所示
论文提出选择 k 子目标g’来代替目标g论文[3]提出了选择这些子目标的各种方法:
- 最终:**在剧集中使用单个最终状态
- ***未来:*从当前和下一集采样 k 状态
- ***事件:*从当前事件中取样 k 状态
- ***随机:*从迄今为止观察到的所有情节中采样 k 个状态
换句话说,将过渡存储到体验重放中的整个过程看起来像这样:
- 收集一集的过渡
- 使用原始目标 g 存储该集的所有过渡
- 使用上述方案之一选择 k 子目标
- 对于剧集的每个过渡,通过用每个 k 子目标替换 g 来存储新过渡**
在机械臂运动的背景下测试 HER 的效果,每个选择方案的结果如上图所示。
如[3]所示,与她一起存储过渡的一集
3.强调近期经验(ERE)
山姆·麦克格在 Unsplash 上的照片
上下文:最初是为支持软演员评论家(SAC)收敛速度而设计的。可以说,可以应用于大多数算法和任务,这些算法和任务天生受益于更快地学习最近的经验(如具有多个部分的任务)
通常,我们的代理能够很好地适应学习过程中早期发现的转变。因此,从这些早期过渡中统一取样对我们的政策没有好处。ERE 创建了一个简单而强大的采样方法,允许代理强调最近的转换,同时不忽略从过去学到的策略。
假设,在更新阶段,我们抽样了 K 个小批量。然后,更新每个小批量的模型参数。ERE 提出了一个方案,我们只从体验回放的**子集进行采样,而不是全部。换句话说,对于第个小批量,我们从最近的 c_k 点均匀采样:**
ERE 的采样点
其中 c_min 是我们可以从中采样的最近数据点的最小数量,N 是我们的经验重放的大小,nu 是一个可调的超参数,用于确定我们对最近观察的优先程度。
请注意在由 K 小批量组成的更新中,早期的样本允许对早期的过渡进行训练,而后期的样本则更加强调最近的过渡。换句话说,我们从最近的经历中学到更多,但永远不会忘记过去。
论文[4]建议将 nu 设置为. 996 对于所有环境都是一个好的值。此外,建议随着训练的进行,将 nu 的值退火为 1。这是用来在早期阶段允许更快的训练,并在后期阶段鼓励更慢、更仔细的训练。
ERE 的表现如[4]所示
有些人可能会问:为什么不直接使用 PER?这两种方法似乎在做类似的事情,对数据的训练将使代理人受益最大。这里的美在于它的简单。虽然 PER 需要额外的实现(特殊的数据结构以提高计算效率),但 ERE 不需要。尽管已经表明将 PER 和 ERE 结合使用通常会产生更好的结果,但是单独使用 ERE 的效果是相似的或者只是稍微差一些。
帕特里克·塞林在 Unsplash 上拍摄的照片
4.重复体验回放
上下文:最初是为循环分布式代理设计的,尤其是那些涉及部分可观察性的代理。然而,它可以应用于大多数基于值的算法,无论它是否是分布式的。
在许多方法中,我们可以用 n 步前视训练 Q 值。在经典 Q-learning 中,目标是通过使用一步前瞻产生的;我们以一个时间步长扫视了未来。对于大于 1 的 n ,我们在 n 的组中收集经验,并“展开”转换,为我们的值更新获得更明确的目标值。
n 步展开的 Q 值目标
本文[5]提出代理存储固定长度( m = 80)的状态-动作-回报观察值序列。除此之外,我们还强加了:
- 相邻序列只能重叠四十个时间步长
- 序列不能跨越幕式边界
然后,当我们对这个序列进行采样时,我们在同一组状态上“展开”价值和目标网络,生成价值估计和训练目标。
然而,我们首先如何对这些序列进行采样呢?这种方法从优先体验重放(PER)中获得灵感,但通过使用两个不同值的加权和来调整标准。假设我们使用的值 n 小于 m,第一项是包含在 m 长度序列内的 max 绝对值n-步长 TD 误差。第二个是序列的平均值绝对值n*-步长 TD 误差:*
按 P 值替换,如[5]所示
其中 nu 是 0 到 1 之间的可调超参数。论文[5]建议将 nu 设置为. 9,从而产生一种更积极的采样方法。在贪婪的一方犯错误直觉上是有道理的,因为平均往往会抵消和消除较大的错误,从而很难挑出有价值的转变。
结束语
当然,还有许多其他采样方案和经验重放变化。虽然我们在这里只概述了一些,但总有其他版本比其他版本更好地适应某些环境。我们只需要实验、探索和分析。尽管体验重放不是一个“要么成功,要么失败”的交易,但它可以在我们的 RL 代理的最优性、健壮性和收敛特性中发挥重要作用。这绝对值得我们关注一下。
参考
[1] T. Schaul,J. Quan,I. Antonoglou,D. Silver,优先化经验回放 (2016)。
[2] D .霍根,j .全,d .布登,g .巴斯-马龙,m .赫塞尔,h .哈塞尔特,d .西尔弗,分布式经验回放 (2018)。
[3] M. Andrychowicz,F. Wolski,A. Ray,J. Schneider,R. Fong,P. Welinder,B. McGrew,J. Tobin,P. Abbeel,W. Zaremba,后见之明经验回放 (2017)。
[4] C .王(C. Wang),k .罗斯(K. Ross),助推软演员-评论家:强调近期经验不忘过去 (2019)。
[5] S. Kapturowski,G. Ostrovski,J. Quan,R. Munos,W. Dabney,分布式强化学习中的递归经验重放 (2019)。
从经典到最新,这里有讨论多代理和单代理强化学习的相关文章:
让电脑看到更大的画面
towardsdatascience.com](/hierarchical-reinforcement-learning-feudal-networks-44e2657526d7) [## DeepMind 的虚幻代理如何比 Atari 上的专家表现好 9 倍
最佳深度强化学习
towardsdatascience.com](/how-deepminds-unreal-agent-performed-9-times-better-than-experts-on-atari-9c6ee538404e)*
提供分析的 4 种方式,而不是仪表板或 PowerPoint 幻灯片
提供强大的分析不仅仅是仪表盘和演示
维基百科将分析学定义为“对 数据 中有意义模式的发现、解释以及 交流 *”*这个短语很好地抓住了分析专家和数据科学家日常工作的本质。在定义分析的三个要素中,沟通可能是最重要的。大多数时候,获得洞察力的分析师或数据科学家实际上并不做任何决策,而是将洞察力传递给决策者。随后,沟通不畅将在很大程度上抑制分析师所发现和解释的有意义模式的有效性。
这一挑战催生了数十种完全致力于数据通信的商业智能产品和公司:Tableau、PowerBI、Looker 和 Domo 只是其中的佼佼者——市场上有数十种用于仪表板的软件包和工具。让我们不要忘记提到最初的仪表板解决方案——功能强大的微软 PowerPoint。PowerPoint 仍然是分析师数据沟通工具集中的重要工具。
仪表板和幻灯片都是非常好的工具,对良好的分析至关重要。然而,它们并不能解决所有问题。仪表板的倾向和易用性使它们容易被无用的 KPI 和过于复杂的图表填满。让我们面对现实吧,真的有人喜欢幻灯片吗?大多数人不正确地使用卡片(作为信息存储,而不是作为通信设备),它们的静态性质使它们很快变得无关紧要,经常被放在某人笔记本电脑的文件夹中,再也看不到了。
幸运的是,有其他方法来交流数据中的有趣模式,而不涉及仪表板或甲板。在本文中,我将分享我在我的公司 Franklin Sports 以及多年来与我合作的其他组织中部署的四个。
1)基于事件的电子邮件
您所工作的许多团队可能都有需要密切关注的特定事件,以便做好他们的工作。这里有 4 个来自电子商务世界的例子,但还有更多:
- 缺货的产品
- 更改项目的名称
- 支出的大幅增加/减少
- 你的网站/亚马逊页面上的新评论
- 异常网站活动
让我们看第一个例子——您可以构建一个仪表板来显示低库存或零库存产品的运行列表。但问题是,用户知道发生了什么的唯一方式是通过查看仪表板。在这种情况下,创建一个仪表板,虽然旨在帮助解决问题,但实际上增加了更多的工作——用户必须每天/每周检查它,以与低库存的产品保持一致。
自动电子邮件解决了这个问题,它只在用户需要更仔细地查看数据时才向用户发送直接信息。这种解决方案的美妙之处在于,你不需要在电子邮件中放入太多信息——只要足以让用户知道他们需要仔细查看即可。如果你需要给出更多的背景信息,你可以在邮件中放置一个与当前问题相关的实时仪表盘链接。任何脚本语言都可以处理数据的接收,Outlook 和 Gmail APIs 也很容易使用。可以使用简单的 CRON 作业来设置自动化。
这种方法的简单会让你忽略它,但是不要!这种简单的格式可以极大地改善商业用户的生活,我一直对有这么多的用例感到震惊。
2)动态共享电子表格
许多商业用户想要操作他们自己的数据,但是缺乏必要的技术技能。他们可能还需要非常特殊格式的数据,这种格式很难手动复制。多个用户可能需要访问相同的数据集。所有这些都很难用仪表板来实现,用 excel 附件或 PowerPoint 演示板是不可能的。
通过利用共享驱动器或 Google Sheets(Microsoft Graph API for Sharepoint 或 Sheets API),您可以通过自动将预先清理的新数据推送到共享位置来解决这个问题。在 Franklin Sports,我们使用这种方法来帮助我们的预测分析师和买家一起工作,使用始终位于同一位置的干净、动态更新的数据来完成新订单。当新订单到来时,Python 脚本会提取新订单数据,添加额外的列,对其进行清理和格式化,然后将其推送到指定的共享驱动器位置。这一流程为两个团队节省了数百小时的人工收集数据和发送一次性电子邮件以就购买决策进行沟通的工作。
3)可重复生成或共享的 IPython 笔记本/R 脚本
当我们谈论民主化数据时,我们通常指的是仪表板。但是真正的数据民主化允许业务用户使用他们熟悉的工具深入研究数据。这种工具通常是 Excel,但是对于稍微有点技术能力的商业用户来说,可重用的 IPython 笔记本或 R Script 甚至更强大。
考虑这样的情况,当用户想要可视化、图形化或分析数据透视表甚至复杂仪表板之外的动态数据时。例如,在 Franklin Sports,营销团队利用 RStudio 脚本对 AdWords 活动和关键词进行深入分析。这种分析需要在半一致的基础上再现,并且需要旋转和非旋转数据,以及生成多个图表等。这种类型的分析很难在 Excel 中重新生成,仪表板也不够灵活——这正是 IPython 或 RStudio 的优势所在。通过一些设置脚本的帮助和一些培训,商业用户知道如何运行它——IPython 笔记本和 R 脚本可以非常强大。
这种方法的好处是双重的:1)商业用户能够成为他们自己的分析师。2)业务用户对高级工具越熟悉,分析团队的工作量就越少,从而将他们从更复杂的统计分析、建模或数据工程中解放出来。
4) 长格式文件(2 页以上)
在这一点上,众所周知亚马逊不使用 PowerPoint 。背后的原因很简单——写文档迫使你清楚地表达你的立场或想法。根据关于这个主题的几十篇文章,亚马逊会议从一份文件(有时长达 6 页)开始,在会议实际举行之前,每个人都有机会了解会议组织者的立场或想法。据亚马逊员工称,这种技术极大地提高了会议的质量。
长格式文档在商业中多少会受到一些非议,但它们在传达复杂思想方面非常出色。来源:https://www . pexels . com/photo/people-discuse-about-graphs-and-rates-3184292/
根据我的经验,当复杂的分析或想法需要交付给企业时,长格式的文档比 PowerPoint 更好。当我为 USAA 银行的预测建模团队做顾问时,我亲身体会到了这一点。对于 USAA 的建模分析师开发的每个模型,都需要编写一个文档,将该模型的目的、设计和实现传达给企业。这种方法不仅为建模过程的技术方面增加了急需的严格性,而且迫使分析师和业务更紧密地合作,以使业务目标与建模结果保持一致。高度技术性的数据科学家被迫将他们复杂的模型简化成企业容易理解的文档。这一政策不仅极大地改善了会议,而且提高了建模和数据科学团队与业务之间关系的整体质量。
拓展你的沟通方式
虽然 PowerPoint 面板和仪表板可能很棒,但还有许多其他方法可以改进您或您的团队交付优秀分析的方式。我希望我今天概述的一些方法能够启发你扩展如何在数据中交流有趣的模式。
有问题或意见吗?你可以给我发电子邮件,地址是 cwarren@stitcher.tech,或者在 Linkedin 上关注我,地址是https://www.linkedin.com/in/cameronwarren/