TowardsDataScience 博客中文翻译 2016~2018(一百九十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

机器学习卡格竞赛第二部分:提高

原文:https://towardsdatascience.com/machine-learning-kaggle-competition-part-two-improving-e5b4d61ab4b8?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征工程、特征选择和模型评估

像生活中的大多数问题一样,有几种潜在的方法来进行 Kaggle 竞赛:

  1. 把自己锁起来,远离外面的世界,孤立地工作

我建议不要走“孤独的天才”之路,不仅因为它非常孤独,还因为你会错过竞争中最重要的部分:向其他数据科学家学习的 T2。如果你独自工作,你最终会依赖同样的老方法,而世界上的其他人会采用更有效和准确的技术。

作为一个具体的例子,我最近依赖于随机森林模型,自动将其应用于任何监督的机器学习任务。这场比赛终于让我意识到,虽然随机森林是一个体面的起步模式,但其他人都已经转移到更高级的渐变助推机

另一种极端的方法也有局限性:

2.复制一个领导者的脚本(在 Kaggle 上被称为“内核”),运行它,无需编写一行代码就能冲上排行榜

我也不推荐“复制粘贴”的方法,不是因为我反对使用别人的代码(有适当的归属),而是因为你仍然在限制你学习的机会。相反,我推荐的是一种混合方法:阅读他人所做的工作,理解甚至使用他们的代码,用你自己的想法建立在他人的工作之上。然后,向公众发布您的代码,这样其他人也可以做同样的过程,扩大社区的集体知识。

在这个关于参加 Kaggle 机器学习竞赛的系列的第二部分中,我们将对我们在第一部分中开发的初始提交进行改进。

本文记录的主要结果是:

  • ROC AUC 从基线 0.678 增加至 0.779
  • 在排行榜上获得超过 1000 个名次
  • 功能工程从 122 个功能增加到 1465 个
  • 特征选择将最终特征数量减少到 342 个
  • 决定使用梯度推进机器学习模型

我们将介绍我们是如何实现这些结果的——涵盖机器学习中的许多主要思想,并在适用的情况下建立在他人的代码上。我们将关注任何机器学习项目的三个关键步骤:

  1. 特色工程
  2. 功能选择
  3. 车型评测

为了从这篇文章中获得最大的收获,你会想要关注 Kaggle 上的 Python 笔记(当它们出现时会链接到)。这些笔记本可以在 Kaggle 上运行,无需在您的计算机上下载任何内容,因此几乎没有准入门槛!在这篇文章中,我将在较高的层次上触及要点,并在笔记本中提供完整的细节。

简要概述

如果你是新手,我强烈推荐你从这篇文章这款笔记本开始了解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Kaggle 上的房屋信用违约风险竞赛是一个标准的机器学习分类问题。给定一个历史贷款数据集,以及客户的社会经济和财务信息,我们的任务是建立一个模型,可以预测客户拖欠贷款的概率。

在本系列的第一部分,我们研究了问题的基础,探索了数据,尝试了一些特性工程,并建立了一个基线模型。使用随机森林和七个数据表中的一个,我们在公共排行榜上得到了一个 0.678 ROC AUC ( 曲线下的接收器操作特征面积)。(公共排行榜仅根据 20%的测试数据计算得出,最终排名通常会发生显著变化。)

为了提高我们的分数,在这篇文章和一系列关于 Kaggle 的附带笔记本中,我们将主要关注特征工程,然后关注特征选择。一般来说,相对于在机器学习问题上投入的时间而言,最大的收益将出现在特征工程阶段。在我们开始尝试构建一个更好的模型之前,我们需要专注于以最有效的方式使用所有的数据!

关于机器学习现状的说明

这篇文章的大部分内容看起来是探索性的(或者甚至是武断的),我并不声称我已经做出了最好的决定!在机器学习中有很多旋钮需要调整,通常唯一的方法是尝试不同的组合,直到我们找到最有效的组合。机器学习更多的是经验性的,而不是理论性的,它依赖于测试,而不是从基本原则或一套硬性规则出发。

在一篇很棒的博文中,皮特·沃顿解释说,机器学习有点像敲打电视机的侧面,直到它工作为止。这是完全可以接受的,只要我们写下我们在电视上做的准确的“爆炸”和每次的结果。然后,我们可以分析我们做出的选择,寻找任何影响未来决策的模式,并找到哪种方法最有效。

我这个系列的目标是让其他人参与到机器学习中来,将我的方法放在那里以获得反馈,并记录我的工作,以便我下次可以记得我做了什么!任何评论或问题,无论是在这里还是在 Kaggle 上,都非常感谢。

特征工程

特征工程是从现有数据中创建新特征的过程。目标是构建有用的特征,帮助我们的模型了解数据集中的信息和给定目标之间的关系。在许多情况下——包括这个问题——数据分布在多个表中。因为机器学习模型必须用单个表来训练,所以特征工程要求我们在一个表中总结所有的数据。

本次比赛共有 7 个数据文件。在第一部分中,我们只使用了单一数据源,即包含每个客户的社会经济信息和贷款申请特征的主文件。我们将这个表称为app。(对于看惯了熊猫的人来说,一张桌子只是一个dataframe)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Main training dataframe

我们可以看出这是训练数据,因为它包含标签TARGET。值为 1 的TARGET表示未偿还的贷款。

app数据框架是整齐的结构化数据:每个观察值都有一行——客户的贷款申请——列包含特征(也称为解释变量或预测变量)。每个客户端的应用程序(我们称之为“客户端”)在这个数据帧中都有一行,由SK_ID_CURR标识。因为每个客户端在此数据帧中都有一个唯一的行,所以它是数据集中所有其他表的父级,如下图所示,图中显示了这些表之间的关系:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Relationship of data files (Source)

当我们制作特征时,我们希望将它们添加到这个主数据框架中。在特征工程结束时,每个客户端仍然只有一行,但是有更多的列从其他数据表中获取信息。

其他六个表格包含了客户以前的贷款信息,既有家庭信贷(举办竞赛的机构),也有其他信贷机构。例如,这里是bureau数据框架,包含客户以前在其他金融机构的贷款:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

bureau dataframe, a child of app

该数据帧是 app表:对于父表中的每个客户端(由SK_ID_CURR标识),子表中可能有许多观察值。这些行对应于单个客户的多项先前贷款。bureau数据框又是bureau_balance数据框的父数据框,在那里我们有以前每笔贷款的每月信息。

让我们来看一个从子数据帧创建新特性的例子:每个客户在其他机构的先前贷款数量的计数。尽管我写了一篇关于自动化特征工程的文章,但是在这篇文章中,我们将坚持手工操作。第一本 Kaggle 笔记本要看的 就在这里;是一本全面指导 特征工程的手册。

计算这一特性需要按照客户端 id 对bureau数据帧进行分组(使用groupby),计算一个聚合统计(使用aggcount),然后将结果表与主数据帧合并(使用merge)。这意味着,对于每个客户,我们收集他们以前的所有贷款,并计算总数。这是用 Python 写的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

app dataframe with new feature in second column

现在,我们的模型可以使用以前贷款数量的信息作为客户是否会偿还贷款的预测因素。为了检查这个新变量,我们可以制作一个内核密度估计(kde)图。这显示了单个变量的分布,可以认为是一个平滑的直方图。为了查看这个特性的分布是否根据客户是否偿还了贷款而变化,我们可以用TARGET的值来给 kde 着色:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然TARGET==1分布的峰值稍微在TARGET==0分布的左侧,但是在分布上似乎没有太大的差异。这可能表明,没有偿还贷款的客户以前在其他机构的贷款较少。基于我极其有限的领域知识,这种关系是有意义的!

一般来说,我们不知道一个特性在一个模型中是否有用,直到我们构建并测试这个模型。因此,我们的方法是构建尽可能多的特性,然后只保留那些最相关的特性。“最相关”没有严格的定义,但在“特性选择”部分,我们会看到一些衡量方法。

现在,让我们看看如何从app数据帧的子数据帧获取信息,而不是从app数据帧的子数据帧获取信息!bureau_balance数据帧包含关于每笔先前贷款的每月信息。这是bureau数据框架的一个子框架,因此要将该信息放入主数据框架,我们必须进行两次分组和聚合:首先通过贷款 id ( SK_ID_BUREAU),然后通过客户 id。

例如,如果我们想为每个客户计算在bureau_balance数据框架中每笔先前贷款的MONTHS_BALANCE最大数量的平均值,我们可以这样做:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

app dataframe with new feature in second column

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Distribution of new feature

对于单个特性来说,这是一个很大的代码量,你可以很容易地想象,在几个特性之后,手工的特性工程过程会变得很乏味!这就是为什么我们要编写这样的函数,它采取这些单独的步骤,并在每个数据帧上重复这些步骤。

我们不是一遍又一遍地重复代码,而是将它放入一个名为重构的函数中,然后每当我们想要执行相同的操作时就调用这个函数。编写函数可以节省我们的时间,并允许更具重复性的工作流,因为它每次都会以完全相同的方式执行相同的操作。

下面是一个基于上述步骤的函数,可以在任何子数据帧上使用该函数来计算数字列的聚合统计信息。它首先通过一个分组变量(比如客户机 id)对列进行分组,计算每一列的mean, max, min, sum ,重命名这些列,并返回结果 dataframe。然后,我们可以将这个数据帧与主app数据合并。

(这个函数在很大程度上借鉴了 Kaggle 上 olivier这个内核)。

(这个函数的一半代码行是文档。编写正确的 docstrings 不仅对其他人理解我们的代码至关重要,而且当我们回头看自己的代码时也能理解它!)

要查看这一过程,请参考笔记本,但是我们可以清楚地看到这将节省我们大量的工作,尤其是要处理 6 个子数据帧。

这个函数处理数值变量,但是仍然留下分类变量。分类变量通常表示为字符串,只能取有限数量的值(与连续变量相反,连续变量可以是任何数值)。机器学习模型无法处理string数据类型,所以我们必须找到一种方法,以numeric的形式捕捉这些变量中的信息。

作为分类变量的一个例子,bureau表中有一个名为CREDIT_ACTIVE的列,它记录了以前每笔贷款的状态:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Two columns of the bureau dataframe showing a categorical variable (CREDIT_ACTIVE)

我们可以通过计算每个客户拥有的每种类型贷款的数量来用数字形式表示这些数据。此外,我们可以通过将某一特定贷款类型的计数除以总计数来计算每种贷款类型的标准化计数。我们以此结束:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Categorical CREDIT_ACTIVE features after processing

现在,这些分类特征可以传递到机器学习模型中。这个想法是,我们不仅要获取每种贷款的数量,还要获取这种贷款的相对频率。像以前一样,我们实际上不知道这些新功能是否有用,唯一确定的方法是制作这些功能,然后在模型中测试它们!

我们可以再次编写一个函数来为我们计算分类变量的计数,而不是为每个子数据帧手动执行此操作。最初,我开发了一个非常复杂的方法来完成这项工作,包括数据透视表和各种聚合,但后来我看到其他代码中有人使用 one-hot 编码在大约两行代码中完成了同样的事情。我立即放弃了我的工作时间,转而使用这个版本的功能!

该功能再次为我们节省了大量时间,并允许我们对每个数据帧应用完全相同的步骤。

一旦我们编写了这两个函数,我们就可以使用它们将七个独立文件中的所有数据提取到一个单独的训练(和一个测试数据帧)中。如果你想看到这个实现,你可以看看第一第二手动工程笔记本。以下是最终数据的示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用所有七个表中的信息,我们最终得到总共 1465 个特征!(摘自某原 122)。

我们如何知道这些特性是否有帮助呢?一种方法是计算变量与TARGET之间的皮尔逊相关系数。这是一个相对粗略的重要性衡量标准,但它可以作为与客户还贷能力相关的变量的近似值。以下是与TARGET最相关的变量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Most Positive (left) and Negative (right) correlated variables with the TARGET

EXT_SOURCE_变量来自原始特征,但是我们创建的一些变量是最相关的。然而,我们希望避免过度解读这些数字。每当我们制作大量特征时,我们都会遇到多重比较问题:我们做的比较越多——在这种情况下是与目标的相关性——它们中的一些就越有可能由于随机噪声而变大。由于相关性如此之小,我们在解读数字时需要特别小心。

我们制作的最负相关变量client_bureau_balance_counts_mean,代表每个客户在bureau_balance数据中出现贷款次数的平均值。换句话说,它是每个客户以前每笔贷款的平均月记录数。kde 图如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们有了 1465 个特性,我们遇到了特性太多的问题!更危险的是,这被称为维度的诅咒,它通过特征选择的关键步骤来解决。

特征选择

太多的特征会降低训练速度,降低模型的可解释性,最重要的是,会降低模型在测试集上的泛化性能。当我们有不相关的特征时,这些特征淹没了重要的变量,并且随着特征数量的增加,模型学习数据和目标之间的关系所需的数据点的数量呈指数增长(维度诅咒解释)。

在完成了制作这些特征的所有工作之后,我们现在必须只选择那些“最重要”的,或者说,丢弃那些不相关的。

下一个要浏览的笔记本 在这里:功能选择指南 n 它相当全面,尽管它仍然没有涵盖所有可能的方法!

有许多方法可以减少功能的数量,这里我们将介绍三种方法:

  1. 移除共线变量
  2. 删除有许多缺失值的变量
  3. 使用特性重要性只保留“重要的”变量

移除共线变量

共线变量是彼此高度相关的变量。这些变量是多余的,因为我们只需要保留每对共线要素中的一个,就可以保留两个要素中的大部分信息。高度相关的定义可以变化,这是另一个没有固定规则的数字!作为共线变量的一个例子,以下是中值公寓面积与平均公寓面积的关系图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了识别高度相关的变量,我们可以计算数据中每个变量与其他变量的相关性(这是一个计算量相当大的过程)!然后,我们选择相关矩阵的上部三角形,并基于阈值从每对高度相关的变量中移除一个变量。这在下面的代码中实现:

(这段代码改编自这篇博文。)

在这个实现中,我使用 0.9 的相关系数阈值来删除共线变量。因此,对于相关性大于 0.9 的每对特征,我们移除该对特征中的一个。**在总共 1465 个特征中,这移除了 583 个,**表明我们创建的许多变量是多余的。

删除缺少的列

在所有的特征选择方法中,这似乎是最简单的:只需消除任何超过一定百分比的缺失值的列。然而,即使这个操作也会带来另一个选择,即删除一列的缺失值的阈值百分比。

此外,一些模型,如 LightGBM 中的梯度增强机器,可以处理缺失值而无需插补,然后我们可能根本不想删除任何列!但是,因为我们最终将测试几个需要估算缺失值的模型,所以我们将删除定型集或测试集中缺失值超过 75%的任何列。

这个阈值不是基于任何理论或经验法则,而是基于尝试几种选择,看哪种在实践中效果最好。做这些选择时要记住的最重要的一点是,它们不必做了一次就忘记了。如果模型的表现不如预期,可以在以后再次访问它们。请务必记录下您采取的步骤和性能指标,这样您就可以看到哪个效果最好!

删除缺失值超过 75%的列会从数据中删除 19 列,剩下 863 个特征。

使用特征重要性的特征选择

我们将使用的最后一种选择特征的方法是基于机器学习模型的结果。利用基于决策树的分类器,例如决策树的集合(随机森林、额外的树、梯度提升机器),我们可以提取并使用称为特征重要性的度量。

这方面的技术细节很复杂(它与在模型中包含特征减少杂质有关),但是我们可以使用相对重要性来确定哪些特征对模型最有帮助。我们还可以使用特性重要性来识别和删除对模型帮助最小的特性,包括任何重要性为 0 的特性。

为了找到特征的重要性,我们将使用来自 LightGBM 库的梯度增强机器(GBM)。使用具有两次训练迭代的早期停止来训练该模型,并且在训练运行中对特征重要性进行平均以减小方差。

在特征上运行这个识别出重要性为 0.0 的 308 个特征。

删除重要性为 0 的特征是一个非常安全的选择,因为这些特征在任何决策树中都不会用于分割节点。因此,移除这些特征不会对模型结果产生影响(至少对于这个特定的模型来说)。

这对于特性选择来说不是必须的,但是因为我们有特性的重要性,我们可以看到哪些是最相关的。为了尝试了解模型在进行预测时会考虑哪些因素,我们可以设想 15 个最重要的特征:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Top 15 most important features

我们看到我们构建的一些特性进入了前 15 名,这应该给我们一些信心,我们所有的努力都是值得的!我们的一个功能甚至进入了前五名。这个特性,client_installments_AMT_PAYMENT_min_sum表示每个客户以前在 Home Credit 贷款的最低分期付款总额。也就是说,对每个客户来说,这是他们以前每笔贷款的最低还款额的总和。

特性重要性并没有告诉我们这个变量的较低值是否对应于较低的默认率,它只是让我们知道这个特性对于进行决策树节点的分割是有用的。特性重要性是有用的,但是它们不能提供对模型的完全清晰的解释!

在移除 0 个重要特征之后,我们有 536 个特征和另一个选择要做。如果我们认为我们仍然有太多的功能,我们可以开始删除那些最不重要的功能。在这种情况下,我继续进行特性选择,因为我想测试除 gbm 之外的模型,这些模型不能很好地处理大量的特性。

我们做的最后一个特征选择步骤是只保留占 95%重要性的特征。根据梯度推进机,342 个特征足以覆盖 95%的重要性。下图显示了累积重要性与特征数量的关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Cumulative feature importance from the gradient boosting machine

我们还可以使用其他一些降维技术,比如主成分分析(PCA) 。该方法在减少维数方面是有效的,但是它也将特征变换到低维特征空间,在该空间中它们没有物理表示,这意味着 PCA 特征不能被解释。此外,PCA 假设数据是正态分布的,这对于人工生成的数据可能不是有效的假设。在笔记本中,我展示了如何使用 pca,但实际上并没有将它应用于数据。

然而,我们可以使用 pca 进行可视化。如果我们将前两个主成分用TARGET的值着色,我们会得到如下图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

First two principal components of the data

这两个类别并没有完全分开,只有两个主要部分,显然我们需要两个以上的特征来识别哪些客户将偿还贷款,哪些不会。

在继续之前,我们应该记录我们采取的功能选择步骤,以便我们记住它们以供将来使用:

  1. 移除相关系数大于 0.9 的共线变量:移除 583 个特征
  2. 删除缺失值超过 75%的列:删除了 19 个特征
  3. 根据 GBM 删除 0.0 重要性特征: 308 删除特征
  4. 仅保留 95%特征重要性所需的特征: 193 个特征被删除

最终数据集有 342 个要素。

如果看起来在特性选择过程中有一些任意的选择,那是因为确实有!稍后,如果我们对自己的表现不满意,我们可能会重新考虑这些选择。幸运的是,因为我们编写了函数并记录了我们的决策,所以我们可以很容易地更改一些参数,然后重新评估性能。

型号选择

一般来说,在机器学习问题的这一点上,我们将继续评估许多模型。没有一个模型在每项任务上都比其他模型更好(T2,“没有免费的午餐定理”,T3),因此我们需要尝试一系列模型来决定使用哪一个。然而,近年来,有一个模型在处理中等规模的结构化数据问题上变得越来越成功:梯度推进机。(这个模型如此有效有很多原因,作为一个全面的指南,这篇硕士论文是一个很好的读物。)

模型选择是我非常依赖他人工作的一个领域。正如本文开头提到的,在这场比赛之前,我的首选模型是随机森林。虽然在这个比赛的早期,从阅读其他人的笔记本中可以清楚地看到,为了参加比赛,我需要实现一些版本的梯度推进机器。Kaggle 上几乎每个排行榜顶部的提交内容都使用了渐变增强机器的一些变体(或多个版本)。(您可能会看到使用的一些库是 LightGBMCatBoostXGBoost 。)

在过去的几周里,我已经通读了许多内核(参见这里的和这里的),现在对使用 LightGBM 库部署梯度增强机器非常有信心(Scikit-Learn 确实有一个 GBM,但它不如其他库那样高效或准确)。尽管如此,主要出于好奇,我想尝试其他几种方法,看看从 GBM 中获得了多少。这个测试的代码可以在 Kaggle 上的这里找到。

这并不完全是一个公平的比较,因为我在 Scikit-Learn 中主要使用默认的超参数,但是它应该给我们几个不同模型的能力的第一近似值。在应用了所有特征工程和特征选择之后,使用数据集,下面是带有公共排行榜分数的建模结果。除 LightGBM 之外的所有型号都内置于 Scikit-Learn:

  • 逻辑回归= 0.768
  • 【1000 棵树随机森林= 0.708
  • 【1000 棵多余的树= 0.725
  • sci kit 中的梯度增强机器-学习 1000 棵树= 0.761
  • light GBM 中的梯度推进机,1000 棵树= 0.779
  • 所有模型的平均值= 0.771

事实证明,其他人都是对的:梯度推进机是正确的选择。它提供了开箱即用的最佳性能,并且有许多超参数,我们可以调整它们以获得更好的分数。这并不意味着我们应该忘记其他模型,因为有时将多个模型的预测加在一起(称为集成)会比单个模型本身表现得更好。事实上,许多 Kaggle 竞赛的获胜者在他们的最终模型中使用了某种形式的组装。

我们没有在模型上花太多时间,但这是我们在接下来的笔记本和文章中要转移的重点。接下来,我们可以使用超参数优化来优化最佳模型,即梯度推进机。我们也可以将模型平均在一起,甚至将多个模型叠加起来进行预测。我们甚至可能回去重做特征工程!最重要的一点是,我们需要不断试验,找出最有效的方法,我们可以阅读其他人所做的尝试,并以他们的工作为基础。

结论

作为一名数据科学家,重要的性格特征是好奇心和承认自己并非无所不知!从我在排行榜上的位置来看,我显然不知道解决这个问题的最佳方法,但我愿意不断尝试不同的东西,并向他人学习。 Kaggle 竞赛只是玩具问题,但这并不妨碍我们用它来学习和实践概念,以应用到真实的项目中。

在本文中,我们讨论了许多重要的机器学习主题:

  1. 使用特征工程从多个相关信息表中构建新特征
  2. 应用特征选择移除不相关的特征
  3. 评估几种机器学习模型对任务的适用性

在完成所有这些工作后,我们能够将排行榜分数从 0.678 提高到 0.779,并在排行榜上上升了 1000 多位。接下来,我们的重点将转移到优化我们选择的算法,但我们也会毫不犹豫地重新审视特征工程/选择。

如果你想了解我在机器学习方面的最新进展,你可以查看我在 Kaggle 上的工作:笔记本的速度比文章快一点!请随意使用这些笔记本开始使用 Kaggle,并开始为社区做出贡献。我将利用这次 Kaggle 比赛来探索一些有趣的机器学习想法,如自动化特征工程贝叶斯超参数优化。我计划尽可能多地从这次比赛中学习,我期待着探索和分享这些新技术!

一如既往,我欢迎建设性的批评和反馈,可以通过 Twitter @koehrsen_will 联系。

机器学习的疯狂:预测每一场 NCAA 锦标赛

原文:https://towardsdatascience.com/machine-learning-madness-predicting-every-ncaa-tournament-matchup-7d9ce7d5fc6d?source=collection_archive---------8-----------------------

大舞蹈的概率模型、可视化和结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

又到了一年中的这个时候。三月疯狂来了,这意味着是时候填写你的括号了,当它不可避免地被你所有的朋友和家人看到时,你会很失望。

不过,也不全是坏消息。NCAA 级男子篮球锦标赛是本年度最激动人心的体育赛事之一,因为它伴随着冷门、灰姑娘和不可预测性。每年三月,数以百万计的篮球迷和非篮球迷都拿着他们的虚拟锐器参与这一现象,希望获得一个不可能的完美支架。有多不可能?鉴于你对篮球略知一二,教授们保守地认为你的胜算是 1280 亿分之一。

动机

感谢我的成长经历和在体育中心的成长经历,从我记事起,我就是一个狂热的大学篮球迷。每年我都期待着进行研究,有条不紊地填写一个括号。

然而,今年在收到一封关于即将到来的 Kaggle 比赛的电子邮件后,我决定第一次尝试模拟比赛,标题是:谷歌云& NCAA 机器学习比赛。如果你不熟悉 Kaggle,它被称为“数据科学&机器学习之家”。 Kaggle 举办机器学习比赛,收集有趣的数据集,并提供指南来帮助你成长为一名数据科学家。

竞争

比赛的目标是利用过去的锦标赛结果来建立和测试模型,以便预测 2018 年 NCAA 第一组男子篮球锦标赛中所有可能比赛的结果。这些结果是通过概率计算得出的,例如,A 队有 55%的机会击败 b 队。然后,我们会对每个最终提交的作品进行评估,并使用一种称为对数损失的指标在公共排行榜上进行排名。如果您不熟悉日志损失,只需知道越小越好。对数的使用为自信和错误提供了极端的惩罚,如下面的公式所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方法

进入这个项目,我有一个大概的想法,我想用它做什么。话虽如此,我对前几年的类似项目做了一些研究,从中我发现了一些对我有用的见解。

首先,似乎很多模型都将逻辑回归作为它们的主要算法,这是因为它的概率性质和有效而简单的实现。第二,许多模型利用了其他广受好评的排名和评分系统,如肯·波默罗伊和 T2 的杰夫·萨格林。

利用以前的领域知识,以及这些来自研究的见解,我决定对其他模型采取类似的方法,同时做一些有趣的改变。我的高级方法可以分为几个步骤:

  1. 收集旨在衡量给定团队质量的高绩效排名、分数和评级
  2. 将这些指标汇编成一个综合得分,提供可靠的能力度量
  3. 计算每场比赛中各队综合得分的差异
  4. 对综合得分差异进行训练和测试逻辑回归,以预测未来的比赛

模型分解

按照这种方法,我的模型由两个不同的部分组成。每个部分都有独特的权重,用于生成每个团队的综合得分。查看以下可视化内容,了解各种输入的概述:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些重量是在相互测试了几个变量之后选择的。在本文的其余部分,在最终模拟今年的锦标赛结果之前,我将更详细地介绍模型的每个部分。

平均选择排名分数

我发现最有用的资源之一是一个数据集,其中包含随着时间推移的梅西综合排名。梅西排名是检查所有其他排名系统的目的地。我决定选择可用的最高性能系统,并平均计算分数。在为每个持续更新的系统拟合和测试单独的逻辑回归模型后,我发现表现最好的指标是Sagarin(SAG)Pomeroy(POM)Moore(MOR)和 Whitlock (WLK)。

在编辑了这些排名的平均分数后,我单独对这个特征进行了拟合和测试,得到了-0.543 的对数损失,这比我的基线基于种子的模型和整体平均排名实现都有所改进。

标准化 Elo 评级

如果你曾经研究过体育预测背后的方法论,你可能会遇到一两次 Elo。Nate Silver 和他的团队是 Elo 的大力支持者,所以当我在 Kaggle 上看到 Liam Kirwin 的实现后,我不得不考虑以某种方式将它融入我的模型中。

如果你不熟悉 Elo 评级系统,这是一种计算零和游戏中玩家相对技能水平的迭代方法。你可能听说过它被用于国际象棋或其他棋盘/视频游戏,但只知道应用程序是无止境的。Elo 通常使用以下公式计算:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算每支球队的 Elo 分数需要一些时间,因为该程序必须迭代每场比赛并调整相应球队的评级。一旦计算出来,基于 Elo 的逻辑回归模型也表现得相当好,其对数损失为-0.543,与选择排名模型的先前结果持平。

模型评估

一旦之前的两个分数都被收集,它们被重新调整到介于 0 和 1 之间。然后使用上述方法对他们进行加权,并随后汇编成每个团队的最终综合得分,最终用于我们的逻辑回归模型。使用交叉验证,该模型在训练数据上获得了-0.540 的对数损失,这比其自身的任何一部分都略有改善!

为了更好地了解综合得分,请根据以下指标查看今年锦标赛中排名前十的球队:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

锦标赛模拟

所有这些都是好东西,但我们真正想看到的是所有这些分数和概率如何应用于今年的数据!多亏了扎克·梅尔令人敬畏的名为 kaggleNCAA 的 R 包,这个任务相当容易完成。在用 1000 次模拟运行我的模型后,我得到了以下结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,从长远来看,我的模型预测最有可能的赢家是弗吉尼亚,有 16%的机会。一些有趣的选择还包括杜克大学(2)和冈萨加大学(4)作为进入四强的热门,很可能第一轮就被佛罗里达大学(9)和洛约拉-芝加哥大学(11)击败。

包扎

恭喜你能走到这一步!总的来说,我很高兴地说,承担这个项目使我成为一个更有能力的数据科学家。我也很兴奋能参加今年的比赛,最重要的是,我渴望为明年调整和改进我的模型!

代码及完整 Jupyter 笔记本见我的 Github

感谢阅读,并祝所有参加今年三月疯狂的有抱负的支架学家好运!

感谢阅读!如果你喜欢这篇文章,请继续向鼓掌按钮展示你的爱。对更多的帖子感兴趣吗?请务必关注我并订阅下面的我的简讯以接收任何新内容。想了解更多关于我和我在做什么,请查看我的网站。

机器学习,遇见海洋

原文:https://towardsdatascience.com/machine-learning-meet-the-ocean-e1b957e4dc61?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Lubec, ME — the easternmost town in the US. This photo was a winner of NOAA’s 2015 World Ocean Day contest.

马萨诸塞州的梅德福德今天气温 20 度,当我过河时,昨天的雪正刮过马路。我飞过整个国家,和一小群工程师、渔业科学家以及以晚餐和能量饮料的承诺招募的朋友们聚集在一个小小的地下室办公室里。在接下来的五个小时里,我们将观看新英格兰的渔民从亮橙色的塑料袋子里捞出鱼,把它们放在一个测量条上,然后迅速把手拿开,让它们越过船的一侧。当我们扫描数字镜头时,我们标记鱼出现的时间,记录鱼的种类,并在屏幕上通过从嘴到尾巴画一条线来测量。这就像一个缓慢,细致的水果忍者游戏。

所有这些工作和小吃都是为了准备我们计划在今年夏天举办的训练计算机识别鱼类的比赛。我们正在努力实现这样一个未来,即可以实时监控渔民捕获的东西和他们释放的东西,让渔民和管理者以及任何想要跟踪海洋捕捞量的人更容易、更实惠地做到这一点。这是高科技、复杂的计算机科学和世界上最古老的职业之一的结合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Today’s wheelhouse has multiple screens to let you track your catch. Or your dog. Photo ©Heather Perry

这是即将到来的保护革命,是认识和理解我们周围世界的革命。自然界充满了不可思议且往往难以观察到的现象。研究雨林的科学家过去常常在野外露营几天,希望观察到罕见的美洲豹,但现在他们可以设置相机不断记录,并在世界任何地方从他们的笔记本电脑上查看这些镜头。保护技术的进步正在产生比以往更多的数据,关于什么生活在哪里,谁吃谁,什么正在消失以及消失的速度,但仍然需要人类时间来观看视频片段。我们需要将新的传感器系统与分析工具结合起来,让我们能够将数据转化为信息和知识。

这是大型盈利性公司擅长解决的问题,人们也乐于为之开发工具,因为解决一个大公司的问题可以让你获得一大笔公司薪水。如果你能成为一名亿万富翁,编写一个算法来处理银行数据,你会花部分时间调整同样的算法来模拟鱼类种群吗?数据竞赛的世界表明,对一些人来说,答案是。我们的地下室小组给了我希望,越来越多的工程师、数据科学家、UX 设计师和其他好奇的创新者被不寻常的挑战性问题所吸引,他们的解决方案以超越利润的影响来衡量。

这里涉及到利润。在许多沿海小社区,捕鱼是最大的生意。在美国,咸水捕鱼——包括商业捕鱼和体育捕鱼——是一项价值 3000 亿美元的产业,提供了 180 万个工作岗位。越来越多的人想知道他们的海鲜来自哪里,他们不是在吃海里的最后一条鱼。这意味着准确计算鱼的数量变得更加重要,一些渔民急切地采用新技术来证明他们的生意是多么可持续。他们的目标是最大限度地增加渔业收入,同时在海洋中留下足够的鱼来繁殖新的鱼供明年捕捞。有了更有效的电子工具,渔民就可以更容易地跟踪渔获,管理人员也可以更容易地监控对鱼类种群的整体影响。我们的项目得到了国家鱼类和野生动物基金会的资助,但是我们 20 万美元的预算仅仅相当于一个硅谷软件工程师的年薪。因此,我们的团队包括那些愿意以很低的折扣工作的人,为了解决复杂问题的刺激,为了一些美味的猪肉。

人们似乎对为鱼创建算法感到兴奋的一个原因是,捕鱼给计算机带来了一系列新的挑战。船甲板或水下的光线不足会扭曲颜色,模糊鱼的边缘。在明亮的阳光下,闪闪发光的鱼的眩光对数码相机来说是没有数据的。如果鱼在网里或滑槽里游来游去,你必须很聪明,确保你能区分不同的鱼,而不是重复计算。即使在最好的条件下,有些鱼也很难区分。本周六早上,一个我们称之为“鱼老板”的人加入了我们,他是一名渔业科学家,也是一名多年的观察员,在渔民将鱼拖上船时,他骑着马一起去捕鱼,数着鱼的数量。我们弓着腰在屏幕上一帧一帧地移动,给视频中的鱼做注解,偶尔会叫鱼老板过来,以确保我们没有把一条比目鱼和另一条弄混。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Matching verified Fish IDs to footage.

如果我们成功了,不仅在新英格兰,而且在整个美国和全世界,渔民和管理人员都可以更容易地计算鱼的数量。我们将我们的产品设计成开源的,以使其他渔场更有可能采用和实施我们帮助开发的产品。其中一些工具,如视频注释软件,非常简单,任何人都可以使用,为日益发展的公民科学运动做出了贡献。是时候将物联网带到外面,利用我们不断增长的技术能力来支持我们周围的自然世界,以及它所支持的商业和生活质量。

机器学习遇上时尚

原文:https://towardsdatascience.com/machine-learning-meets-fashion-48ee8f6541ad?source=collection_archive---------3-----------------------

在《人工智能历险记》的这一集中,我们将尝试把整个机器学习工作流程整合成一个流程,从我们之前的剧集中汲取最佳实践。这是一个很大的材料,但我认为我们可以做到这一点!

MNIST 数据集训练一个模型通常被认为是机器学习的“Hello world”。这已经做过很多次了,但不幸的是,仅仅因为一个模型在 MNIST 上表现良好,并不一定意味着它在其他数据集上的高性能预测,尤其是因为我们今天拥有的大多数图像数据都比手写数字复杂得多。

时髦的机器学习

Zalando 决定是时候让 MNIST 再次流行起来,最近发布了一个名为fashion-mnist的数据集。这是与“常规”MNIST 完全相同的格式,除了数据是以各种服装类型、鞋子和包包的图片的形式。它仍然跨越 10 个类别,图像仍然是 28×28 像素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们训练一个模型来检测正在展示哪种类型的服装!

线性分类器

我们将从构建一个线性分类器开始,看看我们是如何做的。像往常一样,我们将使用 TensorFlow 的评估框架来使我们的代码易于编写和维护。提醒一下,我们将加载数据,创建分类器,然后运行训练和评估。我们也将直接从本地模型中做出一些预测。

让我们从创建模型开始。我们将把数据集从 28x28 像素展平到 1x784 像素,并创建一个名为pixels的特征列。这类似于我们第三集的flower_features简单明了的评估者

接下来,让我们创建我们的线性分类器。我们有 10 个不同的可能的类别来标记,而不是我们之前使用的鸢尾花的 3 个类别。

为了运行我们的训练,我们需要设置数据集和输入函数。TensorFlow 有一个内置的实用程序来接受一个numpy数组来生成一个输入函数,所以我们将利用它。

我们将使用input_data模块加载我们的数据集。将函数指向下载数据集的文件夹。

现在我们可以调用classifier.train()来集合我们的分类器、输入函数和数据集。

最后,我们运行一个评估步骤,看看我们的模型做得如何。当我们使用经典的 MNIST 数据集时,这个模型通常可以达到 91%的准确率。然而,fashion-mnist 是一个相当复杂的数据集,我们只能达到 80%左右的精度,有时甚至更低。

我们怎样才能做得更好?正如我们在第六集看到的,让我们深入

深入

换入 DNNClassifier 只是一行的变化,我们现在可以重新运行我们的训练和评估,看看深度神经网络是否能比线性神经网络表现得更好。

正如我们在第 5 集中所讨论的,我们现在应该打开 TensorBoard 来并排看看这两个模型!

$ tensorboard --logdir=models/fashion_mnist/

(浏览至 http://localhost:6006 )

张量板

看看 tensorboard,看起来我的深度模型并不比我的线性模型表现得更好!这也许是一个调整我的一些超参数的机会,就像在第 2 集中讨论的那样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Looks like a race to the bottom…

也许我的模型需要更大,以适应这个数据集中的复杂性?或者也许我的学习速度需要降低?让我们试试看。稍微试验一下这些参数,我们就可以突破,获得比线性模型更高的精度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The deep model (in blue/red) achieves a consistently lower loss

要达到这种精度需要更多的训练步骤,但最终对于更高精度的数字来说,这是值得的。

还要注意,线性模型比深度网络更早达到稳定状态。因为深度模型通常比线性模型更复杂,所以它们需要更长的训练时间。

在这个阶段,假设我们对我们的模型很满意。我们将能够导出它并产生一个可伸缩的时尚分类器 API。你可以看第 4 集了解更多关于如何做的细节。

做预测

让我们快速浏览一下如何使用估计器进行预测。在很大程度上,它看起来就像我们如何调用培训和评估;这是评估者的伟大之处之一——一致的界面。

注意,这一次我们指定了 1 的batch_size、1 的num_epochs和假的shuffle。这是因为我们希望预测一个接一个地进行,一次对所有数据进行预测,保持顺序。我从评估数据集的中间提取了 5 幅图像,供我们尝试预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我选择这 5 个不仅仅是因为它们在中间,而是因为模型得到了其中的 2 个错误。这两个例子都应该是衬衫,但是模型认为第三个例子是一个包,第五个例子是一件外套。你可以看到这些例子比手写数字更具挑战性,如果没有其他原因,只是图像的颗粒感。

后续步骤

你可以在这里找到我用来训练这个模型并生成图像的全部代码。你的模特表现如何?你最终使用了什么参数来达到这个精度?请在评论中告诉我!

我们的下一集将关注机器学习生态系统的一些工具,以帮助您构建工作流和工具链,并展示更多可以用来解决机器学习问题的架构。我期待在那里见到你!在那之前,继续机器学习!

感谢阅读本集云 AI 冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注 Medium 上的 me 或者订阅 YouTube 频道来观看未来的剧集。更多剧集即将推出!

机器学习模因:粥分析

原文:https://towardsdatascience.com/machine-learning-memes-a-porridge-analysis-208d30bce57e?source=collection_archive---------0-----------------------

在本帖中,我来看看一个 2016 Imgur 现象:366 天的粥。单个 Imgur 用户 only wheagle 在 2016 年每天都发布了不同的粥图。我在圣诞假期开始做这个分析,当时我以为粥会在 12/31/16 停止。值得庆幸的是,这位英雄在 2017 年继续发布他们每天吃粥的照片。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Porridge. Source: http://imgur.com/gallery/kZXXCto

我会在一年中随机看到这些帖子,通常我会一笑置之,但一年后我决定深入挖掘。我登录了 only wheage 的账户,发现尽管每天的图片基本上都是一样的,但每篇帖子的上传票数/浏览量/评论量却大相径庭。

作为一个数据迷,这引起了我的兴趣。如果我们比较一周中的几天,一天中的几个小时,一年中的几个月等等,会怎么样呢?看看什么时候在 Imgur 上发布一个湿漉漉的迷因最合适。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果

直截了当地说,没有细节或解释,这里有一个热图,显示了 2016 年基于图像发布时间的得分总和,其中粥帖子的得分越高,颜色越深:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Data Viz created with Seaborn in Python (Notebook link at the end)

看着这张热图,你可以清楚地看到一个更暗的光带在一天的中间,以及一些围绕着早晨和晚上的暗点。第 5 天(星期六)显然在格林威治标准时间凌晨 2 点和 10 点得分最高。把这些时间转换成你的时区,然后贴一张你早餐吃的任何东西的照片到 Imgur 的首页!(编辑:这应该重做-我每次都为帖子添加分数,而不是获得每个日期/时间的平均分数)

我所有的代码和输出都可以从我的 IBM 数据科学体验笔记本上查看或下载。

我的分析

所以我展示了 1 个可视化,但我还为这些数据创建了许多其他的和一个预测模型。在这一部分,我将详细介绍我在这个项目中的工作。我不会进入技术细节,因为 Jupyter 笔记本的链接在文章的末尾(如果你不喜欢阅读,向下滚动)。

数据收集:

没有 Imgur 出色的 API,这篇文章是不可能发表的。除了这个 API,他们还提供了一个非常容易使用的 Python 模块。我利用这个模块收集我的数据。更具体地说,get_account_submissions()方法让我可以轻松地获取 only 粥帖子的所有数据。

数据清理:

这部分很简单。API 返回一些非常适合熊猫数据帧的 JSON。我收集了 only 粥的所有帖子但只是可视化,并为 2016 的帖子建立了一个模型。我决定将 2017 年作为我的模型的测试集。令人惊讶的是,当检查 2016 年数据的形状时,它有 366 个条目:只有麦片粥没有休息一天。大多数元数据对分析没有太大帮助。我确实为每个帖子设想了不同的指标,比如分数、投票数、评论数和浏览量。我把剩下的都拿走了。

探索性可视化:

当我处理这些数据时,我正在试验 Python 中不同的数据可视化库。我发现 Seaborn 是我最喜欢的开箱即用的美学。

这是一个 Seaborn 图,显示周六是观看、评分和评论的最佳时间:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我真的很喜欢这个可视化,但它并没有告诉我们太多。这是我最喜欢的来自 Seaborn 的情节:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于这个可视化,我已经创建了一个二进制目标变量,其中如果一篇文章高于中值,则为 1,如果低于中值,则为 0。我真的很喜欢这个可视化,因为它显示只有麦片粥在今年的前 6 个月没有得到太多的爱,但在年底,有更多的帖子超过了中值分数阈值。

Seaborn 很美,但不互动。对于交互性,Plotly 是我的最爱。

下面是一个时间序列图,显示了 2016 年全年评论、评分和浏览量之间的关系。(我猜 Medium 不喜欢 Plotly iframes?如果您知道如何修复这种嵌入,请进行评论)

[## comment_count,score,views |由 Gfilla 制作的散点图| plotly

Gfilla 的“评论 _ 计数,得分,浏览量”的交互图和数据是散点图,显示评论 _ 计数,得分…

plot.ly](https://plot.ly/~gfilla/62.embed)

在 Jupyter 笔记本中,还有其他有趣的可视化效果,我只想在这里分享几个我最喜欢的。

模型构建:

好了,viz 的东西说够了,该上数学课了。统计学家可以在这里停止阅读,这样他们就不会感到不安:)。

由于我们在样本和特征方面非常有限,统计建模对于这个数据集来说有点牵强。但这有什么理由阻止我们呢?

如前一节所述,我为这个数据集创建了一个二元目标特征,基于帖子的分数是高于还是低于中位数。我知道为原始分数创建预测会非常困难,因为所有有用的元数据只有在图像发布后才知道(例如评论计数)。我只知道邮件发出的时间。所以我把帖子的时间戳分成了尽可能多的特征(甚至分钟)。我进一步将这些特性扩展为虚拟变量,因为我将每个日期/时间视为一个分类值。这给我留下了一个包含 132 个特征的数据集。

我决定用一个基本的决策树作为我的模型。我保留了 10%进行测试,结果是低于中位数的帖子精度为 0.74,高于中位数的帖子精度为 0.56。该模型的 F1 平均得分为 0.65。这个模型没有什么真正令人印象深刻的,请随意构建一个理解粥的复杂性的深度 NN;)

预测 2017 年粥:

2016 年后的粥帖子需要遵循与我训练模型的数据相同的数据准备管道。这一开始看起来很简单,但是如果不仔细考虑的话会变得有点复杂。在单个数据集上训练和测试模型与在新数据出现时对其进行评分相比,具有不同的测试要求。

这是一个有趣的挑战,在我可视化地探索数据并创建不同版本的数据框架时,我没有想到这一点。归根结底,我对数据进行的任何操作都是为了进入模型的原始训练数据,需要与对测试数据进行的转换保持一致。列的顺序。虚拟变量。删除功能。等等。

因为这不是我工作的初衷,所以如果人们感兴趣的话,我会把这篇文章作为后续文章。如果我继续这部分的工作,我将会致力于构建一个好的分类器(如果可能的话),而不是数据可视化。你可以在这里查看和下载我的笔记本。

预测酒店在线排名点击量的机器学习模型

原文:https://towardsdatascience.com/machine-learning-model-for-predicting-click-through-in-hotel-online-ranking-d55fc18c8516?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo credit: pexels

如何应用机器学习技术来最大化呈现选项的点击率

酒店个性化和排名的核心是将一组酒店与一组品味各异、有时难以察觉的游客相匹配。匹配的准确性取决于在线旅行社(OTA)如何利用他们的可用信息,如给定的酒店特征、酒店的位置吸引力、用户的总购买历史和竞争对手的信息等,来推断旅行者对酒店的偏好。例如,Hotels.com 通过编辑客户的搜索标准,当他们进行旅游查询时,在结果列表的顶部呈现最具竞争力的产品来满足他们的需求

这是我们今天的目标:应用机器学习技术来最大化所呈现选择的点击率,其中点击表明访问者的兴趣,并可能决定预订。

最终,这就是我们想要实现的:当用户将他(或她)的搜索标准输入到酒店搜索引擎中时,会根据上述排名算法向他(或她)显示一个经过筛选的个性化排序的可用酒店列表,从而使列表顶部的酒店成为用户点击概率最高的酒店。我们一步一步来。

数据描述

数据集包含以下信息,可以从 Kaggle 下载,我们将使用 train.csv

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1

让我们试着让列名更直观。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4

数据预处理

import pandas as pddf = pd.read_csv('train.csv')
df.shape

(9917530,54)

这是一个包含近 1000 万个观测值和 54 个特征的大型数据集。因此,我正在寻找一种方法使它更易于管理。

import matplotlib.pyplot as plt
n, bins, patches = plt.hist(df.prop_country_id, 100, density = 1, facecolor='blue', alpha=0.75)
plt.xlabel('Property country Id')
plt.title('Histogram of prop_country_id')
plt.show();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5

df.groupby('prop_country_id').size().nlargest(5)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6

n, bins, patches = plt.hist(df.visitor_location_country_id, 100, density = 1, facecolor='blue', alpha=0.75)
plt.xlabel('Visitor location country Id')
plt.title('Histogram of visitor_location_country_id')
plt.show();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7

df.groupby('visitor_location_country_id').size().nlargest(5)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 8

这些数据是匿名的,因此无法确定消费者计划前往的确切国家或城市。然而,很明显,最大的国家(标为 219)是美国。最大的国家有 61%的观测值。其中,58%的搜索是由也在这个国家的消费者进行的,这表明该国幅员辽阔,国内旅游占很大一部分。价格货币也表明最大的国家是美国。

因此,为了提高计算效率,我们将在美国游客身上训练独立模型。这种方法大大减少了训练时间。

us = df.loc[df['visitor_location_country_id'] == 219]
us = us.sample(frac=0.6, random_state=99)
del us['visitor_location_country_id']

受限于计算能力,我们随机取美国数据集的 60%。然后删除“访问者 _ 位置 _ 国家 _id”列。

us.isnull().sum()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 9

如您所见,我们在许多功能中有许多缺失的数据。我们将删除 NaN 值超过 90%的特征,还将删除“日期时间”、“位置标识”和“属性标识”,并估算包含 NaN 值不到 30%的三个特征,它们是:“属性查看得分”、“属性位置得分 2”和“原始目的地距离”。

cols_to_drop = ['date_time', 'visitor_hist_starrating', 'visitor_hist_adr_usd', 'srch_query_affinity_score', 'comp1_rate', 'comp1_inv', 'comp1_rate_percent_diff', 'comp2_rate_percent_diff', 'comp3_rate_percent_diff', 'comp4_rate_percent_diff', 'comp5_rate_percent_diff', 'comp6_rate_percent_diff', 'comp7_rate_percent_diff', 'comp8_rate_percent_diff', 'comp2_rate', 'comp3_rate', 'comp4_rate', 'comp5_rate', 'comp6_rate', 'comp7_rate', 'comp8_rate', 'comp2_inv', 'comp3_inv', 'comp4_inv', 'comp5_inv', 'comp6_inv', 'comp7_inv', 'comp8_inv', 'gross_bookings_usd', 'srch_id', 'prop_id']
us.drop(cols_to_drop, axis=1, inplace=True)

随机估算“prop _ review _ score”

random_impute

这种方法消除了平均数或总数估计量的插补方差,同时保持了项目值的分布。

用平均值估算“道具位置得分 2”

us['prop_location_score2'].fillna((us['prop_location_score2'].mean()), inplace=True)

用中间值估算“起点 _ 终点 _ 距离”

us['orig_destination_distance'].fillna((us['orig_destination_distance'].median()), inplace=True)

我们受够了指责!

电子设计自动化(Electronic Design Automation)

us.shape

(3467283,22)

经过基本的数据清理后,我们的美国数据集包含超过 340 万个观测值和 22 个特征。让我们来探索这些特性。

点击并预订

我们的目标变量是“click_bool”,而不是“booking_bool”。因为哪里有预订,哪里就一定有点击,我们要优化点击。

import matplotlib.pyplot as plt
import seaborn as sns
sns.countplot(x='booking_bool',data=us, palette='hls')
plt.show();us['booking_bool'].value_counts()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 10

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 11

sns.countplot(x='click_bool',data=us, palette='hls')
plt.show();us['click_bool'].value_counts()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 12

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 13

由于在线旅游业务的性质,预订率(2.8%)和点击率(4.3%)都非常低,非点击印象非常严重,类别非常不平衡。

搜索停留时间

n, bins, patches = plt.hist(us.srch_length_of_stay, 50, density = 1, facecolor='blue', alpha=0.75)
plt.xlabel('Search length of stay')
plt.title('Histogram of search_length_of_stay')
plt.axis([0, 30, 0, 0.65])
plt.show();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 14

us.groupby('srch_length_of_stay').size().nlargest(5)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 15

搜索最多的停留时间是 1 天,然后是 2 天、3 天……没有异常值。

搜索成年人数量

n, bins, patches = plt.hist(us.srch_adults_count, 20, density = 1, facecolor='blue', alpha=0.75)
plt.xlabel('Search adults count')
plt.title('Histogram of search_adults_count')
plt.show();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 16

df.groupby('srch_adults_count').size().nlargest(5)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 17

最常见的搜索成人计数是 2-成人,然后 1-成人,有意义。

房产星级评定

n, bins, patches = plt.hist(us.prop_starrating, 20, density = 1, facecolor='blue', alpha=0.75)
plt.xlabel('Property star rating')
plt.title('Histogram of prop_star_rating')
plt.show();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 18

最常见的搜索属性星级是 3 星。很高兴知道,我会想得更高。

物业是不是品牌

us.groupby('prop_brand_bool').size()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 19

73%以上的物业是品牌物业。这很有意义,因为我们谈论的是美国酒店和美国游客。

周六是否留下

us.groupby('srch_saturday_night_bool').size()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 20

价格美元

sns.set(style="ticks", palette="pastel")ax = sns.boxplot(x="click_bool", y="price_usd", hue="click_bool", data=us)
ax.set_ylim([0, 200]);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 21

us.groupby('click_bool')['price_usd'].describe()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 22

平均而言,获得点击的 price_usd 总是低于没有获得点击的 price _ USD。

平衡等级

对于快速学习,我们的平衡策略是向下采样负面实例。

down_sampling

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 23

模型训练和评估

用集成模型进行点进预测

ensemble_models

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 24

用朴素贝叶斯模型进行点进预测

naive_bayes_models

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 25

用神经网络进行点进预测

neural_network

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 26

基于这种基线方法,在未来的帖子中,我们将构建一个学习排名模型,为每个印象个性化酒店排名。但在那之前,享受点击吧!

Jupyter 笔记本可以在 Github 上找到。周末愉快!

机器学习——不平衡数据集下的多类分类

原文:https://towardsdatascience.com/machine-learning-multiclass-classification-with-imbalanced-data-set-29f6a177c1a?source=collection_archive---------0-----------------------

分类和提高性能的技术方面的挑战

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

source [Unsplash]

具有不平衡数据集的多个类的分类问题比二元分类问题提出了不同的挑战。偏斜分布使得许多传统的机器学习算法效率较低,尤其是在预测少数类示例时。为了做到这一点,让我们首先理解手头的问题,然后讨论克服这些问题的方法。

  1. **多类分类:**两个以上类的分类任务;例如对一组水果图像进行分类,这些水果可以是橙子、苹果或梨。多类分类假设每个样本被赋予一个且仅一个标签:水果可以是苹果或梨,但不能同时是两者。
  2. **不平衡数据集:**不平衡数据通常指的是分类问题,其中类没有被平等地表示。例如,您可能有一个 3 类分类问题,将一组水果分类为总共有 100 个实例的橙子、苹果或梨。共有 80 个实例被标记为 1 类(橙子),10 个实例被标记为 2 类(苹果),其余 10 个实例被标记为 3 类(梨)。这是一个不平衡的数据集,比例为 8:1:1。大多数分类数据集在每个类中的实例数量并不完全相等,但是微小的差异通常并不重要。在一些问题中,阶层失衡不仅是普遍现象,也是意料之中的。例如,在描述欺诈交易的数据集中,数据是不平衡的。绝大多数交易属于“非欺诈”类,极少数属于“欺诈”类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料组

我们将在这个例子中使用的数据集是著名的“20 个新闻组”数据集。20 个新闻组数据集是大约 20,000 个新闻组文档的集合,平均分布在 20 个不同的新闻组中。20 个新闻组集合已经成为机器学习技术的文本应用实验的流行数据集,例如文本分类和文本聚类。

scikit-learn 提供了预处理数据集的工具,更多详情请参考此处的。下面给出的每个新闻组的文章数量大致相同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从一些组中删除一些新闻文章,以使整个数据集不平衡,如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,我们有 20 个类的不平衡数据集可以做进一步的分析了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

建立模型

由于这是一个分类问题,我们将使用我之前的文章中描述的相似方法进行情感分析。唯一的区别是这里我们处理的是多类分类问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型中最后一层是 *Dense(num_labels, activation =’softmax')* ,用 *num_labels=20* 类,用‘soft max’代替‘sigmoid’。模型中的另一个变化是将损失函数改为适用于多类问题的 *loss = ‘categorical_crossentropy’,*

列车型号

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 20%验证集validation_split=20训练模型,并使用verbose=2,,我们可以看到每个时期后的验证准确性。仅仅在 10 个时期之后,我们就达到了 90%的验证准确度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评估模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这看起来是一个非常好的精确度,但是这个模型真的做得很好吗?

**如何衡量模型表现?**让我们考虑一下,我们在水果的早期示例的不平衡数据上训练我们的模型,由于数据严重偏向 1 类(橙子),模型过度拟合 1 类标签,并在大多数情况下预测它,我们实现了 80%的准确度,乍一看似乎非常好,但仔细观察,它可能永远无法正确分类苹果或梨。现在的问题是,在这种情况下,如果准确性不是选择的正确指标,那么使用什么指标来衡量模型的性能呢?

混淆矩阵

对于不平衡的类,很容易获得高精度,而实际上没有做出有用的预测。所以,精度作为一个评价指标只有在类标签均匀分布的情况下才有意义。在不平衡类别的情况下,混淆矩阵是总结分类算法性能的好技术。

混淆矩阵是分类算法的性能度量,其中输出可以是两个或多个类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

x-axis=Predicted label, y-axis, True label

当我们仔细观察混淆矩阵时,我们会发现,与样本数量较多的类别[rec . sport . hockey、rec.motorcycles ]相比,样本数量较少的类别[alt . athiesm、talk.politics.misc、soc.religion.christian ]的得分[0.42、0.56、0.65]确实很低。因此,查看混淆矩阵,可以清楚地看到模型如何对各种类别进行分类。

如何提高性能?

有各种各样的技术可以提高不平衡数据集的性能。

重采样数据集

要使我们的数据集平衡,有两种方法:

  1. **欠采样:**从过度表示的类中移除样本;如果您有大量数据集,请使用此选项
  2. **过采样:**从代表性不足的类别中添加更多样本;如果数据集很小,请使用此选项

合成少数过采样技术

SMOTE 是一种过采样方法。它创造了少数民族的合成样本。我们使用imb learnpython 包对少数类进行过采样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在应用 SMOTE 之前有 4197 个样本,在应用 SMOTE 之后有 4646 个样本,看起来 SMOTE 增加了少数类的样本。我们将使用新数据集检查模型的性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

验证准确性从 90%提高到 94%。让我们测试一下这个模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试准确率比以前提高很少(从 87%提高到 88%)。现在让我们来看看混淆矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们看到[ alt.athiesmtalk.politics.miscsci.electronicsSOC . religion . Christian]这几门课比之前提高了分数【0.76,0.58,0.75,0.72】。因此,在对类别进行分类时,即使精确度相似,该模型的性能也比以前更好。

另一招:

既然阶层不均衡,那给少数阶层提供一些偏向怎么样?在训练模型时,我们可以通过使用compute_class_weight和使用参数‘class_weight’来估计 scikit_learn 中的类权重。这有助于在训练模型时提供对少数类的一些偏向,从而有助于在对各种类进行分类时提高模型的性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

精确召回曲线

当类别非常不平衡时,精确召回是预测成功的有用度量。精度是对分类模型仅识别相关数据点的能力的度量,回忆 i s 是对模型在数据集内找到所有相关案例的能力的度量。

精确度-召回率曲线显示了不同阈值的精确度和召回率之间的折衷。曲线下的高区域表示高召回率和高精度,其中高精度与低假阳性率相关,高召回率与低假阴性率相关。

精度 召回 的高分表明分类器正在返回准确的结果(精度),以及返回所有肯定结果(召回)的大部分。一个高精度、高召回率的理想系统会返回很多结果,所有结果都标注正确。

下面是使用 scikit-learn20 个新闻组数据集的精确召回图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Precision-Recall Curve

我们希望每一类的 P-R 曲线面积接近 1。除了 0 级、3 级和 18 级,其余级别的面积都在 0.75 以上。您可以尝试使用不同的分类模型和超参数调整技术来进一步改善结果。

结论

我们讨论了与不平衡数据集中的多类分类相关的问题。我们还展示了使用正确的工具和技术如何帮助我们开发更好的分类模型。

感谢阅读。代码可以在 Github 上找到。

参考文献

* [## 应对机器学习数据集中不平衡类别的 8 种策略

你遇到过这种情况吗?您正在处理数据集。您创建了一个分类模型,并获得了 90%的准确率…

machinelearningmastery.com](https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/) [## 如何处理机器学习中的不平衡分类问题?

如果你在机器学习和数据科学上花了一些时间,你肯定会遇到…

www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/) [## 利用不平衡数据集提高机器学习模型性能的三种技术

这个项目是我最近“机器学习工程师”职位面试技能测试的一部分。我不得不…

towardsdatascience.com](/working-with-highly-imbalanced-datasets-in-machine-learning-projects-c70c5f2a7b16) [## 理解混淆矩阵

当我们得到数据,经过数据清洗,预处理和争论,我们做的第一步是把它提供给一个…

towardsdatascience.com](/understanding-confusion-matrix-a9ad42dcfd62) [## 使用 Keras 深度学习 Python 库 opencodez 进行简单的文本分类

深度学习无处不在。所有组织,无论大小,都试图利用技术,发明一些很酷的…

www.opencodez.com](https://www.opencodez.com/python/text-classification-using-keras.htm)*

机器学习,NLP:使用 scikit-learn,python 和 NLTK 的文本分类。

原文:https://towardsdatascience.com/machine-learning-nlp-text-classification-using-scikit-learn-python-and-nltk-c52b92a7c73a?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Text Classification

最新更新:
我已经把完整的代码(Python 和 Jupyter 笔记本)上传到 GitHub 上:https://github.com/javedsha/text-classification

文档/文本分类监督的机器学习(ML)中重要而典型的任务之一。为文档分配类别,文档可以是网页、图书馆书籍、媒体文章、图库等。有许多应用,例如垃圾邮件过滤、电子邮件路由、情感分析等。在这篇文章中,我想演示我们如何使用 python、scikit-learn 和一点 NLTK 来进行文本分类。

免责声明 : 我是机器学习新手,也是博客新手(第一次)。因此,如果有任何错误,请让我知道。感谢所有反馈。

让我们将分类问题分成以下步骤:

  1. 先决条件和设置环境。
  2. 在 jupyter 中加载数据集。
  3. 从文本文件中提取特征。
  4. 运行 ML 算法。
  5. 参数调整的网格搜索。
  6. 有用的提示和一点 NLTK。

步骤 1:先决条件和设置环境

遵循这个例子的先决条件是 python 版本 2.7.3 和 jupyter notebook。你可以安装anaconda它会为你得到一切。此外,还需要一点 python 和 ML 基础知识,包括文本分类。在我们的例子中,我们将使用 scikit-learn (python)库。

**第二步:**在 jupyter 中加载数据集。

本例中使用的数据集是著名的“20 新闻组”数据集。关于来自原网站的数据:

20 个新闻组数据集是大约 20,000 个新闻组文档的集合,平均分布在 20 个不同的新闻组中。据我所知,它最初是由 Ken Lang 收集的,可能是为了他的news weaver:Learning to filter net newspaper,尽管他没有明确提到这个收集。20 个新闻组集合已经成为机器学习技术的文本应用实验的流行数据集,例如文本分类和文本聚类。

这个数据集内置在 scikit 中,所以我们不需要显式下载它。

I .在 windows 中打开命令提示符,键入“jupyter notebook”。这将在浏览器中打开笔记本,并为您启动一个会话。

二。选择新建> Python 2。你可以给笔记本起个名字- 文本分类演示 1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三。加载数据集:(这可能需要几分钟,请耐心等待)

from sklearn.datasets import fetch_20newsgroups
twenty_train = fetch_20newsgroups(subset='train', shuffle=True)

注:以上,我们只是加载了 训练 数据。我们将在后面的例子中单独加载测试数据。

四。您可以通过以下命令检查目标名称(类别)和一些数据文件。

twenty_train.target_names #prints all the categories
print("\n".join(twenty_train.data[0].split("\n")[:3])) #prints first line of the first data file

第三步:从文本文件中提取特征。

文本文件实际上是一系列单词(有序的)。为了运行机器学习算法,我们需要将文本文件转换成数字特征向量。我们将以使用 袋字 模型为例。简而言之,我们将每个文本文件分割成单词(英文按空格分割),并计算每个单词在每个文档中出现的次数,最后给每个单词分配一个整数 id。我们字典中的每个唯一的单词都会对应一个特征(描述性特征)。

Scikit-learn 有一个高级组件,它将为用户“计数矢量器”创建特征矢量。更多关于它的这里

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
X_train_counts.shape

这里通过做’count _ vect . fit _ transform(twenty _ train . data)',我们正在学习词汇词典,它返回一个文档-术语矩阵。[n 个样本,n 个特征]。

仅仅统计每个文档的字数有一个问题:它会给较长的文档比较短的文档更多的权重。为了避免这种情况,我们可以在每个文档中使用频率(TF-Term frequency),即#count(word) / #Total words。

TF-IDF: 最后,我们甚至可以降低更常见单词的权重,如(the,is,an 等。)出现在所有文档中。这被称为 TF-IDF,即术语频率乘以逆文档频率。

我们可以使用下面一行代码实现这两个目标:

from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
X_train_tfidf.shape

最后一行将输出文档-术语矩阵的维度-> (11314,130107)。

步骤四。运行 ML 算法。

有各种算法可用于文本分类。我们就从最简单的一个’朴素贝叶斯 (NB)’ ( *不要觉得太幼稚!*😃)

您可以使用下面两行代码在 scikit 中轻松构建一个 NBclassifier:(注意——NB 有许多变体,但关于它们的讨论超出了范围)

from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target)

这将在我们提供的训练数据上训练 NB 分类器。

**构建管道:**我们可以编写更少的代码,通过如下方式构建管道来完成上述所有工作:

**>>> from** **sklearn.pipeline** **import** Pipeline
**>>>** text_clf = Pipeline([('vect', CountVectorizer()),
**... **                     ('tfidf', TfidfTransformer()),
**... **                     ('clf', MultinomialNB()),
**...** ])text_clf = text_clf.fit(twenty_train.data, twenty_train.target)

‘vect’、‘tfi df’和‘clf’这几个名字是随意取的,但以后会用到。

NB 分类器的性能:现在我们将在测试集上测试 NB 分类器的性能。

import numpy as np
twenty_test = fetch_20newsgroups(subset='test', shuffle=True)
predicted = text_clf.predict(twenty_test.data)
np.mean(predicted == twenty_test.target)

我们得到的准确率是 ~77.38% ,对于 start 和一个幼稚的分类器来说已经不错了。还有,恭喜你!!!您现在已经成功地编写了一个文本分类算法👍

支持向量机(SVM): 让我们尝试使用不同的算法 SVM,看看我们是否能获得更好的性能。更多关于它的在这里

>>> from sklearn.linear_model import SGDClassifier>>> text_clf_svm = Pipeline([('vect', CountVectorizer()),
...                      ('tfidf', TfidfTransformer()),
...                      ('clf-svm', SGDClassifier(loss='hinge', penalty='l2',
...                                            alpha=1e-3, n_iter=5, random_state=42)),
... ])>>> _ = text_clf_svm.fit(twenty_train.data, twenty_train.target)>>> predicted_svm = text_clf_svm.predict(twenty_test.data)
>>> np.mean(predicted_svm == twenty_test.target)

我们得到的准确率是 **~82.38%。**咦,好一点了👌

第五步。网格搜索

几乎所有的分类器都有各种参数,可以调整这些参数以获得最佳性能。Scikit 提供了一个非常有用的工具‘GridSearchCV’。

>>> from sklearn.model_selection import GridSearchCV
>>> parameters = {'vect__ngram_range': [(1, 1), (1, 2)],
...               'tfidf__use_idf': (True, False),
...               'clf__alpha': (1e-2, 1e-3),
... }

这里,我们创建了一个参数列表,我们希望对这些参数进行性能调优。所有参数名称都以分类器名称开始(记住我们给出的任意名称)。如 vect _ _ ngram _ range 在这里,我们告诉使用一元和二元,并选择一个是最佳的。

接下来,我们通过传递分类器、参数和 n_jobs=-1 来创建网格搜索的实例,n _ jobs =-1 告诉使用来自用户机器的多个内核。

gs_clf = GridSearchCV(text_clf, parameters, n_jobs=-1)
gs_clf = gs_clf.fit(twenty_train.data, twenty_train.target)

这可能需要几分钟的时间,具体取决于机器配置。

最后,要查看最佳平均分数和参数,请运行以下代码:

gs_clf.best_score_
gs_clf.best_params_

NB 分类器的准确率现在已经提高到 ~90.6% (不再那么幼稚了!😄)和对应的参数是{‘clf__alpha’: 0.01,’ tfidf__use_idf’: True,’ vect__ngram_range’: (1,2)}。

类似地,对于 SVM 分类器,我们使用下面的代码获得了提高的准确率 ~89.79%注意:您可以通过调整其他参数来进一步优化 SVM 分类器。这是留给你去探索更多。

>>> from sklearn.model_selection import GridSearchCV
>>> parameters_svm = {'vect__ngram_range': [(1, 1), (1, 2)],
...               'tfidf__use_idf': (True, False),
...               'clf-svm__alpha': (1e-2, 1e-3),
... }
gs_clf_svm = GridSearchCV(text_clf_svm, parameters_svm, n_jobs=-1)
gs_clf_svm = gs_clf_svm.fit(twenty_train.data, twenty_train.target)
gs_clf_svm.best_score_
gs_clf_svm.best_params_

**第六步:**有用的小技巧和一点 NLTK。

  1. 从数据中删除 停止字 : (the,then etc)。只有当停用词对潜在问题没有用时,才应该这样做。在大多数的文本分类问题中,这确实是没有用的。让我们看看删除停用词是否会提高准确性。按如下方式更新用于创建 CountVectorizer 对象的代码:
>>> from sklearn.pipeline import Pipeline
>>> text_clf = Pipeline([('vect', CountVectorizer(**stop_words='english**')),
...                      ('tfidf', TfidfTransformer()),
...                      ('clf', MultinomialNB()),
... ])

这是我们为 NB 分类器构建的管道。像以前一样运行剩余的步骤。这就把准确率从 77.38%提高到了 81.69% (那太好了)。你可以对 SVM 做同样的尝试,同时进行网格搜索。

  1. FitPrior=False:多项式 B 设置为 False 时,将使用统一的先验。这并没有多大帮助,但将准确率从 81.69%提高到了 82.14%(没有太大的提高)。试着看看这是否适用于你的数据集。

3。词干化:词干化是将词形变化(有时是派生的)的单词简化为词干、词根或词根形式的过程。例如,词干算法将单词“fishing”、“fished”和“fisher”简化为词根单词“fish”。

我们需要 NLTK,它可以从安装到这里。NLTK 附带了各种词干分析器(关于词干分析器如何工作的细节超出了本文的范围),它们可以帮助将单词简化为它们的根形式。再次使用这个,如果它对你问题有意义的话。

下面我用了雪球词干分析器,它对英语非常有效。

import nltk
nltk.download()from nltk.stem.snowball import SnowballStemmer
stemmer = SnowballStemmer("english", ignore_stopwords=True)class StemmedCountVectorizer(CountVectorizer):
    def build_analyzer(self):
        analyzer = super(StemmedCountVectorizer, self).build_analyzer()
        return lambda doc: ([stemmer.stem(w) for w in analyzer(doc)])stemmed_count_vect = StemmedCountVectorizer(stop_words='english')text_mnb_stemmed = Pipeline([('vect', stemmed_count_vect),
...                      ('tfidf', TfidfTransformer()),
...                      ('mnb', MultinomialNB(fit_prior=False)),
... ])text_mnb_stemmed = text_mnb_stemmed.fit(twenty_train.data, twenty_train.target)predicted_mnb_stemmed = text_mnb_stemmed.predict(twenty_test.data)np.mean(predicted_mnb_stemmed == twenty_test.target)

我们得到的词干准确率约为 81.67%。在我们使用 NB 分类器的情况下,边际改进。你也可以尝试 SVM 和其他算法。

**结论:**我们已经学习了 NLP 中的经典问题,文本分类。我们学习了一些重要的概念,如单词袋、TF-IDF 和两个重要的算法 NB 和 SVM。我们看到,对于我们的数据集,两种算法在优化时几乎相等。有时,如果我们有足够的数据集,算法的选择几乎不会有什么不同。我们还了解了如何执行网格搜索以进行性能调优,并使用了 NLTK 词干法。您可以在数据集上使用这些代码,看看哪些算法最适合您。

**更新:**如果有人尝试了不同的算法,请在评论区分享结果,对大家都会有用。

请让我知道是否有任何错误和反馈是受欢迎的✌️

推荐,评论,分享如果你喜欢这篇文章。

参考文献:

http://scikit-learn.org/(代码

【http://qwone.com/~jason/20Newsgroups/ (数据集)

人脑的机器学习

原文:https://towardsdatascience.com/machine-learning-of-human-brain-739ab0419612?source=collection_archive---------11-----------------------

最高层次的学习

问)为什么算法飞跃可以比硬件飞跃更好?

Ans) 随着小尺度(纳米及更小)的物理不确定性开始发挥作用(电子开始四处跳跃),硬件限制造成了难以解决的瓶颈。

在这一点上,想法(算法)可以用来释放可行硬件的全部潜力。

问)为什么这些改进对机器学习如此有益?

Ans) 机器学习(ML)程序可以轻松涉及:

  • 十亿次计算
  • 类似方程的百至百万次幂
  • 大多数计算是相互独立的(可以并行或分布式)

因此,即使是一个小的优化也能产生非常明显的效果,为您节省几个小时到几个月的时间!

问)为什么要参考大脑来进行优化?

Ans) 简而言之,如果没有下面提到的人类大脑的进化,我们可能会变成这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

记忆预测框架

问)什么是新大脑皮层?

Ans)新皮层 是大脑皮层最大的部分,是大脑的外层

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

问)为什么新大脑皮层很重要?

Ans)新皮层,也叫等皮层,是哺乳动物大脑中参与高级脑功能的部分,如感觉感知认知产生运动指令空间推理语言 ( 部分)。

额外:新皮层进一步细分为真皮层前皮层。更多关于大脑皮层工作的信息可以在这里,这里这里这里 ( 好奇心可能会让你打开链接)。

问)新大脑皮层与机器学习有什么关系?

Ans)分层时间记忆 ( HTM )是基于人脑新皮层中锥体 神经元 相互作用。****

HTM 的核心:

  • 能够存储、学习、推断和回忆高阶序列的学习算法
  • 连续学习未标记数据中基于时间的模式
  • 对噪声的鲁棒性和高容量,意味着它可以同时学习多个模式

当应用于计算机时, HTM 非常适合于预测、异常检测、分类以及最终的感觉运动应用。

由于在一些自然发生的神经网络中观察到的层级,例如在大脑中观察到的,HTM 具有层级拓扑。

人类的记忆层次真的非常非常复杂!

示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

或者以简化的形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随着层级的上升,代表也增加了:

  • 范围:例如更大面积的视野,或者更广泛的触觉区域。
  • 时间稳定性:较低层次的实体变化很快,而较高层次的感知(心理概念)往往更稳定。
  • 抽象:通过连续提取不变特征的过程,越来越抽象的实体被识别。
  • 资源密集度更低:需要更少的资源,尤其是内存。

人脑的算法效率几乎高到石化!

哲学的宝藏,内省

问:什么是内省?

Asn)内省元认知,是关于一个人思维的自我意识或‘思考思维的能力’。一个高层次的心智过程(非常高)。

准确的内省能够区分正确的决定和错误的决定。

基本上,一个学习者正在发展一种意识。在培训期间,能够自我拒绝或鼓励模式。 因此,成为一个自我优化的学习者,是普通学习的必要条件。

示例:

双稳态刺激(双目视觉中的两张图片,每只眼睛一张)是研究有意识视觉感知的神经机制的最流行的方法之一。

这种刺激包含相互矛盾的信息,视觉系统无法将其整合成一个统一的感知。

这导致观察者的感知(解释能力)状态每隔几秒钟就发生变化,试图找出正确的解释。所有这些都是在物理刺激保持不变的情况下发生的。

在这种情况下,大脑的额叶作出自我意识(内省)的决定,拒绝任何信息或修改每个信息以消除冲突。

这方面的细节可以在 Natalia Zaretskaya 和 Marine Narinyan 的论文中找到

问:什么是灰质?

Ans) 中枢神经系统内部被组织成灰质和白质

灰质由嵌入 神经胶质 (由大量神经细胞组成的神经组织);它是灰色的。

问)为什么灰质很重要?

对人类来说,灰质体积可能有助于阐明一个人对其自省能力的信心在多大程度上得到了支持。他的自省能力有多准确。

更多的灰质通常意味着更多的智力。

正如爱因斯坦曾经说过的“灰质婊子!”……不,他实际上没有。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

问)那我们为什么不直接实现灰质的工作呢?

仅仅是因为灰质的工作非常非常复杂。我们不知道“的信心”和“自我反省能力的准确性”之间的确切关系。

那么我们知道些什么呢?

自省(经过数百万年的进化)仍然是一种罕见的能力,即使对于复杂的生物来说也是如此,大多数生物完全缺乏这种能力。这是进化的最新发展之一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

问)大脑的哪一部分负责内省?

Ans) 大脑中的前额皮质

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

前额叶皮层 ( PFC )是覆盖额叶前部的大脑皮层。

该区域的两个部分非常有趣:

  • 前额叶前皮质
  • 内侧前额叶皮质

问)前额叶前皮层有什么特别之处?

前前额叶皮层与顶级处理能力有关,这种能力被认为是人类区别于其他动物的标志。

大部分起内省作用的灰质存在于这个区域(准确的说是右前前额叶皮层)。邻近白质的结构在自省能力中也扮演了一些(不清楚的)角色。

这个大脑区域与计划复杂的认知行为个性表达决策调节社会行为有关。这个大脑区域的基本活动被认为是根据内部目标协调思想和行动。

问)这对机器学习来说意味着什么?

我会简短地回答这个问题

  • 知道自己的决定的学习者
  • 学习适应它的环境
  • 能够随时设定目标的学习者
  • 能够用几种模式概括大量信息的学习者

问)而内侧前额叶皮层有什么特别之处?

Ans)内侧前额叶皮层 (mPFC) 被认为是大脑的奖赏系统的一部分。

mPFC 是中皮质边缘多巴胺能系统的一部分( 基本上它产生多巴胺,即‘快乐酶’)。

mPFC 参与奖励相关机制的证据主要来自三类研究:

  • 条件位置偏好(CPP) :测量物体或经历的动机效果
  • 颅内自我刺激(ICSS) :什么条件触发大脑奖赏系统
  • 自我给药:大脑需要哪种外部药物(如治疗糖尿病的胰岛素)

这个奖励系统的有趣之处在于:

  • mPFC 的不同分区似乎不同地参与了不同药物的“奖励作用”。这表明多重奖励系统的存在。
  • *有些药物可以在 mPFC 内直接产生奖赏效应,而有些药物即使在 mPFC 内没有直接的奖赏效应,也依赖 mPFC 的功能来介导其奖赏效应。*可以表示为多级奖励流程

从机器学习的角度来看,这意味着什么?

Ans) 更简短的回答:

  • 整体强化学习

问:什么是强化学习?

Ans) 一种机器学习的类型,涉及:

  • 无监督(基于奖励的试错)
  • 好与坏是在几步之后决定的,而不是瞬间决定的
  • 动态系统所以时间很重要,步骤顺序也很重要
  • 代理采取行动并改变/影响其环境
  • 对于每一个行动,代理人都会得到一个奖励而它的工作就是最大化它

它是这样工作的:

问)迷茫?

Ans)*’*奖励是能够让一个决定优先于其他决定的东西。

这是一个标量反馈,量化代理如何适应环境/与环境互动。

就像你给你的狗零食,如果它先坐下,否则就不给它零食(为什么你不坐下?!).

强化学习者只是简单地遵循最大化累积回报的步骤。

多重奖励系统本质上意味着大脑内置了多重 优评 强化学习机制。

简而言之,演员-评论家学习包括演员采取行动评论家在该行动中发现利弊(批评)。

问)奖励系统的作用听起来很像自省??

嗯,那是因为奖励系统确实在一个人的自省能力中扮演了重要的角色。然而,这种关系真的很复杂。

“强化学习是简单的决策科学。这就是它如此普遍的原因。”—大卫·西尔弗

所以前额叶是普通智力领域的前沿!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用于数据分析的机器学习平台

原文:https://towardsdatascience.com/machine-learning-platform-for-data-analysis-b7603dc3049?source=collection_archive---------3-----------------------

Akvelon 的机器学习项目

问题陈述

如今,快速发展的机器学习技术让我们能够解决越来越多的现实生活问题。在这种情况下,可以通过创建一个系统来减少例行操作,该系统允许算法开发人员专注于他们的任务,而不是提供执行环境。我们创建了这样一个平台,并在一个最有趣的问题——市场价值预测上进行测试。为了让事情变得更有趣,我们使用比特币价格变化作为数据源。

如果你在 2012 年 12 月购买了一枚比特币作为圣诞礼物,那么你的 13 美元今天将价值 8000 美元左右。

你可以从世界各地的人们那里听到许多类似的故事。没有人确切知道比特币或任何其他加密货币在未来一小时、一天、一周、一月等的价格会是多少。,但有可能根据新闻进行预测。

新闻通常是市场的驱动力,它们的缺乏或低水平的重要性可能导致市场可以简单地静止不动。

这篇文章旨在展示如何使用大数据技术建立一个机器学习平台,该平台可以帮助根据来自世界各地的新闻预测特定市场的价值。

数据源

为了使我们能够进行任何分析,我们必须获得这项任务所需的数据集。我们至少需要两个数据源:一个是比特币的市场价值,另一个是与比特币相关的大众媒体提及的信息。

寻找比特币市场价值的数据源是一件相对简单的事情。周围有各种各样的选择,我们只需要选择其中之一。我们的选择在这里并不重要,所以我们不要太关注这个。我们使用了 雅虎财经 ,因为它是免费的,可靠的,并且有多个程序库可以使用。

处理来自大众媒体的信息要复杂得多。为了获得客观的信息,我们应该从各种渠道收集信息。在把这样的新闻来源罗列出来之后,我们肯定会面临一系列的困难,比如不同的语言,数据源的稳定性,信息的存储。但事实上,与主要挑战相比,所有这些问题都不是什么大问题——通过一组参数估计新闻效果。这个挑战是计算机科学和人工智能的一部分,称为自然语言处理。如今,它是一个快速发展的领域,重点是机器学习。

幸运的是, GDELT 项目 可以帮助我们获得新闻数据来源。GDELT 是一个事件、语言和语调的全球数据库;由谷歌拼图支持。引用自官方网站:“GDELT 项目以 100 多种语言监测来自每个国家几乎每个角落的广播、印刷和网络新闻,并识别每天每一秒推动我们全球社会的人、地点、组织、主题、来源、情感、计数、引用、图像和事件”。这正是我们正在寻找的。现在我们已经有了开始工作所需的一切。

解决方案设计

使用上面列出的数据源,我们可以讨论我们的解决方案设计。首先,让我们创建一个我们希望在解决方案中看到的功能列表,并解释我们如何支持这些功能:

  1. **易于运行的算法执行。**在寻找最佳算法的过程中,开发人员应该能够通过多次迭代轻松访问数据、源代码和以前的尝试,而无需关心除算法本身之外的任何事情。这由应用程序模板支持,该模板封装了数据访问和执行的所有逻辑。叫做 ml-template
  2. **有效数据处理。**为了高效地处理大量数据,我们将使用 Apache Spark,它通过 Spark ML 提供了强大的机器学习算法实现工具。
  3. 添加新数据源的能力 可以通过单独的微服务进行数据管理来实现。数据服务将负责下载带有相关股市数据(雅虎财经)的新闻(GDELT 数据)并保存到数据库中。
  4. 使用不同编程语言进行算法开发 的能力由 Executor Service 提供——一种用于下载和编译算法源、模型训练、在 Spark 集群上运行算法的微服务。它不依赖于特定的技术,可以运行任何可以从命令行执行的东西。
  5. 结果比较。**还有另一个名为结果评估服务的微服务,用于接收来自 ml 模板的结果,并为每个算法执行结果计算分数。
  6. 执行管理的网络界面。 用户界面将使用 WebSocket 与我们的微服务进行通信。

点睛之笔——这个项目选择了名称 Midas 。神话中的迈达斯国王把东西变成了金子,我们的系统就是为了把数据变成“金子”而设计的。

解决方案的基础设施

为了获得完整且可用的产品,我们应该确定要使用的基础设施。由于我们需要在解决方案中使用多个节点(微服务、数据存储、Spark 节点),因此合理的做法是为每个节点使用映像,而不是真实或虚拟机。

作为容器管理平台,我们将使用牧场主。这个平台包括RancherOS——专门为容器管理准备的简化 Linux 发行版。出于容器编排的目的,它默认使用,但也允许使用其他工具,如 Docker Swarm 或 Kubernetes。

对于 Apache Spark 集群管理,我们将使用 Apache Mesos 。这是一个强大的资源共享工具,专为 Spark 等基于集群的程序解决方案而设计。你可以在加州大学的这篇文章中了解更多关于我们选择的福利的信息。

此外,我们将需要一些日志处理的程序解决方案。为此,管道将由 3 个工具组成:fluent 和用于日志收集;弹性搜索用于存储和搜索;基巴纳用于可视化。

我们基础架构的最后一个组件是持续交付工具。为此,我们使用了最流行的工具之一——詹金斯。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Infrastructure diagram

工作流程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Workflow diagram

标准工作流程如上图所示。图表上的数字具有以下含义:

  1. 用户访问前端(web 应用程序,又名 Midas Eyes )以获取关于现有模型和先前执行的信息。此外,用户可以创建和训练新模型,或者通过 UI 应用现有模型作为新的输入数据。
  2. 前端通过 WebSocket 从 Executor 服务请求有关执行和模型的信息。
  3. 模型和执行的元数据存储在 PostgreSQL 数据库中。
  4. 前端通过 WebSocket 向结果评估服务请求结果及其评估。
  5. 结果和估计值存储在 PostgreSQL 数据库中。
  6. 当“train”执行开始时,Executor 服务从 GitLab 下载源代码。对于“应用”执行,它们已经被存储并可以立即运行。然后,Executor 服务使用某种算法运行开发人员扩展的 ml 模板。
  7. 在 Spark 集群上启动一个作业之前,ml-template 通过 REST API 检查数据服务中是否存在用户指定的输入数据。
  8. 如果执行所需的数据丢失,数据服务将从外部资源下载数据——在我们的例子中,是 GDELT 和 Yahoo。
  9. 数据服务将下载的数据存储在 Mongo 数据库中。
  10. 当数据准备好时,ml-template 将任务提交给 Spark 集群。
  11. 在执行过程中,Spark 从 Mongo 数据库中请求必要的数据。
  12. 当执行完成时,结果被提交给结果评估服务。该服务进行必要的评估,包括与地面实况的比较(火花术语的“标签”)。

另外,关于微服务的技术堆栈说几句话。数据、执行和结果评估服务由 Java、Spring Boot、Hibernate 和 Gradle 提供支持。ml-template 是使用 Scala 编写的,但也可以在 Python、R 或 Java 上创建。前端基于 React.js 和 Bootstrap。

算法应用示例

作为热身,让我们试试线性回归算法。我们最初的假设是,从新闻的平均基调来看,比特币价格和衍生品之间的相关性。平均语气是事件被提及次数的衡量标准。它的范围在-100 到+100 之间,其中 0 是中间值。这个参数是一个很大的值数组,通常大约有几千个数字。但是根据数量和正/负值的分布,它可以变成几个权重。经过简单的计算,我们得到平均色调和总量。

关于新闻和市场数据之间的线性相关性的假设非常天真,但这是一个很好的起点。使用它,我们可以检查一切都按计划进行。正如所料,在这一点上的结果并不令人鼓舞,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这只是许多尝试中的一个,没有一个能产生好于数百美元的平均偏差。更相关的算法,如梯度推进树回归,也显示出不可靠的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着我们需要使用诸如交叉验证之类的技术来改进当前的算法,或者尝试新的算法。例如,将深度学习(尤其是深度神经网络)与 Apache Spark 结合使用是一种有趣的方法。此外,我们可能需要更改我们的输入参数集。这样,我们就有了广泛的可能改进方向。

结论

我们在这个项目上的工作仍在进行中。开发人员正在开发他们的算法版本,试图获得更好的结果。在开发这个系统的过程中,许多想法出现在我们的脑海中,我们也在努力让它们活跃起来。

货币预测不是唯一可能的应用领域。例如,让它在市场股票上工作也很容易。这类股票有更多的新闻参数可以操作,因为它们与特定的国家或公司相关,并取决于与这些国家和公司相关的事件。

我们在这个项目中使用的技术都是开源的。在本文中,我们向您展示了如何轻松构建复杂的机器学习解决方案,而不是使用市场上现有的解决方案。我们希望我们的经验能激励你去做自己感兴趣的项目。

关于我们

我们在Akvelon Inc .爱等前沿技术,如区块链、大数据、机器学习、人工智能、计算机视觉等等。这是我们在 Office 战略实验室开发的众多项目之一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Akvelon company official logo

如果你有兴趣为一个项目做贡献,或者有一个有趣的想法——联系我们 。或者如果你想和我们强大的 Akvelon 团队**——请 查看我们的空缺职位 。**

阿图尔 合著

面向现代商业领袖的机器学习驱动的流失分析

原文:https://towardsdatascience.com/machine-learning-powered-churn-analysis-for-modern-day-business-leaders-ad2177e1cb0d?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Original image from www.desktopbackground.org. Recolored and rebranded by the author. For images, unless the source is specifically mentioned, are created by the author: All copyright reserved. Please attribute during sharing.

阿奴勒哈维尔马 合著。Anulekha 和我是在一次聚会上认识的。她是这里包含的示例实现的贡献者。

简介

最近,在帕洛阿尔托的一次创始人聚会上,我遇到了一家成功的 SaaS 公司的首席执行官,他正在开发客户参与工具。当我们在讨论机器学习在 SaaS 企业中的应用时,话题很快转向了(客户)流失管理。消费者市场和企业部门的所有业务都必须处理客户流失问题,因为它可能最终会影响公司的收入数字,从而影响政策决策。

根据*《在混乱的边缘领先》*的作者,客户保持率增加 2%(或流失率降低)相当于成本降低 10%。难怪 SaaS 的公司(以及关心客户的公司)非常重视客户流失分析。此外,根据白宫消费者事务办公室的调查,获得一个新客户的成本是留住一个老客户的 6-7 倍。

这家公司的首席执行官一直在使用基于简单统计模型的传统追溯流失管理。他的团队已经列出了高消费倾向的顾客,并通过特殊的礼宾服务来满足他们的需求。这在应用程序的工作流程中引入了新的步骤,并影响了所有部门的整体生产力,尤其是涉及 UX 设计、A/B 测试和市场信息的团队。业务团队意识到,这种对流失客户的特殊处理不是一个可持续的过程,他们需要一个全面的流失管理策略,该策略考虑到风险(和相关的风险容忍度)、针对不同客户群的保留干预的水平和成本,更加系统和持续。

“竞争优势只有两种来源,比竞争对手更快地了解我们的客户的能力,以及比竞争对手更快地将这种了解转化为行动的能力”

——通用电气前董事长兼首席执行官杰克·韦尔奇

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**客户流失率指的是一家公司的客户流失率,或者更简单地说,客户离开你的公司或服务的速度。**客户流失的例子包括

  • 订阅的取消
  • 关闭账户
  • 不续签合同或服务协议
  • 在另一家商店购物的决定
  • 使用其他服务提供商

许多不同的原因都可能导致客户流失,客户流失分析有助于确定客户流失的原因(和时机),为实施有效的客户保留策略创造机会。这里有 6 个经过时间考验的步骤,确保你专注于留住你的客户——在本文中,我们将只关注第 2 步和第 3 步的部分内容。此时,请记住,这并不是要将客户流失归咎于产品或客户成功团队,而是要制定一个策略来提高客户保持率。

  1. 收集可用的客户行为、交易、人口统计数据和使用模式
  2. 利用这些数据点来预测可能流失的客户群
  3. 创建一个模型,根据客户流失概率来确定业务的风险承受能力。
  4. 设计一个干预模型,考虑干预水平如何影响流失率和客户终身价值(CLV)
  5. 在多个客户群中实施有效的实验,以减少客户流失并提高客户保留率。
  6. 冲洗并重复第 1 步*(认知流失管理是一个持续的过程,不是一年一次的练习)*。

我们还认为,风险分析-决策-市场细分的方法是一个足够通用的结构,可以用于许多业务问题,而不仅仅是流失分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等等,这到底是什么?

预测性流失模型是一种简单明了的分类工具:查看过去的用户活动,并检查特定时间后谁是活跃的,然后创建一个模型,从概率上确定客户(或细分市场)离开你的服务或产品的步骤和阶段。

拥有一个预测性的客户流失模型,可以让你在留住客户的过程中获得认知和可量化的指标。这让你有能力了解离开的顾客的习惯,并在他们做出决定之前介入。如果没有这个工具,您将根据广泛的假设行事,而不是根据反映客户真实行为的数据驱动模型行事。

如果没有对客户及其行为的深入了解,就很难留住他们,因此创建该模型的第一步是从客户数据点了解您的客户行为。让我们看看我们需要什么样的数据来评估导致他们最终离开你公司的诱因。

客户信息

  • 邮政区码
  • 收入阶层
  • 性别
  • 职业
  • 他们家里有孩子吗?
  • 他们如何找到你的网站/产品?
  • 他们会打开你的简讯和其他触发邮件或者点击任何链接吗?

产品

  • 产品类型
  • 各种产品
  • 优惠券用法
  • 产品偏好或组合

购买历史

  • 购买频率
  • 上次购买日期
  • 购买的时间/季节
  • 采购价值
  • 支付方式
  • 余额/商店信用

客户互动

  • 服务问题
  • 商店访问/在线
  • 投诉解决方案
  • 投诉优先级
  • 他们如何抱怨——电子邮件、电话还是推特?
  • 投诉频率

**这些只是一些样本领域开始,我们更喜欢。重要的是尽可能多地了解我们的客户,了解是什么事件导致他们离开并寻找下一个竞争对手。**您收集的相关数据越多,您的模型就越精确。如果你使用机器学习支持的客户流失模型,你可以使用比人类可能计算和处理的更多的变量。一旦你在一个地方有了这些不同但相关的客户数据,以便于操作和查询,你就会看到趋势浮现在你的眼前,这将使你对客户流失有所了解。所有被搅动的客户的综合数据也将帮助你对行为进行分组并建立模式。

数据准备

一旦你为你的分析收集了足够的数据,下一步就是数据准备。这是数据分析中最耗时但最重要的一步。就像那句著名的格言所说的那样- “垃圾进来,垃圾出去”。你的分析将和它所基于的数据一样好。

您可以使用这三个标准来确保高质量的数据:

  • 完成
  • 干净的
  • 精确的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

完成- 你是否有所有相关的尺寸?有多少百分比的数据缺少值或为空?您可以通过数据探索来填充一些缺失的值,例如,基于客户地址的“州”值;基于产品项目等的“产品类别”。

清除- 同一个维度是否有多个值?例如 CA/Calif/California;医疗保健/医院/提供商;产品名称等的不同缩写。如果是的话,你可以做一些数据清洗来保证一致性。

准确- 某些交易是否存在负收入值或 0 美元收入?;日期冲突;“无”或“不适用”值等。在与风险承担者讨论之后,您可以决定是否在分析中包含或排除这些不良数据。

在预测+诊断分析中,在数据准备中还涉及一个步骤——创建目标变量。在流失分析的情况下,它可以是一个二元列,如*“会流失吗?”*。您可以通过分析历史数据来填写此变量的值。例如,对于取消订阅的客户,值为 1/TRUE,对于续订的客户,值为 0/FALSE。

探索性分析

文末示例实现为技术上倾斜

与传统的统计建模不同,基于机器学习的预测模型是由计算机算法生成的,而不是由统计学家基于他们对线性回归和相关技术的结果的解释来生成的。构建客户流失模型的一个关键技能是能够提出尽可能多的问题。通过这种方式,您可以在实现模型之前测试、重新测试和验证您的假设和数据。以下是一些基本的入门问题。

1。可用数据点与流失之间的相关程度如何?

从这个问题中,可能会找到这样的答案:“在上个季度离开的所有客户中,80%的人在周末提出了投诉”,或者“在上两个季度离开的所有客户中,56%的人从未使用过我们软件中的报告工具”。您的目标是使用这个探索性问题来揭示特定数据点与流失之间的一种或多种关联模式。与此同时,也向当前客户提出同样的问题,看看你的总体假设是否成立,或者它们只是散点图上的随机点:如果你的假设是真实的,那么你已经发现了一个需要关注的趋势,如果不是,继续问更多的问题。

使用机器学习模型还可以向您展示一些人类分析师通常看不到的相关性。

2。他们离开了产品生命周期的哪个阶段?**

这些顾客是什么时候离开的?在第一次试用结束时,当订阅过期时,或者某些功能太难使用,或者它是一个外部事件?他们离开前用了我们的软件多久?他们是不是打电话给客服,不满意就走了?对于没有离开并续订订阅的客户来说,有哪些关键趋势?

继续探索每一个数据点及其比率——机器学习模型通常比人类做得好得多,并发现意想不到的模式。

3。不同客户群对终身价值(LTV)有什么影响?

一个好的模型的结果是找到等同于提高或增加保留率和降低流失率的触发因素和行为。您的每个属性都可以映射到提升或下降商。例如,如果特定细分市场中的每个客户都有 100 美元的 LTV,而您的模型显示其中有 X 人正在离开,那么您可以轻松地突出这种流失对顶线的负面影响,帮助业务领导量化并优先考虑保留策略。

接下来会发生什么…

我们希望您将探索得筋疲力尽,并发现一些有趣的客户流失模式。您可能还发现了一两个高度相关的数据点,或者可能是一个较大的存储桶,其差异不如您预期的那样大。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你找不到至少三个高度相关的属性,你就没有对你的数据提出正确的问题,或者也许你一开始就没有正确的数据集。

一旦您确定了导致客户流失的客户群及其行为,您就可以为您的团队提出提高客户保留率的建议。设计、实现和推断智能实验的结果是另一篇文章的主题,但这里有一些快速的想法。

对于一家正在经历低收入人群流失的电信公司来说,他们使用的短信比实际电话更多,这可能是为了建立一个针对该细分市场的利基“计划”,以防止用户转向下一个提供商。

对于一个在线项目管理工具服务来说,在试用期内客户会迅速减少,可以在新客户入职时提供明确的培训课程,使试用期更有吸引力。

示例实现(Kaggle 电信数据集)

为了本文的简单起见,我们将假设数据已经准备好输入预测引擎,并从简单的线性回归模型或逻辑回归模型开始做一些探索性分析。线性回归模型有助于找出哪组独立维度/预测因子擅长预测目标变量。此外,挑选出具有特别强影响力的变量。

这里有一个基于电信 Kaggle 数据集的简单线性回归模型:

lm(Churn ~ International _ Plan+Voice _ Mail _ Plan+Total _ Day _ Charge+Total _ Eve _ Charge+Total _ Night _ Charge+Total _ Intl _ Calls+No _ CS _ Calls+Total _ Intl _ Charge,data = telecom)

客户流失是因变量。自变量后接“~”符号。“电信”是所用数据集的名称。你可以添加/删除自变量,这取决于它如何改变调整后的 R2 值——如果它增加了,它就是一个重要的预测指标;如果它降低了值,您可以将其排除。

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Output of Linear Regression model in R for the dataset analyzed

为了解释哪些属性有很强的影响,我们看一下末尾星号的数量。’ —非常显著;'-显著;”重要;'.'没那么重要

我们看到,对于电信业务,像*“客户服务呼叫数量”“国际计划优惠”【国际通话费率】*等在被检查数据集的客户流失中扮演着重要角色。从商业角度来看,这需要进一步调查客户服务信息分析和/或提供有竞争力的计划来保持客户忠诚度。

使用逻辑回归模型也会产生类似的结果:

glm(Churn ~ International _ Plan+Voice _ Mail _ Plan+Total _ Day _ Charge+Total _ Eve _ Charge+Total _ Night _ Charge+Total _ Intl _ Calls+No _ CS _ Calls+Total _ Intl _ Charge+,数据=电信,家庭=二项式)

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Output of Logistic Regression model in R for dataset analyzed

该模型将相同的预测因素视为对“流失”变量的强大影响。当我们使用混淆矩阵计算模型的准确性时,结果是 86.3%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Confusion Matrix in R

准确率=(真阴性+真阳性)/总记录数

0.8632=(2773+104)/3333

该模型现在已经准备好在测试数据上实现了。在逻辑回归的情况下,这是使用*预测()*函数完成的:

预测(telecomLog,type= "response ",newdata=telecomTest)

在哪里

“telecomLog”是逻辑回归模型。

“远程测试”是测试数据集。

“响应”告诉预测引擎根据概率产生输出,在我们的情况下这是有意义的,因为我们想知道哪些客户具有高流失概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Tableau visualization of insights derived from Logistic Regression Model implementation in R. The charts highlight a positive correlation between no. of customer service calls and churn probability as well as a stronger correlation influence of international plans and churn.

现在,我们已经完成了探索性分析,并了解了具有影响的变量,我们可以深入研究基于集合模型的方法。如今,数据科学家正在使用多模型或集成方法来解决预测分析中的复杂业务问题,如客户流失。在这种方法中,在同一数据集上使用两种或更多种算法,比较结果以获得更高的准确性并防止过度拟合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ensemble Modeling in Microsoft Azure Machine Learning

在这里,我们已经使用微软 Azure 机器学习在电信 Kaggle 数据集上使用两种算法预测流失:增强决策树和逻辑回归。

集成建模方法的更高精度降低了 误分类率总体错误率

错误分类率是指被识别为高风险客户的客户中有多少人实际上进行了而不是客户流失。通过避免向低风险客户发送特别促销/套餐,并专注于对高风险客户的干预,这可以为企业节省大量资金。下面是集合模型的精度比较:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The ROC curves of Boosted Decision Tree and Logistic Regression models

比较两个模型的 AUC(曲线下面积)值,我们看到两类提升决策树在识别错误分类方面比传统的逻辑回归模型表现得更好。增强决策树模型的错误分类率较低,为 5%,而逻辑回归模型的错误分类率为 16%。因此,通过集成方法,我们可以利用两种模型的优势——逻辑回归模型识别对目标变量有强烈影响的预测因素,而增强决策树更准确地识别高风险搅动者。

总之,预测复杂商业现象的整体方法是传统统计建模和整体建模等前瞻性方法的良好结合。

最后…

如果你真的想做出高质量的、风险可控的、以客户为中心的决策,而这些决策需要依赖于关于世界的结论,而不仅仅是可用的数据,那么你的团队中就需要决策科学家和工程师。客户流失管理对于任何业务都是必不可少的,基于机器学习的算法使其更加准确。如果你正在经营一家企业,但你对自己的流失分析没有信心,也许是时候联系一下决策科学专家 (这是对 电子邮件 美国)

机器学习:预测客户流失

原文:https://towardsdatascience.com/machine-learning-predicting-customer-churn-dd38a42774cf?source=collection_archive---------0-----------------------

这个模型的数据就是从这里得到的。这是一家身份不明的电信公司的客户数据。

用于预测流失的模型是 K 近邻。总体准确率为 90%。根据该模型预测会留下的 10 个客户中有 9 个最终留下,而根据该模型预测会流失的 10 个客户中有 9 个最终流失。

模型

KNN 是一个简单的算法。当出现新客户时,算法会在数据库中查找与目标客户最相似的客户。然后,它会根据那些相似的客户是否会流失来预测客户是否会流失。

其中包括一家电信公司的 976 名客户。其中 125 人被解雇,851 人留下。

为了制作模型,我将数据分成两部分。70%被放入训练集并用于创建模型。然后,该模型被用来预测另外 30%的人是否搅拌。

用于预测客户是否可获得的变量有:

  1. 状态
  2. 账户长度
  3. 电话地区号
  4. 电话
  5. 国际计划
  6. Vmail 计划
  7. 邮件信息
  8. 日分钟
  9. 日间通话
  10. 日间费用
  11. 前夕分钟前夕电话
  12. 前夕费用
  13. 夜晚分钟
  14. 夜间通话
  15. 夜间收费
  16. 国际分钟
  17. 国际呼叫
  18. 国际收费
  19. 客户服务器调用

KNN 只处理数字变量,所以对于这个模型,我将删除所有非数字变量。(有一些使用分类变量的技术,比如一键编码,但是我们在这里忽略它们)。

模特表现如何?结果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Accuracy = 89%

优化模型

89%的初始准确性是不错的,但是如果我们仔细选择 k 值和用于进行预测的变量,模型可以变得更准确。

我最初用的是三的 K。这意味着该模型将寻找三个最相似的客户,并使用它们来预测客户是否会流失。

如果 K 太小,模型会“过拟合”。这意味着该模型将在您用来创建它的数据上表现良好,但当它遇到新的观察结果时,它将表现不佳。如果 K 太高,模型的表现也会很差。K 的最佳值是通过选择一个不太高也不太低的值来选择的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The Accuracy is highest when k = 5

如上图所示,模型精度稳步增加,直到在 5 处达到峰值,然后开始下降。因此,k 的最佳值为 5。

使用 k = 5 后,模型性能提高到 90%

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

变量选择

并非所有变量都有助于预测客户是否会流失。例如,客户的电话号码在预测中完全没有用,因为它对每个客户都是唯一的。

一种被称为信息增益的技术被用来观察哪些变量在预测客户流失方面最重要。Information gains 单独查看每个变量,并询问“如果我们单独按该变量分割数据集,预测结果会容易多少”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这表明客户服务呼叫、呼叫分钟数和使用的信用是最能提供信息的变量。这是可以理解的,一个经常给客服打电话的客户可能对服务不满意,所以更有可能流失。而打很多电话的人可能对服务很满意,因此不太可能流失。所以这三个变量告诉我们很多关于客户流失的可能性。

概率阈值

KNN 给出了特定客户流失的概率。默认情况下,阈值通常设置为 0.5。这意味着任何概率超过 0.5 的人都有可能流失。如果你降低概率阈值,更多的人将被预测流失,这给你更多的“风险客户”的目标。然而,这增加了没有风险的客户通过门槛并被预测为流失的可能性。

概率阈值的选择将基于业务环境,如果公司想要以大量客户为目标,则将设置低阈值。然而,如果公司想更有效地支出,就要设定更高的门槛,以更少的顾客为目标。

业务影响。

有了这个模型,人们可以预测哪些客户有流失的风险。然后,公司可以采取措施留住这些客户,例如:

  1. 客户满意度调查可以发送给“风险客户”,以了解他们对公司的看法以及可能的投诉。
  2. 可以向有风险的客户提供折扣或其他激励措施,以试图留住他们。
  3. 保留营销:处于风险中的客户可以被特别添加到保留营销列表中,以便谷歌广告、脸书、Twitter 或电子邮件活动可以专门针对他们。
  4. 客户流失的可能性低,可以从重新定位名单中删除,这可以节省营销成本。

如果公司对其客户进行了细分,并了解具有最高终身价值的客户类型。那么最有价值的处于风险中的客户就可以用上述技术来专门锁定。

结论。

信息很多,但洞察力很少。一个收集数据并知道如何从这些数据中获得洞察力的公司可以更深入地了解客户。

公司的生死取决于他们的客户,真正以客户为中心意味着了解你的客户,并以独特的方式对待每一个客户,尤其是最有价值的客户。关于你的客户的大量可用数据。没有理由以一刀切的方式对待所有顾客。

如果你在经营一家新公司,你想更多地了解你的客户。了解你最有价值的客户的特征,找出你的风险客户,或者学习如何正确地收集和分析关于你的客户的数据。在 sayhello@techinnover.com 打电话给我,或者在这里拜访我们

P.p.s 模型是在 R 中构建的,如果你想要一个包含所有代码的脚本,你可以在 twitter 上 DM 我 德林·阿德巴约

机器学习快速参考卡

原文:https://towardsdatascience.com/machine-learning-quick-reference-card-cf92f6accd08?source=collection_archive---------4-----------------------

监督和非监督机器学习

在我最近的几篇帖子中,我讨论了一些我在工作中经常使用的算法。然而,最重要的问题是何时使用这些算法。做事没有唯一正确的方法。您可以尝试不同的算法,通过模型比较来看看哪种算法最适合您的情况。

然而,拥有一张快速参考卡有助于缩小选择范围和做出决定。这也意味着这张参考卡做了一些概括/简化,但它为你指明了正确的方向。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以在这里下载这张参考卡。

希望你喜欢这篇文章。敬请关注下一篇文章,了解更多机器学习基础知识。

快乐学习!

机器学习:岭回归详解

原文:https://towardsdatascience.com/machine-learning-ridge-regression-in-detail-76787a2f8e2d?source=collection_archive---------9-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为这里已经有足够多的关于线性回归的文章了,我就不再写了。相反,我将写一种标准化的回归类型——岭回归——它解决了数据过度拟合的问题。

岭回归的动机

线性回归模型由以下等式给出:

**Y = Σ WⱼHⱼ(Xᵢ)**Here, 
**Σ** runs from *j = 0* to *j = D* where D is the total number of features.
**Wⱼ** is the *jᵗʰ* coefficient 
**Hⱼ** is the *jᵗʰ* feature function which takes **Xᵢ** observation
**Xᵢ** is the *iᵗʰ* observation

假设我们知道 W 系数的值,上面的等式给出了预测值。为了简化,让我们用𝔽( X 来表示上面的方程,其中 x 是观测值。

线性回归模型的成本函数由以下等式给出:

Cost Function = **RSS(W) = Σ [Yᵢ — 𝔽(Xᵢ)]²**
Here,
**Σ** runs from *i=0* to *i = N* where *N* is the total number of observations.
**Yᵢ** is the known value of *iᵗʰ* observation.
**𝔽(Xᵢ)** gives the predicted value of *iᵗʰ* observation.RSS stands for Residual Sum of Squares

代价函数总是作用于训练数据集。

线性回归模型的整个思想围绕着最小化上述成本函数值。成本函数值越低,线性回归模型越好。

通常,为了降低成本函数,我们增加模型中的特征数量。随着我们不断增加模型中的特征,模型开始很好地拟合训练数据集,并且成本函数值开始降低。

但是,随着特征数量的增加;我们的方程变成了一个高阶多项式方程;这导致了数据的过度拟合。

为什么数据过度拟合不好? 在过度拟合的模型中,训练误差几乎为零,这意味着模型在训练数据集上运行良好。但是,除了像真实的外部世界数据那样的训练数据集之外,这个模型在其他数据集上也能很好地工作吗?
通常可以看出,过度拟合的模型在测试数据集上表现较差,并且还观察到过度拟合的模型在额外的新测试数据集上表现较差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Overfitted data & performing worse on test data set. Source

从上面的图表中,我们可以看到过拟合模型在训练数据集上表现良好,并且训练数据集的成本函数为零。

但是当我们用上图中的测试数据集测试这个模型时,模型的表现一点也不好。对于测试数据,模型预测错误值与实际正确值相差甚远。这足以说明这种型号不适合在工业上使用。

如何抓过拟合? 通过可视化模型(如上),可以很容易地看到模型中的过度拟合(观察模型如何很好地拟合训练数据集)。但是,随着我们的模型的复杂性增加,它进入了更高维度,这使得它很难在图表(或其他工具)上可视化。

除了总是试图可视化模型,我们还可以通过查看系数的值( W )来查看过拟合。通常当过拟合发生时,这些系数的值变得非常大。

岭回归用于通过测量系数的大小来量化数据的过度拟合。

要修复过度拟合的问题,我们需要平衡两件事:
1。函数/模型符合数据的程度。
2。系数的大小。

So,
Total Cost Function = Measure of fit of model + Measure of magnitude                    of coefficientHere,
Measure of fit of model = RSS(W)
Measure of magnitude of coefficient = ||W||²If Measure of fit of the model is a small value that means model is well fit to the data.
If Measure of magnitude of coefficient is a small value that means model is not overfit.**Total Cost Function = RSS(W) + λ*||W||²**We have added **λ** in total cost function as a tuning parameter to balance the fit of data and magnitude of coefficients.

计算岭回归的梯度下降

岭回归成本= RSS(W)+λ* | | W | | =(Y-WH)*(Y-WH)+WW

在矩阵符号中,它将被写成:
岭回归成本= (Y - HW)ᵗ (Y - HW) + WᵗW

取上述方程的梯度(微分):

Δ[RSS(W) + λ||W||]²
= Δ{(Y - HW)ᵗ(Y - HW)} + λ Δ{WᵗW}= -2Hᵗ(Y - HW)+2λW

设置上面的梯度为 0,我们得到

**W = (HᵗH + λI)-¹HᵗY**

因此,我们知道了 W 系数的值。

λ值怎么选?

给定的数据集分为三组:
1。训练装置
2。验证集
3。测试装置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Division of data into three different sets

训练集 该数据集将用于获取λ的每个值的 W 系数的值。让我们假设λ值的每个值的 W 系数的值为 W λ。

验证集 将在验证集上评估 W λ的不同值。具有较低误差值的那个将被选择。

测试集 测试数据集将再次评估 W 系数的选定值。

上述方法仅在存在足够数量的数据时使用。

这就是最终选择λ值的方法。这个过程有点暴力。但是利用聪明的猜测和经验,可以减少猜测λ值的迭代。

结论

我们已经看到为什么过拟合在机器学习中是不好的,以及如何通过查看模型的 W 系数的值在模型中识别它。然后,我们看到了线性回归的新成本函数,它考虑了带有调整参数λ的数据的过度拟合。

然后,我们看到了关于新成本函数的计算公式 W 以及如何选择λ的值。

简而言之,机器学习规则

原文:https://towardsdatascience.com/machine-learning-rules-in-a-nutshell-dfc3e6839163?source=collection_archive---------11-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

几天前,谷歌工程师发布了一本关于如何构建伟大的 ML 产品的巨大手册(顺便说一下,还有 great】的 tensor flowcoursera 的专业化)。这些人在生产中开发大规模项目方面有很多经验,他们已经写下了他们的最佳实践。唯一的问题是——这份文件实在庞大,所以我决定在这里总结一下要点。共有 43 条规则,大致按照发展阶段的顺序,分为 3 个阶段。我们开始吧。

0.不谈人工通用智能。ML 工程师可能会误解你,认为你有精神分裂症。开玩笑的。

第一阶段:第一条管道

  1. 毫不犹豫地推出没有 ML 的产品。如果一个简单的启发式或手工工作可以完成这项工作——把 ML 放在一边,直到你得到足够的数据。
  2. 添加指标。然后添加更多指标。跟踪一切,了解应用程序的各个部分是如何工作的。当您有问题或不确定时,添加一个指标。
  3. 不要在启发式上投入太多时间。一旦它变得复杂——切换到 ML 模型。以后开发和维护会更容易。
  4. 先关注基础设施。用一个简单的模型建立一个管道,并确保整个系统运行良好。
  5. **为你的每一个管道添加测试。**测试您的基础设施,测试您的数据,测试您的模型。
  6. 当您为新项目复制现有管道时,确保您没有丢弃潜在有用的数据
  7. 不要简单地抛弃你的启发法。它们可能会为您的 ML 模型生成有用的特性。
  8. 保持模型新鲜。跟踪模型的性能随着时间的推移下降了多少,并确保它不会在生产中变得糟糕。
  9. 在投产前跟踪你的模型的性能。尤其是当它是面向用户的模型时。
  10. 再次测试你的数据。确保所有特征都已收集,数据完好无损。
  11. 创建特征文档。它们从哪里来,为什么有用。
  12. 选择正确的目标。它必须反映你项目主要目标的表现。
  13. 选择正确的目标可能很难,所以选择一个易于衡量并且代表“真实”目标的指标。
  14. 简单的模型更容易调试。线性或逻辑回归可能是一个不错的选择。
  15. **将垃圾邮件过滤和质量排名分开。**此类模型通常以不同的方式使用。

阶段 2:特征工程

  1. **计划迭代。**您的功能和模型会随着时间的推移而发展,所以请确保您准备好更新它。
  2. **从直接观察到的特征开始。**并将学到的功能留给未来更新。
  3. 尝试跨环境通用的功能。像点赞数这样的指标可能在推荐、质量排名和其他模型中有用。
  4. 不要忘记添加非常具体的功能。即使没有很好地概括,它们仍然有价值。如果它们只适用于一小部分例子,正则化会把它们过滤掉。
  5. 以人类可理解的方式从现有功能中手工制作新功能。试着不要想太多。
  6. 在线性模型中可以学习的特征权重的数量大致与你拥有的数据量成正比。只有大约 1000 个例子——使用几十个特征。拥有超过 10 亿个功能,1000 万个就足够了。
  7. **从管道中移除不使用的特征。**如果你发现某个特性不能改善你的模型,那就去掉它。
  8. 不要让工程师做 UX 测试。通过众包平台,或者通过真实用户的现场实验来做。
  9. **追踪不同型号之间的差异。**在进一步测试一个新模型之前,计算一下它的输出与以前的有多大的不同。
  10. 关注你的模型的效用,而不是预测能力。一个新的模型可能有更高的准确性,但它在实践中有多有用更重要。
  11. 查看模型的错误,并创建新的特征来修复它们。尝试在错误中寻找模式,并添加各自的特征。
  12. 创建指标来跟踪这些错误。有了要优化的指标,优化就变得更容易了。
  13. 模型在长期中可能会有非常不同的行为。即使在短期内,它看起来完全符合你的预期。
  14. **实时收集数据,并在培训期间使用它来测试模型。**通过这种方式,您可以确保模型在部署后运行良好。
  15. 重要性-权重采样数据,不要随意丢弃。
  16. 不要忘记,在培训和服务期间,数据本身可能会发生变化。然而,有时你可以使用每小时/每天/每周的快照来处理它。
  17. 在培训和生产管道之间共享代码。尽可能多。
  18. 使用早期数据进行训练,使用后期数据进行测试。这将有助于您粗略估计您的模型在未来的表现。
  19. **在二分类任务中拿出一小部分例子,得到干净的训练数据。**向用户展示其中的 1%或 0.1%,以获得新的训练数据。
  20. **更严格地规范一般特征,在任务排名中只允许正权重。**不要让你的排名系统变得太偏。
  21. **避免带有位置特征的反馈循环。**训练时分开,发球时避开。
  22. 衡量您的模型在训练、验证、测试和实时数据方面的表现。跟踪它们之间的差异,并尝试进一步调整模型以减少差异。

阶段 3:细化和复杂模型

  1. 重新审视你的目标。确保它符合您的产品目标。
  2. **发布决策代表长期产品目标。**通常一个决策会影响多个指标,所以不要急于做出快速决策。
  3. **将你的基本款和套装款分开。**基本模型仅获取原始输入,集合仅获取基本模型的输出。
  4. **当你的性能停止增长时,寻找新的特性来源。**不要太长时间专注于现有的。
  5. 多样性、个性化和相关性非常重要。但没有受欢迎程度高。
  6. 在不同的产品中,你的朋友往往是一样的。你的兴趣不是。我们倾向于拥有相同的联系,但是我们的目标不同。

我认为在从事 ML 项目时有这些指导方针是很好的。因为如果你不会,你就很有可能陷入技术债。所以,别忘了把它们收藏起来,在工作中不时重温。

机器学习——一些骨骼

原文:https://towardsdatascience.com/machine-learning-some-bones-dc5987c81cd2?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

机器学习是一个松散的术语,它涵盖了许多活动。从软件工程的角度来看,它可以被看作是从模式识别发展而来的活动。它甚至可以更狭义地理解为给定输入值分配一个标签。一个被设计成从例子中学习的系统将包含一个分类器,该分类器将数据作为输入,并将一个标签分配给它作为输出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

X = np.array([[1,2],[5,8],[1.5,1.8],[8,8],[1,0.6],[9,11]])
y = [0,1,0,1,0,1]
clf = svm.SVC(kernel='linear', C = 1.0)
clf.fit(X,y)
**print**(clf.predict([0.58,0.76]))

以上是使用 SciKit-Learn 库用 python 编写的机器学习程序的源代码。其实没什么大不了的!下面是计算一个数的平方根的 python 函数。

math.sqrt( x )

像所有的工具集一样,SciKit-learn 为开发人员、程序员和数据分析师提供了多种功能的组合。它是一种综合性的机器学习技术,旨在进行数据挖掘和数据分析。它自己工作得很好。它与张量流等其他技术配合得很好。它在其他程序中运行良好。

作为开发人员,我们经常使用许多工具,上面显示的例子是 python 内置的数学函数。我们可以在不知道它是如何工作的情况下使用该工具进行数学运算。我举的计算一个数的平方根的例子比我们想象的要复杂,但我们经常认为这是理所当然的,这并不妨碍我们胜任地使用它。剥一只猫的皮有许多方法,计算机程序和计算器也有许多方法找到一个数的平方根

在开发软件时,了解您所使用的技术工具的基本框架确实会有所帮助。看到功能背后的内部结构,了解输入和输出之间的关系,了解正在发生的事情。我可以通过观察、代码片段、图表、公式和数学来理解这些复杂的东西。这篇文章虽然本质上是技术性的,却以轻浮的方式掠过了机器学习的表面。更全面的解释是存在的,我推荐三个:

神经网络黑客指南作者安德烈·卡帕西

大脑 vs 深度学习第一部分:计算复杂性——或者为什么奇点离很远

神经网络和深度学习作者迈克尔·尼尔森

为什么要使用机器学习?

有些事情计算机程序做得很好,但对人类来说很难。从简单的计算,如平方一个数字;

**static** **void** main(String[] args) {
      **int** x = 5;
      x = x*x;
      System.out.println("x = " + x);
 }
}
x = 25

…稍微难一点的计算;

**public** **class** Main {
   **public** **static** **void** main(String[] args) {
      **double** x = 38.75645;
      x = x*x;
      System.out.println("x = " + x);
   }
}
x = 1502.0624166025

…到更复杂的过程,例如求一个数的平方。

虽然求一个数的平方很简单,但是求一个数的平方根的问题涉及更复杂的数学。

如同

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以用下面的等式来表示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有许多算法可以用来寻找答案。牛顿发现的巴比伦方法就是一个例子;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Javascript 中调用诸如 Math 函数这样的编程函数要容易得多;

var y = Math.sqrt(16);      // Returns the square root of 16, y = 4

编程语言使计算机能够很好地完成计算和数学等工作。然而,有些事情人类做得很好,而计算机却不擅长。计算机做得不太好的一个例子可能是基于不同的输入或理解语音做出决定。

机器很难像我们自然说话和打字那样理解语音和文本。人工神经网络(ANN)是克服这个问题的一种方法。为了理解他们如何克服这个问题,看看人工神经网络与传统的计算机程序有何不同是很有用的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

传统的程序通过使用中央处理器、读取指令和使用存储在特定地址的数据来遵循预定的程序而工作。不管它是否被写入;过程的、面向对象的或任何其他类型的语言。

运行一位代码,例如一个函数,会产生一个输出。编程语言倾向于运行一个进程,然后继续下一个进程。一个函数的结果导致另一个函数被调用。虽然一些程序允许并行过程同时运行,并且大体上重复过程,但是有一个逻辑流程,一件事情接着另一件事情。

大多数程序遵循相当复杂的指令,由许多相互联系的子程序组成,它们遵循一个可能有许多路径的逻辑流程。每一个岔路口和每一条路径都必须明确地写下来,复杂的决策需要复杂的指令。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The UML CI

神经网络的工作方式与当前大多数计算机程序不同。顾名思义,它们由神经元组成。

神经元的输出可以表示为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

或者

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这些等式中,W 是神经节点的权重向量,定义为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

X 是输入向量,定义为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它们不通过使用中央处理器运行代码分支系统来处理一组复杂的编程指令。相反,它们使用输入的加权和来执行大量非常简单的程序,通常跨越大量处理器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些简单程序的网络提供了一个结果,可以适应微妙的变化,并对不太确定的信息做出反应。网络可以归纳并发现可能隐藏的模式。从这个意义上来说,它的工作方式与以其命名的生物模型相似。

计算过程

感知器

为了开始说明计算过程,我们将看一个非常简单的神经网络的例子。它是 60 多年前首次发明的,是一种感知机。它是一个“前馈”模型;输入被送入神经元,经过处理,然后输出。感知器从计算其输入的加权和开始

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Activation function

感知器有五个部分:

  1. 输入:X1,X2
  2. 重量:W1 W2
  3. 潜力:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中,μ为偏置。

4.激活函数: f(z)

5.输出:y = f(z)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以让感知机给我们一个问题的答案,这个问题有三个影响结果的因素。比如“这是美食吗?”。决定好坏的因素有:

“对你有好处吗?”
“好吃吗?”
“好看吗?”

我们给所有的问题和答案一个数值。我们给每个问题一个值,在这个例子中是一个布尔值,是或否,1 或 0。我们给答案取相同的值,好吃的= 1,不好吃的=-1。

我们收集一些数据,并把它们转换成数字。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们假设“对你有益”是最重要的因素,但是味道和外观也会影响答案。我们会考虑每个因素的重要性,并给予相应的权重。

让我们向我们的感知器传递三个输入

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Input_0: x1 = 0
Input_1: x2 = 1
Input_2: x3 = 1

我们要做的下一件事是给这些问题一些权重,我们假设它们在重要性上是不一样的。我们猜测它们有多重要。

Weight_0: x1 = 6
Weight_1: x2 = 4 
Weight_2: x3 = 2

输入乘以权重

Input_0 * weight 0: 0 * 6 = 0
Input_1 * weight 1: 1 * 4 = 4
Input_1 * weight 1: 1 * 2 = 2

下一步是对所有输入和权重求和

output = sum(0+4+2) = 6

神经元的输出由加权和是否

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

小于或大于阈值。就像权重一样,阈值是一个实数,它是神经元的一个参数。

下面是用于计算神经元输出的等式;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阈值用于确定神经元是否激活。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,将所有输入值和权重相加,我们的单细胞感知机会告诉我们什么是“好食物”。因为我们知道问题的答案,所以我们可以用答案来调整

现在所有这些都是非常基本的,很容易编写几行代码来计算出我们有三个条件,它们有一个值并经过加权,根据我们的阈值测量输出,然后它可以决定是真还是假。

人工神经网络的力量来自于大量神经元的联网。添加更多的输入和使用更多的层,我们可以为影响决策的因素添加微妙的值。更好的是,我们可以让网络学会调整这些因素。

人工神经网络

使用线性回归训练网络。

单层单神经元网络(使用线性激活函数)接收具有两个特征 x1 和 x2 的输入;每个都有重量。网络将输入和权重相加,然后输出预测。计算差值以测量误差,显示它在所有训练数据上的表现如何。

首先让我们看一个简单的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们使用一个网络来改变输出,因为我们想要一个比-6 稍大的数字。我们在网络中前进,猜测 x 和 y 的值会给我们一个很好的拟合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们试图回答少量数据中的几个问题时,这种方法非常有效。

数字梯度

我们可以不简单地调整单个输入的权重,而是着眼于输出的导数来改变两个或多个输入。通过使用导数,我们可以用输出来降低一个输入,增加另一个输入。导数的数学表示可以是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

激活

人工神经网络通过神经元网络并行地集体处理信息。每个神经元本身就是一台简单的机器。它读取输入,处理输入,并生成输出。它通过获取一组加权输入,用一个函数计算它们的总和来激活神经元

以及将激活功能的输出传递给网络中的其他节点。

因为激活函数采用两个(相同长度的)数字序列(向量)来返回一个数字。该运算可以表示为(代数形式)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面是线性激活函数的表达式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有产生单一输出的线性特征的系统的模型表示为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

神经网络的一个特征是它的学习能力,所以它们可以很舒服地放在机器学习的标题下。该网络可以形成一个灵活且能适应的复杂系统。它可以根据得到的信息修改其内部结构。换句话说,它从接收到的信息中学习,并将其作为输出进行处理。在人工神经网络中,分类器试图识别网络中的错误,然后调整网络以减少这些错误。

一般来说,一个网络从一个输入和一个已知的输出中学习,所以我们可以给出成对的值(x,y ),其中 x 是输入,y 是已知的输出

pairs = ((x=5,y=13),(x=1,y=3),(x=3,y=8)),…,((x= < em > n < /em >,y =N2))

目的是找到最接近训练数据的权重(w)。一种测量拟合度的方法是通过将 M(w) 的值减小到最小值来计算数据集上的最小误差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在本系列的下一篇文章中,我将更深入地探讨反向传播,以及为什么通过查询函数对数据进行分类可以产生自然语言界面,从而彻底改变分析和商业智能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首次发布【2016 年 5 月 30 日

机器学习解决假新闻问题

原文:https://towardsdatascience.com/machine-learning-tackles-the-fake-news-problem-c3fa75549e52?source=collection_archive---------14-----------------------

我最近有机会使用机器学习来解决美国媒体最前沿的一个问题,即识别假新闻的困难。具体来说,我的同学 David Masse 和我应用了两种 ML 方法来识别故意误导的新闻文章:逻辑回归和朴素贝叶斯分类器。使用包含 20,000 篇带标签文章的 kaggle 数据集,我们在预测测试集的标签时达到了 93%的准确率。这是练习自然语言处理以及构建强大分类模型的一些有效技术的绝佳机会。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自然语言处理是计算机科学领域,致力于处理和分析任何形式的自然人类语言(书面、口头或其他)。简单来说,计算机理解 0 和 1,而人类使用广泛的语言进行交流。NLP 旨在弥合这两个世界之间的差距,以便数据科学家和机器学习工程师可以分析大量的人类通信数据。

在假新闻问题的背景下,NLP 允许我们将文章分解成它们的组成部分,并选择重要的特征。然后,我们构建并训练模型来识别不可靠的文档。

清理时间!

对于许多数据驱动的项目来说,探索之后的首要任务是清理数据。我们正在处理来自各种来源的数千篇文章,有些文章比其他文章干净得多。正则表达式提供了一种限制我们允许包含在分析中的字符串类型的方法。例如,这行代码使用了 re python 模块:

clean _ article = re.sub(“[^a-za-z0–9’]”,’ ',文章)

用空格替换所有非字母数字字符。^表示我们要替换的是指定集合的补集。一旦我们删除了不需要的字符,我们就可以进行标记化和矢量化了!

Scikit-learn 是一个令人难以置信的 python 机器学习包,它完成了大量繁重的工作。特别是,计数矢量器创建一个包含所有被分析文本的完整词汇表,并将每个文档转换成一个表示每个单词总计数的矢量。这将以稀疏矩阵的形式返回向量,因为大多数文章不包含大多数单词。矢量器允许集成预处理函数,以及您的首选标记器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An example of vectorized articles, each row contains the occurrences of our initial 1000 feature words

在新闻分析的情况下,单独考虑每个单词过于简单,因此我们的矢量化允许双词或两个单词的短语。我们将特征的数量限制为 1000,因此我们只考虑将文档分类为真实或伪造的最重要的特征。

特征工程

特征工程与其说是简单的技术,不如说是一种复杂的艺术形式。它包括考虑数据集和属性域、决定最适合您的模型的功能以及最终测试您的功能以优化您的选择的过程。Scikit-learn 的矢量器提取了我们的 1000 个基本 n-gram 特征,我们开始添加元特征来完善我们的分类。我们决定计算每个文档中的平均单词长度和数值数量,这提高了我们的模型的准确性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Left: Aggregate features, Right: Sentiment scores

情感分析代表了 NLP 的另一种分析工具,为文本主体中表达的一般情感分配数值。我们使用了两个软件包,TextBlob 和自然语言工具包的 Vader。这些都是对文本文档进行开箱即用情感分析的好工具。Vader 产生了衡量极性和中性的各种分数,而 TextBlob 提供了总体主观性以及它自己的极性衡量标准。我们原本希望,当计算误导性和真实的文章时,这些情绪的分布会非常不同,但是我们发现情况并非如此。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The distribution of neutral article sentiment via Vader, where 0 is fully neutral

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TextBlob Sentiment Scores (left: -1 polarity is negative and 1 is positive, right: 0 is very objective and 1 is very subjective)

从上面可以看出,仅仅从情感得分上看,很少有洞察力。然而,我们决定将它们保留在我们的模型中,因为当与我们的分类器结合时,它们会增加准确性。

逻辑回归

我们在这里考虑的系统是二进制的,其中只有类是真的和假的。考虑到文章的相关特征,我们需要对文章不可靠的概率进行建模。这是多项式逻辑回归的完美候选,我们的模型依赖于 logit 变换和最大似然估计来模拟与预测变量相关的不可靠性概率。

换句话说,LR 直接计算后验 p(x|y ),学习将哪些标签分配给哪些特征输入。这是一个判别方法的例子,虽然这在技术上不是一个统计分类,但它给出了我们用来赋值的类成员的条件概率。SciKit-Learn 的逻辑回归模型提供了一种简单的方法来实现这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Left: ROC curve for the logistic regression. Right: 20 of the top features for the regression.

朴素贝叶斯分类器

我们的第二种方法是使用朴素贝叶斯(NB)算法,尽管它很简单,但对于这个应用程序来说效果很好。假设特征之间独立,NB 从每个标记的文章中学习联合概率 p(x,y)的模型。然后使用贝叶斯规则计算条件概率,根据最大概率分配标签,从而进行预测。相比之下,这是一个生成分类器的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Bayes Classifier, using MAP decision rule

在这种情况下,我们考虑一个多项式事件模型,它最准确地代表了我们的特征的分布。正如预期的那样,结果与逻辑拟合获得的结果非常接近。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Left: ROC curve for the Multinomial Naïve Bayes. Right: 20 of the top features for the Naïve Bayes Classifier.

最后

使用机器学习可以有效地识别假新闻形式的错误信息的存在。即使没有上下文信息,如标题或来源,正文也足以做到这一点。因此,这些策略可以很容易地应用于其他没有附加描述符的文档。虽然情感特征本身不足以用于假新闻分类,但当与其他特征结合时,它们确实提高了我们的分类器性能。未来的工作可以与其他流行的模型进行比较,如支持向量机。

关于这两种方法之间关系的进一步阅读要感谢吴恩达和迈克尔·乔丹博士:

[## 判别型与生成型量词的比较——逻辑回归和朴素贝叶斯的比较

神经信息处理系统电子会议录

papers.nips.cc](http://papers.nips.cc/paper/2020-on-discriminative-vs-generative-classifiers-a-comparison-of-logistic-regression-and-naive-bayes)

机器学习—文本处理

原文:https://towardsdatascience.com/machine-learning-text-processing-1d5a2d638958?source=collection_archive---------0-----------------------

文本处理是许多 ML 应用程序中最常见的任务之一。下面是这种应用的一些例子。

• **Language Translation: Translation of a sentence from one language to another.**• **Sentiment Analysis: To determine, from a text corpus, whether the  sentiment towards any topic or product etc. is positive, negative, or neutral.**• **Spam Filtering:  Detect unsolicited and unwanted email/messages.**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Courtesy (sigmoidal)

这些应用程序处理大量文本来执行分类或翻译,并且涉及大量后端工作。将文本转换成算法可以消化的东西是一个复杂的过程。在本文中,我们将讨论文本处理中涉及的步骤。

步骤 1:数据预处理

  • 标记化—将句子转换成单词
  • 删除不必要的标点、标签
  • 删除停用词—常用词,如“the”、“is”等。它们没有特定的语义
  • 词干—通过删除不必要的字符(通常是后缀)来消除词形变化,从而将单词简化为词根。
  • 词汇化——通过确定词类和利用语言的详细数据库来消除屈折的另一种方法。
The stemmed form of studies is: studi
The stemmed form of studying is: studyThe lemmatized form of studies is: study
The lemmatized form of studying is: study

因此,词干化和词元化有助于将像“研究”、“学习”这样的词简化为普通的基本形式或词根“学习”。关于词干化和词汇化的详细讨论,请参考这里的。请注意,并非所有步骤都是强制性的,这取决于应用程序的使用情形。对于垃圾邮件过滤,我们可能会遵循上述所有步骤,但可能不会考虑语言翻译问题。

我们可以用 python 做很多文本预处理操作。

  • NLTK——自然语言工具包是最著名和最常用的 NLP 库之一,可用于从标记化、词干提取、标记、解析等各种任务
  • BeautifulSoup —用于从 HTML 和 XML 文档中提取数据的库
#using NLTK library, we can do lot of text preprocesing
**import nltk
from nltk.tokenize import word_tokenize**
#function to split text into word
**tokens = word_tokenize("The quick brown fox jumps over the lazy dog")
nltk.download('stopwords')
print(tokens)**

OUT: [‘The ‘,’ quick ‘,’ brown ‘,’ fox ‘,’ jumps ‘,’ over ‘,’ The ‘,’ lazy ‘,’ dog’]

**from nltk.corpus import stopwords
stop_words = set(stopwords.words(‘english’))
tokens = [w for w in tokens if not w in stop_words]
print(tokens)**

OUT: [‘The ‘,’ quick ‘,’ brown ‘,’ fox ‘,’ jumps ‘,’ lazy ‘,’ dog’]

#NLTK provides several stemmer interfaces like Porter stemmer, #Lancaster Stemmer, Snowball Stemmer
**from nltk.stem.porter import PorterStemmer
porter = PorterStemmer()
stems = []
for t in tokens:    
    stems.append(porter.stem(t))
print(stems)**

OUT: [‘the ‘,’ quick ‘,’ brown ‘,’ fox ‘,’ jump ‘,’ lazi ‘,’ dog’]

步骤 2:特征提取

在文本处理中,文本中的词代表离散的、分类的特征。我们如何以一种算法可以使用的方式对这些数据进行编码?从文本数据到实值向量的映射称为特征提取。用数字表示文本的最简单的技术之一是单词包。

单词包(BOW): 我们在称为词汇的文本语料库中制作唯一单词的列表。然后,我们可以将每个句子或文档表示为一个向量,每个单词用 1 表示存在,用 0 表示不在词汇表中。另一种表示可以是计算每个单词在文档中出现的次数。最流行的方法是使用术语频率-逆文档频率(TF-IDF) 技术。

  • 术语频率(TF) =(术语 t 在文档中出现的次数)/(文档中的术语数)
  • 逆文档频率(IDF) = log(N/n),其中,N 是文档的数量,N 是术语 t 出现过的文档的数量。罕见词的 IDF 很高,而常用词的 IDF 可能很低。从而具有突出不同单词的效果。
  • 我们计算一项的 TF-IDF 值为= TF * IDF

让我们举一个例子来计算文档中一个术语的 TF-IDF。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example text corpus

**TF('beautiful',Document1) = 2/10, IDF('beautiful')=log(2/2) = 0
TF(‘day’,Document1) = 5/10,  IDF(‘day’)=log(2/1) = 0.30

TF-IDF(‘beautiful’, Document1) = (2/10)*0 = 0
TF-IDF(‘day’, Document1) = (5/10)*0.30 = 0.15**

正如你在文献 1 中看到的,TF-IDF 方法对“美丽”一词进行了严重的惩罚,但对“天”赋予了更大的权重。这是由于 IDF 部分,它赋予不同的单词更大的权重。换句话说,从整个语料库的上下文来看,“day”是 Document1 的一个重要单词。Python scikit-learn 库为文本数据挖掘提供了高效的工具,并提供了在给定文本语料库的情况下计算文本词汇 TF-IDF 的函数。

使用 BOW 的一个主要缺点是它放弃了单词顺序,从而忽略了上下文,进而忽略了文档中单词的含义。对于自然语言处理(NLP ),保持单词的上下文是最重要的。为了解决这个问题,我们使用另一种叫做单词嵌入的方法。

**单词嵌入:**它是一种文本表示,其中具有相同含义的单词具有相似的表示。换句话说,它在一个坐标系统中表示单词,在该坐标系统中,基于关系语料库的相关单词被放置得更靠近。

让我们讨论一些众所周知的单词嵌入模型:

Word2Vec

Word2vec 将大量文本作为其输入,并产生一个向量空间,每个唯一的单词在该空间中被分配一个相应的向量。单词向量被定位在向量空间中,使得语料库中共享共同上下文的单词在空间中彼此非常接近。Word2Vec 非常擅长捕捉意思并在任务中展示它,如计算类比问题,形式为 ab 如同 c 对*?。比如之于如同之于?* ( 大妈)使用基于余弦距离的简单矢量偏移方法。例如,以下是说明性别关系的三个单词对的向量偏移量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

vector offsets for gender relation

这种矢量构图也让我们回答“国王—男人+女人=?”提问并得出结果“女王”!当你想到所有这些知识仅仅来自于在上下文中查看大量单词,而没有提供关于它们的语义的其他信息时,所有这些都是非常了不起的。更多详情请参考这里

手套

单词表示的全局向量或 GloVe 算法是对 word2vec 方法的扩展,用于有效地学习单词向量。GloVe 使用跨整个文本语料库的统计来构建显式的单词上下文或单词共现矩阵。结果是一个学习模型,它通常可以产生更好的单词嵌入。

考虑下面的例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*目标词:*冰、
蒸汽、*探测词:*固体、气体、水、时尚

P(k|w) 为单词 k 在单词 w 的上下文中出现的概率。考虑一个与强相关,而与不相关的词,比如P(固|冰)会比较高, P(固|汽)会比较低。因此 P(固体|冰)/ P(固体|蒸汽)的比值将会很大。如果我们取一个与蒸汽相关而与不相关的词,比如气体,那么 P(气体|冰)/ P(气体|蒸汽)的比值反而会很小。对于一个既与又与蒸汽相关的词,比如我们预计比率接近 1。更多详情请参考此处的

单词嵌入将每个单词编码到一个向量中,该向量捕获文本语料库中单词之间的某种关系和相似性。这意味着甚至像大小写、拼写、标点符号等单词的变化都会被自动学习。反过来,这可能意味着可能不再需要上述的一些文本清理步骤。

步骤 3:选择 ML 算法

根据问题空间和可用数据,有多种方法为各种基于文本的应用程序构建 ML 模型。

用于垃圾邮件过滤的经典 ML 方法,如“朴素贝叶斯”或“支持向量机”已被广泛使用。深度学习技术正在为情感分析和语言翻译等 NLP 问题提供更好的结果。深度学习模型的训练非常慢,并且已经看到,对于简单的文本分类问题,经典的 ML 方法也以更快的训练时间给出类似的结果。

让我们使用到目前为止讨论的技术,在 IMDB 电影评论数据集上构建一个情感分析器

下载 IMDb 电影评论数据

IMDB 电影评论集可以从这里下载。这个用于二元情感分类的数据集包含用于训练的 25,000 条高度极性的电影评论,以及用于测试的 25,000 条评论。这个数据集被用于非常受欢迎的论文‘学习用于情感分析的词向量’

预处理

数据集被结构化为测试集和训练集,每个都有 25000 个文件。让我们首先将文件读入 python 数据帧,以便进一步处理和可视化。测试和训练集被进一步分成 12500 个“正面”和“负面”评论。我们阅读每个文件,并将负面评价标记为“0 ”,正面评价标记为“1”

#convert the dataset from files to a python DataFrame**import pandas as pd
import os****folder = 'aclImdb'****labels = {'pos': 1, 'neg': 0}****df = pd.DataFrame()****for f in ('test', 'train'):    
    for l in ('pos', 'neg'):
        path = os.path.join(folder, f, l)
        for file in os.listdir (path) :
            with open(os.path.join(path, file),'r', encoding='utf-8') as infile:
                txt = infile.read()
            df = df.append([[txt, labels[l]]],ignore_index=True)****df.columns = ['review', 'sentiment']**

让我们将收集的数据保存为。csv 文件供进一步使用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Five reviews and the corresponding sentiment

要获得文本中单词的频率分布,我们可以利用nltk.FreqDist()函数,该函数列出了文本中使用最多的单词,提供了文本数据中主要主题的大致概念,如以下代码所示:

**import nltk
from nltk.tokenize import word_tokenize****reviews = df.review.str.cat(sep=' ')****#function to split text into word
tokens = word_tokenize(reviews)****vocabulary = set(tokens)
print(len(vocabulary))****frequency_dist = nltk.FreqDist(tokens)
sorted(frequency_dist,key=frequency_dist.__getitem__, reverse=True)[0:50]**

这给出了文本中使用的前 50 个单词,尽管很明显,一些停用词,如the,在英语中频繁出现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Top 50 words

仔细看,你会发现许多不必要的标点符号和标签。通过排除单个和两个字母的单词,像thethisandthat这样的停用词在下面所示的词频分布图中占据顶部位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们删除停用词,以进一步清理文本语料库。

**from nltk.corpus import stopwords****stop_words = set(stopwords.words('english'))
tokens = [w for w in tokens if not w in stop_words]**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Top 50 words

这看起来像一个干净的文本语料库,像wentsawmovie 等等。如预期的那样占据了前几名。

另一个有用的可视化工具wordcloud包通过在画布上随机放置单词来帮助创建单词云,大小与它们在文本中的频率成比例。

**from wordcloud import WordCloud
import matplotlib.pyplot as plt****wordcloud = WordCloud().
generate_from_frequencies(frequency_dist)****plt.imshow(wordcloud)
plt.axis("off")
plt.show()**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

构建分类器

在清理之后,是时候构建分类器来识别每个电影评论的情感。从 IMDb 数据集中,划分 25000 个测试集和训练集:

X_train = df.loc[:24999, 'review'].values
y_train = df.loc[:24999, 'sentiment'].values
X_test = df.loc[25000:, 'review'].values
y_test = df.loc[25000:, 'sentiment'].values

**scikit-learn**提供一些很酷的工具对文本做预处理。我们使用TfidTransformer将文本语料库转换为特征向量,我们将最大特征限制为 10000 个。有关如何使用TfidTransformer的更多详情,请参考此处的。

**from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer****vectorizer = TfidfVectorizer()
train_vectors = vectorizer.fit_transform(X_train)
test_vectors = vectorizer.transform(X_test)
print(train_vectors.shape, test_vectors.shape)**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Training and Test set: 25K with 10K Features

有许多算法可供选择,我们将使用一个基本的朴素贝叶斯分类器,并在训练集上训练模型。

**from sklearn.naive_bayes import MultinomialNB****clf = MultinomialNB().fit(train_vectors, y_train)**

我们的情感分析仪已经准备好并接受过训练。现在,让我们在测试集上测试我们的模型的性能,以预测情感标签。

**from  sklearn.metrics  import accuracy_score****predicted = clf.predict(test_vectors)****print(accuracy_score(y_test,predicted))*****Output 0.791***

哇!!!基于基本 NB 分类器的情感分析器做得很好,给出大约 79%的准确度。您可以尝试改变特征向量长度和改变TfidTransformer的参数,以查看对模型精度的影响。

**结论:**我们已经详细讨论了 NLP 中使用的文本处理技术。我们还演示了使用文本处理和构建情感分析器,用经典的 ML 方法取得了相当好的效果。

感谢阅读本文,喜欢就推荐分享。

延伸阅读:

[## 对单词嵌入的直观理解:从计数向量到 Word2Vec

在我们开始之前,看看下面的例子。你打开谷歌搜索一篇关于……

www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/) [## 什么是文本的单词嵌入?

词嵌入是一种词的表征类型,它允许具有相似意义的词具有相似的…

machinelearningmastery.com](https://machinelearningmastery.com/what-are-word-embeddings/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值