AI 理解:大象是什么?
人类知识和人工智能模型中大象的表示
在这个故事中,我想谈谈一个词的抽象概念。它在不同语境中的含义。当前的机器学习算法如何理解它,为什么很难实现一个通用的、类似人类的知识。我想用大象这个词来说明我的想法。我会把这个帖子的收入捐出去拯救物种。*
“这不是一头大象”,字体为“大象——原图”,作者为克里斯汀·斯蓬基亚,来自皮克斯拜
字典中的大象
这是《韦氏词典》对大象的定义 [1]:
1a: 一种体形粗壮,通常非常大,几乎无毛的食草哺乳动物(象科,象科),其口鼻部拉长成肌肉发达的象鼻,上颚有两颗门牙,特别是雄性长牙:
(1): 热带非洲的一种高大、大耳的哺乳动物(loxotonta africana),有时被认为由两个独立的物种组成(撒哈拉以南的稀树草原的 L. africana 和中部和西部雨林的 L. cyclotis )
也被称为非洲象
**(2)**东南亚森林中一种相对较小耳朵的哺乳动物
——又称亚洲象、印度象
非常大或难以管理的人
这个条目可以说明理解一个词的概念的一些困难的挑战。首先,单词可能有许多完全不同的意思。在这里,单词大象有两个意思,它们之间唯一的联系是都指大的东西。其次,1a、1b 和 1a 亚型表明在不同的上下文中,大象这个词代表不同的事物,更大或更小的动物群体。对于一个学习动物知识的孩子来说,非洲象和亚洲象的区别没有生物学家重要(参见维基百科上大象种类的完整列表)。最后,阅读和理解这个定义需要了解其中使用的词语(例如哺乳动物、亚洲和非洲)。
这不是一个不确定的知识概念(AKMilroy 2015 after Margritte) [2]
自然语言处理中的大象
对于计算机来说,要理解一个普通的文本,它必须把它转换成数字。最直接的方法是为字典中的每个单词指定一个数字。为了将其表示为向量,其中两个单词是独立的,需要有一个向量空间,其维度与词汇的大小一样大(如果单词被用作该向量空间的标准基,这被称为一键编码)。
然而,这是一种非常昂贵的表示,人们可能想要一种更紧凑的表示。Mikolov 等人[3,4]提出了一种表示方法,其中向量空间被投影到一个更小的(100-300 dims)空间,基于该空间,单词在大型语料库中一起出现。使用这个单词嵌入向量,不仅表示变得更小,而且还有另一个非常重要的特征:相似的单词彼此更接近。在上使用 en 英语语料库这个在线演示,单词大象类似于下面的单词:elephants, rhino, tiger, rhinoceros, tigers, hippo, gorilla, giraffe, rhinos, hippopotamus
。
有了这个单词向量表示,我们就可以使用向量运算了:如果我们从向量大中减去向量大象,再加上向量鼠标,一个与结果最相似的向量就是小。这叫做字类比:大和大象的关系类似于小和老鼠的关系。
正如我在上一节中提到的,单词有多重含义,通常只有上下文才能区分它们。最近的工作,如 Devlin 等人[5]提出了一种新的方法,称为上下文化单词嵌入向量来解决这个问题。如果你对此感兴趣,可以看看我以前的帖子!
空间城市词典中“房间里的大象”例句的依存可视化
明摆着的难题
为了理解一个词的每一种用法,人们还应该研究一下搭配。例如,房间中的大象不仅仅是建筑中的一只大型哺乳动物。在搭配中,单词有共同的意义,人们不能仅从各部分的总和中推导出它的意义。在某些情况下,像大象的脚,它需要特殊的参考,可能不是常识的一部分,但是,人们可以期待一个通用的人工智能理解参考。像 Spacy [6]这样的 NLP 工具包可以解决这个叫做命名实体识别 (NER)的问题。
大象的脚是切尔诺贝利事故中形成的大量堆芯熔融物和其他材料的昵称…
en.wikipedia.org](https://en.wikipedia.org/wiki/Elephant%27s_Foot_%28Chernobyl%29#/media/File:Chernobyl_Elephant%27s_Foot.jpg)
计算机视觉中的大象
两个主要的图像数据集都包含大象的图像。OpenImages [7]有一个单个大象类,ImageNet [8]也有一个非洲 (2277 张图片,61.32%受欢迎百分比)和印度 (1650 张图片,55.85%受欢迎百分比)大象类。ImageNet 数据集通过在分层结构中对图像进行分类来回答上面提出的关于不同级别的单词组的问题。
ImageNet 层级中的大象— 图片来自 ImageNet 网站(2020 年 10 月 22 日)
浏览这些图片,我们可以看到不同位置、年龄、大小和背景的大象。这些数据解决了第二张图中提出的问题(AKMilroy 2015,Margritte 之后):有许多图像只显示了动物的一部分,因此,根据这些数据训练的模型可以只从动物图像的一部分中识别大象。
open images 数据集中带有分割的大象 ( 许可)——原始来源作者德里克·济慈 ( 许可)
大象的人类形象
虽然上一节提到的图像数据集包含大量真实动物的图像,但我们人类还有动物的其他表现形式:图画、人物和毛绒玩具。这里可以提出一些有趣的问题:
- 一个训练有素的人工智能能理解大象的概念吗?
- 它会把玩具归类为大象吗?
- 一般模型应该把玩具归类为大象吗?
- 什么时候应该把它归为大象?
七种可选的大象图片及其 Keras DenseNet 分类,带有预先训练的 ImageNet 权重
上图显示了七个可选的大象图片及其 DenseNet [9]分类,在 Keras 中使用预先训练的 ImageNet 权重实现。我们可以看到,在很多情况下,模型识别的是格式(绘图,毛绒),而不是图像中的动物。只有两个预测的前五名中有一头大象。
上图中的图像:
- 复制早期印刷版本人类窥镜的插图(1430 年)
- 安德烈·泰韦特。F. André Thevet d’Angoulême。里昂、让·图尔内斯和吉尔的《数字评论与增刊》。Gazeau,1556 年。
- 1976 年万隆奥林匹克运动会
- 棋子,主教 17 世纪末-18 世纪初
- 后来出售的 t 恤上画的大象。丹尼斯·贾维斯
- 蓝色大象剪贴画
- 毛绒大象的图片,自己的照片
拯救物种!
大象是野生动物的标志性动物。根据拯救大象:
大象是非洲的园丁和景观工程师,无论它们漫游到哪里,都在播种和创造栖息地。
如果不采取紧急措施来拯救它们的物种,大象可能会在一代人的时间内从野外消失。
从 2010 年到 2012 年,仅仅三年时间,非洲就有大约 10 万头大象因为象牙被捕杀。
(*):我想把这个帖子的收入捐出来拯救大象。因此,每当 WWF Gifts 网站上的非洲象虚拟收养捐赠金额达到 55 美元时,我都会将其捐赠给该组织。
参考
[1]“大象。”Merriam-Webster.com。2011.https://www.merriam-webster.com(2020 年 10 月 22 日)。
[2] 米尔罗伊,A. K. (2017)。昆士兰植物群进化和灭绝的知识、技术和观点可视化。
[3]t . miko lov,Sutskever,I .,Chen,k .,Corrado,G. S .,& Dean,J. (2013 年)。词和短语的分布式表示及其组合性。神经信息处理系统的进展(第 3111-3119 页)。
[4]t . miko lov,陈,k .,Corrado,g .,& Dean,J. (2013)。向量空间中单词表示的有效估计。 arXiv 预印本 arXiv:1301.3781 。
[5] Devlin,j .,Chang,M. W .,Lee,k .,& Toutanova,K. (2018 年)。Bert:用于语言理解的深度双向转换器的预训练。 arXiv 预印本 arXiv:1810.04805 。
[6] Honnibal,m .,& Montani,I. (2017 年)。 spaCy 2:利用 Bloom 嵌入、卷积神经网络和增量解析的自然语言理解。
[7] Krasin I .、Duerig T .、Alldrin N .、Ferrari V .、Abu-El-Haija S .、Kuznetsova A .、Rom H .、Uijlings J .、Popov S .、Kamali S .、Malloci M .、Pont-Tuset J .、Veit A .、Belongie S .、Gomes V .、Gupta A .、Sun C .、Chechik G .、Cai D .、Feng Z .、Narayanan D .、Murphy K.
OpenImages:大规模多标签多类别的公共数据集
可从https://storage.googleapis.com/openimages/web/index.html.获得
[8]邓俊杰,董,魏,苏歇,李,李,李,,李(2009 年 6 月).Imagenet:一个大规模分层图像数据库。2009 年 IEEE 计算机视觉和模式识别会议(第 248–255 页)。Ieee。
[9]黄,g .,刘,z .,范德马腾,l .,,温伯格,K. Q. (2017)。密集连接的卷积网络。在IEEE 计算机视觉和模式识别会议论文集(第 4700–4708 页)中。
人工智能如何帮助金融和银行业
人工智能和机器学习为金融行业提供了前所未有的自动化承保、防止欺诈和获得新客户的能力。
在过去的几年里,金融和银行业的人已经开始看到将机器学习引入他们行业的力量。现在,各种规模的金融机构都在争先恐后地减少官僚作风,提高贷款过程的准确性和公平性。
不幸的是,许多金融机构仍在使用启发式方法来管理复杂、高度管控的流程,也就是说,他们流程的规则和法规是由一群(昂贵的)法律、金融和计算机编程专家手动配置和更新的。
是什么推动了采用人工智能的紧迫性?
需要提高速度和效率获得更深入的数据驱动洞察的机会复杂的法规和合规性要求糟糕的客户服务和漫长的等待时间。信用评分不能说明全部情况。
当机器学习进入金融和银行业时
- 新的人工智能驱动的流程和产品产生新的收入流。
- 多维度和跨辖区的欺诈计划可以立即被发现。
- 客户获取变得更加个性化、简化和数据驱动。
- 财务报告、合规性保证和管理任务都是自动完成的。
- 风险评估和承保超越了信用评分。
- 通过图像处理验证索赔并确定损失。
人工智能在金融和银行业的主要用途
文本组织和摘要
Manceps 可以帮助金融机构将自然语言处理应用于大量文本和语音数据,以提取信息、获得洞察力并简化手动任务。虽然节省时间和成本是显而易见的好处,但识别关键信息的能力(众所周知的大海捞针)却能带来巨大的不同。考虑将自动摘要应用到法律文档、收入报告或工作申请中。
欺诈检测
欺诈检测现在不仅仅涉及风险因素清单。使用 ML 技术,欺诈检测系统现在可以主动学习和校准,以应对新的(或潜在的)安全威胁。通过分析数十亿个数据点,这些系统可以标记出否则会被人类忽视的问题,防止错误拒绝。
个性化零售体验
客户越来越擅长使用聊天机器人和其他对话界面来满足他们的银行需求。这种聊天机器人必须使用强大的自然语言处理引擎以及大量特定于金融的客户交互来构建。这些技术使得银行客户越来越难以辨别他们是否真的在与人交谈。
聊天机器人、财务助理和相关工具是自学的,这意味着它们会随着额外的客户互动而不断改进。
风险保理
预测分析运行在人工智能上,在金融领域,引入这种见解可以增加收入并降低成本。金融组织出于各种目的使用预测分析。这使得他们能够识别和锁定更有利可图的客户;更好地管理现金流;预测需求波动,降低风险。随着人工智能的能力越来越强,金融机构正在寻找越来越复杂的方法来利用这些数据。
操作优化
像许多大型组织一样,金融机构正在转向人工智能,以自动化经常重复的任务,并帮助他们的业务更顺利地运行。在一个例子中,摩根大通利用机器人帮助员工重置密码。他们预计,2017 年机器人将处理近 200 万个请求,大约是 40 名全职员工的工作量。
本文改编自 Manceps《金融与银行服务》页面 。Manceps 不仅帮助组织大规模地构建和部署人工智能模型,还帮助组织识别商业用例,使人工智能投资成为可能。
如果你正在考虑将人工智能引入你的组织,我建议你从这个优秀的资源开始: 人工智能就绪讨论问题 。
更多与金融相关的用例,可以考虑查看: 来自全球最大金融和银行公司的 AI 例子 。
人工智能对新冠肺炎。真的管用吗?
弄清楚我们能用现有的数据做什么,不能做什么
艾丽莎·埃克特女士和丹·希金斯女士在菲尔上的照片
内容:
- 介绍
- 制作我们的胸部 x 光新冠肺炎分类器
2.1。数据准备
2.2。训练
2.3。结果 - 真的管用吗?
3.1。进一步分析
3.2。讨论和要点
1.介绍
今天,每个人都知道疫情。专业人士尽最大努力帮助应对这一问题:防止感染的快速传播、开发诊断方法、药物发现、病人护理策略、疫苗开发、死亡率预测、全球经济的建模影响以及许多其他问题。
数据科学家也不例外。没有必要让任何人相信人工智能在医疗应用中非常有用。你可能已经看到出版物(甚至科学论文)声称已经开发出某种模型,可以预测患者是否患有新冠肺炎。一些出版物声称,当将深度学习应用于胸部 X 射线图像时,预测准确率达到 90%以上,这提出了许多问题。
这就是为什么:在 Futuremed 我们与医生密切合作,处理医疗数据。放射科医生说,胸部 x 光片中几乎没有新冠肺炎特有的模式。有时候,人工智能能够找到任何人类医生都无法找到的特征。
使用视网膜照片进行性别分类。
也许新冠肺炎的胸部 x 光片也是如此?让我们找出答案。
2.制作我们的胸部 x 光新冠肺炎分类器
这不是一个“如何训练神经网络”的教程,但我会添加所有必要的信息来重现所描述的工作。
2.1.数据准备
对于在胸部 X 射线图像上分类新冠肺炎的任务,我们的数据集应该至少有两个类:“新冠肺炎”和“其他”。
我们将使用四个数据源进行训练:
1。著名的 GitHub 回购带有新冠肺炎的图片。
2。来自意大利数据库和新冠肺炎病例的图片。
3。胸部 x 光肺炎数据集。
4。 NIH ChestXRay-14 数据集。
为了获得尽可能多的新冠肺炎图像,让我们结合前两个来源。意大利数据库中的大部分图片已经包含在 GitHub repo 中。但有些不是,所以我们只是手动添加。通过这种方式,我们可以获得目前(2020 年 4 月 7 日)新冠肺炎的所有可用图像,以及一些没有该图像的图像(如果有其他病理或“无发现”,它们将被用作“其他”类别样本)。这里要注意一点:每个患者在数据集的那个部分可以有多个图像,所以 n_patients ≤ n_images 。
为了获得“其他”类的更多图像,使用最后两个源。
- 从胸部 X 射线肺炎数据集中随机选取 450 幅图像,每类以平衡的方式。不考虑患者 id。这样我们得到:
149 例无发现患者的 150 幅图像,
144 例病毒性肺炎患者的 150 幅图像,
144 例细菌性肺炎患者的 150 幅图像。 - 从 NIH ChestXRay-14 数据集中随机挑选 450 张图像:
每 14 种病理状态 30 张图像,另外 30 张图像带有“未发现”标签。具有一种目标病理的图像也可能包含其他病理。所以这部分数据集几乎平衡。
图像的采集方式使得该子数据集可能仅包含某个患者的一幅图像。换句话说,我们得到了 450 个独特的病人图像。
接下来,我们把所有的数据结合起来。以下是生成的数据集统计数据:
所有图像的尺寸都调整为 564x564。计算数据集中图像的平均值和标准偏差。
2.2.培养
让我们使用 DenseNet-121 作为模型的主干(它几乎成为处理 2D 医学图像的默认选择)。由于我们的新冠肺炎数据集太小,无法从头开始训练模型,让我们首先在 ChestXRay-14 上训练我们的模型,然后使用预训练的模型进行权重初始化。
处理医学图像时,确保同一患者的不同图像不会进入训练/验证/测试集至关重要。为了解决这个问题,由于新冠肺炎图像的缺乏,我们决定对患者使用 10 倍交叉验证进行训练。
为培训进行了以下数据扩充:
- 随机旋转(<15°),
- Random crop (512x512),
- Random intensity shift.
For evaluation, we used only center crops (no TTA).
计算的平均值和标准差用于增强后标准化图像。
对网络进行了修改,以便为这些类生成两个逻辑(“新冠肺炎”和“其他”)。数据是不平衡的,所以我们选择加权二进制交叉熵作为损失函数。还使用了软标记:一键编码标记平滑 0.05。当我们对患者进行交叉验证时,两个类别的图像数量会从一个折叠到另一个折叠发生变化,因此我们会实时计算每个折叠的每个类别权重。
使用带有 AMSGrad 的 Adam optimizer 来训练网络。其他超参数和代码可以在项目报告这里找到。ROC AUC 模型验证集上的最佳值保存在每个折叠中。
2.3.结果
所得到的模型形成了用于进一步分析的集合。所有验证倍数指标的平均值:
ROC AUC: 0.99387,
准确性:0.95046。
为了进行测试,我们使用了来自 GitHub repo(2020 年 4 月 7 日至 22 日添加的)的新正面(PA 或 AP 视图)X 射线图像。
和需要平衡(“新冠肺炎”和“其他”)类别的图像数量是从从 ChestXRay-14 中随机选取的未用于训练的患者图像中添加的(由于它们是随机选取的,从统计上看,它们中的大多数都带有“无发现”标签)。所有这些带有相应标签的图像组成一个测试集。
测试集上的每个标签统计信息:
常见的指标有:
还不错!看起来我们有了一个坚实的胸部 x 光新冠肺炎分类器。
对于一些读者来说,结果可能看起来令人信服,但其他人可能会有“这里有问题”的感觉。
3.真的管用吗?
让我们使用更多的数据来评估我们的分类器的性能。
3.1.进一步分析
首先,让我们看看分类器在 ChestXRay-14 数据集的其余部分(未在训练中使用)上的性能统计:
由于在该数据集中没有新冠肺炎病例,那么我们唯一可以声称的是,我们的分类器在该数据集上具有相当好的特异性(0.99235) 。
此外,您可以看到,在“肺炎”和“浸润”等类别上没有假阳性峰值,这些类别可能与新冠肺炎 x 光照片类似。这是否意味着人工智能算法可以将新冠肺炎病与其他类似的疾病区分开来?
其次,让我们来看看分类器在不可见 专有数据上的表现。使用的数据集只有“正常”和“异常”标签。该数据集中没有新冠肺炎阳性患者图像。
特异性显著下降(至 0.69333)。分类器现在好像不太好。发生了什么事?
第三,我们来看看 GitHub repo 关于新图片(2020 年 4 月 7-22 日)的详细结果,有新冠肺炎案例。
综上所述,我们得到:
重新计算指标后,我们已经可以看到一些东西:
已经不是“还不错”了。我们现在可以看到真相:我们的分类器是垃圾。让我们好好想想。
3.2.讨论和要点
正如前面提到的,结果精度表明分类器无法区分图像中的新冠肺炎特定模式(记得放射科医生说,在胸部 X 射线图像中没有多少特定的到新冠肺炎模式)。但是分类器学到了什么,为什么它在 GitHub repo 和 ChestXRay-14 数据上表现良好?
分类器学习从“其他”类的数据集中挑选的图像看起来如何。它还了解到,任何病理模式都意味着它是“新冠肺炎”,“T2”,因为图像看起来不像是来自“其他”数据集。
所以,一般来说,分类器学会了区分一些病态的和看起来不像“其他”图像的东西。
患者的原始图像,带有分类器对新冠肺炎的预测(左),对应的 GradCAM(右)。
这就是为什么它在我们的专有数据集(包含看起来不像“其他”图像的图像)上将几乎每三张图像标记为“新冠肺炎”。
分类器知道正常和异常图像之间的一些差异。每隔 3 个异常图像和每隔 5 个正常图像标记为“新冠肺炎”。至少我们的努力没有白费:)
尽管在训练时进行了强大的数据扩充,仔细的患者 k 倍交叉验证,以及加权损失函数,分类器在真实世界的数据上表现不佳。
我们鼓励任何感兴趣的人重复我们的实验。实际上,你不需要任何专有数据,你可以只从“其他”类中排除一个数据集,并将其作为“不可见”使用。
我想指出两个要点:
任何神经网络总会试图找到解决任务的最简单方法*。*
仔细查看验证模型性能的数据*。不仅仅是光秃秃的数字。*
在这一点上,我并不是说绝对不可能在胸部 x 光片上找到任何新冠肺炎特有的模式。有可能某种特定的东西确实存在,人工智能能够捕捉到它。但在以下情况下,这是绝对不可能的:
- 神经网络是根据少量数据训练的
- 当某个特定类别的图像与数据集的其余部分存在显著差异时
所有的源代码都可以在我们项目的 GitHub repo 获得。如果你有任何问题,请随时联系我。
人工智能将为安全返回工作场所提供动力。以下是方法
疫情还没有结束。如何安全地迎接员工重返职场?
想象一下你在隔离几个月后回到办公室的第一天:你不仅可能在早上的通勤途中暴露于病毒之下,而且随后你将面对拥挤的电梯。
当你进入楼层时,你会注意到门把手可能已经被你前面的几十个人碰过了,而且受限的工作空间很容易违反社交距离协议。这种情况很难让你放松,更不用说帮助你回到办公室工作的状态了。
克里斯蒂安·埃尔富特在 Unsplash 上拍摄的照片
这就是为什么组织在欢迎他们的团队回到工作场所时采取严格而谨慎的措施是至关重要的。许多企业没有意识到的是,人工智能(AI)如何能够将更普遍的健康和安全协议推向新的高度。
该技术可以让团队以最安全的方式获得面对面协作的好处。以下是方法。
人工智能允许你安排谁回来,什么时候回来
所以,你打算邀请你的员工回到办公室。了解什么是最有效的方式来组织谁来,在什么日子来,来多长时间是一项复杂的任务——尤其是如果你有超过 50 名员工的话。这就是人工智能驱动的调度和规划工具的用武之地。
组织必须首先了解工作活动、员工任务的性质、客户互动的种类、会议时间表以及期望在现场协作的人员名单。
您必须将此与每个员工的风险级别评估结合起来。这可能包括一些因素,如他们在工作中的暴露程度、工作场所的类型以及需要与公众进行身体接触的程度。它还可以包括员工的家庭所在地、年龄、先前存在的状况,以及雇主可以(在道德上)用来保护他们和他们的团队的任何其他信息。
机器学习可以使用这些因素来平衡工作的关键程度和风险水平,并帮助制定出重返工作的时间表。该算法可以通过考虑典型工作场所阻塞点的允许容量来帮助规划一天内的时间表。这包括像电梯这样的位置或用于社交聚会的区域,它们可能是办公室内的高风险区域。
您必须根据不断变化的组织优先级、病毒控制的有效性和政府对企业的指导方针,不断调整这些计划。这份麦肯锡报告概述了不同类型工作场所的风险因素,可以作为一个有用的参考点。
人工智能让你确保安全协议得到遵守
一切照旧早已成为过去。再次和同事们在一起不会有挤在咖啡机旁或者在自助餐厅里分享拥挤的桌子的奢侈。现在,在工作中,社交距离是不可协商的。人工智能如何帮助确保员工在工作场所的安全?
人工智能可以帮助企业在员工和客户进入设施时处理他们的大规模体温筛查数据。加拿大公司 PredictMedix 提供其人工智能体温检测技术来帮助零售商店防止新冠肺炎的传播。
人工智能驱动的计算机视觉工具可以自动监控工作场所,以确保人们戴上口罩,并与同事保持社交距离。人工智能初创公司 DatakaLab 使用巴黎地铁系统的安全摄像头来检查乘客是否戴着口罩。
这些系统通过匿名检测一个人是否戴着面罩,避免了面部识别技术中有争议的元素。任何违规行为都可以报告给管理团队,让他们识别并采取适当的纠正措施。
社交距离探测仪— 登陆 AI 演示
这项技术可以扩展到检测办公室内的社交距离何时被打破。LandingAI 已经开发了一个人工智能的工具,它可以分析实时视频流来估计人与人之间的距离,这可以用来立即识别违规行为。
许多组织正在探索使用物联网驱动的可穿戴设备,当用户彼此过于接近时,这些设备会向用户发出警告。组织可以分析这些数据,以了解办公室中的位置以及导致违反协议的情况。
虽然身体健康和防止病毒传播必须是当务之急,但帮助员工在艰难时期保持心理健康也至关重要。人工智能解决方案可以分析短信,以识别压力、抑郁或焦虑的潜在指标。
例如,StatusToday 的 AI 解决方案连接到组织内的电子邮件、聊天和通信系统,以识别可能处于精疲力竭边缘的员工。
人工智能推动恢复规划
Gramener 的联系人追踪应用程序— 演示
无论你为安全返回工作场所做了多少准备、策略和计划,在病毒被完全击败之前,感染的可能性总是存在的。在人工智能的帮助下,你如何制定正确的流程来处理团队成员对新冠肺炎呈阳性的事件?
接触追踪解决方案可以帮助您使用可穿戴设备、生物识别技术或门禁卡了解员工在工作场所的移动情况。如果一名员工被感染,您可以确定与此人有密切接触的同事。接触追踪可以帮助您识别和隔离有风险的员工,而不是让所有员工远程操作。
尽管采取了所有重开办公室的措施,但很可能在未来几个月内,相当一部分员工将不得不远程办公。您必须继续利用促进远程工作的数据分析和智能协作应用程序,以确保您的远程团队保持高工作效率。
人工智能具有促进安全返回工作场所的巨大潜力,无论是办公室、仓库还是零售店。然而,贯穿所有这些计划的一条主线是对数据收集水平的关注,以及对其运作所必需的监控。
虽然这是一个合理的担忧,但必须在疫情的背景下看待这些举措,以及与之斗争的必要条件。如果公司和员工希望确保安全,同时避免任何形式的数据收集,那么我们可能没有可信的选择来重新工作。
现实情况是,必须在不损害员工健康和安全的情况下,对数据收集的程度做出判断。虽然我们已经提出了一些可供我们选择的技术,但每个组织都必须根据自己国家的规范,决定哪些技术适合自己的文化。
重要的是,在监控水平和使用数据的方式上,你要对你的员工公开透明。遵循最佳实践,真诚地收集数据,并致力于在风险水平下降时降低监控程度。
与此同时, AI 可能就是那个不仅能让你的团队生存下来,还能在疫情的其余地方茁壮成长的东西。
这篇文章最初是在 IT Pro 门户网站上发表的。增加了插图。标题照片由 埃德温·胡珀 上Unsplash*。*
我不会抢走你的工作。循环和条件可能会。
我们真的需要复杂的人工智能来取代人类吗?
在过去的几年里,有太多关于人工智能的谈论,以及它如何对我们的工作有害——通常是在声称它只会帮助我们更好地工作之后。人类的角色将是做工作中人的部分——因此是与客户的交流和所有你可能讨厌的东西。
在我继续说下去之前,我想做一个简短的声明:这篇文章可能会有偏见,而且是在考虑东欧文化的情况下写的。我写的东西可能在世界其他地方不适用,所以在跳到评论区之前请记住这一点。
好了,说到这里,我们可以回到正题了。
我对世界教育的主要看法是,一个人必须接受高等教育,才能有一份收入更高的工作和更好的生活保障。
虽然在某些情况下这是真的,但在其他情况下,这与事实相去甚远。今天,至少在我的国家,拥有硕士学位的人正在从事 20 年前只需要高中文凭的工作。花点时间想想这有多疯狂——现在你需要在学校多呆 5 年,就为了在你父母工作过的地方工作!
我打算在下一节用一个小故事来支持这个观点。
让我给你讲个故事
大约一周前,我在银行开了一个商业账户。没什么特别的,基本上你和工人坐在一起,签署 10 份文件。然后,过了几天,账户准备好了,我又回去了,又一次只签了文件,但这一次文件堆得没完没了。
**这个故事有什么意义,**你可能会问。嗯,重点是,这个在银行工作的人需要有硕士学位(或在一些罕见的情况下有学士学位),才能分发和准备要签署的文件。
由 Giphy
当然,我不认为所有在银行工作的人都是在准备文件并把文件发给当事人,等待他们签字。但对他们中的一部分人来说,这很好地描述了他们的工作。
这种说法不仅适用于银行业,也适用于大多数公共行政部门。想想你最后一次排队,只是为了听你听到的前一个人(和你听到的后一个人)说的同一句话,只是因为你需要提交一篇论文,而这篇论文由于某种原因无法在线提交。
这是不对的。
结论 —教育水平不能保证工作安全(自动化方面)。
哪里出了问题
我并不是说银行或公共管理部门(或任何严格意味着遵循程序的部门)的工作不好,但你为什么需要 5 年的大学才能申请一个初级程序跟随者?
由吉菲
在工作的头几个月,你会学到所有需要的东西。句号。
现在我们在谈论人工智能接管类似的工作。人们很害怕。但是为什么你需要人工智能来编写循环和条件呢?
人们担心人工智能会接管他们的工作,而事实是,在计算机编程发明的那一刻,他们的工作就可以自动化,程序员学会了如何写“如果”和“for”。
就这么简单——如果有一个程序可以遵循,那么你就不需要人工智能,因为你真的不需要有人去思考,只是去执行。**凡是能描述的都可以自动化。**如果你的工作是遵循一个程序,那么对 AI 的要求是不存在的,因为它可以被线性编程。
问题依然存在— 为什么遵循流程的工作没有实现自动化?
作业自动化的主要问题
一些工作已经实现了自动化,这是一件好事。我这样想的原因是多方面的,但归结起来就是:
- 有些工作并不打算由人类来做(因为这些工作在体力上非常困难)
- 别人让你无聊到死(谁愿意一天 1/3 的时间都在无聊中度过)
但是这一节将讨论工作自动化的主要问题,至少从我的观点来看是这样的。这些是:
- 没有人可以责怪——你知道一个你忘记写的测试,它在生产中咬你的屁股?这同样适用于这里。如果一项工作是自动化的,那么如果一切都不顺利的话,老板就不会对任何人大喊大叫。
- 缺乏人情味——我们是社会人,因此喜欢社交和结交新朋友。机器只是机器,因此无法提供适当的人类交流方式。
现在,在下结论之前,让我们花点时间来讨论一下工作自动化的利弊。
工作自动化的利与弊
当我们谈到优点时,我认为有两方面可以受益:
- 雇主们——自动化的东西不会做错事情(如果自动化正确的话),不需要每个月发工资,也不会有一天不顺心
- 你——没错。还记得上面的排队等候的例子吗?还是银行的那个?这可以很容易地自动化,并在网上完成,节省你的时间和神经。
但是当谈到缺点时,我将只深入讨论一个——但是阻碍自动化的那个——伦理问题**。**
剥夺人们努力获得的工作是错误的吗?成千上万的家庭会面临风险吗?
做决定不那么容易吧?
由吉菲
带回家笔记
这不是一个容易谈论的话题——有太多不同的观点和意见。如前所述,整篇文章是基于我生活的地方的情况,我希望你生活的地方情况更好(更像 21 世纪)。
说了这么多,我能得出什么结论呢?
首先,我不明白谈论人工智能以及如果你的工作可以被一个简单的 Python 脚本取代,它将如何取代你的垃圾观点。没有必要担心,就目前而言,伦理问题似乎超过了利益。如果你的工作不能被简单的线性规划取代,那么我认为 AI 有一天会帮助你做出更好的决定,并从本质上让你更好地完成工作,至少现在是这样。
从我的角度来看,作为一个对我的技术能力相当自信的人,同时也是一个企业主,如果工作可以以任何方式自动进行——使用简单的如果和 for,或者通过实现更复杂的机器/深度学习算法,我甚至不会考虑雇佣某人。
但这只是我的观点,你有权拥有你的观点,所以请在评论区与我分享。感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
西雅图的 AirBnB 房屋:数据驱动的外观
分析受欢迎程度、需求和价格。
来源:谷歌图片
简介
过去几年来,AirBnB 对现有的酒店公司构成了严重威胁。2018 年,AirBnB 在美国的市场份额在 18%左右。AirBnB 的多功能性,从在大城市市区租房到在树林里租树屋,使它成为如此大的竞争对手。
在本帖中,我们将看看西雅图的 AirBnB 房源。在这个分析中使用了两个主要数据集:列表数据,关于西雅图的 3818 个列表的信息,以及日历数据,给出一年中所有列表的每日可用性。数据集可以从 kaggle 下载。
在对数据进行初步评估后,我遇到了三个问题,激发了我的兴趣:
西雅图什么街区最受欢迎?
这些地段的房源租金分布如何?
一年中去西雅图最忙的时候是什么时候?在这段时间里,价格是如何变化的?
所有用于分析的代码都可以在 GitHub 上公开获得。
入门指南
加载数据
所有数据文件都是逗号分隔值(CSV)格式。使用 pandas 可以很容易地将它们加载到数据帧中。calendar_df
文件的输出如下所示:
listing_id date available price
0 241032 2016-01-04 t $85.00
1 241032 2016-01-05 t $85.00
2 241032 2016-01-06 f NaN
3 241032 2016-01-07 f NaN
4 241032 2016-01-08 f NaN
这需要稍微解释一下:available
列只包含两个值:t
或f
,分别代表“真”或“假”,它显示一个列表何时可用或不可用。另外,price
列中的很多值为空。这是因为当一个列表变得不可用时,它的价格就变成了NaN
(不是一个数字)。
同样,listings_df
文件有关于清单的详细信息:
listings.csv 文件中的示例内容
数据准备
calendar
和listings
数据帧的price
列都有一个字符串数据类型,很难进行算术运算。为了进一步分析,我们必须将其转换为数值数据类型。
现在,检查数据帧是否缺少值:
id 0
zipcode 7
latitude 0
longitude 0
number_of_reviews 0
review_scores_rating 647
property_type 1
room_type 0
bathrooms 16
bedrooms 6
availability_30 0
availability_60 0
availability_90 0
availability_365 0
price 0
正如我们所看到的,有几列缺少值。在回答我们最初的问题之前,处理它们是很重要的。
我们发现值为review_scores_rating
的列表没有评论。这是有道理的,因为评级是基于评论的。这些列表对于我们的案例来说不是很有趣,所以我们将删除它们。
zipcode
列有 7 个NaN
值。我们可以删除它们,但让我们尝试使用所谓的**反向地理编码来获取这些位置的邮政编码值。**我们将使用latitude
和longitude
的值来获得zipcode
的值(我们跳过了这个细节以避免跑题,但感兴趣的读者可以在GitHubrepo 中看到)。
所有其他列缺少的值并不重要,因为我们无论如何都不会使用这些列值。
现在,随着数据清理的进行,我们可以专注于分析了。
问题 1:西雅图的哪些街区最受欢迎?
虽然一个列表的受欢迎程度取决于很多因素,如物业类型、位置、提供的便利设施、价格等。我的流行度标准基于两件事:一个是一年至少三个季度不可用的列表,另一个是评论评级高的列表。现在,我对至少 9 个月不可用的标准有点模糊,因为这可能有几个原因,如主机在列表中进行翻新或主机不可用于维护列表。更好的标准是查看availability_30
、availability_60
、availability_90
和availability_365
列的可用性百分比。这些列分别给出了 30 天、60 天、90 天和 365 天中列表可用的天数。
根据可用性检查过滤后的features_df
每个街区的列表数量
正如我们所料,在 30、60、90 和 365 天内至少有 70%不可用的列表通常具有较高的总体评分。这意味着尽管有许多其他因素在起作用,但我们的标准或多或少是正确的。
要找到最受欢迎的列表,我们需要两件东西:一个是给定邻域中的列表数量,另一个是正确代表该邻域列表评级的单一聚合指标。下图显示了不同邮政编码的评级分布情况:
从上面的方框图可以清楚地看出,除了 7 个评级(满分 275 分)之外,所有评级的得分都至少为 80%。几乎全部的中值都在 90%以上。因此,用某种度量来聚合这些值是有意义的。我们将使用平均值,因为它会比使用中位数更严格一些。在使用 mean 作为聚合并将列表按邮政编码分组后,现在它们可以显示在地图上了。
将链接到互动地图
问题 2:这些地点的房源租金分布如何?
用邮政编码分配租金
在上面的图中,有几个租金超过 400 美元的离群值。我们会尽力找出这些房源是什么样的。但首先,让我们来计算这些位置的中间价格。
正如我们在左边看到的,中间价格变化很大,但主要集中在 80-120 美元之间。
大多数标价超过 400 美元的房源都是至少有 3 间卧室和 2 间浴室的整栋房子,这也解释了为什么它们会这么贵。然而有一个例外,那只是一套公寓,却是最贵的一套(1000 美元)。让我们来看看:
这个列表最贵是有道理的——它位于市中心,非常靠近城市的所有主要景点。
问题 3:一年中去西雅图最忙的时候是什么时候?
找出最繁忙的访问时间可以通过每月检查列表的可用性来完成。为了实现这一点,我们需要从calendar_df
的date
列中获取月份,然后应用 pandas datetime 操作。
正如我们所看到的,夏季尤其是七月、八月是游览西雅图最繁忙的时候,而可供选择的景点却最少。此外,由于需求旺盛,这几个月的挂牌价格最为昂贵。
结论
在这篇文章中,我们查看了来自西雅图的 AirBnB 数据,以了解三个主要的兴趣领域:人气、需求和价格。
虽然有许多因素被忽略了,但它仍然揭示了一些真正有趣的见解。
分析的主要要点如下:
- 大多数房源位于市中心附近,其中位于邮政编码为 98102 和 98122 的房源最受欢迎。一般来说,他们的评分非常高,达到 90%的评分。
- 大多数地点的房源价格在 80-120 美元之间。
- 夏季的几个月,特别是七月和八月,是去西雅图的高峰期,平均租金高达 150 美元。
这种分析有很大的扩展范围,包括:
- 评论的情绪是否正确地代表了总体评分?
- 还有哪些因素增加了房源的受欢迎程度,它们如何影响房源的价格?
- 价格的时间序列预测以及它们与来自 AirBnB 的最新数据的吻合程度如何?
Airbnb-A 部分(Python-可视化、比较研究、回归)
通过与华盛顿 DC 的对比研究、回归模型、互动地图
和自然语言处理,分析了西雅图 Airbnb 的情况。向市议会和旅行者提出建设性的建议
**B 部分:**可以在这里找到
自 2008 年以来,Airbnb 帮助客人和主人以更独特、更个性化的方式旅行。该公司从一个出租的充气床垫发展到价值超过 300 亿美元的全球合作,这都要归功于其精力充沛的创始人布莱恩·切斯基。2020 年应该是 Airbnb 的黄金年,因为它将上市并发行世界上最受追捧的股票。悲剧的是,冠状病毒发生了。旅游业被疫情摧毁了。Airbnb 现在面临着烧钱、愤怒的房东和不确定的未来,因为 2000 名员工可能会被解雇,还有数十亿美元的高利率债务,这些债务是为了偿还客户而建立的。(研,2020)
尽管如此,随着六月的到来,情况开始好转。Airbnb 报告称,5 月 17 日至 6 月 3 日期间,美国房源的预订量超过了去年同期。在成功抗击病毒的国家,如德国、葡萄牙、韩国和新西兰,国内旅游也有类似的增长。像 Expedia 和 Booking.com 这样的其他公司也见证了国内度假租赁预订的激增。几个月来被压抑的需求导致夏季预订热潮,因为越来越多的人希望逃离他们的家庭冠状病毒避难所。现在,Airbnb 的房源比危机前更多,主要集中在传统的度假租赁市场,美国的顶级目的地。它们是南加州的大熊湖、田纳西-北卡罗来纳边境的烟雾山和德克萨斯州的阿兰萨斯港。(卡维尔,2020) 尽管如此,任何反弹都来自一个非常低的基数,切茨基在 5 月份的电话会议上表示,他预计今年的收入将达到 2019 年上半年的水平。他说,今年上市仍是一个选择,但他将等待市场稳定下来,然后再做出最终决定。
作为一名之前接受过培训、现居住在西雅图的酒店经营者,我想分两部分做一个关于西雅图 Airbnb 现状的分析项目。第一部分是对西雅图和 DC 华盛顿州两个城市的比较研究。西雅图和华盛顿 DC 地区位于美国的两端,因为不同的原因而广为人知:分别是科技和文化中心与政治中心。此外,它们拥有相似的人口规模(刚刚超过 700,000)和多个列表(8740 和 9369)。然后,在第二部分,我们将从政府立场和游客的角度更深入地了解西雅图的市场,并推荐不仅有利于 Airbnb,还有利于这座城市及其市民的解决方案
数据集可以在 Airbnb 开放数据源下载。它们包括
清单 : 详细清单数据
清单 _ 详细信息: 清单的汇总信息和指标
点评 : 详细点评
***reviews _ details:***汇总评论数据和列表 ID(便于基于时间的分析和链接到列表的可视化)。
日历: 详细日历
邻居 : 地理过滤器的邻居列表。来源于城市或开源 GIS 文件。
**neighbors . geojson😗*城市的街区 geo JSON 文件。
数据集获取于 2020 年 4 月 23 日。西雅图有 7237 个值,而华盛顿 DC 有 9342 个值
I/数据探索
当我们导入两个城市的“listings”数据集时,我们将 encoding='latin1 '指定为参考,以避免遇到 UnicodeDecodeError 错误:“utf-8”编解码器无法解码错误。所有西雅图的相关数据集将被命名为“sl ”,而 WashingtonDC 有“wl”。然后,我们就从数据准备部分开始。“列表”数据集有三个步骤。
第一步: 通过一个函数运行两个数据集,清洗所有数值数据。为了解决这个问题,它包括多个子功能:从两个数据集(访问、交互、house_rules 等)中识别所有我们不需要的不相关因素。),删除所有只有唯一值的列,如 id 或 url 链接(ID、listings_url 等。),添加另一个用于审核的列,将所有“价格”列转换为数字,将所有百分比列转换为浮点数,生成新的审核指标,并删除原始审核列
(图片作者)
***第三步:*从两个城市的“列表”数据集中检查定量信息。由于 Seattle 的“listings”的干净版本与 Washington DC 的“listings”相比具有更少的列,分别为 29 和 33,我们将检查哪个列出现在一个表中而没有出现在另一个表中:
(图片作者)
II/可视化和回归分析
***1)*AirBNB homes 房产对东西海岸的房价有什么影响?
从各自的角度来看,西雅图和华盛顿 DC 的价格区间有很大差异,前者比后者差得多。西雅图的房间价格最高只能达到 1200 美元/晚,而华盛顿 DC 最贵的房间价格是这个数字的两倍多(3000 美元/晚)。除了精品酒店是西雅图和华盛顿 DC 最昂贵的酒店之一,西雅图的飞机乘客喜欢住在法律和别墅,而那些访问华盛顿 DC 的人更喜欢入住酒店而不是其他类型的酒店。同样值得一提的是,西雅图所有房地产类型的价格波动都较大。这意味着您可以选择经济或奢侈的方式在翡翠城逗留。然而,如果我们看得更近一点,我们会发现其他类型的房地产价格,如住宅、公寓、宾馆,无论位置如何,价格都在 100-200 美元/晚之间。因此,旅行者在 Airbnb 上预订时不会注意到两个城市之间不成比例的价格区间差异。
(图片作者)
在西雅图,旅行者更喜欢拥有一张真正的床,或者至少是一张折叠沙发,用于整个家庭、私人房间和酒店房间,这解释了为什么它们是这些类别中最贵的床。令人惊讶的是,在合住客房类别中,客人的期望大幅下降,其中大多数人对充气床垫感到满意,尽管与所有其他房间类型中的其他床类型相比,充气床垫可能同样昂贵(最多 500 美元/晚)。这种奇怪现象的一个原因是大量的季节性节日集中在艺术、文化、音乐等方面。整个夏天。 (Bell et al .,2019) 参与者往往是 20-30 岁,适应性更灵活,因此,在旺季共用房间里昂贵的充气床垫总比没有住宿好。相反,在 DC 的华盛顿州,除了酒店房间,充气床垫是所有房产类型中的首选。西雅图和华盛顿 DC 的床类型的价格范围没有区别,而后者的酒店房间的真正的床比前者(平均约 200 美元/晚)贵两倍(平均 600 美元/晚),并且分布更稀疏(50-1200 美元/晚)
(图片作者)
一般来说,床的数量和浴室的数量是正相关的,客人需要的床和浴室的数量越多,价格越高。然而,在达到一定数量的床(11)和浴室(6-6.5)后,相关性就变成了负的。因此,我们可以假设,因为有规定,任何预订超过 12 张床或 6 个浴室的客人将获得团体折扣。西雅图的床位和价格之间的关系比 DC 的华盛顿稳定且分布均匀。根据上述城市热爱节日的原因,人们可以相信,当在一次入住中接待大量客人时,当地的酒店经营者和主人会更加熟悉。同样重要的是,与床相比,浴室对价格变化的影响更大。分布负向偏左,分布不均匀,因为有少量波动。例如,在西雅图,4.5- 5 间浴室的价格从 600 美元/晚下降到 100 美元/晚,然后反弹到 1000 美元/晚。
(图片作者)
另一方面,在西雅图和华盛顿 DC,卧室和住宿与价格的相关性是严格正的,左偏的。这些价格范围也彼此相似,客房为 100-2000 美元/晚,住宿类为 100-800 美元/晚。有趣的是,西雅图最多有 8 间卧室,而在华盛顿 DC 是 27 间,西雅图最多有 25 间,而在华盛顿 DC 是 16 间。我们可以得出结论,那些去西雅图过夏季节日的人只需要在再次出门前洗个澡,而不是呆在家里,所以他们不介意睡在合租公寓里不舒服的充气床上。这种现象表现为 7 至 8 间卧室的房间价格猛增 600 美元。
(图片作者)
2) 哪些房东的行为或资料会影响东西海岸 AirBNB 房客的评论?
为了回答这个问题,我们将创建热图来展示 Airbnb 在每个城市的评论和行为特征之间的相关性。有四个步骤
步骤 1: 将所有六个分类列转换为虚拟变量,以进一步对它们进行评估:“host_response_time”、“host_has_profile_pic”、“host_identity_verified”、“host_is_superhost”、“instant_bookable”、“cancellation_policy”
第二步: 将虚拟变量列合并在一起
第三步: 只需从组中只保留促成行为相关的相关因素列。有些因子内部有大量的值,因此我们还需要剔除一些最多余的值,如“一周内的主机响应时间”,因为它们仅适用于少数数据集。
步骤 4: 使用 seaborn.heatmap()函数创建西雅图和华盛顿州 DC 的热图
对于西雅图的 Airbnb 来说,相关性相对较低,最高的是‘host _ is _ super _ host’和‘new _ review _ metric’之间的 0.39。这意味着你的列表的审核分数取决于该主机是否是西雅图的超级主机。另一方面,华盛顿 DC 的 Airbnb,积极方面的相关性相对较高,消极方面的相关性类似,最高的是“主机 _ 响应 _ 速率”和“主机 _ 接受 _ 速率”之间的 0.55。这意味着,如果华盛顿 DC 的主人阅读了你的信息,他/她有 55%的几率会接受你的 Airbnb 预订请求。
(图片作者)
(图片作者)
***3)*AirBNB 房源哪个是点评中最重要的一个?——【回归分析】
为了了解各种因素如何影响最终评审分数,我们将借助随机森林方法进行回归分析研究,然后举例说明。数据预处理包括:删除不相关的变量和缺少评论值的行,用它们的平均值填充缺少的数字列,为分类变量创建哑元。x 是所有独立因素,而 y 以“new_review_metric”作为因变量,并以 0.75/0.25 的比率拆分这些数据表。对于回归变量,我们将使用(n_estimators=100,criterion='mse ',random_state=42,n_jobs=-1。最终的模型精度和验证如下。结果彼此非常相似,均方误差较低,R2 较高,这表明预测值和可用因变量之间的差异很小,我们可以解释超过 90%的观察到的变化可以通过模型的输入来解释。
(图片作者)
在独立特征对评论的重要程度的可视化中,我们可以看到,与西雅图相比,在华盛顿 DC 的第一和第二高度重要特征之间存在更大的差异。此外,在预订 Airbnb 时,“女王城市”的游客更重视主人本身的质量,而不是酒店或房间,这与美国首都的模式相反。西雅图的“价格”排名也较低,这是因为如上所述,该城市的平均租赁价格适中。
(图片作者)
****待续 B 部分 ****
参考&来源:
贝尔,j .,弗里德曼,e .,塞尔林,k .,&泽尔曼,J. (2019 年 7 月 17 日)。本周末,西雅图地区将举办 46 个节日。陌生人。https://www . the strange . com/things-to-do/2019/07/17/40789078/46-festivals-to-check-out-in-Seattle-this-weekend
奥卡维尔 (2020 年 6 月 8 日)。Airbnb 发现度假租赁需求激增。洛杉矶时报。https://www . latimes . com/business/story/2020-06-07/Airbnb-冠状病毒-需求
研,K. (2020 年 4 月 8 日)。 Airbnb 的冠状病毒危机:烧钱、愤怒的主机和不确定的未来。华尔街日报。https://www . wsj . com/articles/airbnbs-coronavirus-crisis-burning-cash-angry-hosts-and-an-uncertainty-future-11586365860
— — —
***数据集:*http://insideairbnb.com/get-the-data.html
灵感来源:https://www . ka ggle . com/Xi chenlou/Seattle-and-Boston-Airbnb-data-comparison
Airbnb-B 部分(Python-交互式地图,自然语言处理)
通过与华盛顿 DC 的对比研究、回归模型、交互式地图
和自然语言处理来分析西雅图的 Airbnb 情况。向市议会和旅行者提出建设性的建议
西雅图的可爱明信片(图片由作者提供)
来自甲部的介绍
自 2008 年以来,Airbnb 帮助客人和主人以更独特、更个性化的方式旅行。该公司从一个出租的充气床垫发展到价值超过 300 亿美元的全球合作,这都要归功于其精力充沛的创始人布莱恩·切斯基。2020 年应该是 Airbnb 的黄金年,因为它将上市并发行世界上最受追捧的股票。悲剧的是,冠状病毒发生了。旅游业被疫情摧毁了。Airbnb 现在面临着烧钱、愤怒的房东和不确定的未来,因为 2000 名员工可能会被解雇,还有数十亿美元的高利率债务,这些债务是为了偿还客户而建立的。(研 2020)
尽管如此,随着六月的到来,情况开始好转。Airbnb 报告称,5 月 17 日至 6 月 3 日期间,美国房源的预订量超过了去年同期。在成功抗击病毒的国家,如德国、葡萄牙、韩国和新西兰,国内旅游也有类似的增长。像 Expedia 和 Booking.com 这样的其他公司也见证了国内度假租赁预订的激增。几个月来被压抑的需求导致夏季预订热潮,因为越来越多的人希望逃离他们的家庭冠状病毒避难所。现在,Airbnb 的房源比危机前更多,主要集中在传统的度假租赁市场,美国的顶级目的地。它们是南加州的大熊湖、田纳西-北卡罗来纳边境的烟雾山和德克萨斯州的阿兰萨斯港。(卡维尔,2020) 尽管如此,任何反弹都来自一个非常低的基数,切茨基在 5 月份的电话会议上表示,他预计今年的收入将达到 2019 年上半年的水平。他说,今年上市仍是一个选择,但他将等待市场稳定下来,然后再做出最终决定。
作为一名之前接受过培训、现居住在西雅图的酒店经营者,我想分两部分做一个关于西雅图 Airbnb 现状的分析项目。第一部分是对西雅图和 DC 华盛顿州两个城市的比较研究。西雅图和华盛顿 DC 地区位于美国的两端,因为不同的原因而广为人知:分别是科技和文化中心与政治中心。此外,它们拥有相似的人口规模(刚刚超过 700,000)和多个列表(8740 和 9369)。然后,在第二部分,我们将从政府立场和游客的角度更深入地了解西雅图的市场,并推荐不仅有利于 Airbnb,还有利于这座城市及其市民的解决方案
在 B 部分,我们将创建一些可视化,交互式地图,并利用西雅图的 Airbnb 2020 房源数据集深入自然语言处理。除了标准库之外,我们还引入了更多专用于创建地图的库(folium,geopandas),可视化库(plotly,cufflinks),自然语言处理库(re,nltk)。
(图片作者)
除了主要用于分析的 listings.csv 和 listings_details.csv,我们还使用了“日历”和“review_details”数据集来帮助我们。正如我们在 A 部分提到的,列表基本上是广告的 id。2020 年 4 月,西雅图有 7237 个 Airbnb 房源。“列表”包含 15 个特征,而“列表 _ 细节”包含 96 个特征。我们没有使用所有可能不相关的列,而是有选择地加入了一些对 B 部分的分析有用的变量。我们还从“主机响应速率”功能中去掉了“%”。
(图片作者)
I/ 探索性数据分析(EDA)
1) 邻里
市中心是西雅图所有商业和专业活动的中心(1250 个列表),这解释了为什么它的列表数量在城市之外的其他街区中排名第二。西雅图市中心附近的其他地区似乎也没有那么受欢迎,因为在首都山只有 775 个房源,中心区只有 600 个,其余的都在 500 个以下。有一种理论认为,旅行者决定住在西雅图之外的原因是因为该市目前房地产价格的飙升。我们将揭示这个有趣的事实如何影响其他列表的因素,如价格和客户对 Airbnb 住宿的看法。对于交互式地图,您可以放大集群,最终找到列表的各个位置(下面是 Github 代码)
(图片作者)
2) 房间类型,物业类型,&每次预订人数
CBRE 酒店的美国研究表明,Airbnb 在西雅图约 80%的收入来自整间房屋的房源,拥有多间整间房屋房源的房东产生的收入在 2015 年至 2016 年间几乎翻了一番。(西雅图市议会,2017) 商业企业喜欢利用在线租赁平台来营销不同位置的多个单元,这可能会加剧西雅图的住房危机定时炸弹,正如你将在本报告稍后看到的那样。不幸的是,2020 年的情况不会更好,整个家庭/公寓占据了绝大多数房源(总共 5700 个),比私人房间高出 3 倍。然而,西雅图迟迟没有通过任何实质性的法律,不像纽约,纽约积极禁止任何房屋出租超过 30 天,直到 2017 年。(道尔顿,2017)
(图片作者)
值得注意的是,有不同的财产清单,但并不是所有的都广受喜爱。为了排除不流行的物业类型,我们创建了一个名为“total”的附加列,根据房间类型统计每种物业类型的列表,并选择超过 100 个的列表。之后,我删除了“总计”列以获得正常结果。房子和公寓是最常见的财产类型。与公寓相比,房屋似乎是整个家庭/公寓列表中不太受欢迎的财产类型,但当涉及到私人房间租赁时,它们更受欢迎。
(图片作者)
一般来说,大多数房源通常喜欢接待少于 5 名客人,其中大多数是 2 人(超过 2700 个房源)。然而,有趣的是,一个 6 人的聚会可以很容易地找到一个合适的过夜场所。这是因为与阿姆斯特丹等其他城市不同,出于对可能的噪音投诉或火灾隐患的担忧,西雅图没有短期租赁的最大容量限制为 4。因此,如果你想开派对,西雅图是最好的选择。
(图片作者)
二/给西雅图市长的建议
众所周知,Airbnb 被指责加剧了全球许多城市的经济适用房危机。(沙夫罗斯,2016) 。为了防止这种情况发生,西雅图的财政和行政服务部强制要求每一个 Airbnb 主机在 2019 年 12 月之前获得短期租赁运营商的许可证。 (Airbnb,2020) 许可证约为 75 美元/单位,每年更新一次。每个短期合同允许您经营最多两个住宅单元:
- 主要居住地: “机动车登记、驾驶证、选民登记或其他此类证明文件记载的人的经常居住地”
- 第二居所 : 度假屋或第二居所
然而,该指南并不是对所有房源都强制执行,对最大单元数量有有限的例外,包括 2017 年 9 月 30 日之前合法经营的短期租赁的一些例外。值得注意的是,如果你在 Airbnb 上经营一家酒店或汽车旅馆,主人将不需要注册短期租赁许可证,但需要申请正式的豁免。
1)
正如上面提到的西雅图定律,我们可以忽略整个 home/apt 值,直接进入私人房间,查看仅两个住宅就有太多列表的极端情况。请记住,Airbnb 没有给出房源的地址,尽管数据库中实际上有“街道”字段。这些当然不是完整的真实地址。Airbnb 会主动隐藏房源的地址,只有在你确认预订后才会透露。因此,人们不能说这些列表实际上是否在同一个房子里。
(图片作者)
通过运行 53 个值中的前 20 个值,可以根据他的列表名称将达里奥的财产分为 4 个不同的组
- 10 分钟车程到市中心
- 距离市中心 5 分钟车程
- 距离西雅图中心 3 个街区
- 私人房间
(图片作者)
此外,当您检查实际的经度和纬度本身时,它们彼此高度相似,只是略有不同。Airbnb 房源上的房间和设施图片无法区分开来:
从各自的角度来看,他似乎在经营一家精品酒店,但归类为短期租赁的许可证,这是专门为 Airbnb 设计的,位于市中心。如果所有的房源都是合法的,达里奥可能会经营一家受到上述不同监管的酒店,或者属于 2017 年 9 月 30 日之前签署的“豁免”团体。如果没有,Airbnb 或市议会应该调查一下情况,并调查达里奥是否违反了规定。不仅是达里奥,还有其他主持人,像维拉,赛义德,香农,李等。应该接受检查。
2) 职业主持人的不良影响
目前,西雅图没有阻止专业托管活动的规定。这种缺点为 Airbnb 将其平台外包给专业主机(第三方房地产公司)的可能性打开了大门。现在,80%的主机只有少于 5 个列表。我们假设拥有比 1 多几个列表的主机也可能是几个朋友的主机。但也有极端的案例(312),这让我们怀疑他们是在专业地做这件事。
(图片作者)
下面,我们显示了包含 20 个以上列表的主机。如果你看一下他们在 Airbnb 上的房源,你会被前三名的每一个房源的标准化和专业性所震撼。因此,我们可以有把握地说,这些是专业的主持人。
(图片作者)
深入了解前三名,我们可以了解更多关于 Airbnb 的运营方式。看起来,除了希望获得一些额外收入的传统主持人的非专业房源之外,Airbnb 还经常与中小型房地产公司建立合作关系。Airbnb 允许这些当地公司将其租赁的房产注册为平台上的正常房源,以产生更多的网络流量来换取佣金。如下表所示,公司参与的条款和程度因安排而异:
“我们是一个充满激情的团队,经营着一家现代化的技术支持的公司住房公司,该公司认为装修精美的高端住宅应该是一致的,负担得起的,易于预订的。”
= >尽管在系统上被注册为“Corp Condos & Apts ”,但所有房源都归 Barsala Barsala 所有,这是一家中型房地产公司,专注于在西海岸提供物有所值的租赁合同。关于 Airbnb 和 Barsala 之间的关系没有太多信息
“宙斯正在改造企业住房。我们通过在遍布旧金山湾区、洛杉矶、华盛顿的 1400 多所房屋中的每一所提供独一无二、无忧无虑、高质量的住房体验来实现这一目标。“宙斯已经成为宙斯的永久合作伙伴”
= >随着 Airbnb 吸收越来越多的住房需求,它正在探索如何将度假租赁以外的机会货币化。长期企业住房市场可能是一个巨大的业务,但 Airbnb 没有自己建设,而是战略性地投资与房地产长期租赁市场的领导者之一 Zeus Living 合作。这是一个巧妙的组合:宙斯的可用属性和 Airbnb 的全球推广平台 (Constine,2019)
“待在有价值的地方。当你预订了阁楼,你就是在为当地社区做贡献。每个阁楼都是当地居民的家,他们就住在这里,确保您的体验是愉快的。所有空间的设计都考虑到了您的舒适度!我们使入住和沟通变得轻而易举,每个家庭都为您的旅行提供了一个美丽舒适的休息场所。每一个 Loftium 家和主人都是独一无二的,在您入住期间,您将获得真正的邻里体验。参观一个新的社区,并在我们的任何一个城市预订 Loftium:西雅图、波特兰、丹佛、圣地亚哥、凤凰城、芝加哥、亚特兰大、达拉斯、夏洛特或奥兰多。我们等不及你来参观了!”
= >从只与 Airbnb 合作租房,创始人决定开发自己的房产租赁应用,同时与 Airbnb 合作。他们的商业策略是,如果潜在租户/买家同意成为 Airbnb 的托管人,就在价格昂贵的地区给予他们荒谬的折扣。Hannah Exner 和 Sam Joselyn 在西湖附近以 1000 美元/月的价格获得了一套豪华公寓,价格超过 1500 美元/月 (Levy,2019)
除了考虑西雅图政府将采取哪些有效措施来确保所有这些商业伙伴关系不会加剧危机之外,这是一个现实和产品差异化的问题。由于一家公司以提供真实体验和当地隐藏的宝石而自豪,这使其在客户眼中的形象高于其他酒店竞争对手,从房地产中介引入这种千篇一律、精心制作的房源可能会削弱该公司独特的价值比例。(拉利奇&维斯迈尔,2017) 。随着时间的推移,即使是大多数死硬的 Airbnb 爱好者也可能会在其他地方寻找“真实性”
三/给游客的建议
1) 每个小区的日均价、点评分数和安全指数
在这一部分中,我们比较了两人的平均每日比率(ADR ),并根据社区进行了评估。我们预计到市中心的距离是最重要的因素,因为所有西雅图的地标都位于市中心。距离和评论分数之间可能有很强的相关性。可能影响审查分数和 ADR 的其他因素包括:
- 位置的安全指数
- 噪音。如果一个房源位于市中心,但在嘈杂的酒吧中,这应该会在位置评论上扣分。
- 如果房源位于市中心以外,但公共交通四通八达,那么它们会得到一些加分(西雅图已经发展了火车和公共汽车系统)
- 附近的必需品和娱乐设施(超市、酒吧、餐馆等)。)
- 包括免费停车。因为在西雅图市中心停车平均要花 20/ 2 小时
有趣的是,与其他酒店相比,安女王酒店的价格要高得多(约 285 美元/天)。然后是市中心(约 165 美元/天),然后是其他街区。令人惊讶的是,不管房源在哪里,平均评论分数都在 9/10 以上,所以不管你选择哪个社区,最大的满意度总是有保证的。我们认为这是因为西雅图总的来说面积小,人口少(总共 100 万)。这座城市的交通也很便利,所以如果他们碰巧住在郊区,往返市中心大约需要 30 分钟
(图片作者)
尽管没有旧金山那么严重,西雅图仍然深受大量无家可归者和乞丐的困扰。大部分是无害的,不会惹你。尽管如此,它仍然对公众形象产生负面影响,并挫伤了游客参观城市的积极性。此外,游客可能经历的财产犯罪比暴力犯罪多 7 倍。如果你开车去西雅图,即使在停车场,你也可能会遭遇入室盗窃。像大多数城市一样,西雅图最安全的地区在市中心以外,往往是住宅区或商业不发达的住宅区。最安全的社区有日落山、巴拉德、木兰、阿尔基、木兰、下皇后安和沃灵福德。西雅图警察局有一张西雅图地区的地图,用犯罪数量进行颜色编码。深蓝色区域意味着病例较多,而浅色区域病例较少
西雅图的犯罪率统计(来源: 西雅图警察局 )
考虑到 ADR、评论评分和犯罪统计数据,建议客户在西西雅图、Magnolia、Ballard、Rainer Valley、Central Area、Seaward Park、Beacon Hill、University District、Interbay 和 Northgate 预订 Airbnb,以获得低廉的租赁价格、最高的安全性和最终的高满意度。我目前住在 Rainer Valley/ Beacon Hill,离市中心开车 20 分钟或坐火车 30 分钟,一切都很近。该地区经历了适度的中产阶级化,因此人们预订 Airbnb 体验既安全又方便。在 Beacon Hill 的一个美丽的星期天烧烤一些令人垂涎的烤肉是生活中最奢侈的事情。
莱纳山谷/比肯山壁画(作者提供图片)
2)如何使用复习分数
与书面评论同样重要的是,客人可以提交总体星级和类别星级。评级分为:
- 总体体验
- 清洁(任何酒店最重要的因素)
- 准确性(广告与产品匹配吗?)
- 价值(有没有被敲竹杠的感觉?)
- 沟通(在你入住之前、期间和之后,主人对你的关注和问题的回应如何?
- 抵达(入住过程顺利吗?)
- 位置
读者可以在下面找到所有这些类别的分数分布。人们不禁对各科的高分感到惊讶。这在 Airbnb 中很常见,因为该公司以向客户提供卓越服务而闻名 (Plautz,2015) 。因为标准如此之高,客人应该只选择在五个因素中至少有四个因素得分为 10 的房源。值是最棘手的一个,因为与其他指标相比,它们的分数明显更高,这使得该因素比其他指标更容易区分。呆在一个在价值上得到 10 分的主机上,即使他们在其他方面可能得分较低,这意味着你可能会中头彩。
所有类别的分数分布(按作者分类的图片)
3)找到一个好的主人
为了对主人的努力表示感谢,Airbnb 授予那些最受尊重的人“超级主人”的地位。成为一个超级主播意味着你可以从你的列表的可见性增加中受益,获得潜在的收入,甚至可以获得独家奖励(陈,2017) 。Airbnb 在其广告活动中展示了一些超级主机的列表,超级主机甚至被邀请发表演讲或分享如何获得这一酷头衔的技巧。为了成为超级主持人,主持人必须拥有 4.7 或更高的平均综合评分,该评分基于其 Aibnb 客人在过去一年中的评论。他们还需要在前一年组织至少 10 次住宿,或者如果这些预订的期限更长,则需要在至少 3 次住宿中组织 100 次住宿。Superhosts 不得有任何取消,除非有情有可原的情况,并需要在 24 小时内回复他们的客户。尽管要克服很多限制,但西雅图的 Airbnb 房源让他们脱颖而出,目前拥有近 3 万名超级房东(约 45%)。对于 Airbnb 的国际超高住宿率(20.2%)来说,这是一个令人震惊的数字
(图片作者)
既然超级旅馆在西雅图如此受欢迎,这就引出了一个问题:超级旅馆是否是选择房间的必要标准之一。一方面,用超高的价格预订可能意味着在住宿上花更多的钱。另一方面,作为一个顾客,我不希望遇到不好的主人,他们经常取消订单,而且总是迟迟不回复。幸运的是,在 Airbnb 上很少会遇到没有回应的主机,大多数主机不到一个小时就能回复,最晚一天之内。如此快速的数字部分解释了为什么西雅图的 Airbnb 充斥着优秀的超级房东。因此,是否是超级主持人是潜在客人不应该大力强调的事情。
(图片作者)
4)可用性和超时平均价格
“日历”文件包含 365 条记录,记录了一年中每一天每个列表的价格和可用性。为了得到正确的结果,我们将共享列 listings_id 上的‘calendar’与‘listings’[‘accommodes’]合并,listings _ id 函数作为左边的索引。合并后的表格示例如下所示,需要注意的是,“f”表示业主不想在特定日期出租其房产,或者房源已经被其他人/第三方预订。
(图片作者)
在未来的 6 个月里,在达到最低点之前,可用的住宿数量会更高。记住,数据是在 2020 年 4 月 23 日收集的。这意味着当时正值美国冠状病毒爆发的高峰期。六个月的正数意味着很多客人在意识到疫情的严重性之前就已经确定了未来的发展方向。因此,10 月 16 日的预订量不到 1100 份,到 2021 年 1 月中旬几乎没有预订量。可供住宿的数量发生如此巨大变化的另一个原因是,房东们正在积极寻找这些租赁房产的其他用途,以在面临危机时保持稳定的收入来源。Airbnb 的预订在人们的心目中是次于最后的。对于交互式地图,您可以放大集群,最终找到列表的各个位置(下面是 Github 代码)
(图片作者)
由于 2 人住宿很受欢迎,我们只选择 2 人的可用房源,并使用 mean()函数计算平均值。7 月 27 日星期六,ADR 达到 127 美元的峰值,这种愤世嫉俗的模式是由于周末的价格更高。随着时间的流逝,价格急剧下降。我怀疑这是 COVID 和 host 最后一刻降价努力的影响,这证明 Airbnb 需要一些时间才能再次盈利。
(图片作者)
然而,这并不是世界末日。据报道,西雅图的阳性病例和死亡人数已经从曾经的全国冠状病毒中心大幅下降。这都归功于华盛顿人的努力,特别是西雅图人,他们一直遵守州政府的“呆在家里”的命令。幸运的是,覆盖西雅图大部分地区并受到严重影响的金县有足够的信心申请第二阶段的重新开放计划。因此,我们乐观地认为,到 9 月/10 月,一切都会恢复正常
令人兴奋的是,这也是游览这座城市的最佳时间。夏季标志着这座城市的旺季,这意味着房价飙升,而冬季则笼罩在无尽的寒冷雨天中,即使是最热情的游客也会望而却步。西雅图的花朵在秋天绽放得最灿烂,夏天的天气随着人群的散去而挥之不去,留下了足够的 Airbnb 空间来抢占 (USnews,2019) 。9 月和 10 月也充满了庆祝活动,如 bumber shoot(9 月)、Earshot 爵士音乐节(10 月-11 月)、西雅图餐厅周(10 月-11 月)。我们建议潜在客户在 10 月 15 日之前预订,因为房价较低,并且仍有许多可用房源。没有什么比走上街头庆祝疫情的结束更好的了,在千变万化的习俗中,享受美味的饼干和温暖人心的杂烩,作为真正的糖果
著名的派克市场的新鲜农产品(图片由作者提供)
IV/文字挖掘与评论
自然语言处理(NLP)是人工智能的一个分支,它使用自然语言分析计算机和人类之间的关系。NLP 在实现 Deep Leering 的神经神经元网络等应用时非常有用,因为它有助于以有价值的方式阅读、破译、理解和理解人类语言。 (Yse,2019) NLP 帮助我根据客人对酒店的评论预测反馈分数。但是在这个练习中,我们只是想看看评论需要什么,并演示 NLP 要经历的步骤,以便为未来的研究建立一个具体的基础。
“reviews”文件并不有趣,因为它只包含每个列表的审查日期。“review_details”包括类似的信息,只是多了 4 列,因此,我们将“host_id”、“host_name”与 review_details 文件左合并在一起:
(图片作者)
以下是评论数量最多的 5 位主持人。有趣的是,Loftium 以 4181 条评论再次出现在顶部。我们认为,这是由于该公司独特的商业模式,他们能够产生如此多的建设性评论,以改善他们的产品。
(图片作者)
为了清理任何自然语言处理数据集,我们需要遵循 5 个步骤:
- 取出空注释:with notnull()
- 删除数字:用 str.replace(‘\d+’,‘’)
- 小写:with str.lower()
- 移除 windows 新行:with str.replace('\r\n ',“”)
- 用 nltk 库去掉所有停用词:我们需要用英文指定中的 stop.word()赋值一个变量“stop_english”。然后,我们使用 lambda 函数将整个句子用“”分开,然后在没有停用词的情况下再次连接在一起
- 去掉所有标点:用 str.replace(‘[^\w\s]’," ")
- 将 x 个空格替换为一个空格:with .str.replace(‘\s+’,’ ')
最后,我们可以看到索引 1 处的原始审查和清理后的版本之间的巨大差异
(图片作者)
请记住,如果我们想要构建一个世界云,实际的过程实际上并没有停止,因为这些评论充满了与我们的分析无关的主机名称。不幸的是,有 1949 个名字可用,在“review_details”数据集中搜索每一个名字将花费很长时间,而且这些名字并不真正影响最终的单词云。因此,我们将从这一点继续前进,未来的研究人员可以试图找出如何处理这个特定的任务。在使用 sklearn 和 WordCloud()的 CountVectorizer()函数后,我们可以看到最常用单词的排名以及单词云本身
**
(图片作者)
V/结论
简而言之,从比较研究的角度和提出解决方案的角度探索西雅图的 Airbnb 情况,让我们对公司如何运作、制定战略和创新性地转变为酒店业不可忽视的力量有了宝贵的见解。我们相信,Airbnb 在今年年底经受住当前的风暴后,将夺回其应有的宝座。
***Github:*https://Github . com/lukastuong 123/Python-Projects/tree/master/Project-% 20 Airbnb % 20(Python-% 20 interactive % 20 map % 2C % 20 natural % 20 language % 20 processing % 2C % 20 comparative % 20 study % 2C % 20 regression)
参考&来源:
Airbnb 。(2020 年 6 月 16 日)。华盛顿州西雅图| Airbnb 帮助中心。从 https://www.airbnb.com/help/article/869/seattle-wa取回
卡维尔,O. (2020 年 6 月 8 日)。Airbnb 见证了度假租赁需求的激增。洛杉矶时报。https://www . latimes . com/business/story/2020-06-07/Airbnb-冠状病毒-需求
陈,b . x .(2017 . 1 . 11)。成为 Airbnb 超级房东指南。检索自https://www . nytimes . com/2017/01/11/technology/personal tech/the-guide-to-be-an-Airbnb-super host . html #:% 7E:text = In % 20 process % 2C % 20I % 20 have,percent % 20 of % 20 hosts % 20 are % 20 super hosts。&text = The % 20 design % 20 as % 20a % 20 super host,away % 20 from % 20 netting % 20a % 20 profit。
孔斯蒂内,J. (2019 年 12 月 9 日)。TechCrunch 现在是威瑞森媒体的一部分。从 https://techcrunch.com/2019/12/09/airbnb-zeus/取回
道尔顿,A. (2017 年 2 月 7 日)。纽约市开始打击非法 Airbnb 房源。检索自https://www . engadget . com/2017-02-07-new-York-city-launch-Airbnb-listings-activation . html
研,K. (2020 年 4 月 8 日)。 Airbnb 的冠状病毒危机:烧钱、愤怒的主机和不确定的未来。华尔街日报。https://www . wsj . com/articles/airbnbs-coronavirus-crisis-burning-cash-angry-hosts-and-an-uncertainty-future-11586365860
拉利奇,l .&魏斯迈尔,C. (2017)。真实在 Airbnb 体验中的作用。旅游业中的信息和通信技术 2017,781–794。https://doi.org/10.1007/978-3-319-51168-9_56
利维,N. (2019 年 5 月 6 日)。房地产初创公司 Loftium 转向租赁,停止为 Airbnb 利润份额提供首付。检索自https://www . geek wire . com/2019/loft ium-pivots-real-estate-biz-now-offers-discounts-apartment-tenders-rent-rooms-Airbnb/
普劳茨,J. (2015 年 2 月 25 日)。高于平均评分?95%的 Airbnb 房源评分为 4.5 到 5 星。检索自https://Mashable . com/2015/02/25/Airbnb-reviews-above-average/?欧洲=真
西雅图市议会。 (2017 年 4 月)。规管短期租金政策简介。检索自https://www . Seattle . gov/Documents/Departments/Council/Issues/Regulating shorterm Rentals/Regulating-Short-Term-Rentals _ Policy-Brief _ 2017-04 . pdf
沙夫罗斯,F. (2016 年 9 月 17 日)。Airbnb 给城市制造了一个经济适用房的困境。检索自https://www . governing . com/columns/public-money/gov-Airbnb-affordable-housing . html
美国新闻。 (2019 年 11 月 4 日)。游览西雅图的最佳时间。从 https://travel.usnews.com/Seattle_WA/When_To_Visit/取回
是的,迭戈·洛佩兹。 (2019 年 1 月 15 日)。自然语言处理(NLP)指南。检索自https://towards data science . com/your-guide-to-natural language-processing-NLP-48ea 2511 f6e 1
— — —
***数据集:*http://insideairbnb.com/get-the-data.html
灵感来源:https://www . ka ggle . com/erikbruin/Airbnb-the-Amsterdam-story-with-interactive-maps
Airbnb 价格预测:多层感知器与 TensorFlow 的 Keras API
这个项目是我在深度学习领域的第一步,使用 TensorFlow 和 Keras 开发了一个回归模型,能够尽可能低地用 MAE 进行价格预测。
泰勒·维克在 Unsplash 上的照片
语境
当我在希望成为数据科学家的旅程中第一次遇到深度学习时,它是一个难以消化的领域。我最初之所以偏见地假设它令人困惑的复杂性,是因为这一领域的潜在逻辑和机制。然而,在花了一些时间来吸收深度学习的巨大适用性,特别是神经网络之后,我开始对利用它来解决数据科学问题产生兴趣。
在进入这个项目之前,我想提请注意机器学习和深度学习之间的激烈比较这可能已经闪过我们的脑海,至少一次。本质上,当机器学习使用算法解码中到大规模的数据来做出决策时,深度学习创建了多层神经网络,需要更长的时间来训练,以产生更高精度的模型。
如果你热衷于尝试深度学习,请随意查看 Kaggle 在此公开分享的数据集,并关注以下内容。
1.解释数据分析
作为一名数据分析师/数据科学家,在数据可用于建模之前,我们 70%的时间都花在了数据清理和准备上。
*import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as snsdf = pd.read_csv("airbnb-price-prediction.csv")df.head()*
注意 : 由于本文的重点是开发神经网络模型,我将只介绍 EDA 中的重要操作,但是您可以在本文末尾的 Github 库中查看完整的 EDA。
在加载数据集后,立即给我留下深刻印象的是“便利设施”变量,它嵌入了每行的非结构化值。如果它被构造成一个 JSON 字段,对我们来说将它展平并将每个子变量解析到不同的列中会更容易。然而,根据我的观察,该变量包括每个列表的不同娱乐项目,因此为了使其更有用,我决定格式化值并合并唯一的值以计算每个列表的娱乐项目占总数的百分比:
*df.amenities = df.amenities.map(lambda x: "|".join([i.replace("}", "").replace("{", "").replace('"', "") for i in x.split(",")])df.amenities = df.amenities.map(lambda x: x.split("|")*
df.map()
*amenities_list = list(np.unique(np.concatenate(df.amenities))[1:-2])*
唯一的()
*df['amenities_percentage'] = df.amenities.apply(lambda x: len(x)/len(amenities_list)*100)*
然后,我继续进行检查是否有空值来删除或填充实际值:
*df_new.isna().sum()#Removing null values that would not help the modellingdf_new = df_new[df_new.bathrooms.notna()]
df_new = df_new[df_new.bedrooms.notna()]
df_new = df_new[df_new.beds.notna()]
df_new = df_new[df_new.host_since.notna()]#Fill null values with actual valuesdf_new.host_response_rate = df_new.host_response_rate.fillna("0%")
df_new.review_scores_rating = df_new.review_scores_rating.fillna(0)*
此外,正如我们可能都知道的,异常值对建模过程相对敏感,所以我们应该小心地处理异常值(移除或转换),以便模型可以更有效地学习数据。
sns.boxplot(df_new.price)
由于价格变量遵循高斯分布,我们将创建一个函数来移除超出固定范围的异常值:
*from numpy import mean
from numpy import stddef remove_outliers(x):
data_mean = mean(x)
data_std = std(x)
cutoff = data_std*3
lower = data_mean - cutoff
upper = data_mean + cutoff
return lower, upperlower, upper = remove_outliers(df_new.price)df_new = df_new.loc[(df_new.price > lower) & (df_new.price < upper)]*
2.特征工程和缩放
类似于机器学习的建模,特征工程有助于预处理和转换原始数据集为更易消化的数据集,以训练模型。
df.head()
除了那些数字变量,我们需要转换模型可以理解和学习的分类变量。简而言之,我们将对二进制和多类变量分别应用不同的技术:标签编码器和 OneHotEncoder 。然而,在进行任何预处理步骤之前,我们 必须始终将数据集分为训练集和测试集 ,以避免建模期间的数据泄漏。
*from sklearn.model_selection import train_test_splitx = df_new.iloc[:, 1:-1]
y = df_new.iloc[:, -1]x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 42)*
然后,我们为转换导入标签编码器和 OneHotEncoder:在训练集上拟合并在两者上转换。
*from sklearn.preprocessing import LabelEncoder, OneHotEncoder**#Binary variables**le = LabelEncoder()binary_var = ['cleaning_fee', 'host_has_profile_pic', 'host_identity_verified', 'instant_bookable']for i in binary_var:
le.fit(x_train[i])
x_train[i] = le.transform(x_train[i])
x_test[i] = le.transform(x_test[i])**#Multi-category variables**oe = OneHotEncoder(sparse=False, handle_unknown = 'error')oe.fit(x_train[['property_type', 'room_type', 'bed_type', 'cancellation_policy', 'city']])#Transform the train setmulti = oe.transform(x_train[['property_type', 'room_type', 'bed_type', 'cancellation_policy', 'city']])
df_multi = pd.DataFrame(index = x_train.index, data=multi, columns=oe.get_feature_names(['property_type', 'room_type', 'bed_type', 'cancellation_policy', 'city']))
x_train = pd.concat([x_train, df_multi], axis=1)
x_train.drop(columns=['property_type', 'room_type', 'bed_type', 'cancellation_policy', 'city'], inplace=True)#Transform the test setmulti_test = oe.transform(x_test[['property_type', 'room_type', 'bed_type', 'cancellation_policy', 'city']])
df_multi_test = pd.DataFrame(index = x_test.index, data=multi_test, columns=oe.get_feature_names(['property_type', 'room_type', 'bed_type', 'cancellation_policy', 'city']))
x_test = pd.concat([x_test, df_multi_test], axis=1)
x_test.drop(columns=['property_type', 'room_type', 'bed_type', 'cancellation_policy', 'city'], inplace=True)*
此外,由于每个变量都有不同的数据范围,我们需要对独立变量进行缩放,以便模型可以更快、更有效地学习数据。在这种情况下,我选择了最小最大缩放器将数据压缩到(0,1)的范围内,这对我们将在下一节中使用的算法很有用:
*from sklearn.preprocessing import MinMaxScalermn = MinMaxScaler()x_train_scaled = pd.DataFrame(mn.fit_transform(x_train), columns = x_train.columns)
x_test_scaled = pd.DataFrame(mn.fit_transform(x_test), columns = x_test.columns)*
好了,我们都准备好了!
3.神经网络建模
什么是神经网络,为什么我们需要同时结合建模和优化?
在进入什么是神经网络之前,我想强调一下我们不能停留在建模阶段的惯例;更确切地说, 这是一个建立模型和测试不同参数 的连续过程,以产生最高精度的模型。
回到神经网络的概念,简而言之:
神经网络是一系列算法,通过模拟人脑运行方式的过程,努力识别一组数据中的潜在关系。——投资媒体。
如果你想更深入地了解这个概念,请点击这里查看 3Blue1Brown 的一系列视频,这些视频对神经网络的底层项目提供了全面的解释。
在深度学习中,特别是神经网络,我们使用 3 种常见的标准模型来进行预测:多层感知器(MLP) 、卷积神经网络(CNN) 和递归神经网络(RNN) 。对于这个项目,我已经从 MLP 开始,以获得深度学习的基本概念,但请关注我即将开展的项目,这些项目用更先进的模型解决数据科学问题。
那么,MLP 到底是什么,它在预测方面做了什么?
根据定义,
多层感知器模型,简称 MLP,是一个标准的全连接神经网络模型。它由节点层组成,每个节点连接到前一层的所有输出,每个节点的输出连接到下一层节点的所有输入。—Machinelearningmastery.com
为了更容易可视化,
图片来源:ResearchGate
TensorFlow 和 Keras 是一个开源库,能够执行深度学习中的各种任务,即回归和分类。由于其复杂性,需要遵循几个步骤:
- 定义模型
- 编译模型
- 符合模型
- 评估模型
- 做一个预测
为了更详细地解释,让我们看一下 MLP 模型的全步骤实现,如下所示:
*from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping**#Step1\. Define the model**model = Sequential()model.add(Dense(16, activation = 'relu', kernel_initializer = 'he_normal', input_shape = (x_train_scaled.shape[1],)))
model.add(Dense(8, activation = 'relu', kernel_initializer = 'he_normal'))
model.add(Dense(1))**#Step2\. Compile the model**model.compile(optimizer = 'adam', loss = 'mse', metrics = 'mae')**#Step3\. Fit the model**history = model.fit(x_train_scaled, y_train, validation_data=(x_test_scaled, y_test), epochs=50,batch_size=64, verbose=0)**#Step4.1 Evaluate the model**loss, mae = model.evaluate(x_test_scaled, y_test)**#Step4.2 Plot the learning curve**plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='val')
plt.show()*
(1)-定义模型:
- 模型类型:我们可以从 TensorFlow 中选择顺序或功能模型 API* 。虽然顺序模型是实现起来最简单的模型,它以线性方式提供了一个一层接一层的“顺序”路径,但是功能模型是一个更复杂且更灵活的模型,它需要我们手动指定输入和输出层。*
- 节点数量:这取决于你希望你的模型有多复杂。没有“一刀切”的选择,而是我们需要测试和学习,看看每层有多少节点产生最高的准确性。
- 激活:对于每层中的每个节点,神经网络计算输入的加权和(并添加一个偏差),然后决定是否应该“激活”该节点。这意味着加权总和应该超过某个阈值,节点才会被“激活”。为了找到边界,我们需要确定激活函数来帮助定义边界的上限和下限。
图片来源:StackExchange
- 初始化器:如上所述,初始化器帮助定义设置输入层初始随机权重(w)的方式。有许多不同的初始化器适合不同的激活函数,我们将在下面的内容中测试它们。
(2)-编译模型:
- 优化器:优化器帮助改变神经网络的属性(例如,权重、学习率等。)以便尽可能减少模型的损失。类似于激活和初始化器,有一些优化器我们应该测试一下,看看哪个产生的模型精度最高。
- 损失:顾名思义,损失函数表示模型为了减少误差而采用的优化方法。从技术上讲,损失用于计算梯度,梯度用于更新神经网络的权重。
- 指标:根据我们构建的模型类型(例如回归、分类),我们将选择相关的指标来评估模型的训练情况(例如回归的 MAE/MSE/RMSE 和分类的准确性)
(3)-拟合模型:
- 时期:时期的数量是训练集中整个例子的完整次数。例如,如果我们将历元数设置为 5,这意味着在模型产生最终结果之前,训练集将循环 5 次。
- Batch_size :批次大小是在模型更新之前,用于估计模型误差的一个时期中的样本数。例如,如果我们将批量大小设置为 32,这意味着训练集的 32 个样本将用于训练模型和更新模型。然后,将使用接下来的 32 个样本,直到在一个时期中没有留下任何样本。如果我们有 1 个以上的历元,将重复该过程。
(4)-评估模型:
- 。evaluate() :我们将在测试集上调用这个函数,打印出错误值以及我们希望模型优化的指标。
- 学习曲线:我建议我们应该为我们测试的每个模型绘制学习曲线,因为重要的是要看到模型在每个时期是如何被训练的,以及模型是过拟合还是欠拟合。
好了,这是我们在神经网络中应该熟悉的所有核心参数。现在让我们打印出上面第一次试验模型的结果和学习曲线。
如所见,我们通过上述模型的设置实现了 0.3356 的 MAE。让我们将这个数字作为基准,看看我们是否可以在优化模型时获得更小的 MAE。
4.神经网络优化
下面是我将使用的所有优化方法的快速总结,供您参考:
- 具有特征选择的神经网络(相关热图/PCA)
- 具有附加层的神经网络(增加模型复杂性)
- 具有不同优化器的神经网络
- 具有更高纪元的神经网络(早期停止)
- 正则化神经网络(辍学和 L1/L2)
- 具有不同激活和初始化的神经网络
- 批量较小的神经网络
对于(1)方法,我想看看减少独立变量(特征)的数量或选择更重要的变量是否有助于改进模型。我依赖的两个选项是关联热图(手动选择)和 PCA(机器学习选择):
df.corr()
正如你所看到的,并不是所有的特征都与基于色阶的目标变量(价格)高度相关。因此,我只选择了与目标有更好相关性的变量(高度正/负),但似乎模型并没有改进得更好:MAE >基准。
具有关联热图的模型:MAE = 0.3544(>基准= 0.3356)
使用 PCA,模型也没有改善多少,但是该模型的 MAE 优于我们手动选择的特征:
带 PCA 的模型:MAE = 0.3475(>基准= 0.3356)
对于(2)方法,我想看看通过增加几个额外的层来增加模型的复杂性是否有助于降低 MAE 值。
*#Step1\. Define the model4model4 = Sequential()model4.add(Dense(32, activation = 'relu', kernel_initializer = 'he_normal', input_shape = (x_train_scaled.shape[1],)))
model4.add(Dense(16, activation = 'relu', kernel_initializer = 'he_normal'))
model4.add(Dense(8, activation = 'relu', kernel_initializer = 'he_normal'))
model4.add(Dense(8, activation = 'relu', kernel_initializer = 'he_normal'))
model4.add(Dense(1))#Step2 - 4 follows the same as the 1st model*
如果第一个模型只有 2 个隐藏层,分别有 16 个和 8 个节点,我在现有的基础上添加了 2 个额外的层,并增加了节点的数量。如下所示,与上述方法相比,该模型略有改进,但与基准相比仍不够显著。
添加了额外的隐藏层:MAE = 0.3358(>基准= 0.3356)
对于(3)方法,我想测试一个不同的优化器,而不是通常推荐的“Adam”:“rms prop”。没有看到改进,但值得注意的是,模型在训练期间经常波动(正如您从橙色线—测试集上的评估中看到的):
具有 optimizer = "rmsprop "的模型:MAE= 0.3375(>基准= 0.3356)
对于(4)方法,历元的数量可能会影响模型的结果。如果你熟悉机器学习,你会有和我一样的担心——“多少个历元足够训练模型?“坦率地说,我们无法说出确切的数字,只能测试和学习。然而,Keras 提前停止有助于阻止模型进一步循环/训练,这可能会导致过度拟合。
为了实现,我们只需要定义 EarlyStopping 这个变量,并设置“耐心”作为阈值,如果通过,模型将停止学习:
*es = EarlyStopping(monitor = 'val_loss', patience=5)history = model6.fit(x_train_scaled, y_train, validation_data=(x_test_scaled, y_test), epochs=200, batch_size=64, verbose=0, callbacks = [es])*
如果你看到上面,我设置了 monitor = 'val_loss '和 patience = 5,这意味着如果 val_loss 值(测试集)在连续 5 个时期后高于 loss 值(训练集),模型将停止学习。如下,模型在 20+历元处停止。该方法不仅 防止模型过拟合 ,而且 显著提高了模型的运行时间 。
具有提前停止的模型:MAE = 0.3371(>基准= 0.3356)
*对于(5)方法,正则化是一种在模型学习时对其进行修改以便更好地推广的技术。这是通过在模型学习时最小化样本外测试误差来实现的,这也有助于减少过度拟合。你可能听说过机器学习中的“ L1/L2 正则子,它缩小了特征,但我们在神经网络中还有另一种常见的正则子——**DropOut。*让我们看看哪一个在当前数据集下表现更好:
*#Step1\. Define the model7model7 = Sequential()model7.add(Dense(32, activation = 'relu', kernel_initializer = 'he_normal', input_shape = (x_train_scaled.shape[1],)))
model7.add(Dense(16, activation = 'relu', kernel_initializer = 'he_normal'))
model7.add(Dropout(0.3))
model7.add(Dense(8, activation = 'relu', kernel_initializer = 'he_normal'))
model7.add(Dropout(0.3))
model7.add(Dense(8, activation = 'relu', kernel_initializer = 'he_normal'))
model7.add(Dropout(0.3))
model7.add(Dense(1))#Step 2 - 4 follows the same as the 1st model*
辍学模型:MAE = 0.3660(>基准= 0.3356)
*#Step1\. Define the model8model8 = Sequential()model8.add(Dense(32, activation = 'relu', kernel_initializer = 'he_normal', input_shape = (x_train_scaled.shape[1],)))
model8.add(Dense(16, activation = 'relu', kernel_initializer = 'he_normal', kernel_regularizer = 'l1'))
model8.add(Dense(8, activation = 'relu', kernel_initializer = 'he_normal', kernel_regularizer = 'l1'))
model8.add(Dense(8, activation = 'relu', kernel_initializer = 'he_normal', kernel_regularizer = 'l1'))
model8.add(Dense(1))#Step 2 - 4 follows the same as the 1st model*
具有 L1 正则化子的模型:MAE = 0.3344 ( < benchmark = 0.3356)
Voila! Finally, the model has improved, even slightly significantly as compared to the 1st model thanks to L1 Regularizer!
For (6) method, testing 激活和初始化器的不同组合是一个很好的简单方法来查看模型是否改进。以下是实践中常用的组合:
- activation = 'sigmoid ',kernel _ initializer = ’ glorot _ normal ’
- activation = 'relu ',kernel_initializer = 'he_uniform ’
但是,对于这个数据集,没有看到任何改进,所以我们可以传递这个方法。
转到最后一个,建议在我们优化模型时测试更小的批量,因为更小的批量提供了更好的正则化效果/更低的泛化误差,并改善了运行时间。
瞧啊。这个项目到此结束——用 TensorFlow 的 Keras API 进行 Airbnb 价格预测。我希望这篇文章对你有用并且容易理解。
在不久的将来,一定要关注我的即将到来的数据科学和机器学习项目!与此同时,您可以在这里查看我的 Github 以获得完整的资源库:
github:https://github.com/andrewnguyen07LinkedIn:www.linkedin.com/in/andrewnguyen07
谢谢!
Airbnb 价格推荐器
使用机器学习来识别最优列表价格
亚历山大·帕萨里克( Pexels )的照片
作为我的数据科学项目 Metis 的一部分,我试图为 Airbnb 主机设计一个更好的定价系统,以优化它们的上市价格。通过这篇文章,我希望解释促使我设计这个模型的原因,以及我用来训练最优回归模型的方法。
背景
如果你是一名主持人,你可能已经听说过 AirBnB 的智能定价(smart pricing),这是一种帮助主持人根据需求和其他各种因素自动控制价格的定价工具。但是,尽管智能定价能够考虑到预订历史等因素,但它旨在最大限度地提高入住率,并可以提出比东道主希望的价格更低的价格。
因此,我想设计一个工具来训练活跃的列表,以建议最佳价格,同时也允许主机将推荐价格与类似列表的价格进行比较。
定价本身是非常个人化的,因为一些主人寻求提供负担得起和预算友好的体验,而其他人可能更奢侈,并寻求提供超级奢侈的体验。我不只是向主机建议价格,而是希望主机能够将建议价格与他们的直接竞争对手进行比较,以便更好地帮助他们对其列表价格做出决定。
目标
- 确定主持人可以用来提高可销售性的可操作特征
- 探索活跃列表的地理位置
- 创建一个可解释的回归模型,让主办方了解其建议价格背后的因素
我的方法
- 从 InsideAirBnB 收集数据
- 预处理数据并确定最佳列表
- 特征工程/探索性数据分析
- 回归建模和评估
- 使用最近邻居识别相似的列表
数据
不幸的是,AirBnB 没有任何开放的数据集,但 InsideAirBnB 是一个独立的实体,它在网上搜集世界各大城市 AirBnB 房源的公开信息。对于这个项目的范围,我选择把重点放在日本东京的上市。
数据有一些限制,因为我只使用了 2019 年 9 月刮的房源。此外,虽然我想用时间序列来模拟季节性,但 InsideAirBnB 没有东京一年的数据。
数据处理
需要记住的是,在所有搜索到的列表上建模价格没有多大意义。这些上市公司中的许多可能定价很低或不活跃,在它们的基础上训练一个模型不一定会建议最佳价格。因此,定义什么是“好”列表并过滤掉次优列表是数据清理过程的第一步。要跟踪的一个关键要素是占用率,这不是数据集中包含的要素。
三藩市模式
旧金山模型是 InsideAirBnB 的入住模型,旨在估计 AirBnB 房源出租的频率。简而言之,它执行以下操作:
- 通过假设 50%的审核率来估计预订数量
- 定义每个城市的平均停留时间(大多数城市为 3 天)
- 将的预计预订量和的平均入住时间相乘,得出入住率
你可以点击阅读更多关于这种入住模式的信息。
那么,我们如何识别活跃的、可销售的房源呢?
- 在过去 6 个月中,已对列表进行了审核
- 列表在过去 12 个月中有超过 5 条评论
- 每月预定天数估计超过 7 天
加工后分配
价格分布
看一下我们的目标变量 price 的分布,发现 76.69%的列表价格低于 150 美元。这确实在后来发挥了作用,因为我发现使用 150 美元的阈值并创建两个模型,一个用于高于该阈值的列表,另一个用于低于该阈值的列表,提高了模型性能。
搬运便利设施
房源提供的便利设施的数量肯定会影响价格。InsideAirBnB 的数据集有一个便利设施功能,它列出了一个列表提供的所有便利设施,但这种格式的便利设施对回归建模没有用处。
因此,我解析了每个列表的便利设施字符串,并为每个可能的便利设施创建了一个新的特性列,用一个布尔值来表示一个列表是否提供该便利设施。这样做的一个问题是,它大大增加了数据集的维度,但我们可以通过查看 p 值和使用 lasso 正则化来消除信息量较少的便利条件。
热门旅游景点
另一个起作用的因素是靠近旅游景点。虽然东京有一个优秀的公共交通系统,但我想探索一下,到某些旅游景点的距离是否会影响列表的定价。我选择的 5 个旅游景点是:
- 东京皇宫
- 银座购物区
- 浅草寺
- 上野公园
- 东京晴空塔
事实上,绘制预处理后数据集中剩余的最理想列表的位置显示,这些列表中的大多数都相对靠近这些旅游地点。
建模和评估
线性回归
在建模阶段,由于 OLS 中的高 p 值或多重共线性,许多不相关的要素被丢弃。为了让主持人容易理解推动价格预测的因素,我选择了线性回归模型,以便于解释。平均绝对误差(MAE)约为 18 美元。我还使用了岭和套索回归来防止过度拟合,但是这两种方法对最终的 MAE 分数都没有明显的影响。
最后,让我们看看对模型预测有影响的可操作特征。正如你在下面看到的,成为一个超级主持人,为顾客提供餐具和银器,对提高一个列表的可销售性以及抬高价格有很大的帮助。
XGBoost
除了线性回归,我还使用了 XGBoost,因为它能够为数据找到更非线性的拟合。正如预期的那样,XGBoost 的表现优于线性回归,平均绝对误差约为 $14.23。虽然 XGBoost 优于线性回归,但它的可解释性较差。可以使用 SHAP 等算法来增加 XGBoost 模型的可解释性,但从主持人的角度来看,理解线性回归权重仍然比理解 SHAP 图更容易。
SHAP 力图(单次观测)
寻找相似的物品
我在这个项目中的最初目标之一是给用户一些类似的列表,以比较诸如便利设施、价格等。在项目的这一部分,我使用 NearestNeighbors 算法简单地在特征空间中查找最近的列表。由于原始数据集具有列表 url 特征,因此为最接近的列表索引数据集也为主机提供了列表 url 以转到这些列表的 AirBnB 页面。
结论
总的来说,这个项目是探索东京热门 AirBnB 房源特征的一个有趣的练习。不过要注意的是,在考虑价格时,肯定还有其他因素要考虑,如季节性、需求和一周中的某一天。虽然我使用的数据集没有很好的方法来纳入这些因素,但改进这个项目的下一步将是使用时间序列模型来解决季节性问题,并找出一种对需求建模的方法。
感谢您的阅读!
项目存储库可以在这里找到。
使用 Python 对纽约租金进行数据分析
发现最方便的租赁方式,以便继续实施具有良好可视化效果的数据分析。
科尔顿杜克在 T2 的照片
T 他的城市不需要介绍。纽约是美国人口第八大城市,估计有 800 万人口。它也是美国人口最稠密的主要城市,被称为世界文化、金融和媒体之都。
坐落在世界上最大的天然海港之一的纽约市由五个区组成,每个区都是纽约州的一个县。五个区——布鲁克林、皇后区、曼哈顿、布朗克斯和斯塔滕岛——于 1898 年合并成一个城市。
有趣的事实。
但是我们大多数人主要是通过其他东西来了解它的,比如它的规模,它的大气,以及每次我们有机会去参观它时它带给我们的快乐。
作为我上一篇文章用 Python 实现商业智能可视化的后续部分,我决定为那些喜欢它的人写一篇文章,以展示可视化在 Python 中的实际和更广泛的应用。
在这种情况下,我将浏览包含纽约租房信息的 Airbnb 数据集,以帮助我们确定租房机会、便宜的价格、最受欢迎的住宿地点和其他见解。如果这听起来很有趣,请继续关注!
内容:
数据集介绍(1 分钟阅读)
使用 Python 进行数据探索性分析(7 分钟阅读)
1.数据集简介
Airbnb 是一家总部位于旧金山的公司,在全球超过 81,000 个城市开展业务,提供超过 600 万条租赁信息。从数据创建的角度来看,该公司已经从其运营的城市产生了大量的数据,如用户评论、位置描述和租金统计。
随着游客和商务旅行者以及其他人选择它作为出租房间、公寓或任何可用于寄宿家庭住所的方式,它已经成为在线租赁市场行业的主导者。该公司是建立寄宿家庭的先驱,这是一种受欢迎的接待和住宿形式,游客与他们要去的城市的当地人共用一个住所,并预先安排不同的停留时间。
我们要分析的数据集可以在我的 GitHub 账号中获得。分析数据集之前的第一步是预览它包含的信息。为了轻松处理这些信息,我们将使用 Pandas ,这是一个用于数据操作和分析的 Python 库,它提供了用于操作数值表和时间序列的数据结构和操作。
2.数据探索性分析
在我们直接进入数据清理和数据转换之前,让我们设定要分析的前提:
A .每种房型对应的租金比例是多少?
纽约五个区的租金是如何分配的?
c .价格分布是怎样的,合理的价格范围是多少?
d .区分不同房型的价格。
哪些地方是最受欢迎的租房地点?
F.给病人读者的租借建议。
我们将从导入必要的库开始工作。
# Imports
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
继续获取包含在中的数据。CSV 文件,该文件必须位于您的工作目录中,使用 Pandas 的函数 read_csv。之后,在控制台中打印数据的预览,只是为了看看相关的变量和特性。内置函数 head 返回数据集的前五行:
data = pd.read_csv('new_york.csv')
data.head()
完成这一步后,您将获得以下输出:
现在,让我们来看看数据集的基本信息,包括特性、数据类型、行、条目和每一个乍看起来可用的值。我们将利用信息功能来实现这一点:
data.info()
从 Gist 中可以看出,数据集包含 16 列、48,895 个条目或行,以及不同的数据类型,比如 Numpy 整数、对象和 Numpy 浮点。一些价值观
在特性或列中,我们可以找到 ID、房东姓名、租赁 ID、主机名、行政区和其他有价值的信息,我们稍后将从中提取结论。
继续用零替换数据集中的“缺失或空值,因为空值主要集中在“评论数量”和“上次评论”列中,它们在我们的分析中没有有用的应用。在这一点上要小心,因为不是每次看到“丢失”的值都应该替换它:
data.fillna(0,inplace=True)
检查重复的条目,它应该返回零:
sum(data.duplicated())
既然我们已经从数据集中清除了不必要的要素,让我们继续分析。
A.每种房型对应的租金比例是多少?
作者图片
从数据集中可获得的全部租金中, 52% 对应于整户公寓, 46% 对应于私人房间租金,剩余的少数对应于样本的 2% 合租房间。
以下代码应该使您能够获得所呈现的可视化效果:
# 1 - Pie chartroom_type = data.groupby('room_type')['latitude'].count().reset_index()
room_type.rename(columns={'latitude':'n_rooms'},inplace=True)
plt.figure(figsize=(10,8))
plt.pie(room_type['n_rooms'],autopct='%1.2f%%', colors=['darkcyan', 'steelblue','powderblue'])
plt.axis('equal')
plt.legend(labels=room_type['room_type'],loc='best',fontsize='12')
plt.title('Room-type Rental Distribution', fontsize='15',color='b')
plt.show()
plt.close()
B.我在导言中提到的五个区的租金是如何分配的?
正如可视化图中所反映的那样,布鲁克林区和曼哈顿区集中了 Airbnb 上大部分的租赁信息,这两个区总共有超过 4 万套租赁信息。这意味着纽约的大部分游客都住在这些地区的房产、房间或住宅里。
看一下创建情节的代码:
# 2 - Bar plot with neighbourhood distributionneighbourhood = data.groupby('neighbourhood_group')['neighbourhood'].count().reset_index()
fig,ax = plt.subplots(figsize=(12,8))
sns.barplot(x=neighbourhood[neighbourhood.columns[0]],
y=neighbourhood[neighbourhood.columns[1]],color='#004488',ax=ax)
sns.lineplot(x=neighbourhood[neighbourhood.columns[0]],y=neighbourhood[neighbourhood.columns[1]],color='r',marker='o',ax=ax)
plt.ylabel('Rentals', fontsize='15')
plt.xlabel('Borough',fontsize='15')
plt.title('Rental Distribution by Neighbourhood Group',fontsize='15')
plt.grid('x')
plt.show()
sns.set()
C.价格分布是怎样的,合理的价格范围是多少?
作者图片
价格分布集中在 300-400 美元左右,很少观察到更高的价格。
# 3 - Histogram plot with price distributionprice = data.loc[:,['neighbourhood','price']].set_index('neighbourhood')
price_stats = data['price'].describe().reset_index()
price_counts = price.price.value_counts().reset_index()
price_counts.rename(columns={'index':'price','price':'count'},inplace=True)
fig2,ax = plt.subplots(figsize=(12,8))
fig2.patch.set_facecolor('lightgray')
ax.set_facecolor('lightgray')
plt.hist(price_counts['price'],bins=30,color='#004488',edgecolor='salmon')
ax.set_xticks(range(0,10000,500))
for tick in ax.get_xticklabels():
tick.set_rotation(45)
plt.xlabel('Price',fontsize='15')
plt.ylabel('Rentals', fontsize='15')
plt.xlim((-0.5,10000))
plt.title('New York Price-Rental Distribution',fontsize='15')
plt.show()
D.区分不同房型的价格。
作者图片
在可用的不同房间类型中,需求最大的是全屋,其次是私人房间,最后是合住房间,这一趋势与第一次分析中的趋势相同。
在这种情况下,我们注意到,在需求较少的行政区,如布朗克斯或斯塔滕岛,价格分散在私人房间和合租房间之间缩小,而整个家庭保持价格分散。
需求更多的地区,如曼哈顿,私人房间的租金与需求较少的地区的整栋房屋租金价格相似。
# 4 - Bar plot with price to location distributionloc_price = data.groupby(['neighbourhood_group','room_type'])['price'].mean().reset_index()
locations = loc_price.neighbourhood_group.unique()
x_rooms1 = [0.8, 3.8, 6.8, 9.8, 12.8]
x_rooms2 = [1.6, 4.6, 7.6, 10.6, 13.6]
x_rooms3 = [2.4, 5.4, 8.4, 11.4, 14.4]
y_values1 = loc_price[loc_price['room_type'] == 'Entire home/apt']['price'].values
y_values2 = loc_price[loc_price['room_type'] == 'Private room']['price'].values
y_values3 = loc_price[loc_price['room_type'] == 'Shared room']['price'].values
fig3,ax2 = plt.subplots(figsize=(16,11))
fig3.patch.set_facecolor('lightgray')
ax2.set_facecolor('lightgray')
plt.bar(x_rooms1, y_values1, color='purple', edgecolor='b')
plt.bar(x_rooms2, y_values2, color='b', edgecolor='b')
plt.bar(x_rooms3, y_values3, color='yellowgreen', edgecolor='b')
ax2.set_xticks(range(1,16,3))
ax2.set_xticklabels(locations, fontsize='12')
for tick in ax2.get_xticklabels():
tick.set_rotation(45)
plt.xlabel('Location/Room-type',fontsize='15')
plt.ylabel('Prices', fontsize='15')
plt.legend(labels=loc_price.room_type.unique(), loc='best')
plt.title('New York Price-Rental Distribution by Location and Room-type',fontsize='15')
plt.show()
E.哪是最受欢迎的租赁小屋的地点?
作者图片
根据 Airbnb 用户的评论,我们可以推断出哪些租房是最受欢迎的或最受欢迎的(这并不意味着它们是最好的,但为了简化案例,让我们考虑一下如果它们被访问的次数更多,可能是因为以前的访问者留下了好评)。
在上面的图片中,我们看到大多数被评论的位置涉及需求较少的行政区,其中最受欢迎的租赁往往平均有 550 条来自用户的评论。
# 5 - Most reviewed spotsreview = data.sort_values('number_of_reviews',ascending=False)
top_reviewed = review.loc[:,['neighbourhood','number_of_reviews']][:20]
top_reviewed = top_reviewed.groupby('neighbourhood').mean().sort_values('number_of_reviews',ascending=False).reset_index()
fig4,ax3 = plt.subplots(figsize=(12,8))
sns.barplot(x=top_reviewed['neighbourhood'],y=top_reviewed['number_of_reviews'].values,color='yellowgreen',ax=ax3)
plt.plot(top_reviewed['number_of_reviews'], marker='o', color='red',linestyle='--')
plt.ylabel('Reviews', fontsize='15')
plt.xlabel('Location',fontsize='15')
plt.ylim((400,580))
for ax in ax3.get_xticklabels():
ax.set_rotation(50)
plt.title('Most-Reviewed Rentals by location',fontsize='15')
plt.show()
sns.set()
F.为患者读者提供的租赁建议
正如我们在上面的图片中看到的,曼哈顿和布鲁克林区的需求明显更大。
你可能想知道,住在这些地方要花多少钱?有没有可能通过这种分析找到机会,让我以尽可能低的价格在这些区租到一个好房子?答案是肯定的!
曼哈顿最著名的居住地之一是上东区的(UES)。上东区是一些最富有的个人和家庭的家园。这里有最时髦的纽约人居住的豪华公寓。
有了熊猫可用的过滤器,我们可以过滤位于上东区的租赁,我们可以在评论最多的租赁中获得最便宜的租赁,以便找到最合适的住宿地点!
根据上述标准,这些是最适合私人房间和住宅的租赁:
最便宜和最受欢迎的整屋出租
最便宜和受欢迎的私人房间出租
正如我们所看到的,每晚只需 69 美元,我们就可以住在世界上最豪华的地方之一的出租屋里,如果我们的预算有限,还可以花 49 美元租一个私人房间。
如果你有任何悬而未决的疑问,可以考虑看看我下面的脚本:
import numpy as np
upper_east = data[data['neighbourhood'] == 'Upper East Side']
ninetieth_percentile = np.quantile(upper_east['number_of_reviews'], 0.85)
upper_east = upper_east[upper_east['number_of_reviews'] >= ninetieth_percentile]
upper_east = upper_east.sort_values('price',ascending=True)
private_room = upper_east[upper_east['room_type'] == 'Private room'].reset_index()
entire_home = upper_east[upper_east['room_type'] == 'Entire home/apt'].reset_index()
shared_room = upper_east[upper_east['room_type'] == 'Shared room'].reset_index()
private_cheapest = private_room.loc[0,:].reset_index()
private_cheapest.rename(columns={'index':'data','0':'values'},inplace=True)
entire_cheapest = entire_home.loc[0,:].reset_index()
entire_cheapest.rename(columns={'index':'data','0':'values'},inplace=True)
结论
毫无疑问, Airbnb 和在线租赁市场行业将帮助我们获得更好的房屋或房间租赁,以优化旅行和旅游体验。我写这篇文章的目的是为你提供一个工具来帮助你实现这样的优化,并且为什么不呢,决定你下次去纽约的时候会住在哪个地方?
如果你喜欢这篇文章中的信息,不要犹豫,联系我分享你的想法。它激励我继续分享!
您可以在以下社交网络中找到我:
- 。
- GitHub。
参考
- 【1】Airbnb 官网。
- 纽约
- [3] 用 Python 实现商业智能可视化
感谢您花时间阅读我的文章!如有任何问题、建议或意见,欢迎联系我:herrera.ajulian@gmail.com
气流:如何以及何时使用它
除了知道如何使用气流,知道何时使用气流也很重要。
Airflow 是一款用于管理和监控工作流程的流行工具。对于我们在 Bluecore 的大多数数据科学工作流来说,它工作得很好,但也有一些其他工具表现更好的用例。除了知道如何使用气流,知道何时使用气流也很重要。
关于气流
“Airflow 是一个以编程方式创作、安排和监控工作流的平台。”— 气流文件
听起来很有用,对吧?嗯,确实是!Airflow 使得在它们的 UI 中监控管道的状态变得容易,并且您可以使用任务之间复杂的扇入和扇出关系来构建 Dag。他们还补充道:
“丰富的命令行实用程序使在 Dag 上执行复杂的手术变得轻而易举。”
这让我笑了,因为有时与气流一起工作感觉像是脑部手术,而其他时候它工作了,感觉像是第二天回家的那种。
基本组件
在我们进入气流的更复杂的方面之前,让我们回顾几个核心概念。
熟练的技艺
DAG 或有向无环图是流水线中所有任务、工作单元的集合。这些任务是按照它们之间的关系和依赖关系来组织的。例如,如果要查询数据库一,然后将结果加载到数据库二,则需要在将结果加载到数据库二的任务之前直接运行查询数据库一的任务。有向非循环图暗示你的管道只能向前,不能向后。一个任务可以重试,但是在完成一个任务并且下游的另一个任务已经开始之后,该任务不能重新运行。
DAG 页面是 Airflow UI 中的主页。显示 DAG 计划,并且可以打开/关闭。
气流 UI DAG 视图
DAG 管道示例
气流之所以如此有用,是因为它能够处理任务之间的复杂关系。您可以轻松地构造扇入和扇出的任务。
下面是我们在 Bluecore 使用的一个工作流程示例。这是一个非常简单的 DAG,它使用 AppEngineOperator 调用我们在 AppEngine 中创建的命令,该命令进行查询并返回 Bluecore 的活动合作伙伴列表。接下来,我们使用 PythonOperator 来更新 Airflow 变量。如果更新任务成功或失败,我们将向 datadog 发送适当的度量。
任务/操作员
“实例化操作员对象时生成任务。”-气流文件
说快 10 倍。
任务是理想的独立部分,不依赖于来自另一个任务的信息。操作员类对象在运行时会变成任务。可以导入操作符类,实例化该类会产生类对象。该对象的实例化(运行操作符代码)是任务。一开始,任务和操作符之间的细微差别可能会令人困惑,所以我发现制作这个图表很有帮助。
在 DAG 文件中定义 DAG 和任务
概念很好,但是你可能会问自己,我实际上如何编写代码来创建 DAG?嗯,在 Bluecore,我们有一个专门用于定义 Dag 的 python 文件的 Github 库。例如,您可以创建 example_dag.py,并从定义 dag 对象开始。您将从 Airflow 导入 DAG 类,并定义您需要的参数。
接下来,写下每个任务。将 dag 参数设置为 dag 对象会将任务与 DAG 相关联。
最后,定义任务之间的关系。
将 DAG 和任务定义以及定义上游/下游任务放在一起会产生一个 DAG 定义文件。
变量
变量是气流的另一个有用组成部分。我们使用变量有两个基本目的:与环境相关的和特定于模型的参数。可以在 DAG 文件中访问变量,例如,可以更新项目 id 或图像标签,而无需对 DAG 进行任何更改。如果您有多个环境,例如 QA 和生产环境,这将特别有用。此外,我们的一些模型并不面向所有合作伙伴,而是面向一组特定的合作伙伴。我们有一个单独的 DAG,它更新包含特定于模型的伙伴的变量,然后当模型运行时,它从变量中提取它的伙伴列表。
气流 UI 可变视图
泳池
池控制允许 DAG 一次消耗的资源数量。应该根据任务完成的速度和 DAG 需要完成的速度来定义池。确保在使用池时,您没有使用其他人的池,否则两个 Dag 可能不会像预期的那样快速完成。
气流 UI 池视图
XComs
理想情况下,任务是相互独立的,但有时这是不可能的,任务需要相互通信。这种相互通信是由 xcom 完成的。XComs 可以在任务之间“推”(发送)或“拉”(接收)。
例如,您可能需要将一个任务的返回值推送到 xcom 表中,以便在下一个任务中从 xcom 表中提取该值,并将其用作参数。在前面 DAGs 部分描述的简单 DAG 示例中,第一个任务将活动伙伴列表推送到 xcom 表,第二个任务从 xcom 表中取出伙伴列表,并将该列表设置为气流变量。
摘要
我们回顾了何时使用气流(当您的管道需要支持扇入/扇出时),如何构建 DAG,DAG 为什么有用,以及各种气流组件。总之,我们了解了
- 熟练的技艺
- 任务/操作员
- 如何构建 DAG 和设置任务关系
- 变量
- 泳池
- Xcoms
现在,您已经有了开始创建 DAG 所需的工具,可以在其中构建复杂的数据管道了!如果您有兴趣了解更多信息,请参见 Airflow:如何以及何时使用它(高级)了解有关操作符、结构化 Dag 以及 Airflow 缩放问题的更多信息。
气流:如何和何时使用它(高级)
在《气流:如何以及何时使用它中,我们讨论了气流的基本组件以及如何构建 DAG。一旦你开始构建 DAG,你会发现它变得很复杂。选择运算符和设置 DAG 结构需要一些时间。随着我们在 Bluecore 的不断发展壮大,我们将继续寻找更好地创建和扩展数据管道的解决方案。以下是我们一路走来学到的一些东西。
运算符:高级
从基本概念开始,我们将讨论气流操作符的一些更实际的应用。在 Bluecore,我们开发了自己的kubernetjoboperator和 AppEngine(同步/异步)操作符。这些都是开源的,所以请随意查看。气流也有自己的 KubernetesPodOperator 和 AppEngineOperator。PythonOperator、AppEngineOperators 和 KubernetesJobOperator 是我们使用的三个主要运算符。因此,这是我要讨论的三个问题。
python 运算符
PythonOperator 运行可从 DAG 调用的 python 函数。该运算符对于处理 DAG 中的大量简单工作非常有用。
我们使用 python 运算符的方法示例
- 设置气流变量
- 在“气流”数据库上运行 SQL 查询
- 将 xcom 值添加到“XCom”表中
- 发送数据狗指标
KubernetesJobOperator
KubernetesJobOperator 从一个 Docker 映像运行代码。这意味着它几乎可以做任何事情!
我们使用 KubernetsJobOperator 的方法示例
- 查询/写入数据库(Bigtable、BigQuery、Datastore 等)。)
- 迁移数据
- 训练数据科学模型
这是迄今为止对我们最有用的操作符,但也是使用起来最复杂的。如果你使用谷歌云平台并从谷歌容器注册表中提取你的图片,这些是基本步骤
示例:使用 Kubernetes 构建任务
只要 Docker 映像在容器注册表中,代码就可以存在于任何地方。如果您将代码编写为脚本,那么您可以在操作符中将其用作命令,并在本地进行测试。在脚本中,接受参数并解析它们将允许 DAG 文件中的变量到达脚本。Kubernetes 的秘密也可以作为脚本可以使用的环境变量传入。
代码由 docker 文件构建,并指定入口点。
将 model_one_metrics.py 代码编译成映像后,就可以编写任务了。
KubernetesJobOperator 的示例代码
应用工程师
App Engine 操作员在 Google App Engine (GAE) 中运行一个命令。Bluecore 也创建了两个操作符。分别是 AppEngineSyncOperator 和 appengineoperatorsync。我们的大部分代码都是用 AppEngine 编写的,所以这些操作符有很多用处。
我们使用 app engine 运算符的方式示例
- 检索所有活动合作伙伴的列表
- 更新合作伙伴权限和功能
- 设置电子邮件发送时间
- 压缩表格
调试/Kubectl
Pod 日志对于调试 DAG 问题非常有帮助。在 UI 中点击任务即可找到。
气流用户界面中的日志页面。
如果这些日志还不够,使用 kubectl 研究 pod/worker/scheduler/web 日志。
DAG 结构和策略
任务结构
有两种不同的视图,底部是“图形视图”,右边是“树视图”在下面的 DAG 中,我们查询一个任务中所有伙伴的列表,但是在右边的 DAG 中,我们在每个伙伴的基础上查询使用“corec”模型的伙伴。该结构取决于运行一项任务所需的时间。正确的任务在一个任务中查询每个伙伴花费的时间太长,所以最好将任务拆分。
更新变量的 Dag 的两种不同视图。左下方的 DAG 显示在“图形视图”中,右上方的 DAG 显示在“树视图”中。
动态 DAG 创建
我们有三种不同类型的共同推荐,我们在一个 DAG 中运行它们。每个合作伙伴对三个模型中的每一个都有三组不同的任务。这条狗变得又大又慢。现在,我们从一个 corecommendations DAG 文件中动态生成三个 DAG,并且我们可以在不同的时间设置计划,这样就不会一次占用太多的资源。
corecommendations DAG 文件动态创建三个 DAG,每个模型一个。
DAG 分离
我们的一个模型有一些不同的 Dag。如果某些任务不依赖于当前 DAG 中的时间表或上游任务,则最好将 DAG 分开,尤其是在 DAG 需要经常运行,并且任务会降低 DAG 速度的情况下。
任务逻辑
我们曾经每周为每个合作伙伴运行两次模型。这导致 DAG 运行缓慢,因为所有任务都试图同时训练。为了解决这个问题,我们创建了一个合作伙伴 mod 7 的散列,结果是一周中运行该模型的那一天。加上三,我们得到第二天。这分散了每个合作伙伴的培训。
此外,每周只需要培训两次,但每天都需要“随机分配”。添加了涉及跳过的任务逻辑来处理这种情况。第一个任务决定应该采取哪条路径,并且,如果不是训练该伙伴的日子,则跳过训练和服务任务。
一个 DAG 中的两组不同的任务。左侧显示的是合作伙伴 a,右侧显示的是合作伙伴 b。在这次 DAG 运行中,是合作伙伴 a 而不是合作伙伴 b 进行训练。
DAG 细分:
- 决定走哪条路(搭档 a 训练,搭档 b 不训练)
2.将不需要的路径任务标记为“跳过”(需要传递给随机分配的虚拟任务)
3.向数据狗发送通过/失败指标
当气流不是最佳选择时
将谷歌云调度器用于 cron 作业可能更适合不需要扇入/扇出的简单管道。
当在 DAG 中调度大量任务时,Airfow 存在扩展问题。UI 在加载 DAG 时出现问题,这使得调试和检查变得困难。当试图加载这些大型 Dag 时,web pod 有时会崩溃
目前,我们已经实施了一些变通办法来避免这个问题,但我们目前仍在研究改进的方法。这可能是气流不适合这种工作流程,也许 Kubeflow 或 Argo 是更好的选择。让我知道,如果你有任何想法/意见缩放大型 Dag!
摘要
在气流:如何以及何时使用它中,我们讨论了如何使用气流和创建 Dag 的基础知识。在本文中,我们以这些主题为基础,更详细地讨论了如何创建操作符和构建 DAG。具体来说,我们
- 探究构建任务的更高级的方法
- 检查 DAG 结构和策略
气流是一个很好的工具。UI 使得监控、调度和设计 Dag 变得相当容易。当扩展超过 500 个任务的 Dag 时,气流开始变得困难。要么需要应用变通方法来保持 Dag 的可观察性,要么可能需要另一个管道软件。
气流:如何在睡觉时刷新股市数据——第 1 部分
在关于 Apache Airflow 的第一篇教程中,学习如何构建一个数据管道来自动提取、转换和加载项目所需的股票价格和统计数据。
什么是气流,它如何帮助你?
Apache Airflow 是一个工作流管理平台,允许用户以编程方式安排独立运行的作业,并通过其用户界面对其进行监控。Airflow 的主要组件是一个 Webserver (Airflow 的 UI 构建为 Flask App)、一个调度器、一个执行器和一个元数据数据库。
作为一名 BI 开发人员,我曾与数据工程师密切合作,很早就了解了 Airflow 擅长的领域,但我从未真正将理论付诸实践,直到我开始从事副业。
实际上,当我用破折号构建一个可视化股票价格和股票统计的应用程序时,我意识到每次我想要更新数据时,我都必须手动重新运行整个代码。当您需要提取、处理和提供数百个股票报价机的数据时,这个过程需要很长时间。我知道,如果我想扩大我的项目,我需要一个工具来编排幕后的重复任务,同时我专注于构建新的有趣的功能。
在本教程的第一部分,我将向您展示我最终是如何开始结合 Python 和 Airflow 来创建一个自动化的 ETL 管道的:
- 从雅虎财经下载股票价格并保存到一个列表中;
- 对股票价格执行高级操作,生成一个 S 股票价格历史 DF 和一个 S 股票价格统计 DF 用于我的项目的不同部分;
- 将数据保存为特定文件夹中的 CSV 文件。
但首先让我们激活一个虚拟环境,并安装气流。
安装和配置气流
对于本教程,我将假设您熟悉虚拟环境,并且您使用的是 Python 3.6 或更高版本,因为我发现安装有问题(如果您希望仔细检查,只需使用python -V
):
- 首先,激活您的虚拟环境,然后运行
pip install apache-airflow
。要验证安装是否成功,请键入命令airflow version
。 - 现在用
cd ~/airflow/
导航到 Airflow 主目录,用mkdir dags
创建一个名为“dags”的新文件夹。在气流中,一个 DAG ( 或有向无环图 ) 由许多操作符组成,这些操作符描述了为实现特定目标而需要执行的各个任务。例如,如果你想运行一个 Python 函数,你可以使用Python Operator
,而如果你想执行一个 Bash 命令,你可以使用BashOperator
,以此类推。要获得完整的可用操作员列表,请查看官方文档。 - 调用
airflow initdb
命令来启动 SQLite 数据库,其中 Airflow 将存储管理您的工作流所必需的元数据。请注意,SQLite 数据库在生产环境中并不是最佳选择,但是当您开始使用 Airflow 时,它会很方便,因为它非常容易在本地配置。 - 气流主文件夹中会出现一些新文件,其中有
airflow.cfg
。该文件包括将应用于 web 界面和 Dag 的所有配置选项。我强烈推荐用编辑器打开文件,设置load_examples=False
。该选项默认设置为True
,除非更改,否则每次运行 Webserver 时,您都会在 UI 上看到一长串默认 DAG 示例,这在我看来有点混乱和混乱。 - 用创建一个空文件。py 扩展将包括您的原始 Python 脚本+ DAG 调度+ DAG 操作符+任务层次结构。基本上,因为 Airflow 是基于 Python 的,所以您可以简单地将 DAG 嵌入到熟悉的 Python 脚本中,并将其执行留给 Airflow 的调度程序(稍后将详细介绍)。对于本教程,我最初创建了一个名为
stocks_analysis.py
的空文件。
下面的 bash 命令总结了到目前为止所做的工作:
(airflow_ve) AnBento-2:airflow $ mkdir dags(airflow_ve) AnBento-2:airflow $ airflow initdb(airflow_ve) AnBento-2:airflow $ ls
airflow-scheduler.err airflow-scheduler.pid airflow-webserver.out airflow.db unittests.cfg airflow-scheduler.log airflow-webserver.err airflow-webserver.pid dags airflow-scheduler.out airflow-webserver.log airflow.cfg logs(airflow_ve) AnBento-2:airflow $ open airflow.cfg(airflow_ve) AnBento-2:airflow $ cd dags(airflow_ve) AnBento-2:dags $ touch stocks_analysis.py(airflow_ve) AnBento-2:dags $ ls__pycache__ stocks_analysis.py
如果您遵循了所有的步骤,您现在应该准备好启动 Airflow Webserver 和 Scheduler,但是在此之前,您需要用 DAG 填充stock_analysis.py
文件。
创建 DAG 来提取-转换-加载股票价格
我将在本教程中用来刷新股票价格、设置 DAG 及其操作符的完整代码可以在我的 GitHub 帐户中获得。
如果你正在跟随,现在是时候用open stock_analysis.py
编辑空文件,并粘贴你在code _ tutorials/air flow Stock Prices ETL文件夹中找到的整个 Python 脚本了。保存更改后,在执行任何其他操作之前,请确保在环境中安装以下所有软件包:
气流现在应该能够识别有效的 DAG,您可以使用airflow list_dags
轻松检查它:
(airflow_ve) AnBento-2:dags $ airflow list_dags[2020–06–27 09:40:35,002] {__init__.py:51} INFO — Using executor **SequentialExecutor**[2020–06–27 09:40:35,002] {dagbag.py:396} INFO — Filling up the DagBag from **/Users/anbento/airflow/dags** — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -DAGS — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -stocks_analysis_ETL_7AM
上面的屏幕没有抛出错误,您可以看出 DAG 实际上已被系统识别,因为stock_analysis_ETL_7AM
正是我分配给 DAG 的名称:
实际上,我建议为您的 Dag 分配一个有意义的名称(遵循惯例project _ name+process+schedule interval),因为这有助于立即直观地看到您正在查看的作业以及它应该在何时运行,并且这在处理多个工作流时增加了清晰度。
上面的代码告诉 Airflow 何时调度作业,作业需要完成什么以及以什么顺序完成。从顶部开始,它可以分为三个部分:
- **Airflow DAG +默认参数:**在这里,您将指定作业名称、
start_date
和schedule_interval
以及 Python 字典中定义的附加default_args
。这里有几个建议,可以让你免去很多头疼的事情,也不用花时间去阅读无数的教程和堆栈溢出的帖子:
- 将静态的
start_date
设置为过去,例如start_date = datetime(2020, 6, 23)
→实际上,为了正常工作,Airflow 要求任何作业的开始日期都已经是过去的日期,为了避免不可预测的行为,最好使用静态语法,而不是像start_date = datetime.now()- timedelta(days=3)
这样的语法。 - 设置
catchup = False
→通过这种方式,您可以清楚地知道,尽管您的start_date
已经过去,但您不希望气流回填您的数据,这意味着当您第一次运行它时,作业将不会执行多次,以覆盖从start_date
到 DAG 打开日期之间的所有缺失运行。相反,气流将只运行它一次(立即),之后,它将坚持时间表。 - 更改
schedule_interval
时更改 DAG 名称→如果您希望将运行时间从上午 7 点更改为上午 8 点,最好也将 DAG 名称更改为stock_analysis_ETL_8AM
。Airflow 会将这个 DAG 视为一个全新的 DAG,这样可以避免在元数据数据库中存储两个同名的 DAG…是的,您可以从 UI 中删除旧的 DAG。
**2。DAG 操作符:**对于本教程,我将使用三个PythonOperators
来运行三个 Python 函数。每个 Python 操作符都是一个单独的任务,需要传递给气流顺序执行器以实现预期的结果。每个任务都由一个task_id
标识,为了避免混淆,我建议您确保任务名称和任务 id 始终匹配。我的任务是:
- fetch_prices_task →该任务将调用一个名为*fetch _ prices _ function()*的 Python 函数,该函数从 Yahoo Finance 下载
tickers
列表中 5 只股票的完整价格历史,删除重复项,应用简单的操作,并将它们保存在stock_prices
列表中:
如果您运行该函数,它应该会返回类似如下的内容:
因为我将使用stock_prices
列表作为另外两个 Python 函数的输入,所以这是顺序中需要执行的第一个任务。 任务执行 层次 很重要,因为它允许我不在每一步都下载股票价格,而是只做一次(在开始时),这样每个任务将运行得更快,整个过程将更有效率。
- stocks_plot_task →该任务将调用名为 stocks_plot_function() 的第二个 Python 函数,该函数将
stock_prices
列表作为输入,并将每个股票价格历史连接到一个数据帧中,该数据帧随后将用于绘制股票价格的长期趋势。数据最终保存在一个名为stocks_plots_data.csv
的 CSV 文件中。当然,您可以决定采取更高级的步骤,将数据增量加载到您选择的 DB 中——这实际上是正确的方法——但是为了保持简单并专注于气流能力,我们现在坚持使用 CSV 文件:
该功能运行时,显示stock_plots_data
DF 的前 5 行:
stocks_plots_data 包括绘制 5 只股票的趋势和蜡烛图所需的所有价格字段
- stocks_table_task →这个最后的任务将调用第三个名为stocks _ table _ function()的 Python 函数,该函数再次将
stock_prices
列表作为输入,只保留最后一个可用的Adj Close
价格,然后从 Yahoo Finance 获取大量统计数据。最终,输出被保存到一个名为stocks_table_data.csv
的 CSV 文件中:
这个函数很长,所以只显示前 15 行。在这里找到完整版。
上述函数的输出是一个具有 5 行 13 列的 DF,其中 11 列是关键统计数据:
3。任务层级→ 这是 DAG 的最后一个组件,用于指定气流执行三个任务的顺序。就我而言,我选择了:
*fetch_prices_task >> stocks_plot_task >> stocks_table_task*
这意味着将首先执行fetch_prices_task
(这是有意义的,因为它生成了用于其他两个任务的stock_prices
列表),然后是stocks_plot_task
和stocks_table_task
。
在这种情况下,您还可以决定合并第二个和第三个任务,因为它们互不依赖:
*fetch_prices_task >> [stocks_plot_task, stocks_table_task]*
注意在 Airflow 中依赖关系是如何在语法上设置的(set_upstream()
、set_downstream()
)或者像我一样使用、位移法、操作符。
气流交叉通信(XCom)
如果您试图在 Python IDE 中测试这些函数,您可能会注意到它们只是…失败了!。这是因为**为了让一个任务的输出在后续的其他任务中作为的输入被调用,Airflow 使用了一个名为 XCom** 的任务间通信 Python 类。因此,我必须修改原始函数,添加:
- 一个关键字参数(**kwargs) 用于所有三个;
- 下面两行为 stocks_plot_function() 和stocks _ table _ function():
*ti = kwargs[‘ti’]
stocks_prices = ti.xcom_pull(task_ids=’fetch_prices_task’)*
provide_context = True
对于每个 Python 操作符。
实际上,正如文档(非常简洁……)所解释的,一个任务可以通过调用xcom_push()
方法或者简单地通过在它调用的函数结束时返回输出来使输出可用(就像我对return stock_prices
所做的)。
以类似的方式,一个任务可以通过调用xcom_pull()
方法获取输出,该方法精确地指定应该从哪个任务获取输入(task_ids ='fetch_prices_task'
)。
Denys Nevozhai 在 Unsplash 上拍摄的照片
是的,我知道……如果你第一次使用 Airflow,你可能会想为什么不能在fetch_prices_function()
之外定义stock_prices=[]
,并在其他两个函数中使用它作为全局列表。事情是这样的,Airflow 一次性解析 Python 代码,因此它需要一个更复杂的系统来让任务相互“交流”。如果你对主题仍有疑问,这是最近帮助我的另一篇优秀文章。
最后一步:如何激活股票分析 ETL 作业
既然您已经掌握了代码在做什么以及 DAG 是如何构建的,那么是时候打开两个单独的 Bash 窗口了。在第一个窗口中,您应该运行命令来启动 air flowweb server*😗
*(airflow_ve) AnBento-2:airflow $ airflow webserver*
而在第二个窗口中,您应该启动气流 调度器 :
*(airflow_ve) AnBento-2:airflow $ airflow scheduler*
如果您导航到默认的http://0 . 0 . 0 . 0:8080/admin/本地地址,您将有望看到下面的屏幕:
气流正确显示了stocks_analysis_ETL_7AM
DAG,但是为了启动该过程,需要手动打开作业。一旦你这样做了,气流 顺序执行器 将立即根据它们的层次运行所有三个任务:
墨绿色表示 3 个任务都已成功执行,您可以点击 最近任务 进行验证:
这意味着包含股票数据的 2 个更新的 CSV 文件已经保存到指定的位置。如果出现问题,并且您希望再次检查代码,您可以在用户界面中通过单击DAG _ name>Code来完成:
结论
恭喜你!如果你有足够的动力完成本 Airflow 教程的第 1 部分的结尾,你现在应该能够构建你的第一个 ETL 本地管道,并使用它来刷新你个人项目背后的数据。你还学习了如何使用 XCom 类动态连接任务,我希望这些知识在你开始构建更复杂的 Dag 时会派上用场。
在第二部分中,我将向您展示如何在生产中部署气流 Dag,以便它们可以在您睡觉时真正运行,但在此之前,请看看最后两条建议:
- *在本地构建 ETL 管道意味着,除非您的机器启动,**Dag 将不会在预定的时间运行。*实际上,为了让 Airflow 正常工作,web 服务器和调度程序都需要在后台运行。如果您保持它们运行,而您的系统进入空闲状态,只要您重新激活系统,气流就会覆盖它在不活动期间错过的作业。但是,将 Dag 部署到生产环境将解决这个问题。
- 理解执行日期和开始日期之间的差异以及 Airflow 执行工作流的方式通常并不简单。为了帮助你理解要点,请看一下这篇深入探讨这个话题的文章。
请让我知道你是否喜欢评论中的教程,我希望能在第 2 部分看到你!
你可能也喜欢:
* [## 在你开始第一个项目之前,要掌握 15 个 Git 命令
您需要掌握的最后一个 Git 教程是命令行版本控制。
levelup.gitconnected.com](https://levelup.gitconnected.com/15-git-commands-you-should-learn-before-your-very-first-project-f8eebb8dc6e9) [## Python 中复制的 8 个流行的 SQL 窗口函数
关于如何利用业务分析中的 Pandas 高效复制最常用的 SQL 窗口的教程…
towardsdatascience.com](/8-popular-sql-window-functions-replicated-in-python-e17e6b34d5d7) [## 使用环境变量隐藏您的密码
关于如何在使用 Python 连接到数据库时使用环境变量隐藏密钥的教程
medium.com](https://medium.com/analytics-vidhya/connect-to-databases-using-python-and-hide-secret-keys-with-env-variables-a-brief-tutorial-4f68e33a6dc6)*
Docker 指标报告中的气流
在官方的 Apache 气流图像上使用 Grafana 来监控队列健康状况等等。
一个令人不安但可能熟悉的情况:您成功地部署了 Airflow,但发现自己不断刷新 webserver UI 以确保一切顺利运行。
您依赖某些警报任务在上游故障时执行,但是如果队列已满并且任务停止,您将如何得到通知?
一个解决方案是:在 Airflow 上部署 Grafana,一个开源的报告服务。
提议的架构
作者图片
首先,我假设对使用 Docker 和 Docker Compose 的气流功能和容器化有基本的了解。更多资源可以在这里找到气流,在这里找到对接,在这里找到对接合成。
参考代码跟随:https://github.com/sarahmk125/airflow-docker-metrics
现在,有趣的事情。
用过的服务
为了将气流度量放入支持警报的视觉上吸引人的仪表板中,在docker-compose.yml
文件中声明的 Docker 容器中增加了以下服务:
- Airflow: Airflow 在 Dag 中运行任务,这些任务在存储于
./dags/
文件夹中的 Python 文件中定义。已经有一个示例 DAG 声明文件。运行多个容器,特别是使用官方apache/airflow
图像的细微差别。稍后会详细介绍。 - StatsD-Exporter:StatsD-Exporter 容器将 StatsD 格式的气流度量转换为 Prometheus 格式,即报告层(Grafana)的数据源。有关 StatsD-Exporter 的更多信息,请点击查看。容器定义包括启动时要执行的命令,定义如何使用公开的端口。
statsd-exporter:
image: prom/statsd-exporter
container_name: airflow-statsd-exporter
command: "--statsd.listen-udp=:8125 --web.listen-address=:9102"
ports:
- 9123:9102
- 8125:8125/udp
- Prometheus : Prometheus 是一个常用于时间序列数据报告的服务。由于 Prometheus 是一个受支持的数据源,所以在使用 Grafana 作为报告 UI 时特别方便。更多关于普罗米修斯的信息请点击查看。容器定义中装载的卷指示数据如何流入/流出 Prometheus。
prometheus:
image: prom/prometheus
container_name: airflow-prometheus
user: "0"
ports:
- 9090:9090
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/volume:/prometheus
- Grafana 是一个报告 UI 服务,通常用于连接非关系数据库。在中描述的代码中,Grafana 使用 Prometheus 作为仪表板的数据源。容器定义包括门户的管理员用户,以及定义已经预先配置的数据源和仪表板的卷。
grafana:
image: grafana/grafana:7.1.5
container_name: airflow-grafana
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: password
GF_PATHS_PROVISIONING: /grafana/provisioning
ports:
- 3000:3000
volumes:
- ./grafana/volume/data:/grafana
- ./grafana/volume/datasources:/grafana/datasources
- ./grafana/volume/dashboards:/grafana/dashboards
- ./grafana/volume/provisioning:/grafana/provisioning
让它走
要启动一切,需要以下工具:Docker、docker-compose、Python3、Git。
步骤(在终端中运行):
- 克隆存储库:
git clone [https://github.com/sarahmk125/airflow-docker-metrics.git](https://github.com/sarahmk125/airflow-docker-metrics.git)
- 导航到克隆的文件夹:
cd airflow-docker-metrics
- 启动容器:
docker-compose -f docker-compose.yml up -d
(注意:除了最后分别用stop
或down
外,可以通过运行相同的命令来停止或移除容器)
结果:
- air flow web server UI:http://localhost:8080
作者图片
- StatsD 指标列表:http://localhost:9123/metrics
作者图片
- 普罗米修斯: http://localhost:9090
作者图片
- grafana:http://localhost:3000(登录:username= admin ,password =password)
该存储库包括一个气流指标仪表板,可以设置警报,显示一段时间内正在运行和排队的任务数量:
作者图片
解释的步骤
普罗米修斯实际上是如何得到度量的?
Prometheus 在启动时配置在作为卷挂载的./prometheus/prometheus.yml
文件中:
global:
scrape_interval: 30s
evaluation_interval: 30s
scrape_timeout: 10s
external_labels:
monitor: 'codelab-monitor'scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['airflow-prometheus:9090']
- job_name: 'statsd-exporter'
static_configs:
- targets: ['airflow-statsd-exporter:9102']
tls_config:
insecure_skip_verify: true
特别是,scrape_configs
部分声明了要抓取的目的地(airflow-prometheus
容器)和源(airflow-statsd-exporter
容器)。
如何在 Grafana 中创建仪表板和警报?
供应是您的朋友!
Grafana 中的供应意味着使用代码来定义数据源、仪表板和启动时存在的警报。当启动容器时,在localhost:3000/data sources中已经配置了一个Prometheus
数据源,并且在localhost:3000/dashboards中列出了一个Airflow Metrics
仪表板。
如何调配:
- 所有相关数据都作为卷安装到在
docker-compose.yml
文件中定义的grafana
容器中(如上所述) ./grafana/volume/provisioning/datasources/default.yaml
文件包含所有数据源的定义:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
./grafana/volume/provisioning/dashboards/default.yaml
文件包含关于在容器中何处安装仪表板的信息:
apiVersion: 1
providers:
- name: dashboards
folder: General
type: file
editable: true
updateIntervalSeconds: 10
allowUiUpdates: true
options:
path: /grafana/dashboards
foldersFromFilesStructure: true
./grafana/volume/dashboards/
文件夹包含.json
文件,每个文件代表一个仪表板。 airflow_metrics.json 文件在上面显示的仪表板中产生结果。
按照这些指令可以从 Grafana UI 中检索 JSON。
UI 中的警报可以按照这里的所述进行设置;这里还有一篇优秀的中型文章关于设置 Grafana alerting with Slack 的。可以采用与仪表板和数据源相同的方式提供警报。
额外话题:官方气流图像
在有官方 Docker 形象之前,Matthieu“puck El _”rois il发布了 Docker 对气流的支持。从 Airflow 版本 1.10.10 开始,Apache 软件基金会在 DockerHub 上发布了一个官方图像,这是唯一一个当前持续更新的图像。然而,许多人仍然依赖传统的和非官方的库。
为什么这是一个问题?好吧,依赖遗留库意味着在版本 1.10.9 中限制气流。Airflow 1.10.10 开始支持一些很酷的功能,比如在 Kubernetes 上运行任务。官方仓库也将是即将到来的(和高度期待的)气流 2.0 将被释放。
在描述的仓库中为webserver
找到的新的docker-compose
声明看起来像这样:
webserver:
container_name: airflow-webserver
image: apache/airflow:1.10.12-python3.7
restart: always
depends_on:
- postgres
- redis
- statsd-exporter
environment:
- LOAD_EX=n
- EXECUTOR=Local
- POSTGRES_USER=airflow
- POSTGRES_PASSWORD=airflow
- POSTGRES_DB=airflow
- AIRFLOW__SCHEDULER__STATSD_ON=True
- AIRFLOW__SCHEDULER__STATSD_HOST=statsd-exporter
- AIRFLOW__SCHEDULER__STATSD_PORT=8125
- AIRFLOW__SCHEDULER__STATSD_PREFIX=airflow
-AIRFLOW__CORE__SQL_ALCHEMY_CONN= postgresql+psycopg2://airflow:airflow@postgres:5432/airflow
-AIRFLOW__CORE__FERNET_KEY= pMrhjIcqUNHMYRk_ZOBmMptWR6o1DahCXCKn5lEMpzM=
- AIRFLOW__CORE__EXECUTOR=LocalExecutor
- AIRFLOW__CORE__AIRFLOW_HOME=/opt/airflow/
- AIRFLOW__CORE__LOAD_EXAMPLES=False
- AIRFLOW__CORE__LOAD_DEFAULT_CONNECTIONS=False
- AIRFLOW__WEBSERVER__WORKERS=2
- AIRFLOW__WEBSERVER__WORKER_REFRESH_INTERVAL=1800
volumes:
- ./dags:/opt/airflow/dags
ports:
- "8080:8080"
command: bash -c "airflow initdb && airflow webserver"
healthcheck:
test: ["CMD-SHELL", "[ -f /opt/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
从puckel/docker-airflow
配置的一些变化来突出:
- 以前在
airflow.cfg
文件中发现的自定义参数,如AIRFLOW__CORE__SQL_ALCHEMY_CONN
,现在被声明为docker-compose
文件中的环境变量。 - 初始化后端数据库的
airflow initdb
命令现在在docker-compose
文件中被声明为一个命令,而不是一个入口点脚本。
瞧啊。
这就是了。再也不用担心你的任务被无限地排队而没有运行。气流在 Docker 中运行,Grafana 中的仪表盘和警报触手可及。相同的架构可以在部署在 GCP 或 AWS 的实例上运行,以实现全天候监控,就像在本地运行一样。
成品可以在这里找到:https://github.com/sarahmk125/airflow-docker-metrics
需要注意的是,总有改进的空间:
- 此监视设置不会捕获容器或实例故障;需要一个单独的或扩展的解决方案来在容器或实例级别进行监控。
- 当前代码使用 LocalExecutor 运行,这对于大型工作负载来说不太理想。可以用 CeleryExecutor 做进一步的测试。
- 在 StatsD 中还有许多没有突出显示的可用指标(例如 DAG 或任务持续时间、任务失败次数等。).可以在 Grafana 中构建和提供更多的仪表板,以利用所有相关的指标。
- 最后,本文重点关注自托管(或高度可配置的云)气流部署,但这不是部署气流的唯一选择。
有问题吗?评论?
感谢阅读!我喜欢谈论数据堆栈。给我发个消息。