气候变化:互动 Plotly Dash 发现我们的未来前景
数据科学,了解城市、国家和我们的世界正在发生什么,以及将会发生什么。
作者: 卡米拉·马西 ( 李 ) 西尔维娅·保鲁奇 ( 李 ) 唐塔雷利 ( 李)
*** 链接到app* * *
在过去的几年里,一些机构提供的数据强调了我们星球的气温上升趋势。不幸的是,这种趋势没有任何积极的一面。
多年来,科学家们不断发出警告,让我们意识到尽可能降低气温的上升是多么重要。尽管在这个问题上达成了各种各样的协议,但事情并不完全像我们所希望的那样发展,并且后果是明显的。
大量研究表明,气候变化正在对动物和植物产生重大影响。气候条件是决定哪些动植物物种能够在特定地理区域生存、生长和繁殖的决定性因素。其中一些与它们已经适应的气候条件密切相关,温度的轻微上升、降雨量的少量减少或另一个参数的细微变化都会增加它们的脆弱性。
由于温度过高,两极的冰川不断融化。这导致生态系统发生重大变化,加速了生活在其中的动物的灭绝(例如:蜜蜂、北极熊、树袋熊、海豹和许多其他动物)以及海平面的上升。
安德里亚斯·韦思, CC BY-SA 4.0 ,通过维基共享
当然,不仅仅是地球上寒冷的地方显示了气候变化的后果。此外,非洲“包含世界上五分之一的已知植物、哺乳动物和鸟类物种,以及六分之一的两栖动物和爬行动物”(齐格弗里德 1989),正显示出一致的变化。这些变化包括候鸟和大型哺乳动物习性的改变、珊瑚礁的减少以及随之而来的生物多样性的丧失,而生物多样性是非洲人民的一种相关资源。
即使在意大利,我们也有气候变化影响的例子。例如,我们可以指出这样一个事实,即据估计,白云石(世界遗产)中最大的 Marmolada 冰川将在 15 年内消失,而且情况每年都在变得越来越糟。
SkiNick890 , CC BY-SA 4.0 ,通过维基共享
所以,我们认为提供我们的星球正在发生什么的证据是相关的,除非有所发现,否则我们将继续在这个星球上生活一辈子。为此,我们认为利用数据科学和数据分析的新技术开发一个 Python 仪表盘会很有意思,它将清楚明确地突出显示我们正在目睹的气候变化(我们是气候变化的原因)。
数据集
我们选择了由伯克利地球公司发布的开源数据集。这是一个美国非营利组织,它与各种机构一起进行了测量,其中美国宇航局是最突出的。
它包含了从 1750 年到 2013 年上半年的地球月平均温度、不同国家和一些特定城市的信息。其中一条信息是测量的不确定性。它在最初的几个世纪里太高了,所以这导致我们决定排除它们,因此只研究 1900 年到 2012 年之间的城市和城镇,以及 1900 年到 2015 年之间的地球。
阴谋地
我们所有的图表都使用了 Plotly ,这是一个免费的开源库。它实现了各种各样的图表,这些图表在视觉上非常吸引人,令人印象深刻。它还允许您添加不同类型的交互式内容,如动画、滑块等。
Pensrulerstape , CC BY-SA 4.0 ,通过维基共享
破折号
Dash 是一个用于构建 web 分析应用程序的高效 Python 框架,不需要 JavaScript,并且与 Plotly 紧密集成。Dash 是构建具有高度定制的用户界面的数据可视化应用程序的理想选择。通过几个简单的方案,Dash 抽象了构建基于 web 的交互式应用程序所需的所有技术和协议,使您可以将应用程序部署到服务器上,然后轻松地共享它们。此外,因为应用程序显示在 web 浏览器中,所以 Dash 本身就是跨平台的。
Heroku
Heroku 是一个云编程平台,旨在帮助构建和部署在线应用(PaaS)。它是首批出现在网络上的应用程序之一,允许用户开发、部署和管理在线应用程序,并支持包括 Python 在内的六种编程语言。
作为一个 PaaS,Heroku 的目的是为用户提供在各种平台(如脸书)上分发和运行基于网络的应用程序所需的计算资源。
Heroku , CC BY-SA 4.0 ,通过维基共享
应用
*** 链接到 app ***
这个应用程序是通过 Dash 和 Plotly 构建的,由三个选项卡组成:全球、国家和城市。每一个都是一个交互式仪表板,显示和报告从 1900 年到过去十年的前五年的各种图表和分析。
全球选项卡中收集的图表是最重要的:它们直接显示了上个世纪的全球变暖现象及其演变。
左侧的线形图显示了地球历年的平均温度趋势及其到 2050 年的预测。久而久之,增长的趋势越来越明显,预测证实了科学家们长期以来一直重复的话:如果我们不与这种趋势作斗争,气温将迅速上升,情况只会变得更糟。
通过动画图表,还可以通过颜色与侧面的色标图例进行比较,直观地了解世界每个国家的气温变化。我们注意到,与 1900 年相比,几乎每个国家的气温都上升了,这可以从地图上的暖色调中看出。将鼠标悬停在不同的国家上,可以观察到不同年份的这种变化。
国家选项卡按国家提供了对 温度变化的更深入分析:您可以使用顶部的下拉菜单将分析集中在特定国家和特定年份。
第一个图表显示了所选国家到 2042 年的平均气温趋势和预测。举个例子,我们关注我们的国家意大利:同样在这种情况下,随着地球温度的上升,很容易注意到一个毫无疑问的上升趋势,特别是自 80 年代以来,这导致了不间断的温度上升,导致自 1900 年以来气温上升超过 1 摄氏度。
国家平均气温趋势及预测’(意大利)
通过箱线图在右上角的图表中可以看到所选国家多年来平均气温的月分布。这样就可以知道一个国家一年中各月平均气温的最小值、第一个四分位数、中位数、第三个四分位数和最大值。此外,该图突出显示了异常值,与其他年份各月的平均温度记录相比,这些异常值代表了异常的炎热或寒冷月份。例如,如果您选择意大利,则可能会注意到六月和八月的异常值,这两个月份都对应于 2003 年记录的异常高温。事实上,在那年的夏天,一场强烈的热浪袭击了整个欧洲,在整个欧洲大陆造成了至少 3 万人死亡。
国家平均气温分布’(意大利)
在选项卡的底部,我们可以找到一个**直方图,显示了属于所选国家的不同城市的平均温度。水平段表示国家的平均温度,直方图的列表示城市的平均温度。**正如我们所料,选择意大利,最高的列对应于南部城市。
主要城市平均气温’(意大利— 2012 年)
转到城市选项卡,可以通过线性图表详细调查一个城市及其所在国家的平均温度。
到 2042 年所选城市的平均气温预测也以图表形式显示在该选项卡中。这一预测与全球气温的总体上升一致,这让我们想知道气候变化现象在未来可能会持续并恶化到什么程度。
城市平均气温趋势及预测’(意大利—安科纳)
国家和城市平均温度’(意大利—安科纳)
结论
总之,我们希望我们已经清楚地解释了气候变化和全球变暖的问题,并激发了你们对这个主题的兴趣。我们的目标是为理解我们的星球正在经历的突变以及气候变化和全球变暖对我们生活的影响提供定量支持。这不“仅仅”是两极冰川融化或荒漠化加剧的问题,因为这关系到我们所有人,因此我们必须应对气候变化。
我们所做的预测显示了一个明确的趋势。它导致不安全和令人担忧的前景延伸到 2050 年,这是世界主要领导人在最近的气候领导人峰会上设定的实现零排放的目标,但这些所谓的气候目标会实现吗?它们够用吗?还是会是惯常的“大言不惭,小动作”?
“我们知道世界是复杂的,许多人都在尽最大努力,需要的东西并不容易。但是我们不能满足[……]我们必须走得更远。我们必须相信我们能做到,因为我们能。当我们人类走到一起,决定完成某件事时,我们几乎可以完成任何事。我们将继续为一个安全的未来而奋斗。学位的每一分都很重要,而且将永远重要。需要做的事情和我们实际正在做的事情之间的差距每分钟都在扩大。所需的紧迫性与目前的认识和关注水平之间的差距越来越荒谬。我们所谓的气候目标和当前最有效的整体科学之间的差距不应再被忽视。”
格里塔·图恩伯格
作者: 卡米拉·马西 ( 领英 )
西尔维亚·保鲁奇 ( 领英 )
弗朗切斯科·通塔雷利 ( 领英)
利用 Pandas 和 Matplotlib 进行气候数据分析
探索性数据分析揭示了加纳最热的日、月、年
基本原理
加纳气候数据的探索性数据分析(EDA)展示了我第一个数据科学项目组合。气候数据提供了一个时间序列的天气变量记录,按时间顺序排列,对 EDA 非常有用。其次,它可以免费公开获得,对我来说,只需点击几下鼠标,就可以从 https://www.ncdc.noaa.gov/cdo-web 的 T4 获得数据。
从美国国家海洋和大气管理局记录的最热月份项目中得到启示,该项目来自 https://www.ncdc.noaa.gov/sotc/global/201904。我使用 Pandas 和 Matplotlib 研究了加纳气候数据的 EDA,以了解趋势以及它如何与全球气候变化现象进行比较。就个人而言,从当地的角度把握气候变化的咒语。这篇文章介绍了该项目的成果和一点旅程。
旅程
在过去的几个月里,由于 Covid 19 疫情导致工作放缓,我陷入了学习 Python 编程的困境,以此来掩盖我的业余时间。互联网上许多免费的资源对我自学这个科目很有帮助。特别值得一提的是赫尔辛基大学提供的完整的地理 python 课程。这是为环境和自然资源领域的趋势学习者准备的。其他的包括科里·谢弗在 youtube 上的教程和 StackOverflow 上提供的一些有价值的建议。
有趣的是,在设置我的 Github 账户来托管这个项目时,我遇到了一个大惊喜。Github 通知我我的电子邮件帐户已经被占用了,真是一个惊喜!我成功地找回了密码。只有当我访问该帐户时,我才意识到,该帐户是 2014 年第一次设置的,哇!事实上,它已经来了很久。
结果
这些数据是从遍布加纳的 17 个站点/城镇获得的记录。它包含 70,068 条每日记录的 11 个变量。记录从 1973 年开始,到 2020 年,一段 47 年的气候数据。不同站点的独特记录的长度各不相同,这丝毫不影响数据的整体分析。最终只选择了四个主要变量进行分析。
总结和简要评论如下:
加纳的日平均气温为 27.6 摄氏度,即日平均气温。最热的一天,即 1977 年 4 月 22 日记录的最高日平均温度为 35.0 摄氏度。与全球 4 月最热月份记录一致。最高月平均温度 31.1 摄氏度,记录于 1983 年 4 月——最热的一个月。最高年平均温度 30.2 摄氏度,记录于 1983 年——最热的一年。这与 2020 年不同,根据美国宇航局的数据,2016 年是全球最热的一年。
加纳年平均温度
年平均温度图显示了总体上升和波动的温度,从 2015 年开始稳定在 28 摄氏度左右。这意味着更热的天气会带来严重的气候影响。1983 年,加纳经历了历史上最严重的干旱和森林大火,这些都被精确地记录在图片中。
在此期间,记录显示自 1973 年以来气温每十年上升 1.5 摄氏度。访问加纳的最佳时期是 6 月中旬到 9 月,那时气温会降到 26 摄氏度以下,这是我们最凉爽的月份。
加纳月平均气温
关于用 Pandas 编码,一个主要的收获是在任何切片操作之前对数据帧进行排序,否则,您可能会在分析中遇到挑战。也就是说,如果你的数据还没有排序。你不会想体验我作为切片新手所经历的麻烦。考虑到 17 个站点的数据集类型,该项目可以进行更多的分析、可视化和推断。去我的 Github 便携版玩玩吧。欢迎对这篇文章提出意见和问题。感谢阅读。
临床自然语言处理
迁移学习和弱监督
由 Unsplash 上的 Hush Naidoo 拍摄的照片
在全国各地,医生每天都在给病人看病,并仔细地将他们的病情、健康的社会决定因素、病史等记录到电子健康记录(EHRs)中。这些文档繁重的工作流产生了丰富的数据存储,有可能从根本上改善患者护理。这些数据的大部分不是离散的字段,而是自由文本的临床笔记。传统的医疗保健分析主要依赖于离散数据字段,偶尔也依赖于自由文本数据的正则表达式,从而错过了大量的临床数据。
在疫情早期,在建立广泛的检测之前,关于新冠肺炎的症状信息(即发烧、咳嗽、气短)对于跟踪传播是有价值的。更好地了解疾病的进展并识别可能经历更差结果的患者仍然是有价值的。在离散数据字段中,无法可靠地捕获症状数据。临床进展记录,特别是在门诊环境中,提供了新冠肺炎感染的早期证据,使得能够预测即将到来的医院激增。在本文中,我们将研究 NLP 如何通过迁移学习和弱监督来实现这些见解。
自然语言处理(NLP)可以从临床文本中提取编码数据,使以前的“黑暗数据”可用于分析和建模。随着最近算法的改进和工具的简化,NLP 比以往任何时候都更加强大和容易使用,然而,它也不是没有一些逻辑障碍。有用的 NLP 引擎需要大量带标签的数据来很好地“学习”一个数据域。临床文本的专业性质排除了人群来源标签,它需要专业知识,而具有专业知识的临床医生在更紧迫的事务中需求量很大——特别是在疫情期间。
那么,医疗系统如何在尊重临床医生时间的同时利用他们的自由文本数据呢?一个非常实用的方法是迁移学习和弱监督。
现代的 NLP 模型不再需要从头开始训练。许多最先进的语言模型已经在临床文本数据集上进行了预训练。对于新冠肺炎综合症的数据,我们从名为 huggingface 的 pytorch 框架中可用的Bio _ Discharge _ Summary _ BERT开始。如 ClinicalBERT 论文中所述,该模型在 MIMIC III 出院小结数据集上进行训练。我们使用来自 Bio_Discharge_Summary_BERT 的 transformer 单词嵌入作为迁移学习基础,并微调序列标记层,以使用我们的特定症状标签对实体进行分类。例如,我们对“气短”感兴趣,临床上有许多症状可以归入这一范畴(例如,“呼吸困难”、“气喘”、“呼吸急促”)。我们的分类问题限于大约 20 个症状标签,比一般的临床 NER 问题产生更高的性能结果。
然而,为了训练这个序列标记层,我们回到了数据问题。MIMIC III 和我们的内部临床文本数据集都是未标记的。少数公开可用的带标签的临床文本数据集(如 N2C2 2010)被标记为不同的使用案例。我们如何为我们的目标用例获得足够的数据标签,并负责任地进行采样以防止模型中的偏差?
我们的策略有三个步骤:注释的选择性抽样、弱监督和负责任的人工智能公平技术
我们使用选择性抽样来更有效地利用我们临床医生的时间。对于新冠肺炎症状,这意味着只向注释者提供可能包含症状信息的注释。产前预约记录或行为健康记录不太可能讨论发烧、咳嗽、流鼻涕或气短。战略性地限制我们发送给注释者的注释池增加了临床医生花费在每个注释小时上的标签。为了进行注释,我们为临床医生提供了一个名为 prodigy 的工具。用户界面易于使用,并且对于不同的注释策略是灵活的。
由作者创建
建立注释策略时的一个主要决策点是确定您希望您的注释器以什么粒度进行标记。选择太高的粒度,比如“症状”,不会给我们用例所需要的数据,但是过于具体,比如“非生产性咳嗽”对“生产性咳嗽”,对注释者来说是一个沉重的负担,对我们没有额外的好处。对于任何标注策略,平衡标注者的负担和标注数据集的可重用性是很重要的。我们回到井里的次数越少越好,但是如果一个临床医生花 2 个小时来注释一个临床笔记,我们也没有成功。对于我们的项目,注释的第一步只适用于 NER。我们后来通过了 NER 的情绪(即。存在、不存在、假设)。Prodigy 允许使用定制配方脚本制定有针对性的策略。
在从我们的临床医生那里收集了 Prodigy 注释后,我们创建了基于规则的标签模式,用于 SpaCy 中的弱监管。Prodigy 和 SpaCy 由同一个开发小组开发,这使得集成变得非常简单。弱监督是另一种注释策略,然而,它不是来自临床主题专家的“黄金标准”注释,而是使用一种算法来注释更大量的文本。理想情况下,由于使用算法而降低的准确性被可以处理的大量文档所抵消。使用基于以下标记模式的算法,我们能够生成一个非常大的训练数据集。
{"label":"SOB","pattern":[{"LOWER":{"IN":["short","shortness"]}},{"LOWER":"of","OP":"?"},{"LOWER":"breath"}]}
{"label":"SOB","pattern":[{"LOWER":"tachypnea"}]}
{"label":"SOB","pattern":[{"LOWER":"doe"}]}
{"label":"SOB","pattern":[{"LOWER":"winded"}]}{"label":"SOB","pattern":[{"LOWER":"breathless"}]}{"label":"SOB","pattern":[{"LOWER":"desaturations"}]}{"label":"SOB","pattern":[{"LOWER":"gasping"}]}{"LOWER":"enough"},{"LOWER":"air"}]}{"label":"SOB","pattern":[{"LOWER":"cannot"},{"LOWER":"get"},{"LOWER":"enough"},{"LOWER":"air"}]}{"label":"SOB","pattern":[{"LOWER":"out"},{"LOWER":"of"},{"LOWER":"breath"}]}
因为我们的选择性采样会使我们呈现给注释者的注释产生偏差,所以我们需要防止最终训练模型的弱监督数据集中的偏差。临床领域的机器学习需要更高程度的努力,以防止模型中的偏差。 负责任的人工智能技术 在所有行业都变得强制性,但由于平等和公正是生物医学伦理的基本原则,我们小心翼翼地开发了一种用于弱监管的无偏笔记采样方法。对于每个数据集,临床记录在种族和民族、地理位置、性别和年龄上以相同的数量进行采样。然后通过 SpaCy 将标签图案应用到纸币上。结果是 100,000 份临床记录的 IOB 格式的注释数据集。
def **pandas_parse**(x): with open(patterns_file) as f:
patterns = json.load(f) \
if patterns_file.lower().endswith("json") \
else [json.loads(s) for s in f]
for p in patterns:
p["id"] = json.dumps(p)
spacy.util.set_data_path("/dbfs/FileStore/spacy/data")
nlp = spacy.load(spacy_model, disable=["ner"])
ruler = EntityRuler(nlp, patterns=patterns)
nlp.add_pipe(ruler)
return x.apply(lambda i: parse_text(i,nlp))parse_pandas_udf = F.pandas_udf(pandas_parse,ArrayType(ArrayType(StringType())), F.PandasUDFType.SCALAR)#IOB output
def **parse_text**(text,nlp):
doc = nlp(text)
text = []
iob_tags = []
neg = []
for sent in doc.sents:
if len(sent) < 210 and len(sent.ents) > 0:
text = text + [e.text for e in sent]
iob_tags = iob_tags + [str(e.ent_iob_) + '-' \
+ str(e.ent_type_) if e.ent_iob_ else 'O' for e in sent]
return (pd.DataFrame( {'text': text,'iob_tags ': iob_tags
}).values.tolist())
由作者创建
此时,我们已经准备好训练我们的序列标签层。我们使用了一个叫做 Flair 的框架来从我们的 IOB 标签数据集创建一个语料库。然后,语料库被分成开发集、训练集和验证集,Flair 从那里开始。结果很有希望。
- F1-score (micro) 0.9964- F1-score (macro) 0.9783By class:ABDOMINAL_PAIN tp: 977 - fp: 6 - fn: 5 - precision: 0.9939 - recall: 0.9949 - f1-score: 0.9944ANXIETY tp: 1194 - fp: 8 - fn: 8 - precision: 0.9933 - recall: 0.9933 - f1-score: 0.9933CHILLS tp: 343 - fp: 1 - fn: 0 - precision: 0.9971 - recall: 1.0000 - f1-score: 0.9985CONGESTION tp: 1915 - fp: 21 - fn: 6 - precision: 0.9892 - recall: 0.9969 - f1-score: 0.9930COUGH tp: 3293 - fp: 6 - fn: 6 - precision: 0.9982 - recall: 0.9982 - f1-score: 0.9982COVID_EXPOSURE tp: 16 - fp: 1 - fn: 1 - precision: 0.9412 - recall: 0.9412 - f1-score: 0.9412DIARRHEA tp: 1493 - fp: 6 - fn: 0 - precision: 0.9960 - recall: 1.0000 - f1-score: 0.9980FATIGUE tp: 762 - fp: 2 - fn: 7 - precision: 0.9974 - recall: 0.9909 - f1-score: 0.9941FEVER tp: 3859 - fp: 7 - fn: 2 - precision: 0.9982 - recall: 0.9995 - f1-score: 0.9988HEADACHE tp: 1230 - fp: 4 - fn: 5 - precision: 0.9968 - recall: 0.9960 - f1-score: 0.9964MYALGIA tp: 478 - fp: 3 - fn: 1 - precision: 0.9938 - recall: 0.9979 - f1-score: 0.9958NAUSEA_VOMIT tp: 1925 - fp: 7 - fn: 12 - precision: 0.9964 - recall: 0.9938 - f1-score: 0.9951SOB tp: 1959 - fp: 10 - fn: 10 - precision: 0.9949 - recall: 0.9949 - f1-score: 0.9949SWEATS tp: 271 - fp: 0 - fn: 1 - precision: 1.0000 - recall: 0.9963 - f1-score: 0.9982TASTE_SMELL tp: 8 - fp: 0 - fn: 6 - precision: 1.0000 - recall: 0.5714 - f1-score: 0.7273THROAT tp: 1030 - fp: 11 - fn: 2 - precision: 0.9894 - recall: 0.9981 - f1-score: 0.9937WHEEZING tp: 3137 - fp: 6 - fn: 0 - precision: 0.9981 - recall: 1.0000 - f1-score: 0.9990
假设我们在弱监督的、基于规则的数据集上训练了一个 transformer 语言模型,人们可能会合理地问,“为什么不在生产中使用基于规则的方法?”然而,考虑到 transformer 语言模型(如 BERT)使用子词标记和上下文特定的向量,我们训练的模型可以识别基于规则的模式文件中未指定的症状,并且还可以正确识别我们感兴趣的实体的拼写错误版本(例如,它正确地将“cuogh”识别为[咳嗽])。
由于临床自由文本笔记中的丰富数据和临床笔记注释的逻辑挑战,医疗保健 NLP 的一个非常实用的方法是迁移学习和弱监督。
K-Means 类的亲密接触
实践教程
用聚类算法分割史蒂芬·斯皮尔伯格的电影
场景 1:为电影集群搭建舞台
“不管是成功还是失败,我都为自己执导的每一部电影感到骄傲。”
史蒂文·斯皮尔伯格
职业生涯跨越近 60 年;据《时代》杂志报道,电影制作人史蒂文·斯皮尔伯格凭借《大白鲨》一炮走红,使 1975 年成为“鲨鱼的夏天”。从那以后,他不断地将自己和观众推出舒适区,建立了一份无人能及的遗产。正如《滚石》杂志(Rolling Stone)的 Bilge Ebiri 所指出的,斯皮尔伯格“总是在大片和更严肃的作品之间徘徊”,他的电影跨越了多个流派。一路走来,他获得了 18 项奥斯卡提名,找到了一种赢得评论界和商业赞誉的方法,因为他的 30 多部电影在国内票房收入超过 100 亿美元(经通胀调整后)。他似乎也没有慢下来;快速浏览一下他的 IMDB 页面,暗示他可能正在努力导演下一部大片。
试图对这位可能是有史以来最著名的电影导演的电影作品进行分类或细分并不是一件简单的任务。但是让我们试一试。一个简单的时间顺序列表或类型分类就足够了,但如果我们采取一种更数据驱动的方法,通过评估多种电影属性,在斯皮尔伯格电影集中潜在地浮现潜在的模式或主题,会怎么样?
场景 2: K 均值聚类概述
无监督学习指的是当没有每个数据点的标签、类或类别的明确标识时,试图提取意义的模型。聚类是一种无监督的学习方法,它将未标记的数据分组,以帮助我们更好地理解数据集中的模式。聚类是广泛使用的推荐引擎的关键组成部分,这些引擎嵌入到亚马逊、网飞和许多其他人每天都在使用的产品中。虽然我们将在这里使用聚类作为非常简单的电影建议工具的构建块,但是其他应用包括:
个性化营销- 利用客户数据库中的人口统计数据,营销人员可以对不同类型的用户进行分组,并为他们提供更合适的产品或个性化活动。知道这个群体中的人喜欢“x”(而不是“y”),可以减少浪费的广告支出,同时提高活动转化率。
异常检测- 异常是数据集中偏离共同趋势或模式的数据点。结合 K-Means 聚类的视觉特性,可以设置预定的阈值或边界距离来帮助观察和隔离偏离包的离群值。
文件缩减/图像压缩 -数字图像由像素组成,每个像素的大小为 3 字节(RBG),每个字节的值从 0 到 255,导致每个像素有大量的颜色组合。K-Means 可应用于图像文件,将相似或相似的颜色分组,以创建文件大小减小但图像仍可解读的新版本。例如,代替包含 200 种颜色的狗的图像,K-均值聚类也许可以仅使用 10 种颜色来呈现图像,而不会显著降低图像的视觉特性。
存在多种聚类算法;您试图解决的问题以及您所掌握的数据通常会决定采用哪种方法。K-Means 聚类是最广泛使用的方法之一,它试图通过创建一定数量的聚类来对未标记的数据进行分类,如字母“k”所定义的。该算法确定适当的聚类,并根据每个数据点到质心的接近度(或相似度)将每个数据点分配给一个聚类,质心是聚类中心的别称。值得注意的是,K-Means 并不确保每个聚类都具有相同的大小,而是专注于识别最适合分离和分组的聚类。
K-Means 聚类通常被认为是一种“划分”技术,与其他聚类方法相比,它有几个优点。首先,这相当简单:告诉模型您想要多少个组,并将所有数据点分配给适当的组。这种简单性使它即使在非常大的数据集上也能快速运行。此外,它的流行导致了 Python 中大量的开源资源和相关库——我们将在后面探讨。
而 K-Means 聚类使用起来相对简单,并且可以很好地适应大型数据集;这种方法伴随着一些缺点。K-Means 聚类需要严格的数字数据,这可能需要根据可用的数据集准备一些数据。此外,该算法可能对异常值非常敏感。此外,K-Means 不能随着维数或变量的增加而很好地扩展;我们将看到两个甚至三个变量是如何很好地适用于这种技术的,但是超出这个范围会给解释带来困难。幸运的是,像主成分分析(PCA) 这样的降维技术与 K-Means 配合得很好。
解释是任何 K 均值聚类练习中最重要的步骤;正如道恩·雅各布奇在她的教科书 营销模型 中所写的,“一旦集群被衍生出来,我们必须理解它们。”对聚类输出的正确分析应揭示现有问题的答案,并产生关于数据集的新问题。聚类的大小、位置和数量都是潜在的有用线索,可以为下一步的分析提供信息。
场景 3:分解算法
K 均值聚类算法的过程可以分为几个步骤:
第一步(初始化)——首先,我们需要决定我们想要多少个簇(以及质心)。这一步既可以随机完成,也可以通过肘方法通知,这将在后面解释。我们将告诉模型选择“K”个随机点作为我们的初始质心。
第 2 步(分配)—算法然后将每个数据点分配到通过平方距离测量的最近质心。
步骤 3 (重新计算)——然后通过取当前分配给该聚类的所有数据点的平均值来重新计算或调整质心。
步骤 2 和 3 的迭代继续进行,直到不需要进行新的最佳重新分配,并且所有数据点都位于其数据与它们自己的数据最相似的聚类中。本质上,该算法寻求继续迭代,并最小化误差平方和(SSE)作为聚类性能的度量。这个迭代过程通过最小化簇内的可变性和最大化簇之间的可变性展示了“像数据点一样分组”的思想。
当在步骤 1 中随机选择质心位置时,K-Means 可以在算法的连续运行中返回不同的结果。为了克服这个限制,该算法可以运行多次,并最终提供基于 SSE 的最佳结果。
图:K-Means 收敛的 GIF(来源
场景 4:读入和浏览数据
虽然 R 对于这种类型的分析是完全合适的工具,但是我们将使用 Python,因为它可以访问有用的 K-Means 方法以及强大的绘图功能。在加载我们的数据来分析并最终推荐斯皮尔伯格电影之前,我们将导入 K-Means 所需的库以及其他一些用于后续绘制的库,同时也导入我们的数据集。
图:前五个观察值或我们数据集的“头”(图片由作者提供)
我综合了几个不同来源的数据——IMBD、烂番茄和数字——收集了一系列斯皮尔伯格担任导演的电影,以及每部电影的相关变量,如年份、片名、电影评分、国内票房表现(经通胀调整)和电影时长。如上所述,K-Means 聚类需要所有数值数据;幸运的是,这里就是这种情况,所以我们不需要转换数据集。(查看我的上一篇文章以了解关于数据清理和准备的价值的更多细节,以及本指南关于特定于集群的数据准备工作)。
配对图是快速探索数据集中分布和关系的有用工具。我们将使用。seaborn 库中的 pairplot 函数,只需一行代码,我们就可以了解数字变量(BoxOffice、TomatoMeter 和 Duration)之间的关系。不出所料,我们注意到票房和票房之间微弱但正相关,表明影评人和付费电影观众在谈到斯皮尔伯格电影时有一些共同的态度。
图:数据集的配对图(图片由作者提供)
可视化我们的数据有助于快速了解其形状、分布和对称性。除了散点图之外。pairplot 方法还提供了变量的直方图。displot 方法也可以用来实现这一点)。我们注意到两者都有一些尾部,电影票房呈左偏分布,票房略偏右。假设变量是正的,可以用对数变换来消除偏斜。出于本练习的目的,并且考虑到我们的数据集相对较小,偏斜度也相当小,我们将在本例中暂停运行该转换,但了解这一点还是有好处的。
最后,让我们使用图形库 plotly 来创建一个交互式散点图,显示根据我们感兴趣的两个变量(烂番茄和票房)绘制的电影。
图:通过 plotly 制作的数据集交互式散点图(图片由作者提供)
如上所述,K-Means 对数据集中的异常值非常敏感。在运行 K-Means 算法之前删除这些点是明智的,但是考虑到没有主要的异常值和相对较小的数据集,我们将跳过这一步。
场景 5: 确定聚类数
当基于数据的预定数量的聚类不明显时,我们求助于肘方法,这是一种帮助确定适当数量的聚类的统计方法。回想一下,聚类旨在定义聚类,以使总的类内变化(通过从点到质心的距离来测量,也称为 WCSS 或类内平方和)最小化。自然,群集数量的增加与误差成反比关系;更多的聚类为我们的数据中的观察提供了更多的选项,以找到相似的组来加入。然而,添加越来越多的集群会产生较小的增量增益,并可能导致“过拟合”的例子。肘方法帮助我们在过多和过少的集群之间找到适当的平衡。
肘法也为这一努力增加了视觉元素。肘形图将显示每个 K 值的 WCSS 值,代表聚类总数。我们开始看到收益递减的点,有时看起来像肘关节,可以被认为是 k 值的一个很好的候选点。
图:帮助确定适当集群数量的“肘方法”图(图片由作者提供)
看起来我们理想的集群数量是三个!在确定用于分析的聚类数量时,没有硬性规定;因此,诸如“这些集群是可解释的吗?”或者“它们被新数据复制的可能性有多大?”将有助于做出最终决定。肘方法的正确应用是一个很好的例子,说明数据分析需要艺术和科学的独特融合。
场景六:运用&解读 K-Means
虽然对数据的未缩放版本和缩放版本运行 K-Means 通常是最佳实践,但为了简单起见,我们将坚持在数据集的未缩放版本上运行该算法,同时保持变量及其相对缩放的可解释性。我们可以从 sci-kit learn 的集群模块中运行 k_means()函数,使得 K-Means 的实现相对简单。
图:K-Means 结果的第一个视图(图片由作者提供)
这是我们第一次看到我们的集群数据!但是我们的工作还远远没有结束。正如精彩的教材《Python for Marketing and Research Analytics》中提到的那样,“细分项目中最关键的问题是业务方面:结果对手头的目的有用吗?”
回想一下识别斯皮尔伯格导演的电影的独特分组的初衷,我们可以求助于 Python 来帮助我们识别与上述情节匹配的其他拼图(同时也使用一些简单的技巧来帮助增强图形本身)。例如,我们将使用。countplot 方法来了解每个集群的相对大小,同时将它们分配给数字分组。
图:结果。展示聚类大小的计数图方法(图片由作者提供)
不平衡的聚类通常表示远处的异常值或一组非常不相似的数据点,这将保证进一步的调查。通过浏览上面的图表,我们可以看到《第二集》确实因其相对较小的尺寸而显得突出——即使对于可以说是有史以来最伟大的导演来说,创作一部观众和评论家都非常崇拜的电影仍然很难做到!鉴于这一组中的三部电影取得了票房和关键成功的理想平衡,如果我们能够超越坐在导演椅上的人来识别这三部电影之间的相似之处,那当然值得一看。
计算质心的汇总统计数据有助于回答“是什么使这个星团独一无二?”我们将在这里添加回持续时间变量,看看是否可以帮助打开一些新的见解。
图:显示了所有三个集群中相关变量的平均值(图片由作者提供)
我们还将创建一个蛇形图,以便我们能够以一种更直观的方式查看每个集群中感兴趣的变量之间的变化。这将需要我们的数据集以及集群的规范化版本。熊猫。melt 方法将规范化的数据帧重新排列成适当的布局。
图:蛇情节结果(图片作者)
我们可以看到,该图提供了一个有用的可视化表示,显示了所生成的聚类在不同的感兴趣属性之间的差异。例如,这三个集群之间最明显的区别似乎是 BoxOffice 变量。让我们把上面的 K-Means 散点图带回来,用一些有用的注释把所有的东西放在一起。
图:带注释的 K-Means 结果的更新视图(图片由作者提供)
当组合在一起时,聚类平均值、蛇形图和 K-Means 可视化可以帮助启发一些合适的名称来帮助我们描绘我们的聚类。红色的簇 0 可能是“一个混合包”。虽然这些电影都没有打破票房纪录,但它包含了广泛的番茄米评级。绿色的集群 1 可能是“强有力的竞争者”集群,代表除了《侏罗纪公园 2》之外最受评论家喜欢的电影,并且在票房上表现相当好。最后,我们可以称较小的黄色星团 2 为“最好的”。如果你必须为你的电影爱好者朋友策划一个斯蒂芬·斯皮尔伯格入门包,这个小组将是一个很好的开始。
让我印象深刻的是斯皮尔伯格执导的高质量、高评价电影的惊人比例。考虑到 2019 年电影的平均评分为 59.3,斯皮尔伯格的电影平均得分高达 78。当我们看持续时间时,另一个有趣的收获出现了,这个变量包含在 snake 图和汇总统计图表中,但不在我们的 K-Means 算法中。时长和票房之间的反比和明显关系引发了一个问题,即删减一些场景或对白是否会给斯皮尔伯格的下一系列电影带来更大的商业成功。
请记住,考虑将聚类分析的输出结果与您试图回答的最终业务目标或问题联系起来是非常重要的。一天结束时,聚类输出只是数据点的组分配向量,由数据分析师来决定如何或是否讲述一个有见地的故事!
场景 7:限制、未来研究、额外资源和最终想法
正如我们上面提到的,我们在这里工作的数据集在观察数量和变量数量上都相对较小。编码电影相关的分类变量,如类型或美国电影协会评级,将是一种潜在的表面有趣的模式,并加强我们的电影建议的努力。此外,将我们的方法与时间序列分析结合起来,看看斯皮尔伯格电影这些年来是如何变化的,这是未来研究的另一条途径。在方法上;在这次讨论中,我们仅仅触及了集群技术的皮毛。其他方法,如层次聚类——以及称之为“树状图”的乐趣——有助于确定哪两个数据点最相似(或不相似)。虽然 k-means 方法在分析数据集的方法中具有全局性质,但分层可以根据我们所掌握的变量,得出关于哪些斯皮尔伯格电影最相似的有趣见解。
如果你想了解更多关于这个主题的内容,或者查看更多聚类算法的例子,我在下面列出了我在研究和撰写这篇文章的过程中遇到的一系列有用的 K-Means 聚类文章和教程:
- Ben Alex Keen—K-Means Python 中的聚类
- 阿曼达·多宾——数据科学专家
- 真正的 Python——Python 中的 K-Means 集群:实用指南
- 方差解释— K 均值聚类不是免费的午餐
- Oracle AI &数据科学博客—K 均值聚类简介
虽然我不认为我们非常简单的推荐模型会很快从网飞偷走订户,但希望 K-Means 聚类的高层次概述有助于展示 Python 及其相关功能的简单方面如何从数据集揭示独特的见解和模式,并帮助一些最广泛使用的推荐引擎。
弥合人工智能价值差距第 2 部分:人工智能与自适应分析的共同创造
让你的人工智能产品与人合作来实现他们的目标
图像来源:最大像素
在之前的一篇帖子中,我介绍了一个概念,即人工智能不会实现分析师预测的大规模财务影响。这是因为它预计“解决”(通过规定分析)的大多数问题本质上都很复杂,因此很难使用静态系统来解决。像强化学习这样的技术正在朝着构建适应不断变化的条件的系统取得进展(并且自从我发表关于这个主题的第一篇文章以来,已经取得了的进展),但是它们仍然需要问题的健壮模拟或者十亿用户规模的数据库。
幸运的是,另一个进步领域是增强人工智能或“人在回路中”人工智能。在这篇文章中,我将充实自适应分析的思想,它将重点放在每个过程中与人类一起学习,以便合作解决复杂的问题。
从接受人类会帮忙开始
构建人在回路中的自适应人工智能系统的过程将看起来不同于传统的人工智能开发过程。你的团队必须从设想一个未来的状态开始,在这个状态中,一个系统集成到业务或整个世界中来解决一个问题,在这个过程中真正地与人们协作。
当人工智能代理与人类合作者交互时,人工智能共同创造发生,人类合作者逐渐向代理提供更多信息。两者一起工作来发现和优化一个目标。
这增加了设计过程的复杂性,目标是在交付的结果中弥补这一点。我发现使用 Clayton Christensen 的 与运气 中介绍的技术,并在随后的待做的工作文献中进一步扩展,在这里是有帮助的。这涉及到一系列与规定性模型本身无关的问题:
图片作者。
今天谁参与了解决这个问题?他们扮演什么角色?
- 他们使用该系统的动机是什么?更广义地说?
- 这一过程中固有的社会制度是什么
- 你如何在不打断他们的情况下获得他们的反馈?
关于要做的工作,你有很多可以读的,在工作地图上有一个完整的框架。有了对系统中涉众的多方面目标的初步了解,您就可以开始开发一个与他们协作的系统。
接下来,使用体验设计技术来产生共鸣
适应性分析项目将从体验设计社区的技术开始。像 Ideo 的方法卡这样的技术在这里会很有帮助:
**学习:**活动分析,亲和图,流量分析
**看:**生活中的一天,墙上的苍蝇,延时录像
**提问:**叙述、认知图、五个为什么、调查&问卷
**尝试:**纸上原型,明年头条,角色扮演
反复了解利益相关者的目标
如果你只是简单地问利益相关者他们需要什么,最常见的回答是:“我不知道”。大多数人并不真正知道他们的确切目标,只是知道他们会随着时间的推移而明白。这意味着构建一个自适应的人工智能系统必须通过捕捉额外的信息,随着时间的推移不断地学习他们的目标。在上一篇文章中,我介绍了 4 种不同的反馈循环,可以发现和跟踪目标,使利益相关者的目标随着时间的推移而改变,这样你实际上仍然在帮助他们实现积极的结果。你追求的确切目标可能会有一点点变化,而你为实现目标所使用的方法肯定会改变。
构建适应能力:反馈回路
如果您接受最佳解决方案会随着时间的推移而改变,并且问题也可能会改变,那么您的系统必须衡量这些变化以真正优化。在您的系统中构建反馈回路,可以在多个层面上实现这种测量和调整。有了这些,让我们来详细看看 4 个反馈回路。
交互式循环
作者图片
中间最短的一个:交互循环。
你可以想象在本系列第 1 部分中描述的 Gong.io 系统询问为什么销售人员在电话中的某个特定点忽略或接受他们的建议(可能是建议改变语气或从介绍转到演示)。这种反应为他们提供了更多的信息,我可以在下一次互动中直接使用这些信息来帮助做出更好的推荐,或者至少是更个性化的推荐。像多臂盗匪这样的在线学习系统是代理从用户动作中学习的很好的例子。
自动循环
作者图片
移出一个,有一个自动循环,使新模型的再训练能够利用整个系统的所有交互。为了实现这个循环,应该在边缘收集所有的交互数据和尽可能多的上下文数据。然后需要对其进行聚合,并在数据湖中存储一个有代表性的集合。如果你有兴趣了解更多关于这个过程的信息,请看我关于雾计算架构的演讲。从那里,系统可以使用 MLOps 原则训练一组更好的全球模型。
分析回路
作者图片
下一个循环是对您正在获取的数据和/或向您的合作者提出建议的方式进行更改。
继续我们的销售代理支持示例:将净推销商得分调查数据与销售过程中了解到的细节联系起来,有助于了解客户对通话过程的感受。此外,如果销售人员提供反馈,说明他们不接受系统建议的原因是因为他们没有看到,系统开发团队可以改变向用户提供结果的方式。例如,如果视频聊天占据了电脑的整个屏幕,一种解决方案是将提醒推送到手机上,销售人员可以将手机放在屏幕旁边。
这个循环的关键是分析是离线进行的**,改进不仅限于模型本身,而是可以在整个系统中进行。**
补偿器
作者图片
**最后一个循环是关于扩展系统所覆盖的问题部分。这种情况通常通过传统的设计技术发生,人们在人工实验室环境中观察系统的使用。有了现在可用的技术,你可以捕捉一些同样的信息,但是要在大范围内进行。通过利用系统使用的视频记录,您最终能够扩展一些设计社区技术,而不需要手动合成数据。通过数字化这些过程,你可以改进你的系统的下一个版本。
循环过程如下:**
- 和你一起工作的合作者会告诉你一些事情,你会考虑这些数据并提出不同的建议。这个过程会重复很多次。
- 接下来,通过捕获数据并通过基于云的系统运行它来训练新的模型,你可以为你正在工作的每个人或小组制作正确的模型,并将这些模型推回到系统中。
- 在分析循环中,您与开发团队合作,自动执行不同类型的数据捕获,并让数据科学家探索和分析这些数据,以开发新的更好的模型,并将这些数据加入到现有的集合中。此外,团队开始改变用户体验,以最大化模型的每个合作者的有效性(就像你把消息推回给人们的方式)。
- 最后,最外层的扩展环包括手动捕获数据,这些数据可能永远不会直接包含在模型构建中,但旨在为人们提供所需的洞察力,以便调整正在解决的系统级问题。这使得麦肯锡在其文章中指出的业务层面财务指标得以优化。
所有 4 个循环必须协同工作,以消除 AI 值差距。图片作者。
没有这 4 个循环的协同工作,人工智能的价值差距将会持续。然而,根据我的经验,大多数数据团队都狭隘地关注交互式和自动化循环。实现更广阔的愿景需要跨数据、经验、产品设计和业务架构团队的协作。在下一篇文章中,我们将为刚刚开始开发自适应人工智能系统的组织提供一个框架和路线图。
本系列的更多内容:
弥合人工智能价值差距第 3 部分:构建自适应分析的路线图
实现自适应分析解决方案需要建立信任,这对人工智能系统来说并不容易。这个路线图会有所帮助。
自适应人工智能系统的创建并不像将反馈回路放置到位那么简单。人类的复杂性是一个挑战。图片来源:维基媒体
在第二部分中,我充实了实现自适应分析系统的 4 个反馈回路:交互、自动化、分析和扩展,以及它们如何共同工作来创建一个协作的人工智能,该人工智能适应每个人,并随着时间的推移不断改进以更好地解决问题。
然而,这些帖子只触及了创造自适应人工智能解决方案背后的理论,以及它们如何弥合复杂问题的人工智能价值差距。在本帖中,我将带您了解一种实用的方法,来构建为您的组织构建自适应分析产品的计划。
挑战:建立信任
自动化和分析性反馈之间的信任墙。图片作者。
当一个组织试图采用适应性分析时,他们不能简单地说“这些是反馈循环,开始!”并得到一个功能性的自适应 AI 系统。相反,他们必须小心地从最初的系统扩展,随着时间的推移,以赢得合作者信任的方式利用其他形式的反馈(即,在循环中的人,称他们为合作者有助于获得正确的心态)。当向合作者索取更多信息而不提供任何回报时,只注重改进功能系统的简单路径会很快碰壁。当从自动化进入分析反馈循环时,就会出现这种情况。
介绍自适应分析路线图
重新审视我们合作者的 JTBD 需求将使我们能够超越信任之墙。作者图片
为了避免这个问题,我们必须记住,建立信任需要认识到合作者是一个人,这带来了一系列的复杂性。换句话说,就像我在上一篇文章中提到的,我们必须支持合作者要完成的全部工作。为了建立一个使这成为可能的系统,我们必须随着时间的推移发展适应性人工智能系统,允许合作建立信任的基线。更具体地说,我们需要定义一系列计划来解决适应性人工智能系统合作者的功能、社会和情感需求。
一个自适应分析反馈框架,解决了合作者的全部 JTBD。图片作者。
在本帖中,我们将探讨上述自适应分析框架,该框架提供了一个建议的行动,以涵盖合作者在所有 4 个反馈循环中的功能、个人和社会需求。在该框架的指导下,一个组织将通过在反馈过程中扩展来解决个人和社会需求,从而绕过信任墙。你可能会发现这个框架看起来有点像棋盘游戏。在应用这个框架的过程中,我发现有一些“棋盘上的棋”可以走向成功。
开始功能:收集和利用反馈
自适应分析解决方案的主要功能是收集和分析反馈,以随着时间的推移改进系统(从而改进其交付的结果)。这个过程通常从在已部署的系统中建立交互式反馈开始,它可以是被动的(让合作者忽略您的推荐者提出的建议)或主动的(提供多个选择并让合作者选择)。当系统收集所采取的行动和这些行动的结果时,可以在自动反馈循环中利用它们来改进构成系统核心的预测和规定模型。然而,正如我们之前所讨论的,只有当合作者愿意与你分享更多信息时,从自动化到分析性反馈的步骤才是可能的,而这需要信任。
避开信任墙:通过提供配置转向个人
要继续,您必须与个人合作者建立信任。这最好在个人层面上实现,让他们感觉自己是合作者,而不是系统用户。我最近听了一个演讲,演讲人说得很好:**
不幸的是,相对于让人类为技术工作而言,并没有激励技术为人类工作。~Rohan D’Souza: 利用 Olive 改善人类的医疗保健体验
这意味着你必须开始了解你的系统内的合作者的更广泛的目标。最简单的方法是,当他们忽略系统动作时,通过提供直接反馈,允许他们指定自己的目标,但也有更微妙的方法来实现这一点。
首先,你可以让系统决定你的系统人工智能模型以前没有遇到的场景何时发生。通过使用异常检测技术或置信区间,系统可以基于当前上下文检测何时没有正常推荐会被强烈推荐。如果模型在某个时间点对任何推荐只有 30%的信心,那么你可能已经发现了一个新的场景,你的产品现在可能没有得到很好的服务。您可以更改这些场景的体验,以收集更多反馈。这将感觉更具协作性,因为系统已经交互地发现它需要更多信息,并协作地要求额外的上下文。在某种程度上,这类似于团队成员表现出的脆弱性对团队建设的影响。
在我们的销售支持系统示例中,这可能是检测到对话已经转移到几乎没有培训数据的主题(可能是解决当前产品组合中常见差距的路线图上的新产品)。如果没有这个自适应步骤,AI 可能会将此标记为不正确的信息,并警告销售主管。有了这个,系统可以将它标记为潜在的误导和潜在的新主题。如果系统随后提示讨论该主题的销售人员/销售主管提供更多信息,它可以帮助更快地将该主题添加到模型中。销售团队也会觉得自己有所贡献,未来会更愿意提供帮助,从而侵蚀信任墙。
第二,对于那些根据合作者的偏好有多种“正确的”方法来解决问题的场景,最好允许他们明确地选择一个建议而不是另一个。同样,这里最佳的信任建立体验将检测到合作者在特定的上下文中偏好特定的选择,并提示他们选择该选项作为默认选项(或者更好的是,将其设置为默认选项,并允许他们轻松撤销该设置)。一个很好的例子是 Waze 这样的驾驶应用程序检测到司机更喜欢一条更安全的路线,这条路线可能比那些让他们在繁忙的道路上左转的路线花费的时间略长。这项技术是对上述异常检测方法的补充,因为新发现的场景可能是原始建议的可配置替代方案。
一旦你创建了一个系统来学习更多关于合作者的目标,你将如何帮助那个人或团队实现他们的目标?通过改变合作者对建议的体验,这进入了个人层面的分析循环。在上一篇文章中,我提到改变推荐交付的设备或位置是这种技术的一个例子。另一个方法是改变正在使用的语言,潜在地采用一种多臂强盗的方法来为这个合作者学习最有效的语言。或者,你可以提供额外的背景信息,说明为什么推荐更容易获取。这个清单可以很容易地继续下去,因为有一整个领域的经验设计。虽然有许多方法可以实现 CX 建议,但是理解正确的方法需要每个合作者投入时间,这反过来需要信任。到目前为止,可能已经建立了足够的信任,但情况并非总是如此。迈出社会需求的最后一步会有所帮助。
社交:建立一个社区来培养合作精神
进入分析反馈循环的两条途径。图片作者。
下一层(我认为这一层真的被忽视了很多)是系统现在提供的社区建设方面。因为您正在寻找许多不同的方式来为不同的人个性化不同的模型,并且您还在捕捉他们与系统交互的方式以在个人层面上帮助他们,所以您可以通过发现行为相似的人群并将他们分组到社区来添加社交组件。
使用我们运行的例子,如果你有一组销售人员,你发现他们总是追求高接触的个人关系风格,而另一组则专注于展示他们销售的产品如何真正满足客户的业务目标。这是一个发现这些社区的分析反馈循环活动,因为分析并不用于直接改进模型本身。
一旦发现社区,您可以通过自动反馈循环返回,通过 collaborator 社区对您的模型培训进行细分来解决社交需求,collaborator 社区将培训单独的模型,以提出最符合社区风格的建议。您可以通过直接记录和建议同一社区中的合作者采取的新行动,利用在线学习方法来确定这些行动是否会带来更好的结果,从而进一步增加这种方法的交互性。
从协作者社区开始,通过分析循环中的个人需求往回移动,您可以设置由社区成员组成的焦点小组。他们将更愿意与分享他们经验的人分享见解,而不是与经验设计团队分享,从而打破最后的信任墙。然后,您可以使用这些见解来改善协作者体验,就像我们在引入社交需求层之前讨论的那样。
在这一点上,您的合作者很可能愿意分享更多的数据,使您能够更好地理解问题空间,并克服性能停滞。例如,通过让合作者的公司分享客户终身价值售后信息,您可以开始优化销售流程,以最大化长期回报,而不是二元销售/不销售指标。在我们的驾驶应用程序示例中,您可以访问合作者的日历,以建议优化他们的时间表,从而最大限度地减少驾驶时间。
利用社区检测来释放社会需求和分析反馈回路。图片作者。
进入体验式循环扩大了交付的价值
获取这些新信息为系统提供了扩展目标的第一次机会。系统可以尝试优化整个销售团队的绩效,而不仅仅是查看销售人员的绩效。根据与客户的最初几次互动,谁是该交易的最佳销售人员?可能会有更好的销售风格,因此系统可以向销售领导推荐理想的风格匹配,而不是仅仅试图帮助一个人。这给了我们进入体验式循环的第一步,从整体上改变了产品与合作者互动的方式。它还极大地提高了可能的优化水平,缩小了 AI 值的差距。
在个人层面,该系统可以通过构建 API 经济或插件模型扩展到一个生态系统中,在该模型中,您的合作者可以自己构建模块来补充该系统并针对其特定场景对其进行改进。这些可以在其他合作者之间重复使用,以在你的自适应人工智能系统之上创建一个产品生态系统。利用合作者的这些直接贡献可以扩大体验循环。
在社交层面,您必须了解协作者社区,以创建社区参与战略,将他们联系在一起,帮助他们互相帮助,提高他们对系统的使用。例如,如果合作者彼此离得很近,举办活动让这些人聚在一起谈论他们对产品的使用。通过添加这一层,您不仅投资于提高您的采用率,而且还帮助这些人相互协作。
指导自适应人工智能系统设计的自适应分析框架的完整步骤。图片作者。
从框架到路线图,快速入门
即使遵循本文中介绍的自适应分析框架,也可能感觉有很多复杂性。的确,这些是很难解决的问题,接受它们并不是出于真心。然而,我非常强烈地感觉到,任何一个团队,如果希望开始自适应分析,但不了解如何*,可以遵循一套规定的步骤开始旅程。这一系列步骤形成了一个路线图,走过曲折的道路,到达您的组织可以开始执行一系列计划以帮助缩小人工智能价值差距(并获得您的 1T+美元收益)的点。*
开始适应性分析并缩小人工智能价值差距的路线图。图片作者。
路线图中的阶段包括:
- 首先确定您想要追求的高价值适应性用例。对于这一点,我们可以从我在第一篇文章中用来量化 AI 价值差距的麦肯锡确定的行业用例开始。
- 下一步是为你的合作者确定真正的目标。在这里,您可以利用来自待完成工作、工作地图和设计思维的技术。你带来了真正的客户,并在你的组织内的一些必须一起工作的筒仓之间架起了桥梁,并帮助他们通过他们的合作者的观点来理解问题。
- 这将帮助我们确定每个初始反馈循环的具体形式。自适应的、自动化的、分析的和经验的循环将基于用例的细节看起来非常不同。
- 从那里,我们可以利用自适应分析框架来生成特定的计划和工作流,以构建系统的 MVP。
- 在这一点上,我们必须找到合适的技术来实现这一自适应分析愿景,以便我们能够分配资源、评估工作并开始实施。这将是本系列第四篇也是最后一篇文章的主题。
像往常一样,我把这些文章放在这里,激发一些想法,开始一场对话。请不要犹豫,直接联系我们或回复我们。感谢阅读!
用于对 NoSQL 的层次结构建模的闭包表模式
理解大数据,大数据建模模式
如何利用关系世界的最佳实践在 NoSQL 建立层级模型
介绍
有时我们会遇到这样的情况,当我们需要对不同复杂程度的层次结构进行建模时,却不确定如何以最有效、最可靠和最灵活的方式正确地完成这一任务。让我们回顾一下为我们提供一些答案的数据建模模式。
问题陈述
假设我们有一个深度参差不齐的层次结构,如下图所示:
作者图片
从功能的角度来看,我们需要涵盖以下主要情况:
查询层级:
- 查询一个子树,最好达到一定的深度级别,像直接下级以及达到一定级别的后代
- 查询该节点的所有祖先
修改层次结构:
- 添加/删除层次结构中的节点
- 更改层次结构的布局—将子树从一个位置移动到另一个位置(从一个父节点移动到另一个父节点)
物联网商业案例驱动的高级需求:
- 高效管理****森林—大量的树,每棵树的节点数和最大深度不一定很大,但树的数量可以增长到几十万甚至上百万
- 管理进入短期关系的树的节点。因此,有必要跟踪实际关系发生的时间段。
要使用的核心模式
我们也可以利用关系世界中的一些模式来研究 NoSQL。让我们考虑一下闭包表,它通常被低估,但却有很多优点,特别是:
- 高效的子树查询
- 管理短期关系的可能性
- 存储改变关系的历史
闭包表模式
根据闭包表模式,除了具有适当属性列表的主实体之外,我们还有一个附加实体,用于存储各个项目之间的层次关系。
例如,如果我们有一个雇员的从属层次结构,我们将有一个包含雇员信息的实体和一个专门存储从属关系的闭包表:
作者图片
该模式的主要构建块是一个额外的结构(表),用于保存树关系——从祖先到后代的每条路径的一组节点对,包括到自身的路径:
作者图片
基本结构可以扩展到有效地覆盖与子树选择的有限深度相关的更复杂的场景;找到所有的树叶;树根和有效时间范围:
作者图片
关于如何使用这种结构的更多细节包含在两篇好文章中。一个很好的例子就是这里的。
NoSQL 的闭包表实现
NoSQL 很大,让我们考虑两个 NoSQL 存储——Cassandra 和 MongoDB 作为 NoSQL 世界的两个很好的代表,它们是列族和面向文档的存储。
因为我们考虑 NoSQL,我们需要遵循它的建模哲学:有一个清晰和狭窄的用例,以更准确地使用模型。
物联网用例描述
输入:
- 有大量的边缘设备,产生遥测数据。
- 边缘设备在工作会话范围内工作;
- 在每次会议期间,他们形成一个关系层次
查询需求:
对于特定时间范围(特定会话 id)和特定边缘设备:
Q1 :读取设备子树(其下属设备列表以及它们之间的关系)
Q2 :读取设备的遥测数据以及所有下属设备的遥测数据
卡桑德拉溶液
为了实施上述物联网用例,提出了以下 Cassandra 数据模型(Chebotko 图):
作者图片
这里,边缘连接表起到了封闭表的作用,并存储了层次关系,而边缘遥测保存遥测数据本身。
边连接表可以用来有效地回答 Q1 查询。回答了 Q1 问题之后,我们就可以有效地回答 Q2 问题了。以便这两个查询都被这两个实体有效地覆盖。
看看链接后面的示例代码片段。
MongoDB 解决方案
使用同样的方法,我们可以在 Mongo 上创建一个平面集合。在这里,我们可以利用设备祖先 id、会话 id 和距离字段的复合索引,如下所示:
祖先查询注意事项
所描述的解决方案很好地涵盖了上述确切的物联网用例,但是如果我们想要查询特定节点的祖先列表而不是子树,我们将需要通过新对象来扩展模型:
- 对于 Cassandra,我们需要引入并正确维护另一个边连接(反转)表,该表具有相同的属性列表,但键的配置不同(交换了
device_ancestor_id
和device_descendant_id
) - 对于 MongoDB,我们需要另一个索引:
db.edge_connection.createIndex({device_descendant_id:1, session_id:1, distance:1})
修改层次结构
上面描述的方法展示了在 Cassandra 和 Mongo 上实现的数据模型如何满足查询树的主要需求。但是层次结构的修改呢?
嗯,首先,现有的层次结构修改是完全可能的,它只是需要一些逻辑来实现(超出了本文的范围,但你可以谷歌一下)。
另一方面,在我们的物联网用例中,我们假设不需要修改:一旦树在会话范围内形成,它的结构将在会话结束前保持不变。并且节点的新组合在新会话的范围内形成树。
结论
在文章中,描述了闭包表模式如何在 Cassandra 和 MongoDB 等 NoSQL 存储上有效地实现。
还有其他模式可以用来建模层次结构,它们将在下一篇博客文章中描述。敬请期待:)
浓缩咖啡用滤布
咖啡数据科学
超越纸过滤器;高级论文理论第四部分
在过去两年多的时间里,纸质过滤器一直是整个浓缩咖啡社区的一个有趣的实验。我记录了一些实验来帮助理解它们是如何运作的。这项特殊的工作开始比较漂白和未漂白的纸过滤器,但它把一个急转弯变成了布过滤器。
所有图片由作者提供
在试验纸质过滤器时,我最终试验了布料过滤器。我在一个视频中受到了詹姆斯·霍夫曼的影响,这个视频讲述了如何使用布料过滤器进行倾倒。今年夏天我的前几个实验没有引起我的注意,部分原因是因为其他一些变量无处不在。
左边:一个未切割的新布过滤器。右边:被切到一边用了十次之后。
然而这一次,一切都在掌控之中,我被吹走了。这一枪打得又快又准。最好的部分是布过滤器也更容易清洗!
我所有的镜头都是劈烤、断奏捣实镜头,中间是布滤片,底部是布或纸滤片。我也使用压力脉冲来拍摄我所有的照片。
镜头性能指标
我将这些定义放在这里,因为在这一节之后,我将使用这些指标评估不同数量的纸质过滤器。
最终得分是 7 个指标(强烈、浓郁、糖浆、甜味、酸味、苦味和余味)记分卡的平均值。当然,这些分数是主观的,但它们符合我的口味,帮助我提高了我的拍摄水平。分数有一些变化。我的目标是保持每个指标的一致性,但有时粒度很难,会影响最终得分。
使用折射仪测量总溶解固体(TDS ),该数字用于确定提取到杯中的咖啡的百分比,并结合一杯咖啡的输出重量和咖啡的输入重量,称为提取率(EY)。
漂白与未漂白纸过滤器
我从一个比较漂白和未漂白过滤器的实验开始。我瞄准了十对镜头,我看了一些度量标准。我看不出味道或提取率有什么不同。
我甚至观察了不同的烘焙方法,仍然没有明显的模式。
然而,当看拍摄时间时,有一个模式。T10 表示在量杯中达到 10 毫升所需的时间(通常一杯是 20 至 30 毫升的液体)。它受到我如何记录镜头的影响,但这不会从一个镜头到下一个镜头有太大的变化。漂白的 T10 时间比未漂白的长,总时间也比未漂白的长。因此,我更喜欢未漂白的。
我计算了所有的差异,我打算看看这些过滤器如何清洗,但我得到了布料过滤器的侧道。在 10 对样本中,我没有通过 t 检验计算 p 值。
拍摄后:
布与纸过滤器
关于布料过滤器,首先要知道的是它们会缩水。与极地特快中流浪汉使用的袜子过滤器不同,这种过滤器需要切割成篮子大小。我在使用之前洗了几次,最近,我把它放在一个空的咖啡篮里,在我用另一个篮子拍照之前,我把它洗了一遍。然后我让它变干,在切之前我会这样做几次。
这是底部有布过滤器和底部有纸过滤器的一个镜头的流程图。
典型的重量和流量剖面。布料的脉动要少得多,因为它流动得很快
我对比了几次布和纸,有一个清晰的图案。布过滤器产生了更好的味道和更高的提取率。
跨越不同的烘烤巩固了这一立场。
看看 T10 和总时间,布过滤器比纸过滤器跑得快。我很好奇这在多大程度上模拟了 2020 年初的工作,他们发现更粗的研磨但更快的拍摄产生了比他们想象的更高的提取率。
这里是更高的统计水平。我还包括 TCF 或时间覆盖过滤器。我发现这是一个度量标准,可以很好地指示预输注应该持续多长时间。在这些结果中,我试图将预输注保持为配对之间的常数。
选择哪种布料
我用两块布做了实验: [Hario](http://Hario Siphon Cloth Coffee Filter… https://www.amazon.com/dp/B000IGOTW6) 和 [Masukaze](http://Diguo Coffee Syphon Cloth… https://www.amazon.com/dp/B00M5SRPCG?ref=ppx_pop_mob_ap_share) (在帝国咖啡过滤器下)。后者稍微便宜一些。Hario 的味道得分稍微好一点,但提取率似乎很低。
就时间而言,Masukaze 过滤器比 Hario 过滤器运行得快得多。
再次,这里是更高的统计水平。
意式浓缩咖啡的粗糙层理论是,它让水流在整个过程中重新平衡。由于布过滤器的厚度,我认为它也在做类似的事情。我认为这也给了液体更多的空间,这样过滤孔的限制就不会引起沟流。
奇怪的是,一个布过滤器可以让子弹跑得更快,我想知道这是否是更高提取率的贡献者。
在重复使用方面,我非常喜欢重复使用,所以我也用布过滤器取代了我使用的中间过滤器。
我不知道布过滤器或纸是否可以在家庭咖啡师之外经常使用,但它们的功能可以用来改善过滤篮。没有理由过滤篮不能有允许它更类似于纸过滤器或布过滤器的结构。我原以为IMS superior会是这种情况,但是我没有注意到这样的改进。
如果你愿意,请在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。也可以在中关注我。
我的进一步阅读:
基于 DeepFashion 数据集和 Fastai 的服装分类
时尚 AI
一个关于我如何开始清理我的衣柜并最终训练一个神经网络的故事
图片由罗曼·桑波斯基根据 Shutterstock.com的许可使用
1 月 1 日是整理冬装的好时机。一个月前,当我走近我的衣柜时,我就是这么想的。叠毛衣、袜子和围巾的单调过程本质上是相当沉思的,并导致许多发现。我有三件同样款式的粉色衬衫。这一发现帮助我认识到,我不可避免地需要通过增加多样性和减少我拥有的物品的冗余来优化我的时装库存。自然,目标应该是将我的衣柜内容建模为一个图,该图将包含衣服项目、它们的类型(毛衣、裤子等)。)、属性(面料、款式、颜色等。),以及关系(两个项目是否可以组合在一个 look 中)。在这篇文章中,我写的是我创建数据集的方法,特别是如何识别随机物品的服装类型。
本文包含以下部分:
- 数据
- 模特培训
- 模型评估
- 如何将预训练的模型从 Fastai 加载到 PyTorch
- 摘要
即使我多年来一直在使用 Keras 进行深度学习,但这次我决定尝试一下 PyTorch 和 Fastai。文章中使用的完整代码可以在这里找到。
数据
为了对我衣柜里的物品进行分类,我需要一个经过训练的模型来完成这项任务,为了训练这样一个模型,我需要数据。在这个项目中,我使用了由香港中文大学多媒体实验室收集的 DeepFasion 数据集,这是一个用于服装类别和属性预测的大规模服装数据库。
深度时尚数据集
分类基准于 2016 年发布。它评估了 FashionNet 模型在预测 46 个类别和 1000 个服装属性方面的性能。原文请参考深度时尚:用丰富的注释支持健壮的服装识别和检索,CVPR 2016 。
DeepFashion 数据库包含几个数据集。在这个项目中,使用了类别和属性预测基准。该数据集包含来自 46 个不同类别的 289,222 幅不同的服装图像。
训练标签以下列格式存储在 train_labels.csv 中:
训练数据文件
训练数据文件包含图像和标签的位置。标签存储为字符串对象,每个图像一个标签。
我们可以使用 from_csv 方法将数据从 train_labels.csv 加载到 ImageDataLoaders 类。
我正在使用一种叫做预调整的 Fastai 数据增强策略。它首先将图像调整为较小的方形。由于正方形图像可以在 GPU 上处理,这使得接下来的所有放大操作都可以更快地进行。然后我们可以对每一批数据进行扩充。batch_tfms 顺序执行所有增强操作,如旋转和缩放,最后进行一次插值。这种增强策略将允许我们实现更好的增强图像质量,并由于在 GPU 上的处理而获得一些速度。
让我们看看数据集中的一些图像。
带标签的训练图像
我们还可以通过向上面的 show_batch 方法传递 unique=True 来检查增强图像的外观。
增强图像
正如我们所见,图像在增强后保持了质量。
模特培训
在这个项目中,我使用的是预先训练好的 ResNet34 模型。我尝试了更深层次的架构,但是它们并没有带来显著的改进。DeepFashion 数据集的主要挑战是标签的质量。例如,上图显示了两件商品:衬衫和短裤,但它只有一个“衬衫”标签。这样,模型将不可避免地受到噪声的影响。
为了使迁移学习起作用,我们需要用一个新的线性层替换网络的最后一层,该层包含与我们的数据集中的类的数量相同的激活数量。在我们的例子中,我们有 46 个服装类别,这意味着在我们的新层中有 46 个激活。新添加的层随机初始化权重。因此,我们的模型在被训练之前将具有随机输出,这并不意味着该模型完全是随机的。所有未改变的其他层将保持与原始模型相同的权重,并且将擅长识别一般的视觉概念,例如基本几何形状、梯度等。因此,当我们训练我们的模型能够识别衣服类型时,我们冻结了除最后一层之外的整个网络。这将允许我们优化最后一层的权重,而不改变更深层的权重。
当我们调用 learn.fine_tune()时,我们冻结整个网络,并为一个时期训练新创建的层的随机初始化的权重。然后我们解冻网络,按照我们指定的次数(在我们的例子中是两次)一起训练所有的层。这就是为什么我们在输出中看到了一个额外的纪元。
早期评估
早期评估允许我们检查早期阶段的学习进度,并在我们花费大量时间训练模型之前发现我们方法中的错误。有多种方法可以查看训练神经网络所产生的结果。为了快速获得印象,我们可以看看最常混淆的类:
正如我们所看到的,网络经常混淆“上衣”和“衬衫”,“连衫裤”和“连衣裙”,“t 恤”和“衬衫”。即使是人类也会犯这样的错误。这样我们就可以早期评估我们的网络是否学习到了正确的模式。
观察误差的另一种方法是画出最高亏损。
顶级损失。早期评估
如上所述,原始标签是有噪声的。我们的模型正确地分类了一件连体衣、两条裙子和一件连衣裙,而在原始数据集中,这些项目有错误的标签。
学习率探测器
现在,让我们浏览数据加载器中的数据,并逐渐增加每个小批量的学习率,以观察损失值如何随着学习率的变化而变化。我们的目标是找到最有效的学习速率,使网络更快地收敛。学习率在损失曲线的最陡斜率点处具有最佳值,因为这意味着损失下降得更快。极值点(最小值和最大值)和曲线的平坦部分对应于不允许网络学习的学习速率,因为这些点处的损失没有改善。
损失曲线
在我们的例子中,损失曲线的最陡点是学习率等于 0.005。这个学习率我们将用于进一步的培训。
在对模型进行 3 个时期的训练后,我们获得了 0.697 的准确度,这比默认学习率下的 0.694 有所提高。
区别学习率
在训练了网络的所有层之后,我们需要再次检查学习率,因为在几批训练之后,网络学习的速度变慢,并且我们冒着以高学习率超过损失函数的最小值的风险。因此,学习率需要降低。
当我们在三个时期的训练后绘制损失曲线时,我们可以看到它看起来不同,因为网络的权重不再是随机的。
三个时期后的损失曲线
我们没有观察到与权重从随机更新到减少损失的点相关联的这种急剧下降。曲线的形状看起来更平坦。在未来的训练中,我们将采用一系列的重量,从减少的点一直到损失再次开始增加的点。
如前所述,从预训练模型转移的层已经擅长识别基本的视觉概念,并且不需要太多训练。然而,负责识别特定于我们项目的复杂形状的更深层次将受益于更高的学习速率。因此,我们需要对第一层使用较小的学习速率,对最后一层使用较大的学习速率,以允许它们更快地进行微调。
我们可以清楚地看到我们的网络在学习上取得了进步。然而,很难说我们是否需要继续训练,或者停下来不要过度适应模型。绘制培训和验证损失图可以帮助我们评估是否需要继续。
培训与验证损失
我们可以看到,尽管培训损失仍在改善,但验证损失不再改善那么多。如果我们继续训练,我们将增加训练和验证损失之间的差距,这将意味着我们过度拟合我们的模型。因此,我们最好现在停止训练,进入下一步,评估。
模型评估
在前面的步骤中,我们能够在验证数据集上实现 70.4%的顶级准确性。如果我们绘制验证准确度,我们可以看到它是如何随着每个时期而提高的。
每个历元的最高验证精度
对训练数据集的评估
首先,我们将查看训练数据集上的预测,以估计我们是否仍有较高的偏差。
对训练数据的评估
训练数据集上的预测看起来不错。我们的模型捕捉到了主要概念。通过改进标签和清理数据,可以实现进一步的改进。
对测试数据集的评估
现在让我们加载测试数据,并检查模型在其上的表现。
测试数据的评估
模型 Top-1 测试精度为 70.4%。它错误地分类了一些对象,但仍然非常接近我们在验证集上得到的结果。
原始论文 DeepFashion:通过丰富的注释实现强大的服装识别和检索的作者,2016 年 CVPR使用前 3 名和前 5 名的准确度进行评估。
DeepFashion:通过丰富的注释实现强大的服装识别和检索,CVPR 2016
为了使我们的结果具有可比性,我将使用相同的指标。
我们模型的前三名准确率为 88.6%,比基准准确率高 6%,我们模型的前五名准确率为 **94.1%,**比基准准确率高 4%。这不应该令人惊讶,因为原始论文的作者使用了 VGG16 架构作为主干,这是一个功能较弱的模型。
对用户指定数据集的评估
最后,我们将检查模型如何处理我的图像。我用智能手机相机拍了 98 张自己衣服的照片。让我们加载图像,并检查模型是否可以正确地对它们进行分类。
该模型在用户指定数据上的 Top-1 准确率为 62.4% ,低于在 DeepFashion 数据集上的准确率。然而,对于 46 类分类模型来说,它仍然是好的。
用户数据集中的图像与最初训练模型时使用的图像完全不同。例如,用户图像只显示一件衣服,而 DeepFashion 数据集中的图像显示一个人穿着一件衣服,这使得缩放衣服更容易。用户数据集中几乎所有的裤子都被归类为短裤,因为模型很难估计其相对于人体的长度。尽管如此,该模型学会了主要概念,并可用于各种时尚背景。
如何将预训练的模型从 Fastai 加载到 PyTorch
训练完模型后,我们可能想要在没有 Fastai 安装的推理机器上运行它。为此,我们首先需要保存模型及其词汇表:
torch.save 保存预训练模型的权重。它使用 Python 的 pickle 实用程序进行序列化。要在 PyTorch 中运行模型,我们需要加载权重并重新定义模型:
将快速人工智能模型加载到 PyTorch
请注意,这一次我们需要在运行预测之前调整图像的大小并使其正常化。Fastai 库存储关于要在学习者中应用的变换的信息,但是当我们在 Fastai 之外运行模型时,我们需要首先变换图像。
之后,我们可以使用我们定义的类来运行预测:
摘要
在本教程中,我展示了如何使用 Fastai 库和 DeepFashion 数据集训练一个用于服装类型识别的 ResNet34 模型。我们已经看到,我们可以训练一个模型,对于前 3 名的准确性,它将超过当前基线 6%,对于前 5 名的准确性,它将超过当前基线 4%。我们对我自己的图像进行了评估,发现除了对比例敏感的项目(短裤或裤子问题)之外,该模型对项目进行了正确分类。模型性能可以受益于提高训练标签的质量和增加图像的多样性。
这只是我心目中时尚项目的开始。关于属性、图案和织物识别的文章将在后面。敬请期待!
感谢您阅读这篇文章!如有任何问题,请在下方留言或通过 LinkedIn 联系我。
如果你喜欢这篇文章,这里有一些你可能喜欢的其他文章:
Cloud Bigtable:它是什么,为什么有一天我们会需要它?
全能的 NoSQL 数据库为移动网站提供实时分析,以改善客户体验
汤姆·霍尔姆斯在 Unsplash 上拍摄的照片
最初是谷歌的网络搜索索引存储系统。于 2015 年通过谷歌云平台作为公共服务提供,目前为 Spotify、谷歌地图和谷歌搜索等一些最著名的网络和移动应用程序提供支持。这就是云 Bigtable,它既不适合复杂的连接、即席交互查询,也不适合支持在线事务处理(OLTP)系统。
那么它是什么,为什么有一天我们可能需要像 Cloud Bigtable 这样的大规模数据库呢?
你会学到:
- 现实世界的挑战:网站速度和个性化客户参与
- 云 Bigtable 入门:定义、适合与不适合
- 云大表的关键概念
现实世界的挑战:网站速度和个性化的客户体验
在进入技术层面之前,我认为从业务背景入手,揭示客户的期望如何推动处理大量实时分析工作负载的需求是有益的。所以我们开始吧!
顾客对即时满足和个性的期望
很难不注意到我们的客户总是忙忙碌碌,没有什么耐心,不会满足于不那么令人惊叹的客户体验。以下是客户在访问任何移动网站或应用程序时所期望的两件事。
- 我现在就要
- 我希望它能根据我的品味和喜好个性化
根据德勤在 2020 年的一项研究,网站速度仅仅提高 0.1 秒,就可以产生 7%的潜在客户,增加近 10%的支出。
另一份 2019 市场研究报告称,63%的智能手机用户更有可能从那些移动网站或应用程序为他们提供相关推荐的公司购买他们可能感兴趣的产品。
简而言之,您的移动应用程序加载的速度和显示内容的个性化程度极大地影响了您的客户的参与度,以及他们是否决定在您的网站上购买。
处理大量实时分析工作负载的数据库功能
但是个性化对移动网站和应用程序意味着什么呢?
Spotify 音乐应用程序就是一个很好的例子。只要你打开 Spotify,主页就会显示个性化内容,如最近播放的歌曲和与你的用户档案相关的热门节目,并推荐每日混音和发现每周音乐,以帮助你根据以前听过的歌曲发现新音乐。
另一个常见的用例是电子商务网站。您可以轻松找到个性化的产品推荐,如“您可能喜欢的其他人”、“经常一起购买”和“为您推荐”。
这是棘手的部分:所有这些必须在几毫秒内自动发生。因为生命太短暂,不能让我们宝贵的客户等待,在这个即时满足的时代,哪怕一秒钟都感觉像是永远,我说的对吗?
但是,构建如此强大的移动网站或应用程序来自动处理大量实时分析工作负载,以实现个性化推荐,从来都不是一件容易的事情。
信不信由你,这一切都始于一个数据库,或者我敢说,一个非常特殊类型的数据库,看起来一点也不像我们太熟悉的关系数据库。以下是理想数据库必须提供的关键功能。
作者图片
当谈到提供所有 7 个关键功能的现有数据库时,两个最著名的例子包括 Amazon DynamoDB 和 Google Cloud Bigtable。今天我们来探索一下云 Bigtable,把 Amazon DynamoDB 留到以后再说。
十秒钟外卖
作为强大的 NoSQL 数据库家族中的一员,Cloud Bigtable 提供了强大的功能来支持移动网站或应用的个性化、速度和自动化。
云 Bigtable 入门
Cloud Bigtable 是一个稀疏填充的表,可以扩展到数十亿行和数千列,使您能够存储数 TB 甚至数 Pb 的数据。
—来自 谷歌云
首先,需要注意的是,Cloud Bigtable 不是一个关系数据库。它既不支持 ACID 事务,也不支持 SQL 查询。这使得云 Bigtable 不适合 OLTP 和 OLAP 系统。
此外,Cloud Bigtable 非常强大,有时甚至会大材小用,或者比小规模应用程序或玩具项目所需的成本更高。
如果你想知道你是否需要云 Bigtable,这里有一些我从 John J. Geewax 的书"Google Cloud Platform in Action"中总结的有用的考虑。
作者图片
十秒钟外卖
云 Bigtable 是一种大规模数据存储解决方案,以查询复杂性和成本为代价,提供了极高的速度和高吞吐量。
云大表的关键概念
作为一个为支持大规模分析工作负载而构建的 NoSQL 数据库,Cloud Bigtable 有许多独特的特征,使其有别于常见的关系数据库。
在所有特征中,这里有两个我们至少应该理解的关键概念。
使用 3D 地图结构优化数据处理
作者图片
看看上面的图片,你能看到什么?
该图展示了如何在云 Bigtable 表中以二维(行和列)存储数据。嗯,非常类似于关系数据库,对吗?
不要过早下结论。事情比看起来稍微复杂一些。所以让我解释一下这是怎么回事。
第一维:行
每个行由单个行关键字唯一标识或索引。简单地说,行键类似于关系数据库中的主键。存储在 Cloud Bigtable 中的数据自动按字母顺序按行键排序(也称为按字典顺序排序),这使得跨表搜索和扫描速度更快。
第二维:列
相关数据然后被分组到列族中。例如,用户的基本简档信息(例如姓名、电子邮件地址、移动电话号码)可以被分组到一个家族中,而用户的评论可以被分组到另一个家族中。其目的是将所有频繁检索的信息收集在同一位置,从而提高查找效率。
同一系列下的每一列都有一个唯一的列限定符。与行键类似,相同系列中的列也按照它们的列限定符按字母顺序排序,以提高查询速度。
关于云 Bigtable 列,有两点需要注意。
- 同一表中的两个柱族不应共享同一个族名。此外,同一系列中的任何两列都不应共享同一个列限定符。因此,每个列都由列族名和列限定符的组合唯一标识。
- 如果某一列在特定行中不包含任何数据,则它不会占用任何空间或存储空间。这就是为什么我们说云 Bigtable 表是稀疏的。
现在我们知道行和列是云 Bigtable 中 3D 地图结构的前两个维度。但是第三维度在哪里呢?让我们找出答案。
第三维度:细胞
作者图片
这可能需要一点想象力,但上面的图片可能会帮助你。如果我们通过特定的行键进行查找,并放大到特定的列,通常我们会期望找到单个值。
但是在 Cloud Bigtable 中,我们会在不同的时间点发现值的不同版本。每个有时间戳的版本被称为一个单元**,这是我们正在寻找的第三维。**
那么,为什么要有这个第三维度,让事情变得复杂呢?
请记住,存储在云 Bigtable 中的数据预计会随着时间的推移而快速变化。例如,客户可能会点击查看某个产品,然后迅速转到下一个产品。用户可能听了一首歌 10 秒钟,没有找到适合她心情的曲子,然后按下 Next。
但是我们希望很容易地看到连续数据的历史,比如客户从上周开始浏览了哪些产品,用户昨天听了哪些歌曲,客户的音乐类型是如何演变的。
有了第三个维度,企业可以有效地回到过去,提取相关的过去互动进行分析,并在几毫秒内显示个性化的内容或建议。这使得 Cloud Bigtable 成为强大的数据库,为移动网站或应用提供速度和个性化支持。
注意,云 Bigtable 的性能严重依赖于模式设计和行键的选择。如果您想了解更多关于在 Cloud Bigtable 中设计模式和选择合适的行键的最佳实践,请不要忘记查看这个 Google 文档。
利用分布式处理基础设施提高性能
实例、集群和节点
诚然,我花了一段时间才理解云大表基础设施是如何工作的。不要惊慌,因为我不会用太多的技术细节来烦你。为了让事情尽可能容易理解,以下是你最起码需要知道的。
云大表基础设施有 3 个关键组件:实例、集群和节点。
- 当我们说部署云 Bigtable 数据库时,它意味着创建一个实例。它是一个巨大的容器,容纳着数据库的所有部分。一个实例可以包含一个或多个集群。
- 每个簇表示存储数据的特定位置。在每个集群下,可能有一个或多个节点。
- 每个节点负责管理数据在数据库中的写入和查询。
性能&可用性影响
作者图片
场景 1: 1 个集群,1 个节点
场景 1 展示了最简单、最便宜的云 Bigtable 实例。您可以部署一个包含 1 个集群和 1 个节点的实例。但是等等!因为你能并不意味着你应该。
对于一些实验或(相当昂贵的)宠物项目来说,拥有一个集群和一个节点可能没问题。但是,如果前端应用程序生成和查询的数据太多,单个节点可能很容易过载,速度会大大降低。此外,只有一个集群就像把所有的鸡蛋放在一个篮子里。如果集群由于技术问题变得不可用,相关的应用程序也会失败。
场景二:1 个集群,N 个节点
简单地在同一个集群下添加更多的节点将把我们从场景 1 带到场景 2。有了这些额外的节点,您可以处理更多的数据读写请求,从而获得更好的性能。这对于扩大规模以应对不断增长的数据处理需求特别有用。
但是,拥有单个集群意味着所有数据仅在单个区域中可用。如果在该地理位置发生任何事故(例如停电),您的数据库和应用程序也会宕机。毫无疑问,这是一个需要考虑的关键风险,因为我们都希望我们的移动网站或应用程序能够连续运行而不出现故障,我说的对吗?
场景三:N 个集群,N 个节点
场景 3 是云 Bigtable 发挥其全部威力的地方。有了多个集群,对一个集群中的数据所做的任何更改都会在几秒钟或几分钟内复制到位于不同地带或区域的其他集群中。如果一个集群完全失败,其他集群中的数据随时可用。另一个群集可以快速承担工作负载,以便我们可以照常开展业务。这种情况的不利方面是钱!让多个集群并行运行当然需要一些巨额的日常开支。
十秒钟外卖
尽管云 Bigtable 非常强大,但它也有其独特之处,需要我们从不同的角度思考如何设计和管理数据库以提高性能和可用性。
离别的思绪
曾几何时,我们需要处理的数据只有千兆字节多一点,而且可以很好地放入闪存驱动器。仅在几年前,一个需要 1tb 存储的数据仓库就足以让人惊叹。然而,如今企业每天生成数十亿字节的数据非常普遍。毫不奇怪,我们的客户也开始期待企业将如此大量的数据转化为个性化内容,以获得更好的移动网站和应用体验。
顾名思义,云 Bigtable 旨在成为强大的数据库,为移动网站和应用程序提供大量实时分析工作负载。虽然这篇博客文章仅仅触及了云 Bigtable 的皮毛,但我希望我已经让您对这个独一无二的 NoSQL 数据库有了一两个新的认识。
如果你正在读这封信,感谢你抽出时间。请随时在 LinkedIn 和 T2 Twitter 上与我联系,并告诉我下次如何做得更好。保重,保持安全,继续牛逼!
原载于 2021 年 3 月 22 日 https://thedigitalskye.comhttp://thedigitalskye.com/2021/03/23/cloud-bigtable-what-is-it-and-why-might-we-need-it-one-day/。
云数据仓库:过去、现在和未来
意见
领先数据仓库提供商分析
本帖所有图片均由作者创作
那是 2013 年,我的工作是向印度最大的摩托车制造商销售车队管理解决方案,但只有当他们首先投资一个新的数据库系统,使我们的解决方案可行时,这笔交易才会成功。
我与一家合作伙伴供应商一起,将 SAP Hana 作为一款现代数据库解决方案进行推介,该解决方案非常适合事务性和分析性工作负载。
当时,大规模收集、存储和分析数据需要大量投资,并且只有预算为几十万美元和几个月人力资本的企业才可行。
快进到现在,对于一个认真构建数据文化的组织来说,投资数据仓库是一个赌注。毫不奇怪,这种转变是由市场上发生的创新推动的,这些创新带来了更好、更经济的数据仓库解决方案。
在探索云数据仓库工具市场之前,有必要了解一下为什么公司需要数据仓库以及导致其快速采用的因素。
数据仓库的需求和优势
由于专门构建的 SaaS 工具的激增,数据和数据源比以往任何时候都多。与此同时,大大小小的组织都认识到,提供由数据驱动的个性化体验是吸引和留住客户的唯一途径。
只有当团队能够分析和激活从每个客户接触点收集的数据时,这才成为可能,虽然有 SaaS 产品套件可以帮助实现这一点,但在仓库中存储一份数据副本可以打开更多的可能性。此外,不存储数据的副本会导致供应商锁定、效率低下,并让需要临时分析或特定数据集在他们所依赖的外部工具中可用的团队感到沮丧。
现在让我强调一下采用数据仓库的明显好处。
经济实惠且易于实施
基于使用的定价以及存储和计算的分离(详见下文)使得各种规模的企业采用数据仓库变得极其经济实惠,即使数据量有限且数据源很少。事实上,大多数数据仓库供应商为存储和分析提供试用和免费的月度配额。
就实现数据仓库而言,您可以在几个小时内(或者几分钟,如果您以前做过的话)完成一个数据仓库,而不需要编写任何代码。使用 ELT 工具,如 Fivetran 或 Airbyte ,您可以从几乎所有可以想象的数据源将数据接收到数据仓库中。不用说,我们必须编写 SQL 来对数据进行查询,或者构建可以在下游应用程序中使用的数据模型。但是作为一个非工程师来说,SQL 并不难,这里有一些学习 SQL 的好资源。
高性能和可扩展
云数据仓库的最大优势之一是,与它们的前辈不同,现代仓储工具建立在将计算与存储分离的架构之上。
这意味着存储数据的费用与对数据进行查询的费用是分开的。这不仅带来了成本优势,还使云数据仓库的性能更高,能够并发运行数百个查询。我推荐这篇快速阅读来了解更多关于云数据仓库中的并发性。
此外,随着存储成本日益降低,公司能够在其数据仓库中复制生产数据库,从而使数据仓库成为所有数据的真实来源。
数据仓库市场概述
让我们看看数据仓库解决方案市场在过去十年中是如何发展的,以及它的发展方向。
过去
在这篇文章的开头,我提到我试图达成的一笔交易依赖于买家对 SAP Hana 的投资,这在当时是一种内部解决方案,前期成本为几十万美元。因此,你可以想象,要让公司放弃这笔钱,需要的不仅仅是几次销售会议。
(如果你好奇的话,我的那笔交易陷入了几个月的循环,直到我停止跟进。)其他领先的仓储解决方案由甲骨文、T2、IBM 和 T4 Vertica 提供。这些部署在本地,并结合了事务(OLTP)和分析(OLAP)处理。IBM 的这篇短文在中解释了 OLTP 和 OLAP 之间的主要区别。
随着云的普及,所有这些供应商现在都提供云仓储解决方案;然而,当人们谈论现代云仓储工具时,它们并没有出现。
现在
现在是 2021 年,数据仓库市场正处于一个独特的转折点。由于上述原因,领先的云仓储解决方案提供商正在经历快速采用。与此同时,一家老牌数据公司和一家挑战者新贵正试图分一杯羹。
领头的马
Amazon Redshift、Google BigQuery 和 Snowflake 是目前在云仓库环境中谈论的三个最受欢迎的解决方案,其次是微软 Azure 所谓的仓库解决方案。
Redshift 于 2012 年推出,是云中的第一个 OLAP 数据库,启动起来既快又便宜。它也标志着我们今天所知的现代云数据仓库的开始。虽然 BigQuery 在 Redshift 之前上市,但直到 2016 年 6 月,即全面上市近 5 年后,谷歌才推出对标准 SQL 的支持,从而导致更广泛的采用。
然而,自 2014 年公开发布以来, Snowflake 是第一个提供将计算与存储分离的解决方案的,这种架构后来被其他提供商采用(尽管许多 Redshift 客户可能仍然没有在支持这种架构的集群上运行)。
如果你想更深入地挖掘并理解红移、BigQuery 和雪花之间的区别,我强烈推荐这个深入的比较。
如上所述,微软也有一匹马在竞争,我被告知它非常适合运行在 Azure 云上的公司。
同样值得一提的是,在确立了自己作为领先的数据仓库供应商的地位之后,Snowflake 现在将自己定位为一个端到端云数据平台,除了其他功能之外,现在还可以存储和处理非结构化数据。
一个玉米和一个挑战者
目前的仓储格局包括另外两家公司——价值 380 亿美元的 Databricks 和挑战者 Firebolt。如果不考虑这两家公司所能提供的东西,对数据仓库解决方案的任何评估都是不完整的。
Databricks 由 Apache Spark 的创始人创建,最初为 Spark 提供托管解决方案,Spark 是一个旨在处理大量数据的分析引擎,通常由大公司用来管理机器学习工作负载。
今天,Databricks 提供了一个名为 Lakehouse 的产品,它结合了数据 lake 和数据仓库 house 的功能。
从历史上看,数据湖一直用于存储没有直接用例的原始、非结构化数据。另一方面,数据仓库是为存储结构化数据而设计的,这些数据是为分析目的而准备或转换的。
然而,随着由仓储解决方案驱动的 ELT 相对于 ETL 的崛起,变得更加便宜和高效,数据湖和数据仓库之间的界限正在变得模糊。值得注意的是,Snowflake 和 Databricks 正在缓慢但肯定地融合——如果你想知道更多,我的朋友安妮卡在这种融合方面做了出色的工作。
接下来,Firebolt 已经成为该领域的一个挑战者,它提出了一些非常大胆的主张,并在解释它们是如何做到的方面做了很好的工作(强烈推荐观看这个产品演示)。
我很喜欢 Firebolt 如何迅速地将自己定位为一个由数十亿美元的巨头主导的市场中的一个重要竞争者,同时也享受着乐趣!
未来
目前的市场领导者不会很快被打乱,很可能在未来几年成为领导者。
Firebolt 无疑让我们看到了数据仓库的未来,随着它的发展势头,预计 Snowflake 和其他公司不会只是停下来盯着看。然而,有一些专门构建的分析数据库系统正在推动当前仓库解决方案所能达到的极限。
ClickHouse 、 Apache Druid 和 Apache Pinot 都是面向实时分析用例的开源 OLAP 数据库/数据存储/数据库管理系统。 Materialize 是另一家在实时分析领域大步前进的数据库初创公司。
这些不是通用的数据仓库解决方案,因为它们旨在仅满足实时用例,并且它们的架构不同,没有分离存储和计算,这是现代数据仓库工具的核心前提。
如果你在寻找 ClickHouse,Druid 和 Pinot 之间的超级详细的比较,这就是它。这些“数据库系统”绝不是数据仓库的替代品,但它们确实让我们看到了从能够存储大量数据用于分析的产品中可以期待什么。
作者图片:数据存储工具的演变。点击查看完整的基准测试
结论
现代数据仓库工具使得做两件事情变得非常容易和经济实惠——在云中存储大量数据,并使用 SQL 查询这些数据以进行分析和激活。
那些认真对待对数据的控制权和所有权,但却选择不投资数据仓库的公司,终究是不认真的。有些公司使用 PostgreSQL 数据库作为他们的数据仓库,虽然这在短期内是可以的,但随着数据仓库变得越来越便宜,性能越来越好,没有理由不尽早建立一个。
首发于蓖麻博客 。
使用 ArgoWorkflow 的云原生数据管道
利用容器和 Kubernetes 扩展您的数据工程管道
背景
无论您是数据工程师、平台工程师、数据科学家还是 ML 工程师,在处理数据时,我们都面临着创建管道的挑战。尽管我们的数据处理目标之间存在折衷的差异,但有一点是不变的“我们需要创建和扩展 DAG 的能力”。在现代计算解决方案中,DAG 或有向无环图的概念是核心。简而言之,DAG 描述了复杂的非递归计算中的一系列执行步骤,定义可以在这里找到。实际上,我们将 DAG 定义为一组线性任务,这些任务共同作为一个逐步的过程运行。我们的简单目标是使开发和部署管道的过程尽可能自动化和可伸缩。
可以使用许多工具来构建管道。比较选项
Apache Airflow —基于 python 的编排平台,专为运营团队和数据科学打造。这个领域最好的用户界面之一
perfect—为开发人员使用而构建的程序编排平台。它是这一领域的新兴工具,正在获得越来越多的关注。
Luigi——另一个供开发者使用的开源解决方案
Ctrl-M—BMC 流行的企业工作流管理工具
DAG 已定义
为什么我们叫他们达戈?DAG 是一个有向非循环图,是管道的数学抽象。进一步说,图是顶点(或点)和边(或线)的集合,表示顶点之间的连接。有向图是一种图,其中的边指向从一个顶点到另一个顶点的方向。在这种情况下,同一对顶点之间可能存在两条边,但在这种情况下,它们将指向相反的方向。有向图通常被称为有向图。如果一个图包含一个或多个圈,则该图是循环的,其中循环被定义为沿着边的顶点之间的路径,该路径允许你沿着唯一的一组边返回到顶点。当一个图不包含圈时,它是无圈的。因此,有向无环图或 DAG 是没有圈的有向图。
Argo 工作流
Argo WorkFlows 是一个云原生计算基础项目,是一个开源的容器原生工作流引擎,用于编排 Kubernetes 中的作业,将工作流中的每个步骤作为一个容器来实现。Argo 使开发人员能够使用类似于传统 YAML 的自定义 DSL 启动多步管道。该框架提供了复杂的循环、条件、依赖管理和 DAG 等。这有助于增加部署应用程序堆栈的灵活性以及配置和依赖性的灵活性。使用 Argo,开发人员可以定义依赖关系,以编程方式构建复杂的工作流,将任何步骤的输出作为输入链接到后续步骤的工件管理,并在易于阅读的 UI 中监控计划的作业。Argo 是作为 Kubernetes CRD(自定义资源定义)实现的。因此,Argo 工作流可以使用 kubectl 进行管理,并与其他 Kubernetes 服务(如卷、秘密和 RBAC)进行本机集成,并提供完整的工作流功能,包括参数替换、工件、夹具、循环和递归工作流。
其他功能
- 可视化和管理工作流的用户界面
- 工作流模板用于存储集群中常用的工作流
- 计划的工作流
- 带有 REST API 的服务器接口
- 基于 DAG 或步骤的工作流声明
- 步骤级输入和输出(工件/参数)
- 参数化
- 条件式
- 重试(步骤和工作流级别)
- K8s 资源编排
- 调度(亲和力/容忍度/节点选择器)
- 卷(短期/现有)
- 平行度限制
- 魔鬼化的步骤
管道 API
为了简化环境和简化实施,我们的目标是利用我们在 Docker 和 Kubernetes 上的投资,同时使开发人员能够自动化所有语言和框架的云原生部署管道。
既然我们已经有了所有必要的材料;a)用于代码的容器 b)用于访问云资源的容器的编排 c)以编程方式构建复杂工作流(DAG)的能力,让我们仔细看看为什么我们开发了管道 API。
Argo 中的工作流自动化是由 YAML 模板驱动的(易于采用,因为 Kubernetes 主要使用相同的 DSL ),这些模板是使用 ADSL (Argo 领域特定语言)设计的。使用 ADSL 提供的每条指令都被视为一段代码,与 github 中的应用程序代码一起托管。Argo 提供/支持六种不同的 YAML 构造:
**容器模板:**根据需要创建单个容器和参数
**工作流模板:**定义作业,换句话说就是短时间运行的应用程序,它运行到完成。工作流中的步骤可以是容器
**策略模板:**用于触发/调用作业或通知的规则
**部署模板:**创建长时间运行的应用程序
**固定模板:**将 Argo
**项目模板之外的第三方资源粘合起来:**可以在 Argo 目录中访问的工作流定义。
这些模板提供了一组非常强大的特性,但也会给开发人员带来负担,特别是当它涉及到创建和维护复杂的 yaml 时。在多系列的这一部分中,我们将展示一个利用 Spark 的管道,这也是一个非常有趣的 K8 运营商,敬请关注关于该主题的未来文章。
项目配置
第一步是我们在您的项目中创建一个 config.yaml 文件,它包含所有关于图像/容器细节的底层细节。配置文件主要包含两个组件:
- 容器:包含预构建的容器图像
- 资源:可以包含任何需要实现的定制资源定义
下面是示例 yaml,它包含使用 pydeequ 运行示例数据分析器的jobprofilerclient
和使用 spark 操作符运行 Spark 作业的资源模板sparkk8sScala
现在,您可以使用下面的代码创建一个复杂的 DAG:
添加任务后,可以编译 DAG,我们还可以查看依赖关系,并将 DAG 提交到 Argo 工作流:
当提交到 ArgoWorkflow 时,此代码会生成如下所示的 DAG:
要查看工作代码,请查看 github repo,在这里我们将继续添加更多的管道 API 特性。请继续关注更多的用例,包括 ML 管道。
请联系!
如果您有任何问题,请联系我们。在这里找到我【https://www.linkedin.com/in/roberthheise/
你可以在 https://www.linkedin.com/in/gopalkrishna9/的找到 Gopal
Tableau 中的聚类分析
了解如何轻松地在 Tableau 中对数据进行聚类
图片由尼基·❕❣️提供请保持安全❣️❕ 来自 Pixabay
考虑这样一种情况,您有一些属于您公司的销售数据。假设你想从消费者的消费能力中发现一种模式。如果您可以在数据中发现不同的群体或关联,您的公司就可以根据他们的偏好来定位不同的群体。这种直觉背后的基本思想被称为聚类,tableau 有一个固有的特性,可以根据某些属性自动对相似的数据点进行聚类。在本文中,我们将探索 Tableau 的这一功能,并了解如何将聚类方法应用于一些真实的数据集。
什么是集群?
聚类 又称聚类分析,是一种无监督的机器学习算法,倾向于根据某种相似性度量对更多相似的项目进行分组。
下面的图非常直观地展示了 K 均值算法的工作。在 K 均值聚类中,该算法将数据集分成 K 个聚类,其中每个聚类都有一个质心,质心计算为该聚类中所有点的平均值。在下图中,我们从随机定义 4 个质心点开始。然后,K 均值算法将每个数据点分配到其最近的聚类(交叉)。当所有数据点的平均值改变时,质心移动到新的位置,然后重复整个过程,直到质心位置不再有可观察到的变化。
Tableau 中的聚类
Tableau 还使用了 K 均值聚类下的算法。它使用 卡林斯基-哈拉巴斯 准则来评估聚类质量。下面是对卡林斯基-哈拉巴斯标准的数学解释:
来源:https://online help . tableau . com/v 10.0/pro/desktop/en-us/clustering _ how networks . html
这里 SSB 是总体的类间方差,SSW 是总体类内方差,k 是类的数量,N 是观察的数量。
这个比率给出了一个决定簇的内聚性的值。较高的值表明聚类之间的关联更紧密,聚类内距离较低,聚类间距离较高。
既然我们对什么是集群有了一个概念,那么是时候看看如何使用 tableau 来应用集群了。
使用聚类发现数据集中的模式
聚类有助于发现数据集中的模式。假设你是某个旅游公司的分析师。作为一家公司,了解人们旅行习惯的模式会很有用。你有兴趣知道哪个年龄段的人更喜欢旅行。你的工作是使用世界指标样本数据来确定哪些国家有足够多的合适的客户。
舞台环境
在本教程中,我们将使用 画面公开 **,**这是绝对免费的。从官网下载 Tableau 公版。按照安装说明进行操作,如果单击 tableau 图标时出现以下屏幕,就可以开始了。
Tableau 主屏幕|作者图片
连接到数据集
世界经济指标数据集包含推动世界各国经济发展的有用指标,如预期寿命、经商便利度、人口等。数据集是从联合国网站上获得的。数据集可以从这里的进入。
- 将数据集下载到您的系统中。
- 将数据从计算机导入 Tableau 工作空间。使用
Sheets
选项卡下的Data Interpreter
,校正并重新排列数据。
按作者连接到数据源|图像
格式化数据源
在工作表中,数据源中的列在数据窗格的左侧显示为字段。数据窗格包含由表格组织的各种字段。有许多功能可以归为一类。这也将有助于更好地表示所有数据字段。
- 选择
Business Tax Rate
、Days to Start Business
、Ease of Business
、Hours to do Tax
、Lending Interest
、>文件夹>创建文件夹
按作者分组文件夹|图像中的字段
- 将文件夹命名为 Business,,现在上述所有字段都包含在这个特定的文件夹中。
文件夹视图|按作者排序的图像
- 同样,创建三个新文件夹—
Development
、Health
和Population
,方法相同,如上图所示。分别添加以下字段。这是格式化后数据窗格的外观:
最终外观|作者图片
- 双击数据窗格中的
Country
。Tableau 创建一个地图视图,用一个实心圆代表每个国家。将标记类型改为地图,o 在标记卡片上,
按作者显示数据集|图像中的国家/地区
确定聚类的变量
聚类的下一步是确定将在聚类算法中使用的变量。在 tableau 中,变量类似于字段。对于能够给出理想集群的最佳变量,没有唯一的答案,但是您可以用几个变量进行实验,以查看期望的结果。在我们的例子中,让我们使用以下字段:
- 人口城市
城市人口是一个国家人口密度的良好指标。密度越高,商机就越多。
- 65 岁以上人口
65 岁以上的人口意味着老年人。许多老年人倾向于喜欢旅行,所以这可能是一个有用的指标。
- 女性预期寿命和男性预期寿命
预期寿命较高的国家意味着那里的人们寿命更长,对旅游更感兴趣。
- 人均旅游人数
该字段不存在,可以使用Tourism Outbound
和Population Total
字段创建为计算字段,如下所示:
Tourism Per Capita = SUM([Tourism Outbound])/SUM([Population Total])
人均旅游|作者图片
Tourism Outbound
代表人们每年花在国际旅行上的钱(以美元计)。为了得到平均值,我们需要将这个字段除以每个国家的人口
将选定字段添加到视图中
在继续之前,我们需要将默认聚合从SUM
更改为AVERAGE
。Tableau 使得聚集度量或维度成为可能,尽管聚集度量更常见。每当我们向视图中添加一个度量时,默认情况下会对该度量应用一个聚合。需要使用的聚合类型取决于视图的上下文。
将选定字段添加到视图|按作者排序的图像
更改所有选定字段的聚合,然后将它们拖到标记卡上的细节中,如下所示:
将汇总从总和变为平均值|按作者分类的图片
使聚集
Tableau 中的聚类是一个简单的拖放过程。以下步骤概述了群集过程:
- 点击
Analytics
窗格,拖动Cluster
到视图上,数据自动按 Tableau 聚类。就这么简单。
Tableau 中的聚类|按作者分类的图像
- 虽然 Tableau 可以自动决定要创建的聚类数,但我们也可以控制聚类数以及计算它的变量。将字段拖到框中以将其包括在聚类分析算法中,或者将其拖出以将其排除。
决定聚类数|按作者分类的图像
- 为了更好的分析,我们将使用 4 个集群和默认变量。注:一些国家不属于任何类别,被标记为非类别。
4 个群集和默认变量|作者图片
- 该集群被创建为一个新的药丸,可以在颜色架上看到。将此药丸拖到数据窗格上,保存为一个组。
聚类字段|图像 y 作者
在这里,我们根据所选的衡量标准对国家进行了分组。但是,我们如何理解这些结果,以及我们如何根据集群做出商业决策呢?下一节将解决这些问题。
描述集群
单击标记卡中的集群字段,然后单击描述集群选项。
描述各种集群|作者图片
这将显示一个包含集群详细描述的文档。文档中有两个选项卡— Summary
和Models
:
1.摘要
这给出了每个聚类的结果和每个变量的平均值的汇总。
结果摘要|作者图片
从上面的结果,我们可以推断集群 2 具有:
- 男性和女性的平均预期寿命最高
- 最高的人均旅游总量
- 最高平均城市人口
这意味着它拥有预期寿命更长的富裕城市人口,似乎是老年旅游业的良好市场。让我们看看这一组包括哪些国家。
分析第 2 组中的国家|作者图片
2.模型
models’
选项卡显示所有变量/字段平均值的各种统计值,并显示其统计显著性。你可以在这里阅读更多关于集群模型统计数据。
按作者分析模型选项卡|图像
因此,作为一名分析师,你可以向销售团队展示这份清单,让他们关注这些潜在客户。聚类为我们提供了一些很好的见解。从这里开始,您可以尝试不同的领域,设置人口或收入的阈值等。有许多方法可以对数据进行聚类,但基本原理是相同的。
结论
在本文中,我们学习了如何使用简单的拖放机制对 Tableau 中的给定数据集执行聚类分析。聚类是一个重要的工具,当与 Tableau 结合使用时,可以为分析师提供统计分析技术的力量。
参考文献和进一步研究
在数据中寻找聚类—Tableau 的自我指导,深入聚类分析的概念。
Plotly Express 的聚类和重叠条形图
图片由 Ergyn Meshekran 从 Unsplash 提供
簇状&重叠条形图
聚类(分组)条形图显示主要类别和属于第二分类变量的子类别(子类别)之间的相对比例的数字信息。与堆积条形图、类似,它们应该用于比较和比例,但重点是组成。当一个整体被分成多个部分时,它们特别有效。它们能够在子类别之间进行比较**,而堆叠条形图在子类别内进行比较。**
簇状条形图由多组矩形条表示,这些矩形条可以水平或垂直定向。每个主要类别被分成代表第二分类变量的子类别的条簇和。每个子类别的数量由那些矩形条的长度或高度来表示,这些矩形条并排放置 形成一个簇,簇之间的间隙比单个标准条稍宽。
重叠(重叠)条形图 用于不同项目或类别之间的比较。他们只对单个图表中每个项目或类别的两个数字变量进行比较。数值变量必须密切相关,才能进行比较。它们也用于显示基于相似前提的长期趋势。它们不应用于关系或分布分析。概念上的想法是对比两个变量的数值,这两个变量一个重叠在另一个之上,允许用更大的阐释力描述信息。
簇状&重叠条形图,带有 Plotly Express
我们使用了从社区 Kaggle [1]下载的公共数据集。该数据集包含从 VzCharts 收集的与视频游戏销售和游戏评级数据相关的记录。我们特别选择了一个 csv 文件,其中有 422 条关于微软 Xbox One 主机上视频游戏销售的记录。我们想知道 2013 年至 2018 年期间全球不同地区的销售额分布情况。我们还想知道哪些是最畅销的类型。
首先,我们导入 Plotly Express 作为 *px,*模块 *plotly.graph_objects*
作为 go ,Pandas 库作为 pd ,并将我们的 csv 文件转换成数据帧:
import pandas as pdimport plotly.express as pximport plotly.graph_objects as godf = pd.read_csv(path + 'XboxOne_GameSales2.csv', index_col=False,
header = 0, sep = ';', engine='python')
下面的屏幕截图显示了数据集的前十条记录:
最初,我们删除了在年列中具有 N/A 值的行,然后删除了在全局列中具有 0 值的行,最后,我们根据年列对剩余的记录进行分组,并对每个组求和。
df.dropna(subset = ['Year'], inplace = True)df.drop(df[df['Global'] == 0.0].index, inplace = True)df_clust = df.groupby(['Year']).sum().reset_index()
完成这三行代码后,我们就可以绘制一个簇状条形图了。
对于本文中的聚类(分组)条形图,Plotly 函数是*go.Bar()*
,对应的参数是: x= 代表时间线的数据帧中的列名,而 y= 是代表特定区域的数据帧中的列名。此外,我们还设置了条形的宽度和图例的文本。
我们使用方法*fig.add_trace()*
添加新的轨迹(条)到图形对象*Figure()*
。我们重复这个过程四次,每个区域一次。
anchos = [0.2] * 6fig = go.Figure()fig.add_trace(go.Bar(x = df_clust['Year'],
y = df_clust['North America'],
width = anchos, name = 'North America'))fig.add_trace(go.Bar(x = df_clust['Year'],
y = df_clust['Europe'],
width = anchos, name = 'Europe'))fig.add_trace(go.Bar(x = df_clust['Year'],
y = df_clust['Japan'],
width = anchos, name = 'Japan'))fig.add_trace(go.Bar(x = df_clust['Year'],
y = df_clust['Rest of World'],
width = anchos, name = 'Rest of World'))
我们用*update.layout*
更新了图表:设置标题、字体大小以及图形的宽度和高度。
我们必须选择 barmode = ‘group’ 来绘制一个簇状条形图。记住,我们选择了*条形图=‘stack’*作为堆积条形图。
然后我们更新了 x 轴和 y 轴(文本、字体、tickfont)。我们将图表保存为静态的 png 文件,最后,我们使用默认模板( plotly )绘制图表。
fig.update_layout(title = "XboxOne World Sales (MM) ",
barmode = 'group', title_font_size = 40,
width = 1600, height = 1400)fig.update_xaxes(title_text = 'Year',
title_font=dict(size=30, family='Verdana', color='black'),
tickfont=dict(family='Calibri', color='darkred', size=25))fig.update_yaxes(title_text = "Sales",
title_font=dict(size=30, family='Verdana', color='black'),
tickfont=dict(family='Calibri', color='darkred', size=25))fig.write_image(path + "figclust1.png")fig.show()
图 1:一个簇状条形图。作者用 Plotly Express 制作的图表。
这是一个很好的图表,但我们无法清楚地确定哪些值对应于日本。此外,图例的大小不足以正确显示。
因此,我们在每个轨迹中加入了参数文本,以及对应于每个区域的数值。我们使用方法*update_traces()*
来设置这些数字注释的属性(模板、位置和字体特征)。最后,我们使用方法*update_layout(legend=go.layout.Legend()*
来建立屏幕上的位置( x,y )、图例项显示的顺序( traceorder ),最后是图例的族、大小和颜色。请注意, go.Legend
已被弃用,取而代之的是go.layout.Legend
。
anchos = [0.2] * 6fig = go.Figure()fig.add_trace(go.Bar(x = df_clust['Year'],
y = df_clust['North America'],
width = anchos, name = 'North America',
text = df_clust['North America']))fig.add_trace(go.Bar(x = df_clust['Year'],
y = df_clust['Europe'],
width = anchos, name = 'Europe',
text = df_clust['Europe']))fig.add_trace(go.Bar(x = df_clust['Year'],
y = df_clust['Japan'],
width = anchos, name = 'Japan',
text = df_clust['Japan']))fig.add_trace(go.Bar(x = df_clust['Year'],
y = df_clust['Rest of World'],
width = anchos, name = 'Rest of World',
text = df_clust['Rest of World']))fig.update_layout(title = "XboxOne World Sales (MM) ",
barmode = 'group',title_font_size = 40,
width = 1600, height = 1400)fig.update_layout(legend=go.layout.Legend(
x=1,y=1,
traceorder= normal",
font=dict(family="Verdana",size= 22, color = "black")))fig.update_traces(texttemplate='%{text:.2f}',textposition='outside',
textfont=dict(size=60, family='Verdana', color='black'))fig.update_xaxes(title_text = 'Year',
title_font=dict(size=30,family='Verdana',color='black'),
tickfont=dict(family='Calibri', color='darkred',size=25))fig.update_yaxes(title_text = "Sales",
title_font=dict(size=30,family='Verdana',color='black'),
tickfont=dict(family='Calibri', color='darkred',size=25)) fig.write_image(path + "figclust1.png")fig.show()
图 2:带注释的簇状条形图。作者用 Plotly Express 制作的图表。
现在我们可以做一个很好的比较,不仅是视觉上的,还有数字上的。
为了更好地讲述故事,我们决定在两个最畅销的地区按流派分析销售情况:
首先,我们按流派分组,并对北美和欧洲对应的列求和。正如我们从前面的图表中所知,北美是销量最高的地区,我们将列 [“北美”] 按降序排列。我们得到了 16 种不同的风格,太多了,难以形象化。因此,我们只筛选出那些在 2013 年至 2018 年期间销量超过 500 万册的书籍。
df_genre = df.groupby(['Genre'], as_index = False)
["North America", 'Europe'].sum()df_genre.sort_values(by=['North America'], inplace = True,
ascending = False)df_genre = df_genre[df_genre['North America'] > 5]
我们选择 bar mode =‘overlay’来得到一个重叠的条形图,因为我们每个类别只有两个数字变量。
anchos = 0.5fig = go.Figure()fig.add_trace(go.Bar(x = df_genre['Genre'],
y = df_genre['North America'],
width = anchos, name = 'North America',
text = df_genre['North America']))fig.add_trace(go.Bar(x = df_genre['Genre'],
y = df_genre['Europe'],
width = anchos, name = 'Europe',
text = df_genre['Europe']))fig.update_layout(title = "XboxOne Sales by Genre (MM)",
barmode = 'overlay',title_font_size = 40,
width = 1600, height = 1400)fig.update_layout(legend=go.layout.Legend(
x=1,y=1, traceorder= "normal",
font=dict(family="Verdana",size= 22, color = "black")))fig.update_xaxes(
title_text = 'Genre',
title_font=dict(size=30,family='Verdana',color='black'),
tickfont=dict(family='Calibri', color='darkred', size=25))fig.update_yaxes(
title_text = "Sales",
title_font=dict(size=30, family='Verdana', color='black'),
tickfont=dict(family='Calibri', color='darkred', size=25))fig.write_image(path + "figover1.png")fig.show()
图 3:重叠条形图。作者用 Plotly Express 制作的图表。
不出所料,射击游戏是北美人的最爱,销量是紧随其后的游戏的两倍。按比例来说,欧洲人只在赛车类型上与他们相匹配。
我们可以通过一个小的改动来改进图表:在第二个栏中将 offset 属性设置为 0.0005 。此属性移动绘制横条的位置(以位置轴为单位)。
fig.add_trace(go.Bar(x = df_genre['Genre'],
y = df_genre['Europe'],offset = 0.0005,
width = anchos, name = 'Europe',
text= df_genre['Europe']))
图 4:部分重叠的条形图。作者用 Plotly Express 制作的图表。
如图 4 所示的图表被称为部分重叠条形图。从概念上讲,当代表不同数据集的矩形开始重叠而不是并排放置时,它们相当于聚类(分组)条形图。重叠条意味着一个矩形在另一个矩形前面重叠 100%的极端情况。毫无疑问,观众会发现很难对三个或更多部分重叠的条进行比较。此外,重叠和部分重叠的条形图只有在较长的条形图总是在较短的条形图后面的情况下才能显示良好的信息。
总而言之:
当您想要对整体的各个部分进行直接比较时,可以使用簇状条形图。另一方面,重叠条形图能够很好地比较两个密切相关的数值变量。
如果你对这篇文章感兴趣,请阅读我以前的(【https://medium.com/@dar.wtz】):
带 Plotly Express、跟踪和布局的面积图
散点图,带有 Plotly Express、趋势线和分面
参考文献
[1]:https://www.kaggle.com/sidtwr/videogames-sales-dataset?select = Xbox one _ gamesales . CSV
客户细分的聚类算法
K-均值聚类的逐步指南
聚类分析信息图(图片作者来自网站
什么是聚类算法?
**在商业环境中:**聚类算法是一种辅助客户细分的技术,客户细分是将相似的客户归类到同一细分市场的过程。聚类算法有助于从静态人口统计和动态行为两方面更好地了解客户。具有相似特征的客户通常以相似的方式与企业互动,因此企业可以通过为每个细分市场创建定制的营销策略来受益于这种技术。
**在数据科学上下文中:**聚类算法是一种无监督的机器学习算法,它发现密切相关的数据点组。监督算法和非监督算法之间的根本区别在于:
- 监督算法:它需要将数据集划分为训练集和测试集,算法基于训练数据集的输出/标签进行学习,并将其推广到未观察到的数据。例如,决策树、回归、神经网络。
- 无监督算法:当数据集中没有任何已定义的输出/标签时,它用于发现隐藏模式。例如,聚类、关联规则挖掘、降维。
在这里,我收集了各种 ML 算法的实用指南。
机器学习实用指南
View list10 stories
为聚类准备数据
在概述了什么是集群之后,让我们更深入地研究一个实际的客户数据示例。我用的是 Kaggle 数据集“商城客户细分数据”,数据集中有五个字段, ID,年龄,性别,收入,支出分数。商场最关心的是顾客的消费分数,因此本练习的目标是在领域消费分数中找到隐藏的聚类。
1.加载和预览数据
使用 describe()加载数据集并汇总列统计信息。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from pandas.api.types import is_string_dtype, is_numeric_dtype df = pd.read_csv("../input/customer-segmentation-tutorial-in-python/Mall_Customers.csv")
描述数据集
检查每个字段的分布:对分类变量使用条形图,对数值变量使用直方图。
单变量分析(图片由作者提供)
数据分布(图片由作者提供)
如果您想了解更多关于数据可视化和 EDA 的细节,请查看这两篇文章。
2.数据预处理
既然我们已经定义了目标并对数据有了更好的理解,我们需要预处理数据以满足模型需求。在这个例子中,我选择 K 均值聚类作为主要算法,原因将在后面解释。
标准的 k 均值算法不能直接应用于分类数据。更具体地说,分类变量(例如,本例中的性别)的搜索空间是离散的(男性或女性),因此不能直接与连续空间组合并以相同方式测量距离。因此,我丢弃了“性别”字段和“客户 ID”字段。
由于 K 表示基于欧几里得距离解释数据点之间的接近程度,因此将所有维度协调到一个标准尺度中是很重要的。应该选择适当的数据转换类型,以便与数据的分布保持一致。来自 Google 的这篇文章提供了集群中数据转换的一般指南。
总而言之:
- 如果正态分布→归一化
- 如果幂律分布→对数变换
- 如果数据不符合任何分布→分位数
从前面的单变量分析中,我们可以看到这些变量既不符合正态分布也不符合法律分布。因此,我使用 MinMaxScaler 将数据范围缩小到 0 到 1 之间,同时保持分布形状。
数据转换(图片由作者提供)
3.电子设计自动化(Electronic Design Automation)
探索性数据分析提供了视觉线索,表明当将多个变量组合在一起时,是否有可能形成有洞察力的集群。这也是必不可少的一步,因为选择合适的聚类算法依赖于聚类的形状。一些基于中心的算法(例如 K 均值)更适用于球状簇,并且它们倾向于将线性簇分开。而基于密度的算法(例如 DBSCAN)更适合具有不规则形状和大量噪声的聚类。
我以下面的方式形象化了这三个领域。
2D 散点图
- 年龄与年收入
- 年收入与支出得分
- 年龄与支出收入
2D 散点图(图片由作者提供)
三维散点图:
- 年龄与年收入和支出得分
3D 散点图(图片由作者提供)
在这种情况下,很明显,“年收入与支出分数”的图表生成了一些基于中心的聚类。因此,我将使用 K 均值算法进行进一步的探索。
k 表示聚类
1.K 均值聚类是如何工作的?
k 表示聚类是一种基于中心的聚类算法,这意味着它根据接近度或距离将数据点分配给聚类,遵循以下程序:
- 指定星团的数量“K”。
- **初始化 K 个随机质心,给每个簇分配一个质心:**质心是每个簇的中心。开始时随机选择 k 个数据点作为质心,其他数据点的聚类标记随后相对于它们定义。因此,不同的初始质心分配可能导致不同的集群形成。
- **通过将数据点分配到最近的质心来形成 K 个聚类:**最近的质心通常由最小的欧几里德距离来定义,但根据使用情况,它也可以是相关或余弦。
- 重新计算每个聚类的质心:在所有数据点被分配到一个聚类后,对于每个聚类,我们重新计算属于该聚类的所有数据点的平均值,并将其定义为新的质心。
- **当质心不再变化时达到收敛:**重复步骤 2-4,直到达到停止准则,即质心不再变化或达到最大迭代次数。
该过程还确定了 K 均值算法具有将点聚类成具有相似大小的圆形的限制,并且它还严重依赖于预定义的数字 K
2.如何建立 K 均值聚类模型?
现在让我们仔细看看如何使用 python scikit learn 实现它。
首先,我定义了一个 KMeans_Algorithm 函数,它将数据集和聚类数作为参数传递。
定义 KMeans_Algorithm 函数(图片由作者提供)
该函数从 sklearn 库中调用 KMeans() 并指定一些关键参数:
- n_clusters: 集群的数量
- ***init:***它控制初始化技术,我选择了“k-means++”来以一种聪明的方式选择初始质心以加速收敛
- max_iter: 指定每次运行允许的最大迭代次数
- 算法 : 有几个选项可以选择,“auto”、“full”和“elkan”我选择“elkan”是因为它是一个 K Means 算法变体,使用三角形不等式使其更具时间效率。
- ****random _ state:**用一个整数来决定初始质心的随机生成
输出将生成以下属性和评估指标:
- ****cluster _ centres _😗*返回一个形心位置的数组
- 惯性 _: 数据点到其最近质心的距离平方之和
- 标签 _: 将聚类标签分配给每个数据点
- ****silhouette _ score:**数据点到同一聚类中其他数据点之间的距离与最近邻聚类中的数据点进行比较
在这个例子中,我主要对关于“支出分数”的聚类的形成感兴趣。因此,我使用了数据集 X1,X2,X3,如下所述,作为模型的输入。
请注意,我们不再需要为无监督模型的训练和测试划分数据集。
年龄与支出得分
下面的代码使用了数据集 X1——按比例调整的年龄与按比例调整的支出分数,并直观地显示了随着分类数从 2 增加到 10,分类是如何变化的。
年龄与花费分数的 k 均值(图片由作者提供)
代码的第一部分遍历多个集群,并为每个集群生成一个散点图,红色方块表示质心。如下所示,当指定的“k”值改变时,聚类也改变。
X1 的聚类结果(图片由作者提供)
之后,我基于两个指标评估模型性能:惯性和轮廓系数。
由于聚类是一种无监督算法,我们不能根据预测结果和实际结果之间的差异直接评估模型质量。因此,评估应基于 最小化类内距离同时最大化类间距离的原则。基于这一原理,有两种评价方法可以确定最佳聚类数。
1)利用惯性的肘法:
惯性测量样本到其最近聚类质心的平方距离之和。对于相同数量的聚类,惯量越小表示聚类越好。肘方法通过查看下图的转折点(“肘”点)来确定最佳聚类数,在本例中为 6。
肘法(图片由作者提供)
2)轮廓系数:
下面是让它显得令人生畏的剪影系数公式:
*但是基本上它转化为最小化簇内距离,同时最大化簇间距离。 a(i) 是数据点 I 到**同一聚类中其他数据点的平均距离,和 b(i) 是数据点 I 到最近邻聚类中所有点的平均距离。*目标是最小化 a(i) 并最大化 b(i) ,因此当系数越接近 1,表示聚类越好。在本例中,2 和 6 都显示了分数的峰值。
轮廓系数(图片由作者提供)
基于这两个指标的结果,在绘制“年龄”与“支出分数”的对比图时,6 很可能是最佳的聚类数。然而,无论是从分数还是从视觉效果来看,说年龄和花费分数一起形成有洞察力的聚类仍然不足以令人信服。
年收入与支出得分
从 EDA 过程中,我们观察到图表中有几个不同的集群。现在,让我们仔细看看该模型是否能如预期的那样将客户划分为不同的细分市场。该代码与上面的代码类似,但只是将输入数据集更改为 X2-按比例缩放的年收入与按比例缩放的支出分数。
**
年收入与支出得分的平均值(图片由作者提供)
很明显,当聚类的数量等于 5 时,存在相当好的分割,并且在散点图中也清楚地示出了这一点。
年收入与支出分数,含 5 个聚类
年龄对比年收入对比支出得分
如果你感兴趣,我们还可以进一步研究这三个领域是如何相互作用的。
年龄、年收入和支出得分的平均值(图片由作者提供)
虽然,就可视化和度量值而言,没有形成任何突出的聚类的迹象,但无监督学习是关于发现和探索隐藏的努力。尽管如此,做进一步的调查还是值得的。
3.如何应用于客户细分?
毕竟,聚类模型的目标是为客户细分带来洞察力。在本练习中,根据两个方面将客户分为 5 类:支出分数与年收入,这最有利于制定量身定制的营销策略。
如下所示,客户可以分为五类:
- 高年收入(7 万美元以上)和高支出分数(60 分以上)
- 高年收入(7 万美元以上)和低支出分数(40 分以下)
- 低年收入(低于 4 万美元)和高支出分数(高于 60)
- 低年收入(低于 4 万美元)和低支出分数(低于 40)
- 平均年收入(介于 4 万美元和 7 万美元之间)和平均支出得分(介于 40 和 60 之间)
基于每个群体的不同特征,企业可以不同地接近每个客户群体。第一类和第三类客户产生的收入最多,他们需要使用营销策略来留住客户,如忠诚度计划或通过时事通讯提供折扣。另一方面,客户获取策略更适合第二组和第四组。这可以是根据他们的收入水平量身定制的营销活动,因为高收入群体和低收入群体对产品有不同的偏好。
更进一步
使用 K 均值聚类有几个局限性,值得注意。当集群的大小和密度不同时,或者如果有任何显著的异常值,它就不能很好地工作。因此,当遇到类似这样的情况时,我们需要考虑其他聚类算法。例如,DBSCAN 对噪声和异常值有更强的抵抗力,并且层次聚类不假设任何特定数量的聚类。如果你想了解更多关于与 DBSCAN 的比较,请查看我的 Kaggle 笔记本。
希望你喜欢我的文章:)。如果你想阅读更多我关于媒体的文章,请使用这个附属链接(【https://destingong.medium.com/membership】T2)注册媒体会员。
带回家的信息
本文介绍了聚类算法,特别是 K 表示聚类,以及我们如何在业务环境中应用它来帮助客户细分。一些关键要点:
- 为聚类分析准备数据:数据转换和探索性数据分析
- 使用 scikit learn 实现 k 均值聚类算法
- 使用惯性和轮廓分数的聚类算法评估
更多这样的文章
原载于 2021 年 7 月 4 日 https://www.visual-design.nethttps://www.visual-design.net/post/semi-automated-exploratory-data-analysis-process-in-python。*
具有混合类别和数值特征的数据聚类算法
k-Modes 和 k-Prototype 算法直觉和用法
聚类是一种无监督的机器学习技术,它以这样一种方式将群体分成几个聚类或组,即一个聚类中的数据点彼此相似,而不同聚类中的数据点不相似。k-Means 是一种流行的聚类算法,仅限于数字数据。
为什么 k-Means 不能用于分类特征?
k-Means 是一种流行的基于质心的聚类算法,它将整个群体的数据点分成 k 个聚类,每个聚类具有几乎相等数量的数据点。k-Means 聚类算法背后的思想是找到 k 个质心点,并且数据集中的每个点将属于具有最小欧几里德距离的 k 个集合中的任一个。
k-Means 算法不适用于分类数据,因为分类变量是离散的,没有任何自然来源。所以计算欧几里得距离对于这样的空间是没有意义的。
k-Means 算法有一种变体,称为 k-Modes,适用于具有分类特征的数据。k-Prototype 是 k-Modes 算法的扩展,适用于混合分类和数字特征。
什么是 k 模式和 k 原型算法:
k-Modes 是一种基于 k-Means 算法范例的算法,用于对分类数据进行聚类。k-modes 根据数据点之间的匹配类别定义聚类。k-Prototype 算法是对 k-modes 算法的扩展,它结合了 k-Modes 和 k-means 算法,能够对混合的数值和分类变量进行聚类。
安装:
k-modes 和 k-prototype 算法可以使用开源库**kmodes**
实现。可以使用以下命令从 PyPl 安装 kmodes 库:
**pip install kmodes**
用法:
如前所述,**kmodes**
算法仅用于分类变量的聚类。而人们可以使用**KPrototypes()**
函数来用一组混合的分类和数字特征对数据进行聚类。
用于演示的数据集包含分类特征和数字特征。
**from kmodes.kprototypes import KPrototypes****kproto = KPrototypes(n_clusters=2, verbose=2, max_iter=20)
kproto.fit(df_array, categorical=cat_idx)**
**KPrototypes**
函数用于将数据集聚类成给定的**n_clusters**
(聚类数)。在拟合训练数据集时,开发人员需要将分类特征的索引指定为参数。训练时**KPrototypes**
算法将使用 k-Modes 算法训练分类特征,剩余的数字特征将使用标准 k-Means 算法训练。
训练后,可以使用**cluster_centroids_()**
函数获得聚类的质心。
**print(kproto.cluster_centroids_)**
使用函数**predict()**
来预测聚类。
**clusters = kproto.predict(df_array, categorical=cat_idx)**
实施:
(作者代码)
结论:
在本文中,我们讨论了如何将聚类应用于具有混合的分类和数字特征集的数据集。KPrototypes 算法结合了 k-Modes 和 k-Means 算法的实现,为具有混合数据类型的数据创建分类。k-Modes 算法可以处理缺失值或 NaN 值,但建议估算这些值以获得更好的性能。
kModes 库的实现模仿了**scikit-learn**
中的集群算法,并具有相同的 API。
阅读下面提到的文章中的以获得对 k-Means、k-Means++和 k-Medoids 算法的更多理解。
参考资料:
[1] KModes 库 GitHub 库:https://github.com/nicodv/kmodes
感谢您的阅读
用于经济政策指导的聚类算法
行业笔记
在本教程中,我们将探索如何将数据科学方法应用于现实世界的经济政策挑战。
作者照片
T 创新的魔力总是产生于不同知识的融合。在那里,固执的学者们用新思想进行实验,以推进科学前沿。这无疑类似于知识领域像分子一样融合时释放的化学反应。当狡猾的技术和抽象的理论在点火和炼金术的地狱中结合在一起。
经济学和数据科学也是如此,这两个专业不仅有着共同的目标,而且都来自同一个知识宝库——统计学。在过去的几年里,他们变得越来越紧密。
Einav 和 Levin (2014) ,在一篇题为:大数据时代的经济学的论文中,将这种发展称为“实证转向”。在对未来的预测中,他们进一步指出,经济学将越来越多地采用机器学习学术社区中用于分析大数据的技术。事实上,Python 包的出现,如 EconML 、 DoWhy 和 DeepIV 证明了他们预测的准确性。
鉴于这些有趣的发展,本文的目的是说明聚类,一种无监督的学习方法,可以用来解决最优税收问题。
数据集
作者照片。
本文通过一个由 200 家索马里公司组成的小数据集,将重点放在寻找可能有助于设定适当税率的隐藏模式上。快速浏览数据集的信息表可以发现,我们既有丰富的地理信息,也有金融信息。总共有 14 列。
最重要的栏目是以美元计算的收入、连续活动的年数、增长潜力、公司经营的行业及其税收负担。地理位置当然也很重要。
如果您想对数据有所了解,或者您想亲自体验一下,您可以从下面的 Datapane 下载:
有趣的栏目:
- Growth _ Potential _ Index(0-100 的较高值,表示公司在中短期内可以快速增长)
- 月收入($) (公司月总收入)
- An_Revenue ($) (一年的月收入外推)
- 税收负担(可从总收入中扣除的官方税率)
- 税收 _ 收入(当地政府每年从公司获得的收入)
- 产业(相当明显)
- 地理信息(我们有经纬度,城市和省份)
该数据集可用于各种目的,但本文的目的是应用无监督学习算法对公司进行聚类,并确定它们是否被过度征税或征税不足。
但在我们探讨税收归宿的话题之前,让我们先对数据集进行一些探索性分析。
图 1:按城市/省份统计的价值。作者照片
图 1)显示,许多公司位于贝纳迪尔海岸和索马里首都摩加迪沙。其次是较大的城市,如博萨索、拜多阿和贝莱德文,其中第一个城市以其繁忙的港口和渔业闻名,后两个城市是该国南部的主要农业贸易中心。
图 2:按行业统计的价值和按增长潜力统计的税收。作者照片。
图 2)表明,我们数据集中的绝大多数公司都在金融服务领域运营,反映了索马里内战后时代(2000 年代和 2010 年代)的移动货币和汇款繁荣。第二个子图揭示了存在集群模式,其中企业是明显可区分的,因为一些企业产生高税收,而另一些企业产生较低的税收。这些公司的增长潜力也各不相同。
图 3:增长潜力、月收入和税收收入之间的成对网格图。作者照片。
可悲的是,图 3)几乎没有埋藏洞察力的宝藏。唯一值得注意和引人注目的模式似乎表明,现代企业需要支持,或许是减税以刺激增长和释放规模经济。因为其中一个散点图显示,有一群增长潜力低、月收入相对微薄的公司。也许这是一个逃税的例子,否定了我提出的用税收刺激经济增长的建议。
图 4:按部门划分的收入与税收归宿。作者照片。
图 4)无疑是迄今为止发现的最深刻的洞察力。我们可以清楚地看到——由于条形的颜色和大小形成对比——制造业和建筑业产生的税收收入占年收入的比例最高。与能源和电力、金融和资金转移等行业相比,农业和畜牧业的税率也不成比例。下图进一步证明了这一观察的可信度。
图 5:税负与增长潜力对比。作者照片。
在图 5)中,我们按降序比较了各个行业的增长潜力和税收负担。显而易见,制造业和建筑业以及农业和畜牧业在所有行业中的税负份额最高,尽管它们的增长潜力最大。一个可能的解释是,这两个部门都向摩加迪沙和博萨索的主要港口缴纳进出口税。因此,需要政府干预来减轻税收和运输成本的负担,这无疑会阻碍经济增长。此外,聚类算法可能有助于识别需要解决的隐藏模式。
k 均值聚类
众所周知,大多数机器学习模型分为三个不同的类别:1)监督学习,2)非监督学习,以及 3)强化学习。在第一类中,结果变量是已知的,无论是连续的数值变量还是必须预测的类。聚类属于第二类,没有明显的结果可以预测。主要目的是找到隐藏的模式,并简单地将杂乱无章的数据组织成组。
因此,聚类练习的起点总是一团数据点,我们的目标是使模型能够找到隐藏的模式,并根据列间的相似性将每个点分配到一个组(聚类)。聚类算法有许多应用,从生物遗传学到客户细分,再到内容推荐引擎。
图 6:月收入与增长潜力指数的散点图。作者照片。
从前面的图(图 6)中可以看出,我们总是首先检查最重要变量上的分散点。这项工作的目标是直观地衡量集群的最佳数量。给定情况下的最佳集群数是 5,这不是很明显吗?观察左上方和右上方的聚类,紧密聚类的数据点中间的斑点,以及两个方向上的底部两个。作为这种原始方法的替代,我们可以使用肘方法来计算惯性分数。
图 7:最佳聚类大小检测的肘形图。作者照片。
惯性分数表示聚类内平方和(WCSS ),它表示每个数据点与其所属聚类中心之间的距离。K-means 聚类寻求优化这个 WCSS,以便为可达到的最小距离找到尽可能少的聚类。因此,WCSS 越大,集群越松散,反之亦然。从图 7)中,我们可以发现 WCSS 和集群大小之间的最佳平衡是 5,其中折线图弯曲得像一个弯头。
图 8:惯性得分及其目标函数。作者照片。
检测到 5 是最佳的聚类大小后,我们现在可以开始实现 K-means 聚类模型。
结果向我们展示了五个清晰可辨的集群及其 id。
图 9:集群的散点图。作者照片。
结论
最后的任务通常是给集群命名,并将结果传达给决策者。在我们的例子中,下面的集群名称和随后的结论如下:
集群 0 (右下):收入高但增长潜力低 HL 。
集群 1 (左下):低收入和低增长潜力 LL 。
集群 2 (右上):高收入高增长潜力 HH 。
集群 3 (左上):低收入但高增长潜力 LH 。
集群 4 (中):收入中等,增长潜力中等 MM 。
就经济政策建议而言,我们可以从这项工作中得出以下结论:
- 能源和电力部门属于 LL 类组 1。该行业的企业税负较低,这一点应该保持不变。在当代索马里的社会经济环境中,这一部门进一步发展的可能性很大。
- 电信部门属于 HL 群组 0 类别。该部门的公司虽然收入最高,但税负较低。这一领域似乎监管不足。这些公司应该缴纳公平的税收份额,这将为帮助其他更不景气的行业提供更多的政策空间。
- HH 集群 2 无疑是制造业和建筑业,目前是税负最高的行业之一(约 38%)。我们早些时候已经指出这个部门是如何在主要港口遭受原材料进口税的。电信部门收入的增加可以允许当局这样做。
- LH 第 3 组可确定为农业和畜牧业,这是索马里经济的支柱。这些国家的大部分劳动力都在这个部门就业。除此之外,它在更好的粮食安全方面发挥着关键作用,因此必须得到培育和保护,免受港口和机场不合理的关税和税收。为了实现这些战略目标,必须降低目前接近 40%的高税负。
- 我们还没有讨论的最后一个扇区是 MM 星团 4。是我们政策指导制定剩下的最后一个行业。它可以被认为是金融和货币转移行业,正如我们所看到的,其税收负担非常低,约为 15%。为了更具战略重要性的产业,建议政策制定者提高这一比率。
在本文中,我们研究了如何将经济学和数据科学结合起来,以获得关于紧迫问题的新视角。我们探索了 K-means 聚类算法,经历了一次灵感引力之旅。当然,还有更多的聚类算法:比如 DBSCAN、Affinity Propagation、MeanShit 等等。但这是另一个帖子的故事。
在我的博客上订阅时事通讯,我正在那里为未来的出版物建立读者群。我的推特账号是 @warsame_words ,我欢迎反馈和建设性的批评——对于后者, LinkedIn 是一个受欢迎的渠道。谢谢你陪我走完这段旅程。在 Medium 上关注我,了解我的最新数据相关文章,例如:
[## 无处不在的假新闻:如何用 SOTA NLP 检测
towardsdatascience.com](/fake-news-everywhere-how-to-detect-it-with-sota-nlp-f2dc1e07247c)
新冠肺炎期间的聚集性和帕金森病人
变化数据,原因聚类
在新冠肺炎期间发现帕金森病患者的亚组,以对社区内的潜在亚组受疫情影响的方式进行详细分析。
图片来自 iStockPhoto
围绕新冠肺炎有许多挥之不去的问题;久而久之,我们揭示了疾病对不同人群的不同影响。试图理解由高层人口统计学分层的影响是本能的;然而,对遭受神经损伤的社区有什么影响?
在一个 3 人小组中,我们决定分析新冠肺炎影响帕金森氏病患者的方式。帕金森病是第二常见的神经退行性疾病;因此,了解 Covid 对帕金森病患者的影响是有益的。
我们的管道(图片由作者提供)
我们的数据
所使用的数据是围绕疫情和帕金森社区的最大和第一个数据集,由迈克尔·J·福克斯帕金森研究基金会提供。该系统包含 57 个不同的调查/数据集可供选择;我们小组决定合并以下调查:
- **关于你:**人口统计信息,29 列
- **新冠肺炎在 PD 社区的经历:**关于 PD 社区如何受到影响的信息,214 个专栏
- **你的心情:**心情得分,20 列
数据观察
- “情绪”、“Covid”和“关于”信息在单独的数据帧上
- 大量的空值
- 一些行包含“不愿回答”
- 无关列
- 许多二进制列
作者图片
数据预处理目标
- 加入情绪、covid 和关于日期和 id
- 删除包含空值的列
- 删除“不愿意回答”行
- 将情绪列一起编码到单独的类别中
- 由于我们使用聚类算法,我们将执行主成分分析
经过预处理后,我们绘制了解释方差对 PCA 成分的数量。
作者图片
作者图片
由于用 35 个主成分解释的方差比刚好低于 0.80,我们得出结论,35 个主成分将足以压缩 293 列。
k 均值聚类
在高层次上,机器学习的两个子集是监督学习和非监督学习。这两者之间的区别在于实例是否已经被预先标记(监督学习)或者没有被预先标记(非监督学习)。
给定预测值和它们相应的标签,训练监督学习算法,直到它能够区分预测值和它们的标签之间的关系。首要目标是根据新数据实现标签的准确预测。然而,对于无监督学习,目标是推断数据中以前未知或不清楚的关系和模式。
K-Means 是最常见的聚类技术之一,属于无监督学习方法的范畴。通过聚类技术解决的基本情况是当我们想要通过相似性推断数据的自然分组时。
选择‘k’
我们的算法需要输入聚类数 k,您可能想知道我们如何选择合适的聚类数。首先,在选择“k”时没有确定的答案或万无一失的方法。然而,有一些常见的做法来获得一些关于“k”的适当值的直觉。对于这个项目,我们选择了肘方法。
肘法是一个相对简单的想法。对于不同的 k 值,我们简单地评估数据点和它们指定的聚类质心之间的平方距离之和,并且我们选择平方距离之和开始以图形方式变平的 k 值。
作者图片
根据肘法,一个合适的“k”可能在 6 左右。下面,我们通过绘制主成分 1 与接下来的 5 个主成分来可视化具有 6 个聚类的聚类算法的性能。我们可以看到,该算法在识别独立的集群方面做得不错。
基于情感比较聚类
作者图片
虽然大多数集群都有相当积极的反应,但作为对立物脱颖而出的两组是第一和第二集群。
我们使用 Spark 重新运行数据,发现了类似的结果:
作者图片
一个自然的问题出现了:我们能找出是什么导致了两组人之间的差异吗?
收入
作者图片
通过对第 4 组的收入分析,我们发现该组的平均收入得分最低,收入“低于 2 万美元”的比例最高,收入“超过 10 万美元”的比例最低。随后,第 4 组在财务方面受 Covid 的影响最大。
Covid 的影响
作者图片
此外,与平均值相比,第 4 组的 Covid 症状恶化率更高。他们也被建议自我隔离。
收入人口统计
作者图片
第 4 组和第 5 组之间的收入统计数据的比较显示,第 4 组实际上没有退休的患者,而第 5 组有绝大多数退休的患者。
作者图片
由于年龄和退休之间的直接关系,年龄显然是一个需要探索的重要特征。所有患者的年龄分布显示,大多数患者年龄较大。第二个情节突出了第四组是迄今为止最年轻的一组,平均年龄只有 29 岁;这是之前直方图中的一个大的异常值。因为第四组是最不快乐的,我们决定分析这是否普遍。在最后一张图中,我们绘制了所有“快乐”分数与年龄的关系。我们可以看到有一个年龄随正分线性增长的总趋势。
对此的一个可能的解释是,想要社交的年轻人更容易受到 Covid 的社会影响,而更居家的老年人生活更正常。
摘要
- 尽管聚类仅基于欧几里德距离,但如果存在一些基本的差异组(对于正确数量的聚类),它也能准确地捕捉到这些差异组。
- 在这种情况下,聚类分析显示,在新冠肺炎期间,有明显的社会影响对年轻组比对老年组帕金森病人产生不利影响。
— — — — — — — —— — — — — — — — — — — — — — — — — — — — — — —
团队包括:克里斯塔贝尔·帕巴兰、维克多·纳兹鲁克汉扬和丹尼尔·卡雷拉
“Fox Insight 研究(FI)由迈克尔·J·福克斯帕金森研究基金会资助。我们要感谢帕金森社区参与这项研究,使这项研究成为可能。”
“本文准备过程中使用的数据于 2021 年 3 月 10 日从 Fox Insight 数据库(https://Fox Insight-info . michaeljfox . org/Insight/explore/Insight . JSP)获得。有关该研究的最新信息,请访问 https://fox insight-info . michaeljfox . org/insight/explore/insight . JSP。
不列颠哥伦比亚省温哥华的餐馆聚集区
我们可以在哪个集群中找到这家餐厅?让我们来了解一下!(照片由 Unsplash 上的 JP Holecka 拍摄)
通过 Python 中的主题建模和聚类算法,我展示了温哥华各个街区美食的地理模式。
作为一个自豪的温哥华人,我经常向在美国生活时遇到的人提起我来自哪里。除了搞不清楚温哥华位于哪个海岸之外,不熟悉的人通常会告诉我,他们访问这座城市只是为了乘船去阿拉斯加。然而,温哥华不仅仅是加拿大的西部港口。旅游指南宣称温哥华以其的自然美景、令人难忘的户外活动和多样化的社区而闻名。然而,如果不提到温哥华充满活力的美食,那么对温哥华的描述就不完整:
不要告诉这个国家的其他地方,温哥华是加拿大的外出就餐之都。放弃你的饮食,直接进入北美最好的亚洲美食,从闲聊的中国餐馆到越南的 banh mi 三明治店,或者释放你对新鲜捕获的当地海鲜的丰富自助餐的食欲,包括季节性斑点虾和多汁的野生鲑鱼。——孤独星球
但是如果没有旅游指南,我们还能如何找到描述温哥华美食之都的方法呢?答案当然在于数据。
动机:
我对透过温哥华众多“美食街区”的视角探索温哥华很感兴趣——毕竟,当人们说他们住在温哥华时,他们实际上是指他们在外出就餐的地方花了很多时间。和大多数城市一样,温哥华的餐馆往往聚集在客流量大的地区(对此的经济解释可以在这里找到)。
温哥华罗布森街的谷歌地图街景。我们仅在一个街区就有至少四家餐馆!(图像屏幕-由作者捕捉)
但考虑到温哥华可供就餐的美食种类繁多,我对特定类型的美食通常位于何处,以及餐馆聚集在一起的方式是否有任何模式变得更感兴趣。通过主题建模和聚类算法的应用,本博客旨在回答两个问题:
- 某些类型的菜肴在某些地区比在其他地区更有代表性吗?
- 我们可以根据温哥华最受欢迎的美食来划分区域吗?
旅行者在选择外出就餐的特定菜系时可以使用这种分析来识别感兴趣的区域,但也可以标记特定菜系的餐馆经营者的进入区域,该餐馆经营者希望避开可能已经被该菜系饱和的区域。
数据收集和准备:
为了回答这些问题,我使用了 Yelp 提供的数据,确定了位于温哥华本地边界内的约 4000 家餐馆类企业。我从 Yelp 餐厅数据中分析了三个主要特征:
- 地理位置
- 来自 Yelp 定义的餐厅标签的美食类型
- 平均星级的贝叶斯估计。这是 Yelp 确定的 5 星评级的一种修改措施,用于减少评论数量少的企业产生的噪音。我用来计算这个指标的公式可以在这个网站上找到
我的数据样本,如果我自己这么说的话,这是一个非常好的多汁猪肉饺子的地方……(图片由作者提供)
我们分析的第一步是为我们的餐馆数据确定标签,这些标签将餐馆分成人们会去并容易走进的区域。我称这些为“美食社区”我从温哥华市政府定义的 22 个社区中的餐馆位置开始:
(图片由作者提供)
餐馆往往聚集在一些可见的区域,但城市提供的街区边界在识别我们的美食街区时提出了两个问题:
- 我们看到出现在城市街区边界的餐馆集群会被任意分割。
(图片由作者提供)
- 我们还看到,像美景镇这样的较大的社区将大量的餐馆聚集在一起,而没有占据社区内较小的、更适合步行的区域。
(图片由作者提供)
我避免使用城市的标签来识别我的烹饪社区,而是使用 KMeans 聚类算法在餐馆的位置上生成标签。在我指定了我希望在我的数据中包含的标签数量(KMeans)之后,该算法的效果是根据它们的位置来标记餐馆。使用 scikit-learn 的轮廓分数作为优化我的标签质量的指标,我将我的数据分成 123 个烹饪社区。这产生了以下更新的餐厅图,用颜色表示我们烹饪社区的不同标签:
(图片由作者提供)
数据建模
现在我们已经确定了我们的烹饪社区,我们可以开始确定在这些社区中发现的烹饪类型的模式。我将我的数据建模过程概述如下。
- 首先,我将每个街区表示为不同菜系数量的向量。这给了我们一个初步的方法来量化我的邻居,并找出他们之间的差异。
- 为了纳入餐馆质量的信息,我进一步调整了每一种菜系的计数,这是基于该街区对该菜系相对于城市平均水平的平均评分。
- 我的数据显示有 332 种不同的烹饪类型,因此很难确定我们的数据中可能存在什么模式。因此,我对我的数据应用了一种 NMF 算法,将每个街区描述为一个美食群体的集合,而不是许多单独的美食类型——这一过程被称为主题建模(下文将详细介绍)。为了简单地描述这个过程,NMF 算法使用关于通常发生在邻近地区的烹饪类型的信息,并创建由各个烹饪类型的分布构成的烹饪组(主题);然后,该算法根据每个街区在每个烹饪组中的权重,生成每个街区的表示。
(图片由作者提供)
- 将每个邻域转换成烹饪组集合后,我应用另一个 KMeans 聚类算法,根据每个烹饪组的权重对邻域进行聚类。这将决定我们可能会在每个街区代表的烹饪群体中看到什么样的模式。
(图片由作者提供)
主题建模温哥华美食
在对我的数据尝试 NMF 算法的不同数字输入后,我决定对四个烹饪组进行建模。按照在每个烹饪组中的权重显示前 5 种烹饪类型揭示了一些非常独特的主题。
平均类别计数还显示了城市中每种烹饪类型的出现与其在每个烹饪组中的权重之间的一般相关性(图片由作者提供)
第 1 组(酒吧/西方)的主要特点是酒吧的出现,以及西方美食类型,如三明治、海鲜和来自加拿大和美国的美食。
对于第 2 组(中国/越南),我们看到中国美食和其他相关标签如点心和海鲜的权重很大。鉴于温哥华有大量的中国人口,这在温哥华作为一个烹饪团体并不令人惊讶。然而,我们也看到了相当大的重量为越南菜,这意味着这些美食一起出现在类似的地点。
第 3 组(日本/韩国)显示了类似的趋势,日本料理占很大比重,而韩国料理也占相当大的比重。
最后,我们有第 4 组(休闲/咖啡馆),它有咖啡和茶、咖啡馆、早午餐、比萨饼和三明治,是这个烹饪组的特色。
按烹饪类别对温哥华街区进行聚类
现在我们来看看我们的第二个 KMeans 聚类算法是如何基于烹饪组权重对我们的邻居进行聚类的。在这里,我选择 K = 5 是基于确定损失度量的最大减少,惯性(参见 scikit-learn 的聚类文档的第 2.3.2 节)。
下面,我提供了显示特定邻域分组的邻域具有的权重范围的箱线图。除了邻域标签#5 之外,这些邻域聚类中的每一个都表现出对我建模的四个烹饪组中的一个的强权重,如来自特定烹饪组的每个邻域的高权重所示。
(图片由作者提供)
结果
在所有这些建模之后,我们最终可以在温哥华的地图上绘制出我们得到的邻域标签,在那里我们可以找到针对特定烹饪群体的加权区域。每个邻域分组的图例如下:
- 绿色:偏向条形/西部
- 黄色:偏向中国人/越南人
- 紫色:偏向日语/韩语
- 红色:偏向休闲/咖啡馆
- 蓝色:不偏向任何一个烹饪类别
(图片由作者提供)
总的来说,温哥华的许多地区并不是由一个特定的烹饪团体主导的,直到你开始搬进住宅区或温哥华市中心。以下是我从这张地图中得到的一些亮点:
- 在橙色圆圈中,我们看到温哥华市中心被绿色的酒吧/西餐集团所占据,这是可以理解的,因为这与温哥华的夜生活有关。然而,我们也看到了一些标记为其他烹饪组的口袋,不仅显示了温哥华的餐饮选择是多么多样化,而且也显示了日本和中国烹饪组的密集区域。这些饱和区可以定位有意义的区域,如温哥华的唐人街,由市中心东侧的黄色集群表示。
- 金色圆圈代表我在查看数据时的一个发现。在我进行分析之前,我所知道的温哥华唯一充斥着日本或韩国餐馆的地区都位于市中心。然而,调查这个美食街区的标签,发现一个由日本餐馆主导的区域,我以前并不熟悉。我看了一下排名前三的日本餐馆,发现它们也有一些不错的评论!我在这里联系一下供参考: Saku 、 Uma 寿司、丸里路咖啡馆。
总结思路
我的项目揭示了温哥华的餐馆场景可以分为四大菜系,其中三个主要倾向于酒吧、中国和日本菜系。在地图上标出不同的菜系表明,在某些地区某些民族的菜系占主导地位,从而确定人们可以在城市的多个地区寻找特定的菜系。
我计划研究如何将温哥华的其他地理和人口特征结合起来,看看能否根据用户可能被吸引的区域创建一个餐馆推荐系统。
我对这些街区的最终标记似乎与我对这个城市的了解相吻合。它和你的一致吗?如果你同意或不同意,请在评论中告诉我!