如何通过 Azure 基础认证
看看参加 AZ-900 考试时应该做什么(和不应该做什么)
A Z-900 是世界上最受欢迎的云服务的最受欢迎的认证。Azure Fundamentals 是许多使用云的人的起点。
这表明你对 Azure 有很好的、高水平的理解,这很好,但也让很多人感到困惑。它不是关于您是否可以设计一个 web 应用程序,并通过 CI/CD 管道自动化您的部署。
相反,该认证的优势来自于它所针对的业务用户视角,但这也是我们中许多更倾向于技术的人将会努力的地方。
这并不是说这个认证对技术人员没有用;的确如此。事实上,对云概念、基础架构、安全性和服务的概述是任何从事云工作的人的必备知识。
这门课程在技术上没有挑战性,但范围很广。我们将讲述全天候访问客户电话线路所需的支持级别,或者我们的 IT 管理员使用 Powershell 脚本部署虚拟机所需的设置。
因此,尽管表面上看起来很蓬松,但这是可以理解的——这是一个棘手的认证方法。让我们来演练一下第一次使用 AZ-900 时应该做什么和不应该做什么。
准备时间
你需要准备考试的时间会有很大的不同。如果你是一名从 AWS 转移到 Azure 的高级云工程师,你可能最多不需要超过一天的时间。
如果你想知道为什么微软提供一个覆盖天空中那些毛茸茸的白色东西的认证,给自己多几天时间。
如果你是一名开发人员,但是还没有接触过云。每天三到四个小时,持续一周应该足够了——或者两周才安全。
官方 Azure 基础学习路径
很容易,最好的起点是比尔自己的 Azure 基础学习路径。
官方说法是,总共需要 9 小时 48 分钟。对我来说,需要更长的时间。
如果你只是简单地通读,并观看短视频,不到十个小时可能是正确的。但我会推荐一种更积极的方法,尝试以下几种方法的组合:
1。做大量笔记。我对记笔记的一个小建议——尝试一下【T2 概念】(太棒了)。
2。当你看到新的术语时,比如负载平衡器阅读更多相关信息。询问类似这样的问题— 为什么它是第 4 层负载平衡器?等。
3。尝试使用服务。在一些迷你项目中使用 Azure 会让你的理解达到一个全新的水平。
同时,不要在这些额外的步骤上走极端。在接下来的步骤中,我们将继续这种更积极的学习方法,所以不要让自己筋疲力尽。
总的来说,我建议在这上面花大约 15 个小时——当然,按照你自己的节奏工作。
FreeCodeCamp 的 Azure 基础教程
接下来是 FreeCodeCamp 在 YouTube 上的 AZ-900 教程视频。在经历了微软的学习历程后,这是一个受欢迎的步伐变化。
这个视频是我见过的最好的 AZ-900,在三个小时长,它涵盖了很多。
虽然它在很高的层次上解释了一切,但仅凭这个视频,你可能无法通过这门课程。但是这对于巩固我们在官方学习途径中学到的东西是非常好的。视频格式也使它更容易跟随!
同样的积极学习的方法也适用于这里。做笔记,做一些额外的阅读,并进行一些练习。
模拟测试
最初,我对支付在线模拟测试的费用犹豫不决。在我完成第一次考试后,我只得了可怜的 56%分——肯定不及格。
因此,如果有一件事我可以推荐,甚至比官方的学习路径,或 FreeCodeCamp 的视频更值得推荐。你应该投资做一次模拟测试。
其次,如果有什么比买模拟试题更值得我推荐的话。阅读测试评论!
很多模拟测试已经过时了,所以要小心一点。
我使用了 Skillcertpro ,它附带了七个模拟测试。
无论你使用 Skillcertpro 还是其他平台,完成他们提供的每一个考试。我发现我会在一次考试中获得 92%的高分,然后在下一次考试中获得 60%的高分。它们可以变化很大。
最后,在这个阶段,积极的方法是非常重要的。参加模拟考试,通读结果——记下你做对了什么,并通过官方 Azure 文档或其他地方调查你做错了什么。
要记住的最后几点
对于考试,有一些额外的事情需要注意:
- 门槛根据考试难度变化。以 700 分(满分 900 分)为目标应该能让你及格。
- 问题的数量可能变化很大;许多资源总共引用了 40-65 个问题。我得了 29 分——不要对此感到惊讶!
- 考试时间也各不相同,但实际上你不必着急。慢慢来,在点击提交之前仔细检查你的问题。
- 如果你在家考试,早点登录。在开始之前,你需要下载他们的软件,验证你的 ID,拍摄你周围的照片等等。
学习完本文中的所有材料后,你将会为考试做好充分的准备。
我希望你喜欢这篇文章!如果你有任何其他资源可以推荐,或者有任何问题,请通过推特或者在下面的评论中联系。
祝你好运!
有兴趣应用你新发现的 Azure 知识吗?试试我的 Azure 网络应用部署指南:
利用 Angular 和 Azure 应用服务快速轻松地部署应用
towardsdatascience.com](/how-to-deploy-web-apps-with-azure-52ca340b41b9)
如何在 3 分钟内过滤一个熊猫数据帧
如何过滤熊猫数据框有很多选择,我将向你展示最常见的功能
在 Pandas 中,有许多方法可以过滤数据帧。我将在辛普森一家的帮助下向你介绍最重要的选择。
布尔索引
布尔索引需要找到每一行的真值。如果你寻找df['column'] == 'XY'
,,一个真/假序列被创建。
我想象你刚刚在《辛普森一家》的片场。他们是明星,每个人都可以为下一季订购一些东西,由制作人支付费用。你的工作是接受主角的命令并转发相关数据:
df = pd.DataFrame({'Items': 'Car Saxophone Curler Car Slingshot Duff'.split(),
'Customer': 'Homer Lisa Marge Lisa Bart Homer'.split(),
'Amount': np.arange(6), 'Costs': np.arange(6) * 2})print(df)
Items Customer Amount Costs
0 Car Homer 0 0
1 Saxophone Lisa 1 2
2 Curler Marge 2 4
3 Car Lisa 3 6
4 Slingshot Bart 4 8
5 Duff Homer 5 10
示例 1-选择具有特定值的行
让我们找出 Bart 的所有条目,以便转发给他的经理:
df.loc[df['Customer'] == 'Bart'] Items Customer Amount Costs
4 Slingshot Bart 4 8
示例 2 —从列表中选择行
片场有传言说,我们是数据专家,广告合作伙伴想知道节目中的孩子们出于营销原因订购了什么:
kids = ['Lisa','Bart']df.loc[df['Customer'].isin(kids)] Items Customer Amount Costs
1 Saxophone Lisa 1 2
3 Car Lisa 3 6
4 Slingshot Bart 4 8
我们会在电视广告上看到萨克斯管、汽车和弹弓…
示例 3 —组合多个条件
辛普森一家也必须省钱。新规则是:1)禁止汽车,2)每人最多可订购 3 件商品:
df.loc[(df['Items'] != 'Car') & (df['Amount'] <= 3)] Items Customer Amount Costs
1 Saxophone Lisa 1 2
2 Curler Marge 2 4
我希望霍默和巴特能和我们在一起,不要怒气冲冲地离开节目…
示例 4 —选择未出现在列表中的所有行
不幸的是,该系列的明星们对这些削减一点也不热情,所以第一批赞助商站出来帮忙:
happy_stars = ['Lisa','Marge']df.loc[~df['Customer'].isin(happy_stars)]Items Customer Amount Costs
1 Saxophone Lisa 1 2
3 Car Lisa 3 6
4 Slingshot Bart 4 8
位置索引
有时,您不想根据特定条件进行过滤,而是根据数据帧的位置选择特定行。在这种情况下,我们使用切片来获得想要的行。
示例 1 —选择数据帧的前几行
你部门的新实习生不应该直接处理整个数据集,他只需要前三个条目:
df.iloc[0:3]
Items Customer Amount Costs
0 Car Homer 0 0
1 Saxophone Lisa 1 2
2 Curler Marge 2 4
示例 2 —选择数据帧的最后几行
你有很多工作要做,你会得到另一个实习生。为了让两个学员独立完成他们的任务,您现在保存记录的最后三行:
df.iloc[-3:]
Items Customer Amount Costs
3 Car Lisa 3 6
4 Slingshot Bart 4 8
5 Duff Homer 5 10
结论
我们能够根据其值或位置从我们的数据集中选择任何特定的行。Pandas 提供了在制定条件时考虑多个值的简单方法。列表和条件可以很容易地链接在一起。
如果您喜欢中级和数据科学,并且还没有注册,请随时使用我的推荐链接加入社区。
如何从命令行查找和组织数据
metaframe 简介:面向数据科学家的基于 markdown 的文档工具和数据目录。
回购:【https://github.com/rsyi/metaframe】T2
如果你是一名数据科学家,你的工作就是从数据中提取价值。但是在你的职业生涯中,你可能会花费(并且已经花费)大量的时间去寻找和获取所说数据的背景。以我的经验来看,这通常是徒劳的——你问团队中最资深的人,谁让你去找别人,谁让你去找别人,谁告诉你他们不知道你在说什么。然后你重复这个过程,直到你找到一个人可以给你一个有用的表。
person = senior_data_scientist
while person and not_tired:
response = ask(person)
if type(response) == Table
rejoice()
if type(response) == Person
person = response
但是这个算法真的是蛮可怕的!这绝不是一个彻底的搜索,您最终会得到一个无人维护、无人使用的表。如果你决定冒险把它用在你的生产流水线上,当你六个月后发现这张桌子并不像你想象的那样工作时,你可能会让你的公司损失一大笔钱。更何况这是一个**巨大的时间浪费!有时你会忘记几个月后桌子做了什么,你不得不再次做这个,让你的同事沮丧。那么你能做什么呢?
简要介绍数据目录及其局限性
幸运的是,这个问题已经有了解决方案:数据目录。数据目录名副其实,因为它们只是为您提供一个数据目录。它们允许您按名称搜索和查找表,查看它们的列和元数据,并使用附加文档丰富这些元数据。存在许多闭源播放器,如 Alation 和 Collibra ,许多科技公司已经发布了开源版本,包括网飞的 Metacat ,Lyft 的 Amundsen ,以及 LinkedIn 的 Datahub 。许多公司都在为自己开发这些工具(Airbnb、优步、谷歌、脸书等等)。
这就引出了一个问题:为什么不使用/实现这些解决方案中的一个呢?
嗯,你可能想认真考虑一下,最终,但是有巨大的进入壁垒:建立目录往往是昂贵的,或者,在开源工具的情况下,很难建立。对于只有少数数据科学家和分析师的公司来说,花费几十万美元或几个月的工作来实现一个工具几乎是不值得的,这个工具最多可以节省你转向你的邻居并再次向他/她询问那张桌子的几分钟时间。**
我和一些在小型创业公司工作的朋友谈过这个问题,虽然数据文档和数据发现的问题即使在最小的规模上也很突出,但成本效益权衡根本没有意义。但是,仅仅因为问题太昂贵而无法用现有方法解决,并不意味着不存在划算的解决方案。
那么解决办法是什么呢?
我想,“T7 比 T8 更容易建立目录。”日复一日,我只想寻找我的数据,检查列名,并做一些笔记。为什么这么难?我已经可以通过将所有内容保存在团队范围的电子表格中来手动完成这项工作。
所以我想我应该试着 80/20 这个。结果呢?
元框架 。
Metaframe 是一个基于 CLI 的数据目录,带有一个定制的基于 Markdown 的元数据后端,一个基于 fzf 的搜索服务,以及一个用 bash 和 python 编写的 ETL 管道,构建于 lyft 的 amundsendatabuilder 库之上。
但这很难理解。这里有一个快速演示:
本质上, metaframe 只是一个有点固执己见的文档工具。想只为一桌写笔记?很简单,只需键入以下内容:
**mf new table_name**
您将进入一个位于~/.metaframe/metadata/table_name.docs.md
的文本文件,您可以在此表格上添加您的注释。然后,通过运行以下命令,可以在您的搜索中访问这些内容
**mf**
这并不局限于表格——您可以为 SQL 查询、ML 模型、jupyter 笔记本等创建新的文档。我个人在~/.metaframe/
中保存了一个名为recipes
的子文件夹,在那里我存储了 SQL 的命名片段。
如果您想要更全面的数据目录体验,metaframe 还支持本地运行的 ETL 作业。您所需要做的就是通过运行mf connections edit
在 yaml 中指定一个连接,然后运行mf etl
,您所有的数据都可以使用mf
来访问。搜索并找到要做笔记的表格后,可以按 enter 编辑与所选表格相关联的文档,该文档将在以后的搜索中附加到元数据预览窗口。
因为文件结构完全是基于文本的,您甚至可以导航到~/.metaframe/metadata
并用 git 跟踪它的版本。在一个有许多想要共享笔记的合作者的公司中,一个简单的模式可以是设置 CI/CD(或一个气流作业)来自动填充 git 存储库中的数据,并让用户将他们的个人文档推送到这个 repo 中的分支。因为这是版本跟踪的,所以通过检查您的同事的个人分支的提交历史,您应该能够很容易地看到您的同事了解哪些表,而不必询问他们。
有什么警告吗?
我注意到 metaframe 的唯一问题是,它会在 100,000 张左右开始突突。但是对于具有这种规模的公司来说,谨慎的做法可能是:( a)不在本地运行 ETL 作业,( b)限制正在提取的模式。在 metaframe 中,这只是简单地给你的mf connections edit
文件添加几个标志,比如included_schemas
或者excluded_schemas
。更多详情参见文档。
Metaframe 支持 presto 或 neo4j 上的手动文档和 ETL(amundsen ),但是我们也支持定制的构建脚本,以支持定制的提取作业(从任何仓库,从预先抓取的数据库存储,等等。).我们也正在建立更多的本地连接(例如,雪花和 Postgres 正在工作中)。如果您热衷于让它为您的特定设置工作,请随时提出问题,我们会帮助您。或者,如果你愿意,做点贡献吧!😃
摘要
数据文档和数据发现是严重的问题,但它们不是数据科学家通常考虑的事情。我们很容易忽视一个每周浪费不到一个小时的问题,但我在这里告诉你,在所有规模上都有解决这个问题的办法。试试 metaframe 吧,我保证一旦你尝到了它的味道,你就离不开它了。
****回购:【https://github.com/rsyi/metaframe】T2
如何用 80 行代码找到便宜的航班
使用 Python 毫不费力地找到划算的交易
来源:https://unsplash.com/photos/Nukqi6L_5DU
由于旅行已经变得几乎不可能,我决定考虑如何开始为我的下一次旅行做准备。是的,我想到了旅行。
正如大多数人所知,飞机票价格相差很大。这是因为航空公司使用收益管理,这是一种旨在预测消费者行为以实现利润最大化的定价策略。
例如,用下面的代码,我连续两天每天 48 次查看一张从蒙特利尔到奥斯陆的机票。价格在 891 美元到 1298 美元之间(所有数据都是从 Kayak 报废的,右边这里)。同样的日期,同样的目的地,价格却相差很大。
考虑到这一点,我编写了一个代码,可以搜索便宜的机票,如果找到了,就通过电子邮件通知我。
这是代码。
包和参数
让我们从导入必要的包开始:
**# import libraries** from bs4 import BeautifulSoup
from selenium import webdriver
import pandas as pd
import datetime, re, time, itertools, smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
然后,我们定义代码工作所需的参数:
**#Define parameters** start_date = datetime.datetime(2020,9,13)
days_range = 2
trip_length, min_length, max_length = 7, 6, 12
price_goal = 900
cities = 'YMQ-OSL'
- 航班起飞的最早日期。
days_range
:离开start_date
的最大天数。基本上,旅行最晚什么时候开始(这里是 9 月 15 日)。trip_length, min_length, max_length
:期望的行程长度,以及可接受的最小和最大长度。可以等同于trip_length
。price_goal
:您希望收到电子邮件提醒的价格。cities
:出发和到达的城市。为了找到正确的缩写,请在网站上搜索航班时查看网址。
创建日期组合
既然已经定义了所有参数,下面是如何为旅行创建所有可能的出发/返回日期组合。
事实上,你可能有灵活的日期,无论是出发/返回还是旅行的长度。下面的代码将根据前面定义的参数生成所有可能的旅行日期。
首先,我使用itertools
库生成所有可能的日期组合。
然后,下面的循环允许我们去掉所有不尊重条件的日期(旅行的最小/最大长度)或不连贯的日期(出发日期之前返回)。
最后,下面几行代码清除了日期,使它们可用于后面的循环。
**#Cleaning dates to make them usable in loop** for i in range(len(departing)):
departing[i]=re.sub(' 00:00:00', '', departing[i])
returning[i]=re.sub(' 00:00:00', '', returning[i])
抓取数据并接收警报
现在,说点实际的。这是用来找到最佳航班的算法,并确保当价格足够低时,您会收到提醒。
- 在 URL 中插入城市和日期
- 获得 Kayak 使用硒和美丽的汤提议的最佳飞行的价格
- 如果找到一个价格,保存它,如果没有,返回“没有找到航班”(try-expect 循环)
- 如果找到的价格低于
price_goal
参数,发送一封电子邮件提醒,其中包含找到价格的 URL。
这是完整的代码。
这里我想提三件事。首先,不要忘记下载一个 chrome 驱动程序(并在第 6 行调整可执行路径)来使用 Selenium。
第二,不要忘记更新发送者、密码和接收者参数。这些指定了发送电子邮件的地址和接收电子邮件的地址。如果你愿意,你也可以改变邮件内容(主题或正文)。
第三,代码当前是为 Gmail 地址发送者设置的。对于任何其他类型的地址,应该更改端口(第 22 行)和stmp.gmail.com
(第 37 行)。
收到的电子邮件警报应该是这样的:
使用任务计划程序
所有这些都是一个好的开始,但是不断地手工运行代码是浪费时间,直到找到一个好的交易。还不如像任何人一样,手动在 Kayak 上寻找交易。
幸运的是,任务调度程序是存在的。这个想法很简单。您可以安排您的代码每天运行 N 次,时间长短由您决定。你甚至可以在电脑睡眠时让它工作(但不要关机)。
关于如何用 python 脚本设置 Windows 任务调度器的教程,请点击这里。使用这个工具在很多情况下都非常有用,我强烈建议你学会使用它!
现在,当你坐下来喝杯啤酒时,你可以让你的电脑搜索廉价航班。你不仅节省了时间和金钱,而且是免费的。
非常感谢你的阅读!
完整的代码可在这里。
如何从 FP-Growth 中发现闭和最大频繁项集
Python 优化寻找闭和最大频繁项集
在上一篇文章中,我已经详细讨论了什么是 FP-growth,以及它是如何发现频繁项集的。此外,我从头开始演示了 python 实现。在这篇文章中,我将介绍关联规则挖掘中的两个重要概念,闭项集和最大频繁项集。为了理解这个概念,你需要对什么是 FPtree 和什么是频繁项集有一些基本的了解。我的上一篇文章涵盖了所有的基础知识。
什么是闭频繁项集和最大频繁项集
这里我们快速回顾一下频繁项集的概念。项目集的支持度大于或等于 minsup(最小支持度)阈值。支持度是项目集出现的频率。例如,给定一组事务 T,我们希望找到在所有事务中出现 2 次以上的所有项集。这可以看作是寻找所有 minsup ≥2 的频繁项集。
那么什么是闭和最大频繁项集呢?
根据定义,如果一个项目集的直接超集都不是频繁的,那么这个项目集就是最大频繁项目集。如果一个项集的直接超集都不具有与该项集相同的支持度,则该项集是封闭的。让我们用一个例子和图表来更好地理解这个概念。
这里我们有 5 个事务的事务 T,让我们用一个树形图表示所有的项集层次结构,并用红色写下项集出现在顶部的事务。
示例演示。
如果我们将 minsup 设置为 2,那么任何出现两次以上的项集都将是频繁项集。在这些频繁项集中,我们可以通过比较它们的支持度(出现频率)和它们的超集来发现闭的和最大的频繁项集。
突出显示所有封闭和最大频繁项目集
我们可以看到最大项集是闭项集的子集。同样,最大项目集作为一个边界,任何低于最大项目集的都不是频繁项目集(任何最大项目集的超集都不是频繁的)。
频繁、闭和最大项目集之间的关系
Python 实现
有许多不同的方法试图有效地找到最大和最接近的频繁项目集。这仍然是数据挖掘领域的一个热门研究问题。有兴趣的话可以找很多不同算法的研究文章来解决这个问题。我将演示一种相对简单的方法,通过比较每个项目的支持度和它们的超集来发现基于频繁项目集的闭和最大频繁项目集。然而,考虑到 O(n)的运行时间复杂度,这种方法可能相当耗时。为了在处理大型数据库时优化算法,我们需要利用 python 字典。通过将具有相同支持计数的所有项目集存储到一个字典中,使用支持作为关键字,我们可以将复杂度降低到 O(n)。因为我们不需要比较每一项,因为所有超集都有来自其父代的≤支持。并且我们在寻找封闭项集时只需要比较具有相同支持计数的项。同样的事情也适用于寻找最大项目集。
为了实现,我首先使用 MLXtend 库和 fpgrowth 函数来计算频繁项集,并编写自己的函数来从第一步的结果中挖掘封闭和最大频繁项集。
#Import all basic libray
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
import time
from mlxtend.frequent_patterns import fpgrowth#Task1 : Compute Frequent Item Set using mlxtend.frequent_patterns
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)start_time = time.time()
frequent = fpgrowth(df, min_support=0.001, use_colnames=True)
print('Time to find frequent itemset')
print("--- %s seconds ---" % (time.time() - start_time))# Task 2&3: Find closed/max frequent itemset using frequent itemset found in task1su = frequent.support.unique()#all unique support count#Dictionay storing itemset with same support count key
fredic = {}
for i in range(len(su)):
inset = list(frequent.loc[frequent.support ==su[i]]['itemsets'])
fredic[su[i]] = inset#Dictionay storing itemset with support count <= key
fredic2 = {}
for i in range(len(su)):
inset2 = list(frequent.loc[frequent.support<=su[i]]['itemsets'])
fredic2[su[i]] = inset2#Find Closed frequent itemset
start_time = time.time()cl = []
for index, row in frequent.iterrows():
isclose = True
cli = row['itemsets']
cls = row['support']
checkset = fredic[cls]
for i in checkset:
if (cli!=i):
if(frozenset.issubset(cli,i)):
isclose = False
break
if(isclose):
cl.append(row['itemsets'])print('Time to find Close frequent itemset')
print("--- %s seconds ---" % (time.time() - start_time))
#Find Max frequent itemset
start_time = time.time()ml = []
for index, row in frequent.iterrows():
isclose = True
cli = row['itemsets']
cls = row['support']
checkset = fredic2[cls]
for i in checkset:
if (cli!=i):
if(frozenset.issubset(cli,i)):
isclose = False
break
if(isclose):
ml.append(row['itemsets'])print('Time to find Max frequent itemset')
print("--- %s seconds ---" % (time.time() - start_time))
感谢您的阅读,我期待听到您的问题和想法。如果你想了解更多关于数据科学和云计算的知识,可以在 Linkedin 上找我。
参考文献
http://rasbt . github . io/mlx tend/user _ guide/frequent _ patterns/FP growth/
如何在新冠肺炎期间找到数据科学工作
Clem Onojeghuo 在 Unsplash 拍摄的照片
众所周知,新型冠状病毒 2019(新冠肺炎)的爆发正直接或间接地深深影响着全球数百万人的生活。由于新冠肺炎政府关门,仅美国在过去两周就失去了近 1000 万个工作岗位。
一些会议、聚会、课程、音乐会和其他文化活动已经被推迟、取消或转移到网上。他们中还有数据科学、数据工程和数据分析职位,这些职位已经转移到了网上。
然而,调查表明,数据团队目前还没有看到大范围的裁员或休假,特别是在大公司中。所以,趁工作还没结束就罢工吧?
在任何给定的时间点,数据对于任何公司都是不可避免的,在这种情况下,初级水平的数据位置可能是一个堆栈,但你不能放弃。我们都明白目前国家和全球对招聘的影响是不确定的,但在这个动荡的时期,你有办法保持积极主动地找工作。
这些天我读了很多文章,都是关于这些天如何转换工作,或者如何在疫情期间找工作,如何保持理智。在这个故事中,我总结了 7 件现在要做的事情来继续你的数据科学求职。开始了…
1.加强你的联系
投入时间与你感兴趣领域的人、数据线索、招聘公司的数据团队建立联系。至少花一两个小时在职业网络上与人交流。
虽然你可能非常想要求引荐,但花点时间了解他们的工作,他们公司的情况,近期的前景,工作要求和期望。
- 利用你的时间进入你的人际网和他们的人际网,看看他们是否认识正在招聘的人或者有空缺职位的组织。
- 寻找志同道合的专业人士,你可能一直钦佩他们来引发关于可能的机会和虚拟网络活动和聊天的对话。
- 参加更多的在线活动、研讨会、实验室,看看是否有机会获得面试机会
专业建议:加入脸书和 LinkedIn 上的专业团体,扩大你的求职和人际网络。在封锁期间,这是建立新的、真实的联系和恢复旧联系的绝佳机会。
2.参与您的网络
这是你已经认识的人的网络。你肯定已经这么做了,但是问问你的朋友、导师、很久以前的同事,他们是否知道任何空缺的职位。
问问他们是否愿意通过电子邮件把你介绍给公司的同事,或者更好的是招聘经理。我认识一个人,由于前公司前老板的电子邮件介绍,他在 4 月下旬被录用了。相信我,电子邮件介绍从来不会失败。
让你关系网中的人代表你发送你的简历和求职信,可以让你的申请排在最前面,即使人力资源部在这些繁忙、不可预见的时期没有整理好通过 ATS 收到的申请。
如果你看到前同事和老板的公司有空缺,不要犹豫,立即联系他们。他们比其他人更有可能雇用你,因为他们已经知道你的技能和职业道德。
即使那家公司没有在招人,或者可能通过他们的关系网听说过其他工作,他们也可以为你提供很好的参考。如果还没有联系,现在就联系吧!
3.修改你的简历和作品集
Tbh,每次打开我的 LinkedIn 个人资料,我都觉得我可以提高。我甚至没有谈论 Github,尽管它在我的简历上。
如果你想走得更远,永远没有尽头。
花点时间写你的简历,磨练你的技能来推销你的“雇佣”版本。简历和网上资料是第一印象,甚至在别人了解你之前。你的简历反映了你目前的职业成就、教育、激情和技能。
说白了,我总觉得你应该是一个自己的品牌;一份能准确反映你是谁的工作,一份能让雇主感受到你的叙述和使命的工作。我们都很清楚 ATS 是如何运作的,如何让你从众多申请者中脱颖而出是一项艰巨的任务。申请远程职位时,仔细阅读职位描述,展示与职位描述相匹配的具体技能。
学习新技能,完成那些你已经开始但从未完成的,或者温习那些早已遗忘的。
4.为每项工作定制您的应用程序
尽管如此,将你的简历与工作描述相匹配,如果你没有根据工作要求和期望定制你的申请,那将是一个遗憾。
花更多的时间来构思你的求职信和简历,这样你的工作申请会得到应有的关注。通过 ATS 的秘诀是包含帖子本身的关键词!
因此,我们永远不应该犯从职位、职责或所需技能中抄袭工作的错误。但是,要确保你符合招聘经理指定的要求,比如合适的技能、教育水平或职称。
5.从事自由职业
数据科学或分析领域的自由职业者是一个棘手的概念。如果你已经了解了数据科学的概念,要成为一名自由职业的数据科学家,你可以做很多事情,也可以学习很多东西。Upwork 将是你寻找自由职业者的最佳起点。
更多的自由职业者工作可以从 PeoplePerHour.com 的到、到或
我推荐阅读来自 freeCodeCamp 的这篇关于如何成为自由数据科学家的博客。从建立一个文件夹开始,突出你的工作调色板,你的热情。
退一步说,如果你目前没有工作,至少自由职业可以支付我们的账单。这也是从“真正的”项目中获得一些急需技能的好机会。
如果你目前在 WFH 时尚界,值得注意的一点是,雇主正在寻找灵活、自律、拥有与同事和客户远程沟通所需的出色书面和口头沟通技能,并且高效的人。把这些都写进你的个人资料吧!
6.考虑临时职位——要灵活
有总比没有好!
你可能会遇到一个需要你工作 3-6 个月或者直到项目结束的职位,那么接受这个职位怎么样?谁知道那会不会变成一份全职工作!?足够敏捷,可以根据需要进行旋转。
我只会建议谷歌搜索“临时数据科学工作”。你可能会惊讶地发现,在 Indeed、ZipRecruiter、LinkedIn 或任何其他招聘网站上,有几个职位都有这个关键词。
这篇跳板文章有一个寻找数据科学工作的网站列表。
考虑一下临时的数据科学工作,让你在这个全球化的疫情中度过难关。如果这是你第一次进入自由职业者的领域,评估一下你最重要的可转移技能,然后寻找机会在不同的岗位上利用这些技能。
7.了解虚拟工作工具
您知道 Zoom 有分支会议室吗?分支会议室是从主 Zoom 会议中分离出来的会议,允许参与者在更小的小组中开会。
我发现,在实习开始前,我可能不得不学习一个工具,一个 Office 365 或独立的微软工具,我从来不知道它的存在。顺便说一句,组织使用 SharePoint 来创建网站。
了解所有功能和几乎所有相关信息:
实时沟通: Slack,微软团队,
视频会议: Zoom、Google Hangout、Skype for Business
*项目管理:*阿萨纳,Monday.com,特雷罗,适时
工具:谷歌在线套件,Office 365
8.保持高昂的情绪!
对于我们所有人来说,这是一个艰难的时期,甚至那些正在招聘的公司也在经历着不必要的转型。尽可能对自己和雇主有耐心。
虽然我们周围的一切都势不可挡,但你需要认识到,鉴于公司正在努力适应这些新常态,招聘过程将比平时慢。
记得一天一次拿东西*。公司仍在积极招聘和寻找优秀的新人才来解决他们的问题,并继续在逆境中保持弹性。*
感谢您阅读本文!我希望你。一定要让我知道你对这次启示录招聘的想法。对于读到这里的招聘人员,请让我们知道你的公司是否正在招聘!!
保持安全,保持理智…
免责声明:本文表达的观点仅代表我个人,不代表严格的观点。
了解你的作者
拉什是芝加哥伊利诺伊大学的研究生。她喜欢将数据可视化,并创造有见地的故事。当她不赶着赶学校的最后期限时,她喜欢喝一杯热巧克力,写一些关于技术、UX 等的东西。
如何通过交叉验证找到决策树深度
消化偏差-方差权衡、过拟合、欠拟合、K 倍交叉验证背后的直觉。
RegalShave 在 Pixabay 拍摄的照片
什么是决策树?
假设我们有一组经度和纬度坐标,对应于两种类型的区域:植被和非植被。我们可以建立一个逻辑回归模型,能够将任何坐标分类为植被或非植被。如下图所示,当类别在特征空间中很好地分离时,用于分类的逻辑回归工作得最好。
资料来源:哈佛大学 P. Protopapas 教授的讲稿
现在,让我们设想一种情况,植被分布在几个地区。如下图所示,现在解释非线性决策边界就不那么简单了。
资料来源:哈佛大学 P. Protopapas 教授的讲稿
事实证明,在这种情况下,一个简单的流程图可以被公式化为用于分类的数学模型。它们的优势是可以被人类理解。我们用一个简单的例子来说明这些决策树是如何工作的,在这个例子中,一种水果应该被识别为柠檬或橙子。
资料来源:哈佛大学 P. Protopapas 教授的讲稿
如何训练决策树?
为任何给定的训练数据集学习最小的决策树是一项困难的任务。在每个节点中,我们需要选择分裂的最佳预测值,需要选择分裂的最佳阈值。在前面的示例中,我们首先通过查看水果的宽度并使用阈值 6.5 厘米来决定。我们也可以从水果的高度开始,或者为宽度选择不同的阈值。我们的选择对树的区域形状有影响。
理想情况下,随着分裂次数的增加,这些区域应该逐渐变得更纯。每个区域应该专门针对一个类(柠檬或橙)。通常通过测量分类误差来评估这种分割的质量。也可以使用所谓的基尼指数来评估该区域的纯度。或者,区域的熵可以告诉杂质的级别。
什么是偏差-方差权衡?
在训练期间,该树将继续增长,直到每个区域恰好包含一个训练点(100%训练准确度)。这产生了一个完整的分类树,该分类树分割训练数据,直到每个树叶包含单个观察值。换句话说,整个树会过度适应训练数据。
过度拟合
过拟合的树将实现训练观察的完美分类,并且偏差(误差)将为 0 。然而,这样的树会非常敏感,因为训练观察的微小变化会导致预测的类别发生很大变化,这意味着模型方差会非常高。这个模型不能很好地概括看不见的数据。
权衡取舍
为了防止过拟合的发生,我们需要定义一个停止条件。低深度的树不能捕捉分隔类的非线性边界。通过减少树的深度,我们增加了 biais(训练的误分类误差),但是我们也减少了方差。偏差-方差权衡寻求偏差和方差之间的折衷,这里使用交叉验证。
什么是交叉验证?
适当的深度可以通过交叉验证在保留的数据集上评估树来确定。通过多次对数据进行重新采样,将分为训练折叠和验证折叠,在训练折叠上拟合不同大小的树,并查看验证折叠上的分类精度,我们能够找到树的深度,这提供了最佳的偏差-方差权衡。这种树不能完美地预测训练集(可接受的偏差),但是如果我们稍微改变训练集(可接受的方差),它的性能将大致相同。
来源—Scikit-learn.org
通过 K-fold 交叉验证找到最佳深度
诀窍是选择一系列树深度进行评估,并使用 K 倍交叉验证绘制每个深度的估计性能+/- 2 标准偏差。我们提供了一个 Python 代码,可以在任何情况下使用,在这种情况下,您需要调整给定预测张量 X 和标签 y 的决策树。该代码包括图中的训练集性能,同时缩放 y 轴以关注交叉验证性能。
该方法选择树深度 5,因为它使用大小为 5 的交叉验证折叠来实现对训练数据的最佳平均准确度。准确度置信区间的下限足够高,使得该值有意义。当更多的节点被添加到树中时,很明显,交叉验证的准确性向零变化。
深度为 20 的树在训练集上实现了完美的准确度(100%),这意味着树的每一片叶子恰好包含一个样本,并且该样本的类别将是预测。深度为 20 的树过度适合训练集。
我们通过交叉验证选择的树深度 5 有助于我们避免过度拟合,并提供了一个更好的机会来重现准确性,并根据测试数据概括模型,如下所示。
结论
本文中的想法是使用 K-fold 交叉验证和搜索算法。搜索的输入是超参数网格,这是在训练模型之前选择的参数。在我们的例子中,这是一个简单的潜在树深度范围。
我们提供了易于复制的 Python 代码,不仅可以用于调整决策树,还可以用于一般的模型选择任务。其他方法包括嵌套交叉验证。
感谢 Anne Bonner 和 Amber Teng 来自《走向数据科学》的编辑评论。
如何在数据中找到隐藏的局部模式
应用局部偏差变换来揭示数据中微小的局部空间扰动
随着半导体和光电子器件性能的快速提高,相关制造工艺的规范也在快速收紧。这些流程中使用的制造设备必须保持领先,以保持路线图目标。这意味着对现有设备本身的改进是不够的,必须同时为 N+1 或更远的一代开发解决方案。
典型的半导体和光电器件制造包括在半导体晶片或其他衬底上的几十到上千个薄膜沉积、蚀刻、图案化和后处理封装步骤。最终的器件产量高度依赖于衬底上各个薄膜层的空间均匀性。这些不均匀性通常是由硬件的限制或工艺条件的稳定性造成的。因此,理解关键薄膜性质(例如厚度、导电性或光学性质)的不希望的空间变化是设计更好的制造硬件和增加最终器件产量的关键。
半导体晶片上薄膜的不均匀性正在经历戏剧性的改善,从 90 年代初的> 30%到 2000 年代初的 10–15 %,现在正在快速接近并在某些情况下超过< 1%的目标。实现这种改进的难度一级比一级增加得快。
虽然从 30%到 20%可能只花了几年时间,但对于一些流程来说,从 15%到 5%却花了近十年时间。进步不仅是渐进的,而且在许多情况下也是连续的。很容易想象,在总体变化为 10–15%的数据中,很难看到< 1%的变化模式。然而,如上所述,等待发现隐藏的模式不再是一个选项。
早期,许多过程的不均匀性通常是由长期空间趋势决定的。随着制造设备变得越来越复杂以及长期问题的解决,局部不均匀性的重要性开始增加。然而,尽管人们知道下一个大的非均匀性问题将是由局部模式引起的,但是找到这些模式的能力仍然有限。
在本文中,我们描述了在通过化学气相沉积沉积的薄膜的均匀性中搜索隐藏的局部图案的真实生活用例(出于保密的目的,真实的薄膜均匀性数据被替换为质量上相似的趋势,并且真实的隐藏的局部图案被替换为人工生成的图案)。
我们讨论一种通过执行局部偏差变换(LDT) 在整体长期趋势中发现隐藏的局部空间模式的方法。 LDT 通过将每个点的输入值替换为这些值与特征空间中周围邻域点的加权平均值的偏差来转换数据。通过限制邻域的大小和最小化更远的邻居的贡献,长期趋势的影响被最小化并且局部模式出现。
可视化数据
让我们在下图中用凹形、凸形和环形的长期趋势来可视化表示半导体衬底上的薄膜特性的数据,其中有和没有局部隐藏图案,等高线图中色阶显示薄膜特性的变化(蓝色:低;绿色:mid 黄色:高)。
你能看出有什么不同吗?
由于每个集合中的总体模式包含大约 0.5%的随机噪声,来自隐藏模式(当存在时)的贡献不到 2%,其余来自长期径向趋势,因此很难看出上部和下部地图集合之间的任何差异。
也许我们看径向图比看 2D 地图更幸运?
隐藏局部模式的径向图
现在我们有进展了!看到我们橙色线上的蓝色小波浪了吗?好吧,我们可以确认我们的数据中有一些奇怪的东西,但它是什么呢?
局部偏差变换
我们在寻找小扰动方面运气稍好一些(记得<2% hidden pattern?) in the data on the radial profile plots above, but we cannot easily tell the 2D locations or say anything at all about the 2D shape of these perturbations. Thus, we would not be able to link these spatial non-uniformities to specific hardware features causing them in the thin film deposition tool.
那么,我们如何着手寻找这些特征呢?我们可以通过只检查小的局部子集——邻域——的变化来最小化数据中压倒性的长期趋势的重要性。通过计算每个点的值与其周围点的差异,限制邻域的半径,并缩放更远的邻居的重要性,我们可以放大其他长期趋势中的局部模式。局部偏差变换的数学表达式如下:
V 是我们要变换的值,Rlocal是邻域的半径,p是谢泼德距离加权倒数法中的幂参数[1]。
使用这些等式,让我们对数据集进行 LDT 变换,看看会得出什么结果。下面的代码片段是 LDT 算法的 Python 实现。
同时,我们还对不包含隐藏模式的数据执行转换以进行比较。
************
局部偏差变换在起作用。****
可以使用两个参数来针对各种使用情况微调 LDT 变换:邻域半径、 R local ,以及邻域距离灵敏度、 p ,这是 Shepard 方法中用于逆距离加权的功率参数。**
较大的局部邻域半径将对转换后的数据产生较强的长期影响。而大的功率参数将降低更远的邻居的相对重要性(当距离敏感度等于零时,所有邻居被同等对待)。
虽然 LDT 在过滤随机噪声方面相当有效,但是转换并不完美。当“远程”效果的范围与 LDT 变换邻域半径、T21局部相当时,就会出现一个限制。在这种情况下,转换不能完全移除“长程”特征(见圆环的残余部分,甚至在 LDT 转换后的数据上可见,用于圆环图案)。另一个影响是笛卡尔空间中采样点网格的不均匀性,这会导致在没有隐藏模式的凹和凸集合的 LDT 变换上最明显的人工特征。**
尽管有这些限制, LDT 是一种非常有效的技术,已经在发现隐藏的局部模式中得到证明,该模式对实际半导体加工应用的整体趋势贡献不到 2%。
LDT 不仅可以有效地应用于 2D 等高线地图数据,而且可以有效地应用于由多个叠加空间模式组成的任何维度的数据,以搜索隐藏的局部模式。
你能在你的数据分析中应用局部偏差变换吗?
我很想听听你对 LDT 可能的应用的想法或主意。
参考文献:
[1]https://en.wikipedia.org/wiki/Inverse_distance_weighting
如何找到最大似然算法的最佳预测器
了解特征选择及其各种技术,以提高机器学习算法的预测能力
图片由 JrCasas 在 Shutterstock 拍摄
所以现在,你已经清理了你的数据,并准备好将其输入机器学习(ML)算法。但是,如果您有大量的输入要素呢?对于模型学习来说,它们都足够有用和有预测性吗?如果你使用了所有的特性,是否会使你的模型缺乏解释力?拥有大量预测器还可能会增加开发和模型训练时间,同时会占用大量系统内存。
特征选择技术旨在为模型训练系统地选择输入特征的最佳子集,以预测目标变量。不要将特征选择与其他降维技术(如 PCA 或使用信息论)相混淆。特征选择技术不修改预测器的原始语义,而只是选择它们的一个子集,从而产生一个更易解释的模型。
Sayes 等人认为:“特征选择的目标是多方面的,其中最重要的是:
- 为了避免过拟合和提高模型性能,即在监督分类情况下的预测性能和在聚类情况下的更好的聚类检测,
- 提供更快和更多性价比高的车型,以及
- 更深入地了解生成数据的底层流程。"
虽然特征选择适用于有监督的和无监督的学习,但我在这里将重点放在有监督的特征选择上,其中目标变量是预先已知的。
在监督特征选择的环境中,我们可以定义三大类别:
- 嵌入式方法:有时也称为内在方法,这些技术内置于分类或回归模型的模型训练阶段。例子包括惩罚回归模型(例如,Lasso)和基于树的模型。因为这样的嵌入方法是模型训练的一个组成部分,所以我们不会在这篇文章中讨论这些。
- 过滤方法:这些技术着眼于要素的内在属性,并使用统计技术来评估预测值和目标变量之间的关系。然后,最佳排序或评分特征的子集被用于模型训练。在这篇文章中,我们将回顾这些不同的统计技术。
- 包装器方法:这些方法利用 ML 算法作为特性评估过程的一部分,根据特定的性能指标迭代地识别和选择最佳的特性子集。例如,scikit-learn 的递归特征消除(RFE) 类,我们将在本文稍后介绍。
过滤特征选择方法
在选择输入特征的最佳子集之前,过滤器特征选择技术利用各种统计测试和测量来推断输入和目标变量之间的关系。
请注意,这些统计测量是单变量的,因此,没有考虑各种输入特征对之间的相关性。首先从相关矩阵开始剔除冗余的相关特征可能是个好主意。或者,可以利用特定的高级多元滤波器技术,例如,基于相关性的特征选择(CFS)、马尔可夫毯式滤波器(MBF)和快速基于相关性的特征选择(FCBF)。然而,目前还没有得到广泛使用和支持的 python 包支持这些高级多元要素选择技术。
分类特征选择
可用于分类问题中的分类特征的两种常规统计特征技术是:
- 独立性卡方检验
- 交互信息
卡方检验用于确定两个分类变量之间的关系或依赖程度,在我们的示例中,一个是分类输入要素,另一个是分类目标变量。
在概率论和信息论中,两个随机变量的互信息度量它们之间的独立程度。更高的值意味着更高的依赖性。
对于编码为整数的分类特征(例如,通过[OrdinalEncoder](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OrdinalEncoder.html)
),scikit-learn 的[SelectKBest](https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html)
类与[chi2](https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.chi2.html)
或[mutual_info_classif](https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.mutual_info_classif.html)
函数结合使用,以识别和选择前 k 个最相关的特征。SelectKBest
返回的分数越高,该特征的预测能力就越强。入围的特征然后被馈送到用于模型开发的 ML 算法中。
显示chi2
和mutual_info_classif
的完整工作示例如下:
注意SelectKBest
也可以作为Pipeline
的一部分用于交叉验证。然而,根据输入特性的基数,当模型在测试集中遇到训练集中没有的新值,因此没有用于编码时,在Pipeline
中使用OrdinalEncoder
有时是不可行的。在这种情况下,一个解决方法是使用不同的test_size
和random_state
运行train_test_split
多次,然后取所选验证指标的平均值。
对于尚未进行数字编码的object
类型分类特征(可能因为它们将被一次性编码或在稍后阶段转换为虚拟变量,SciPy 的[chi2_contingency](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html)
类用于计算每对分类特征和目标变量的 chi 统计量和 p 值。然后,p 值最低的要素将被列入建模候选名单。
一个完整的工作示例如下:
数字特征选择——分类问题
可用于分类问题中的数字特征的两种常规统计特征技术是:
- 方差分析 F 统计量
- 相互信息(如上所述)
方差分析(ANOVA) F 统计量计算两个或多个数据样本均值的方差比率。数字输入特征和分类目标特征之间的比率越高,两者之间的独立性越低,越可能对模型训练有用。参见这篇优秀文章,了解 ANOVA F 统计的详细信息。
通过 sci-kit learn 的[f_classif](https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_classif.html)
函数,用于特征选择的 ANOVA F-statistic 在 Python 中类似地实现为独立性的卡方检验。假设我们这次处理的是数字特性,我们可以通过管道轻松实现交叉验证,如下所示:
数字特征选择—回归问题
啊,这是最简单的特征选择类型:为一个数字目标变量识别最合适的数字输入特征(回归问题)。可能的技术包括:
- 相关统计
- 相互信息(与前面解释的相同,只是使用了不同的
score_func
:mutual_info_regression
)
相关性衡量一个变量因另一个变量而发生变化的程度。也许最著名的相关性度量是假设数据为高斯分布的皮尔逊相关性。相关系数的范围在-1(完全负相关)和 1(完全正相关)之间,0 表示变量之间没有任何关系。
除了绘制相关矩阵之外,还可以使用 sci-kit learn 的[f_regression](https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html)
函数和SelectKBest
类,实现基于相关性的自动特征选择,类似于独立性卡方检验或 ANOVA F 统计。此外,就像 ANOVA F-statistic 函数一样,我们可以通过管道轻松实现交叉验证,如下所示:
包装特征选择
来自 scikit-learn 的递归特征消除 (RFE)是实践中最广泛使用的包装器特征选择方法。RFE 是特征类型不可知的,它通过给定的监督学习模型(估计器)迭代地选择最佳数量的特征。
来自 scikit-learn 文档:“首先,在初始特征集上训练估计器,并且通过coef_
属性或feature_importances_
属性获得每个特征的重要性。然后,从当前特征集中删除最不重要的特征。该过程在删减集上递归重复,直到最终达到要选择的特征的期望数量。”
如上所述,RFE 只能与具有coef_
或feature_importances_
属性的算法一起使用来评估特征重要性。由于 RFE 是一种包装器特征选择技术,它可以使用任何给定的估计器(可以不同于应用于所选特征的算法)来识别最合适的特征。
假定RFE
可用于分类和数字特征;在分类和回归问题中,它的实现是相似的。
需要调谐的RFE
的主要参数是n_features_to_select
。使用DecisionTreeClassifier
进行特征选择和分类算法,基于RFE
确定最佳特征数量的实际演示如下:
上面的代码片段将打印出RFE
中使用的每个特性的平均和标准差,如下所示:
>2: 0.710
>3: 0.815
>4: 0.872
>5: 0.884
>6: 0.891
>7: 0.888
>8: 0.888
>9: 0.884
纯粹基于准确度分数,选择六个特征在这种情况下似乎是理想的。
自动特征选择以及对 RFE 多个模型的评估
然而,我们怎么知道DecisionTreeClassifier
是 RFE 使用的最佳算法呢?如果我们想用 RFE 评估各种算法呢?来帮助我们了。
RFECV
的主要目的是通过自动交叉验证选择最佳数量的特征。由于理想数量的特性将由RFECV
自动选择(因此,在最后的代码片段中不需要for
循环),我们可以有效地训练和评估用于RFECV
特性选择的多个模型。然后,可以使用具有最佳验证度量的模型向前进行预测。
现在让我们看一个实际的例子:
上面的代码片段将打印出RFECV
中使用的每个模型的准确性得分的平均值和标准值,如下所示:
>LR: 0.891
>DT: 0.882
>RF: 0.888
>XGB: 0.886
简单的逻辑回归模型赢得了包装特征选择。然后我们可以用这个来做预测:
# create pipeline
rfecv = RFECV(estimator = LogisticRegression(), cv = 10, scoring =
'accuracy')
model = DecisionTreeClassifier()
pipeline = Pipeline(steps=[('features', rfecv), ('model', model)])# fit the model on all available data
pipeline.fit(X, y)# make a prediction for one example
data = #load or define any new data unseen data that you want to make predictions uponyhat = pipeline.predict(data)
print('Predicted: %.3f' % (yhat))
额外小费
大多数 ML 算法都有一个内置属性,用于查看模型学习过程中使用的特征的相对重要性。一些例子包括:
- 线性回归:
coef_
给出系数列表。系数越高,输入特征对目标变量的影响越大 - 逻辑回归:
coef_
提供系数列表,解释与线性回归相同 - 决策树和随机森林:
feature_importanes_
—越高越好
结论
这次我就这样了。如果您想讨论任何与数据分析、传统机器学习或信用分析相关的问题,请随时联系我。
下次见,摇滚起来!
参考
受机器学习大师的杰森·布朗利博士的启发
[1] Saeys Y,Inaki I,Larranaga P .生物信息学中的特征选择
技术综述。生物信息学。2007;23(19): 2507-
2517。
如何用 Voronoi 图找到最近的医院
给定美国医院的大型数据集,我们如何快速找到最近的医院?
动机
有了美国医院的数据集,创建一个简单的应用程序,在患者需要时找到最近的医院,难道不是很有帮助吗?这听起来像是一个简单的任务。毕竟,你只需要在美国所有医院中找到最短的距离,对吗?
谷歌地图上医院位置的截图
显而易见的解决方案可能不是最佳解决方案。每次用户请求最近的医院时,搜索医院将会是耗时的**,更不用说有数千用户同时使用应用程序的情况了。那么解决办法是什么呢?**
检索自维基百科
我们可以像上面一样预先建立区域,点是医院。每当患者需要医院时,我们只需要知道他们在哪个地区,并把他们带到与该医院相关的地区。例如,如果一个病人在粉色区域,我们 100%确定最近的医院是该区域内的点。
是什么让这个方法如此伟大?我们只是提前计算一次图**。当收到医院的请求时,医院会立即被发现。听起来这个实现值得一试!**
检索自维基百科
Voronoi 图简介
上面的图是一个 Voronoi 图。Voronoi 图是将一个平面划分成靠近一组给定对象中的每一个的区域。为了创建 Voronoi 图,我们首先需要抓住它的一些特征。
作者图片
在上图中,点(1,8)到边界的距离等于点(9,4)到边界的距离。相同的规则适用于点(9,4)到(9,0)。2 点之间的边界是平分线,是将另一条线段切割成相等部分的线。****
用迭代算法实现
我选择用增量算法创建 Voronoi 图。由于目前还没有这个实现的 Python 源代码,所以我决定从头开始实现这个算法。
为了使这个算法工作,我们需要的数据结构是一个双连通边列表**。双连通边列表是被分成半边的列表,每个半边指向不同的方向。这种方向上的差异将有助于识别哪个面对与相关的边缘。**
作者图片
一次计算每个点的 Voronoi 图将是困难的和计算昂贵的。相反,我们将从一个小问题开始。假设我们已经有了 Voronoi 图,我们如何为创建一个额外的点的 Voronoi 图?一次更新一个点肯定会比一次更新多个点更容易。
从一个空的双连通边列表开始
作者图片
然后画两点之间的平分线。请注意,每个点到平分线的距离是相等的。
作者图片
当第三点出现时:
- 先找离最近点最近的点,就是 p2!
- 在两点之间画一条平分线。这条平分线将与另一条边界相交。使用该交点作为另一条平分线的起点
- 因为 p1 是与直线相交区域相关的点,所以画出 p2 和 p3 之间的平分线。
作者图片
这应该给我们一个更新的 Voronoi 图,有 3 个点!
作者图片
如果我们有第四点,同样的策略被应用。
让我们试试这个!
经过一个多月的努力理解算法、实现和调试,我终于让它工作了。这是我实现的一个 Github repo 。
要尝试这一点,克隆 repo 并转到目录
git clone [https://github.com/khuyentran1401/Voronoi-diagram.git](https://github.com/khuyentran1401/Voronoi-diagram.git)
cd Voronoi-diagram
在该目录中打开 Jupyter 笔记本或. py 文件并运行
你应该会看到这样的东西
作者图片
plotVoronoi 的第一个参数是点列表(元组列表)。其他参数是可选的,并且是 Voronoi 图的边界(xmin,xmax,ymin,ymax)。
要查看算法如何更新 Voronoid 图,请运行
在医院数据上使用 Voronoi 图
当然,我们仍然需要将这个图表应用于医院数据。因为我的代码仍然需要改进来处理每种情况,所以我不能在超过 7581 个数据点的情况下工作。所以我从美国四个不同医院的纬度中挑选了四个数据点来看看它是什么样子的
作者图片
我得到了这个
作者图片
创建地图和 Voronoi 图的代码可以在这里找到。如您所见,地图被分成 4 个不同的区域,每个区域有一家医院。如果患者需要找医院,我们只需要找到患者属于哪个地区**,指引患者去最近的医院!**
结论
恭喜你!你刚刚学会了一种用 Voronoi 图在地图上最大化你的发现的技术。实现这种算法是一种冒险,但我觉得看到这种工作是值得的。仍然有错误,我需要修复,以涵盖每一种情况,并使这在地图上的工作。另一个任务也是找出如何用 Voronoi 图搜索。我仍在努力,如果您有任何反馈或想法,我将不胜感激。
如果你想尝试这种算法或者在你的项目中使用它,请选择这个回购协议。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以通过 LinkedIn 和 Twitter 与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
如何利用包装算法实现数据可视化
towardsdatascience.com](/convex-hull-an-innovative-approach-to-gift-wrap-your-data-899992881efc) [## 如何用图论可视化社交网络
找出《权力的游戏》中的影响者
towardsdatascience.com](/how-to-visualize-social-network-with-graph-theory-4b2dc0c8a99f) [## 如何用 Altair 创建交互式剧情
在 5 行简单的 Python 代码中利用您的数据分析
towardsdatascience.com](/how-to-create-interactive-and-elegant-plot-with-altair-8dd87a890f2a) [## 如何用支持向量机学习非线性数据集
支持向量机简介及其在非线性数据集上的应用
towardsdatascience.com](/how-to-learn-non-linear-separable-dataset-with-support-vector-machines-a7da21c6d987)**
如何找到 KNN K 的最优值?
可视化误差率与 K 的关系图,找出最合适的 K 值。
图 1:通过educba.com拍摄的照片
介绍
K-最近邻是T5 用于分类和回归的监督机器学习算法。它处理训练数据,并基于距离度量对新的测试数据进行分类。它找到测试数据的 k 个最近邻,然后由大多数类别标签执行分类。
对于数据科学家来说,选择最佳 K 值以实现模型的最大准确性始终是一项挑战。我希望你们都知道 knn 背后的基本思想,但是我将在本文后面阐明 KNN 的概述。要全面了解这个算法的工作原理,我建议阅读下面的文章:
在本文中,我将演示在 knn 算法中感知 K 的理想值的可实现方法。
目录
- KNN 概况
- 距离度量
- 如何选择一个 K 值?
- KNN 模式实施
- 关键要点
我们开始吧,
1.KNN 概况
图 2:照片通过kdnuggets.com
使用 K-最近邻,我们通过找到测试点和训练的 K 个最近特征值之间的距离,从可用的类别标签中预测测试点的类别。通过分析所有的信息,你会提出一个问题,
距离怎么算?
让我在距离度量的下一部分回答你的热情问题。
2.距离度量
距离度量是有效的超参数,通过它我们测量数据特征值和新测试输入之间的距离。
图 3:通过slideplayer.com拍摄的照片
通常,我们使用欧几里得方法,这是最广泛使用的距离度量,用于计算测试样本和训练数据值之间的距离。我们沿着从点(x1,y1)到点(x2,y2)的直线测量距离。
图 4:照片通过slideplayer.com
通过分析上面的计算,我希望你能理解我们是如何计算欧几里德距离的。让我们来解释一下 KNN 的预测方法。
图 5:通过datacamp.com的照片
要对未知记录进行分类:
- 初始化 K 值。
- 计算测试输入和 K 个训练好的最近邻之间的距离。
- 检查最近邻的类别,并确定测试输入属于哪种类型。
- 将通过获得多数票来进行分类。
- 返回班级类别。
我们理解对未知记录进行分类的过程,但是选择一个最优的 K 值呢?
我们来回答一下。
3.如何选择一个 K 值?
图 6:simplilearn.com 通过的照片
K 值表示最近邻居的计数。我们必须计算测试点和训练标签点之间的距离。每次迭代更新距离度量的计算代价很高,这就是为什么 KNN 是一个懒惰的学习算法。
图 7:通过datacamp.com拍摄的照片
- 从上图可以看出,如果我们从 K=3 开始,那么我们预测测试输入属于 B 类,如果我们从 K=7 开始,那么我们预测测试输入属于 a 类。
- 这就是你如何想象 K 值对 KNN 性能有强大的影响。
那么如何选择最优的 K 值呢?
- 没有预先定义的统计方法来寻找最有利的 k 值。
- 初始化一个随机的 K 值,开始计算。
- 选择小的 K 值会导致不稳定的决策边界。
- 较大的 K 值对于分类更好,因为它导致平滑决策边界。
- 绘制误差率和 K 之间的曲线图,表示定义范围内的值。然后选择具有最小误差率的 K 值。
现在你会得到通过实现模型来选择最优 K 值的想法。
4.KNN 模式实施
让我们通过导入所有必需的包来启动应用程序。然后使用 read_csv() 函数读取电信数据文件。
图 8:主数据集
如您所见,有 12 列,即地区、任期、年龄、婚姻、地址、收入、学历、雇佣、退休、性别、居住和客户。我们有一个目标列,**“cust cat”**将客户分为四组:
- 1-基本服务
- 2-电子服务
- 3+服务
- 4-全面服务
图 9:K = 4 时的精度测量
- 我们将所有独立的数据特征收集到 X 数据框中,并将目标字段收集到 y 数据框中。然后我们处理数据并使其正常化。
- 分割数据后,我们将 0.8%的数据用于训练,其余用于测试。
- 我们从 sklearn 库中导入分类器模型,并通过初始化 **K=4 来拟合模型。**所以我们在这里达到了 0.32 的精度。
现在是时候改进模型,找出最优 k 值了。
图 10:误差率与 K 值的关系
从图中可以看出,在 K=37 时,我们得到的最小误差为 0.59。接下来,我们可视化了精度和 K 值之间的关系。
图 11:精度与 K 值的关系
现在您看到了改进的结果。我们在 K=37 得到了 0.41 的精度。由于我们已经推导出了误差图,并在 k=37 时获得了最小误差,因此我们将在该 K 值下获得更好的效率。****
因为我们的主要重点是确定最佳 K 值,但是,您可以执行探索性数据分析,甚至可以实现更高的准确性。数据文件和代码在我的**GitHub库中。**
5.关键要点
- 我们在 k=37 时获得了 0.41 的精度,比 k=4 时计算的效率要高。
- ****小 K 值不适合分类。
- 通常找到的最佳 K 值是 N 的平方根,其中 N 是样本总数。
- 使用误差图或精度图找到最有利的 K 值。
- KNN 在处理多标签类时表现良好,但是您必须注意异常值。
- KNN 广泛应用于模式识别和分析评价领域。
所有人都在这里,
在我的下一篇文章中再见。
你好👋我希望你能从我的文章中获得知识。如果你愿意支持我,请随意给我买些咖啡🙏☕
https://www.buymeacoffee.com/amey23
或通过 ameypband23@gmail.com 联系我
乐意为您效劳。
参考文献:监督机器学习中的肘方法
github.com](https://github.com/Amey23/Machine-Learning/tree/master/K-Nearest%20Neighbor)**
如何为您的企业找到合适的数据科学用例
数据科学和商业战略
第 1/4 集—识别
介绍
如果你在谷歌上搜索“数据科学用例”,你会发现数百个这样的列表,每个条目都以一个时髦词开头,比如欺诈检测、推荐系统或其他更花哨的术语。接下来是一小段,试图用 200 个词来解释它,勉强够将这个术语与其他术语放在一起,如人工智能、数据科学、机器学习、深度学习,所有这些都用最高级来调味。反正数据科学(或者 AI,或者机器学习,或者深度学习)应该让事情变得更好,要不然,有什么意义?
看着这些清单,对于一个试图弄清楚实际需要做什么的 DS 来说,这可能是令人困惑的。它们充其量只是灵感,但不是配方,也不包含任何诀窍。作为(好的)DS,我们应该能够识别潜在的用例,找到并掌握解决它的工具,并与我们的业务同事一起产生影响。先从识别开始,下面是你如何做好。
确定数据科学使用案例
数据科学用例至少有两个先决条件,一个是数据(不足为奇),另一个是导致行动的业务决策。数据科学提供工具来检查数据背后的机制,以便可以利用它来制定更好的业务决策。以一种非常示意性的方式,我们可以设计一个练习,通过 4 个步骤找出最佳数据科学用例:
第一步:理解上下文
- 画出你感兴趣的业务部门的关键决策和后续行动(BDA)的结构,就像这样。所有 BDA 都分组在一个节点下,代表拥有决策或行动的单位。节点之间的箭头表示它们如何通过材料影响(工厂的生产取决于原材料供应)或信息交换(仓库库存水平在很大程度上取决于工厂的需求)相互影响。
- 然后列出用于驱动此 BDA 的数据。问问你自己,这些数据是否质量良好,或者是否可以引入任何其他数据来改进决策,也把它们记下来。
- 最后,添加一些关于推动这些 BDA 的流程的信息,注意所需的时间、涉及的人员或业务部门、技术支持的程度以及是否有任何难点。
这个过程可能需要一段时间,因为了解公司其他部门的情况并不容易。然而,对驱动 BDA 的机制和原理有一个很好的理解是至关重要的,否则我们可能会忽略要解决的实际问题,最终得到一个完美但无用的模型。因此,搜索文档和演示文稿,最重要的是,与人交谈。
第二步:缩小关注范围
是时候为您的数据科学项目评估和选择最佳的 BDAs 了。尝试回答以下每个问题:
- 它是否有很大的财务影响,即要么产生高成本,要么产生可观的收入?
- 它是否是许多其他 BDA 的必要投入,因而需要高质量?
- 是否存在可以通过使用更好的技术和数据科学来缓解的紧迫痛点?
- OP 接受新技术和改变工作方式的可能性有多大?
对于理想的 BDAs,你应该能够回答“是”所有这些问题。他们是从数据科学中受益最多的人,这就是为什么我们应该关注他们。
第三步:高级数据评估
数据质量对于数据科学用例的可行性至关重要。早期评估可以帮助我们确定优先级,并选择正确的方法和技术。为了更好地了解数据质量,我们可以考虑以下几个方面:
- 数据是决策的关键输入(如果不是主要输入)吗?如果不是,那么使用一些数据作为关键/主要输入是否会更好?
- 数据来源可靠吗?ETL 是如何工作的?它是否依赖于传统的 it 系统?需要人工操作吗?数据库维护得如何?
- 使用的数据量有多大?可能用于决策的数据量有多大?
- 我们有多大可能获得改善当前决策所需的额外数据?
在最好的情况下,数据源应该是可靠的,并用作决策的主要输入。数据大小可以向我们指示正确的工具(例如,当数据大小较大时,应考虑分布式系统)和经常使用的方法(例如,对于小数据集,优选线性回归或传统统计方法等简单算法,以避免过度拟合)。
第四步:总结归纳
通过比较第 2 步和第 3 步的结果,我们应该能够根据这些基于两个维度(影响和可行性)的标准来选择甚至排列 BDAs:
- *【影响】*无论在财务还是非财务方面,它都有很大的影响
- *【影响】*数据科学和技术可以极大地改善其结果
- *【可行性】*关键利益相关者愿意接受新技术和变革
- *【可行性】*所需数据输入可用且质量良好
- *【可行性】*ds 和 SE⁴团队拥有部署所需技术的技能
然后,可以通过将具有重叠数据需求和关键利益相关者的紧密联系的 BDA 分组在一起来定义用例。最后,为了找出从哪里开始和从哪里结束,我们将再次查看每个用例的影响和可行性,但是现在有了一个额外的维度——依赖性。不用说,其他案件所依赖的案件应该尽早开始。现在,您的数据科学使用情形有了一个坚实的路线图!
符号
DS:数据科学家,但也是机器学习工程师,他们更擅长建模而不是软件工程
BDA:商业决策和行动。
运营和生产,确保日常业务良好运转的人。
SE⁴:软件工程师,但也有数据工程师,他们更感兴趣的是制造良好和强大的产品或管道。
如何有效地微调你的机器学习模型
发现为您的 ML 模型寻找最佳参数非常耗时?用这三招
动机
您是否曾经想为您的模型试验不同的参数,但发现这样做真的很耗时?假设您想要使用支持向量机(SVM)来训练和预测模型。
你争论什么可能是C
的最佳值,所以你继续手动试验C
的不同值,希望得到好的结果。这很费时间,但还不算太糟。
但是如果要先用sklearn.feature_extraction.text.TfidfVectorizer
提取重要文本,再用sklearn.feature_selection.SelectKBest
寻找最佳特征,最后用sklearn.SVM.LinearSVC
训练预测模型呢?在中会有很多参数需要调整。此外,你需要找到一种方法来记录结果进行比较。所以你的笔记本可以看起来乱七八糟!
有没有更好的方法来选择参数,缩短代码,以及保存结果进行比较?是的,当然!我们的方法就像一个美味的蛋糕,有三种简单的配料:
- 合并不同模型的管道
- 网格搜索以找到每个模型的最佳参数
- MLflow 记录结果
有你需要的所有成分吗?厉害!现在我们准备把它们放在一起。
照片由德鲁·帕特里克·米勒在 Unsplash 上拍摄
管道
什么是管道?[**sklearn.pipeline.Pipeline**](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)
允许我们将一系列转换和一个最终估计器组合成一个链。
例如,为了预测一条推文是否具有攻击性,在处理文本后,我们使用tfidf_vectorizer,
和SelectKBest
作为变压器,使用svm.LinearSVC
作为最终估计器。
上面的代码可以合并到一个管道中,管道中有一列表示为元组的步骤。在每个元组中,第一个参数是类名,第二个参数是类。
短得多,有条理!我们可以很容易地将任何步骤切换到另一个转换器或估计器。确保管道中的类来自sklearn.
如果不是,你可以像这样用def __init__, def fit(),
和def transform()
轻松创建定制的sklearn
类。
在这里找到示例源代码
网格搜索简历
因此,我们准备好了转换和预测数据的管道。但是参数调优呢?通过[***sklearn.model_selection.GridSearchCV***](https://scikit-learn.org/stable/modules/compose.html)***.***
,我们可以很容易地找到管道中变压器和估算器的最佳参数
假设我们想要找到SelectKBest
的最佳值k
,最佳值C
的最佳值svm.LinearSVC,
,最佳值analyzer, ngram_range,
和binary
的最佳值TfidfVectorizer.
,我们可以给网格几个参数来搜索。参数表示为嵌套在字典中的列表。
为了设置特定类的参数,我们使用class_name__parameter = [para_1, para_2, para_3].
确保类名和参数之间有两个下划线。
grid_search.fit(X_train, y_train)
使用不同的参数、指定的转换和估算器创建几次运行。将为转化步骤选择产生最佳结果的参数组合。
我们还可以用不同的变压器和估算器创建其他管道,并再次使用 GridSearchCV 来寻找最佳参数!但是我们如何保存所有运行的结果呢?
可以通过上下滚动屏幕或拍摄结果照片来观察结果。但是这很费时间,没有考虑到我们可能希望在以后的项目中看到结果。有没有更好的方法来跟踪我们的结果?这就是我们需要像 MLflow 这样的跟踪工具的时候
MLflow
MLflow 是一个管理端到端机器学习生命周期的工具,包括跟踪实验、以可复制的形式打包 ML 代码以供共享和部署。我们将利用这个工具来记录我们的结果。
MLflow 的安装可以像这样简单
pip install mlflow
让我们将目前为止所做的与物流跟踪工具结合起来
在这段代码中,我们只添加了三个元素来记录结果:
mlflow.set_experiment('name_of_experiment')
创造新的实验mlflow.start_run()
我们要运行实验的代码在里面mlflow.log_param()
和mlflow.log_metric()
来记录参数和指标
将上面的文件保存为train.py.
最后一步是运行文件
python train.py
代码运行完成后,我们可以通过运行
mlflow ui
访问链接 http://localhost:5000 ,我们应该会看到这个
正如我们从上面可以看到的,实验的指标和参数都被记录下来了!我们可以创建几个实验并记录这些实验的结果,以便进行简单有效的比较。
结论
恭喜你!您已经学习了如何使用 Pipeline、GridSearchCV 和 MLflow 高效地调整机器学习模型的参数。您可以在这里找到本文的类似示例代码。我鼓励你在现有的机器学习项目中尝试这些方法。从长远来看,编码方法上的一点点改变就能产生很大的不同。有效地进行实验并跟踪结果不仅会节省您的时间,还会使您更容易找到最佳参数并从实验中学习。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上联系我。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
被新信息淹没?现在,您可以轻松地跟踪文章并为其创建自定义注释
towardsdatascience.com](/how-to-organize-your-data-science-articles-with-github-b5b9427dad37) [## 如何为你最喜欢的可视化工具创建下拉菜单和滑动条
使用 Python Widget,您可以用 3 行代码升级可视化
towardsdatascience.com](/how-to-create-a-drop-down-menu-and-a-slide-bar-for-your-favorite-visualization-tool-3a50b7c9ea01) [## 如何用 Ngrok 用 3 行代码分享你的 Jupyter 笔记本
想象一下,让你的朋友在远程机器上使用你的本地 Jupyter 笔记本
towardsdatascience.com](/how-to-share-your-jupyter-notebook-in-3-lines-of-code-with-ngrok-bfe1495a9c0c) [## 如何使用 HyperDash 远程监控和记录您的机器学习实验
培训需要很长时间才能完成,但你需要去洗手间休息一下…
towardsdatascience.com](/how-to-monitor-and-log-your-machine-learning-experiment-remotely-with-hyperdash-aa7106b15509) [## cy thon——Python 函数的加速工具
当调整你的算法得到小的改进时,你可能想用 Cython 获得额外的速度,一个…
towardsdatascience.com](/cython-a-speed-up-tool-for-your-python-function-9bab64364bfd)
如何在不编码的情况下微调 BERT 来对您的空闲聊天进行分类
伯特图摘自原始论文
随着时间的推移,松散的聊天会变得混乱,难以提取有意义的信息。在这篇文章中,我想介绍一种快速的无代码方式来微调和部署常用的 BERT 分类器来进行会话分析。我们将使用该系统从我们的空闲对话中提取任务、事实和其他有价值的信息。它可以很容易地扩展到分类任何其他文本数据,如支持请求,电子邮件等。
我们想从 Slack 中提取什么?这可能取决于您的团队使用它的目的,以及共享的信息类型。对我们来说,我们发现很多 todo 任务迷失在不停的文本流中,还有一些有价值的信息可以进一步添加到产品文档中,或者需要在日常会议中讨论。
从标签工作室的角度看机器学习生命周期
Label Studio 提供了一种简单的方法来试验 NLP 机器学习,在不到一个小时的时间内覆盖了从原始未标记数据到部署预测服务的整个 ML 生命周期。如果你想随意聊天,请遵循以下简单步骤:
收集数据
从 Slack 收集数据可以通过使用 Evernote Slack bot integration来完成。这很简单,只需设置并运行 /clip 进入您想要卸载的松弛通道。然后你会在 Evernote 应用中找到相应的文档:
使用 Evernote 应用程序删除松散的对话
那么原始文档应该被分割成单独的消息。保存时间戳也有助于进一步分析。使用以下项目列表创建一个 JSON 格式的文件 tasks.json :
[{
"text": "Hello, dear Anton.\nLabel Studio is the basis of our Heartex platform. Everything you describe here is available on the platform. And much more:)",
"date": "November 15, 2019"
}]
微调伯特分类器
你可以将 Label Studio 连接到机器学习后端,并在新数据可用时使用它进行预测和重新训练。模型在每次接收到新的带注释的任务时更新其状态,并且重新部署新的状态以对新进入的任务进行推理。一旦设置好了,微调就变得非常容易——您只需要做一件事就是标记您的任务——过一会儿,您就可以通过 REST API 服务获得一个可用的工作模型。
我们专门构建了一个应用,它将 Label Studio 与机器学习后端集成在一起,后者由开源变形金刚库中的 BERT 模型提供支持。假设您安装了 docker-compose,您可以用以下命令启动它:
git clone [https://github.com/heartexlabs/label-studio-transformers](https://github.com/heartexlabs/label-studio-transformers)
cd label-studio-transformers
docker-compose up
这个命令在本地启动位于 http://localhost:8200 的 Label Studio。进入导入页面,上传之前创建的 tasks.json 文件。就这样,所有的设置都完成了,现在你可以对来自标签 UI 的消息进行分类,检查模型的建议是否随着时间的推移而改进。
用 Label Studio 微调 BERT 分类器。
数百条消息可能就足够了,这取决于您愿意解决的任务有多复杂,以及您期望的准确度有多高。在我们的例子中,我们将消息分为五类:问题、议题、建议、提交和其他。可接受的质量是在三百个任务之后建立起来的,并且需要大约一个小时的注释。如果时间不够,也可以让奶奶对分类器进行微调。
识别聊天信息
由于在注释过程中已经部署了模型,所以您可以使用 right away 通过 REST API 预测新消息的未知标签:
curl -X POST -H 'Content-Type: application/json' -d '{"text": "Its National Donut Day."}' [http://localhost:8200/predict](http://localhost:8200/predict)
如果一切正常,您将看到 JSON 响应:
[
{
"cluster": null,
"result": [
{
"from_name": "label",
"to_name": "text",
"type": "choices",
"value": {
"choices": [
"Other"
]
}
}
],
"score": 1.6718149185180664
}
]
其中“其他”是带有某种“分数”的预测消息类型(有关格式的更详细解释,请联系 Label Studio docs )
除了通过 Label Studio API 使用模型之外,您还可以在存储/label-studio-ml-backend/ 模型目录中找到所有检查点,并使用 Tensorboard 检查训练进度。
我们学到了什么
松散的聊天是混乱的,但是感谢现代的 NLP,它变得很容易把你的对话组织起来并获得有用的见解。例如,你可以探索在某个时间段内你的对话中发生了什么,就像我们通过汇总过去几个月我们的信息预测所做的那样:
根据伯特模型,我们过去几个月的轻松谈话
我们从这张图表的一些观察模式中得出的结论是:
- 圣诞节和新年假期期间的许多随意交谈
- 当有问题/错误报告时,不要随意交谈
- 代码提交后,接下来是对问题的讨论
- 问题与建议相关联,这显然是正常的
- 建议引发问题和讨论
我们实际学到的是花一个小时注释你的文本足以构建一个合理的 ML 工具。我相信标记更多的数据会让您受益于更高的细粒度准确性。
结论
通过创建 Slack analytics 应用程序,我们展示了如何通过仅使用数据注释来解决复杂的机器学习任务。你不用写代码,而是通过展示一个你如何解决的例子来教模型执行任务。可以更深入地将 Label Studio 与其他机器学习框架一起使用,例如,微调一些用于分割、姿势估计、场景检测等的计算机视觉任务。很想听听你有什么想法和实现
快乐贴标签!
如何更快地适应随机森林
Sebastian Unrau 在 Unsplash 上的照片
使用热启动和开箱交叉验证
随机森林是机器学习的基本模型/算法。最近在 2001 年,已故的利奥·布雷曼在一篇经典的论文中首次描述了它们目前的形式。尽管人工神经网络越来越受欢迎,但它们在各种情况下都有实际用途。
有大量资源详细介绍了随机森林是如何工作的。本文将非常简要地回顾它们,然后转向主要焦点:如何通过热启动和开箱交叉验证更快地适应它们。有了这两种技术,超参数选择可以大大加快,减少拟合时间。
随机森林
随机森林是基本估计器的集合,通常是单个决策树。因此有这样一个比喻:把一堆树放在一起,你会得到一片森林。
单个决策树的问题在于它们的方差很大。这是一个经常使用的术语,所以有必要具体说明它的含义。假设从群体中重新采样数据,并重新调整决策树。然后我们可以收集各种各样的预测(比如一个固定的样本外输入)。这允许我们为预测创建一个概率分布,我们指的是这个分布的方差。这种差异通常不被明确地测量,导致有时术语偏差和差异的模糊用法。
随机森林的主要观点是,如果我们有一组不相关的决策树,它们的均值方差会更低。这是一个关于随机变量均值方差的一般性质,你习惯于从例如中心极限定理中得到。在这种情况下,随机变量是来自随机选择的树的预测(稍后我们将详细介绍如何做到这一点)。在回归环境中,平均值就是字面上的平均值。在分类上下文中(为简单起见,比如说二进制),平均值相当于投票。
为了创建随机决策树,我们通过重新采样我们的训练数据来模拟人口的重新采样,这一过程称为引导。如果我们有一个大小为 N 的数据集,我们通过替换从原始数据集采样来创建新的大小为 M 的随机数据集。通常 M=N,但不需要如此。当自举被用来产生各种预测器时,就像这里一样,这个过程被称为bootstrapaggregation,或者 bagging。
此外,当我们创建每个单独的决策树时,我们选择输入变量的随机子集,以便在树中的每个节点选择最佳分割时加以考虑。这进一步降低了树的相关性。
最后,从讨论中可以明显看出,我们的目标是使用高方差、低偏差的估计量和总量来减少方差。从本质上来说,对森林的聚集就是正则化方法。因此,使用更大的树(具有更多的节点和更低的偏差)作为基本估计器是有意义的。
拟合随机森林
一如既往,拟合随机森林归结为选择超参数。随机森林的超参数是
- 基础估计器(通常是决策树)的超参数可能很多。
- 放入森林的树木数量。
同样,您应该认为第二个参数有点像正则化参数。随着树的数量越来越多,方差越来越小(但没有伴随的偏差损失)。随着树的数量增加,在准确性(或其他类似的度量)方面没有真正的损失。然而,推理时间与树的数量成线性比例,拟合时间也是如此。
随机森林的性质意味着有两种很好的方法来加快超参数选择:热启动和开箱交叉验证。
袋外交叉验证
当构建随机树时,上面描述的引导程序意味着只有一部分训练数据被包括在用于拟合该特定树的数据中。这意味着树对“袋外”样本的预测类似于样本外预测,即在验证集上的预测。“包”是指由引导程序选择的训练数据的子集。
这意味着,当拟合随机森林时,可以在拟合过程中生成验证误差的估计值(形式上:泛化误差),而无需使用实际的验证数据集。这通常是一个很好的估计。
与在验证数据集上重新运行拟合树相比,使用出袋误差可以节省时间。
热启动
当与热启动相结合时,袋外交叉验证的真正威力才会显现。当考虑要在我们的森林中包含多少棵树时,人们每次都可以天真地改造整个森林。例如,如果我们想决定是包括 100、200 还是 300 棵树。如果我们每次都改装,我们总共要装 600 棵树。然而,在拟合 200 棵树时,我们可以重用前 100 棵树。毕竟,它们是 100 棵树的完美随机样本。结果是我们只需要安装 300 棵树,速度提高了 2 倍。如果我们考虑是安装 100、200、300……还是 1000 棵树,我们可以实现 5.5 倍的加速!
与袋外交叉验证的结合是因为我们可以很容易地生成验证误差的估计值!
笔记
[1]假设用相同的超参数重新装配该树,或者,如果您愿意,用包含通过交叉验证的超参数选择的相同程序重新装配该树。
[2]然而,随机森林本质上是非常可并行化的(因为每棵树都可以独立地拟合和计算)。如果关注的不是 CPU 的使用时间,而是挂钟的时间,那么没有太大的损失。
[3]例如,参见统计学习的要素 (Hastie、Tibshirani 和 Friedman 2009),第 15 章。
如何使用读取修复修复 Cassandra 一致性问题
由 Unsplash 上的 Louis Hansel @shotsoflouis 拍摄的照片
为什么 CAP 定理中存在一致性问题或 C
很多人可能都知道,Cassandra 是 AP 大数据存储。换句话说,当网络分区发生时,Cassandra 仍然可用,并放松了一致性属性。人们总是说它最终是一致的,或者换句话说,它将在未来的某个时间点上是一致的。
需要知道的不太明显的重要事项是:
- 集群变经常不一致。当然,有许多因素会影响群集的稳定性,例如适当的配置、专用资源、生产负载、运营人员的专业水平等,但事实是,节点不时出现故障从而导致数据变得不一致的可能性非常高。
- 该集群不会自动或再次变得一致**。这与上帝对现代成熟分布式系统的感觉背道而驰。除非您有企业版的 Datastax 并启用了 DSE v6 的最新功能,否则您必须手动修复不一致问题。**
修复不一致的方法
幸运的是,有一些方法可以解决不一致的问题。这里有几个选项:
- nodetool 维修工具。这可能是要使用的主要和默认方法。在所有表或特定表关闭的节点上运行命令。不过有一点需要注意:当您运行命令时,所有的节点都应该处于运行状态。
- 阅读修复卡珊德拉特写。这是一个重要的特征,意味着在读取请求期间,集群有机体正在自我修复,更准确地说,它修复正确的数据副本。如果读取请求中涉及的复制副本不一致,则会再次对齐它们
何时及为何阅读修复
如上所述,修复不一致的默认和主要方法是 nodetool 修复工具,因此自然的问题是何时以及为什么使用 read 修复方法。让我用我的一个项目的经验来回答这个问题。
在某个时候,我们进入了一个时期,此时我们的 Cassandra 集群开始变得非常不稳定,并且花费了大量的时间,直到所有节点再次返回到运行状态。这导致了两个主要后果:
- 数据不一致
- 在此期间,无法使用 nodetool 修复工具来修复不一致
在这种情况下,我们能做的最好的事情就是使用读取修复功能来确保至少在大多数复制副本中,在仲裁级别,数据是一致的,因此对于使用仲裁一致性级别的所有读取,数据都是一致的和最新的
如何使用读取修复
读修复特性只修复读操作所涉及的记录的一致性,那么如何修复整个表呢?
可以使用以下方法:
- 选择一个最窄的列进行阅读
- 使用 copy 命令读取整个表,将数据导出到文件中
因此,让我们考虑在一个 keyspace“test”中有一个 Cassandra 表“event”,其中一个最窄的列称为“id”;复制命令如下所示:
cqlsh -e "consistency QUORUM; copy test.event(fid) to '/tmp/tid'"
或者,您可以读取整个记录并将它们发送到’/dev/null ':
cqlsh -e "consistency QUORUM; copy test.event to '/dev/null'"
当然,当所有节点都启动时,您可以使用 consistency ALL,但在这种情况下,最好使用 nodetool 修复工具,如下所示:
nodetool repair test event
结论
Cassandra 是伟大的大数据存储,但为了充分利用它,它需要很好地理解主要原则,它是如何工作的,就像任何美丽的东西一样,它需要一些小心:)
如何修复 ModuleNotFoundError 和 ImportError
做适当的模块导入,让你的生活更轻松
照片由莱昂·温特在unsplash.com拍摄
TL;博士;医生
- 使用绝对进口
- 将您的项目根目录附加到
PYTHONPATH
—在您希望运行 Python 应用程序的任何环境中,如 Docker、vagger 或您的虚拟环境,即在 bin/activate 中,运行(或例如,如果您使用 virtualenv,则添加到bin/activate
)以下命令:
export PYTHONPATH="${PYTHONPATH}:/path/to/your/project/"
- *避免使用
sys.path.append("/path/to/your/project/")
模块导入肯定会让人们感到沮丧,尤其是那些对 Python 相当陌生的人。由于我每天都在 StackOverflow 上看到相关的问题,所以我决定在 Medium 上写一篇文章,尝试描述 import 在幕后是如何工作的,以及为了使您的生活更轻松,您需要遵循什么方法。
术语
首先,让我们从定义一些有用的术语开始,这些术语将帮助您理解本文中描述的概念。
- 一个 python 模块是一个带有的单个文件。py 分机。
- 一个 python 包是一个包含至少一个 python 模块的文件夹。对于 python2,一个包需要一个 init。py 文件
- 一个 python 包可以包含任意数量的嵌套子包,即包含项目结构中其他包的包。
- 导入在一个模块需要使用另一个模块(相同或不同的包或子包)中编写的一些功能(如函数或类)时很有用
例如,考虑以下项目结构:
└── myproject
├── mypackage
│ ├── a.py
└── anotherpackage
├── b.py
├── c.py
└── mysubpackage
└── d.py
项目myproject
包含两个包,mypackage
和anotherpackage
,每个包包含许多 python 模块,而后者还包含一个名为mysubpackage
的子包,该子包又包含一个额外的 python 模块。
模块导入是如何在幕后工作的?
现在让我们假设在您当前的模块中,您希望导入另一个模块,如下所示:
import a
Python 将分两步执行上述语句:
- 定位、加载和初始化(如果需要)所请求的模块
- 在本地名称空间和相应的作用域中定义必要的名称
现在 Python 解释器将按照下面的步骤尝试解决a
。
步骤 1:系统模块查找
最初,Python 会尝试在[sys.modules](https://docs.python.org/3/library/sys.html#sys.modules)
中搜索模块名,这是一个将模块名映射到已经加载的模块的字典。如果名称解析成功(这意味着另一个模块已经加载了它),那么它将可用于本地名称空间;否则,跳到步骤 2。
步骤 2: Python 标准库查找
Python 标准库包含内置模块(用 C 编写),提供对系统功能的访问,如 Python 程序员无法访问的文件 I/O,以及用 Python 编写的模块,为日常编程中出现的许多问题提供标准化解决方案。其中一些模块被明确设计成通过将特定于平台的抽象成平台中立的 API 来鼓励和增强 Python 程序的可移植性。
如果在sys.modules
中找不到这个名字,那么 Python 将在 Python 标准库中搜索它。同样,如果名称被解析,那么它将在本地名称空间中定义,否则需要遵循步骤 3。
步骤 3:系统路径查找
现在,如果在sys.modules
和标准库中都找不到模块名,Python 将最终尝试在sys.path
下解析它。这是事情肯定会出错的地方。我相信大部分 Python 程序都很熟悉**ModuleNotFoundError**
import aModuleNotFoundError: No module named 'a'
或者**ImportError**
:
from . import aImportError: cannot import name 'a'
绝对进口与相对进口
在绝对导入中,我们指定了从项目根目录开始的显式路径。在我们的例子中
└── myproject
├── mypackage
│ ├── a.py
└── anotherpackage
├── b.py
├── c.py
└── mysubpackage
└── d.py
这意味着如果我们想要在模块b
中导入模块a
,我们必须指定
import mypackage.a
其他有效的示例包括以下导入:
# in module a.py
import anotherpackage.mysubpackage.d# in module b
import anotherpackage.c
另一方面,在相对导入中,我们指定了相对于当前模块位置的模块路径。我们示例中的几个例子可能是:
# in module a.py
from ..anotherpackage import b
from ..anotherpackage.b import another_function# in module b
from . import c
from .c import my_function
我个人不赞成使用相对进口,因为它们不如绝对进口可读性强,PEP-8 也是这样建议的。在一些罕见的情况下,您可能必须使用相对导入来避免不必要的长路径。例如,
from package_a.sub_b.sub_c.sub_d.module_d import my_function
如何修复 ModuleNotFoundError 和 ImportError?
现在,我们已经了解了基本导入语句的执行方式以及绝对导入和相对导入之间的区别,我们现在可以继续讨论当您的 Python 应用程序在使用ModuleNotFoundError
或ImportError
失败时该怎么办。
在大多数情况下,这两种错误都是由于 Python 无法解析sys.path
中的模块名而导致的。回想一下,当您调用import a
时,如果模块的名称既没有在sys.modules
中找到,也没有在标准库中找到,Python 将尝试在sys.path
中解析它。同样,当您使用from
语法(例如from mypackage import a
)时,Python 将首先尝试查找并加载模块。当它失败时,Python 会在第一种情况下抛出ModuleNotFoundError
,在第二种情况下抛出ImportError
。
如果是这样的话,回想一下我们下面的例子,
└── myproject
├── mypackage
│ ├── a.py
└── anotherpackage
├── b.py
├── c.py
└── mysubpackage
└── d.py
- 首先确保你使用的是绝对导入
- 将项目的根目录导出到
大多数现代 Python IDEs 会自动完成这一任务,但如果不是这样,我很肯定会有这样的选项,您可以为您的 Python 应用程序(至少是 PyCharm)定义PYTHONPATH
。
如果您在任何其他环境中运行 Python 应用程序,比如 Docker、vagger 或者在您的虚拟环境中,您可以在 bash 中运行以下命令:
export PYTHONPATH="${PYTHONPATH}:/path/to/your/project/"# * For Windows
set PYTHONPATH=%PYTHONPATH%;C:\path\to\your\project\
现在既然你的项目的根目录已经被附加到了PYTHONPATH
中,你的绝对导入应该会非常有效。
或许我也能做到,但这绝对不是一次好的练习。
结论
如果您是 Python 的新手,导入模块可能会成为一场噩梦,尤其是当您需要处理复杂的项目结构时。如果您遵循两步规则——即使用绝对导入并将项目的根目录附加到 PYTHONPATH 中——那么您就不应该担心将来的模块导入。
如果你是 Python 新手,我强烈推荐你在亚马逊上买一本 学习 Python 的书。
成为会员 阅读介质上的每一个故事。你的会员费直接支持我和你看的其他作家。你也可以在媒体上看到所有的故事。
[## 通过我的推荐链接加入 Medium-Giorgos Myrianthous
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
gmyrianthous.medium.com](https://gmyrianthous.medium.com/membership)
免责声明:本文包括附属链接
如何为机器学习修复断裂的价值链
尽管数据科学家的平台取得了良好进展,但商业用户仍难以消费他们的机器学习模型。
欢迎光临!下面是您可以从这篇文章中期待的内容:
- 如果你是一名数据科学家,你会更好地理解为什么你的机器学习(ML)模型可能不被操作采用的一个原因
- 如果你站在商业的角度,你会更清楚为什么你可能难以消费和利用 ML 模型
- 如果你想投资机器学习和业务自动化平台,你会发现一个被忽视的集成点
机器学习的工具、库和平台在过去 10 年里取得了惊人的进步,也许令人惊讶的是,几乎完全是由开源工具和开放标准驱动的。在商业战略方面,机器学习价值链的前半部分是高度模块化的(见下图)。这里没有苹果或星巴克——没有垂直整合的玩家将几个步骤融合在一起作为专有解决方案的一部分。
这种模块化意味着在 ML 价值链的每一步(从数据到库再到部署),很有可能自由选择前一步的组件。是的,有些库是针对 Python 的,有些在 Spark 中工作得最好,但是很大程度上可以根据手头问题的需要混合搭配 ML 库、管道、工具和平台。
在机器学习价值链中,从数据科学到商业的移交是模块化未能为商业用户提供足够简单性的一步。
就专有平台而言(无论是来自亚马逊、IBM、谷歌还是微软),它们倾向于将各种语言(例如 Python、R)、工具(例如笔记本、ide)和库(例如 scikit-learn、TensorFlow)打包为开源,并支持这些作为平台的一部分。
至关重要的是,这些供应商平台旨在扩展到模型部署、模型监控和模型服务,通常运行在 Kubernetes 上,并将 ML 模型作为 REST 端点公开。这部分链有时被称为“ML Ops”,类似于 DevOps 为软件开发和 IT 团队提供的东西。
因此,当 REST 端点可用时,大多数数据科学家、ML 工程师和 ML Ops 平台认为他们的任务已经完成。
然而,当业务和 IT 想要使用这些部署的 ML 模型,使它们成为业务操作的一部分时,这会导致在后续步骤中出现问题。
这些问题通常包括:
- 模型发现:有哪些 ML 模型可用,它们预测/分类什么,哪一个适合特定的业务需求?
- 模型连接:我如何调用一个 ML 模型,向它提供数据并处理输出(和异常)?
- 模型管理:有没有新的 ML 模型版本,有什么不同,我应该什么时候升级?
为了满足这些需求,关于可用的 ML 模型、它们的目的和状态,需要相当多的透明度。当前使用的方法(开放的基于 REST 的 API)技术性太强,没有携带足够的关于 ML 模型的元数据来满足业务消费者的需求。
这里所需要的实际上是 ML 服务和 ML 消费步骤之间更紧密的集成,即确保业务自动化平台对 ML 服务平台具有可见性,能够发现和反思可用的模型。您可以将此视为供应链中的合作伙伴协作,其中供应商向买方提供库存的可见性。
或者,业务自动化平台可以接管 ML 服务的任务,在操作上托管 ML 模型。在这个模型中,ML 模型的消费本质上是通过导入模型来完成的,而不是通过 REST 端点来引用和调用它们。虽然这在技术上可能是可行的,但它对谁来管理 ML 模型有影响,潜在地将 ML 工件的管理从 ML 工程师那里移走。
不管怎样,ML 和自动化平台之间的鸿沟需要被弥合。目前的情况是广泛采用机器学习的主要障碍。
我们从中得到了什么,哪些行动被认为是短期的?
- 如果你是数据科学家或 ML Ops 工程师,计划与那些使用你的模型的人密切合作。如果使用 REST APIs 的“黑盒”式集成是您采用的方法,那么您的业务同事将需要您的信息和支持,以了解您正在提供什么模型以及如何使用它们。
- 如果您所在的组织寻求在业务运营中利用机器学习,请寻找与数据科学家使用的机器学习平台紧密集成的业务自动化平台。评估它提供可发现性、模型消费和模型管理的能力。
最后,如果你是机器学习和业务自动化领域的软件开发人员或供应商,这里可能会有机会脱颖而出。想想克莱顿·M·克里斯坦森的诱人利润守恒定律(见他的书 【创新者的解决方案 ):
“当 诱人的利润 因为产品商品化而在价值链的某一阶段消失时,用专有产品赚取 诱人利润 的机会通常会在相邻阶段出现”
由于机器学习市场如此分散和模块化(接近商品化),诱人的利润可能会提供给那些密切整合 ML 服务和 ML 消费的人,为商业用户利用机器学习提供了一种简单的体验。
注意:如果你喜欢这篇文章,你可能还想看看它的姊妹篇— “解决机器学习的‘最后一英里问题’以进行运营决策”。
格雷格在 IBM 工作,常驻法国。以上文章为个人观点,不代表 IBM 的立场、策略或观点。
如何解决您的数据质量问题
介绍一种更好的方法来防止坏数据。
巴尔·摩西授权下的图片。
数据质量是每一个数据专业人员最关心的问题,这是有充分理由的。 坏数据 耗费公司宝贵的时间、资源,最重要的是,收益 。那么,为什么我们中的许多人都在努力信任我们的数据呢?没有更好的办法吗?
数据环境在不断发展,每时每刻都在为更丰富的洞察力创造新的机会。新旧数据源混合在同一个数据湖和数据仓库中,有供应商可以满足您的每一种需求,从帮助您构建更好的数据目录到生成令人垂涎的可视化效果(让 NYT 来让抵押贷款看起来更性感)。
毫不奇怪,客户问我的最常见的问题之一是“您推荐什么数据工具?
更多的数据意味着更深入地了解您的业务。与此同时,更多的数据增加了出错和不确定性的风险。难怪数据领导者争先恐后地购买解决方案并建立团队,既支持更明智的决策,又管理数据固有的复杂性。
但是我认为我们应该问自己一个稍微不同的问题。相反,请考虑: “我们的组织需要什么来充分利用和信任我们的数据?”
数据质量并不总能解决坏数据
用不可信的数据做决策是一种可怕的前景,然而,即使是最有能力、最有经验的数据团队也是如此。许多团队首先将数据质量视为数据健康和可靠性的轶事。我们喜欢说“垃圾进来,垃圾出去”这是一个真实的陈述——但是在今天的世界里,这就足够了吗?
企业花费时间、金钱和资源购买解决方案并建立团队来管理所有这些基础设施,梦想有一天成为一台运转良好的数据驱动机器——但从摄取到洞察,数据问题可能发生在管道的任何阶段。简单的行数、特别的脚本,甚至摄取时的标准数据质量约定都不能满足要求。
我在一家大型运输公司采访的一位数据主管告诉我,平均而言,他的 45 名工程师和分析师团队每周花费 140 个小时 **来手动检查管道中的数据问题。**即使你有一个 10 人的数据团队,那也是整整五天的时间,可以用来开展创收活动。
数据质量问题可能发生在管道中的任何地方,导致错误决策、资源浪费和沉没成本。虽然对于识别这类问题很有用,但是数据质量本身只能帮你做到这一步。(图片由 蒙特卡洛 提供)。
无论有多少花哨的工具、训练有素的工程师和管理层的支持,都无法防止坏数据破坏您的管道。虽然组织在构建良好的基础设施方面投入了大量资金,但他们经常发现自己在系统整体的完整性方面不知所措,或者说:数据宕机。
数据宕机 ,换句话说,数据丢失、出错或以其他方式受损的时刻,既是数据生态系统最大的痛点,也是全面了解数据质量的关键。数据宕机会导致时间浪费、决策失误,而且最重要的可能是损失收入和客户信任。
如果不跟踪数据停机时间,工具再先进也没用。(为了帮助我的客户解决这个问题,我创建了一个简单的 KPI来衡量数据停机时间,作为更好地了解数据可靠性的函数。)
虽然直觉决策有时是有用的,但我坚信使用坏的或不完整的数据比没有数据更糟糕。
数据可观察性是数据质量 2.0
有很多解决方案将自己推销为一个魔术箱,毫不费力地消耗原始数据来吐出可操作的见解,但在我看来,“数据”和“魔术”是永远不应该出现在同一个句子中的两个术语(好吧,也许只是在某些情况下……)。相反,重要的是将数据视为应该频繁跟踪和监控的东西,作为数据管理“控制台”方法的一部分。
为了释放数据的真正价值,我们需要超越数据质量。我们需要确保我们的数据无论在哪里都是可靠和值得信赖的。实现这一目标的唯一途径是创造可观察性——从源头到消费的整个过程。 数据可观察性 ,组织完全了解其系统中数据健康状况的能力,通过将 DevOps 的最佳实践应用于数据管道,消除了这种神奇的感觉。
是的,数据可能因为一百万种不同的原因而变得“糟糕”。但是根据我的经验,通过关注数据可观察性的五大支柱——新鲜度、容量、模式、分布和沿袭——你不仅可以主动发现数据中的问题,而且实际上可以从一开始就防止它们发生。(查看我最近关于数据可观察性的文章,了解一些可行的策略,以及对这 5 个支柱的更全面的解释。)
数据可观察性可能不会告诉你下一步应该购买哪种新奇的数据工具,但它可以让你避免对数据做出糟糕的(可能代价高昂的)决策。
得到了坏数据? 加入我们的候补名单 获得帮助。
如何骗过一个神经网络?
通过一些对抗性的输入,神经网络很容易被欺骗
使用 Canva 设计
想象一下,你在 2050 年,你正坐在自动驾驶汽车去上班的路上(很可能)。突然,你意识到你的车在穿过十字路口后以 100 公里的时速行驶在繁忙的道路上,但你不知道为什么。
纯粹的恐怖!
会发生什么事?
嗯,可能有很多原因。但是在这篇文章中,我们将关注一个特殊的原因——汽车被骗了。
准确地说,在十字路口看到招牌的神经网络被欺骗,认为停止标志是 100 公里/小时的标志,并导致其瞬时加速。
这可能吗?
是的,它是。但是在深入了解之前,我们先来了解一下一个神经网络经过训练后看到了什么。据信,网络中的每个独立神经元的工作方式都与我们的生物神经元类似,我们假设神经网络在观看图像时的思维方式与我们的大脑相同。实际上,情况并非如此。我们来看一个例子。
猜猜下图是什么。
你猜对了。这是一座寺庙,神经网络以 97%的置信度预测它是一座寺庙。
现在,猜猜这个图像是什么。
又是寺庙?
他们看起来一模一样,但事实并非如此。上面的图像被预测为一只鸵鸟,有 98%的可信度,与我们之前使用的模型相同。网络现在被这个形象忽悠了。但是怎么做呢?
第二张图像不是来自真实世界的相机,而是手工设计的,专门用来欺骗神经网络分类器,同时与我们的视觉系统相同。
这个吵闹的家伙要对模型的错误分类负责。将该噪声添加到第一图像中导致了修改的第二图像,这被称为对抗示例。增加的外部噪声称为扰动。
同样,汽车可能以这种方式将停车标志与 100 公里/小时标志错误分类。
使用 Canva 设计
让我告诉你,除了上面的自动驾驶汽车案例,为什么这对许多现实世界的机器学习应用程序来说是一个非常重大的威胁。
- 也有可能创建一副 3D 打印眼镜,但当你戴上它们时,你突然无法被任何现有的面部识别软件识别。
- 此外,打印一个定制的车牌,看起来完全正常,但会被任何现有的交通监控摄像头误注册。
这样,神经网络容易受到大量不同的攻击。有白盒攻击,黑盒攻击,物理攻击,数字攻击,可感知和不可感知的攻击等等。在任何真实环境下工作时,网络必须能够抵御所有此类攻击。
这是如何工作的?
安德烈·卡帕西写了一个非常有趣的博客,你可以在这里阅读。这里有一个小的先睹为快。
那么,在传统的培训过程中,我们该怎么做呢?我们得到损失函数,我们反向传播,计算梯度,采用这个梯度并使用它来执行参数更新,它在正确的方向上稍微摆动模型中的每个参数,以增加预测分数。这些参数更新负责增加输入图像的正确类别的置信度得分。
注意这是如何工作的。我们保持输入图像不变,并调整模型参数以增加我们想要的任何类别的分数。反过来说,我们可以很容易地翻转这个过程来创造出愚蠢的图像。也就是说,我们将保持模型参数不变,取而代之的是,我们将计算输入图像中所有像素在我们希望的任何类上的梯度。例如,我们可以问一个问题—
当我调整图像的像素时,(你想要的任何类)的分数会怎样?
使用 Canva 设计
我们像以前一样用反向传播计算梯度,然后我们可以执行图像更新而不是参数更新,最终结果是我们增加我们想要的任何类的分数。例如,我们可以拍摄一张熊猫图像,并根据该图像在猫类上的渐变来调整每个像素。这会稍微改变图像,但是猫的分数现在会增加。有点不直观的是,事实证明你不需要过多地改变图像就可以将图像从被正确分类为熊猫切换到被分类为任何其他种类(例如猫)。
现在你已经对这是如何工作的有了一个基本的概念,有一个你应该知道的流行技术叫做**快速梯度符号方法,**用于产生对立的例子,这是由 Ian J. Goodfellow 在解释和利用对立的例子中讨论的。
快速梯度符号法
在这种方法中,您获取一个输入图像,并使用损失函数相对于输入图像的梯度来创建一个新图像,使现有损失最大化。通过这种方式,我们获得了视觉系统几乎察觉不到变化的图像,但是同一个神经网络可以看到显著的差异。这个新形象被称为敌对形象。这可以用下面的表达式来概括:
adv_x = x + ϵ * sign(∇x * J(θ,x,y))
在哪里
- adv_x:对抗性的形象。
- x:原始输入图像。
- y:原始输入标签。
- 确保扰动较小的ϵ:乘数。
- θ:模型参数。
- j:损失。
你可以通过在这个笔记本中为图像生成你自己的对立例子来试验这种方法。在这里,您将找到一个在 MNIST 数据集上训练的模型,您可以看到调整ϵ(ε)参数时置信度得分如何变化。
Colab 的结果
对于任何 x → y,x 表示实际类,y 表示预测类。
正如你所看到的,如果你增加ε值,扰动会变得更加明显,我们的视觉系统会有明显的变化。然而,我们的神经系统足够强大,可以预测正确的类别。
该方法通过找出给定输入图像中的每个像素对损失值的贡献来实现这一点,并相应地添加扰动。
不仅是快速梯度符号方法,我们还有其他一些流行的方法,称为对抗性补丁方法,单像素攻击方法,通过对抗性扰动创建 3D 模型,等等。让我们来看看其中的一些。
对抗性补丁
谷歌在 2018 年提出了一个独特的想法,以下列方式在图像框中放置一个对抗性的补丁。
这张纸展示了如何向模特展示任何图像,它将给定的图像归类为烤面包机。这个补丁被设计成这样一种方式,它可以欺骗任何负责分类的底层神经网络,让它认为是一个*烤面包机,*不管你给它什么图像。你只需要把这个标签贴在物品旁边。它工作得很好,足以欺骗不够健壮的模型。
打印受到不利干扰的 3D 模型
不仅仅是图像,你还可以创建一个专门设计的 3D 模型,在任何角度愚弄模型。
既然我们已经看到了这些对立的例子是如何欺骗神经网络的,那么同样的例子也可以用来训练神经网络,使模型免受攻击。这也可以作为一个良好的正则化。
从上图可以明显看出,在用对立的例子进行训练后,模型现在不太容易被愚弄了。
现在是最后一个问题。
我们人类自己有对立的例子吗?
我认为答案是肯定的!例如,如果你看一些像这样的视错觉,
你会注意到这些线起初看起来并不平行。但是当仔细观察时,这些线是相互平行。
是的,这些正是对立的例子。它们是我们看到不该看到的东西的图像。因此,我们可以看到,我们的人类视觉系统也可能被某些例子愚弄,但很明显,我们对愚弄我们的神经网络的对抗性例子非常敏感。
结论
这些对立的例子不仅仅局限于图像。从简单的感知器到自然语言处理模型的任何模型都容易受到这种攻击。但是这些可以通过一些策略在一定程度上得到控制,例如被动和主动策略,这些将在我接下来的文章中详细讨论。
从好的方面来看,我认为这些对立的例子暗示了一些非常有趣的新研究方向,我们可以用它们来改进现有的模型。我希望你今天能学到一些新东西!
如果你想联系我,请在 LinkedIn 上联系我。
参考
- https://arxiv.org/pdf/1802.08195.pdf
- https://pytorch.org/tutorials/beginner/fgsm_tutorial.html
- https://www . tensor flow . org/tutorials/generative/adversarial _ fgsm
如何在 Python3 中格式化日期
strftime、format 和 f 字符串的比较
照片由 Surene Palvie 发自 Pexels
您可能以前使用过 Python 的格式化语法。但是你如何格式化日期呢?使用 datetime 对象,可以用%Y
、%m
、%d
分别以数字形式显示对象的年、月、日(即三月会被数字“03”代替)。
Python 有几种格式化字符串的语法。这样每条线路都会产生相同的输出。
输出:
2020 年 08 月 04 日
These lines produce the standard for Japanese dates. 年 means year, 月 means month, 日 means day.
让我们看看每个语法。
使用strftime
strftime
是一个可以追溯到 python 早期的函数。它的名字相当神秘,但尽管如此,它最常用于我们所期望的日期格式化:一种工作就是格式化事物的方法。
它做得很好。但是语法可能有些笨拙。strftime
不是最容易打字的单词。此外,如果我们需要在同一个字符串中格式化几个日期呢?
不过注意.strptime
的存在,它是.strftime
的逆变换。在英语中,这些名称可以翻译成“字符串解析时间”和“字符串格式化时间”。
使用.format
方法
.format
是str
类的一个方法,用来格式化一个包含格式化语法的字符串。我们称之为的替代领域以荣誉{}
为标志。它用于标记传递给该方法的参数将被插入的位置。奖项内的数字{1}
用于选择参数。注意它从 0 开始,所以第一个传递的参数将被插入{0}
。这里有一个例子来总结:
"The {0} parameter. The {2} parameter. The {1} parameter.".format("first", "second", "third")
请注意,您可以根据需要订购或复制替换字段{}
的使用。您也可以插入命名参数
"Cut the {first}. Wash the {second}. Prepare the {third}.".format(first="onions", second="carrots", third="salad")
对于日期时间对象,我们有额外的格式。例如,{0:%Y}
将在第一个位置参数中插入日期的年份,这应该是一个日期时间对象。因此,您可以看到为什么这两行会产生相同的输出。
"{:%Y 年%m 月%d 日}".format(datetime.today())
"{0:%Y}{1}{0:%m}{2}{0:%d}{3}".format(datetime.today(), "年", "月", "日")
第一个将所有内容放在替换字段{}
中,而第二个将它分成几个插入的参数。看情况选择哪个会更有可读性。
f 弦f""
由于最近在 python3.6 中引入,f-String 或 String interpolation 是一种强大而简洁的字符串格式化方法,这种方法鲜为人知。使用f""
语法,您可以直接将变量名与格式语法放在一起。比如说。
age = 25
print(f"So you are {age} years-old?")
我们甚至可以在里面写函数调用!现在,您应该明白我们是如何获得与之前相同的输出的:
f"{datetime.today():%Y 年%m 月%d 日}"
结论
尽管.strftime
仍然被广泛使用,但在我看来,它的可读性较差,因为其他语法更接近我们所期望的 pythonic 代码。这背后的主要原因是格式化操作是在str
对象上有效执行的,而不是在 datetime 对象上。所以我会推荐你更喜欢.format
和f""
,它们更简洁。f 字符串也可以用于调试。例如,print(f"{a=}")
将打印出a=
,后跟a
的实际值。查看文档了解更多。
原载于 2020 年 8 月 4 日https://adamoudad . github . io。
如何为有意义的数据分析制定好的研究问题
了解如何从数据中获得好的见解
来源:TAHA·AJMI
如今,数据无处不在。有许多不同大小和形状的数据。如果没有人分析这些数据,它们就没有任何意义。所以,数据科学家和数据分析师有很多事情要做。但是,如果我们不知道从数据中推断出什么信息,分析就不会有效。无论数据来源多么真实,花费多少金钱和时间来取样或收集数据,如果研究问题没有得到很好的阐述,这些都是无用的,甚至是有害的。我说有害是因为如果我们对一个非常敏感的数据集做出错误的解释,那会导致在一个重要的问题上做出错误的决定。因此,对于数据科学家来说,学会如何提出精心设计的研究问题至关重要。
在这篇文章中,我想解释一些在设计研究问题时需要考虑的关键因素。
感兴趣的目标人群
在研究问题中,必须对感兴趣的目标人群进行清晰而简明的描述。一个很好的例子是芝加哥地区家庭收入超过 100,000 美元或更多的西班牙裔人口。或者,具有大学或更高教育水平的非裔美国女性。
描述性或分析性问题
知道要执行哪种计算很重要。这里,描述性是指是否有具体的参数需要计算,如平均年龄、总收入或最高身高。另一方面,解析意味着更抽象的参数。可以是收入水平和学历的关系。所以,没有直接计算统计参数。相反,分析不同的参数并从中得出结论。
问题是原创的吗
问题是原创吗?它是否增加了一个新的知识领域,或者为任何现有领域增加了更多,或者提供了一个关于旧研究的不同视角?许多研究旨在建立在一些现有研究的基础上或增加现有的知识。但这需要在研究陈述或研究问题中明确。
数据已经有了吗
我们需要确保变量随时可用,或者资源和工具可用于收集适当的数据。必须对数据进行仔细的研究,这样数据才能抓住研究的核心思想。
这是一个好的研究问题的四个基本组成部分。如果没有一套经过深思熟虑的问题,数据分析可能毫无意义,或者带来糟糕和误导性的见解。
糟糕的问题
“收入和健康质量之间有什么关系?”
让我们从四个关键部分来分析这个问题。首先,它是否准确描述了目标人群?事实并非如此。因此,研究领域变得过于宽泛,可能会导致模糊的分析结果。第二,它是否提到分析是描述性的还是分析性的?是的,确实如此。这是一个分析性的问题。这个问题是要找出收入和健康质量之间的关系。第三,问题是否原创?我想不会。但要看是哪部分人群。第四,数据是否已经可供分析?那要看哪个部分,哪个地区,哪个年龄段的人口。
精心设计的问题
“考虑到年龄在 50 岁以上,纽约市患糖尿病的美国白人和非裔美国人的百分比有多大差异?”
现在,我们来分析一下它是否涵盖了所有的关键组件。首先,它清楚地描述了研究的目标人群。第二,问题是描述性的。我们需要计算美国白人和非裔美国人患糖尿病的百分比。第三,问题可能不是原创。但是它会在现有知识的基础上增加新的知识。这可能会给去年的数据与今年的数据进行比较提供空间。第四,数据可能已经存在,但仍有更新信息的余地。最重要的是,这个问题有一个明确的目标。
作为一名数据科学家,你可能知道世界上所有的工具。但是,如果不知道如何正确地从数据中推断出见解,学习数据科学是不完整的。
如何生成访问 API 端点的数据,甚至无需编码
实践教程
Python 库——sandman 2 简介
作为任何 Web 或移动应用最常见的架构,数据库+后端 API +前端是非常典型和经典的。虽然不同的应用程序肯定会有自己的前端设计,但后端 API 通常非常相似。也就是说,他们必须能够访问数据库中的数据。换句话说,后端 API 的主要职责是充当中间件,接收来自前端的请求并根据请求检索数据库,然后将结果返回给前端,以便用户可以使用。
当然,对于大多数应用程序,后端 API 也需要一定程度的定制,尤其是安全需求,如 JWT 等。然而,当没有太多安全问题时,有一种方法可以“生成”您的后端 API,它甚至不需要编码就可以访问您的数据库。
在本文中,我将介绍一个 Python 库可以帮你做到这一点。假设你是一个前端开发人员,你只想在你的测试环境中测试一些前端特性,不想浪费太多时间去写自己的后端 API。在这种情况下,Python 库 sandman2 是最好的选择之一!
样本数据库的准备
照片由 manniguttenberger 在 Pixabay 上拍摄
sandman2 库支持许多数据库管理系统,例如:
- SQLite
- 关系型数据库
- 一种数据库系统
- 神谕
- MS SQL Server
- 赛贝斯
- 下毛毛雨
- 火鸟
sandman2 库支持它们作为不同的 SQL“方言”,这意味着我们不需要担心我们正在使用哪个数据库,只需告诉 sandman2 是哪个数据库,它就可以开箱即用。
在本文中,我将使用 SQLite 作为例子,因为它是最简单的,我不需要下载、安装和配置任何东西。
在我以前的一篇文章中,我介绍了一个 Python 内置库 sqlite3,它可以非常容易地生成 sqlite 数据库。我将跳过 Python 中 SQLite 库的介绍。你可以看看我下面的文章了解详情。
Python 内置库 sqlite3 简介
towardsdatascience.com](/do-you-know-python-has-a-built-in-database-d553989c87bd)
让我们创建一个名为“我的测试”的数据库。
import sqlite3 as slcon = sl.connect('sandman2/my-test.db')
然后,出于演示目的,创建一个名为USER
的表。
with con:
con.execute("""
CREATE TABLE USER (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
);
""")
之后,让我们插入一些示例行。
sql = 'INSERT INTO USER (id, name, age) values(?, ?, ?)'
data = [
(1, 'Alice', 21),
(2, 'Bob', 22),
(3, 'Chris', 23)
]with con:
con.executemany(sql, data)
好的。现在,我们可以查询该表。
with con:
data = con.execute("SELECT * FROM USER")
for row in data:
print(row)# Output:
# (1, 'Alice', 21)
# (2, 'Bob', 22)
# (3, 'Chris', 23)
我们现在已经有了一个填充了表的数据库。让我们在下一节开始演示 sandman2 库。
基于 Web 的 SQL 客户端
在一切之前,我们需要安装 sandman2 库。只用pip
。
pip install sandman2
然后,正如我在标题中所说的,我们不需要编写任何代码,只需要使用命令行界面。
$ sandman2ctl sqlite+pysqlite:///sandman2/my-test.db
下图显示了连接字符串的构造方式。
请注意,DB 驱动程序是可选的。如果我们保持它为空,SQLAlchemy (sandman2 构建在 SQLAlchemy 之上)将尝试使用默认驱动程序。但是,如果驱动程序不存在,它可能会抱怨。别担心,我们可以得到默认驱动库的名称,这样我们就可以使用pip
来安装它。
运行该命令后,web 服务启动。
让我们尝试使用任何浏览器访问管理控制台的 web 客户端。
[http://localhost:5000/admin/](http://localhost:5000/admin/)
我们可以看到页面上已经有一个对象USER
。这是因为我们创建了这个表。如果我们点击USER
,我们可以看到我们之前插入的三行显示在数据表中。
在此页面上,我们可以单击“创建”按钮来插入新行、更新现有行或批量删除行。您将能够很容易地找到这些特性,所以让我跳过这些内容,在下一节中向您展示最重要的特性。
数据访问 RESTful API
sandman2 最酷的功能一定是我们已经连接的数据库自动生成的 RESTful API 端点。
在上面的部分中,保持 web 服务运行,那么 API 已经在那里供我们使用。您可能更喜欢 Postman 或失眠症等 API 测试工具,但在本文中,我将只使用“curl”命令来保持简单,因此如果您只想测试 API 端点,您不必下载任何东西。
1.获取表格中的数据条目列表
还记得我们有一张桌子叫USER
吗?现在,我们可以简单地向下面的 URL 发送 GET 请求来获取条目列表。
http://localhost:5000/user/
请注意
- 大多数 DBMS 如 SQLite 和 MySQL 不区分大小写,所以我们可以安全地使用小写的表名。
- URL 末尾的正斜杠
/
一定不能错过。
然后,让我们使用curl
测试 GET API。
curl [http://localhost:5000/user/](http://localhost:5000/user/)
它返回表中的所有记录。但是,如果我们在一个表中有太多的条目,并且想要进行分页,该怎么办呢?是的,睡魔 2 支持开箱即用!
curl "[http://localhost:5000/user/?page=1&limit=2](http://localhost:5000/user/?page=1&limit=2)"
curl "[http://localhost:5000/user/?page=2&limit=2](http://localhost:5000/user/?page=2&limit=2)"
在这个例子中,我们使用page
参数来指定页码,使用limit
参数来指定页面大小。在第 1 页中,我们得到了前两个用户 Alice 和 Bob。然后,在第 2 页,我们得到了 Chris 的第三行,由于没有其他行,所以只返回了 1 行。
2.按键获取行
既然我们定义了主键,我们也可以通过它来查询表。
curl [http://localhost:5000/user/](http://localhost:5000/user/)3
3.按任意字段筛选行
我们也可以按任何字段过滤行。
curl "http://localhost:5000/user/?name=Chris"
目前,有一个限制,即不支持对比较>, <, >=, <=
进行过滤。
4.插入新行
要插入新行,我们需要使用 POST 方法。
curl -X POST -d "{\"age\":24, \"name\":\"David\"}" -H "Content-Type: application/json" http://localhost:5000/user/
请注意,我使用的是 Windows,所以单引号在 cmd 中不起作用,我必须使用反斜线来转义双引号。如果你使用 Linux 或 Mac OS,你可能不需要这些。
此外,当我们创建USER
表时,我们已经将“id”字段设置为自动递增,所以我们不需要传入“id”值。
我们无法使用基于 Web 的 SQL 客户端来查看该表。新用户 David 已成功插入。
5.更新行
我们可以使用 PATCH 方法来更新一行。
curl -X PATCH -d "{\"age\":30}" -H "Content-Type: application/json" http://localhost:5000/user/3
如示例所示,在 URL 中传递当前主键“id”很重要,在我们的示例中是“3”。Sandman2 依靠主键找到要更新的记录。
如果我们回到网络客户端,可以看到克里斯的年龄已经更新。
6.删除一行
我们可以使用 DELETE 方法删除一行。
curl -X DELETE -H "Content-Type: application/json" http://localhost:5000/user/3
运行上面的 CURL 命令后,id=3 的用户被删除了。
7.表的定义
sandman2 库不仅支持一般的数据访问 API,还支持其他一些高级 API,比如获取表的元数据。
curl http://localhost:5000/user/meta
8.将表格导出到 CSV 文件
最后,它还支持将数据导出到 CSV 文件。
curl -o user.csv "http://localhost:5000/user/?export"
摘要
在本文中,我介绍了一个令人惊叹的 Python 库,名为 sandman2。它是用 Python 写的,但是你不需要写任何 Python 代码来使用它。只需用有效的数据库连接字符串运行它,您将获得
- 基于 Web 的 SQL 客户端
- 一整套访问 RESTful API 的数据
原来《睡魔 2》并没有太多的安全实现,所以请千万不要在生产中使用。然而,安全问题通常意味着定制实现,这几乎不可能在开箱即用的工具集中通用。因此,sandmand2 是一个优秀的库,可以节省我们大量的测试和实验时间。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)