TowardsDataScience 博客中文翻译 2019(一百零三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何建立数据驱动的文化

原文:https://towardsdatascience.com/chief-digital-officers-real-value-of-just-a-hype-c3da9d054472?source=collection_archive---------20-----------------------

加强组织中数据之旅的七个经验证的见解。

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

Photo by Carlos Muza on Unsplash

经济学家的一篇著名文章均衡了数据和石油的价值。Gartner 的研究显示了全球首席数据官的数量是如何增长的。

但是你如何在你的组织中建立一个真正的数据驱动的文化呢?首席数据官(CDO)能带来真正的价值还是只是一场炒作?

实话实说:**当你开始与数据打交道时,**除非你在一家强大的数据驱动型公司(如脸书的 Linkedin)运营,你的第一个角色是向组织宣传

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

Business vector created by freepik

你将花费大量时间让人们相信数据的价值,向他们展示你在质量和业务能力方面的数据差距。

例如,根据多个变量滑动和切割您的收入流,深入分析您的部分成本,或者展示如果您的数据得到正确维护和保持高质量,您可以如何降低运营的复杂性。

我在体验中注意到的是,如果你能打破这堵墙,真正的数据之旅就可以开始了。人们将开始从组织内部联系你,询问是否有可能使用数据来实现某些业务需求。这是第一个迹象,向您表明为让您的组织了解数据的重要性而做的所有工作都开始有了回报。

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

Banner vector created by katemangostar

一旦业务人员理解了数据的潜力,他们会要求你开发分析和跨职能项目,以回答业务问题。

这一阶段对于至关重要,您需要与您的企业合作,以发现您掌握的数据可以利用的任何其他潜在领域。

我们启动了一个非常成功的项目,是关于整合人力资源和财务数据,以确保员工报告的一致性,并减少对账中的错误和时间浪费。最初,每个人都持怀疑态度,但当第一批试点国家出现时,该项目变得切实可行,并受到了组织中关键利益相关者的赞赏。

企业有数据需求,但可能没有意识到这一点。你的角色是确保这变得可见。

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

Background vector created by Vectorarte — www.freepik.com

如果您有幸获得预算和业务支持,您的旅程可以全速前进,通过预测分析释放数据在您公司的价值。今天,许多组织的情况并非如此,因为大多数组织仍在对内部管理人员进行与业务相关的培训。

然而,当数据成为组织的核心时, CDO 是推动议程的人,他嗅到了在会议、商业评论、职能指导委员会等场合使用公司数据的机会…

数据成为公司思考方式的一部分,不再是 IT 领导层的话题。

根据我的经验,一个真实的例子是使用内部数据来降低财务职能的复杂性,利用流程挖掘工具和 ERP 连接来获得自动 KPI,并识别重复活动,从而触发流程自动化和改进计划。好处是加快了运营速度,减少了错误,并消除了员工的低附加值任务。

现在让我们通过的七条真知灼见来加强我所看到的 CDO 的地位。

  1. 为您的公司定义正确的数据框架。必须有主数据管理的基本概念:即组织必须知道谁拥有哪些数据及其生命周期。这将使数据管理人员的角色专业化,确保高质量的结果。这方面的一个例子是建立一个内部计划,从高层以强硬的语气定义主数据治理(有人称之为“强制”),明确每个数据域的业务所有者和数据质量规则。这还包括汇报关系和组织变革,以使 CDO 取得成功。
  2. 阐明您的数据策略。你必须清楚你想把你的数据放在哪里:你想创造一个新的收入流还是想降低你的内部复杂性?这是 CDO 可以运作的两种完全不同的情况。尽可能使你的战略具体化,定义一个分阶段的过程(在每个阶段你将实现什么)。这将有助于整个组织的人员了解他们如何在其专业领域内为整体愿景做出贡献。它还将创建一个平台,将围绕这一主题开展工作的内部倡议联系起来。(可以阅读这里了解更多来自 MIT 的数据策略)。
  3. 赋予企业所有权。过去,数据被认为是业务流程的产物。现在,它必须被视为一项业务资产。了解客户的信用历史、购买偏好及其与其他竞争对手的联系,是我们业务的宝贵数据。IT 部门有时离业务需求太远,并在最大化业务价值方面挣扎,因为对工具和平台的关注仍然存在。企业不应该关心所使用的数据平台,只要他们需要的信息就在那里。
  4. 将您的数据转化为信息。我们不都是脸书、谷歌、亚马逊!所以梦想要大,是的,但是要现实!您的数据仍然可以成为对您的组织有价值的信息。你“仅仅”需要给它添加一些智能,使它们达到一个体面的质量水平,并将数据连接到它们所支持的业务流程。有时人们认为需要 100%的数据质量才能达到这个阶段。这是错误的,因为达到这一水平的边际成本可能很高,而且比做出决策所需的时间要长。
  5. 教育你的组织。如果公司真的专注于数字化、敏捷性和人工智能,那么他们的员工也必须了解如何使用他们的数据。必须实施教育计划,将组织从“生产数据”转变为“使用数据”,并将业务流程与数据流程相集成。这也将有助于确定组织中能够进一步推动数据战略的超级明星。人们必须感觉到他们的角色对商业战略至关重要。通过这样做,他们的责任感会增强。在我的经验中,我应用了游戏化的概念,最初将人才吸引到主题中,然后提升团队体验。从动机和表现的角度来看,结果都是惊人的。
  6. **使之有形。**如果请外部顾问来设计你的战略,你就有问题了。公司拥有自己的战略,外部顾问可以作为参考。但是,有谁比你更了解你的雄心壮志以及你可以用你的数据做什么呢?我的建议是在所有职能部门和业务中寻找主题专家。通常,这些人参与了过去的 ERP 迁移,并且对业务和 IT 方面都有深入的了解。这些广泛的能力是将数据驱动的想法转化为公司切实可行的东西所必需的。
  7. 沟通、参与、布道。要改变一个大组织中人们的关注点,只有深入沟通才能做到。CDO 的大部分职责是分享愿景、结果和成就,并将整个公司凝聚在一起。我更愿意把 CDO 看作一个战略角色,一个对公司整体战略的关键贡献者。另一方面,也有为了在场而过度交流的风险。我建议将内部沟通专业化,并把重点放在结果上。这将带来围绕数据话题的热情,并增加其可信度。

根据我的经验,这些支柱将提升 CDO 的体验,并加强组织中的数据文化。他们将使这个职位不仅仅是一个宣传,而是一个真正的驱动力,以一种有纪律的方式释放数据的价值,推动结果,并给予 CDO 在组织中应有的尊严。

战争百分之九十是信息——拿破仑·波拿巴,法国军政领袖

Luca Condosta(博士)是一名金融专业人士,拥有跨国企业的全球经验。对数据、领导力、战略和人充满热情。两本书的作者(可持续发展报告Natuzzi——意大利和声制作者)喜欢寻找和分享故事。

如何用 Python 选择股票投资

原文:https://towardsdatascience.com/choose-stocks-to-invest-with-python-584892e3ad22?source=collection_archive---------10-----------------------

混合整数线性规划作为解决股票选择问题的替代工具

您计划在未来 3 年投资几只股票,每只股票的每一美元投资都有不同的预期回报和具体的投资金额,如下表所示(均以千美元计)。考虑到你每年投资购买股票的数量是有限的,你想决定每年投资哪些股票,以使总回报最大化。

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

当机器学习不是你的选择时

每个人都想用最少的投资获得最多的回报,但不是每个人都花时间去分析股票,因为这不是一件容易的事情。你决定利用你的数据科学技能来帮助你解决这个问题,但发现用机器学习技术来解决这个问题很有挑战性。为什么会这样呢?

虽然机器学习在从数据中学习和做出预测方面很棒,但它在做出最佳决策方面有局限性。但使用 Python MIP(混合整数线性规划)工具,可以轻松确定每年选择的股票。当您的问题涉及多个约束并允许许多可能的解决方案时,只有 MIP 有能力找到最佳解决方案。你可以在这里找到更多关于 MIP 的信息。这个博客将向你展示如何使用这个工具为你造福。

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

步骤 1:识别和定义参数、约束、变量和目标

输入参数:

  • 库存数量(一)
  • 每年每种股票的预算要求(a[t][i])
  • 每年的预算需求(b[t])
  • 每只股票的年回报率(c[i])

*决策变量:*是否每年选择一只股票 x[t][i]。这是一个二元变量,选择时 x[t][i] = 1,否则 x[t][i]=0

*约束:*每年所有投资股票的预算需求之和不能超过当年的预算需求

*目标:*投资总回报最大化

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

步骤 2:用 MIP 编程

在数组和矩阵中保存给定的信息

c = [90, 120, 100, 80, 130]
b = [45, 60, 50]
a = [[10, 15, 12, 9, 13],[20, 15, 25, 15, 10],[15, 20, 20, 15, 10]]T, I = range(len(b)),range(len(c))

安装 MIP

pip install mip==1.4.2 from mip.model import *

创建模型

m = Model(sense = MAXIMIZE,solver_name=CBC)

变量

add_var()创建变量

创建一个包含 n 个二进制决策变量(n = 5)的变量向量,指示是否选择股票

x = [[m.add_var(name = names[i], var_type=BINARY) for i in I] for t in T]

*xsum()*用于求和表达式

m.objective = maximize(xsum(c[i] * x[t][i] for i in I for t in T))

限制

增加每年可用资金的限制

for t in range(3):  
 m += xsum(a[t][i] * x[t][i] for i in I) <= b[t]

目标函数

Optimize()方法执行配方的优化。Optimize 方法返回搜索的状态(OptimizationStatus)。OPTIMAL如果搜索结束并找到最优解。

status = m.optimize() if status == OptimizationStatus.OPTIMAL:  
 print('optimal solution cost {} found'.format(m.objective_value)) 

优化结果

results = {}
for i in range(3):  
 results[i+1] = [m.vars[j].x for j in range(5*i,5*i+5)]

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

import pandas as pd result = pd.DataFrame(data = results, index = ['A','B','C','D','E'])

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

结果的解释

根据所获得的结果,这是您应该做的,以在每年预算的不同限制下最大化投资的总回报:

  • 在第一年,投资股票 A、C、D 和 E
  • 在第二年,投资股票 A、B 和 D
  • 第三年,投资股票 B、C 和 E

关键要点

  • 尽管股票 E 和 B 的投资回报率最高,但由于它们在当年的预算要求较高,因此并不总是被选中。(也就是说,第一年没有选择股票 B,因为与其他股票相比,它的预算要求最高)
  • 一些股票在一年内没有被选择,不是因为它们的预算要求,而是因为它们的投资回报低(即,股票 A 在第 3 年没有被选择,即使预算要求相对较低)

结论

恭喜你!您了解了如何使用 MIP 为每一年选择股票以获得最佳价值回报。我希望你在选择你的股票和观察几行代码后的最佳结果时感到愉快。

this Github repo 中,您可以随意使用本文的代码。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以通过 LinkedInTwitter 与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 如何从头开始构建矩阵模块

如果您一直在为矩阵运算导入 Numpy,但不知道该模块是如何构建的,本文将展示…

towardsdatascience.com](/how-to-build-a-matrix-module-from-scratch-a4f35ec28b56) [## 用美丽的声音抓取维基百科

关于如何使用 Beautiful Soup 的分步教程,这是一个用于 web 抓取的简单易用的 Python 库

towardsdatascience.com](/step-by-step-tutorial-web-scraping-wikipedia-with-beautifulsoup-48d7f2dfa52d) [## 用 Python 模块 Newspaper 和 NLTK 查找文章中的常用词

使用 newspaper3k 和 NLTK 从报纸中提取信息和发现见解的分步指南

towardsdatascience.com](/find-common-words-in-article-with-python-module-newspaper-and-nltk-8c7d6c75733) [## 为您的数据科学项目提供 Numpy 技巧

创建数组、矩阵、执行矩阵运算、解决线性代数问题和常见数据科学的技巧…

medium.com](https://medium.com/@khuyentran1476/comprehensive-numpy-tutorials-for-beginners-8b88696bd3a2)

参考

[1]古罗比。检索自:https://www . guro bi . com/machine-learning-and-mathematical-optimization/

根据您的需求选择合适的转换器框架

原文:https://towardsdatascience.com/choose-the-right-transformer-framework-for-you-b7c51737d45?source=collection_archive---------10-----------------------

比较不同的 Transformer 实现框架,选择最适合您自己需求的框架

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

Image credit: © Flynt — Bigstockphoto.com

TL;速度三角形定位法(dead reckoning)

基于你对 PyTroch 或者 TensorFlow 的偏好,我推荐使用 Fairseq 或者 Tensor2Tensor。

如果你是一名研究人员,Fairseq 在定制方面足够灵活。但如果是做一些真实的应用,考虑部署的话,选择 Tensor2Tensor 会更好。

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

comparison of different frameworks

不同框架中的转换器

fair seq

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

一个序列建模工具包,允许研究人员和开发人员为翻译、摘要、语言建模和其他文本生成任务训练自定义模型。

变压器(自我关注)网络:

我们可以很容易地使用编码器和解码器。

class fairseq.models.transformer.TransformerModel(encoder, decoder)

来自《注意力是你所需要的》(瓦斯瓦尼等人,2017) 的变形金刚模型。

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

参数:

张量 2 传感器

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

深度学习模型和数据集的库,旨在使深度学习更容易访问并加速 ML 研究。

您可以尝试使用不同的变压器型号和超参数来解决问题,如论文中所述:

  • 标准变压器:--model=transformer --hparams_set=transformer_tiny
  • 万能变压器:--model=universal_transformer --hparams_set=universal_transformer_tiny
  • --model=universal_transformer自适应万能变压器:--hparams_set=adaptive_universal_transformer_tiny

这里有一个预排来实现来自 的变压器模型注意的是你所需要的 关于 WMT 的数据。

OpenNMT

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

一个开源(MIT)神经机器翻译系统。它旨在方便研究人员在翻译、摘要、图像转文本、形态学和许多其他领域尝试新的想法。

OpenNMT 在两种流行的深度学习框架中提供实现:

OpenNMT-py

得益于 PyTorch 易用性的可扩展快速实现。

变压器实现代码

OpenNMT-tf

依托 TensorFlow 生态系统的模块化稳定实施。

AllenNLP

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

基于 PyTorch 构建的 Apache 2.0 NLP 研究库,用于开发各种语言任务的最新深度学习模型。

AllenNLP 支持转换编码器,实现为StackedSelfAttentionEncoder

encoder = StackedSelfAttentionEncoder(
     input_dim=EN_EMBEDDING_DIM,
     hidden_dim=HIDDEN_DIM,
     projection_dim=128,
     feedforward_hidden_dim=128,
     num_layers=1,
     num_attention_heads=8)

推荐阅读:使用 AllenNLP 构建 Seq2Seq 机器翻译模型

paddle paddle

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

PaddlePaddle(并行分布式深度学习)是一个易用、高效、灵活、可扩展的深度学习平台,最初由百度科学家和工程师开发,目的是将深度学习应用于百度的许多产品。

《注意力就是你需要的全部》中变形金刚模型的实现:英文中文

Sockeye

基于 Apache MXNet 的侧重于神经机器翻译的序列到序列框架。

Lingvo

Lingvo 是一个在 Tensorflow 中构建神经网络的框架,尤其是序列模型。

摘要

一个广泛使用的后端框架可以确保你的模型可以被很多人使用。如果框架背后有某种组织,那么这个框架很有可能会长期存在。所以我收集相关信息。

可能看到这篇文章的读者主要是研究人员和工程师。所以我把重点放在调试和部署的利弊上。

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

基于你对 PyTroch 或者 TensorFlow 的偏好,我推荐使用 Fairseq 或者 Tensor2Tensor。如果你是一名研究人员,Fairseq 在定制方面足够灵活。但如果是做一些真实的应用,考虑部署的话,选择 Tensor2Tensor 会更好。

查看我的其他帖子 一个分类查看
GitHub:
bramble Xu LinkedIn:徐亮 博客:bramble Xu

使用 Python 中的 Google Trends API 选择万圣节服装

原文:https://towardsdatascience.com/choosing-a-halloween-costume-using-the-google-trends-api-in-python-a3206b78a2a2?source=collection_archive---------30-----------------------

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

Photo by Pixabay on Pexels

在本帖中,我们将使用开源 python 库 pytrends 来看看今年哪些万圣节服装最受欢迎。

要开始,请打开命令行并键入:

pip install pytrends

接下来从 pytrends 导入趋势请求模块:

from pytrends.request import TrendReq

接下来,我们定义一个 pytrends 实例并构建 pytrends 有效负载,其中我们指定了想要搜索的关键字、时间段和地区。让我们从 2019 年 10 月 1 日到 2019 年 10 月 30 日在纽约用“小丑”建立一个谷歌搜索的有效载荷:

pytrends = TrendReq(hl='en-US', tz=360)
pytrends.build_payload(['Joker'], cat=0, timeframe='2019–10–01 2019–10-30',  gprop='',geo='US-NY')

我们可以获取一个数据框架,它给出了一段时间内与我们的关键词相关的搜索次数:

df = pytrends.interest_over_time()

我们可以打印数据帧的前 10 行:

print(df.head(10))

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

我们也可以画出整个时间序列。首先,我们需要将日期列中的日期转换为日期时间值:

import pandas as pd 
df['timestamp'] = df.index
df['timestamp'] = pd.to_datetime(df['timestamp'])

接下来,让我们导入“seaborn”并绘制时间序列的线图:

import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.lineplot(df['timestamp'], df['Joker'])
plt.title("Number of Google Searches for 'Joker' from October 1, 2019 to October 30, 2019")

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

现在让我们看看另一个使用不同关键字搜索的时间序列图。让我们搜索“特朗普万圣节”:

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

我们还可以定义一个函数,允许我们比较许多关键字的搜索次数:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pddef get_plot(key_words):
    pytrends = TrendReq(hl='en-US', tz=360)
    pytrends.build_payload([key_words], cat=0, timeframe='2019-10-01 2019-10-30',  gprop='',geo="US-NY")    
    df = pytrends.interest_over_time()  
    print(df.head(10))
    df['timestamp'] = df.index
    df['timestamp'] = pd.to_datetime(df['timestamp'])
    print(df.head())
    sns.set()
    ax = sns.lineplot(df['timestamp'], df[key_words], label = key_words)
    plt.ylabel("Number of Searchers")
    ax.legend()
    plt.show()

现在我们可以用许多不同的关键字调用这个函数。让我们坚持流行文化搜索:

get_plot("Kim Kardashian Costume")
get_plot("Taylor Swift Costume")
get_plot("Trump Costume")
get_plot("Joker Costume")

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

我们也可以尝试更传统的万圣节服装:

get_plot("Ghost Costume")
get_plot("Woody Costume")
get_plot("Iron Man Costume")
get_plot("Spiderman Costume")

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

为了对我们的结果做出决定,我们可以定义一个函数来返回给定关键字的搜索次数总和:

def get_sum(key_words):
    pytrends = TrendReq(hl='en-US', tz=360)
    pytrends.build_payload([key_words], cat=0, timeframe='2019-10-01 2019-10-30',  gprop='',geo="US-NY")    
    df = pytrends.interest_over_time()  
    print(df.head(10))
    df['timestamp'] = df.index
    df['timestamp'] = pd.to_datetime(df['timestamp'])
    print(df.head())
    return df[key_words].sum()

我们可以将结果存储在数据帧中并打印表格:

results = pd.DataFrame({"Kim Kardashian Costume":[get_sum("Kim Kardashian Costume")],"Taylor Swift Costume":[get_sum("Taylor Swift Costume"),
           "Trump Costume": [get_sum("Trump Costume")], "Joker Costume": [get_sum("Joker Costume")]})print(results)

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

看来赢家是小丑服装!你可以自己尝试更多的服装创意。这篇文章中的代码可以在 GitHub 上找到。我希望你喜欢!感谢阅读!

选择 Scikit-learn 线性回归算法

原文:https://towardsdatascience.com/choosing-a-scikit-learn-linear-regression-algorithm-dd96b48105f5?source=collection_archive---------8-----------------------

各种 Scikit-learn 线性回归算法的简要概述,以及它们通常对哪些情况最有效。包括一个汇总表和流程图,可以快速决定适合您的数据的模型。

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

任何线性回归算法的目标都是根据一组给定的输入要素准确预测输出值。在 python 中,有许多不同的库可以创建模型来执行这项任务;其中 Scikit-learn 是最流行和最健壮的。Scikit-learn 有数百个类,您可以使用它们来解决各种各样的统计问题。仅在线性回归领域,就有几种不同的算法可供选择。虽然实现和比较许多不同的算法通常是最佳实践,但是通常甚至很难知道从哪里开始。

这就是为什么我决定在 Scikit 中遍历线性回归算法——在一个位置学习和编译我的所有发现。本文包括一个概述每种模型类型的表格,以及一个流程图,您可以使用它来帮助确定下一个回归任务的起点。

表格和流程图中的信息主要来自于 Scikit-learn 文档、StackOverflow 答案以及我自己的一些本地测试。

通过导航到模型行的左侧并单击类似下图的图标,您可以打开一个包含所有模型信息的弹出窗口:

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

下表 about_columns.csv 对每个列字段进行了说明

建议在计算机上查看下表以了解完整功能。

以下流程图源自上表中汇编的信息。流程图的想法受到 Scikit-learn 的 选择正确的估计器 的启发,但这里的一个对 Scikit-learn 提供的各种线性回归算法进行了更深入的研究。

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

虽然这些资源有望帮助您开始使用 Scikit-learn 的大量线性回归算法,但它们绝对不能取代测试和分析几种不同模型的有效性的重要性。

如果您对如何使用上述任何算法有任何意见,请联系并分享!另外,如果您认为这篇文章有帮助,请务必告诉我。如果是这样,我将把我对 Scikit-learn 的分类和聚类算法的笔记也编成故事!

来源:

[## sci kit-learn:Python 中的机器学习— scikit-learn 0.21.2 文档

编辑描述

scikit-learn.org](https://scikit-learn.org/stable/index.html) [## Python 中如何选择机器学习模型?⋆给一颗星星编码

我们已经尝试了上一篇文章中的第一个数据科学项目。你感到兴奋吗?是啊,我们应该!但是我们有…

www.codeastar.com](https://www.codeastar.com/choose-machine-learning-models-python/) [## Python 和 R 语言中线性、脊和套索回归的综合初学者指南

我和我的一个朋友聊天,他碰巧是一家连锁超市的运营经理…

www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2017/06/a-comprehensive-guide-for-linear-ridge-and-lasso-regression/) [## ML 算法附录:被动攻击算法

被动积极算法是一系列在线学习算法(用于分类和回归)…

www.bonaccorso.eu](https://www.bonaccorso.eu/2017/10/06/ml-algorithms-addendum-passive-aggressive-algorithms/) [## 决策树回归

决策节点和叶节点。决策节点(例如,Outlook)有两个或更多分支(例如,晴天、阴天和…

saedsayad.com](http://saedsayad.com/decision_tree_reg.htm)

和各种堆栈溢出响应

你可以在这里找到我用来测试各种 Scikit-learn 线性回归算法的的框架的 Jupyter 笔记本

选择 TensorFlow/Keras、BigQuery ML 和 AutoML 自然语言进行文本分类

原文:https://towardsdatascience.com/choosing-between-tensorflow-keras-bigquery-ml-and-automl-natural-language-for-text-classification-6b1c9fc21013?source=collection_archive---------6-----------------------

Google 云平台上三种文本分类方法的比较

谷歌云平台为你提供了三种进行机器学习的方式:

  • Keras 使用 TensorFlow 后端来构建定制的深度学习模型,这些模型是在云 ML 引擎上训练的
  • BigQuery ML 仅使用 SQL 在结构化数据上构建定制的 ML 模型
  • Auto ML 根据你的数据训练最先进的深度学习模型,无需编写任何代码

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

根据你的技能,额外的准确性有多重要,以及你愿意在这个问题上投入多少时间/精力,在它们之间进行选择。使用 BigQuery ML 进行快速问题公式化、实验和简单、低成本的机器学习。一旦您使用 BQML 确定了一个可行的 ML 问题,就使用 Auto ML 来获得无代码的、最先进的模型。只有在你有大量数据和足够的时间/精力投入的情况下,才手工推出你自己的定制模型。

Choosing the ML method that is right for you depends on how much time and effort you are willing to put in, what kind of accuracy you need, and what your skillset is.

在这篇文章中,我将比较文本分类问题的三种方法,这样你就能明白我为什么推荐我所推荐的内容。

1.CNN +嵌入+退出 Keras

我在别处详细解释了问题和深度学习解决方案,所以这一节会非常简短。

任务是给定一篇文章的标题,我希望能够识别它是在哪里发表的。训练数据集来自黑客新闻上发布的文章(BigQuery 中有一个公开的数据集)。例如,下面是一些来源于 GitHub 的标题:

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

Training dataset

模型代码创建一个 Keras 模型,该模型使用一个单词嵌入层、卷积层和 dropout:

model = models.Sequential()
num_features = min(len(word_index) + 1, TOP_K)
model.add(Embedding(input_dim=num_features,
                    output_dim=embedding_dim,
                    input_length=MAX_SEQUENCE_LENGTH))model.add(Dropout(rate=dropout_rate))
model.add(Conv1D(filters=filters,
                              kernel_size=kernel_size,
                              activation='relu',
                              bias_initializer='random_uniform',
                              padding='same'))model.add(MaxPooling1D(pool_size=pool_size))
model.add(Conv1D(filters=filters * 2,
                              kernel_size=kernel_size,
                              activation='relu',
                              bias_initializer='random_uniform',
                              padding='same'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(rate=dropout_rate))
model.add(Dense(len(CLASSES), activation='softmax'))# Compile model with learning parameters.
optimizer = tf.keras.optimizers.Adam(lr=learning_rate)
model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['acc'])
estimator = tf.keras.estimator.model_to_estimator(keras_model=model, model_dir=model_dir, config=config)

然后在云 ML 引擎上进行训练,如本 Jupyter 笔记本所示:

gcloud ml-engine jobs submit training $JOBNAME \
 --region=$REGION \
 --module-name=trainer.task \
 --package-path=${PWD}/txtclsmodel/trainer \
 --job-dir=$OUTDIR \
 --scale-tier=BASIC_GPU \
 --runtime-version=$TFVERSION \
 -- \
 --output_dir=$OUTDIR \
 --train_data_path=gs://${BUCKET}/txtcls/train.tsv \
 --eval_data_path=gs://${BUCKET}/txtcls/eval.tsv \
 --num_epochs=5

我花了几天时间开发最初的 TensorFlow 模型,我的同事 vijaykr 花了一天时间对它进行修改以使用 Keras,可能还花了一天时间对它进行培训和故障排除。

我们有 80%的准确率。为了做得更好,我们可能需要更多的数据(92k 的例子不足以获得使用定制深度学习模型的好处),可能还需要更多的预处理(如删除停用词、词干、使用可重用的嵌入等)。).

2.用于文本分类的大查询 ML

当使用 BigQuery ML、卷积神经网络、嵌入等时。是(无论如何还不是)一个选项,所以我下降到使用一个单词袋的线性模型。BigQuery ML 的目的是提供一种快速、方便的方法来在结构化和半结构化数据上构建 ML 模型。

逐字拆分标题,并在标题的前 5 个单词上训练逻辑回归模型(即,线性分类器)(使用更多的单词不会有太大帮助):

#standardsql **CREATE OR REPLACE MODEL advdata.txtclass
OPTIONS(model_type='logistic_reg', input_label_cols=['source'])
AS**WITH extracted AS (
SELECT source, REGEXP_REPLACE(LOWER(REGEXP_REPLACE(title, '[^a-zA-Z0-9 $.-]', ' ')), "  ", " ") AS title FROM
  (SELECT
    ARRAY_REVERSE(SPLIT(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.'))[OFFSET(1)] AS source,
    title
  FROM
    `bigquery-public-data.hacker_news.stories`
  WHERE
    REGEXP_CONTAINS(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.com$')
    AND LENGTH(title) > 10
  )
), ds AS (
SELECT ARRAY_CONCAT(SPLIT(title, " "), ['NULL', 'NULL', 'NULL', 'NULL', 'NULL']) AS words, source FROM extracted
WHERE (source = 'github' OR source = 'nytimes' OR source = 'techcrunch')
)**SELECT 
source, 
words[OFFSET(0)] AS word1, 
words[OFFSET(1)] AS word2, 
words[OFFSET(2)] AS word3,
words[OFFSET(3)] AS word4,
words[OFFSET(4)] AS word5
FROM ds**

这很快。上面的 SQL 查询是完整的 enchilada。没什么更多的了。模型训练本身只用了几分钟。我得到了 78%的准确率,这与我用定制的 Keras CNN 模型得到的 80%的准确率相比相当不错。

一旦经过训练,使用 BigQuery 进行批量预测就很容易了:

SELECT * FROM ML.PREDICT(MODEL advdata.txtclass,(
SELECT 'government' AS word1, 'shutdown' AS word2, 'leaves' AS word3, 'workers' AS word4, 'reeling' AS word5)
)

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

BigQuery ML identifies the New York Times as the most likely source of an article that starts with the words “Government shutdown leaves workers reeling”.

使用 BigQuery 的在线预测可以通过将权重导出到 web 应用程序中来完成。

3.AutoML

我尝试的第三个选项是无代码选项,尽管如此,它使用了最先进的模型和底层技术。因为这是一个文本分类问题,要使用的自动 ML 方法是自动 ML 自然语言。

3a。启动 AutoML 自然语言

第一步是从 GCP web 控制台启动自动 ML 自然语言:

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

Launch AutoML Natural Language from the GCP web console

按照提示进行操作,将会创建一个存储桶来保存将用于训练模型的数据集。

3b。创建 CSV 文件,并在谷歌云存储上提供

BigQuery ML 要求您了解 SQL,而 AutoML 只要求您以该工具能够理解的格式之一创建数据集。该工具可以理解排列如下的 CSV 文件:

文本,标签

文本本身可以是包含实际文本的文件的 URL(如果您有多行文本,如评论或整个文档,这很有用),也可以是纯文本项目本身。如果您直接提供文本项字符串,您需要用引号将其括起来。

因此,我们的第一步是以正确的格式从 BigQuery 导出一个 CSV 文件。这是我的疑问:

WITH extracted AS (
SELECT STRING_AGG(source,',') as source, title FROM 
  (SELECT DISTINCT source, TRIM(LOWER(REGEXP_REPLACE(title, '[^a-zA-Z0-9 $.-]', ' '))) AS title FROM
    (SELECT
      ARRAY_REVERSE(SPLIT(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.'))[OFFSET(1)] AS source,
      title
    FROM
      `bigquery-public-data.hacker_news.stories`
    WHERE
      REGEXP_CONTAINS(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.com$')
      AND LENGTH(title) > 10
    )
  )
GROUP BY title
)SELECT title, source FROM extracted
WHERE (source = 'github' OR source = 'nytimes' OR source = 'techcrunch')

这产生了以下数据集:

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

Dataset for Auto ML

注意,我去掉了标点符号和特殊字符。空白已经被修剪,SELECT distinct 用于丢弃出现在多个类中的重复项和文章(AutoML 会警告您有重复项,并且可以处理多类标签,但是删除它们会更干净)。

我使用 BigQuery UI 将查询结果保存为一个表:

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

Save the query results as a table

然后将表格导出到 CSV 文件:

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

Export the table data to the Auto ML bucket

3c。创建自动 ML 数据集

下一步是使用 Auto ML UI 从云存储上的 CSV 文件创建数据集:

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

Create a dataset from the CSV file on Cloud Storage

该数据集需要大约 20 分钟来摄取。最后,我们得到一个充满文本项的屏幕:

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

The dataset after loading

当前的 Auto ML 限制是 100k 行,所以我们的 92k 数据集肯定会超出一些限制。数据集越小,消化得越快。

为什么我们有一个标签叫“来源”只有例子?CSV 文件有一个标题行(source,title ),它也已经被摄取了!幸运的是,AutoML 允许我们在 GUI 本身中编辑文本项。所以,我删除了多余的标签和相应的文字。

3d。火车

培训就像点击一个按钮一样简单。

Auto ML 然后继续尝试各种嵌入和各种架构,并进行超参数调整,以提出解决问题的好办法。

需要 5 个小时。

3e。估价

一旦训练好模型,我们就得到一堆评价统计数据:精度、召回率、AUC 曲线等。但是我们也得到实际的混淆矩阵,从中我们可以计算任何我们想要的东西:

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

总体准确率约为 86%,甚至高于我们定制的 Keras CNN 模型。为什么?因为 Auto ML 能够利用基于谷歌语言使用数据集的模型的迁移学习,即包括我们在 Keras 模型中没有的数据。此外,由于所有数据的可用性,模型架构可以更加复杂。

3f。预言;预测;预告

已训练的 AutoML 模型已经部署并可用于预测。我们可以向它发送一个请求,并获取文章的预测来源:

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

Predictions from Auto ML

请注意,该模型比 BQML 模型更有信心(尽管两者给出了相同的正确答案),这种信心是由以下事实驱动的:该 Auto ML 模型是在更多数据上训练的,并且是专门为文本分类问题构建的。

我试了一下《今日头条》的另一篇文章标题,模型显示它来自 TechCrunch:

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

Correctly identifies the title as being from a TechCrunch article.

摘要

虽然这篇文章主要是关于文本分类的,但是一般的结论和建议适用于大多数的 ML 问题:

  • 使用 BigQuery ML 进行简单、低成本的机器学习和快速实验,看看 ML 在您的数据上是否可行。有时候,使用 BQML 获得的准确性已经足够了,您可以就此打住。
  • 一旦您使用 BQML 确定了一个可行的 ML 问题,就使用 Auto ML 来获得无代码的、最先进的模型。例如,文本分类是一个非常专业的领域,具有高维输入。因此,使用定制的解决方案(例如,Auto ML 自然语言)比只使用单词袋的结构化数据方法做得更好。
  • 只有在你有大量数据和足够的时间/精力投入的情况下,才手工推出你自己的定制模型。使用 AutoML 作为基准。如果,经过一些合理的努力,你不能击败自动 ML,停止浪费时间。用自动 ML 就行了。

在 GCP 进行机器学习还有其他一些方法。可以在 ML 引擎中做 xgboost 或者 scikit-learn。深度学习 VM 支持 PyTorch。Spark ML 在 Cloud Dataproc 上运行良好。当然,你可以使用谷歌计算引擎或谷歌 Kubernetes 引擎,并安装任何你想要的 ML 框架。但是在这篇文章中,我将集中讨论这三个。

感谢Greg Mikels改进了我的原始 AutoML 查询,删除了重复和交叉发布的文章。

为您的实际问题选择正确的算法

原文:https://towardsdatascience.com/choosing-the-right-algorithm-for-your-real-world-problem-ebd4d0608ad5?source=collection_archive---------16-----------------------

苹果 | 谷歌 | SPOTIFY | 其他 | 剪辑

Tan Vachiramon 在 TDS 播客

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

编者按:这是迈向数据科学播客“攀登数据科学阶梯”系列的第二集,由 Jeremie Harris、Edouard Harris 和 Russell Pollari 主持。他们一起经营一家名为sharpes minds的数据科学导师创业公司。可以听下面的播客:

你导入你的数据。你清理你的数据。你制作你的基线模型。

然后,你调整你的超参数。您可以在随机森林和 XGBoost 之间来回切换,添加特性选择,并进行更多的调优。你的模特的表现越来越好。

最终,你会想到:我什么时候停止?

大多数数据科学家经常会纠结于这个问题,从我和 SharpestMinds 一起工作的经历来看,绝大多数有抱负的数据科学家的答案都是错误的。这就是为什么我们采访了空间人工智能团队 Oculus 的成员、Airbnb 的前数据科学家 Tan Vachiramon。

谭看到了数据科学在两个非常不同的行业环境中的应用:一次,作为团队的一部分,他们的工作是在用户增长失控的旋风中找出如何了解他们的客户群(在 Airbnb);同样,在这种情况下,他可以在可控的环境下(在 Oculus)奢侈地进行更加严格的数据科学实验。

从我们的谈话中,我最大的收获是:如果你对在一家公司工作感兴趣,花一些时间考虑他们的业务背景是值得的,因为这是推动你在那里从事数据科学的最重要的因素。具体来说:

  • 快速增长的公司的数据科学面临一种特殊的挑战,这种挑战并不明显:因为它们增长如此之快,无论你从哪里看,*一切看起来都与增长相关!*新的推介活动?“这肯定让数字上升了!”新用户入职策略?“哇,这招太管用了!”。因为产品正在起飞,你需要特殊的策略来确保你不会将你感兴趣的公司计划的有效性与产品已经经历的固有的病毒式增长相混淆。
  • 您花费在调优或选择模型,或者选择特性上的时间完全取决于业务环境。在一些公司(比如早期的 Airbnb),超精确的算法没有让你理解你的数据集中到底发生了什么的算法有价值。只要商业决策不依赖于获得小数点后第二位数的准确性,建立一个快速模型并继续前进是可以的(甚至是关键的)。在这些情况下,即使是逻辑回归也能奏效!
  • 在其他情况下,数千万美元取决于您可以从您的模型中挤出的每一个小数点的准确性(投资银行,广告优化),预计将在调整/建模上花费更多时间。归根结底,这是一个机会成本的问题:不断问自己,如果你现在结束模型调整,去做其他事情,你是否能为企业创造更多价值。如果你认为答案可能是肯定的,那么考虑打电话离开。

**结果:**因为他们通常是房间里唯一能够真正理解客户偏好和行为背后的统计数据的人,数据科学家有独特的责任保持商业意识。如果您想要确保您为您的用例选择了最佳的模型(简单的或复杂的,可解释的或其他的)和最佳的工作流,理解您的团队依赖于您产生的商业价值是至关重要的。

如果你试图进入数据科学领域,或者重返就业市场,这是一件需要记住的重要事情:你的面试官希望看到你有能力同时解决数据科学问题和商业问题的证据。很少有人能做到这一点,因此它可以成为你最重要的竞争优势之一。

TDS 播客—剪辑

如果你在 Twitter 上,请随时与我联系 @jeremiecharris

Chrome V8 版本 8.0——V8——期待什么?

原文:https://towardsdatascience.com/chrome-v8-version-8-0-v8-what-to-expect-11094d45411e?source=collection_archive---------11-----------------------

最受期待的 chrome 版本 V8 发布了期待已久的 v8.0,并将于 2 月份与 chrome 80 一起发布。

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

8.0 版本增加了一些新功能,如可选链接、无效合并更快的高阶内置功能减少 40%的内存使用由于指针压缩,这些功能和变化将提高性能和代码生产率。

让我们一个一个来看——

可选链接(?。)

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

Photo by Wen Zhu on Unsplash

当访问嵌套的对象属性时,我们需要手动检查属性是否存在,即它们是否为空(nullundefined)。

// Error prone-version, could throw.
const nameLength = db.user.name.length;TypeError: Cannot read property 'length' of undefined, if user is nullish

如果它们是 nullish,我们试图访问它,JavaScript 将抛出一个错误:TypeError: Cannot read property 'property name' of undefined

在许多情况下,当一个对象被大量嵌套时,if条件或三元运算符检查会变得冗长,并且会产生所有真值而不仅仅是非空值的不良后果,如下所示

// Less error-prone, but harder to read.let nameLength;
if (db && db.user && db.user.name)
  nameLength = db.user.name.length;// ORnameLength =
  (db
    ? (db.user
      ? (db.user.name
        ? db.user.name.length
        : undefined)
      : undefined)
    : undefined);

可选链接(?.)帮助我们解决上述问题。

它帮助我们编写更少的代码,并获得一个健壮的属性访问链,易于阅读和检查中间值是否为空。如果是,那么整个表达式的计算结果为undefined

const nameLength = db?.user?.name?.length;

我们可以在以下三种形式中使用可选链接。

  1. object?.property —用于访问静态属性,如上所述。
  2. object?.[expression] —用于访问动态属性或数组项
const array = null;
array?.[0]; // => undefined

3.object?.([arg1, [arg2, ...]]) —执行一个对象方法

const object = null;
object?.method('Some value'); // => undefined

如果您需要,可以将这些形式组合起来创建一个长的可选链:

const value = object.maybeUndefinedProp?.maybeNull()?.[propName];

无效合并(??)

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

Nullish coalescing (??)

这是一个新的短路操作符,用来处理默认值。

目前,默认值有时用逻辑||处理 falsy 值,用&&操作符处理 truthy 值,如下例所示。

function test(props) {
  const res = props.isTrue || true; 
  // return true if props.isTrue is set to false also, 
  // whereas the required result should be the value of props.isTrue
 }

使用 nullish 合并运算符,当a为 nullish ( nullundefined)时,a ?? b计算为b,否则计算为a

所以在上面的例子中—

function test(props) {
  const res = props.isTrue ?? true;
  // return true only when props.isTrue is nullish or true
  // In case of false it evalutes to false
}

nullish 合并操作符和可选的链接是相伴的特性,可以很好地协同工作。可以进一步修改该示例,以处理没有传入props参数的情况。

function test(props) {
  const enable = props?.isTrue ?? true;
  // …
}

更快的高阶内置

要理解上面的性能优化,就要了解 V8 的涡扇。所以我们赶紧来看看是什么。

涡扇是一个 JIT 编译器架构师,作为 V8 中的多层翻译和优化管道,翻译和优化代码,以逐步降低形式,直到生成更高质量的机器代码。它用了一个概念叫做 【节点之海】

const charCodeAt = Function.prototype.apply.bind(String.prototype.charCodeAt);// before
charCodeAt(string, 8); // a lot slower
string.charCodeAt(8); // a lot faster// After optimization - same performance
charCodeAt(string, 8);
string.charCodeAt(8);

到目前为止,对charCodeAt的调用对于涡扇来说是完全不透明的,这导致了对用户定义函数的通用调用的生成。

有了这个新的变化,我们现在能够识别内置String.prototype.charCodeAt函数的调用,并因此能够触发所有的进一步优化,以改善对内置的调用,这导致了与直接使用内置相同的性能。

指针压缩

令人敬畏的 V8 团队在检查堆时发现,标记值(代表指针或小整数)占据了堆的大部分!

通过进一步检查,他们发现标记值与系统指针一样大:对于 32 位体系结构,它们是 32 位宽,而在 64 位体系结构中是 64 位。然后,当比较 32 位版本和 64 位版本时,我们为每个标记值使用了两倍的堆内存。

因此,为了解决上述问题,他们只将唯一的低位存储到堆中,然后使用它们来生成 64 位架构的高位,从而节省了宝贵的内存资源。

上述解决方案提高了 V8 和垃圾收集器在真实网站上的性能!

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

Some of the result shared by V8 Team

因此,我们可以期待 v8 版本的整体速度提升和一些很酷的 javascript 特性。

阅读更多关于 v8 的信息—https://v8.dev/docs

如果你喜欢这篇文章,请随意分享并帮助他人找到它!

如果您想加入我的电子邮件列表,请考虑在此输入您的电子邮件地址 和关注我的 媒体 阅读更多关于 javascript 和github的文章,查看我的疯狂代码。如果有什么不清楚或者你想指出什么,请在下面评论。

你可能也会喜欢我的其他文章

  1. Javascript 新特性—第 1 部分
  2. 使用 JavaScript API 的人脸检测— face-api.js
  3. 除 Console.log()以外的 8 个控制台 API 函数

谢谢!

年代表示法

原文:https://towardsdatascience.com/chronological-representation-d2c4b93c6da9?source=collection_archive---------23-----------------------

神经网络怎么会有时序记忆?

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

了解事件发生的时间顺序对于了解因果关系、制定计划、同步社会活动以及许多其他原因至关重要。然而,对于神经科学家来说,理解时间在大脑中是如何表示的,以及人工智能研究人员来说,让代理能够在不断变化的环境中工作,仍然是一个巨大的挑战。

通常认知科学家与物理学家不同,对待时间与对待空间完全不同。神经科学家已经发现了许多负责昼夜节律、心跳、脑电波和其他周期性生物“时钟”的机制,以及毫秒级计时器。然而,人工智能主体的事件记忆的产生和存储以及时间的表示仍然是一个未解决的问题。

大多数人工智能算法基本上将时间序列视为每 X 秒拍摄的环境快照,而事件则存储为输入的直接副本或一些中间表示。在许多情况下,这种策略工作得很好,但它相当原始。最近的一项工作将微分方程与神经网络相结合,以显著提高它们处理不同间隔采样的数据的能力。

另一方面,大脑中事件记忆的工作通常与海马体有关。虽然在海马体中产生的动物位置的空间表示已经很好理解,但是时间部分仍然是一个问题。我们可以确定的是:海马体在整个生命过程中保持着或多或少稳定的神经发生,其中的神经元可以迁移。只有这两种机制,加上所有神经元都喜欢生长的突触和希伯仑学习,可以提供一个灵活的解决方案。

想象一下下面的场景。你生成神经元的速度与兴奋程度或其他情绪状态成正比,这表明当前环境中包含了多少新的潜在有用信息。然后,每次神经元准备好了,就创建到整个大脑的活动表示以及先前生成的神经元的链接。

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

你最终会得到一串神经元,它们按时间顺序代表了代理人的所有经历以及它们之间的联系。直觉上,这类似于经验的区块链。下一步是什么?例如,您可以通过在睡眠期间丢弃包含最少量信息的时间步长来优化它,以提高链中的搜索速度。或者,您可以添加更多的机制来调节节点之间的连接强度,例如,如果两个节点创建之间的时间间隔更短,则连接会更强。

大脑是这样储存记忆的吗?我不知道,但我想海马体也有类似的功能。它与现有的关于时间记忆的研究兼容吗?我也这么认为

资源

  • —《神经常微分方程》,作者:Ricky T. Q. Chen,Yulia Rubanova,Jesse Bettencourt,David Duvenaud
  • arxiv.org/1901.03559——阿瑟·古兹、迈赫迪·米尔扎、凯罗尔·格雷戈、里沙卜·卡巴拉、塞巴斯蒂安·拉卡尼埃、瑟奥法纳·韦伯、大卫·拉波索、亚当·桑托罗、洛朗·奥尔索、汤姆·埃克尔斯、格雷格·韦恩、大卫·西尔弗、蒂莫西·利利卡普的《无模型规划的调查》
  • cshperspectives.cshlp.org/7/2/a021808.full——《位置细胞、网格细胞和记忆》,作者迈·布里特·莫泽、大卫·c·罗兰、爱德华·I·莫泽

流失预测

原文:https://towardsdatascience.com/churn-prediction-3a4a36c2129a?source=collection_archive---------2-----------------------

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

使用 Python 实现数据驱动的增长

基于 XGBoost 二元分类的流失预测

这一系列文章旨在解释如何以一种简单的方式使用 Python,通过将预测方法应用于您的所有行动来推动您公司的发展。它将是编程、数据分析和机器学习的结合。

我将在以下九篇文章中讨论所有主题:

1- 了解你的衡量标准

2- 客户细分

3- 客户终身价值预测

4-流失预测

5-预测下一个购买日

6-预测销售额

7-市场反应模型

8-隆起建模

9- A/B 测试设计和执行

文章将有自己的代码片段,使您可以轻松地应用它们。如果你是编程的超级新手,你可以在这里很好地介绍一下 PythonPandas (一个我们将在任何事情上使用的著名库)。但是仍然没有编码介绍,您可以学习概念,如何使用您的数据并开始从中产生价值:

有时候你得先跑,然后才能走——托尼·斯塔克

作为先决条件,确保你的电脑上安装了 J upyter Notebook 和 P ython 。代码片段只能在 Jupyter 笔记本上运行。

好吧,我们开始吧。

第 4 部分:流失预测

在数据驱动增长系列的最后三节中,我们发现了跟踪基本指标客户细分,以及以编程方式预测生命周期价值。既然我们通过细分和终身价值预测了解我们的最佳客户,我们也应该努力留住他们。这使得留存率成为最重要的指标之一。

保留率是你的产品市场适合度的一个指标(PMF)。如果你的 PMF 不令人满意,你应该看到你的客户很快就会流失。提高保留率(即 PMF)的有力工具之一是客户流失预测。通过使用这种技术,你可以很容易地找出谁有可能在特定时期流失。在本文中,我们将使用一个电信数据集,并按照以下步骤开发一个客户流失预测模型:

  • 探索性数据分析
  • 特征工程
  • 用逻辑回归研究特征如何影响记忆
  • 用 XGBoost 构建分类模型

探索性数据分析

我们首先检查我们的数据看起来如何,并想象它如何与我们的标签交互(搅动与否?).让我们从导入数据开始,打印前十行:

df_data = pd.read_csv('churn_data.csv')
df_data.head(10)

输出:

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

查看所有列及其数据类型的更好方法是使用**。info()** 方法:

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

我们的数据似乎分为两类:

  • 分类特征:性别、流媒体电视、支付方式等。
  • 数字特征:任期,每月收费,总费用

现在,从分类开始,我们阐明所有特征,看看它们对识别客户是否会流失有多大帮助。

顺便提一下,在我们拥有的数据集中,流失列是带有是/否值的字符串。我们将它转换为整数,以便在我们的分析中更容易使用。

df_data.loc[df_data.Churn=='No','Churn'] = 0 
df_data.loc[df_data.Churn=='Yes','Churn'] = 1

性别

通过使用下面的代码块,我们可以很容易地看到每个值的流失率(1-保留率)的样子:

df_plot = df_data.groupby('gender').Churn.mean().reset_index()
plot_data = [
    go.Bar(
        x=df_plot['gender'],
        y=df_plot['Churn'],
        width = [0.5, 0.5],
        marker=dict(
        color=['green', 'blue'])
    )
]plot_layout = go.Layout(
        xaxis={"type": "category"},
        yaxis={"title": "Churn Rate"},
        title='Gender',
        plot_bgcolor  = 'rgb(243,243,243)',
        paper_bgcolor  = 'rgb(243,243,243)',
    )
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)

输出:

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

Churn Rate by Gender

流失率的性别细分:

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

女性客户比男性客户更容易流失,但这种差异很小(约 0.8%)。

让我们对所有分类列重复这个过程。为了不重复我们对性别所做的,你可以在下面找到所有需要的代码:

现在,我们来了解一下这些特性,这些特性显示了它们之间最显著的价值差异:

互联网服务

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

Churn Rate by Internet Service

该图表显示,使用光纤作为互联网服务的客户更有可能流失。我通常预计光纤客户流失会更少,因为他们使用更优质的服务。但这可能是由于高价格、竞争、客户服务和许多其他原因造成的。

合同

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

Churn Rate by Contract

不出所料,合同越短意味着流失率越高。

技术支持

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

Churn Rate by Tech Support

不使用技术支持的客户更有可能流失(相差约 25%)。

付款方式

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

自动支付使客户更有可能留在你的平台上(大约 30%的差异)。

其他

让我们在这里展示一些其他特性的图表以供参考:

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

Churn Rate by Paperless Billing, Streaming Movies, Device Protection & Phone Service

我们完成了分类特征。让我们看看数字特征是什么样的:

任期

要了解任期和平均流失率之间的趋势,让我们构建一个散点图:

df_plot = df_data.groupby('tenure').Churn.mean().reset_index()plot_data = [
    go.Scatter(
        x=df_plot['tenure'],
        y=df_plot['Churn'],
        mode='markers',
        name='Low',
        marker= dict(size= 7,
            line= dict(width=1),
            color= 'blue',
            opacity= 0.8
           ),
    )
]plot_layout = go.Layout(
        yaxis= {'title': "Churn Rate"},
        xaxis= {'title': "Tenure"},
        title='Tenure based Churn rate',
        plot_bgcolor  = "rgb(243,243,243)",
        paper_bgcolor  = "rgb(243,243,243)",
    )
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)

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

Churn Rate by Tenure

显而易见,任期越长意味着流失率越低。我们将对*月费用和总费用:*应用相同的方法

输出:

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

Churn Rate by Monthly & Total Charges

不幸的是,流失率和每月及总费用之间没有趋势。

特征工程

在本节中,我们将转换我们的原始特征,以从中提取更多信息。我们的策略如下:

1-使用聚类技术对数字列进行分组

2-将标签编码器应用于二进制分类特征

3-将 get_dummies() 应用于具有多个值的分类特征

数值列

正如我们从 EDA 部分了解到的,我们有三个数字列:

  • 任期
  • 每月费用
  • 总费用

我们将应用以下步骤来创建组:

  1. 用肘法确定适当的聚类数
  2. 将 K-means 逻辑应用于所选列并更改命名
  3. 观察集群的轮廓

让我们看看这在实践中是如何适用于任期的:

群集配置文件:

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

我们有 3 个集群,平均任期分别为 7.5 年、33.9 年和 63 年。

每个集群的流失率:

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

Churn Rate by tenure clusters

这是对每月费用和总费用进行同样处理后的效果:

月费:

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

Monthly Charge Clusters profile

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

Churn Rate by monthly charge clusters

总费用:

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

Total Charge Clusters profile

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

Churn Rate by total charge clusters

分类列

标签编码器通过简单地将整数分配给不同的值,将分类列转换为数字列。例如,性别列有两个值:女性 & 男性。标签编码器会将其转换为 1 和 0。

get_dummies() 方法通过分配 0&1 来从分类列中创建新列(您可以在我们的上一篇文章中找到准确的解释)

让我们在实践中看到这两者:

#import Label Encoder
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
dummy_columns = [] #array for multiple value columnsfor column in df_data.columns:
    if df_data[column].dtype == object and column != 'customerID':
        if df_data[column].nunique() == 2:
            #apply Label Encoder for binary ones
            df_data[column] = le.fit_transform(df_data[column]) 
        else:
            dummy_columns.append(column)#apply get dummies for selected columns
df_data = pd.get_dummies(data = df_data,columns = dummy_columns)

查看所选列的数据外观:

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

如您所见,性别 & 合作伙伴列变成了数字列,并且我们为 TenureCluster 增加了三个新列。

是时候拟合一个逻辑回归模型并提取洞察力来做出更好的商业决策了。

逻辑回归

预测流失是一个二元分类问题。在一定时期内,客户要么流失,要么保留。作为一个稳健的模型,逻辑回归也提供了可解释的结果。正如我们之前所做的,让我们整理出构建逻辑回归模型的步骤:

  1. 准备数据(模型的输入)
  2. 拟合模型并查看模型摘要

摘要如下所示:

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

我们从这份报告中得到了两个重要的结果。当您准备客户流失预测模型时,您将面临以下问题:

1-哪些特征会让客户流失或保留?

2-最关键的是什么?我们应该关注什么?

对于第一个问题,您应该查看第 4 列(P>|z|)。如果绝对 p 值小于 0.05,这意味着该特征以统计显著的方式影响客户流失。例如:

  • 老年人
  • 互联网服务 _DSL
  • OnlineSecurity_NO

然后第二个问题。我们想降低流失率,应该从哪里着手?这个问题的科学版是;

如果我增加/减少一个单位,哪个特性会带来最好的 ROI?

这个问题可以通过查看 T21 专栏来回答。如果我们改变一个单位,指数系数会给出流失率的预期变化。如果我们应用下面的代码,我们将看到所有系数的转换版本:

np.exp(res.params)

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

例如,如果我们保持其他一切不变,每月费用的一个单位变化意味着搅动的几率提高了约 3.4%。从上表中,我们可以快速确定哪些功能更重要。

现在,构建分类模型的一切都准备好了。

基于 XGBoost 的二元分类模型

为了使 XGBoost 适合我们的数据,我们应该准备特征(X)和标签(y)集,并进行训练和测试分割。

#create feature set and labels
X = df_data.drop(['Churn','customerID'],axis=1)
y = df_data.Churn#train and test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.05, random_state=56)#building the model & printing the score
xgb_model = xgb.XGBClassifier(max_depth=5, learning_rate=0.08, objective= 'binary:logistic',n_jobs=-1).fit(X_train, y_train)print('Accuracy of XGB classifier on training set: {:.2f}'
       .format(xgb_model.score(X_train, y_train)))
print('Accuracy of XGB classifier on test set: {:.2f}'
       .format(xgb_model.score(X_test[X_train.columns], y_test)))

通过使用这个简单的模型,我们达到了 81%的准确率:

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

我们在数据集中的实际流失率是 26.5%(反映为模型性能的 73.5%)。这表明我们的模型是有用的。最好检查一下我们的分类模型,看看我们的模型到底在哪里失败了。

y_pred = xgb_model.predict(X_test)
print(classification_report(y_test, y_pred))

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

我们可以这样理解上面的报告,就好像我们的模型告诉我们,100 个客户会流失,其中 67 个会流失(精度 0.67)。实际上,大约有 220 名客户会流失(0.45 次召回)。特别是召回是这里的主要问题,我们可以通过以下方式提高模型的整体性能:

  • 添加更多数据(对于这个例子,我们有大约 2k 行)
  • 添加更多功能
  • 更多功能工程
  • 尝试其他模型
  • 超参数调谐

接下来,让我们详细看看我们的模型是如何工作的。首先,我们想知道我们的模型确切地使用了数据集中的哪些特征。还有,哪些是最重要的?

为了解决这个问题,我们可以使用下面的代码:

from xgboost import plot_importance
fig, ax = plt.subplots(figsize=(10,8))
plot_importance(xgb_model, ax=ax)

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

Features importance for XGBoost Model

我们可以看到,与其他模型相比,我们的模型更重视总费用和月费用。

最后,使用该模型的最佳方式是为每个客户分配流失概率,创建细分市场,并在此基础上制定策略。要从我们的模型中获得流失概率,请使用下面的代码块:

df_data['proba'] = xgb_model.predict_proba(df_data[X_train.columns])[:,1]

我们的数据集最后看起来如下:

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

Churn Probabilities of the customers

现在,我们知道在我们的最佳细分市场中是否有可能流失客户(回想一下第 2 部分第 3 部分,我们可以据此制定行动。在下一篇文章中,我们将重点预测客户的下一个购买日。

你可以在这里找到这部分的 Jupyter 笔记本。

需要帮助来发展你的公司吗?点击此处与我预约免费课程

流失预测

原文:https://towardsdatascience.com/churn-prediction-770d6cb582a5?source=collection_archive---------2-----------------------

了解如何为流失预测训练决策树模型。

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

Photo by Mantas Hesthaven on Unsplash

客户流失,也称为客户流失,发生在客户停止与公司做生意的时候。这些公司对确定这些客户的细分感兴趣,因为获得一个新客户的价格通常比留住老客户的价格高。例如,如果网飞知道有一部分客户有流失的风险,他们就可以主动用特别优惠吸引他们,而不是简单地失去他们。

在本帖中,我们将使用电信客户流失数据集创建一个简单的客户流失预测模型。我们选择了一个决策树来模拟被搅动的顾客,熊猫用于数据处理, matplotlib 用于可视化。我们将使用 Python 来完成以上所有工作。
该代码可用于另一个数据集,稍加调整即可训练基线模型。我们还提供了一些参考资料,并给出了新功能和改进的想法。

你可以通过下载这个 Jupyter 笔记本来运行这段代码。

这里有几个你可能会感兴趣的链接:

- [Complete your Python analyses 10x faster with Mito](https://trymito.io/) [Product]- [Free skill tests for Data Scientists & ML Engineers](https://aigents.co/skills) [Test]- [All New Self-Driving Car Engineer Nanodegree](https://imp.i115008.net/c/2402645/1116216/11298)[Course]

你愿意多看一些这样的文章吗?如果是这样,你可以点击上面的任何链接来支持我。其中一些是附属链接,但你不需要购买任何东西。

数据预处理

我们使用 pandas 来读取数据集并对其进行预处理。电信数据集每行有一个客户,有许多列(特征)。不存在所有值都缺失或重复的行(现实世界的数据集很少出现这种情况)。有 11 个样本的总费用设置为“”,这似乎是数据中的错误。我们移除这些样本,并将类型设置为 numeric (float)。

df = pd.read_csv('data/WA_Fn-UseC_-Telco-Customer-Churn.csv')df = df.dropna(how=”all”) # remove samples with all missing values
df = df[~df.duplicated()] # remove duplicatestotal_charges_filter = df.TotalCharges == " "
df = df[~total_charges_filter]
df.TotalCharges = pd.to_numeric(df.TotalCharges)

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

First few samples in Telco Customer Churn dataset

探索性数据分析

数据集中有两种类型的特征:分类特征(两个或多个值,没有任何顺序)和数值特征。大多数特性名称都是不言自明的,除了:

  • 合作伙伴:客户是否有合作伙伴(是,否),
  • 家属:客户是否有家属(是,否),
  • 在线备份:客户是否有在线备份(是,否,无互联网服务),
  • 任期:客户在公司呆的月数,
  • 月费:每月向客户收取的金额。
  • 总费用:向客户收取的总费用。

数据集中有 7032 个客户,19 个特征没有 customerID(非信息)和流失列(目标变量)。大多数分类特征具有 4 个或更少的唯一值。

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

Dataset Summary

我们将特性合并到两个列表中,以便我们可以联合分析它们。

categorical_features = [
 “gender”,
 “SeniorCitizen”,
 “Partner”,
 “Dependents”,
 “PhoneService”,
 “MultipleLines”,
 “InternetService”,
 “OnlineSecurity”,
 “OnlineBackup”,
 “DeviceProtection”,
 “TechSupport”,
 “StreamingTV”,
 “StreamingMovies”,
 “Contract”,
 “PaperlessBilling”,
 “PaymentMethod”,
]
numerical_features = [“tenure”, “MonthlyCharges”, “TotalCharges”]
target = “Churn”

数字特征分布

数字汇总技术(平均值、标准偏差等。)不要告诉我们尖峰,分布的形状,很难观察到异常值。这就是我们使用直方图的原因。

df[numerical_features].describe()

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

Summary of numerical features

乍一看,数据中没有任何异常值。没有数据点脱离分布或离平均值太远。为了确认这一点,我们需要计算四分位间距(IQR) ,并显示每个数值特征的值在第一个和第三个四分位的 1.5 IQR 范围内。

我们可以将数字特征转换成有序区间。例如,保有权是数字,但我们通常不关心小的数字差异,而是将客户的保有权分为短期、中期和长期保有权。转换它的一个原因是为了减少噪音,通常小的波动只是噪音。

df[numerical_features].hist(bins=30, figsize=(10, 7))

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

Histograms of numerical features

我们着眼于与目标变量相关的数字特征的分布。我们可以观察到,总费用和任期越大,流失的可能性就越小。

fig, ax = plt.subplots(1, 3, figsize=(14, 4))
df[df.Churn == "No"][numerical_features].hist(bins=30, color="blue", alpha=0.5, ax=ax)
df[df.Churn == "Yes"][numerical_features].hist(bins=30, color="red", alpha=0.5, ax=ax)

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

Numerical features in relation to the target variable

分类特征分布

为了分析分类特征,我们使用条形图。我们观察到,老年人和没有电话服务的客户在数据中较少出现。

ROWS, COLS = 4, 4
fig, ax = plt.subplots(ROWS, COLS, figsize=(18, 18))
row, col = 0, 0
for i, categorical_feature in enumerate(categorical_features):
    if col == COLS - 1:
        row += 1
    col = i % COLS
    df[categorical_feature].value_counts().plot('bar', ax=ax[row, col]).set_title(categorical_feature)

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

Distribution of categorical features

下一步是查看与目标变量相关的分类特征。我们这样做只是为了合同特征。月结合同的用户比长期合同的用户更容易流失。

feature = ‘Contract’
fig, ax = plt.subplots(1, 2, figsize=(14, 4))
df[df.Churn == “No”][feature].value_counts().plot(‘bar’, ax=ax[0]).set_title(‘not churned’)
df[df.Churn == “Yes”][feature].value_counts().plot(‘bar’, ax=ax[1]).set_title(‘churned’)

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

Contract feature in relation to the target variable

目标变量分布

目标变量分布表明,我们正在处理一个不平衡的问题,因为有更多的非搅动用户和搅动用户。该模型将实现高准确性,因为它将主要预测多数类——在我们的示例中没有流失的用户。

我们可以做一些事情来最小化不平衡数据集的影响:
-重新采样数据(不平衡-学习),
-收集更多的样本,
-使用精度和召回作为准确性度量。

df[target].value_counts().plot('bar').set_title('churned')

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

Target variable distribution

特征

电信数据集已经按 customerID 分组,因此很难添加新功能。在进行客户流失预测时,我们通常会得到一个数据集,每个客户会话(特定时间内的客户活动)都有一个条目。然后,我们可以添加如下功能:

  • 买东西之前的会话次数,
  • 每次会话的平均时间,
  • 会话之间的时间差(频繁或不频繁的客户),
  • 仅是一个国家的客户。

有时,我们甚至有客户事件数据,这使我们能够找到与结果(流失)相关的客户行为模式。

编码功能

为了给客户流失建模准备数据集,我们需要将分类特征编码成数字。这意味着对*【是】**【否】*到 01 进行编码,以便算法可以处理数据。这个过程叫做 onehot 编码

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

One hot encoded categorical features

分类者

我们使用 Python 中的机器学习库 sklearn 来创建分类器。
sk learn 方式是使用定义特征处理和分类器的管道。在我们的示例中,管道在输入中获取数据集,它预处理特征并训练分类器。
训练时,它接受相同的输入,并在输出中返回预测。

在流水线中,我们分别处理分类特征和数字特征。我们一次性对分类特征进行编码,并通过去除平均值和将它们缩放到单位方差来缩放数字特征。
我们选择决策树模型是因为它的可解释性,并将最大深度设置为 3(任意)。

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

The pipeline takes a dataset in the input, it preprocesses features and trains the classifier

训练模型

我们将数据集分为训练(75%样本)和测试(25%样本)。
我们训练(拟合)管道并进行预测。使用 classification_report,我们用实际值和预测值计算精度和召回率。

from sklearn.model_selection import train_test_splitdf_train, df_test = train_test_split(df, test_size=0.25, random_state=42)pipeline.fit(df_train, df_train[target])
pred = pipeline.predict(df_test)

测试模型

通过分类 _ 报告我们用实际值和预测值计算精度和召回率。

对于类别 1(搅动的用户),模型实现了 0.67 的精确度和 0.37 的召回率。Precision 告诉我们,我们的分类器正确预测了多少被搅动的用户。另一方面,回忆告诉我们它错过了多少用户。

通俗地说,这个分类器对于不稳定的用户来说不是很准确。

from sklearn.metrics import classification_reportprint(classification_report(df_test[target], pred))

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

Classification report for the Decision Tree model

模型可解释性

决策树模型使用合同月费互联网服务总费用、任期特征来决定客户是否会流失。这些特征根据决策树中的划分标准很好地将流失的客户与其他客户区分开来。

每个客户样本遍历树,最终节点给出预测。
例如,如果Contract _ 逐月为:

  • 等于 0,继续遍历具有真实分支的树,
  • 等于 1,继续遍历带有错误分支的树,
  • 未定义,它输出类 0。

这是一种很好的方法,可以看到模型是如何做出决策的,或者是否有任何不应该出现在模型中的特性。

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

Interpretation of the Decision tree model

进一步阅读

  1. 处理客户流失预测中的类别不平衡 —我们如何更好地处理流失预测中的类别不平衡。
  2. 关于使用机器学习技术预测客户流失的调查——本文回顾了研究人员用于流失预测的最流行的机器学习算法。
  3. ka ggle 上的电信客户流失—ka ggle 上的流失分析。
  4. WTTE-RNN 无黑客流失建模 —基于事件的流失预测。

在你走之前

Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。

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

Photo by Courtney Hedger on Unsplash

CI/CD fbprophet 到 AWS Lambda

原文:https://towardsdatascience.com/ci-cd-fbprophet-on-aws-lambda-using-circleci-b7f584115737?source=collection_archive---------21-----------------------

使用 CircleCI 将预测整合到您的开发流程中

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

Greg Studio / Unsplash

大约一年前,我试图弄清楚如何让 fbprophet 在 AWS Lambda 上进行预测工作,并最终让它工作起来。从那时起,对无服务器预测的需求成熟了,越来越多的人对无缝技术感兴趣,导致了一些非常有用的东西,如由马克·梅斯为 AWS Lambda 开发的 fbprophet 汇编器

让软件包正常工作的一个自然发展是让它成为你的 CI/CD 过程的一部分。我需要经常部署我的预测代码——将预测微服务集成到其他应用程序中——手动生成和上传 zip 不是一个选项。我要分享一下我是如何为 CircleCI 解决的。希望您会发现它对其他 CI/CD 解决方案有用并可重用。

一致部署的基础是预装在 AWS Lambda Python 3.6 环境中的这个 Docker 映像。它有完整的、未编辑的 fbprophet,因此可以在 CI/CD 端进行定制。例如,您可能希望也可能不希望从 Docker 中卸载 matplotlib。

你可以随意使用这张图片。下面是它的文档(根据马克·梅茨的而建),这里是整个回购。

# DockerfileFROM lambci/lambda:build-python3.6ENV *VIRTUAL_ENV*=venv
ENV *PATH* $*VIRTUAL_ENV*/bin:$*PATH*RUN python3 -m venv $*VIRTUAL_ENV* RUN . $*VIRTUAL_ENV*/bin/activateCOPY requirements.txt .
RUN pip install — upgrade pip
RUN pip install -r requirements.txt# requirements.txt
pystan==2.18
fbprophet

下面是我用的 CircleCI config.yml 代码。它利用 Docker 中设置的 virtualenv 的路径来准备 fbprophet 进行部署。

# config.yml# assumes the repo structure like this:
# repo_name
#   main_repo_folder
#      ...
#   name_of_lambda_handler.py
#   requirements.txtversion: 2
jobs:
  build:
    docker:
      - image: amacenov/aws-lambda-fbprophet
        environment:
          AWS_ACCESS_KEY_ID: 'xxx'
          AWS_SECRET_ACCESS_KEY: 'xxx'
          AWS_DEFAULT_REGION: 'xxx'

    steps:
      - checkout

      - restore_cache:
          keys:
            - v1-dependencies- *#{{ checksum "requirements.txt" }}* - run:
          name: install dependencies
          command: |
            VIRTUAL_ENV=/var/task/$VIRTUAL_ENV  # path was set up in the Docker image
            source $VIRTUAL_ENV/bin/activate
            pip install -r requirements.txt

      - run:
          name: make prophet small enough for lambda
          command: |
            VIRTUAL_ENV=/var/task/$VIRTUAL_ENV
            source $VIRTUAL_ENV/bin/activate
            pip uninstall -y matplotlib
            find "$VIRTUAL_ENV/lib/python3.6/site-packages" -name "test" | xargs rm -rf
            find "$VIRTUAL_ENV/lib/python3.6/site-packages" -name "tests" | xargs rm -rf
            rm -rf "$VIRTUAL_ENV/lib/python3.6/site-packages/pystan/stan/src"
            rm -rf "$VIRTUAL_ENV/lib/python3.6/site-packages/pystan/stan/lib/stan_math/lib"

      - run:
          name: prepare zip
          command: |
            VIRTUAL_ENV=/var/task/$VIRTUAL_ENV
            pushd $VIRTUAL_ENV/lib/python3.6/site-packages/
            zip -9qr ~/repo/name_of_the_zip.zip *
            popd
            zip -9r name_of_the_zip.zip main_repo_folder/
            zip -9 name_of_the_zip.zip name_of_lambda_handler.py- save_cache:
          paths:
            - ./cache
          key: v1-dependencies- *#{{ checksum "requirements.txt" }}* - run:
          name: push to s3
          command: aws s3 cp name_of_the_zip.zip s3://your_s3_bucket_name/name_of_the_zip.zip

      - run:
          name: push function code
          command: >
            aws lambda update-function-code --function-name your_aws_lambda_function_arn
            --s3-bucket your_s3_bucket_name
            --s3-key name_of_the_zip.zip

workflows:
  version: 2
  deploy:
    jobs:
      - build:
          filters:
            branches:
              only: [master]

下一次将分享更多关于我如何大规模使用 fbprohet 的信息。

干杯!

公民数据科学:不用编程分析自然

原文:https://towardsdatascience.com/citizen-data-science-4d412827bda6?source=collection_archive---------22-----------------------

将 Excel 与 iNaturalist 和 eBird 一起使用

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

Steven Wright @stevenwright via Unsplash

我最近在加维兰学院给一个植物学班的学生做了一次非正式的演讲。最初的主题是自然摄影,但我也谈到了我用来创作我最近完成的摄影集《鸟类肖像:海岸线公园》的数据科学技术。

这本书的概念是试图亲自拍摄特定地区所有鸟类的照片,在这种情况下,在加利福尼亚州山景城的山景城公园的海岸线,我后来扩展到包括帕洛阿尔托贝兰兹。为了列举在这一领域已经看到的物种,我求助于两个公民科学网站,T4 自然主义者网站和电子鸟类网站,这两个网站都有应用程序接口。请注意,虽然 eBird 是鸟类特有的,但 iNaturalist 也包含植物和其他动物的数据。

未来的一组文章将涵盖我用来研究和创作这本书的不同技术和库,包括用于地图制作的叶子。这些也将引用包含我使用的 Python 代码的 GitHub 库。

Sans 编程

对于一个以数据科学为生的人来说,所有这些都很好,比起 Excel 表格,他更喜欢熊猫的数据框架。然而,即使您不是程序员,您也可能会习惯使用 Microsoft Excel,它可以有效地用于使用 iNaturalist 和 eBird 数据进行一些调查。

一点点创造性地剪切和粘贴 URL 可以在不需要学习 Python 或 r 的情况下使用这些有价值的数据。毕竟,这是我为了弄清楚一些 API 是如何工作的,或者在它们不像宣传的那样工作时复制它们而做的。

方法

植物学课上的一名学生提交了一份关于 Muhlenbergia rigens(俗称鹿草)的报告。虽然它是一种迷人的植物,但我将把对 Muhlenbergia rigens 的分析作为练习,而是考虑我最喜欢的鸟类之一,美国红隼( Falco sparverius )。

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

American Kestrel (Falco sparverius), photo by author

为了说明这种技术,我们将搜索美国红隼对自然主义者的观察。我将详细介绍这些步骤,以便清楚地说明如何推广到其他应用程序。

首先进入非自然语言学家主页这里,点击左上角的放大镜。在搜索框中输入“American Kestrel”即可进入该页面:

https://www.inaturalist.org/observations?place_id=any&taxon _ id = 4665

我们可以看到有 13269 个观察值(到目前为止)。你也可以从这里看到,他们对隼鸟使用的分类单元号是 4665。因为我对当地的目击事件感兴趣,所以我还在 location 字段中填入了“Mountain View,CA,USA ”,将我们的结果限制为 238 次观察。

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

iNaturalist helpfully shows possible choices

接下来,点击过滤器,然后点击下载

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

Lots of filtering options here

这将引导您进入一个新页面,其中有大量选项可供您选择最终导出的 CSV(逗号分隔值)文件。这个页面的关键部分是这样的:

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

通过将框中的查询片段附加到以下内容:

https://www.inaturalist.org/observations?

您将获得下载的完整 URL。更改“创建查询”窗格中的选项将会更改 URL 片段。我点击了“名胜古迹”,把区域限制在山景城;我们只得到 238 个观察值。从查询中,我们看到 76255 是山景城的 place_id。

完成过滤后,向下滚动到步骤 4,然后单击“创建导出”。如果观察次数很少,它将很快完成。滚动回顶部,在“导出完成”上方点击“下载”按钮。在 Mac 电脑上,这将进入您的下载文件夹,名称类似“observations-53038.csv”,您现在可以用 Excel 打开它。

当您有喜欢的搜索查询时,请在笔记中保存完整的 URL,以便快速、可重复地访问数据,这始终是数据科学的一个重要部分。

开始分析!

默认下载中有 36 列,浏览它们会立即给我们一些数据分析的思路。例如,我们可以使用纬度和经度列在地图上绘制观察结果,或者使用自然语言处理检查描述列——等等,这是 Excel,不是 Jupyter Python 笔记本,所以这些列不容易使用。

如果我们打算在野外找到一只美洲红隼,知道它是季节性的还是全年性的将会非常有用。有帮助的一栏是“观察到的”,它看起来是 MM/DD/YY 格式。使用 Excel 的“数据透视表”功能,我们可以按月汇总观察计数,以找到一年中寻找它的最佳时间。

这不是关于数据透视表的教程,所以我们将遵循 StackOverflow 帖子[ 1 ]。

  1. 在“observed_on”列后添加三列:obs_month、obs_year 和 obs_count
  2. 对 obs_month 使用公式=TEXT(C2,“MMM”),对 obs_year 使用公式=TEXT(C2,“YYYY”),对 obs_count 使用数字 1,并填写所有观察值(如果复制和粘贴,请注意智能引号!)
  3. 选择三个新列并创建一个数据透视表(在 Mac 版本的 Excel 上,单击数据选项卡找到它)。
  4. 将 obs_year 拖到列标签下,将 obs_month 拖到行标签下,将 obs_count 字段拖到值下,如下所示。

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

这将创建一个如下所示的数据透视表:

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

回答什么时候能看到美洲红隼的问题,兴趣一栏是最右边的一栏;我们看到冬季月份是它最常被报道的时候(尽管不一定是它最丰富的时候)。最下面一行也很有趣,可能是因为非自然主义者手机应用程序越来越受欢迎。

eBird

尽管本文使用了非自然的例子,但是 eBird 的大部分数据都可以通过查看 API 参考资料来获得。

例如,此 URL:

[https://ebird.org/ws2.0/ref/hotspot/geo?lat=37.4407&lng=-122.0936&fmt=csv&dist=6](https://ebird.org/ws2.0/ref/hotspot/geo?lat=37.4407&lng=-122.0936&fmt=json&dist=6)

将下载山景城海岸线公园 6 公里范围内观鸟热点的 CSV 数据。通过通读 API 文档这里,您可以构建其他有用的查询 URL。

结论

虽然这篇文章只是触及了公民科学数据宝库的皮毛,但它表明即使没有编程,也有可能获得有用的见解。

当然,我也希望它能激励你们中的一些人超越 Excel,学习 Python 或 R 之类的编程语言来帮助自动化分析任务。我在下面提供了一些文章链接,以帮助你快速启动你的努力。

参考

  1. Excel:按月统计出现次数,Matthew Lock 和 Stepan1010,StackOverflow。
  2. 美国自然主义者 API 参考,加州科学院和国家地理学会
  3. eBird API 2.0 参考,康奈尔鸟类学实验室
  4. 当 Excel 不够用的时候安德烈斯·沃拉基斯
  5. Python Excel 教程:权威指南Karlijn Willems
  6. 用熊猫重塑你的数据的七个干净步骤或者我如何在 Excel 失败的地方使用 PythonTich Mangono
  7. 美国红隼观察,约翰·赫尔利

基于 TensorFlow 2.0 的城市景观图像分割

原文:https://towardsdatascience.com/cityscape-segmentation-with-tensorflow-2-0-b320b6605cbf?source=collection_archive---------7-----------------------

🤖深度学习

基于 UNet 架构的图像分割。

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

Photo by Andrea Cau on Unsplash

图像分割是在各种计算机视觉应用中使用的检测技术。我们实际上“分割”了图像中我们感兴趣的部分。在这个故事中,我们将为语义分割创建一个 UNet 模型(不要与实例分割混淆😕 ).

你可以在这里查看这个故事的实现–>

[## 城市景观 _ 图像 _ 分割

colab.research.google.com](https://colab.research.google.com/drive/1i-7Vn_9hGdOvMjkYNedK5nsonNizhe0o#scrollTo=l8WavclxY7ec&forceEdit=true&sandboxMode=true)

UNet 的架构怎么样?

😴 Implementing Faster RCNN from scratch! ( For me at least… )

如果您使用 TensorFlow Keras 或 PyTorch,实现 UNet 可能会更容易一些。简单来说,

UNet 具有编码器-解码器类型的结构。编码器接收图像,对图像执行各种卷积和最大池操作,并构建图像的潜在表示。现在,解码器获取这种表示,并对图像进行上采样(在跳过连接的帮助下),最终为我们提供分段掩码。

UNet 与卷积自动编码器的不同之处在于它有跳跃连接😎。跳过连接顾名思义(也许;-) )为解码器保存空间信息。通常,编码器将图像分解成高维张量(如形状*【8,8,256】*)。这可能会导致一些重要功能的丢失。当我们把图像输入编码器时。在每次最大池操作(在编码器中)之后,我们存储操作的结果。现在,当我们在解码器中执行转置卷积时,我们将之前的输出(来自解码器)和之前存储在编码器部分的相应张量连接起来。解码器接收原始图像的一些元数据来构造遮罩。

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

A creepy 👽 drawing of a UNet!

在 Keras,我们有Con2DCon2DTransposeMaxPooling2DUpSampling2D层,让您的生活更轻松。但是我们将使用原始的 TensorFlow 2.0 APIs 来创建模型。

也许这个模型被命名为“UNet ”,是因为使用跳跃连接得到了一些 U 形。让我们把这留给发明家吧!😅

讨论数据

我们的数据集来自于 KaggleDanB城市景观图像对。这些图像看起来像,

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

Sample images from the dataset.

右边部分是遮罩,左边部分是实际图像。我们将使用 Pillow 用ImageOps分割这些图像。

数据集具有不同类别的多个掩膜,它们具有各自的颜色。为了简单起见,我们只尝试分割图像中的“道路”。请注意,道路的 RGB 颜色为(128,63,126)。我们的模型将输出一个二进制掩码,只包含 1 和 0。我们的输入图像将是(128,128,3)形状的图像,目标将是(128,128,1)形状的遮罩。因此,RGB 值为(128,63,126)的像素在目标蒙版中将具有值 1。所有其他像素将保持值 0。

准备行动!

我们将为四个操作定义方法:

  1. conv2d_down:常规卷积和泄漏 ReLU 激活。
  2. maxpool_down:有效填充的最大池操作。
  3. conv2d_up:对图像进行上采样的转置卷积。
  4. maxpool_up:像UpSampling2D Keras 图层一样对输入进行上采样。

Snippet 1

我们将使用 Glorot 统一初始化器为我们的 UNet 创建一些权重,

Snippet 2

我们现在准备组装最终模型。

制作 UNet 模型

用我们之前创建的所有操作组装 UNet 模型。

Snippet 3

注意到tf.concat()操作了吗?这是我们实际连接上一层(解码器)和跳过连接(编码器)输出的地方。

model()接收输入,将其通过 UNet,并返回 sigmoid 激活的输出。🆒

培训和优化

我们使用 Adam optimizer二元交叉熵损失函数来优化我们的模型(还记得最后一层的 sigmoid 激活吗?).

Snippet 4

我们现在准备训练模型。我们将为我们在数据集中创建的每个批处理调用train()方法。

Snippet 5

您将找到一个代码单元来为笔记本中的图像生成遮罩。经过 25 个时期的训练,结果😂是来验证数据集的。

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

The Results!

还有呢!

仅此而已!

希望这很有趣。机器学习快乐!

AI、机器学习、深度学习有什么区别?

原文:https://towardsdatascience.com/clarity-around-ai-language-2dc16fdb6e82?source=collection_archive---------6-----------------------

人们喜欢在对话中抛出人工智能、机器学习和深度学习等流行词汇。我认罪。它们准确地描述了我所做的工作。

这并不能成为躲在流行词汇后面而不理解其含义的借口。所以,让我们复习一下它们的意思,这样你就知道在对话中什么时候使用它们。在此过程中,我们还将看到它们对医疗保健和数字医疗创新的意义。

首先,让我们用一张方便的图片来探索这三个概念是如何相互联系的:

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

AI 是最广泛的范畴。这意味着所有的机器学习和深度学习都算作 AI。而且所有深度学习都算机器学习。然而,这并不成立,反之亦然,即。不是所有的 AI 都是机器学习。再看一遍图片,看看这是什么意思。

AI 是指任何类型的具有智能的机器。这并不意味着机器具有自我意识或类似于人类的智能;这只意味着机器能够解决特定的问题。

机器学习指的是自己学习的一种特定类型的人工智能。随着它获得更多的数据,它在学习方面变得更好。

深度学习指的是一种特殊类型的机器学习,即使用神经网络。它通常会给出迄今为止任何类型的机器学习中最好的结果。

虽然神经网络是在 20 世纪 80 年代发明的,但由于几项技术突破,它们直到 2010 年才开始流行。基本上,神经网络变得更快、更便宜、更准确。因此,深度学习作为一个聪明的营销术语诞生了,用来描述这些最近的突破。

那么 AI 不是机器学习的例子是什么呢?“专家系统”基本上设置了许多“如果这样,那么就那样”的语句。它不会自己学习(所以它不是机器学习),对于医疗诊断和治疗等用例来说,它仍然非常有用。

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

这个决策树一旦被输入计算机就变成了人工智能。计算机将需要信息来回答问题,然后它会自动给出治疗方案。例如,给人工智能这样的信息:

  • 病人体温是 102 华氏度
  • 病人很痛苦
  • 感染是细菌性的

人工智能会自动给病人开抗生素。

随着医疗保健与传感器的联系越来越紧密,我们可以自动为人工智能提供更多数据,以帮助它做出决策,例如临床决策支持。这意味着医疗保健用例可能不需要 buzzy 深度学习。它可能只需要几个相连的传感器和新的人工智能专家系统。

同时,无数的机会在于机器学习和深度学习。以注释放射学图像为例。机器学习学习如何自己发现肿瘤,特别是深度学习提供了出色的结果。深度学习已经在一小部分时间里胜过了人类放射科医生。

然而,深度学习的代价很大:我们通常无法说出它为什么会做出某种预测。我们以牺牲可解释性为代价获得了准确性。

这给医疗保健带来了一个难题。让我们想象一下,深度学习预测了一个肿瘤是良性的。结果发现肿瘤是恶性的,同时预后变得更差。患者、家属和医生都可能想知道为什么神经网络认为肿瘤是良性的。

神经网络耸耸肩作为回应。

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

在需要对决策负责的情况下,可解释性很重要。在这种情况下,使用其他类型的机器学习可能比深度学习更好。在能够说出它为什么做出某个诊断的好处上,可能会有准确度的降低。

最重要的一点是,有人工智能的时代,有机器学习的时代,也有深度学习的时代。也有一些时候,我们不应该使用这些中的任何。在可预见的未来,医疗保健中的一些事情应该留给人类去做。

总结

了解常用流行语之间的差异有助于进行富有成效的对话。以下是一些经常被混淆的流行语:

**人工智能:**具有任何类型智能行为的机器

**机器学习:**自主学习的人工智能的一部分

**深度学习:**使用神经网络的机器学习的一部分

当决策需要责任时,可解释性很重要。以下是核心要点:

  • 可解释性是说明模型为什么做出预测的能力
  • 人工智能和机器学习有时会做出可解释的预测
  • 深度学习通常更准确,而是可解释的

人工智能、机器学习和深度学习都可以成为正确的解决方案。找出哪一个最适合手头的问题需要洞察力。

阶层失衡:令人头疼的分类问题

原文:https://towardsdatascience.com/class-imbalance-a-classification-headache-1939297ff4a4?source=collection_archive---------7-----------------------

什么是阶层失衡?

如果你有机会解决分类问题,那么很可能你已经面临了不平衡的类的问题。正如在《沃利在哪里》(或《沃尔多》,取决于你来自哪里)中,我们过去常常努力寻找我们的红白朋友,阶级不平衡通常会让我们更难识别(并因此分类)少数民族阶级。

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

这发生在具有不成比例的观察比例的数据集中。换句话说,在二进制分类问题中,一个类中的元素很多,而另一个类中的元素很少。但这也可能发生在多分类问题中,当绝大多数的观察值聚集在一个类别中,或者我们有一个类别与其他类别相比代表性很低。

不平衡问题没有正式定义,所以没有“官方门槛”说我们在有效处理阶级不平衡,但 1 比 10 的比例通常是不平衡的,足以受益于使用平衡技术。

为什么这是一个问题?

大多数机器学习算法都假设数据是均匀分布的。因此,当我们有一个类别不平衡时,机器学习分类器往往更偏向于多数类别,导致少数类别的错误分类。

准确性悖论

准确性悖论是指在对不平衡类别进行分类时,使用混淆矩阵的准确性作为预测建模的度量。

让我们以下面的例子来更好地说明这一点:假设您正在处理一个二元分类问题,并且您的模型得分为 90%的准确性。这听起来很棒,但是当你深入一点时,你会发现 90%的数据属于一个类。这意味着你只能很好地预测大多数人。因此,在这种情况下,精确度和召回率更好衡量。让我们稍微回忆一下所有这些指标及其来源:

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

Google Images

在这种情况下,另一个有趣的指标是 ROC 曲线:

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

Baptiste Rocca, Handling imbalanced datasets in machine learning (2019), Towards Data Science

此指标显示召回率和真阴性率或特异性(真阴性+假阴性/真条件阳性)之间的关系。这里的理想点是当我们的回忆为 1,特异性也为 1 时,因为在这种情况下,我们将预测所有正值为正,所有负值为负,但在实践中这通常很难,我们将尝试使用分类算法的阈值来最大化 ROC 下的区域。同样在一个多分类问题中,我们会有尽可能多的曲线。

关于可分性

我们首先要记住,在线性回归中,我们试图使用最小二乘法拟合直线,而在逻辑回归等分类算法中,我们没有相同的“残差”概念,因此它不能使用最小二乘法,也不能计算 R2。相反,逻辑回归使用一种叫做“最大似然”的东西:

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

Google Images

在上图中,我们可以注意到预测变量 X 在 y=0 和 y=1 之间有一些重叠。这是两个稍微可分的类的简单例子。有些情况下,类会重叠更多,而有些情况下,类根本不会重叠:

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

Baptiste Rocca, Handling imbalanced datasets in machine learning (2019), Towards Data Science

将此与理论最小误差概率联系起来,最佳可能分类器将为每个点 X 选择两个类别中最可能的类别,并且对于给定点 X,最佳理论误差概率由这两个类别中可能性较小的类别给出。如上例所示,对于具有一个特征和两个类别的分类器,理论上的最小错误概率由两条曲线最小值下的面积给出。如果我们的预测变量可以很好地分离,并且我们在类之间没有任何重叠,那么这两个类的分离程度足以补偿这种不平衡。下图显示了良好或不良可分性对 ROC 曲线的影响:

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

Google Images

但是当我们没有很好的类间可分性,并且确实存在类不平衡的时候,我们能做什么呢?

应对不平衡数据的技术

如果我们不能收集更多的数据,或者我们的类天生不平衡,这里有一些技术可以用来提高我们的分类性能。

1.向上采样少数类

上采样是从少数类中随机复制观察值的简单过程。您可以从 sklearn.utils ( 中导入重采样模块,也可以从 imblearn.under_sampling 中导入 RandomUnderSampler 模块,将少数类的观察结果分离到一个新的数据帧中,并运行以下代码:

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

Elite Data Science, How to Handle Imbalanced Classes in Machine Learning (2017)

2.下采样多数类

类似于前面的技术,但在这种情况下,删除随机观察。

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

Elite Data Science, How to Handle Imbalanced Classes in Machine Learning (2017)

这个例子的负面影响是,如果我们只有很少的观测值,我们将会减少我们的数据集,并可能影响我们的预测能力。

3.生成合成样本

合成样本是从原始数据样本中人工生成的。生成合成数据最常用的算法是 SMOTE 和 ADASYN。第一种方法基于该点与其最近邻点之间的距离创建新样本。SMOTE 计算决策边界附近少数样本的距离,并生成新样本。让我们看一个 SMOTE 如何工作的例子:

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

Source: Google Images

ADASYN 和 SMOTE 之间的关键区别在于,前者使用密度分布作为标准,通过自适应地改变不同少数样本的权重以补偿偏斜分布,来自动决定必须为每个少数样本生成的合成样本的数量。后者为每个原始少数样本生成相同数量的合成样本。

4.更改绩效指标

如前所述,当我们处理不平衡的数据时,准确性不是正确的衡量标准。相反,我们可以使用例如回忆、精确度或 ROC 曲线。

5.尝试不同的算法

一些算法如支持向量机和基于树的算法更适合处理不平衡的类。前者允许我们使用参数 class_weight='balanced '来惩罚少数类的错误,惩罚的数量与它的代表性成比例。同时,决策树通常在不平衡数据集上表现良好,因为它们的层次结构允许它们从两个类中学习信号。

如果你喜欢这篇文章,别忘了关注我,如果你想直接在你的邮箱里收到我的最新文章,就订阅我的时事通讯:)

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

感谢阅读!

特别感谢以下灵感来源:

【https://en.wikipedia.org/wiki/Accuracy_paradox

https://towards data science . com/handling-unbalanced-datasets-in-machine-learning-7a0e 84220 f 28

https://www.datascience.com/blog/imbalanced-data

https://elitedatascience.com/imbalanced-classes

https://www . datascience central . com/profiles/blogs/handling-unbalanced-dataset-in-supervised-learning-use-family

面向 CNNs 的类模型可视化

原文:https://towardsdatascience.com/class-model-visualization-for-cnns-e49be906680d?source=collection_archive---------22-----------------------

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

本文将涉及类模型可视化,这在本文的第 2 节中有描述。类模型可视化是一种用于使用训练分类 CNN 来创建表示该 CNN 的特定类的图像的技术。“鸟”的类模型最大程度地激活对应于“鸟”类的 CNN 输出神经元。

下面是本文中的图 1,显示了 12 个不同类的示例类模型:

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

Simonyan 等人介绍类模型的论文还介绍了用于创建显著性图的反向传播。显著性图将在本帖中单独讨论。

类模型的表达

一个阶级模式是一个形象 I 产生一个高分 Sc(I) 当馈入一个已经训练有素的 CNN。类模型 I 由以下表达式总结:

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

在这里,我们对图像 I 进行 arg max ,这意味着我们试图找到特定的图像 I (类模型),使得表达式的第二段,

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

最大化。

表达式的第二部分就是 CNN 对该图像的原始类评分 Sc(I) ,后面是一个 L2 正则化项【这里的正则化回顾】。

换句话说,这个表达是另一种说法,即类模型是使类得分最大化的图像 I

为什么包括 L2 正则化项?

L2 正则化项鼓励所学习的图像不包含极值。回想一下 L2 正则化试图使所有值的大小都较小(但不一定为零),而 L1 正则化试图使尽可能多的值为零。可以使用不同类型的正则化创建类模型。

存储库pytorch-CNN-visualizations提供了以下正则化对类模型外观的影响示例:

首先,这里有一个 gif 展示了在没有任何正则化的情况下学习“flamingo”类的类模型的过程:

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

我们可以看到结果图像包括许多明亮的颜色(高值)。

接下来,这里有一个 gif 展示了学习 L2 正则化的“火烈鸟”类模型的过程:

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

这一个包括更多的灰色值,和更少的高值,正如我们应用 L2 正则化所期望的。

最后,这里有一个 gif,展示了用 L1 正则化学习“flamingo”类模型的过程:

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

我们可以看到,这个类模型包括许多黑色(零)值,正如我们在应用 L1 正则化时所期望的那样。

没有“唯一正确的方法”来规范班级模型。类模型的全部意义在于向好奇的人提供 CNN 对类的理解。L2 正规化是一个很好的选择,但你也可以探索其他形式的正规化。

为什么最大化分数而不是概率?

回想一下,美国有线电视新闻网(CNN)的分类产生原始的类别分数 Sc ,然后使用 softmax 层将这些分数转换成概率 Pc :

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

在类模型方法中,我们试图最大化未标准化的类分数 Sc ,而不是类概率 Pc 。这是因为有两种方法可以最大化类别概率 Pc :

  1. 我们可以最大化感兴趣的类的原始分数
  2. 我们可以最小化其他课程的原始分数

我们不想以做(2)结束,因为如果我们做(2)将不会清楚如何解释产生的图像。因此,我们忽略 softmax 层,直接最大化感兴趣类别的原始分数 Sc

创建班级模型的步骤

我们可以通过以下步骤学习图像 I 来为类别“bird”产生高分:

  1. 训练一个分类 CNN。
  2. 创建随机的以零为中心的图像(假设分类 CNN 是在以零为中心的图像数据上训练的。)
  3. 重复以下步骤:(a)在图像上做一个正向传递,计算当前类别分数;(b)使用反向传播算法找到“鸟”神经元输出(分数)相对于图像像素的梯度;©对图像进行小的更新,以便在下一次向前传递时产生更高的“鸟”分数。

这是梯度上升,其中我们对图像进行更新以最大化得分(与梯度下降相反,在梯度下降中,我们试图进行更新以最小化得分。)

我们可以为 CNN 接受训练的每个班级制作班级模型可视化。我们训练 CNN 一次,然后对每一个可能的类别选择重复步骤(2)和(3)。

代号

下面是类模型的 Pytorch 实现:py torch-CNN-visualizations/src/generate _ class _ specific _ samples . py。下面的 gif 来自存储库,显示了从随机初始化的图像开始学习目标类“Spider”的类模型的过程:

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

结论

班级模型可以帮助我们理解 CNN 认为某个班级“看起来像什么”它们是深入了解我们训练有素的 CNN 从每堂课中学到了什么的有用工具。

附加参考文献

特色图片

特色图像显示了 VGG16 CNN 的“鸵鸟”类的鸵鸟和类模型图像,并根据以下 GitHub 库中的图像进行了修改:saketd 403/visualizing-Image-Classification-Models-and-studential-Maps

原载于 2019 年 7 月 13 日 http://glassboxmedicine.com**的

经典密码系统

原文:https://towardsdatascience.com/classic-cryptography-systems-89e7b2fb1611?source=collection_archive---------12-----------------------

三种基本密码的直观介绍

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

Published On https://www.setzeus.com/

书面交流在我们历史的每一个实例中都可以找到——可以追溯到我们作为一个物种的早期。在我们发现农业和永久定居点之前,游牧部落在原始语言结构中留下了著名的胜利和艰难的故事,被称为原始文字(s )。然而,一旦我们开始安顿下来,书面交流的效用就正确地发展了。以前,游牧部落最害怕的自然界以食肉动物&形式出现的大灾难性气候事件;然而,后结算,其他 部落 把这个衣钵当成了最大的威胁。

早期定居点之间的互动推动了外交的诞生,而外交又推动了交流和语言的发展。具体来说,这导致了保密和加密的必要性。社区如何保护他们最信任的秘密,或者信任携带他们最信任的秘密的信使,而不冒所述秘密落入坏人之手的风险?

输入密码术

密码学的构建模块:密码

可以说,密码是密码学的基本组成部分——它们当然是有记录以来最早的加密实现。用花哨的密码术语来说,密码就是一系列的步骤,将被称为明文的原始信息扰乱(加密)成被称为密文的合成信息。

历史上记载的最早的密码非常原始,通常用手或简单的机械装置加密。为了更深入地理解密码背后的目标和原则,我们将介绍三种具有历史意义的简单手动加密密码:

  1. 阿特巴什密码——公元前早期,单字母替换
  2. 凯撒密码——公元前 100 年,单表移位
  3. 维格纳密码— 1553,密钥&密钥流

虽然这些早期的例子提供了大量的学习机会并突出了关键点,但它们远远落后于现代的同类。功能强大、众所周知的密码构成了通信安全的基石,例如,互联网上普遍使用的著名 AES(高级加密标准),它是 Rinjdael 密码的惊人实现。事实上,现代密码是如此安全,以至于它们需要近乎无限的计算能力来破解暴力破解(相比之下,我们将讨论的脆弱密码可以通过最小的努力手动破解)。**

替代密码— Atbash

我们旅程的第一站与犹太宗教有着千丝万缕的联系。追溯到古代以色列,阿特巴什密码是一种简单的单字母密码 替代密码用于加密希伯来字母。据说,Yirmeyahu (Jeremiah)的书通过使用 Atbash 加密了几个词。

作为第一个密码,它提供了接近零的安全性,因为它遵循一个非常简单的替换方法。在密码中,替换就像它听起来的那样:取一个字母(或字符),根据某种加密协议(规则)替换它。在 Atbash 中,字母表的第一个字母被替换为最后一个字母,第二个字母被替换为倒数第二个字母,依此类推;本质上,字母表是颠倒的。就是这样。这就是我们的第一个密码的加密方法——让我们看一个 26 个英文字母的例子:

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

Published On https://www.setzeus.com/

希望上面的例子是直截了当的。从左到右和从上到下阅读上图,我们从一个明文消息(“这是一个密码”)开始。然后我们用 Atbash 协议(反向字母表)加密它,最终得到一个密文(“Gsrh Rh Z Xrksvi”)。出于许多原因,这是一个非常不安全的密码。最大的原因是一旦它坏了,它对所有的消息都坏了。每条消息没有必要的区别,没有 键。

移位密码—凯撒

虽然几乎可以肯定,统治机构使用密码系统在历史上并不是第一次,但著名的罗马帝国却以秘密通信闻名。众所周知,朱利叶斯·凯撒的统治使用最早的加密形式之一向前线的将军们传递秘密信息。

凯撒密码突出了另一个简单的加密协议。这一次,罗马人简单地将字母表中的每个字符左移三个字符,然后用新制定的字母表替换明文中的字符,从而对明文进行加密。下面是一个例子:

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

Published On https://www.setzeus.com/

很明显,这个特殊的密码依赖于系统本身的保密性。一旦“黑客”发现所有的信息都是用完全相同的移位 3 加密的,所有以前、现在和将来的信息都会被破解。这一次,数字 3 是一个典型的 键。 人们开始意识到,用静态(单个)密钥维护加密系统肯定会失败,所以问题变成了:我们如何设计一个有多个或动态密钥的加密系统?

密钥和密钥流— Vigenere 密码

历史告诉我们,大约在 1553 年,一个叫 Giovan Attista Bellaso 的人发表了上述问题的答案。发表在他的书 La cifra del。签名。Giovan Battista Bella,Vigenere 密码是第一个使用带有动态(变化)密钥的加密系统的密码。Vigenere 密码利用程序员常用的一种除法——模数学,在手动加密明文时要复杂得多。在下面的例子中,我们将再次加密相同的明文消息(“这是一个密码”),但是,我们还将分配一个密钥—单词“Testkey”:

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

Published On https://www.setzeus.com/

花点时间来处理上面的图片——它显然比 Atbash & Caesar 的例子复杂得多。首先,注意操作要求我们计算完整的明文密钥,也称为 keyshift。 我们的明文消息度量了 13 个字符,我们选择的密钥度量了 7 个字符:Vigenere 密码需要一个覆盖我们明文消息整个长度的全长密钥。

为了得到这个全长密钥,一个 keyshift,我们简单地将明文密钥中的字符数除以我们选择的密钥中的字符数,使用模数学,我们得到 1 模 6(6 的余数)。这意味着我们的 keyshift 是我们的密钥及其最初的 7 个字符,加上我们密钥的前 6 个字符,总共 13 个字符:“Testkeytestke。”

接下来,为了加密我们的明文的第一个字符(“T”),我们首先在顶行中找到我们的明文的字符,然后在左列中找到伴随的 key shift(“T”)字符。最后,我们的加密字符就是上面方块中的合成字符。下面是仅关于这第一个字符的示例:

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

Published On https://www.setzeus.com/

带有“T”密钥的加密“T”字符产生密码字符“M”,它遵循第一幅图像中描述的完整密文。

与它的祖先相比,Vigenere 密码被认为是进化的一步,获得了异常强大的声誉。直到大约 300 年后,第一批密码分析家才能够解码或破解密码。虽然比它的前辈更难破解,但 Vigenere 密码真正的皇冠上的宝石是它引入了动态加密密钥。相比之下,Atbash 或 Caesar 密码依赖于系统的保密性,而 Vigenere 密码依赖于密钥的保密性。

最后

最后一句话中描述的概念是现代密码学的一个关键原则。被称为克霍夫原理,用重述的术语来说,它声称:

一个密码系统应该是安全的,即使除了密钥之外,关于这个系统的一切都是公开的。

20 世纪以来,密码学的领域、方法和应用 爆炸式增长。 虽然以前的经典密码学方法延用了笔、纸&等真正初级的机械辅助手段,20 世纪引进了复杂的机器,&机电机器,最终计算机成为更复杂的加密手段。

密码学中的这些里程碑式的转折点之一源于英格玛转子机的引入。由于它在二战中具有改变游戏规则的意义,它的迷人角色(尤其是艾伦·图灵),以及它伴随的加密系统,英格玛值得深入研究——这正是我们接下来要参观的。

来源

数论简介

数学基础

现代密码学介绍

分类:线性方法(第一部分)

原文:https://towardsdatascience.com/classification-a-linear-approach-part-1-b080c13992dd?source=collection_archive---------10-----------------------

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

通过线性方法分类 —这到底是什么意思?

分类 —使用决策边界将输入空间划分为一组标记区域的行为。或者,剥离术语,将事物分成相同类型的类的行为。

线性方法— 使用直线对数据集进行分区。从直观上来说,这对于描述分区(“如果它落在线类的一侧,则为 A,如果它落在边类上,则为 B”)和执行切割来说都是最容易的。

给你一把刀,你会怎么把蛋糕切成两半?很明显,有很多方法可以进行切割,但是你上一次(故意)不从中间直接切是什么时候?这种想法是一系列模型的基础,这些模型使用这种原理来分割你的蛋糕(数据集),并帮助你理解每个切片的特征,并帮助你将新的蛋糕分配给现有的切片,嗯,我认为这个比喻太过了。

体验了监督学习技术之后(参见监督学习的构建模块,本文的目标是带你沿着线性模型分类中发展的激励因素的道路走下去。你可以称之为时间线。

当然,数学理论是至关重要的,但走出数学严谨压倒一切的学术泡沫,为什么总是获胜——特别是对于那些希望在现实世界问题上取得进展的人。

我为什么关心这个技术?为什么我需要高质量的数据?为什么我不能用这个模型?为什么这种模式会失败?你明白了,我们开始吧。

#0 —问题定义

正式介绍,一个典型的分类问题需要一组输入变量, X=(X1,X2,…) 和一个分类输出变量, Y 。同样,这个问题属于监督学习问题的子集。因此,单个观察值可以由一组值 (x1,x2,y) 组成,看起来像是 (1.25,-0.5,绿色)。

打响指

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

Figure 1 — Our First Bivariate Training Set!

图 1 显示了我们的第一个蛋糕!生成的数据集由两个连续变量 X1X2 ( *p=2)、*和一个输出变量 Y 组成,该变量取集合{蓝、橙、绿} *(K=3)中的值。*由于输出可能有三种颜色,我们检查哪种线性模型可以为我们的数据集提供最佳的三向切割。

这些数据是为了说明模型问题而模拟的,这意味着它们不是真实数据。

尝试#1 —线性回归

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

Figure 2 — Real dataset (left), Linear Regression fitted dataset (right)

图 2 中右边的图显示了从我们的数据集中给定 (X1,X2) 的线性回归模型(通过最小二乘法拟合)预测的类。第一想法?垃圾。

回归将我们知道是橙色的极少数观察结果分类到橙色类别中。为什么?

在我们诊断之前,我们推迟这种方法的基本原理这里并且强调线性回归的一个非常友好的例子这里

分类环境中的线性建模包括回归,然后进行转换以返回分类输出,从而产生决策边界。实际上,这个模型并没有多少让诊断变得简单的东西。唯一移动的部分是我们对回归系数的选择和我们的决策边界(我们从连续回归输出到颜色的转换)。

回想一下上面的第一个资源,线性回归旨在对回归函数建模,给出所有可用信息的 Y 的期望值。我们在这里不证明这一点,但是对于分类问题,这在数学上等价于给定所有可用信息的情况下,特定输出 Y 在某个类别 k 中的概率, X 。这就是所谓的后验概率,并在第一次提到的资源中的贝叶斯上下文中进行了讨论。因此,决策边界由两个类别具有相同后验概率的区域来定义。直觉上,观察结果被分类到概率最高的区域——这似乎是合理的。

这就让我们来看看回归系数的选择。因为这些都是经过优化的,所以必须仔细检查优化技术。我们知道,优化系数相当于最小化我们的损失函数,即残差平方和。让我们画出这个损失函数的输出,我们称之为误差

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

Figure 3 — Error function (left), Linear Regression fitted dataset (right)

图 3(左)显示了相对于 X1 绘制的每个观察值( *X1、*X2)的评估误差函数。每个观察值都有一个绿色、橙色和蓝色的十字,误差最小的十字的颜色就是为回归选择的类别。

对于大多数观察,我们可以看到,将其分类到橙色类别是次优的。也就是说,沿着 x 轴从左到右,很少最接近 x 轴的点是橙色的。事实上,这种情况只会发生一次。

正确的情节是为了透视;当您从左至右遍历两个图中的 x 轴时,误差函数明显由蓝色类别的 X1 < - 0.25 最小化,由绿色类别的 X1 > 0.5 最小化。在两者之间,蓝色和绿色阶级之间的区别并不明显。因此,该区域中 m,nkimiobservations 的输出是两者的集合。*等等!*通过查看数据集图,我们知道这正是大多数 Orange 类所在的区域。橙色类别中的观察结果几乎总是被错误地分类为蓝色或绿色类别。哎呀!

原来,对于 2 个以上的类( K > 2) 线性回归挣扎到所有类。这被称为屏蔽并导致严重的错误分类。我们显然需要一个更好的模型。

尝试#2 —线性判别分析(LDA)

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

Figure 4 — Real dataset (left), LDA fitted dataset (right)

线性判别分析(LDA)是我们第一次尝试的直接改进。图 4 显示了我们的训练集上 LDA 模型的输出。我们不再展示掩蔽,错误分类的数量已经大大减少。太好了…但是实际上什么是 LDA 呢?

区别性的特征或特性。

一般来说,判别分析是一种多类分类技术,它假设每一类的数据都来自一个表现出非常特殊的空间行为的家族(称为分布)。其统计特性(如均值和方差)是分布的显著特征,然后用于评估哪个类对于任何观察值来说是有条件地最可能的。

LDA 是这种技术的一个特例,它假设来自每个类的观测值来自具有跨类的公共协方差矩阵的个体高斯分布

解释这个问题的一种方法是在一个封闭的盒子里考虑三个不同颜色的物体。虽然你不能窥视盒子,但盒子上有许多小孔,可以显示三种颜色中的一种。你的工作是识别盒子内每种颜色的边界,从而了解每个物体的大小和形状。翻译上一段,LDA 假设盒子里的每一个物体都是一个球体(或者椭球体— 高斯分布),大小相同(公共协方差矩阵)。

这些统计特性通常是假设的高斯分布的参数,然后将其插入下面的线性判别函数

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

Equation 1 — Linear Discriminant Functions

这是这项技术所需的唯一数学函数。它的推导来自两个类别的后验概率的比较,以及随后基于最高评估的分类(也可见于朴素贝叶斯分类器)。

拟合模型的过程包括使用给定的数据集估计参数。为了评估每个类别的线性判别函数,需要计算以下估计值,

  1. 类别样本平均值 —每个类别的平均值 (X1,X2) ,直观地,这给出了每个类别的中心位置的指示(称为质心)。
  2. 类别先验概率 —给定类别 k 中的观察数量除以观察总数,即数据集中每个类别的简单比例。这是一个天真的猜测,在没有数据知识的情况下,我们有多大可能得到一个观察结果。
  3. 样本协方差矩阵 —对整个样本展开程度的估计度量。这实际上是每个类别的平均分布。

生成 LDA 预测剩下的工作就是将上述估计值插入线性判别函数,并为给定的一组输入选择最大化函数的类。

扩展—二次判别分析(QDA)

在我们的对象隐喻中,如果我们放弃每个对象都是一个大小相等的椭球体的假设,会怎么样呢?也就是说,如果我们放松对共同协方差和高斯数据的假设会怎么样。很明显,我们的判别函数会不同,但如何不同呢?

保留椭圆体物体假设,但允许尺寸差异,我们被引导到 LDA 的扩展,称为二次判别分析(QDA) 。所得的 QDA 判别函数在 *X、*中是二次的

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

Equation 2 — Quadratic Discriminant Functions

该过程与 LDA 一样,我们需要以下估计值,

  1. 类别样本平均值 —每个类别的平均值 (X1,X2) ,直观地,这给出了每个类别的中心位置的指示(称为质心)。
  2. 类别先验概率 —给定类别 k 中的观察数量除以观察总数,即数据集中每个类别的简单比例。这是一个天真的猜测,在没有数据知识的情况下,我们有多大可能得到一个观察结果。
  3. 类别样本协方差矩阵 —对每个类别如何展开的估计度量。

请注意,LDA 场景中只有 3 处发生了变化。事实上,LDA 可以被认为是 QDA 的一个特例,其中每个类别的协方差矩阵都是相同的。

图 5 显示了 LDA 和 QDA 在更复杂的数据集上的性能。

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

Figure 5 — Real dataset (left), LDA fitted model (centre), QDA fitted model (right)

两个模型之间的边界差异类似于绘制直线边界线(LDA)和曲线边界线(QDA)的差异。显然,训练集 2 中点的分布变化比我们以前看到的更大。QDA 的灵活性足以比 LDA 更有效地捕捉这种传播,并且可以通过 Orange 类上的表现来观察。

所以我们应该一直用 QDA,对吗?嗯,也许吧。虽然 QDA 是首选,但当类别数量增加时,我们需要估计的参数数量也会增加。边际模型改进真的值得增加计算复杂度吗?对于像我们在这里看到的“小数据”问题,答案是肯定的,但是对于更大的一组类,答案就不清楚了。

总而言之,在第 1 部分中,我们有:

  • 发现了能够对数据集进行分组/切片的问题。
  • 为一个 3 类示例开发了一个线性回归分类器,该分类器会受到屏蔽。
  • 发现 LDA 对于表现良好的高斯数据集是一个非常强大的工具。
  • 扩展到 QDA 中,对于表现不太好的数据集,这是一个稍微灵活但更昂贵的方法。

感谢评论和反馈!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值