跳到主要内容

Just KNIME It 第二季(2023)

特别感谢“晨曦”对以下中文内容的修订。

“Just KNIME It!”是什么?

“Just KNIME It!”(就用KNIME吧!)是 KNIME 官方提供的一系列和数据相关的挑战。你可以通过 KNIME 构建工作流来解决这些挑战,在此过程中你还可以向社区其他参与者学习。

  • 每周三,KNIME 官方会出一个可以通过 KNIME 解答的问题。
  • 然后参与者会自己想出一个解决方法(随时可以利用KNIME的论坛参与讨论),并且用工作流的方式实现它。
  • 在下一周的周二,KNIME 会把官方的解决方案分享出来。
  • 因为每个挑战可以有很多解决方法,KNIME 官方鼓励你在 KNIME Hub 以及社交媒体上分享你的解答,共同为问题寻找最佳答案!
  • 每个挑战都标注了的难度等级:简单,中等或者困难。
指北君小提示

虽然这一季活动已经过去了,但你可以随时通过挑选自己感兴趣的题目练习构建 KNIME 工作流,提高自己解决问题的能力。

在挑战时,可以先下载相关挑战的数据之后,自己进行尝试,如果没有成功,你可以借助“解决方案摘要”前进,如果还是没有成功,可以通过“工作流构建描述”了解构建工作流中使用了哪些节点,甚至下载官方答案或参考社区讨论进行学习。

在下面,指北君已帮你将题目翻译成了中文(感谢“晨曦”对中文内容的修订),并做好了相应提示的整理,对于社区讨论(英文),可以通过使用浏览器的翻译功能进行查看。

你现在只需要 -- Just KNIME It

关于挑战的数据和答案

每一个挑战的数据都可以在这个链接中 找到并下载。

也可以通过指北君为你准备的百度网盘(链接: https://pan.baidu.com/s/1XSnesg63-wsqNLQqPg9OUA?pwd=genv 提取码: genv )或 微软OneDrive 统一下载所有数据和参考答案,导入 KNIME 进行学习。(导入流程类似《KNIME 视觉化数据分析》学习资料导入过程)

注:参考工作流中如果发现数据不能成功读取的情况,那么有可能是数据文件路径的问题,需要使用者手动更改数据文件路径,或者复制数据文件到工作流中指定的数据目录中。

挑战01:比对各国的汇率 - 难度:简单

你现在投身于研究和交易各国货币,工作职责之一是对比从 1980 年至 1998 年间美元与其他八种货币的日常汇率。由于周末或假期的存在,数据中存在一些缺失项,需要你针对此情况选择合适的方式进行处理。然后,你需要计算各种货币之间的汇率关联度,并将其结果进行可视化。最后回答以下问题:哪种货币的正/负相关性最大?哪些货币之间并未发现显著的关联,或者说关联性较弱?

解决方案摘要

在读取包含有日常汇率数据的数据集之后,我们采取了一个简单的策略,即用前一日期的数据来替代缺失的数据。然后,我们利用皮尔逊系数计算了所有货币对之间的线性相关性,并用热力图进行了可视化。正相关性最高的是瑞士货币、德国货币和荷兰货币,而最高的负相关性是澳大利亚货币和日本货币。相关性接近零的是加拿大货币与荷兰/德国货币。

工作流构建描述

我们首先通过表读取器(Table Reader)节点读取含有日常汇率的数据集。接下来,我们利用缺失值(Missing Value)节点,将每一个缺失的值替换为之前的一个非缺失值,然后通过线性相关性节点(Linear Correlation)计算各种货币对之间的皮尔逊相关性。最后,我们利用热力图节点(Heatmap)以一种互动的方式来展示这些相关性。

挑战02:信用卡客户的分群 - 难度:中等

信用卡 ABC 公司积累了大量关于客户购买与支付的信息,以付款详情与购买详情的形式展现。公司计划将客户分成三个类别,如此一来,就可以根据每个类别的特征来设计市场宣传活动。你的任务就是依据以上信息,建立一个聚类模型来合理划分客户群体。同一类别中的客户有哪些共同特征?另外,还有一些新注册的客户信息,你需要利用已训练好的聚类模型,为新注册客户设定类别标签,并将结果导出成 CSV 文件。最后回答如下问题:关于用户类别划分结果,应如何评价其质量?

解决方案摘要

为了应对这个挑战,首先我们将数据分为现有用户和新注册用户两类。接下来,对现有用户的数据进行预处理,针对缺失数据进行处理并进行标准化以便于后续的聚类操作。接着我们利用 k-means 算法对这些数据进行聚类,簇数选择 3(k=3),并通过计算轮廓系数( Silhouette )来评估聚类效果(系数越接近1,表明聚类结果越好)。我们还利用散点图对分好的群体进行了视觉化展示。最后,我们将分类模型应用到新注册的用户上,并进行分组。

聚类算法对于将用户的消费习惯分类很有帮助,比如发现消费能力差的用户(Cluster_1,消费力和购买力都较低的用户);潜力用户(Cluster_0,消费力较强但购买力较弱的用户);还有高消费者(Cluster_2,消费力和购买力都很强的用户)。可以根据这些不同的消费群体来制定市场营销活动,以提升收入。

工作流构建描述

我们首先通过分区节点(Partitioning)将数据分为现有用户和新注册用户。接下来,我们使用“缺失值”(Missing Value)和“标准化”(Normalizer)结点对已存在用户的数据进行预处理,并创立模型以便清理新用户数据(使用"缺失值应用"Missing Value (Apply)和"标准化应用 "Normalizer (Apply)结点)。在对现有用户的预处理数据进行 k-means 节点聚类后,我们使用“反标准化” Denormalizer 节点并使用“颜色管理” Color Manager 和“散点图” Scatter Plot 节点将其视觉化。同时,我们还利用“轮廓系数” Silhouette Coefficient 节点对利用 k-means 算法划分出的聚类质量进行评价。由于质量良好,我们将划分出的类别ID分配给通过预处理之后的新用户数据上(使用“聚类分配器” Cluster Assigner 节点)。最后我们对这些数据进行反标准化(“反标准化” Denormalizer 节点),并将数据及其类别 ID 一起写入 CSV 文件中(CSV Writer 节点)。

挑战03:比较月度销售 - 难度:中等

ABC 杂货店的销售经理寻求一种方法,用以比较所选月份与前一个月的销售量。你的任务是在 KNIME 中创建一个可以执行此任务的组件,并且该组件可以用可视化方式展现比较结果。如果没有上一个月的数据,则只显示所选月份的数据。选择比较月份时,对比月份之间不应该超过 12 个月。

解决方案摘要

为解决这个挑战,我们建立了一个组件,允许用户(1)选择希望比较销售额的月份,(2)选择一个基于已有间隔的之前的月份。举例来说,用户可以选择2020年6月作为(1),并通过输入 -3 的月份间隔,选择2020年3月作为(2)进行比较。组件还包含了一个柱状图,用来比较两个所选月份的销售额,同时还有一个刷新按钮,让用户可以调整他们的月份选择和柱状图。

工作流构建描述

在用 Excel Reader 节点读取数据后,数据就进入到我们创建的组件(比较月度销售)中。在这个组件里,我们有三个 widget 节点来收集用户的输入:用于选择月份的 Date&Time Widget 节点,用于选择间隔的 Integer Widget 节点,以及在流程开始阶段就可以让用户调整他们的比较选择的 Refresh Button Widget 节点。接下来,所有用户输入的内容都会用 Merge Variables 节点合并,并使用 Variable to Table Row 将这些值变为表格形式。这些值都会经过 String to Date&Time 和 Date&Time Shift 节点的预处理,这样就可以根据输入的内容正确地筛选数据。经过一些预处理后,就可以利用 Reference Row Filter 节点做最终的筛选,这个节点将把原始数据和两个所选月份作为输入,输出相应的数据行(月份和销售额)。并用 Date&Time to String 节点将日期数据转换回字符串,这样就可以与 Bar Chart 节点期待接收的输入数据类型兼容。最后,这个节点将为两个所选的月份绘制出销售额柱状图。

挑战04:年度数值的月度分布 - 难度:简单

你的团队梳理了去年每项工程的支出总额汇总报告。数据的形式如下:

年份      区域        工程       支出
2022 A区 工程A 120
2022 B区 工程X 160

然而你公司的财务部门希望能对支出有更详细的了解。具体是,A 区的项目支出应该平均到 12 个月中,而 B 区的项目支出则应按季度平均。最后,原表格应修改为如下形式:

年份      区域        工程        支出
2022 A区 工程A 一月 10
2022 A区 工程A 二月 10
...
2022 B区 工程X 第一季度 40
2022 B区 工程X 第二季度 40
...
解决方案摘要

为了解决这个挑战,我们首先分开 A 区和 B 区的数据。接着,我们创建了年度月份和季度的附加表,并将这些表与 A 区每个工程支出的十二分之一以及 B 区每个工程支出的四分之一结合起来。最后,我们将这些信息汇聚成一张表。

工作流构建描述

在用表阅读节点 Table Reader 读取了这个挑战的数据集后,我们使用行分割节点 Row Splitter 基于区域( A 区或者 B 区)将数据集分割。然后,我们把对应 A 区的行交给数学公式节点 Math Formula 处理,这个节点会将每个 A 区工程的支出除以 12。同时,我们使用表格生成节点 Table Creator 为每年的十二个月创建标签,然后使用交叉连接节点 Cross Joiner 将 A 区工程的支出份额和这些标签组合。于是我们得到一张表,该表格把每个 A 区工程的支出均匀分布在每个月中。类似地,我们将对应 B 区的工程行导向到另一个数学公式节点 Math Formula,这个节点会将每个工程的支出除以 4。另一个表格生成节点 Table Creator 被用来为每年的四个季度创建标签,并且再一次使用交叉连接节点将支出份额和季度标签组合。最后,B 区工程的支出均匀分布在每个季度里。这两张更详尽的表被连接节点 Concatenate 整合。

注意:交叉连接节点 Cross Joiner 的计算成本很高,因为输出的行数是两个输入表格的行数的乘积。如果在流处理模式下执行,只有顶端输入是以流处理方式处理的。

挑战05:基于空气质量和水污染对国家的排名 - 难度:简单

地球日刚刚过去,我们需要进一步唤起人们对空气质量和水污染问题的关注。在此背景下,你决定研究一个 2020 年的数据集,该数据集收集了用户对不同城市在空气质量和水污染上的投票信息。空气质量评分从0(质量差)到100(顶级质量),水污染的评分也是从0(无污染)到100(极度污染)。你的目标是找出两个排名前十的国家列表,其中一个排名基于空气质量的糟糕程度,另一个基于水的污染程度。

解决方案摘要

为了解决这个挑战,我们首先将数据按国家进行分组,计算每个国家的平均空气质量和水污染度,以此来代表国家的总体情况。然后,我们对这些数据进行排序,一种是根据空气质量(从低到高),另一种是根据水污染程度(从高到低)。最后,我们挑选出空气质量最差和水污染程度最高的十个国家,并用两个柱状图明确地展示出来。而经过我们的计算,贝宁 Benin 被评为水污染最严重的国家之一,中非共和国 Central African Republic 则是空气质量最差的国家。

工作流构建描述

在读取了CSV Reader节点中的数据集之后,我们用列过滤节点 Column Filter 过滤掉了无关的地区信息,然后使用 GroupBy 节点将数据按国家进行分组,这样我们就得到了数据集中每个国家的平均空气质量和水污染级别。接下来,我们使用两个 Top k Selector 节点对数据进行排序,一个是根据空气质量(升序),另一个是根据水污染级别(降序)。最后我们用这些数据生成包含两个条形图的视图:一个显示空气质量最差的国家,另一个显示水污染最严重的国家。我们采用了两个 Bar Chart(Labs)节点来制作条形图。

挑战06:航空公司的点评 - 难度:困难

你为一家市场营销代理机构工作,负责监控几家航空公司的用户评价信息。你要求识别出一个提及航空公司的推特(类似国内的微博平台)信息是积极的、中性的还是消极的,于是你决定为此任务实现一个简单的情绪分析分类器。在将这个过程自动化后,你能得到多高的准确性?这个分类器有可能协助公司的审查员节省他们的时间吗?

注:考虑到数据集的规模,训练分类器在你的电脑上可能会花费一些时间(如果你使用更高级的算法会尤其如此)。如果你想加速你的解决方案,你可以随意只使用数据集的一部分来应对这个挑战。

  • 小贴士1:请查阅我们的文本处理扩展,学习更多关于如何把推特的单词转化为分类器可以探寻的特性。
  • 小贴士2:如果你想要更快地完成部分工作,你可以研究、使用或者改造下列共享组件:数据丰富和预处理文档矢量化。它们是特別为这项挑战创建的。
  • 小贴士3:记住将数据集划分为训练集和测试集,以便创建决策树模型并对其进行评估。请根据你的喜好随意选择划分策略。
解决方案摘要

我们先对推特信息进行预处理,将其变为词频词袋,让分类器可以探寻文本中的词作为特征的方式来解决这个挑战。然后我们把数据划分为训练集和测试集,并使用 AutoML 组件来找出最适合提供的训练数据的模型(以及参数)。在我们的例子中,这个模型是逻辑回归器。将这个模型应用于测试数据后,我们得到了 77% 的准确率。

工作流构建描述

在读取了航空公司消费者的推特信息(表格阅读节点 Table Reader )之后,我们在文本中增加了积极和消极词语的标签,移除了标点和停止词,执行了词干提取,和其他文本预处理工作(数据丰富和预处理组件 Enrichment and Preprocessing component)。然后我们创建了文档向量,以便将每条信息编码入一个向量空间。接下来,处理过的信息被转变为词频词袋,每一条推特信息都与其情绪标签(类别)相关联(文档向量化组件 Document Vectorization component)。我们接着使用基于情绪标签(类别)的分层抽样对数据进行划分,保留 80% 的数据用于训练,20% 的数据用于测试(划分节点 Partitioning)。训练数据被送入到 AutoML 组件中,该组件会比较不同的分类器和不同的参数化/处理选项。最后,对于训练数据,最好的模型是逻辑回归器。我们将该模型应用于测试数据(工作流执行器节点 Workflow Executor)并获得 77% 的准确率(评分器节点 Scorer)。

挑战07:绘制足球传球成功的地图 - 难度:简单

通过对足球比赛数据中成功的传球进行视觉分析,可以获得球队绩效的重要信息。这些信息可供教练员和球队经理们使用,帮助他们明智地决策如何提高球队的比赛水平。在此挑战中,你的任务是创造一个可视化效果,充分展示曼城队球员成功传球的起始位置。为此,您将使用包含曼彻斯特城和曼联足球比赛期间各种类型传球的开始(x 和 y)和结束(endX 和 endY)位置的数据。

解决方案摘要

为了应对这个挑战,我们筛选数据,仅保留与曼城成功传球相关的行。接着我们根据这些传球的起始位置创造一张热图。我们可以观察到,多数传球都是从球场中心发起的。

工作流构建描述

使用 CSV Reader 节点读取数据后,我们运用 Missing Value 节点移除没有足够位置数值的行。然后,我们利用 Rule Engine 节点为与曼城成功传球对应的行设立一个标识。使用 Row Filter 节点,我们仅保留符合此标识的行。最后,我们运用 2D Density Plot(Plotly)节点创造一张展示成功传球的热图。

挑战08:欧洲歌唱大赛(ESC) - 难度:中等

欧洲歌唱大赛(ESC)是一个以欧洲国家为主的歌曲竞赛。在决赛中,各国会对其他国家进行评分,获得的分数总和决定获胜国家。在这个挑战中,你将使用网络挖掘节点,将每个国家分给和接收的分数在网络视图中进行可视化展现。

注意:比赛规则随着时间发生了变化,将不同届的分数进行汇总可能无意义。

解决方案摘要

要应对这个挑战,我们首先通过过滤数据,仅保留与 2021 年版对应的行以及电视投票者给出的分数。然后,我们构建了一个组件,允许用户选择一个关注的国家(例如,塞浦路斯),然后展示这个国家给其他国家的分数和得到的分数。两种可视化都采用了图/网络设计。

工作流构建描述

在使用CSV阅读节点 CSV Reader 读取数据后,我们用行过滤器(实验室)节点 Row Filter (Labs) 根据版本和分数类型过滤数据。接下来,我们建立名叫“网络可视化” Network Visualizations 的组件,它(1)允许用户选择一个主要关注的国家(首先,使用 GroupBy 节点提取它们,地区选择然后进行排序并送入价值选择小部件节点 Value Selection Widget );(2)绘制了选择的主要关注国家的已给分数和得分。行过滤节点 Row Filter 接收选择的主要关注国家,并取得其分给和得到的分数;接下来,它们把这些信息发送给对象插入节点 Object Inserter,将其变为节点和边。最后,这些网络信息被传递给两个网络观察节点Network Viewer。这些节点为所选主要关注国家的已给分和得分构建了网络/图形可视化。

挑战09:影响葡萄酒品质的关键因素是什么? - 难度:困难

在这次挑战中,您的目标是了解哪些特征在预测葡萄酒质量方面最为重要。完成这项分析后,你需要绘制出一个呈现各个特征重要性排序的可视化图表。

解决方案摘要

我们使用 AutoML 回归模型作用于数据子集。通过一次选择一个特征,比较均方根误差来比较特征的重要性。最后,我们的结论是酒精含量可能是决定葡萄酒质量的最重要特征。

工作流构建描述

应对这个挑战,我们的第一步是利用 AutoML 进行回归分析,训练模型并得出原始输入特征的分数。同时,并行进行一些快速的特征处理(主要是对几个特征重新命名),接着进行排列特征重要性的计算。实际操作中,我们会对每个特征的值进行混洗,并在此基础上应用经过训练的 AutoML 模型。然后,我们把在部分数据上验证 AutoML 模型所获得的均方根误差与每次排列获得的均方根误差进行比较。在我们的实验设置中,这些比较让我们确认了酒精含量很有可能是最重要的特征。最后,通过一张图,我们采用这套方法论呈现了所有特征的重要性。

挑战10:为"美味"餐厅计算年初至今和月初至今的销售额 - 难度:简单

“美味”餐厅每日均对销售额进行记录,数据包含了日期和销售两个部分。年初至今(YTD)的销售额和月初至今(MTD)的销售额是衡量企业收益的重要指标。你需要建立一个 KNIME 工作流,导入这份数据并在各条记录中添加 YTD 和 MTD 的值。

解决方案摘要

为了应对这个挑战,我们通过将数据按月分组,再用之前几个月的数据来计算 MTD。我们还利用移动聚合方法(moving aggregation),来计算 YTD。

工作流构建描述

通过使用Excel读取节点 Excel Reader 来读取数据后,我们转换了一些列数据并分别使用 String to Date&Time 和 Extract Date&Time Fields 节点提取日期字段。然后按月对数据分组(通过GroupBy节点),并将此数据滞后以得到上个月的销售额(通过Lag Column节点),并用 0 填充缺失值(通过Missing Value节点),再利用 Column Rename 节点进行字段重命名,以便增加工作流的可读性。我们同时使用了移动聚合节点来进行销售额之和(即YTD),然后再进行列重命名。接着,我们使用 Joiner 节点将两份数据合并,在此基础上,使用 Math Formula 节点通过计算上月的滞后信息来得到 MTD 的数据,接着删除一些临时性的列(通过 Column Filter 节点),并通过 Table View 节点展示所有信息。

挑战11:向 GPT-3 提问 - 难度:困难

语言模型变得极其热门,并可以通过 API 有效地整合到您的项目中。您可以通过输入数据(例如,文本或提示)向 API 的某个端点发送 HTTP 请求来与其进行交互。在此挑战中,您需要使用 OpenAI 的 "text-davinci-003" GPT-3模型,创建一个能够回答自然语言问题的 KNIME 工作流,例如 "KNIME是什么?"

选择性任务:您也可以将此任务构建为 KNIME 组件。注意:您需要从 OpenAI 获取 API 密钥以完成此挑战。要获取它,请按照这篇博客帖子的说明进行。这里还附上OpenAI 的文档,用于制作 API 请求。最后,在将您的解决方案上传到 KNIME Hub时,请注意不要分享您的API密钥。

解决方案摘要

我们的解决方案是针对 davinci-003 API 获取信息,向其提出查询(例如,“什么是KNIME?”),然后执行 POST 请求以获得模型对查询的答案。然后对信息进行反序列化,筛选,并进行视觉化展示。

工作流构建描述

为了解决此挑战,我们首先通过字符串配置 String Configuration 、字符串小部件 String Widget 和变量创建器节点 Variable Creator 收集 API 信息、查询和其他参数。查询参数和流变量通过“合并变量”节点 Merge Variables 合并,并且借助于“变量到表格行” Variable to Table Row 和“表格到 JSON”节点 table to JSON 组合以适配 POST 请求节点(POST Request)。POST 请求节点将查询提交到 davinci-003 GPT模型,而答案通过 JSON 路径(JSON Path),Ungroup,列过滤节点(Column Filter)得到整理。最后,我们将查询结果进行可视化展示。

挑战12:图像模糊化 - 难度:简单

警察局与你取得了联系,并向你寻求帮助。他们需要向媒体提供一张证人的照片,但是必须保护其面部信息。他们希望你能对这张照片进行模糊处理,使得人们可以确认这是一个真实的人,但是其身份信息仍然不被泄露。

提示:尝试使用高斯卷积节点。

解决方案摘要

为了解决这个挑战,我们读取图片并使用高斯卷积进行模糊处理。

工作流构建描述

首先,我们使用 List Files/Folders 节点读取图片的路径,然后通过 Path to String 节点将路径类型转为字符串,并将它传递至 Image Reader (Table) 节点,来读取真实的图片。然后,我们将图片传递至高斯卷积节点进行模糊处理。注意:你可以通过在高斯卷积节点中增加 sigma 参数的值来进一步模糊图片。

挑战13:了解犯罪与房地产的关系 - 难度:中等

你是一位在房地产公司工作的数据科学家,你听说"每户住宅的平均房间数"(RM)可能会影响"人均犯罪率"(CRIM),并且这种关联会因城市或小镇而异。于是,你决定探究这种情况在你所在的城市(波士顿)是否存在。为了验证这个猜测,你决定运用你最近在研究的科目:XAI,并采用机器学习回归模型进行尝试。在波士顿,RM和CRIM之间有什么关联呢?

  • 建议1:可以考虑借用SHAP循环计算每个独立特征的 SHAP 值。
  • 建议2:考虑使用依赖图来直观地展示 RM 和 CRIM 之间的关联关系。
解决方案摘要

为了解决这个问题,我们采用了 AutoML 来建立一个模型,该模型可以预测波士顿自住房的中位价值(单位:千美元)。同时,我们还利用 SHAP summarizer 节点将数据聚类为几类,并采样一些数据,查看这些数据是如何被模型“解释”的。然后,我们将这些原型和解释行数据输入到一个 SHAP loop 中,这个循环使用已学习的模型和聚类原型(利用 SHAP Summarizer 采样权重进行计算)来计算 SHAP 值。接下来,我们将 SHAP 值与预留出来的解释行数据相结合,生成了一个依赖图。从图中我们可以观察到,如果每户住宅的平均房间数超过7个,犯罪率就明显很低,而 SHAP 值很高。这表明了该特征对于提高房屋价格的中位数有着重大影响。

挑战14:全球范围LGBTQIA+群体的权益 - 难度:中等

这个挑战的目标是制作一个可以交互的仪表盘,依据各个国家实施的涉及 LGBTQIA+ 群体权益的法律覆盖程度进行排序。我们提供的数据集包括了11种关于 LGBTQIA+ 群体权益的法律类型,包括 CSSSA LEGAL(同意成年人之间的同性性行为)、CONST(宪法保护)以及 BROAD PROT(全面保护)。您可以在这里提供的详细信息里理解这些法律的具体含义。

每项法律如果在一个国家得到全部实施,即可获得 1 分;如果实施程度有限,可以得到 0.5 分;如果没有相关的法律,就得 0 分。哪个国家对于 LGBTQIA+ 群体的权益呵护最为周全呢?

提示:您可以通过加入选择功能来实现互动:仅用户实际选中的法律会计入国家的总得分。

解决方案摘要

面对这个挑战,我们首选需要将数据集里所有的分类值进行编码,这主要会基于一个国家是否全面实施相关的法律、实施程度是否有限,或者甚至完全没有这样的法律。同时,我们还会提取所有的列名称,便于最后得到一个包括了所有可以使用的法律类型的目录。接下来,我们则是利用分级统计地图来使得图表化的国家排名更为直观,同时还加入了小部件节点以支持互动功能。

工作流构建描述

我们首先用 CSV Reader 节点读取数据,然后利用 Column Splitter 节点将表格一分为二,使得所有和法律相关的列位于节点的第二个输出口。接着我们会对所有的分类值进行编码,这基于一个国家是否全面实施了相关的法律(得1分)、实施程度是否有限(得0.5分)或者即没有相关法律(得0分)。我们在同一循环中使用 Column Expression 节点(这个循环由 Column List Loop Start 节点和 Loop End (Column Append)节点定义)完成上述操作。使用 Column Appender 节点,我们还会加回剩下的列(如COUNTRY、DATE OF DECRIM以及PENALTY)。同时,我们还利用 Extract Column Header 节点和 Column Aggregator 节点将所有列名称提取并进行合并,将它们聚合到一个列表中。为了更好地展示各国的排名,我们使用了 Choropleth Map 组件,并将其包对在 Interactive Dashboard 组件内。为了增加互动功能,我们加入了一个 Multiple Selection Widget 节点,让用户可以选择他们关心的法律,以及一个用于触发重新执行的 Refresh Button Widget 节点。每个国家根据所选定的法律所获取的分数,将通过 Column Aggregator 节点来进行计算。

挑战15:建立一款更新精算信息的仪表板 - 难度:中等

你是一名自由职业的数据科学专家,现在有一家精算机构请你帮忙。他们需要在为人寿保险计算保费时,从一个精算寿命表中找到关于客户的年龄相关信息,该表包含一年内死亡的可能性和寿命预测。你的任务就是让这个流程更高效:创建一个面板,让精算师输入顾客的年龄,然后这个操作将会立即更新男女两性的死亡可能性和预期寿命。你可以随意选择使用数据表格还是图形化的数据展示。

  • 提示1:要将前三行的数据合并作为列头,请参考社区中心的这个工作流程
  • 提示2:整数展示部件(Integer Widget)不会更新组件的互动视图,可以考虑加入刷新按钮部件(Refresh Button Widget)。
解决方案摘要

为了解决这个挑战,首先我们要读取精算寿命表,处理其表头的值并将其合并。然后,我们将无关的列进行筛选,接着创建一个仪表板,在仪表板上,使用者可以根据他们选择的年龄查询人口的平均剩余寿命,以及一年内死亡的概率。

挑战16:美国的本科学习成本 - 难度:容易

你是美国某所高中的高三学生,很快就要申请大学了。美国的本科学习成本可谓不菲,你希望理解是什么因素以及以何种方式影响到学习成本。为了能做出明智的、负有经济责任的选择,你决定进行一些解释性的数据分析和成本建模。你会得到了什么结论?

解决方案摘要

为了应对这个挑战,我们利用了很多图表去查看美国本科学习的平均成本是如何因不同的因素(如所在州、年份、学校类型等)而有所变化。我们还用一个简单的决策树模型去了解每所学校的成本是否能有一个粗略的估算。

这个想法的目标是帮学生用这些信息来辅助他们决定去哪所学校深造。

工作流构建描述

在我们的解决方案中,我们首先按照州来对学习成本的数据进行分组(用 GroupBy 节点),然后用 Sorter 节点按照降序进行排序,并利用 Bar Chart 节点将这些信息进行可视化。至于本科学习成本,DC 是美国最昂贵的区域。下一步,我们再次根据年份对数据进行分组(使用 GroupBy 节点),并利用 Line Plot 节点将成本时间序列进行可视化。数据显示,从 2013 年到 2020 年间,本科教育的费用已经显著上升。我们还用 Bar Chart 节点将不同类型学校的平均本科费用进行可视化,这显示出在所有的学校中,公立学校对于学生来说是最经济实惠的选择。最后,我们将数据分区(使用 Partitioning 节点),训练和检验一种简单的回归树模型(使用 Simple Regression Tree Learner 和 Predictor 节点),并借助 Numeric Scorer 节点对其质量进行评估。数据中的特性可以解释大约 95% 的测试数据中的变异性( R-squared 得分为 0.952),这暗示着学校类型和州等因素对美国本科学习成本的预测具有很好的指示作用,因此有很大可能帮助学生做出关于哪里上大学的明智决定。

挑战17:掌握错误处理与日志记录的卓越工作流程 - 难度: 困难

本挑战目的在于提醒你,建立具备错误处理与日志记录功能的可靠解决方案的重要性。一些优秀的工作流程开发实践常被忽视,如果融入了这些实践,确能在整个项目中带来显著效果 -- 当应用程序很重要或者您正在与团队合作时尤为显著。具体而言,你将选择任意一个你喜欢的工作流程,并在其中加入以下元素:

  • 错误处理:运用 Try & Catch 结构;

  • 日志记录 - 提取工作流程名、用户名、执行开始和结束时间。进一步,创建一表格,涵盖这些元数据以及失败节点(如有)的名称及其信息,将表格存入CSV文件。请务必确保,每次执行工作流程时,新的一行都将被添加进该 CSV 文件的日志表格中。你还可以根据需要,将更多列添加到你的日志文件中,例如,新增自定义信息列,根据执行状态--成功或失败--填写信息。你还可将以上功能创建为一个日志记录组件,这个组件可以记录工作流程名、用户名、执行开始和结束时间,配置自定义信息,并更新日志。

解决方案摘要

在我们的解决方案中,有一个组件是因故无法正常执行的,产生了错误。这一部分组件 (“Example workflow”),被置于 Try & catch 构架之中用以处理错误。该构架能获取到该组件是否运行失败,如果失败那么是何处失败的信息。另外,我们还保存了一些工作流执行的元数据(比如执行时间和谁去执行的)并将其与失败节点的信息一同记录。日志文件存储在工作流数据区中。

工作流构建描述

我们首先提取工作流名称和执行者的用户名(通过“提取上下文属性”节点 Extract Context Properties )。接着,我们使用 日期 & 时间配置节点 Date & Time Configuration 以获取可能失败的组件(“Example workflow”)开始运行的时间戳。我们将此部分包裹于 Try (Variable Ports) 和 Catch Errors (Var Ports) 之中,以获取是否发生错误以及错误原因的流变量信息。我们添加了一个变量创建节点 Variable Creator ,并将其连接到 Catch Errors (Var Ports) 节点上,这是为了给后者的执行提供备选数据。但请注意,我们并未在实际解决方案中使用它。待工作流及其失败节点的全部元信息被收集后,我们使用另一个日期&时间配置节点 Date&Time Configuration 以获取 (“Example workflow”) 失败组件执行结束的时间戳。所有这些信息都以流变量的形式存在并被发送至“更新日志” Update Log 组件,该组件将所有的数据记录至工作流数据区的一个文件中。

挑战18: 用地图描画出你心目中世界最美好的地方 - 难度:困难

请利用 KNIME 的地理空间分析插件,将你认为全世界最美好的地方(例如你的家乡)以地图的形式呈现出来。我们建议您将该地点标记做得足够大,以便在完整的世界地图能看的见。

解决方案摘要

我们通过在地图上绘制佛罗伦萨的多边形,同时可以对地图进行放大和缩小来解决这个挑战,此外我们还会利用北极和南极的地理位置,在更大的地理范围地图上展示佛罗伦萨的位置以获得更好的视角。

工作流构建描述

我们首先使用 OSM Boundary Map 节点获取佛罗伦萨的几何轮廓。同时,我们还会采用另一种获取几何结构的方法:利用 "Table Creator" 节点输入北极和南极的经纬度,然后通过 "Lat/Lon to Geometry" 节点获取他们的地理几何形态。接着,我们使用 "Concatenate" 节点将佛罗伦萨和两极的地理形态结合在一起。最后,我们使用 "Geospatial View" 节点获取一张更详细的、更偏向于多边形的佛罗伦萨地图,然后再运用 "Spatial Heatmap" 节点得到一张以两极的地理位置为参考并包含佛罗伦萨在内的全球大规模的地理热力图。

挑战19:糖尿病预测 - 难度:简单或中等

在这个挑战里,你要扮演一名临床医生,看看是否可以利用机器学习来预测糖尿病。你需要设计出一个方案,使其准确度超越 65% 的基准线,并且在两种情境(患有糖尿病和未患糖尿病)下表现出色。我们只通过一个简单的工作流便达到了 77% 的准确率。如果你想将这个挑战从简单提高中等难度,可以尝试实施:

解决方案摘要

我们的基础流程利用 70% 的原始已标注数据集训练了一种名叫随机森林的分类器,并用剩下的 30% 数据来评估其表现。鉴于数据中类别严格不均等,我们采用分层抽样来进行数据分组。

挑战20:酒店评论中的主题 - 难度:困难

您在一家旅行社工作,希望更好地了解如何酒店的在线评价。在全部评论中,那些主题是较为常见的?每个主题中又有哪些词句最具代表性?如果根据评分高低类别区分来看呢?已经有同事帮你获取和预处理了评论,你现在需要做的就是找出评论中的相关主题,并探索他们的核心词汇。了解评论究竟揭示了什么?

解决方案摘要

在这个挑战中,我们首先要确定(1)全部评论,(2)评级为4或5的积极评论,以及(3)评级在1至3之间的消极或者中立评论中,理论上的最佳主题数量是多少。虽然有多种衡量标准可以确定合适的主题数量,但在我们的解决方案中,我们着重考虑的是要最小化困惑度。对于以上这三种情形,最佳主题数的共同选择都是 k=2。于是,我们就可以针对情况(1)、(2)和(3)创建 LDA 主题模型,并利用标签云展现他们每个主题的主要词语。

在给出好评的评论中,似乎更多的聚焦在水上活动上(例如,带有泳池的度假村,或者海滩酒店等);而在一般及不满意的评论中,常常更多地谈到设施方面的问题(如卫生间,位置,服务,餐厅等);至于全部的评论中,似乎并没有如此明显可以突出的主题。

挑战21:协助高尔夫球童(上篇) - 难度:中等

球童汤姆是一位最受欢迎的高尔夫球手的助手,如今找到了你,寻求你的帮助。他对在球场上疲于寻找高尔夫球感到不胜其烦 -- 在绿草中辨别白球很烦人!所以,他希望你能够制作一个工作流,以帮助他在他所拍下的球场照片中,确定出高尔夫球的位置。你现在需要做的,就是分割出那些包含高尔夫球的照片。

提示:对于这次的挑战来说,KNIME 的图像处理扩展功能将会起到非常关键的作用。

解决方案摘要

在读取给定数据集中的高尔夫球场单张图片后,我们为这个挑战制定了两套不同的解决策略。首先,我们利用一个共享组件执行图像的分割工作。接着,我们手动完成了该共享组件本质上实施的步骤:我们对图像进行高斯卷积处理,区分前景与背景,以便识别出高尔夫球;之后,我们填补高尔夫球内部的空洞,以便更好地分割出它们;最后,我们进行连通成分分析来为高尔夫球打上标签。

挑战22:协助高尔夫球童(下篇) - 难度:中等

在上一周你通过识别图片中的高尔夫球,对球童汤姆提供了帮助。汤姆对你的工作量赞赏有加,想请求你对工作流进行优化,新增一个功能,即能够计数出识别出来的高尔夫球的数量。简单来说,每当汤姆交给你一张图片,他希望得到的是图片中高尔夫球的数量。

解决方案摘要

在查看了指定数据集中提供的高尔夫球场的照片之后,我们像上周一样开始解决这个问题:我们对图像执行高斯卷积,区分出前景和背景,以便将高尔夫球分离出来,填补高尔夫球中的洞孔,以便更好地将他们分开,并对它们进行已连接成份分析,以标记高尔夫球。然后,为了确定照片中的高尔夫球数量,我们标出接触到边界的部分(我们使用 RGB 渠道进行这个边界测试),最终我们会统计生成的标签数。这个数字等同于照片中的高尔夫球数量。

挑战23:验证你的组件 - 难度:中等

你和团队正在研发一个基于词典的情绪分析应用,目前已经创建了一个专用于计算情绪分数的模块。这套模块会在众多工作流程中重复运用,所以务必确保其运行无误是至关重要的。实现这个目标的科学方法是进行自动化的单元测试。你们需根据这个模块输入的数据样本(标准输入数据)和相应预期输出的数据表(标准输出数据),去创建一个自动测试此模块(测试流程)的工作流程。

解决方案摘要

为了应对这个挑战,我们需要比较情感评分模块的标准输出数据以及它接收标准输入数据进行运算后的结果是否一致。此外,我们也要搜集工作流程和测试执行情况的元数据,以便了解哪些方面出现故障(如果有的话),以及出错的具体环节。

工作流构建描述

首先,我们用工作流元数据节点来搜集工作流程和目前执行过程的元数据。接着,我们用捕获/解决块(Try/Catch block)构建单元测试。这样即使测试失败,工作流程也不会直接崩溃,但我们仍能搜集执行结果及其元数据。在构建捕获/解决块方面,我们用到了 变量端口(Variable Ports)故障捕获(Try)和错误捕获 (Catch Errors)节点。至于真正的测试,我们用两个表格读取器节点(Table Reader nodes)读取输入和输出的黄金数据。然后将标准输入数据赋予情感评分模块去进行运算,最后使用表格相异性检测节点去对比其运算结果与标准输出数据是否一致。尽管测试顺利通过,但如果有出错,我们在变量创造节点(Variable Creator node)为(Catch Errors)设置了一些备用数据。这样我们就能确保捕获/解决块中始终有单元测试的相关消息输出。最后,我们用变量到表格行节点把测试状态和工作流元数据转化为表格形式。这样在生成报告等场合,我们就能方便汇出这部分信息。

挑战24:侦查恶意电子邮件地址 - 难度: 中等

在这个挑战中,你将扮演网络安全分析师的角色,尝试识别出那些假装合法而实际上却属于恶意攻击的电子邮件。你发现那些恶意邮件常常试图模仿知名的电子邮件域名,以欺骗收件人。例如,你发现存在 @gnail,@gmial 等企图冒充 @gmail.com 的邮件地址。于是,你决定对所有的 domain 进行统计,那些出现次数最少的 domain 则有更高的可能性是伪造的。你还需要进一步检验,那些出现次数较少的邮件域名是否在尝试模仿一些重要的邮件域名。在此过程中,你应确保不会将 @unique.com 误判为伪造地址。注意:尽可能避免在你的工作流程中使用固定的变量,而是使用平均数或中位数等。提示:检查字符串的相似程度可能会有所帮助。

解决方案摘要

为了应对这个挑战,我们首先处理领域数据,从中起到高频和低频的域名(后者被认为更可能存在风险)。然后,我们对低频邮件领域名和高频邮件领域名进行相似度对比,以确定哪些域名是在企图冒充热门的同时进行欺诈行为。

工作流构建描述

首先我们使用 CSV Reader 节点读取领域数据,然后用 Cell Splitter 节点分离出实际的域名和对应的用户名。接着,我们利用GroupBy节点统计每个域名的出现次数,然后使用 Math Formula 节点计算平均域名出现次数。频率高于平均值的域名往往比较可信,而频率低于平均值的域名则更可能是伪造的。我们根据这个逻辑应用 Numeric Row Splitter 节点对域名进行分类。然后,我们使用 Similarity Search 节点将低频率的邮件域名与高频率的邮件域名进行对比,以判断哪些罕见的域名可能正在尝试模仿热门的域名。接着我们使用 Joiner 节点将最相似的域名信息整合起来,然后应用 Math Formula 节点计算所有配对的中位数距离。最后,我们把那些离高频域名距离低于或等于计算出的中位数的罕见域名,通过 Numeric Row Splitter 节点标记为可能的欺诈邮件地址。

挑战25:寻找心脏病的线索 - 难度:中等

作为一名在健康医疗公司任职的数据科学家,你正在试图开发一个能预测出病人是否存在心脏病的模型。为此,你选定了11个可能的心脏病指标,借助 XGBoost 分类模型进行试验,你发现模型的表现会随参数的调整而有较大差异。在本次挑战中,你将使用超参数调优技术,寻找 XGBoost 的最优参数组合,包括提升轮数(Number of Boosting Rounds)、树的最大深度(Max Tree Depth)及学习速率(learning rate)。你将会用 F-Measure 指标作为调优的标准。

解决方案摘要

为解决本次挑战,我们创建了一个带有集成部署节点的工作流,负责训练和评估 XGBoost 分类器的质量。此工作流给需要超参数优化的组件提供输入数据,同时也设置了优化目标。最终,我们通过设置提升轮数为 50,最大树深度为 6,学习速率为 0.1,获得了最佳的 F-measure 值(平均 0.87)。

挑战26:销售业绩的计算 - 难度:简单

你供职于一个销售两种产品(A 产品和 B 产品)的公司。身为数据分析师的你,想要计算在 12 个月长的一个周期里,这两种产品每月的销售增减情况。最终,你想要得到一个表格,表格的列显示每月销售的增长或下降的百分比,如下例所示。

月份产品A销售百分比产品B销售百分比
二月45 %100%
三月78%-87%
...
解决方案摘要

为了解决这一挑战,我们循环处理每一列的销售数据,计算该月销售数据相对于下个月的增长或下降情况,我们通过滞后列的值来实现这个操作。最后,我们将计算出的百分比列数据整合到一张表格里。

工作流构建描述

在通过 CSV Reader 节点读取了销售数据后,我们开始循环遍历每列销售数据(Column List Loop Start节点内)。循环内,我们用Column Renamer 节点通用化每列的销售数据名称,并让每列销售按月滞后一位(Lag Column节点)。接着,我们通过 Math Formula 节点计算销售增减的百分比,并把这些信息存储到新的一列中,这一列是由 String Manipulation(Variable)和 Column Renamer 节点创建的。最后,我们过滤掉在循环中创建的临时列,得出了挑战中所要求格式的表格。

挑战27:探索世界杯数据集 - 难度:中等

这个挑战我们会深度探索世界杯数据集,以理解在此期间(2021-2022年),不同足联间在 FIFA 的监管下到底进行了多少场比赛。我们手头上有两份文件,results.csv 和 shootouts.csv, 从中我们可以得到比赛举行的时间。另外,我们还有文件 teams.xlsx,其中详细列出了各个队伍以及他们所属的足联。最终要求输出的数据表格应如下所示:

AFCUEFACONCACAF
AFC346789
UEFA676512
CONCACAF891236

本挑战的设定基于这篇博客文章

解决方案摘要

我们通过整合 results.csv 和 teams.xlsx 两份表格中的信息来解决本次挑战。在获得包含 2021 年至 2022 年期间所有比赛(指明球队及其联合会)的表格后,我们对信息进行透视以获取该期间每个联合会对的所有比赛。

挑战28:Plotly 绘制漏斗图的乐趣 - 难度:中等

在本次挑战中,你将作为数据分析师尝试使用 Plotly 制作一个堆积漏斗图。虽然 KNIME 通过它的 KNIME Plotly 扩展提供了丰富的 Plotly 绘图方式,但你没找到漏斗图 -- 使用 Python View 节点创建这种类型的可视化并在 KNIME 中展示它!

提示:如果需要,可以复制上述 Plotly 链接中的代码(例如,“Stacked Funnel Plot with go.Funnel”图的代码)到 Python View 节点。复制粘贴 Plotly 网站的代码后,要记得添加这行代码:import knime.scripting.io as knio,并确保删除 fig.show() 这行代码。最后,需要将 knio.output_view = knio.view(fig) 这行代码添加到你的代码末尾。

如果你愿意将这个挑战升级,试着用 Table Creator 节点创造你自己的数据,并将其传递给漏斗图的至少一个轴的变量。

解决方案摘要

我们提出了两种解决这个挑战的方案。一个较为简单,遵循挑战中的提示进行操作;另一个稍显繁琐,需要修改脚本,以便可以自定义可视化以使用不同的输入数据。

工作流构建描述

对于简单方案,我们将挑战中提到的 Plotly 脚本复制粘贴到 Python View 节点中。在节点编译的开始,我们添加了 import knime.scripting.io as knio 这行,同时移除了 fig.show(),并在代码的最尾端添加了 knio.output_view = knio.view(fig)

对于复杂方案,我们创建了一些模拟数据,通过 Table Creator 节点将其进行可视化。接下来,我们将此数据传递到 Python View 节点,并使用 data = knio.input_tables[0].to_pandas() 行进一步修改。此行使该节点内的代码可自定义,并且漏斗坐标的值将由作为参数给出的数据确定。

挑战29:桌球大赛 - 难度:中等

你就职于一家位于柏林的创投公司,今天是周五夜晚,一场由你和同事们共同参与的乒乓球大赛正等待着你!眼下的难题是:如何随机地将所有同事二人一组分配到各个队伍中,然后再随机确定以树状图来表示的淘汰赛模式呢?温馨提示:你可以在这个挑战中使用层次聚类分配节点(Hierarchical Cluster Assigner)。

解决方案摘要

在对参赛选手的数据进行读取后,我们创建了一个数据应用程序,使他们可以在表格和数状图中查阅所有队伍以及可能的比赛淘汰安排,这一切都取决于哪一组选手与哪一组选手进行了对决。

挑战30:音乐数据 app - 难度:中等或困难

《Just KNIME It!》第二季即将结束。就像上个赛季一样,我们将用一个开放式问题来庆祝这一季的完成。我们邀请您发挥创造力,通过交互式和富有洞察力的可视化,构建一个将音乐曲目与其艺术家相关联的数据应用程序。你可以使用我们提供的数据集来让界面支持多种语言。

注意:由于这是一个开放式的挑战,我们不会像往常那样提供我们自己的解决方案。请随意探索吧!

参考链接