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)。