Slack上的机器学习——主题模型和异常检测
点击上方关注,All in AI中国
作者:Amar Basic
介绍
我们生活在数据时代。使用机器学习领域的自学习算法,我们可以将这些数据转化为知识。机器学习提供了一种更有效的方法来从数据中获取知识。借助机器学习,我们享受着强大的电子邮件垃圾邮件过滤器,方便的文本和语音识别软件,可靠的Web搜索引擎等。最重要的是,我们从数据中创造了商业价值。
关于这个项目
在Slack应用程序上进行机器学习的目的是通过在Slack数据和公司数据库上使用不同的机器学习算法来预测并提供其对员工流动情况的分析。本文将介绍分析Slack数据的过程。
使用了两种算法:
- 主题建模
- 对先前生成的主题进行异常检测
使用机器学习过程时,建议你按照以下步骤操作:
(图1. ML开发过程)
那么,让我们一步一步地了解它是如何完成的。
步骤1和步骤2
获取和清理数据
Slacker库用于从Slack API获取数据。我们遍历所有通道并提取用户ID、消息和消息日期。这种状态的数据称为raw,每条消息都使用正则表达式进行清理,因此只剩下单词。
步骤3.1:主题建模
首先,我们加载原始数据并对其进行标记。在标记化的过程中,我们需要删除常见的单词,例如"the"、"is"、"are"并且确保每个单词都是词干。(词干是单词的一部分—— waited, waits and waiting将被转换为wait )这就是我们制作"令牌"的方式,也就是单词。
(图2.标记化、词根化和删除常用单词)
接下来,我们从我们的标记中构建一个字典。在我们的字典中,每个单词都用数字表示。基于字典,我们构建了语料库。语料库代表一个词袋结构,其中每个单词都映射到其频率——一个列表中(word_id,word_frequency)
(图3.构建字典)
现在,我们需要构建一个机器学习模型并拟合数据。我们使用Latent Dirichlet Allocation(LDA)模型从slack通道生成200个主题(实现)。算法的执行大约需要1小时。
(图4. LDA主题建模)
图4说明了如何从文档创建主题。我们可以将所有主题都想象为n维空间中的点,其中维度的数量等于词汇表中的单词数量。然后,当新文本或消息到来时,我们需要将消息放在该n维空间中,即计算该消息属于某个主题的概率。
LDA模型将从所有消息生成200个主题。之后,我们可以将任何消息传递给模型,它将返回该消息属于一个或多个特定主题的可能性。
步骤3.2:异常检测
在这种情况下,异常检测代表了用户行为以他/她正在谈论或他/她已经谈论过的事物和主题的方式的变化。
首先,我们需要为所有用户创建基线模型。同样,我们将采用原始slack数据并将其传递给LDA模型,以获得用户属于某个主题的可能性。对于异常检测,我们使用称为孤立森林的集成方法。下图显示了孤立森林算法如何检测异常。
(图5.孤立森林算法)
在我们的例子中,如果他/她开始一个新主题或停止谈论某个主题,孤立森林将检测(对于用户)异常。
例如,假设你有一位员工喜欢谈论书籍,他/她连续5到6个月谈论这些书籍。如果/当他/她停止谈论时,这将是一个异常现象。
如果用户开始讨论新主题,那么在第一次检测到新主题时也会出现异常,但由于我们每个月都会使用slack的新数据更新我们的模型,如果用户继续讨论该主题,那么异常将会减少。
步骤4:可视化
虽然机器学习步骤说明(图1)建议在可视化之前进行分析,但我发现"以其他方式"进行分析可以帮助我更快地获得更清晰的图像。
将异常检测算法的结果保存到数据库中,并用Power BI表示。 例如,在下面的图片中有一个用户。
(图6.异常检测结果的可视化)
步骤5:分析
在图6中,我们可以看到4月份存在一些异常现象,但这些异常情况遵循了一些输入,因此我们可以得出结论认为这不是问题。
我们可以说,即使我们没有过多地关注数据的准备,也有不错的结果。例如,我们没有包含用户对邮件的反应。
此外,这种应用程序的最大问题是两种(甚至更多)语言的问题, 这很明显。由于这两种语言,我们的模型将使用不同的语言创建两个相同的主题。作为解决方案,我们可以使用Google Translate API或使用深度学习构建我们自己的API。第一种解决方案会产生一个耗时的问题,而第二种解决方案可能会导致没有足够的数据。
结论
最后,我们的数据流模型如下图所示。
(图7.数据流模型)
通常,对于机器学习算法来说,处理数据,将其转换为机器学习算法的可用特征非常重要。准备好将大部分时间花在数据准备上(大约80%的时间),不要妄想涵盖ML适用的所有情况。确切的问题将决定一切——结果将如何使用,ML模型应该预测什么值以及应该如何校准,要收集和处理哪些数据,要测试哪些算法以及许多其他问题。
ML算法可以在数据中找到人类无法找到(或至少在合理时间内不能)的模式。结果表明,这些算法可以近似任何连续函数。因此,如果我们可以用函数描述任何问题,则意味着我们可以使用ML算法来解决问题。那么唯一剩下的问题就是我们是否设定了正确的问题以获得我们所需的答案。