TowardsDataScience-博客中文翻译-2016-2018-二百六十六-

157 阅读19分钟

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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

股票预测—当天交易

原文:towardsdatascience.com/stock-predi…

在当今世界,随着计算机科学的巨大进步和硅产业的快速发展,股票是人们所依赖的主要资产之一。大多数人,凭借对市场、统计数据和大量“直觉”的充分了解,正在将他们辛苦赚来的钱投资于公司股票。然后我们有被称为“冒险者”的人,他们相信对商业、时事和数学的理解。他们是日内交易的主要参与者(人们可以将其归类为股票市场中风险最高的投资之一,相当于赌博)。

Courtesy: Premier Health Group Inc

现在让我们对将要处理的问题集有一个简单的概念。

日内交易是股票市场交易规范,其归属期为*、*,通俗地说, *1 天。*买家在特定时间窗口开市时买入股票,然后在当天收盘时卖出。我们在这里处理东京一家上市公司的数据集,从 2014 年到 2016 年两年的每日数据。我们将使用一个简单的机器学习模型来:

  1. 了解我们的数据
  2. 基于算法进行预测

作为参考,这里是我的 Github 库的链接,其中包含:

  1. 用于执行分析的 Python 脚本
  2. csv 格式的测试数据
  3. csv 格式的训练数据

[## bmonikraj/股票预测-当天

预测日内股票的 Python 程序。通过创建……为 bmonikraj/股票预测-日内发展做出贡献

github.com](github.com/bmonikraj/s…)

现在,既然您可以在我的知识库中找到所有的 python 代码,我就不再带您浏览代码库或向您解释相同的内容,以免让您感到厌烦。这个脚本很简单,独立且相当直观,所以很容易理解。我还在任何需要的地方记录了脚本,而且如果你被卡住了,你可以随时在【bmonikraj@gmail.com发送邮件,并期待一天内的回复。

我在印度 NIT Rourkela 的教授曾经说过,“理解数据和问题集与分析数据和问题集所需的统计知识同样重要”。我们需要了解日内交易以及定义我们目标价值行为的各个方面。

因此,我们的数据集由 7 列组成,其中 6 列是特征,1 列是目标。

功能

  • 开盘——这是某一天 a 股的开盘价
  • 高——这是股票全天触及的最高价格
  • 低——这是股票全天下跌的最低价格
  • 收盘——这是当天股票的收盘价
  • 日期——观察的日期,主要是数据的索引
  • 成交量——全天卖出的股票数量

目标

  • 股票交易-当天市场上所有股票的价格

现在,由于我们的数据有一个*【时间】成分,我们的数据很可能是一个时间序列数据。但是一个数据要成为时间序列数据,它必须有一个*【趋势】【季节性】的因素。**为了检查我们的数据集本质上是季节性的还是趋势性的,我们可以执行“ Dickey-Fuller 分析。如果我们的数据集本质上是季节性的,那么我们可以把它作为“时间序列”数据来分析。

在 Python 中实现 Dickey-fuller 分析时,它需要一个变量,“频率”。频率在数学上定义为

Frequency = (Total time units expected till which data will show repetative patter, in minutes) / (time gap between each observations, in minutes)

现在,在我们的数据集中,我们有基本的日内交易数据。也就是说,我们的数据基于市场的日常行为、市场或行业中的事件、公司管理层的变动、买家的利益、政策以及其他类似的控制因素。因此,我们可以强烈地相信,我们的数据不会显示任何模式超过一天。此外,从数据集可以明显看出,我们的观察频率是一天。所以,我们选择频率为 1。

这是我的数据集的迪克-富勒分析报告

Dickey Fuller analysis

从上图可以清楚地看出,我们的数据在行为上不是季节性的,这意味着我们的数据集不是“时间序列”数据集,因为季节性为 0。

现在,在将季节性从等式中移除后,我们有了一个本质上完全是数字的数据集,它有五个特征,因为“时间”不再是一个需要考虑的特征,因为它不是时间序列数据。

我们可以在这里找到各种功能和目标随时间变化的行为图

Open price of stock

Close price of stock

High price of stock

Low price of stock

Volumes of stock

Total stocks traded

从上面,我们可以看到特征相对于时间的个体行为。我们还可以得到每个特征之间的相互关联图,了解每个特征之间的相互依赖关系。

Correlation matrix for all features and data

从上图中,对角矩阵给出了每列值的直方图,这对我们没有用,因为我们对特征或目标的分布不感兴趣(因为变量的数量很大,并且它们也是相关的)。

关于理解相关矩阵图的一般说明

  1. 如果总图看起来像一条曲线(线性或非线性),那么它们在很大程度上是相关的
  2. 如果图看起来是分散的,那么它们不会像预期的那样相互关联

现在,我们可以从上面的图表中推断出,大部分的特征都是相互依赖相互关联的。“开放”与“高”、“低”和“关闭”高度相关。“交易量”在很大程度上与目标“股票交易”相关。因此,所有的特征对于分析都是重要的。

这个问题现在可以用下面的简单术语来阐述:

  1. 数据集包含所有数值
  2. 特征数量=尺寸= 5
  3. 一个目标
  4. 目标是“预测的”(数字)
  5. 火车大小< 1000

From the above list, it is the best option to choose linear regression model for the same because

  1. It is a problem of prediction , so a regressor must be used
  2. Since the dimension is quite small and so thus the train size, any complex and sophisticated model, like SVM regressor can overfit the model (你可以试试!)

从 Python 的 scikit-learn 模块实现线性回归后,在测试数据上测试我们的模型后,我们得到***【RMSE = 4253929991.85,***

该值似乎太高,似乎不合适,但我们不能忘记这样一个事实,即特征的顺序和目标值彼此不相似或不接近。

【T6【股票交易】 ( 10 ) > >中的数值顺序中的数值顺序 (10⁵ ~ 10⁶)

因此,从这种方式来看,考虑到计算均方误差的顺序,RMSE 顺序是合理的。这是实际测试目标和计算测试目标的曲线图。由此,您可以看到偏差有多小,从而了解我们模型的性能。

The deviation in actual test target and calculated test target

将机器学习和算法的知识应用于日常生活场景和更好的决策是这种学术进步的主要目的。毕竟,“数字在决策中起着重要的作用,因为数字从不说谎”。

如果我可以在文章的最后做个总结——“你不需要用剑来剪指甲”

如果您有任何疑问,请联系我,电话:bmonikraj@gmail.com

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

Stock2Vec —从 ML 到 P/E

原文:towardsdatascience.com/stock2vec-f…

希望这篇文章是我通过应用 ML 来了解它的系列文章的第一篇。你可以在这里 找到这篇博文的代码

Word2Vec 是一个简单却惊人强大的算法。

它构建了单词向量来表示单词含义。它仅仅通过周围的单词来学习这些意思。然后,您可以使用这些单词向量作为输入,使机器学习算法执行得更好并找到有趣的抽象

如果我们把 Word2Vec 应用到股市会怎么样?

选择 Stock2Vec 窗口

在 Word2Vec 中,每个单词的窗口都是周围的单词。对于 Stock2Vec 我们应该如何挑选每只股票的周边股票?

股票市场有大量的变量可供选择:价格、成交量、移动平均线等。在和我在金融行业工作的朋友 Yuhi 讨论后,我们选择了市盈率。市盈率代表了市场对公司成长的预期。

希望它能学到点什么!

建筑股票 2Vec

在阅读 Quantopian 的 Zipline 的 API 文档时,我偶然发现了 Quandl Wiki 数据集,其中有 3000 家公司长达 40 年的免费数据。我将价格数据基本面数据结合起来,这些数据都是从沙拉达尔那里购买的。然后我用 postgres 合并数据。预处理代码是这里是

我改编了嵌入项目,它是我上周刚完成的 Udacity 深度学习课程的一部分:在 FloydHub 上训练模型,并用 TensorBoard 可视化结果。你可以在这里找到训练代码。

从第一个输出可以清楚地看出,Stock2Vec 学会了将相似的行业组合在一起。

Tickers grouped by their vector similarity after 12 epochs

Stock2Vec 将生物制药公司归为一类:Vivus、Vical、Sarepta、ArQule、BioCryst 和 Siga。医疗公司:麦克森和希尔罗姆。医疗保健:安泰和信诺。服装公司:Gap 和 Guess、VF Corp 和 Wolverine World Wide。零售商:Office Depot 和 Best Buy。银行:太阳银行和 CapitalSource。

酷!!

经过 20 个时期的训练后,这些是用 t-SNE 绘制的嵌入。

如果我们选择一只股票,PNC 银行,我们可以看到最近的邻居。

PNC Nearest Neighbors t-SNE

它们都是银行:富国银行、第一金融公司、高盛、信安金融集团、U.S. Bancorp、JP Morgan、Northrim Bancorp、StanCorp Financial Group、Camden National。

让我们再选一个,WTI——一个石油和天然气探索者。

最近的邻居都是能源公司:切萨皮克能源公司、斯通能源公司、Gastar 勘探公司、登伯里资源公司、Bonanza Creek 能源公司。

接下来的步骤

我正在研究一种新的算法,而不是深入研究 Stock2Vec,因为我想学习各种各样的算法。但是还有很多需要改进和未来研究的地方。

预处理可以调整,不经常出现在同一个窗口的股票可以被删除。训练数据可以具有更高的分辨率,每分钟或 15 分钟。窗口函数可以使用其他变量、移动平均、β等。

有没有发现什么有趣的关系?SNAP 减 FB = MSFT 吗?如果你对这方面的研究感兴趣,我很乐意分享矢量数据。

这个项目很有趣,我学到了很多关于单词嵌入、numpy、TensorFlow 和 TensorBoard 的知识。我对我的下一个项目感到非常兴奋!

如果你在评论中有任何问题或建议,请告诉我,或者随时给我发电子邮件。

— —

感谢 Yuhi 和 Gal 帮助购买基本面数据:)。

出于性能考虑,停止使用 pip 安装 Tensorflow!

原文:towardsdatascience.com/stop-instal…

停止使用 pip 安装 Tensorflow!用康达代替。如果你不知道 conda 是什么,它是一个跨平台运行的开源包和环境管理系统。所以它可以在 Mac、Windows 和 Linux 上运行。如果您还没有使用 conda,我建议您开始使用,因为它让管理您的数据科学工具变得更加愉快。

这里有两个很大的理由说明为什么你应该用 conda 而不是 pip 来安装 Tensorflow。

更快的 CPU 性能

从版本 1.9.0 开始,conda Tensorflow 软件包利用英特尔数学内核库构建深度神经网络或 MKL-DNN。这个库极大地提高了性能。这里有一张图表可以证明!

Chart taken from www.anaconda.com/blog/develo…

如你所见,与 pip 安装相比,conda 安装的性能可以提供8 倍的速度提升。这对那些仍然频繁使用 CPU 进行训练和推理的人来说是非常好的。作为一名机器学习工程师,我使用我的 CPU 对我的代码进行测试,然后将其推送到支持 GPU 的机器上。这种速度的提高将帮助我更快地迭代。我还尽可能在 CPU 上做大量的推理,因此这将有助于我的模型的性能。

MKL 库不仅提高了 Tensorflow 包的速度,还提高了其他广泛使用的库的速度,如 NumPy、NumpyExr、SciPy 和 Scikit-Learn!从下面的链接看你如何设置。

GPU 版本的安装更简单

conda 安装将自动安装 GPU 支持所需的 CUDA 和 CuDNN 库。pip 安装将要求您手动完成。每个人都喜欢一步到位的过程,尤其是在下载库的时候。

快速启动

所以我希望这两个理由足以让你转而使用康达。如果你确信这是开始的步骤。

pip uninstall tensorflow

如果你还没有安装巨蟒或者迷你巨蟒的话。Miniconda 只是安装 conda 和它的依赖项,而 Anaconda 会为你预装很多包。我更喜欢 Miniconda 入门。安装 conda 后,尝试以下方法。

conda install tensorflow

如果想要 gpu 启用版本,用 tensorflow-gpu 替换 tensorflow。

除了使用 Tensorflow 更快更简单之外,conda 还提供了其他工具集,使其更容易集成到您的工作流程中。我最喜欢的是他们的虚拟环境功能。你可以在这里阅读更多关于 conda 和 tensorflow 的内容。更多关于 MKL 优化这里。希望这有所帮助,一如既往,感谢阅读!

我写了很多这样的帖子!如果你喜欢这个,看看我在 micahelphi.com的其他内容

✍🏽想要更多内容?查看我的博客https://www.michaelphi.com

📺喜欢看基于项目的视频?看看我的 Youtube

🥇通过注册我的 电子邮件简讯 ,了解最新的文章和视频!

别嘲笑我了!使用 Python 的模拟库在 PySpark 中进行单元测试

原文:towardsdatascience.com/stop-mockin…

测试。

这是软件开发的基础,也是经常被数据科学家忽视的,但是非常重要。在这篇文章中,我将展示如何使用 Python 的 unittest.mock 库在 PySpark 中进行单元测试。我将从数据科学家的角度来做这件事——对我来说,这意味着我不会深入软件工程的细节。我只提供你需要知道的。

首先,一个来自《一家人》的(半)相关片段:

什么是单元测试?什么是模仿?

单元测试是一种测试代码片段的方法,以确保事情按预期运行。Python 中的 unittest.mock 库允许您用模拟对象替换部分代码,并断言它们是如何被使用的。“模拟”是一个顾名思义的对象——它模拟代码中对象/变量的属性。

最终目标:测试 spark.sql(查询)

在 PySpark 中创建数据帧的一个简单方法是执行以下操作:

df = spark.sql("SELECT * FROM table")

虽然简单,但是要测试。

代码和问题设置

假设我们为一家电子商务服装公司工作,我们的目标是创建一个根据某些条件过滤的产品相似性表,并将其写入 HDFS。

假设我们有以下表格:

1\. Products. Columns: “item_id”, “category_id”.2\. Product_similarity (unfiltered). Columns: “item_id_1”, “item_id_2”, “similarity_score”.

(假设 product_similarity 中的分数在 0 和 1 之间,其中分数越接近 1,项目越相似。如果你感兴趣的话,请看我在相似性度量上的文章。

查看成对的项目及其分数非常简单:

where 子句用于删除将项目与其自身进行比较的行。分数永远是 1。多无聊啊!

但是,如果我们想要创建一个表,向我们显示属于同一类别的项目的相似性,该怎么办呢?如果我们不在乎把鞋子比作围巾,而是想把鞋子比作鞋子,把围巾比作围巾,怎么办?这有点复杂,需要我们连接“products”和“product_similarity”表。

该查询将变成:

我们可能还想获得每种产品的最多 N 个相似商品,因此在这种情况下,我们的查询将变成:

(假设我们用 N = 10)。

现在,如果我们希望选择跨类别比较产品,或者只在类别内比较产品,该怎么办?我们可以通过使用一个名为 same_category 的布尔变量来实现这一点,该变量会产生一个字符串 same_category_q ,该字符串可以被传递到整个查询中(使用*)。format()* ),如果我们的布尔 same_category 为真,将等于上面的内部连接,如果为假,则为空。该查询将类似于:

让我们说得更清楚一点,将这个逻辑封装在一个返回 same_category_q 的函数中:

到目前为止,一切顺利。我们输出查询 same_category_q ,这样我们可以测试我们的函数,以确保它返回我们想要它返回的内容。

牢记我们的最终目标,我们想写一个数据帧给 HDFS。我们可以通过以下函数来实现这一点:

添加查询的第一部分和一个 main 方法来完成我们的脚本,我们得到:

这里的想法是,我们希望为脚本中的每个函数创建一个函数,一般命名为 test_name_of_function() 。我们想要测试函数的行为是否正常,我们通过到处使用 assert 语句来确保这一点。

Test_make_query,真与假

首先,让我们测试一下 make_query 函数。回想一下 make_query 接受两个输入:一个布尔变量和一些表路径。它将根据布尔值 same_categorysame_category_q 返回不同的值。我们在这里做的有点像一组 if-then 语句:

1\. If same_category is True, then same_category_q =INNER JOIN …”2\. If same_category is False, then same_category_q = “” (empty)

我们所做的是模仿 make_query 的参数,并将它们传入,然后测试我们是否得到了想要的输出。由于 test_paths 是一个字典,我们不需要模仿它。测试脚本如下,为了更加清晰,添加了注释。

而且就是这么简单!

测试我们的表创建

接下来,我们需要测试我们的 create_new_table 函数的行为是否正常。通过这个函数,我们看到它做了几件事,有几次机会做一些断言和模拟。注意,每当我们有类似df . write . save . something . another thing的东西时,我们需要模拟每个操作及其输出。

  1. 该函数以火花为参数。这需要被嘲笑。
  2. 通过调用spark . SQL(create _ table _ query . format( * some _ args))*创建 created_table。我们要断言 spark.sql() 只被调用一次。我们还需要模拟 spark.sql() 的输出。
  3. 合并已创建 _ 表。确保用参数 1 调用 coalesce() 。模仿输出。
  4. 写入合并后的表。我们需要嘲讽*。编写*,在我们的表上模拟调用它的输出。
  5. 将合并的表保存到保存路径。确保用正确的参数调用它。

和以前一样,测试脚本如下,为了清楚起见,添加了注释。

最后,把所有的东西一起保存在一个文件夹里。如果你愿意,你可以从它们各自的模块中导入函数,或者把所有的东西都放在一个脚本中。

要测试它,在命令行中导航到您的文件夹( cd 文件夹/working_folder )并调用:

python -m pytest final_test.py.

您应该看到类似这样的内容(请原谅这种格式):

serena@Comp-205:~/workspace$ python -m pytest testing_tutorial.py ============================= test session starts ============================== platform linux -- Python 3.6.4, pytest-3.3.2, py-1.5.2, pluggy-0.6.0 rootdir: /home/serena/workspace/Personal, inifile: plugins: mock-1.10.0 collected 3 items testing_tutorial.py ... [100%] =========================== 3 passed in 0.01 seconds ===========================

就是这样!

这就是了。我希望这有所帮助。当我试图找出如何嘲笑时,我希望我遇到过类似这样的教程。现在继续吧,就像 Stewie 说的,(不要)停止嘲笑我(函数)!

原载于 2018 年 11 月 7 日 serena.mcdonnell.ca。

在你读完这个之前,停止运行面部识别

原文:towardsdatascience.com/stop-runnin…

如今,在视频中使用机器学习驱动的面部识别存在一个非常大的问题。事实上,它可以是一个节目停止。

面部识别可以成为告诉你谁在视频中的强大工具。这对于在我们每天都可以获得的数十亿小时的媒体内容中标记演员、政治家和运动员来说是非常棒的。它也非常适合在安全摄像机镜头中寻找嫌疑人或在旧的家庭照片中定位亲戚。

我们大多数人都不介意花一两秒钟来识别照片中的一些面孔,或者我们不介意在一段视频中找到人所需的处理时间。

但是,如果你把这个乘以成百上千的资产,你会发现大量的时间和资源需要专门用于处理面部识别。

随着今天当前的机器学习即服务(MLaaS)产品,如 Google Vision、Microsoft Azure、IBM Watson 等。您将所有视频资产传递给它们的公共 API 端点,作为回报,您将获得一些元数据,这些元数据是关于谁在某个视频中以及在哪里。元数据可能如下所示:

{  
   **"faces"**:[  
      {  
         **"key"**:"Al Roker",
         **"instances"**:[  
            {  
               **"start"**:150,
               **"end"**:150,
               **"start_ms"**:5005,
               **"end_ms"**:5005,
               **"confidence"**:0.6983038746995329
            },
            {  
               **"start"**:480,
               **"end"**:660,
               **"start_ms"**:16016,
               **"end_ms"**:22022,
               **"confidence"**:0.6699914024543004
            },
            {  
               **"start"**:780,
               **"end"**:990,
               **"start_ms"**:26026,
               **"end_ms"**:33033,
               **"confidence"**:0.7077699155373681
            }
         ]
      },
      {  
         **"key"**:"Unknown Face 5abc120a9b25d163",
         **"instances"**:[  
            {  
               **"start"**:60,
               **"end"**:60,
               **"start_ms"**:2002,
               **"end_ms"**:2002
            }
         ]
      }
   }

因此,人脸识别或名人检测模型在一些带有他出现时间标记的视频片段中找到了阿尔·罗克。

但它也发现了一张未知的脸。如果这被正确地实现到一个 UI 中,那么下一步应该是让看到它的人给那个未知的人加标签。反过来,这应该训练面部识别模型。

对于当前的 MLaaS 产品来说,最后一步本身就是一个挑战,但它实际上会变得更糟。

假设这些数据代表了数百或数千小时的视频(显然在现实生活中会有更多的数据),假设我已经浏览并教会了它所有未知的面孔是谁。我仍然需要用新训练的面部识别系统重新播放所有视频,以获得训练所有新人的好处。

我们也可以颠倒这个问题。假设我有一张新的嫌疑犯或罪犯的面部照片。我想看看那个人是否出现在我作为执法机构收集的数百万小时的安全镜头或人体摄像机镜头中,,并且已经通过面部识别系统进行了搜索。使用今天的 MLaaS 工具,我必须首先用新面孔训练人脸识别模型,然后通过新训练的模型重新运行所有这些数百万小时的镜头。

这些都是表演的绊脚石,因为每当你有一些新的训练想要利用时,重新运行面部识别是不经济的。

这就是为什么我的公司 Machine Box 最近在我们的面部识别模型 Facebox 中发布了一个叫做 Faceprint 的功能。

这个功能的好处是,你只需要通过 Facebox 运行一次 。处理完之后,你可以追溯应用任何你想要的名人识别训练。你可以不断更新你的模型,用新的人来教它,给它看新的面部照片,你想纠正多少次就纠正多少次,你想纠正多少次就纠正多少次,你永远都不需要重新处理视频来利用所有这些新的知识。

想象一下这意味着什么。您可以继续将新的名人识别模型应用到您的视频中,而无需重新处理它

这将使你不必被锁定在一个预先训练的名人识别模型中,该模型在处理时可能是不合标准的,或者可能没有你想要包括的所有已知的人。

有了 Faceprint,不再需要等到完美的人脸识别模型出现。

它是如何工作的?

Faceprint 的工作原理是给你一个由 Facebox 检测到的每个人脸的唯一散列。然后你可以把这个散列和你得到的关于这个人是谁的元数据存储在一起。后来,你可以教 Facebox 新的名人,上传一个预先训练好的人脸的状态文件,或者纠正现有的模型。你只需要给它一个 hash(或 Faceprint ),而不是再次通过 Facebox 运行所有视频,作为回报,你将从更新的模型中获得一个标签。你可以在你的整个面部指纹数据库上以令人难以置信的速度运行整个操作(比处理图像本身快得多)。当你加载了一个新的 Facebox 状态文件时,你可能会手动触发该任务,或者当你的用户整天都在标记未知的面孔以确保你的数据库是最新的时,你可能会更频繁地触发该任务。

Facebox 的这一新功能将通过减少您必须做的不断重新处理来为您节省大量的时间和金钱。如你所知,Facebox 在本地运行,因此你不必将视频上传到网络,就可以利用最先进的人脸识别技术。

什么是机器盒子?

Machine Box 将最先进的机器学习功能放入 Docker 容器中,这样像您这样的开发人员就可以轻松地将自然语言处理、面部检测、对象识别等功能融入其中。到您自己的应用程序中。

盒子是为扩展而建造的,所以当你的应用真正起飞时,只需水平地添加更多的盒子,直到无限远甚至更远。哦,它比任何云服务都要便宜(可能更好)……而且你的数据不会离开你的基础设施

有戏让我们知道你的想法。

逐步停止:为什么逐步选择不好,你应该用什么来代替

原文:towardsdatascience.com/stopping-st…

Regression image from Wikipedia

这是从我的统计网站:www。StatisticalAnalysisConsulting.com

介绍

在这篇文章中,我讨论了多元线性回归的变量选择方法与一个单一的因变量 y 和一组自变量

根据

特别是,我讨论了各种逐步的方法(定义如下)。我将展示如何在 SAS 中实现它们(PROC GLMSELECT ),并提供如何在 R 和 Python 中实现它们的指导。

逐步方法对于其他类型的回归也是有问题的,但是我们不讨论这些。Frank Harrell (2001)在回归建模 策略中出色地总结了逐步方法的基本问题,可以解释如下: 1。R^2 值偏高 2。F9 统计量不具有所声称的分布。 3。参数估计的标准误差太小。 4。因此,参数估计的置信区间太窄。 5。由于多重比较,p 值太低,并且难以校正。 6。参数估计值偏离 0。 7。共线性问题加剧。

这意味着你的参数估计值可能离零太远;您对这些参数估计的方差估计也不正确;所以置信区间和假设检验会是错的;没有合理的方法来纠正这些问题。

最具毁灭性的是,它允许分析师不去思考。换句话说,对于数据分析师来说,使用逐步方法相当于告诉他或她的老板应该减薪。一个额外的问题是,这些方法可能无法确定适合的变量集,即使这些变量集存在(Miller,2002)。

我详细说明了为什么这些方法很差,并提出了一些更好的替代方法。在本节的剩余部分,我将讨论逐步方法的 SAS 实现。接下来,我表明这些方法违反统计理论;然后,我表明,理论违反有重要的实际后果,在常见的情况下遇到的。在倒数第二节中,我简要讨论了一些更好的选择,包括实现 SAS PROC GLMSELECT(带有指向 R 和 Python 代码的指针)。最后,我总结了我们的结果,提出了建议,并建议进一步阅读。

术语

变量选择方法是一种选择回归模型中使用的一组特定自变量(iv)的方法。这种选择可能是试图找到“最佳”模型,也可能是试图在有太多潜在虚拟设备时限制虚拟设备的数量。有许多常用的方法,我称之为逐步技术。这些包括

。正向选择从未选择变量开始(空模型)。第一步,添加最重要的变量。在随后的每一步中,它都会添加那些不在模型中的最重要的变量,直到没有满足用户设置的标准的变量。 逆向选择从选择的所有变量开始,每一步都删除最不重要的变量,直到没有一个满足标准。 逐步选择在向前和向后之间交替,引入和移除符合进入或移除标准的变量,直到获得一组稳定的变量。 双变量筛选从查看与 DV 的所有双变量关系开始,并包括任何在主模型中有意义的双变量。

SAS 实施

SAS 在 PROC REG 中使用 MODEL 语句上的 selection 选项实现向前、向后和逐步选择。默认标准是 p = 0.5 用于向前选择,p = 0.1 用于向后选择,这两者都用于逐步选择。该标准可以通过 SLENTRY 和 SLSTAY 选项进行调整。

为什么这些方法不起作用:理论

关键的问题是,我们正在将用于一个测试的方法应用到许多测试中。由 PROC GLM 或 PROC REG(或其他程序中的等效程序)生成的 f 检验和所有其他统计数据都基于被检验的单个假设。在逐步回归中,这一假设以难以确定的方式被严重违反。举例来说,如果你掷一枚硬币十次,得到十个正面,那么你很确定有奇怪的事情发生了。你可以精确地量化这种事件发生的可能性有多大,因为在任何一次投掷中正面朝上的概率是 0.5。如果你让 10 个人每人扔 10 次硬币,其中一个得到 10 个头,你就不那么可疑了,但是你仍然可以量化可能性。但是如果你有一群朋友(你没有数他们)投掷硬币几次(他们没有告诉你有多少次),有人连续得到 10 个头像,你甚至不知道 有多可疑。那是逐步的。

由于违反了假设,以下情况可以证明是正确的 Harrell (2001): 标准误差偏向 0 p 值也偏向 0 参数估计值偏离 0 模型太复杂

这些方法真的行不通:例子

对一项技术的一个测试是,当所有的假设都精确满足时,它是否有效。我们为满足线性回归 1 的所有假设的 a 生成多元数据。e 正态分布,均值为 0,方差为常数。 2。静脉血栓形成与静脉血栓形成的线性关系。 对于我们的第一个例子,我们对 100 名受试者和 50 个独立变量进行了回归分析——都是白噪声。我们逐步使用 SAS 中的默认值,即入门级和停留级 0.15;在前进档,进入水平为 0.50,在后退档,停留水平为 0.10。最终的逐步模型包括 15 个 iv,其中 5 个在 p<0.05 显著。正向选择产生了一个最终模型,在 p < .05 有 29 个 iv,5 个 sig。反向选择产生了 10 个 iv,8 个 sig,p < .05。

当然,这违反了关于每次静脉注射应该有多少受试者的经验法则。因此,对于我们的第二个例子,我们对 1000 名受试者进行了类似的测试。结果并不令人鼓舞:逐步导致 10 个 iv,其中 5 个在 0.05 显著;向前到 28 个 iv,其中 5 个在 0.05 显著,向后到 10 个 iv,其中 8 个在 0.05 显著。这或多或少是我们对这些 p 值的预期,但它并不能让人对这些方法检测信号和噪声的能力充满信心。

通常,当一个人做回归时,至少有一个自变量与因变量确实相关,但还有其他不相关的。对于我们的第三个例子,我们在上面的模型中添加了一个真实的关系。然而,由于测量包含噪声,我们也将噪声添加到模型中,因此“真实”IV 与 DV 的相关性为 0.32。在 这种情况下,有 100 名受试者、50 个“假”静脉注射和一个“真”静脉注射,逐步选择没有选择真的静脉注射,但选择了 14 个假的静脉注射。“向前”和“向后”都包含了真实变量,但“向前”还包含了 23 个其他变量。落后做得更好,包括只有一个错误的 IV。当受试者的数量增加到 1000 时,所有的方法都包括真实变量,但是所有的 也包括大量的虚假变量。

这就是假设没有被违反时会发生的事情。但有时也会有问题。对于我们的第四个例子,我们添加了一个异常值,在有 100 名受试者、50 名假静脉注射和 1 名真静脉注射的例子中,真静脉注射包括在内,但该变量的参数估计值应为 1,为 0.72。有两个异常值(例 5),参数估计值 减少到 0.44。

逐步方法的替代方法

在这一节中,我将回顾逐步选择的一些替代方法。首先,我讨论的方法不是自动的,而是依靠判断的。然后讨论一些自动化方法。然而,我的观点是,没有一种方法能够以真正自动的方式被合理地应用。我们下面讨论的方法比逐步方法表现得更好,但是它们的使用不能代替实质性的和统计的知识。评估解决问题的不同统计方法(如变量选择)的困难在于,一般来说,评估不应依赖于与特定问题相关的特定问题。然而,在实际解决数据分析问题时,这些特殊性是必不可少的。

一个完整的模型

在研究中似乎经常被忽视的一个选择是在模型中留下不重要的变量。这在某些情况下是有问题的,例如,如果有太多潜在的 iv,或者如果 iv 是共线的。然而,多重回归中并不存在只需要包含重要变量的内在要求。事实上,尽管这些 IVs 并不重要,但有几个原因可能会引起人们的兴趣。

  1. 包含它们可能会影响其他 iv 的参数。
  2. 如果理论表明它们将是重要的(理论至少应该表明这一点——或者你为什么把它们列入潜在的 iv 列表?)那么一个小而不显著的结果就有意思了。
  3. 虽然对 p 值的全面讨论超出了本文的范围,但一般来说,人们最感兴趣的应该是参数估计值的大小,而不是它们的统计意义。

这种方法的问题在于,向回归方程中添加变量会增加预测值的方差(例如,参见 Miller (2002)) —这是为减少预测值的偏差所付出的代价。这种偏差-方差权衡是选择好方法和好模型的核心。

专家知识

另一个经常被忽视的极好的选择是使用实质性的知识来指导变量选择。许多研究者似乎认为统计分析应该指导研究;这种情况很少发生:专家知识应该指导研究。事实上,这种方法不应该被认为是一种替代,而是良好建模的先决条件。 虽然实质性理论的数量因领域而异,但即使是理论最少的领域也必须有一些,否则就没有办法选择变量,无论多么试探性。

模型平均

篇幅不允许全面讨论模型平均,但中心思想是首先开发一组可信的模型,独立于样本数据指定,然后获得每个模型的可信指数。例如,该索引可以基于由下式给出的 Akaike 信息标准权重

其中δI 是有序 AIC 的差,K 是模型的数量。然后,使用以下方法组合这些模型:

其中θ_ I 是来自各个模型的参数估计。详情见伯纳姆&安德森(2002)。

偏最小二乘法

当一个人有太多的变量时,标准的数据简化技术是主成分分析(PCA),并且一些人推荐 PCA 回归。这包括通过使用 X'X 的最大特征值来减少 iv 的数量。这种方法有两个问题。

主成分可能没有合理的解释 ,主成分可能无法很好地预测因变量,即使自变量的其他线性组合可以很好地预测因变量(Miller (2002))。

偏最小二乘法找到与 DV 相关的 iv 的线性组合。看待这个问题的一种方式是注意主成分回归是基于 X'X 的光谱分解,偏最小二乘法是基于 X'Y '的分解。

套索

套索是一类收缩方法中的一种(也许最著名的收缩方法是岭回归)。Trevor Hastie & Friedman (2001)给出的套索参数估计值为:

使遭受

其中

  • N 是样本大小
  • y_i 是因变量 的值- b_0 是常数,通常通过标准化预测值而参数化为 0 -x _(I j)是预测变量 的值- s 是收缩因子

利比亚

Efron,Hastie,Johnstone & Tibshirani (2004)开发了最小角度回归。它从集中所有变量和缩放协变量开始。最初,所有参数都设置为 0,然后基于与当前残差的相关性添加参数。

交互效度分析

交叉验证是一种重采样方法,类似于 bootstrap 或 jackknife,它采用了另一种模型评估方法。当人们谈论使用保留样本时,这并不是真正的交叉验证。交叉验证通常取数据的 K 个重复样本,每个样本使用(K-1)/K 个数据来构建模型,剩余的 1/K 个数据以某种方式测试模型。这被称为 K 倍交叉验证。对于大小为 N 的样本,留一交叉验证或 LOOCV 有点像折叠结构,在 N 次系统复制中,取 N-1 个数据点来构建模型,并针对剩余的单个数据点测试结果,第 k 个点在第 k 次复制中被丢弃。所以这就是 K 重交叉验证发挥到极致,K=N,另外,随机 K 重交叉验证并没有把数据分割成 K 个子集的分区,而是取 K 个大小为 N*(K-1)/K 的独立样本。

履行

斯堪的纳维亚航空公司

PROC GLMSELECT 是在第 9 版早期引入的,现在是 SAS 的标准配置。GLMSELECT 有很多特性,我不会全部讨论;相反,我集中讨论与刚才讨论的方法相对应的三种方法。 glm select 语句如下:

PROC GLMSELECT <options>;
CLASS variable;
MODEL variable = <effects></options>;
SCORE <DATA = dataset> <OUT = dataset>;
Key options on the GLMSELECT statement include:
• DATA =
• TESTDATA =
• VALDATA =
• PLOTS =

MODEL 语句允许您选择选项,包括: 前进 后退 步进 套索 LAR 还允许您选择 choose 选项: CHOOSE = criterion 选项根据标准从模型列表中选择 可用的标准有:adjrsq、aic、aicc、bic、cp、cv、press、sbc、VALIDATE CV 是基于 k 倍 CV 的残差平方和 VALIDATE 是 avg。sq。验证数据错误 停止标准选项停止选择过程。可用的标准有:adjrsq、aic aicc、bic、cp cv、press、sbc、sl、validate。

LASSO 和 LAR 的结果

当应用于上述问题时,用默认选项 LASSO 和 LAR 表现得相当不错。下面是 LASSO 的结果,LAR 的结果几乎相同。 N = 100,50 个 iv,所有噪声。。。未选择 N = 1000,50 个 iv,所有噪声。。。未选择 N = 100,50 个噪声变量,1 个实数。。。未选择 N = 1000,50 个噪声变量,1 个实数。。。仅选择真实值 N = 100,50 个噪声变量,1 个真实值,1 个异常值。。。….param est now . 99 N = 100,50 个噪声变量,1 个真实值,2 个异常值。。。….不包含变量

限制 尽管 Lasso 和 LAR 方法是其他方法的优秀替代方法,但它们不是万灵药。方法仍然做出假设,并且这些假设需要被检查。除了标准的统计假设之外,他们还假设所考虑的模型具有实质性的意义。正如 Weisberg 在他对 Bradley Efron&TiB shirani(2004)的讨论中所指出的,无论是 LAR 还是自动方法的任何其他方法都“没有任何希望解决[模型构建的问题],因为自动方法本质上不考虑手边问题的上下文”。或者,正如我在各种场合经常说的:

脱离上下文解决统计问题就像蒙着眼睛打拳击一样。 你可能会打中对手的鼻子,或者你可能会在环柱上折断你的手。

其他实施

我是自愿成为 SAS 用户的。然而,R 在几个包中提供 LASSO,包括 glmnet:

fit <- lars(x, y, type="lasso")# summarize the fitsummary(fit)

Python 通过 sklearn 提供套索:

>>> from sklearn import linear_model
>>> clf = linear_model.Lasso(alpha=0.1)
>>> clf.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2])
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
>>> print(clf.coef_)
[ 0.85  0\.  ]
>>> print(clf.intercept_)
0.15

总结、建议和进一步阅读

尽管没有任何方法可以替代实质性的和统计学的专业知识,LASSO 和 LAR 提供了比逐步分析法更好的替代方法作为进一步分析的起点。这两种方法都有广泛的选择,允许进行大量的探索,并消除没有实质意义的模型。

对于逐步回归所带来的问题的更多信息,Harrell (2001)提供了一个相对非技术性的介绍,以及关于回归建模的一般性建议。Burnham & Anderson (2002)提供了一个更详细的方法,第一章概述了这个问题,其余章节提供了两个解决这个问题的一般框架(一个基于 信息标准,另一个基于多模型平均)。关于 LASSO 和 LAR 的更多信息,请参见 Hastie & Friedman (2001)。

参考

Bradley Efron,Trevor Hastie,I. J .和 Tibshirani,R. (2004),“最小角度回归”,统计年鉴 32,407–499。安德森博士(2002),模型选择和多模型推理,施普林格,纽约。 Harrell,F. E. (2001),回归建模策略:应用于线性模型、逻辑回归和生存 分析,斯普林格出版社,纽约州。 米勒,A. J. (2002),回归中的子集选择,查普曼&大厅,伦敦。《统计学习的要素》,纽约斯普林格出版社,2001 年。

在云上存储训练数据

原文:towardsdatascience.com/storing-tra…

当你建立深度学习模型时,你可能会受益于更多的数据来训练。您可能会耗尽本地计算机上的空间,因此需要想办法在云上存储数据集,然后在训练模型时访问它们。

我最近在一个图像分类项目中遇到了一个障碍,我的笔记本电脑没有足够的存储空间来增加我的训练数据集的大小。做多输出的时候,(2 类以上),图像识别问题,每类存储 10–100,000 张图像,(尤其是中等+分辨率),会产生很多 GBs!

在本文中,我将介绍一些帮助我使用云存储的技巧,以便在模型训练期间制定批次。

动机

1gb 存储多少钱?

Example Image

上面的图像是 54 KB 压缩的,(png),大小为 266x168x3,(分辨率 x RGB 颜色通道)。

因此,您可以用 1 GB 存储 18,518 个这样的图像。

云存储的美妙之处在于,我们可以免费在线存储许多 GB,甚至以相当低的成本存储 TBs,1,000 GBs 而在我们的本地机器上存储几 GB 可能会很成问题/完全不可能。

在训练我的模型时,我如何访问托管在云上的数据?

我想通过这篇文章传达的主要思想是,我的数据集的命名约定如何帮助我从 URL 中检索批量图像。这很重要,因为在训练模型时,我们希望在每次迭代中随机选择一批图像输入到模型中。数据集太大,无法将整个数据集加载到内存中并从中选择随机实例。因此,我使用了一种命名约定,它允许我用索引对批处理进行分区,然后相应地从 bucket URL 获取图像。

您将获得一个指向您的存储桶的 URL,您可以使用随机数生成器将所需的索引附加到 URL 请求中。这将有助于您解析 bucket,以便为训练模型制定这些批处理。

例如,如果您将数据集中的每一项命名为:SHOE_1,SHOE_2,… SHOE_9998,SHOE_9999。您将能够用类似于以下内容的公式表示 URL 获取字符串:

#PSEUDOCODE
i = randomnumber()
fetch_item = url + ‘SHOE_’ + i
new_item = httprequest(fetch_item)batch.append(new_item)

通过对数据集使用一致的命名约定,您可以轻松地解析和提取随机批次进行训练,而无需将数据集加载到内存中。

请查看这篇堆栈溢出文章,了解如何使用 python 访问 s3 文件,如图像:

[## 如何将图像文件从 S3 桶直接读入内存?

你的技能值多少钱?使用我们的工资计算器,了解像您这样的开发人员的收入,现在…

stackoverflow.com](stackoverflow.com/questions/4…)

结论

总之,我希望这篇文章能启发你思考,一旦数据集变得太大而无法在本地机器上托管,你打算如何存储数据集。我认为尽快这样做很好,尤其是如果你正在使用 google colab 环境来训练你的模型。这样你就可以很容易地从 google colab 中访问你的数据。请分享您用于在云上托管定制机器学习训练数据集的任何想法或策略。感谢阅读!

CShorten

Connor Shorten 是佛罗里达大西洋大学计算机科学专业的学生。对软件经济学、深度学习和软件工程感兴趣。

在关系数据库中存储推文

原文:towardsdatascience.com/storing-twe…

Twitter 是一个巨大的平台,每月活跃用户超过 3 亿。由于推文包含的字符数量有限,它们非常适合进行情绪分析,并评估人们对公司或感兴趣的话题的看法。在这篇文章中,我将概述使用 ORM 建立关系 SQL 数据库的步骤,并展示从 Twitter API 提取和存储 tweets 的两种方法。这类任务的用例实际上是无穷无尽的,所以让我们认为我们对披萨有一种不健康的(不止一种方式)痴迷。

“pepperoni pizza” by Vita Marija Murenaite on Unsplash

首先,我们需要访问 Twitter API。在这个链接你可以注册一个应用程序并开始收集推文。API 有许多不同的端点,我们将使用其中的两个免费选项。标准搜索 API 将允许我们收集过去 7 天的推文,不幸的是,这是历史推文的限制,无需支付额外费用,但允许我们做一些探索性的数据分析。实时流 API 允许我们筛选实时推文,并收集任何提到感兴趣的查询词的推文。我们将编写一个“倾听”脚本,收集所有与披萨相关的推文,以满足我们不虔诚的低级欲望。在我们建立数据库之前,让我们看一下可以从 Twitter 上获得的数据。

从标准搜索中收集推文

您可以使用自己选择的方法向 Twitter API 发出请求,但是 Tweepy 无疑是最容易使用的方法之一,并且它是有据可查的。只要看看入门是多么简单!

正如你所看到的,一条 tweet 包含了丰富的信息,这些键中的大部分对应于嵌套的字典和列表。如果你以前没有使用过 Twitter API,我建议你熟悉一下搜索功能,看看你可以应用的不同过滤器。显而易见,一条推文产生的数据是正文的五倍。在这里,一个请求最多产生 100 条 tweet,但是您可以想象我们可以使用一个循环(小心不要超过速率限制)来收集上一周的所有 tweet,从而链接请求。

构建数据库

我们对披萨痴迷的本质是这样的,它超越了关于我们最喜欢的油腻放纵的推特,延伸到了关于它的推特用户。每当我们的模型中有多类以某种方式相关的对象时,这就表明我们可能想要创建一个关系数据库。关系数据库保留模型中实体之间的链接,通常使用外键作为表之间的连接(在 SQL 数据库的情况下)。尽管两个类不需要关系数据库,但是可以想象我们可能想要跟踪不同的比萨饼店或感兴趣的浇头。为了方便数据库的设计和播种,我们将使用一个名为 SQLAlchemy 的对象关系映射器(ORM)。

我们的问题如下:SQL 数据库有包含整数和文本的表,非常适合存储我们的 tweets 和相关的用户数据。但是我们希望用 Python 来做分析,这是一种面向对象的语言,所以我们希望能够与 tweets 和用户作为对象进行交互。SQLAlchemy 提供了一种完全用 Python 代码设计 SQL 数据库架构的简单方法,以简单的方式映射出我们想要的关系。此外,它还允许我们从 Python 中执行 SQL 查询,基本上是为我们翻译代码,这对于我们以后执行分析时从数据库中提取数据非常有用。让我们看一下我们的简单案例:

这段 python 代码建立了我们的 SQL 数据库的模型。Tweet 和 User 类对应于带有列出的列的 SQL 表。用户和 tweet 之间的关系是一对多的,我们的 tweet 应该有一个用户 id,这样它们就可以归属于它们的父类。现在,当我们想要填充这些表时,我们可以简单地创建 tweet 和 user 类的实例,并传递通过 Twitter API 调用获得的属性。

直播推文

现在我们已经建立了数据库,我们可以开始填充它了。请注意,当您第一次建立关系数据库时,确保正确建立所有关系是至关重要的。在这里,我们只需要添加一条 tweet,并确保它有一个用户,反之亦然,但当处理更复杂的系统时,这可能意味着检查许多关系。如果模型的行为不完全如我们所愿,我们可以简单地删除我们的数据库,调整模型文件并重新创建它。

除了几个例外,流式 api 的工作方式与搜索 API 非常相似。我将再次指向文档,但是我们将浏览它。

I can smell the tomato sauce already…

这是 Streamlistener 对象的一般结构。当监听器遇到状态、错误等时,执行不同的功能。还有许多其他类型的函数可以编写,但对于我们的情况,这些就足够了。on_status 的内容允许我们在调用 check_user 函数用传递的属性实例化我们的 tweets 和用户之前提取我们感兴趣的信息。

如你所见,我们正在同时创建我们独特的用户和推文,以确保它们通过用户 id 链接。为了确保我们没有重复的用户,我们首先需要检查用户表,以确保他们不在那里。然后,我们将对象添加到一个会话中,并将它们提交给数据库。这两个简单的代码块组成了一个简单的

当您将所有这些放在一起时,您就有了一个强大的工具来从 Twitter API 中提取推文并将其存储在数据库中,从而保持推文和用户之间的关系。使用 SQLAlchemy,您将能够编写一个查询来返回给定用户的所有 tweets。我希望这是有启发性的,我将在下面留下一些额外的资源。很快,我们将会知道任何人在推特上谈论披萨的一切!

[## 使用流数据

如果你做过任何数据科学或数据分析工作,你可能读过 csv 文件或连接到数据库…

www.dataquest.io](www.dataquest.io/blog/stream…) [## 发动机配置- SQLAlchemy 1.2 文档

上面的引擎创建了一个为 PostgreSQL 定制的对象,以及一个将建立 DBAPI…

docs.sqlalchemy.org](docs.sqlalchemy.org/en/latest/c…)

其他数据科学爱好者的故事!!

原文:towardsdatascience.com/story-of-ev…

Photo by Rock'n Roll Monkey on Unsplash

“你知道 Rohan,数据科学将会是下一个大事件。作为开始,我将开始学习在线课程。”迈克在完成每周作业时说道。Mike 是我的朋友,我们在读研究生四年级。

迈克是那些让自己在许多技术上保持最新的“技术人员”之一。如果你想了解编程的最新趋势,或者最新的 android 更新,甚至是开创性的 CS 论文,他就是你要找的人!我们的“技术大师”。

我非常肯定他的话,坚信他在不同技术趋势方面的广博知识。但是我从哪里开始呢?

什么是真正的数据科学?好学吗?我应该知道哪些先决条件?问题开始从各个角落向我袭来。但幸运的是,我有谷歌的探索能力。

“那么,迈克,这到底是什么数据科学?到底是谁从中受益?请多告诉我一些。

那是他需要的暗示。他坐直了,调整了一下座位,开始解释数据科学的概念。他的口音浓重,而且声音充满激情。我洗耳恭听。他的潜在声明是“像美国和印度这样的国家将会最大限度地利用它”。

数据总量增长如此之快,以至于我们现在对数据的看法将在未来十年发生根本性的变化。如果你是一名软件工程师或从事任何技术工作,这听起来应该是一个机会。从硬件到网络到数据库技术到表示层,一切都在快速变化,让我们能够更有效地访问数据,让我们更好地生活和工作。

想想你回家的路程,如果你每天都知道最佳路线以避开交通堵塞,你能做些什么。现在想一想,在你需要的时候,你需要什么来为你的通勤获取准确的信息。现在,想想在您的通勤过程中实时变化的数据,以及需要什么技术来实现这一点。如果每次旅行能节省 15 分钟,那值多少钱?对我来说,每月可能值 10 英镑或 10 英镑或 50 英镑。乘以几十亿人(这可能是谷歌花十亿美元收购 Waze 的原因!).每天都有数十亿个不同的决定被做出。

乔纳森·布里尔

世界上有如此多的新手,他们渴望尝试 21 世纪最性感的工作,但却不知道流行的趋势。在正确的时间了解正确的信息将有助于你更好地准备并做出明智的决定(或者你需要有自己的“麦克风”)。这些不同的见解将帮助其他新手进行分析,并做出加入数据科学浪潮的正确决定。

对于那些对数据科学感兴趣的人来说,无论你目前正在从事这项工作,还是希望在未来从事这项工作,这都是为你准备的。在这里,我想把我的分析更多地集中在两个特定的国家,美国和印度。令人惊讶的是,(或者也许不是?),这两个国家在数据科学领域的可用机会数量上领先。事实上, Glassdoor 已经将“数据科学家”列为美国最好的工作,基于职位空缺数量、薪水和整体工作满意度。

事实上,据skilling****platform EdvancerAnalytics Magazine India 最近的一项研究显示,印度有近 90,000 个职位空缺,是仅次于美国的第二大基于分析的工作中心。这一数字比上一年猛增了 76%。

他们从哪里来?

从政治角度来看,印美关系可能并不明朗,但在DataScience中,这一点非常明显。这就是为什么我想接受这个特殊方向的挑战。

你听说过 Kaggle 吗?

那天晚上,下课后,迈克喝着咖啡开始了谈话。困惑之余,我向我的“技术大师”寻求进一步的解释。

它是希望在数据科学领域相互学习、分享和竞争的人们的第一个家 。它有一个令人惊叹的社区,这个社区在不断发展,并且随时准备帮助它的成员。

太酷了。因此,Kaggle 可以成为我“数据科学”之旅的第一步。我以为。我的兴趣被充分激起,我问迈克:“他们有什么限制吗?我需要学位才能加入吗?”

趁年轻抓住他们!

过去 3-4 年来,机器学习领域在印度一直有需求,因此人们仍在磨练自己的技能以进入这一领域。同样的趋势本应在 2010 年 Kaggle 成立时在美国出现。美国和印度之间有几年的差距

~Manish Saraswat,HackerEarth 机器学习部门主管

迈克的总结

  • 印度的年龄分布从 18 开始,一直到 79 ,而美国有一些人在 80+名单上
  • 有趣的是,印度的年轻一代(18-24 岁)占印度总人口的一半以上。确实令人着迷!
  • 美国也有自己的主导人群,大多在 25 岁以上。

我对这场狂欢既震惊又惊讶。我的兴趣被彻底激起,我开始思考。

需要思考的问题

  • 印度青少年是如何这么快被这个数据科学领域吸引的?他们是学生吗?这种趋势是“最性感的工作”浪潮的结果,还是他们真的对此充满热情?
  • 30 岁以上的印度人相当少。有什么问题吗?
  • 数据科学社区中 70 岁以上的高级开发人员呢?他们是如何帮助社区的?

性别

迈克的总结

  • 印度和美国都有大量男性科学家,他们比女性科学家更活跃。
  • 美国在这方面表现稍好,其女性科学家占劳动力的 22%。

要思考的问题

  • 是什么阻止了更多的女性投身于这一领域?社区可以做些什么来增加这些数字?Kaggle 的社区能做些什么来让更多的女性为这个神奇的领域做出贡献呢?

你学了多少?

迈克的总结

  • 世界上大约一半的人拥有硕士学位,只有 15%的人拥有博士学位。
  • 大约 50%的印度人拥有学士学位,这与这个领域的年轻一代密切相关。
  • 美国 ,大约一半的社区持有硕士学位。令人惊讶的是,博士学位明显偏高,为 18%。

你的职称能说明问题吗?

我认识很多以“插入头衔”身份工作的人,但他们在日常工作中做的事情与众不同。在数据科学领域存在足够的混乱,人们对同一项工作有不同的定义。

迈克叹息道。

了解这个世界对他们的同龄人所扮演的角色的看法是很有趣的。

我笑了。

迈克总结

  • 学生是本次调查中使用最多的头衔。
  • 此外还有其他常见的关键词,如数据分析师数据科学家软件工程师
  • 印度有 30% 学生比例。(这是意料之中的,不是吗?).紧随其后的是软件工程师和令人垂涎的数据科学家
  • 美国,他们爱上了新感觉数据科学家。酷!

你是数据科学家吗?

“你认为自己是数据科学家吗?”—这个问题在这里非常有效,因为这个术语本身就很模糊。对于那些自认为是数据科学家的人来说,他们真的是数据科学家吗?另一方面,那些不认为自己是数据科学家,但结果却是真正的数据科学家的可能性有多大?再次回到根本问题——“谁是真正的数据科学家?”

想想你一生中遇到的医生。有研究医生、内科医生、泌尿科医生——这些只是我的大学室友。所有这些医生每天都做不同的事情,如果他们试图做其他人的工作,事情可能不会那么顺利。对我来说,数据科学家也是如此。在数据科学的保护伞下,有如此多的信息和如此多的技能,对于一个人来说,每天做所有的事情是极其困难的。此外,由于从事数据科学工作的人总是会遇到很多事情,人们往往会被他们感兴趣的主题和问题所吸引。这导致我见过的大多数数据科学家做医生做的事情:专门化。在医学和数据科学领域,有少数几个摇滚明星忍者独角兽可以做到这一切。但是,医院只雇佣全能医生和组织只雇佣全能数据科学家是同样站不住脚的。

~亚历克斯·戈卢布·萨斯

迈克的总结

  • 调查中比例最高的人是不想回答这个问题/不确定答案的人。这就是我说的。
  • 看起来印度人对这个职位更加困惑,因为几乎 25%的人跳过了这个答案。
  • 然而,美国人对数据科学家的标签更有信心。

你有多少经验?

迈克的总结

  • 看看印度人有 0 到 1 经验的 34% 。还记得我们之前看到的巨大的学生比例吗?
  • 另一方面,美国数据科学从业者似乎有更高的工作经验,超过 15 年以上的工作经验。

值得思考的问题

  • 有趣的是,有很多人没有任何工作经验。这让我想到了那些懂数据科学却没有工作的人的可能性。还是只有最后一年毕业的学生?

金钱使世界运转

你知道为什么数据科学被称为最性感的工作吗?涉案金额也是背后原因之一。完美的 数据科学家 就像独角兽。他们不存在。退而求其次,你至少应该擅长这些高度专业化的技能。

迈克解释道。

但是,我确实听说印度和美国数据科学家的工资有差别!如果有,为什么?

我无法掩饰我的焦虑。

你没听错吧,洛汗。基于 450 份回复,印度的中位年薪为***(75 万卢比)*** ,是美国***【84 万卢比】*** 可比年收入的零头。计算中考虑了 52 个国家的数据,所有受访者的中位数为 55,441 美元。

如果你看一下 Glassdoor, 印度数据科学家的平均工资,有报道称工资为 30-40 万卢比。这些 【数据科学】 工作是由印度的 IT 服务商店提供的,这些服务商店培训不一定有数学或统计背景的应届毕业生,并教他们一些工具包,他们既不了解底层业务,也不了解他们应用的底层统计模型,导致糟糕的结果。这不是一个苹果与苹果的比较,比较印度人才与他们的西方同行。在美国,这是非常明确的。 数据科学家是指那些从名校毕业,拥有很强的数学、科学或计算机科学背景,并且从第一天起就能实际完成工作的人 。而这里在印度*,* 任何人做任何与数据有关的事情都是伪装成数据科学家 。最终将会发生的是,将会有一个大规模的修正,其中大部分将不会在真正的数据科学中得到应用,而是在报告生成、数据质量控制和所有那些奇妙的东西中。

我显然对传播给我的知识感到惊讶。非常清楚。

对于许多 IT 数据科学家来说,更多的经验通常意味着更高的薪酬。

入门级数据科学家:每小时 85–85–105 或每年 11 万–11 万–15 万大多数数据科学家都属于这一领域。它们适合于定义明确的项目,并且之前已经在其他业务中尝试过。他们在团队中非常出色,在团队中,一名学者与一名工程师配对,在一名更资深的人的监督下制作工作原型。

数据科学家:每小时 115-115-150 或每年 16.5-16.5-20 万

数据科学家是能够将定义良好的业务需求转化为自己的工作原型的人。他们拥有工程和科学/统计的综合背景,可以独立工作,也可以团队合作。

高级数据科学家:每小时 175–175–275 或每年 22.5 万–22.5 万–30 万

高级数据科学家关注业务需求并定义解决方案,即使需求是模糊的或没有被很好地理解。他们可以构建和执行数据科学实验。他们拥有领导经验,可以指导更多初级数据科学家。即使在很少或没有项目先例的情况下,他们也可以构建一个工作原型。

工业

迈克的总结

  • 这些 ML 从业者所从事的行业也非常令人惊讶。
  • 在印度和美国,学生都占绝大多数,考虑到最近 DS 的繁荣,这并不奇怪。

对当前角色的体验

迈克的总结

  • 在印度,由于学生人数较多,工业经验几乎为零。
  • 印度也有很多软件工程师。
  • 然而,美国有一群经验丰富的数据科学家。

第 2 部分:EL Clasico 和 ML

那是一个阳光明媚的日子,我们坐在那些美丽的海滩之一,享受着夜晚。那是在我们讨论最后一天的古典音乐比赛的时候。作为一个狂热的 CR7 粉丝,我对他昨天的表现感到兴奋。那些运球,单飞,精准的完成,最后是标志性的庆祝。!它让我不寒而栗。这并不是说我讨厌梅西什么的,只是我更喜欢 T21。

我澄清了我的观点。

你知道同样的戏谑也适用于数据科学社区吗?

迈克笑了。

data science 中的什么 CR7 和梅西

是的,关于哪种编程语言是最好的,这是一个永恒的争论。r 或者 Python。

多跟我说说吧!

你的初恋是谁?

你怎么看?

使用的 ML 库

你是做什么的?

在 ML 多少年?

编码多少年?

最常用的 ML 库

来源

https://www . analyticsindiamag . com/analytics-India-salary-study-2018-by-analytics-India-magazine-and-great-learning/

factordaily.com/data-scient…

https://www . businessprocessincubator . com/content/data-scientist-salary-in-India-and-USA/

https://www . analyticsindiamag . com/analytics-data-science-industry-in-India-study-2018-by-analytixlabs-aim/

https://qz . com/India/1297493/India-has-the-number-of-data-analytics-jobs-after-us/

giphy.com

ML 第 0 天简介:骑自行车的故事

原文:towardsdatascience.com/story-of-th…

我相信我们从我们的经历中学到了最好的东西,当我们分享关于我们经历的故事时,我们可以分享同样的学习。

我喜欢教人东西;我真正喜欢谈论和教授的一个话题是机器学习(ML)。多年来,我教过各种水平的学生 ML。不要相信宣传——学习者不需要任何特定领域的特定背景或领域知识来理解甚至应用 ML 概念解决问题。当然——任何领域的经验都有帮助,但许多潜在的学习者认为,为了开始学习,需要大量的统计数据或数学技能,但事实并非如此。事实上,在这篇文章的剩余部分,我将表明,任何人只需要对我们自己的学习有一个大致的了解,就可以掌握和完全理解整个 ML 过程。

在那些更有经验的人对我大喊大叫之前,请记住,这是为第一天的学习者准备的,目的是提供一个全面的、更容易理解的、不会吓到他们的方法。

那么,让我们开始吧——讲一个简短的故事!

我童年最美好的回忆之一是父亲教我骑新自行车。我想这是我第一次“真正的”艰难经历,因为我父亲没有教我如何骑自行车,而是让我每次尝试时都失败一点,最终摔倒。表面上看,我永远也到不了那里,但慢慢地,我肯定地推断出我做错了什么,这是基于我每次尝试骑自行车时所学到的正确做法。在我的整个经历和实验中,我调整了这些变量中的每一个,直到结果看起来像是需要我自己在我们的死胡同街道上轻快地行驶,并与我最快的朋友一起骑行。

当时我一点也不知道,无论结果是成功还是失败,每一次迭代都代表着一次学习经历,我正在学习如何管理平衡、动力、速度甚至勇气。

最崇高的快乐是理解的快乐。

列奥纳多·达· 芬奇

我们如何学习?

在没有获得所有科学知识的情况下,让我们把学习归结为两件事:某种类型的经历和我们从相同经历中学到的相关技能或任务。

学习骑行(体验)

你是怎么学会骑自行车的?你可能会选择两条路中的一条:

你试图在没有任何帮助的情况下学习;你尝试和失败了无数次,但在无数次擦伤膝盖和瘀伤后,你成功地独自骑了一段距离的自行车…然后又摔了下来。

或者

有人帮你学习。也许一个兄弟姐妹(对于我们这些有哥哥姐姐的人来说,这是非常错误的)或父母要么向你展示如何骑自行车,要么你观察他们如何骑自行车并模仿他们的行为。你仍然尝试和失败了无数次,但在无数次擦伤膝盖和瘀伤后,你成功地独自骑了一段距离的自行车…然后又摔了下来。

这两种方法之间的相似之处很容易被简化为这样一种简单的形式: 一次重复的经历,无论是失败还是成功,都教会了我们:什么该做,什么不该做。

永远不要让正规教育妨碍你的学习。

马克·吐温

结果(学到的技能)

每个过程的结束或结果都是一样的——我们学会了做一些事情——现在做什么?

应用

这是我在课堂上经常告诉学生的一点——现在使用这项新技能(小时候骑自行车),并用它去骑摩托车!嗯——困惑的表情比比皆是。这怎么可能呢?

这是一个简单而又显而易见的答案(记住——人们说学习这种 ML 的东西很难)——只是在你已经学到的东西上增加新的经验和成果。机会是——这一次学习会更快,痛苦(擦伤和瘀伤)会更少,因为骑自行车和骑摩托车有相似的技能,如平衡和动量。

那么,所有这些与 ML 有什么关系呢?

有时候,让 ML 变得困难的并不是学习或者理解这个过程(我会马上讲述这一切),而是我们正在研究我们自己还没有经历过或者学习过的经验和结果。更简单地说——我们无法理解学习经历,因为在某些时候我们自己没有学到——从字面上来说。

现在——整个 ML 过程——与学习骑自行车有关。

A.预处理

任何成功的分析或 ML 流程都始于良好的数据,而这些数据在使用前往往需要清理甚至转换。你能想象在学习骑自行车的过程中,有一半的步骤被遗漏,甚至是用另一种语言呈现给你吗?为了从经验中全面学习,其中的数据必须没有错误,否则我们无法从经验中全面学习或使用它来学习任何类型的技能——这第一步称为预处理,我们在此过程中纠正错误并清理数据。

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

还记得我提到的有时候学习 ML 很难吗?如果我请你教我一项你只看过别人做,但自己从未学过的技能,你会教我吗?可能,因为人类是优秀的学习者,但是毫无疑问,你会在这个过程中学习新的东西,而我只会学习一些我需要的东西来完成新的技能。

底线是,当我们之前没有任何学习经验时,我们必须首先对新任务或新技能进行充分的自我教育。在 ML 中,这个尽可能多地学习数据的过程被称为探索性数据分析,简称 EDA。我们使用各种各样的视觉化和工具来帮助我们实现这个目标,但是,现在,只要知道我们为什么这样做——去学习我们不知道的东西。

C.特征选择/特征工程

作为成年人,我们都知道经历是复杂的。部分经历也可能是错综复杂的,重叠的,交叉的,不完整的,甚至是不相关的。在 ML 中,组成体验的部分和片段被称为特征,在高层次上,我们通常只是将特征与结果或学到的技能联系起来。正如我们已经讨论过的,经验在学习过程中经常被重复,但是每次的特征都保持相同的类型。

回到自行车的例子:每次你试图学习骑自行车,你可能每次都改变平衡的量,直到你学会了保持直立的正确量。在每一次重复中,你也学会了改变你的纪念碑,直到你知道需要多少才能让你继续前进,直到你开始自己踩踏板。在这个例子中,平衡和动量都是与结果相关的特征:成功骑行或不成功骑行。

那么——为什么我们需要选择特征?

因为我们最终将在某种类型的流程中使用我们构建的内容,所以我们的 ML 流程必须进行优化,因此我们在 EDA 中内部研究数据,以决定是否可以通过从体验中删除任何不需要的功能来减少问题的规模。这不仅可以加速学习,还可以通过消除 ML 过程可能发现对学习有害的特征来使学习更好(如果有人告诉你错误的骑行方式,想想学骑自行车)。

总的来说,这种减少也有助于优化计算资源。当特征太多而不能手动减少它们的数量时,或者当需要其他更多的、特定的算法方法时,特征工程方法被实施来通常完成类似的目标。

现在,我的数据和要素都准备好了,下一步是什么?

D.系统模型化

记得学骑自行车吗?现在,我们将打包整个过程,包括所有的重复、特征和每次重复的相关结果——所有这些都需要充分再现学习特定技能所需的一切。这个包被称为模型,我们必须将它打包,因为我们需要将它应用于稍后发生的新体验,但不包含任何结果——这些最终将是预测。

但是模型不能只靠自己制造——这就是 ML 发挥作用的地方——我们必须使用适当的 ML 工具(称为学习算法),并根据我们收集的经验和结果训练它(这是监督机器学习,但还有更多类型)。随着模型的构建,ML 算法将尽最大努力学习体验如何与每个结果相关联——每次重复都会发生这种情况(我们现在可以将重复的体验称为数据中的行)。

模型建立发生在单独的训练和测试阶段,直到达到最佳结果;有许多方法来衡量这一点,它在问题上有很大的不同,但这一点超出了本介绍的范围。现在——只需要理解模型是通过迭代评估的就足够了,如果需要的话,包括使用不同的 ML 工具重新训练模型。在一个最佳模型(请记住,这个模型现在包含了经验如何与每个结果相关的规则)经过训练、测试、评估和接受之后,我们可以在具有相同特征的新数据上使用它来进行预测。

其核心是机器学习,仅此而已。ML 工具只是工具,没有魔法帽。

当然,这个过程还有更多的东西——是的,有,我很快会在这个介绍中添加第二章,进行更深入的探讨,但是初学者可以在这里停下来,简单快速地介绍一下所有这些忙乱是怎么回事。

为数据科学家讲述故事

原文:towardsdatascience.com/storytellin…

人工智能项目管理

将数据转化为故事来说服你的听众

Source: bit.ly/2uX5enz

《哈佛商业评论》最近发表了一篇关于领先数据科学家实际工作的文章。令人惊讶的是,关键技能是沟通,而不是统计模型的经验。

亚里士多德认为,要说服人们,你需要使用精神气质、理性和情感。精神特质建立了说话者的可信度,而标识诉诸于所使用的推理。然而,如果没有悲怆这种打动观众心灵的方式,这两部电影都毫无用处。当介绍他们的工作时,Homo 数据科学家通常会爱上因果的、数据驱动的推理。这通常是正确的辩论方式。但是为了唤起行动,数据科学家需要讲故事。

也许故事只是有灵魂的数据。— 布琳·布朗

这篇文章提出了两个框架来组织演讲,并在情感上与听众建立联系。它会帮助你唤起你想要的行动。负责任地使用。

讲故事的语言

畅销书作家兼科学家尤瓦尔·赫拉利认为,语言是为了讲故事而发明的。与公众意见相反,语言的发明不是为了更有效地协调工作或制定军事计划。自石器时代以来,人类就用故事来安慰彼此,争论问题,并形成社会联盟。

人类是讲故事的动物。—格雷厄姆·斯威夫特,沃特兰

Source: amzn.to/2P8zum3

直到今天,人类都不是理性的生物。我们在故事中交谈、思考和梦想。当讨论公共政策选项时,我们会感性地而不是理性地进行推理。当听到一个发生在我们邻居朋友身上的故事时,我们会从这个故事中得出结论,而不是后退一步评估数据。

数据科学家每天都需要简单易懂地向利益相关者解释复杂模型的结果。他们还需要推介项目。无论做哪一件事,讲故事都应该是数据科学家的首选工具。

第一部分解释了 SPSN 框架,以创造一个结果驱动的故事情节。第二部分检查成功框架,使你的故事在情感上尽可能吸引人。

为您的演示文稿创建故事情节

Photo by rawpixel on Unsplash

管理顾问们早就知道:你首先要努力创造一个解决方案,然后你需要一个连贯的故事情节来传达这个解决方案。自然,解决这个问题从分析可用数据开始。在这方面,咨询师和数据科学家非常相似。让我们在下一步中利用他们的一些技巧。

数据让人思考,情绪让人行动。安东尼奥·达马西奥

一个常用的组织陈述的框架是情况-问题-解决方案-下一步框架,是 SPSN 的缩写。它在 EY 围绕美联社罗伯特·容的数字化战略实践中得到完善。仅用四张幻灯片,你就能交流任何问题并触及其解决方案。

**情景:**首先,向你的听众描述一下当前的状态。你试图改变的现状是什么?

**问题:**接下来,图片问题。这种情况有什么问题?你想解决的痛苦在哪里?

**解决方案:**提出解决方案。你如何解决这个问题?你如何治愈疼痛?

**下一步:**你说服了观众。你下一步需要做什么?需要采取哪些措施?

让我们将这个框架应用于一个常见的数据科学目标。你是一家电子商务公司的一员,试图说服你的上司开发一个推荐系统。空白幻灯片可能看起来像这样。

正如你所看到的,SPNS 框架清楚地展示了我们需要的四张幻灯片来说服观众我们的想法。但是仍然缺少一些东西。接下来让我们用成功模型来丰富故事情节。

你故事中的盐

既然你已经创造了原始的故事情节,让我们把它变成一个故事。

Photo by Dan Gold on Unsplash

奇普和丹·希斯在他们经常被引用的书《粘人》中分析了所有粘人故事的共同点。它们都在某种程度上使用了成功模式的元素。这个模型将帮助你的想法在演示结束后仍能被观众所接受。缩写代表以下内容:

**简单:**保持简单。数据科学家经常会爱上技术细节。真正专注于你试图传达的最重要的信息。

**出乎意料:**利用惊喜的元素来获得观众的注意。打破预期模式。

**具体:**用具体例子。帮助你的听众或读者描绘出你试图解决的情况。

**可信:**获得可信的资源来支持你的主张。使用数据或外部验证,让你的故事可信。

**情感:**记住,不是你的数字会让人在意,而是你的人物故事会让人在意。我们希望帮助人们,而不仅仅是降低成本或提高效率。诉诸于恐惧、快乐、惊讶、悲伤和爱恨五种情绪。

**故事:**每个故事都有一个英雄,一个要克服的障碍和一个幸福的结局。试着用你的观点编一个故事来帮助它坚持下去。

让我们将这些元素添加到空白结构中,为我们的故事增添趣味。

如您所见,我们在故事情节中融入了大部分成功元素。虽然这并不是每个好故事所必需的,但肯定会有所帮助。

第三步,你将为你的演示配上视觉效果。视觉效果越多,要点越少越好。插入贵公司的收入图表并使用公司风格指南。无论你如何进行,你的故事情节现在已经很清楚了。

xPhoto by rawpixel on Unsplash

数据科学家必须有效沟通。您已经看到了如何利用讲故事的力量将数字转化为情感和行动。当你准备下一个演示、帖子或演讲时,请记住这个混合框架。会有回报的。

关键要点:

  • 为了说服人们,讲一个故事
  • 使用情景-问题-解决方案-后续步骤框架奠定基础
  • 整合成功元素,创造一个故事

关闭

亚马逊首席执行官杰夫·贝索斯禁止在高管会议上使用幻灯片。相反,他要求演讲者以叙述的方式写 6 页的备忘录。它可以展示用户、团队成员或媒体如何撰写关于虚拟新产品的故事。杰夫明白讲故事的力量。你知道吗?

附加材料

[## 如何讲一个有说服力的故事

两种讲故事的结构将帮助你在生活和商业中获得成功

medium.com](medium.com/the-mission…) [## 光有数据是不会让你起立鼓掌的

几年前,布琳·布朗博士在 TEDx 休斯顿发表了一个关于“脆弱的力量”的演讲。作为一个…

hbr.org](hbr.org/2014/04/dat…)

用数据讲故事:商业专家数据可视化指南

原文:towardsdatascience.com/storytellin…

对于任何需要使用数据与他人交流的人

所以你想用数据创造更好的故事。此外,您还希望创建更好的数据可视化,从而更好地了解人们,并潜在地获得一些可行的见解。

如果答案是是的,那么继续读下去。

在我的一篇文章中,我在实际工作经验中从数据科学中学到的 5 个教训沟通技巧和讲故事是我希望在加入实际工作环境之前能够意识到并学到的两个教训之一,因为这两个教训是如此重要*——我是认真的。*

不久前,我碰巧读了一本书——用数据讲故事:商务人士数据可视化指南——作者是 科尔,用数据讲故事的创始人,也是一位备受追捧的演讲人和作者,他的主题是“用数据有效沟通”。

在对铺天盖地的关于如何用数据提高你的故事讲述的在线资源感到沮丧之后,解释的模糊性和不同方法的普遍性只是让我停滞在同一点上。

为什么是这本书而不是其他的?

(Source)

感同身受,简单明了。

在阅读这本书的整个过程中,科尔真的教会了我如何有效地与数据沟通— 同理心 — 以及数据可视化的核心和基础— 简单性

最棒的是,它教会了我如何在不丢失数据中最重要部分的情况下抓住观众的注意力。

好吧,我决定向你展示如何将你的数据转化为吸引你的读者的高影响力的视觉故事的步骤(更详细的说明可以在中找到),而不是详述我从这本书中学到的经验。

我们开始吧!

1.理解上下文

注重解释性分析(而非探索性分析)和沟通。

对我来说,理解背景就是以商业背景的形式对你的观众的情境需求感同身受。你必须真正站在他们的立场上,看看他们从哪里来,并尽最大努力通过讲故事来回答他们的问题。

在这本书里,你会明白如何将你的数据转化为读者可以消费的信息。下面是它的外观的简要概述:

  • 我在和谁沟通?
  • 我想让我的观众知道或做什么?
  • 我如何利用数据来帮助阐述我的观点?

2.选择有效的视觉效果

如今,在常见的商业环境中,有如此多类型的图表泛滥,但其中只有少数将只适合大多数你的需求。

事实上,在某些情况下,您甚至不需要图形来显示数据,只需简单的文本即可。

因此,选择一个有效的视觉效果就是对你选择的视觉效果进行选择。在商业环境中,一些常用的视觉效果(如 Cole 所建议的)包括简单的文本、表格、热图、点和线图、条形图以及区域。

这里的描述绝不是详尽的,我强烈推荐你参考这本书以获得更多的细节。相信我,你会喜欢的!

3.消除杂乱

***对,杂乱。*期。

很多时候,我们太喜欢自己创造的视觉效果了,只是意识到(或者没有意识到)在一张图中有如此多的视觉元素占据了空间,却没有增加观众的理解。

人类大脑的精神处理能力是有限的

杂乱只会使视觉更加复杂和难以理解,因此,观众的注意力可能会在我们没有注意到的情况下分散,这只是因为我们处于一种自欺欺人的状态我们的图表就像它本来应该的那样工作。

通过检查每一个视觉元素的需求,你会在书中找到各种实用的方法来逐步消除混乱。

还记得这项工作吗——移情?每一个视觉元素都应该满足观众的需求。

4.在你想要的地方吸引注意力

一旦我们选择了一个有效的视觉效果并去除了所有不必要的混乱,这就是我们需要想出如何吸引观众注意力的地方。

要吸引观众的注意力,就要理解他们是如何看待我们的视觉传达并与之互动的,通常是下意识的。

科尔介绍了一个强大的工具——前注意属性来做到这一点。她解释复杂主题的独特方式是我喜欢这本书的主要原因之一。

5.像设计师一样思考

把你的数据可视化想象成你的产品。

制作你自己的视觉效果——瞧!现在你成了设计师。太好了。我们继续吧。

从不同的角度像一个设计师一样思考,就是要很好地意识到数据可视化如何与你的观众沟通,以及观众如何与你的视觉效果互动。这两点之间的相互作用是一个优秀的数据可视化的基础。

书中讨论了 3 个关键要素,即可及性和审美。此外,书中还教授了更多的策略来让读者接受你的视觉设计。

6.讲故事

最后一步讲故事的部分来了。

想象你刚刚看了一部精彩迷人的电影,故事情节精彩。你被带你踏上难忘旅程的故事所吸引,并最终引起你的情感反应。

几个月甚至一年后,你仍能清晰地记得故事情节。

就我个人而言,我喜欢看电影,因为我相信电影是我们生活的反映,也许是以一种更夸张的叙事方式——但教训是一样的。

用故事从情感上吸引我们的观众,这是事实所不能做到的。

保持简单。

要真实。

不要为自己而沟通——要为你的听众而沟通。

这个故事不适合你; 这个故事是为他们准备的。

如果你擅长数据可视化,但在讲故事方面有困难。那么这本书是给你的。它教你如何用叙事结构从头到尾构建一个故事。

此外,还有一些有用的技巧可以让你的故事对观众来说更加清晰。

最后的想法

(Source)

感谢您的阅读。

最终,从数据中获得的见解总是相同的(前提是这些见解是正确的)。

但是使这些见解不同的是从这些见解中得出的影响和可行的计划。这种差异可以归结为你如何通过精彩的故事讲述来传达你的数据见解。

你可以在这里 得到本书

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

关于作者

*Admond Lee 目前是东南亚排名第一的商业银行 API 平台Staq**—*的联合创始人/首席技术官。

想要获得免费的每周数据科学和创业见解吗?

加入 Admond 的电子邮件简讯——Hustle Hub,每周他都会在那里分享可行的数据科学职业技巧、错误&以及从创建他的初创公司 Staq 中学到的东西。

你可以在 LinkedInMediumTwitter脸书上和他联系。

* [## 阿德蒙德·李

让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。

www.admondlee.com](www.admondlee.com/)*

Stowers 科学家使用人工智能来揭示蛋白质相互作用网络中的新关系和组织原则

原文:towardsdatascience.com/stowers-sci…

我们在 Stowers 医学研究所的长期合作者上个月刚刚在自然科学报告上发表了一篇题为“扰动蛋白质相互作用网络中拓扑网络模块的识别”的论文。Stowers 也发布了一份新闻稿。这是我们与 Stowers 合作的第三份出版物( PLOS 报纸EMBO 报道)。我在之前的博客中写过一些关于这篇论文的内容。

斯托斯的科学家们确定了拓扑网络模块,这些模块由在网络中特定位置发现的具有共享属性的蛋白质组成。生物网络由功能模块组成,然而识别和表征这些模块是困难的。第一作者 Mihaela Sardiu 博士的机场类比非常贴切,“将蛋白质想象成轴辐系统中的机场。该系统在其正常状态下以一种方式工作。但是当一场暴风雪关闭了一个主要的枢纽会发生什么呢?网络的一部分受到影响。网络中某个部分的变化不仅会影响该部分,还会影响周围的部分。”

使用机器智能,作者比较了酿酒酵母中完整的 INO8O 蛋白复合物与破坏的 INO8O 蛋白复合物的分析数据。有趣的是,机器智能不仅捕捉到了复合体内部的结构模块性,还捕捉到了整个网络的模块性,因此命名为拓扑网络模块。此外,作者将机器智能应用于分析先前发表的扰动的人类蛋白质相互作用网络,其中 HDAC 抑制剂 SAHA 用于破坏人类 Sin3 蛋白质相互作用网络,其中机器智能揭示了与 INO8O 网络明显不同形状的网络。

随着更多受干扰的蛋白质相互作用网络变得可用,用像我们这样的高级数学工具分析这些数据集可能会为癌症和其他人类遗传疾病等疾病的研究提供新的见解,在这些疾病中,蛋白质相互作用网络因化疗或固有疾病本身而改变。通过研究蛋白质及其环境,研究人员希望深入了解广泛的生物功能,包括耐药性和导致癌症的突变。

这项工作得到了 Stowers 医学研究所和 NIH 国家普通医学科学研究所的资助。

如果您愿意合作,请通过collaborators@ayasdi.com联系我们。

奇怪的事情:分析和交流数据的五个教训

原文:towardsdatascience.com/stranger-th…

作为一名统计领域的研究生,我很快意识到,不与数据打交道的人对统计这个词通常会有两种反应:“哦,我讨厌那门课!”和“你一定很喜欢数学!”

几年后,我从这些对话中感觉到,虽然许多人认为统计学和数据科学很重要,但大多数人认为这些技术太过深奥,无法解决他们在自己生活中遇到的问题或好奇心。

我最近尝试了两种方法来打破这种观点:1)使用数据来调查非统计学家可能会感兴趣的问题;2)以吸引人且易于理解的可视化方式呈现数据。

我最近参与的一个项目就是这两种努力的一个很好的例子。在这个项目中,我使用了广受欢迎的科幻节目的公开脚本,试图理解该节目的创作者如何使用情感,以及这种情感如何影响观众的体验。一路上,我学到了一些关于如何有效地获取、分析和交流数据的东西。

1。数据是存在的,但它可能是混乱的

互联网的兴起和用于分析大量数据集的方法的快速增长,往往使得任何问题似乎都可以通过足够的网络搜索和正确的工具来回答。事实往往要复杂一点。我通常发现,虽然很多数据可以在网上免费找到,但你常常不得不做出一些牺牲。

当我着手分析《陌生事物》的剧本时,我设想了一个丰富的数据集,里面有这部剧的所有台词,标有说这些台词的角色和台词发生的时间。我希望看到每个角色的发言时间,每个角色在每集中的个人情绪特征,甚至任何两个角色之间的对话模式。相反,这是我唯一能找到的:

我平静地接受了缺少说话者信息的事实,但仍然决心探究情感是如何在剧集中发展的。幸运的是,统计学找到了方法。我将每集中的单词串成长向量,并根据公开可用的词典为每个单词指定一个情感值。瞧,我有我的时间流的情感。不幸的是,网飞不够善良,无法在对话中说出所有角色的情绪,角色也不够可预测,无法从一种情绪平稳过渡到另一种情绪。这让我有了下一个认识:

2。不要害怕半武断的决定

与精心策划的私有数据集不同,公共数据的使用通常需要分析师在通往结果的道路上做出许多(有时是主观的)决策。有了包括非对话信息(“Joyce 咯咯笑”、“Mike 喘息”)和从单词到单词的快速情绪转换的情节向量,两个这样的决定几乎立即出现。

首先,我包括没有说的单词吗?我认为,是的,像咯咯笑和喘息这样的词包含了相关的信息。第二,我如何平滑轨迹,使它们更容易解释?我决定使用滑动窗口方法(如下图所示),并选择了 40 个单词的窗口宽度。为什么是 40?嗯,剧集通常有 350 到 400 个词,有一个已知的情感分数,所以使用大约 10%的剧集数据似乎是一个很好的折中方案,介于使用太少数据和出现剧烈波动之间,以及使用太多数据和忽略重要的小规模变化之间。

像这样的决定可能是有风险的,所以根据情况,通常有两个好的选择来处理它们。对于重要的分析,最好尝试几个选项,以确保您的选择不会彻底改变您的结果。如果是这样,这可能是一个信号,表明应该以一种不那么武断的方式做出决定。对于不太重要的分析(比如,一个关于电视节目的周末项目),最好至少让你的读者知道你的决定。在这两种情况下,提前做出这些决定可以为新的想法和技术打开大门。

在我的帖子中,我成功地提到了我选择的窗口宽度,这成为了与一位读者进行有趣的电话交谈的话题,尽管我忘记了包括我对非对话线索的决定,但另一位细心的读者很好奇,问了。在这两种情况下,读者对这些决定的意识导致了有价值的讨论和对未来研究的想法。

3。丑陋的数字掩盖了有趣的结果

许多统计学家和数据科学家都非常擅长数据可视化,但许多人在分析完成和最终产品创建完成之前,不会花时间让视觉效果变得有吸引力。有了清理过的情绪数据在手,那就是我被误导的方法。

我对数据的第一印象是一个意大利面条图,所有 17 条情感轨迹相互叠加。在仔细观察了每一个之后,我得出结论,它们似乎都在移动,但没有任何明显的模式。我很快按季节给它们涂上颜色,看看这两季是否倾向于显示不同的剧集轨迹,但两季的模式似乎大多是随机的。

幸运的是,在继续之前,我决定即使轨迹本身并没有提供太多信息,读者也可能希望有机会看看它们。因为堆叠的轨迹很难看到,所以我制作了一个动画,一次突出一集。

在看了几集之后,我开始注意到在轨迹上似乎有一些共同的模式。在根据两两相似性创建了剧集网络之后,我对数据应用了基于网络的聚类技术,发现了三组高度可解释的剧集:一组以高音开始,以低音结束,一组围绕中性波动,一组以低音开始,以高音结束。

这成为最有趣的发现之一,如果我没有在分析过程的早期花时间制作一个视觉上吸引人的数据表示,它可能会被错过。虽然快速散点图和直方图有其时间和地点,但通常重要的是要记住,图形越好,就越容易理解数据想要表达的意思。按照这些思路:

4。让你的数据讲述自己的故事(但要小心)

当我着手这个项目时,我设想了一项研究,研究剧集的情感特征如何与它们被批判性接受的方式相关联。我选择使用 AV 俱乐部的评分,因为他们是最知名的发布每集评分的机构。不幸的是,他们当时还没有发布他们的最后两篇评论,这意味着我要等几天才能进行这些测试。在我等待的时候,我制作了一个网络结构的动画,看着剧集来回跳动,并注意到在每集之间网络上似乎有惊人的大跳跃。

相邻情节之间的这种明显不同成为一项分析的灵感,该分析显示相邻情节之间的相似性明显低于你预期的随机发生。这个结果让我推测,改变剧集的情感结构可能是一种让观众参与进来的写作或导演策略。最终,情感轨迹与 AV 俱乐部的评级没有明显的关系,但“让观众着迷于变化的轨迹”的发现很快成为读者的最爱,尽管我在开始分析时并没有想到这个测试。

然而,我把“但是要小心”放在这一节的标题中是有原因的。也就是说,尝试任何仅仅因为其他分析没有结果而看起来有希望的测试从来都不是一个好主意,因为在让数据讲述它们的故事和要求数据讲述不存在的故事之间有一条细微但重要的线。如果数据看起来不像有故事可讲,不要继续挖掘积极的结果。相反,想想你的假设可能有缺陷的地方,并写下你的负面结果。你永远不知道那些负面的结果会对其他人产生什么样的影响。但也许最重要的是:

5。记住你的听众

回顾这个项目,我不得不承认,尽管我有意识地努力让我的作品为广大观众所理解,但我认为我并不成功。虽然这项工作在数据科学家和统计学家中很受欢迎,但非统计领域的密友承认,他们不太能理解我的分析,而且这篇文章通常被认为是相当技术性的。

如果我能再做一次,有些事情我会做得不同。首先,我会花更多的时间来考虑我的作品希望接触到哪些人群,并仔细评估这个群体中的某个人对什么感兴趣,什么不感兴趣(甚至不可读)。第二,虽然不总是可能的,但我会致力于创建一个单独的部分来更详细地描述我的方法,从而在主帖子中腾出空间来进行更多概念性的解释和说明。

总的来说,这个项目是一次奇妙的学习经历,也是一次与程序员、数据科学家和陌生事物爱好者见面和分享想法的好机会。如果在这个过程中,我能够启发更多的非统计学家考虑统计在日常生活中的相关性,或者向数据分析师介绍他们可以用于自己研究的新方法,那么这些时间是非常值得的。

探索项目此处

原载于datadrivenjournalism.net

伦敦地层 2017

原文:towardsdatascience.com/strata-lond…

我上周去了 Strata London,了解了英国数据工程和分析的现状。当然,这只是一个技术会议,所以当你在那里时,这是一种人工现实。但我对此早有准备,我知道科技会议可能会令人失望。以下是我学到的。

深度学习是最新的营销

一些年长的人仍然称它为“人工智能”。对于其他人来说,这是“机器学习”或“ML”。现在看来,营销机器已经把它变成了“深度学习”。

主题演讲中非常关注 ML 和数据科学。今天,ML 的大部分应用仍然集中在识别上:图像识别、语音识别和驾驶识别。这就是为什么全球互联网公司主宰这个领域:需要大量的数据来使 ML 有效。

一位学者的主题演讲表明,当数据科学与人工智能相结合时,我们可以超越图像识别来推断美丽和情感。有趣但仍然只是图像识别。

我很想看看 ML 在哪里被应用得面目全非。麦肯锡报告称,他们遇到了越来越多精通技术的首席执行官,他们有着深刻的理解,并试图找出如何应用它。除此之外,我看不到许多发言人大声疾呼 ML 集成到他们的用户服务中。

AWS 低调出席了会议,但在那里宣传 Apache MXNet 是他们在 AWS 上选择的人工智能框架。谷歌有 TensorFlow,而 AWS 支持 MXNet。TensorFlow 和 MXNet 似乎都专注于性能和规模等非功能性改进。

大数据才刚刚开始

“大数据刚刚起步”

优步

优步从他们的自动驾驶汽车项目中收集传感器数据,以测试他们的汽车在面对真实数据时做出正确的决定。今天每辆车每小时收集 250Gb。因此,对于 1000 辆优步汽车来说,这相当于每天 6,000 Tb。

我怀疑那些拥有自动驾驶汽车项目的组织将成为 hadoop 生态系统技术的领导者。其他人都会是追随者。

鉴于这一切,是时候停止使用“大数据”这个词了,它已经变得毫无意义。

蒂姆·奥莱利做了最好的主题演讲

蒂姆的讲话是会议的亮点。他是一位技术未来学家,思考的事情比其他人超前好几年。尽管这是阶层,他更多地谈到了社会经济影响和技术专家的责任,而不是数据或技术。

Tim 坚持认为包括 ML 在内的自动化应该被用来增加人而不是取代人。自动化应该被用来帮助我们做更多的事情,而不是用更少的人生产同样的东西。这是工业革命的教训,我们比以往任何时候都更富有,预期寿命也更长。

他也向我们挑战。技术是向善的强大推动力,应该用来改善大多数人而不仅仅是少数人的生活体验。这让我想知道我们行业的社交方面是否应该更强?

数据工程和数据科学是不同的领域

Strata 结合了三个不同的数据相关主题:

  1. 数据工程。这就是 hadoop 和所有支持大规模数据处理的技术。
  2. 数据科学。这更侧重于数据,而不是技术和生产分析。许多工具供应商在博览会上支持分析,如 Arcadia Data 和 Trifacta。
  3. ML。这是关于用流行的框架学习算法,让它变得更容易,比如 TensorFlow 和 MXNet。所有这些都需要大量的数据集来学习。

我试图抑制住自己的冲动,不去花时间去了解如何扩展 Kafka/Spark/Cloudera 以应对 n 百万次交易的细节。相反,我想更多地了解高级分析。让我震惊的是,与深度工程讲座相比,科学和 ML 讲座的观众是如此不同。

数据工程仍然是蛮荒的西部

数据工程就是处理大量数据并将其存储在某个地方。这种存储可以是关系存储、NoSQL 数据存储、Hadoop 或文件系统。

处理可以实时、接近实时或分批进行。在 Hadoop 的早期,一切都是关于批处理的。然而,数据流(接近实时)现在越来越受欢迎,以支持更快处理的感知需求。

试图为数据管道选择技术就像一个孩子在糖果店。有太多的选择和太多的细节困扰。由于市场不成熟,技术变化如此之快。甚至[在共同主持人中也有不同的意见](www.slideshare.net/mobile/hado… nextgeneration-data-platform)。我带走的是,

  1. 卡夫卡在制作和缓冲方面胜出。
  2. Spark 在流媒体和查询方面胜出。

数据工程很复杂,而且经常失败

Jesse Anderson 做了一场唯一的数据工程文化讲座。他告诉我们 85%的大数据项目都失败了。根据他的经验,这是因为大多数数据工程团队存在技能和经验差距。他强烈主张专业数据工程师对此进行反击。

我也很有兴趣听 Jesse 谈论与 SQL 或数据仓库相比,大规模数据处理的指数级复杂性。这与我看到的技术景观产生了共鸣。因此,当数据量和处理吞吐量不需要时,技术架构师必须抵制部署大规模数据处理技术的冲动。

2017 年是数据处理的云之年

Hadoop 解决方案在向云迁移的过程中落后于其他解决方案。这通常是出于安全或性能原因。但现在 Cloudera 已经推出了 Altus 我预计云将成为 hadoop 的默认版本。

借助 Cloudera Altus,您可以将数据保存在 AWS 中,例如在 S3,而您的集群是由 Altus 根据定义的数据管道作业自动配置的。之后,它将被取消配置。今天,它只是专注于数据工程,但预计随后将进行分析。

那么 Cloudera 的竞争对手是谁呢?谷歌在 Strata 有很大的影响力,推动他们的云、工具和深度学习。微软在博览会上有一个展位,但并不突出。AWS 基本上不存在。我预计微软 Azure 和 AWS 今年将在各自的会议上大幅提升其大数据 PAAS 服务。

很明显,Hadoop 只是大数据的基础设施。如果组织可以忘记管理服务器,安装 hadoop 并使用 PAAS 数据解决方案管理集群就有更大的成功机会。将数据服务转移到 PAAS,不仅会将数据项目推向更高的价值,还会让市场走向成熟。

想在 Kainos 做数据工程师或者数据科学家?点击这里了解更多信息

成为成功 Youtube 的策略:广泛的 Youtube 探索性分析(第 1/2 部分)

原文:towardsdatascience.com/strategies-…

为 Youtubers 开发数据驱动的策略

你通常花多长时间看 Youtube?你最喜欢的频道是什么?最近什么频道最受欢迎?Youtube 正在成为主要的社交网络平台之一,甚至是一个正在崛起的搜索引擎。用户甚至数字营销人员都明显将注意力从脸书转移到了 Youtube。Youtuber 现在是一颗冉冉升起的新星。他们用自己独特的内容与人们联系在一起。拥有超过数百万的用户,youtube 明星不仅通过观看视频来盈利,还通过开展自己的业务来盈利。

在这个不断变化的潮流中,我制定了一个计划,为 Youtubers 制定策略,并建立一个模型,根据它们的内容预测观看人数。这篇文章将分为两部分。在第一部分,我们将广泛地探索数据。然后在第二部分的中,我们将建立一个带有单词嵌入的预测模型。我使用了来自 Kaggle 的数据,但是用 Youtube API 添加了一些。数据集和完整代码可在 Github 上获得。

Youtube 上最大的频道有哪些?

首先,我查找了拥有最多视频和订户的前 20 个频道。正如您在上面看到的,这两个频道列表互不相同。大多数有大量视频的频道都是电视节目、广播或组织,如今夜秀、Vox、艾伦秀、网飞。另一方面,那些拥有大量订户的是音乐频道,如艾德·希兰、泰勒·斯威夫特、阿姆、爱莉安娜·格兰德

Youtube 上最热门的话题是什么?

这次让我们更深入地探讨话题。共有 16 种主题,我统计了每个主题的视频和频道数量。Youtube 上你最喜欢的话题是哪个?有哪些热门且竞争激烈的话题?

视频和频道号的分布显示出不同的模式。y 轴上的主题顺序是一样的。我按视频数量排列顺序,然后在频道剧情中设置相同,这样就很容易上下查看了。娱乐在两个情节中都是第一位的。音乐,人物&博客,Howto &风格,科学&科技有大量的渠道。是否可以推断它们是最热门的话题?

我统计了每个主题的喜欢、不喜欢、观点和评论的中位数。y 轴上的主题顺序也是一样的,所以您可以很容易地比较这四个计数。喜欢、不喜欢和评论计数的图表显示了类似的分布。有趣的是, Gaming 是最热门的频道,因为它在之前的剧情中拥有相对较少的频道和视频。

有视频和频道数量的剧情可以告诉你哪个话题有很多竞争对手。一个话题的频道越多,为了获得人们的关注,竞争就越多。另一方面,显示视频或观看次数的图表可以告诉你哪个话题最热门。他们可以告诉你人们的主要兴趣是什么。您还可以找到用户的喜欢和不喜欢的回应水平,每个主题的评论计数。例如,娱乐人物&博客在视频数量和订阅量排名靠前,但回复率低于预期。

时间响应呢?

响应率也可以从时间段的角度来说。要多久才能成为潮流视频?每个主题的订阅者将有不同的及时性和活跃性,所以我们可以期待在时间分析不同的模式。

左边的图显示了每个主题需要流行的天数。大多数话题有相似的分布,但是新闻&政治体育时间最短,而节目时间范围最大。右边的图表显示了一天中最流行的视频的用户数量。我们可以很容易地预计,它将需要大量的订户在一天内成为潮流,然而,它的价值范围很广。这可以推断出,订户数量不是观看的绝对因素。

这里方框的大小表示数据的大小。因此在我们的数据中,当天受到关注的节目视频很少,而时尚娱乐音乐视频很多。这可以通过下面的柱状图更容易地理解。显示了一天中流行的视频数字,这与盒子的大小告诉我们的完全相同。

作为结论,视频的反应率在话题之间是不一样的。我们可以说,喜欢看游戏的人会积极地表达他们的意见和回应。像新闻&政治体育这样传递最新消息的视频时间很短。迄今为止,娱乐和音乐一直高居榜首。但是请记住。很多人喜欢,很多竞争者。

建议用什么标题才能获得关注?

当我们浏览文本时,我们的感知是有局限的。所以标题的长度和标题的字数是吸引眼球的重要因素。标题长度对视图有影响吗?标题中包含多少单词是合适的?让我们从下面检查答案。

这些视频的标题少于 100 个字符,而浏览量最高的是 30 到 50 个字符。如果我们说一个单词通常有 5 或 6 个字符,这意味着标题中最好有 5 到 10 个单词。这与第二个图一致。字数不到 20,浏览量最高在 7 左右。因此一个 6 到 7 个字的标题可以获得更多的浏览。

标签越多真的意味着浏览量越多吗?

标签当然是一个重要的因素。但是我们应该使用多少标签呢?标签越多带来的浏览量越多真的是这样吗?

如图所示,标签的数量似乎与视图没有直接关系。最高浏览量为 4 次,但从数字上看没有明显的趋势。此外,通过正确的绘图,我们可以看到每个主题有不同的分布。这表明更多的是关于标签中有什么关键字,而不是有多少关键字。

单词 cloud 显示了主题中经常使用的标签。我带来了娱乐、音乐、游戏、喜剧、Howto &风格、旅游等例子。这些视频的浏览量超过 180 万次,占总浏览量的三分之一。虽然不能说那些观点是因为标签,但至少我们可以推断出人们对什么感兴趣,内容中有什么。

具有数字特征的绘图矩阵

最后,我使用 ggpairs 制作了所有数字变量的绘图矩阵。它有订阅者的数量、浏览次数、喜欢、不喜欢、评论、标题的长度、标题的字数和标签的数量。您可以轻松检查所有对的散点图和相关性。喜欢浏览量评论数相关。此绘图矩阵对于在开始更深入的分析之前查看要素之间的整体关系或在构建预测模型之前检查多重共线性非常有用。

结论

让我回顾一下到目前为止我们已经完成的内容。

  • 视频数量和订阅用户数量可用于评估热度和竞争力。和话题一起考虑的话,娱乐音乐最受欢迎。
  • 回复率可以从两个方面来考虑。当考虑喜欢、不喜欢和评论的数量时,游戏是高活跃用户最热门的话题。从时间段来看,像新闻&政治体育等发布最新消息的频道反应最快。
  • 标题的措辞很重要,6 到 7 个单词可以获得更多的浏览。
  • 说到标签,包含关键词比仅仅有许多标签更重要。因此,需要知道什么是主要问题。

要成为一个成功的 youtuber,拥有成千上万的订阅者显然很重要。然而,制作包含人们真正关心的内容的视频与用户数量一样重要。因此,它需要有能力阅读什么是趋势,人们有什么样的需求。

为了进一步分析,我们可以选择一个特定的主题,并在副主题上工作。它会给我们更详细的信息。使用通道进行时间序列分析也是可能的。研究流行频道的增长模式就是一个很好的例子。这种研究不仅可以用于 youtubers,也可以用于数字营销人员。如果他们通过评论进行进一步的分析,他们可以收回对如何锁定客户的洞察力。

下一步是什么?

下一个故事是关于建立一个模型来预测视图!我将讨论单词嵌入,并建立一个预测视频观看量的模型。

[## 成为成功 Youtube 的策略:广泛的 Youtube 探索性分析(第二部分)

揭开单词嵌入的神秘面纱并拟合模型以预测视图

towardsdatascience.com](/strategies-to-be-a-successful-youtuber-extensive-youtube-exploratory-analysis-part-2-2-6862cd4f40be)

如果你想鼓励一个有抱负的数据科学家,请给一个或两个或三个掌声!我将非常感谢任何反馈,所以请在下面分享您的想法或通过 LinkedIn 联系我。感谢您的阅读,再见👋

成为成功 Youtube 的策略:广泛的 Youtube 探索性分析(第二部分)

原文:towardsdatascience.com/strategies-…

关于文字嵌入和预测 Youtube 上的浏览量的初学者指南

这是为 Youtubers 开发数据驱动策略的文章的第二部分。在之前的帖子中,我们对 Youtube 的统计数据进行了深入的数据分析。如果你还没有查看第一部分的话,请花点时间看看成为一名成功的优步者的策略是什么。对于第二部分,正如我之前提到的,我们将基于视频内容预测视图。我也将在简单的英语中揭开单词嵌入的神秘面纱。这个项目的数据集和完整代码可以在我的 Github 上找到。好吧!该机器学习了。

从一键编码到单词嵌入

机器学习算法主要处理数值变量。他们对文字没有概念。就像一个除了哭什么都不知道的婴儿(在这种情况下可能是错误信息),他们对“苹果”、“狗”或“我”、“我”和“你”没有任何概念。因此,当我们处理文本数据时,当我们要教他们人类语言时,我们必须将数据转换成数字类型。这是贯穿所有自然语言处理的基本概念。

那么我们如何将单词转换成数字形式呢?我们能想到的第一种方法是把它们当作一个二元因素变量。这就是一热编码的由来。我们制作一个包含 1 和许多 0 的稀疏矩阵来表示一个单词在句子中的存在。如果你不熟悉 one-hot-encoding,请查看我之前的帖子。它逐步涵盖了文本挖掘的基础。然而,这种方法的局限性是没有语义信息。它对单词“猫”和“狗”、“是”和“我”都一视同仁。我们想要的不止于此。我们希望机器理解语言的真正含义。那怎么才能把课文的意思教给我们天真的宝宝呢?

欢迎来到世界的向量空间

老实说,我不擅长记名字。每当我有话要说,但找不到合适的词时,我总是这样说,“那是什么?”?“那是什么?”。有趣的是,我从来没有立刻得到确切的单词,而是像在黑暗中一样不断摸索,当我想说“猫鼬”时,我会说类似的话,如“松鼠”或“狐狸”这就是我们大脑的工作方式。相关的单词被紧密地放置在我们的“大脑空间”中。

单词嵌入也以同样的方式工作。让我们想象有一个很大的空白板。这是一个坐标平面,一个向量空间。我们手里有单词卡。这是我们的文本数据,术语。我们将以一种“有意义”的方式将这些卡片贴在板上。怎么会?简单!将语义相似的单词放在一起。

让我们看一个简单的例子。我们有 猫、狗、女王、国王、女人、男人 的字卡。我们可以把群体做成像 女王国王女人男人 这样的群体。还可以有更大的群体,像[ 猫,狗 ]和[ qeen,king,woman,man 。然后我们可以像上面一样把它们放到平面上。

当我们把单词放在坐标平面上时,我们给了它们位置或坐标。本例中, 皇后at(8,2)国王 at (6,4)女子 at (6,1)男子 at (4,3)。你注意到这里有一个窍门吗? 女王国王 之间的距离与 女人男人 之间的距离相同。这就是单词嵌入的真正威力所在。在向量空间中,单词之间的距离是关键点,语义存在于其中。我们甚至可以计算这类问题:什么是 **—— + ?**答案是, 女王

这是一个简单的向量空间,你做的是向量计算。现在,我们正在向机器教授真正的人类语言。他们似乎能理解一些单词的意思。但是还有一个问题。如何才能判定单词之间的相似度?你不能随心所欲地摆放它们。我们需要一个逻辑计算机制,不是吗?

物以类聚,人以群分

计算单词间相似度的一种方法是计算共现次数。一个词 A 伴随一个词 B 出现的频率有多高。如果他们经常一起出现,他们有很高的相似度。如果很少一起出现,则相似度低。喜欢..就像你和你的朋友一样。让我们以这句话为例。

我们要数一数 女王国王 聚在一起的频率或者 女王城堡 出现在邻居家的频率。你觉得 皇后国王 近到可以称之为邻居吗?那么 女王城堡 呢?是的,你用什么标准会不一样。我们称之为窗口函数和窗口大小。

女王 是我们的重点词。在这种情况下,我们只接受焦点单词两边的一个单词。原来是 。于是 女王 就对应于此。

这次让我们把窗户开大一点。我的意思是增加窗口大小。我们会接受两边各两个字。因此 城堡美丽的 也可以成为 女王 的邻居。

上下文窗口将不断切换焦点词,扫描它的邻居。如果我们把结果做成一个矩阵,我们会得到这个矩阵。

这是窗口大小为 2 的共生矩阵。根据矩阵, 城堡 对应【1,1,0,1,1,0,0,0,0】,而 对应【0,1,1,0,1,2,1,1】。我们现在可以知道哪些词经常出现在一起,这意味着上下文相似度很高。

你是在预测还是在计算?

向量化单词意味着给它们在向量空间中一个位置。通过这样做,我们可以将语义嵌入到向量中,并通过距离进行推理。矢量化有两种不同的方法,Word2vec 和 GloVe。

Word2vec 是一个“预测”模型,通过分析一个单词的邻居来确定该单词的含义。Word2vec 的一个例子是连续单词包,或 CBOW。它从周围的上下文单词中预测目标单词。

看一下上图。你能预测蓝色卡片后面的单词是什么吗?CBOW 就是这么运作的。它从当前上下文单词中预测一个单词。

Word2vec 的另一种情况是 skip-gram,预测的方向是相反的。它使用当前单词来预测其上下文单词。什么词可以作为它的邻居?

CBOW 和 Skip-gram 这两个模型由具有损失函数的浅层神经网络来训练。下图是 CBOW 和 Skip-gram 的简图。使用 CBOW 模型,我们输入类似于 learnkidsfish 的上下文词,并期望在输出层获得 school 的矢量化值。相反,使用 Skip-gram 我们输入目标单词 学校 并得到输出 学习孩子

**

另一方面,GloVe(代表全局向量)是一个“基于计数”的模型。他们使用整个语料库的共现矩阵,并计算一个单词 k 在另一个单词 w 的上下文中出现的频率。例如,我们通过条件概率 P( || )来统计 的上下文中 出现的频率。这些值将是包含单词间上下文关系的单词嵌入的结果。想象一下,考虑到 GloVe 与“全球”语料库一起工作,结果矩阵会有多大。它将是巨大的,具有高稀疏性。因此,我们需要分解矩阵,得到一个较低的维度。通过 LSA 或 LDA 等方法,我们对其进行因子分解,得到 DTM(文档-术语矩阵)或 TCM(术语共现矩阵)。

如果您感到困惑,请记住 Word2vec 是一个预测模型,它使用本地上下文窗口,而不是直接使用共现统计数据,而 GloVe 是一个基于计数的模型,具有全局共现统计数据。哪个更好?他们都擅长捕捉语义。您应该有的问题是哪一个将更恰当地表示您的数据。生成的向量显示数据的上下文含义的效果如何。因此,理解每种方法是如何嵌入语义的是至关重要的。对于那些想更深入地研究单词嵌入的人,我会在这篇文章的最后留下一些参考资料。

用 R 嵌入单词

太好了!现在,我们准备将这一惊人的技术应用到我们的 Youtube 数据中。让我们先检查一下我们的数据。

*# Importing data
us = read_csv('us.csv')
head(us)*

**

为了让你更好的理解,我稍微改变了列的顺序。我们的数据集中总共有 40949 个视频和 2207 个不同的频道。所以n在这里表示每个频道的视频总数。首先,我将预处理文本数据(标题、标签和描述)。

*# selecting text columns and combining into one
us_text = us %>%
  select(title, tags, description) %>%
  mutate(text = paste(title, tags, description))us_text$text = gsub(us_text$text, 
                    pattern = '[^[:alnum:]]', replacement = ' ')
us_text$text = tolower(us_text$text)*

用 text2vec 包嵌入单词的过程如下:

  1. 使用迭代器创建词汇表,词汇表是所有文档中唯一单词的列表。假设我们正在用训练集中的单词编写一本词典。
  2. 删减词汇,因为会有很多无关紧要的词。
  3. 向量化词汇,这是创造一个词的结构
  4. 使用迭代器和矢量化词汇,制作 DTM。我们也可以应用 Tf-Idf,得到调整后的 DTM。
*# creating an iterator and a vocabulary
it = itoken(iterable = us_text$text,
            tokenizer = word_tokenizer)v = create_vocabulary(it, stopwords = stopwords('en')) %>%
  prune_vocabulary(doc_proportion_max = .5, term_count_min = 5)vectorizer = vocab_vectorizer(v)
print(v)# casting into dtm with Tf-Idf
dtm = create_dtm(it, vectorizer)
tfidf = TfIdf$new()
dtm_tfidf = fit_transform(dtm, tfidf)dim(dtm_tfidf)*

结果dtm_tfidf有 40949 行和 60966 列。是啊!我们成功了。整个文本数据被标记为 60966 列。你刚刚把单词的真正“含义”教给了机器!

预测视图

将单词 vectors 给前面的模型是完全没问题的。但为了准确起见,我想添加其他功能。有三种特征,时间变量、二进制因子变量和数字计数变量。如下所示,我做了单独的特征工程。

*# feature engineering with time variables
us_time = us_time %>%
  select(publish_time) %>%
  mutate(year = year(publish_time),
         month = month(publish_time), 
         day = day(publish_time), 
         hour = hour(publish_time), 
         wday = wday(publish_time)) %>%
  select(-publish_time) %>%
  mutate_all(factor)# encoding factor variables into integer
us_factor = us %>%
  select(comments_disabled, ratings_disabled,video_error_or_removed) %>%
  mutate_all(factor) %>%
  mutate_all(as.integer)# preprocessing numeric variables
us_count = us %>%
  select(channel_id, n, views, subscribe, len_title, nword_title, n_tags) %>%
  group_by(channel_id) %>%
  mutate(subscribe = log1p(mean(subscribe))) %>%
  ungroup() %>%
  select(-channel_id) %>%
  mutate(views = log1p(views))*

每个频道的subscribe值不是恒定的,会有微小的波动。这可能是由于从网上抓取数据时的时间差,所以我把它们的平均值。另外,subscribeviews的分布是指数分布,所以我把它们转换成对数分布。我排除了likesdislikescomment_counts变量,因为它们发生在人们观看视频之后。因此不适合用它们来预测视图。

*# binding by column
full = cbind(us_time, us_factor, us_count)# splitting data into train and test set
part = sample(x = nrow(full), size = nrow(full)*0.8)tr_te = full %>%
  select(-views) %>%
  model.matrix(~.-1, .) %>%
  cbind(dtm_tfidf)tr = tr_te[part, ]
tr_y = full$views[part]te = tr_te[-part, ]
actual = full$views[-part]*

我把所有预处理过的数据合并成一个。为了确保随机性,我将整个集合进行了洗牌,并将其分为训练集和测试集。接下来,我将它们放入 DMatix 对象中。我使用了 Xgboost 并得到了如下的变量重要性图。哪些变量在预测中发挥了重要作用?

*# putting into two seperate Dmatrixs objects
dtr = xgb.DMatrix(tr, label = tr_y)
dte = xgb.DMatrix(te)# fitting the model
myParam <- list(objective = "reg:linear",
                booster = "gbtree",
                eval_metric = "rmse",
                nthread = 6,
                eta = 0.05,
                max_depth = 8,              
                min_child_weight = 5,
                subsample = 0.7,
                colsample_bytree = 0.7)model_xgb = xgboost(dtr, tr_y, param = myParam, 
                    nrounds = 5000, print_every_n = 100, 
                    early_stopping_rounds = 100)# predicting
pred_xgb = predict(model_xgb, dte)# ploting the importance of the features
xgb.importance(feature_names = names(tr), model = model_xgb) %>% 
  xgb.plot.importance(top_n = 30)*

订户号码是最关键的特征。频道n的视频数量紧随其后。我们还可以看到month6month4month3,分别表示发布于 6 月、4 月和 3 月的视频。我们可以得出这样的结论:用户数量、上传视频的时间、足够的标题长度以及对热点新闻的报道能够带来更多的关注。

结论

如果你想得到一个更精确的模型,每个主题的模型会更好。由于每个主题的用户有不同的模式(就像我们上次看到的那样),最好将每个主题的数据分开。有各种单词嵌入算法,它们是高级版本或以不同方式执行。因此,选择更好地表示数据的方法可以提高准确性。

我们可以在各种领域使用单词嵌入。它甚至可以应用于非 NLP 数据。在结束这篇笔记之前,我想给你介绍两个有趣的可以启发你的项目。一个是使用 word2vec 进行音乐推荐Ramzi Karam 另一个是为学生量身定制数学练习Kwyk

资源

感谢您的阅读,希望这篇文章对您有所帮助。如果有需要改正的地方,请分享你的见解!你的掌声让一个有抱负的数据科学家在地板上跳舞。👏 👏 👏我总是乐于交谈,所以请随时通过 LinkedIn 联系我。我将带来另一个激动人心的故事。在那之前,机器学习快乐。

数据科学家的战略

原文:towardsdatascience.com/strategy-fo…

Strategic Planning

美国教授军事战略的一个关键方法是根据“战略=目的+方法+手段”的公式,未来的军事领导人利用这一总结来分析过去指挥官的战役。

使用这个公式提供了一种能力,可以看到和分析战略是如何根据目标而变化的。

Art Lykke 在讨论方法和手段的文章中提供了一些军事目标的例子。它们包括“保卫家园”、“收复领土”和“遏制侵略”。举例来说,直观地说,“威慑侵略”可以通过投射一个强大力量的外观而不发射一发实弹来实现,但“恢复领土”将需要入侵目前被敌人占据的地区。

对于数据科学家来说,关注目标和实现目标的手段之间的差异是有益的。与“沟通”一词相比,“可视化”一词在数据科学家(指制作图表的工具——一种沟通方式)的文章中的使用次数,或者“说服”或“说服”等词的使用次数,显示了数据科学家对他们所服务的目的的方式方法的关注。更能说明问题的是像这样的文章,数据科学工具——执行数据科学战略的手段——没有讨论它们可以用来实现的目标。

Frank Harrell 在《回归建模策略》中提供了许多策略,这些策略实际上暗示了两个正交轴——一个衡量从无到优的预测能力,另一个衡量从无到优解释输入的作用的能力。他还建议采取互补策略,为预测和推断创建有效的独立模型。

这种分析提供了低层次的目标(“建立一个即使不能理解也能很好预测的模型”或“建立一个能被理解的模型,即使其他模型能更好地预测”),但没有考虑更高层次的目标。请注意,哈雷尔的文本提供了充分发展的战略,在提出目标后,他概述了实现这些目标的方法。

这突出了军事战略与数据科学战略具有共同点的另一种方式——人们已经认识到,军事手段经常被用来支持政治目标。这一点在越战结束时美国上校萨默斯和北越上校涂之间的著名对话中得到了鲜明的体现——当萨默斯上校说“你知道,你永远不会在战场上击败我们”时,涂上校反驳说“这是真的,但也无关紧要”。

在设计数据科学的策略时,总是存在这样的危险:一个执行良好的模型,其表现超出了设计者最乐观的预期,完全无法增加销售额或利润,或降低成本,或在任何其他方面对业务目标有意义。

更不可思议的是,数据科学策略最初可能是成功的,但后来却因政治反弹而成为一个沉重的负担,或者因失去用户信心而失败。

在科技领域,脸书是一家冒险经历类似美国越战经历的公司的例子——他们已经实现了“军事”目标,但现在面临政治风险。本周,脸书和马克·扎克伯格出现在新闻中,扎克伯格出现在美国国会面前。

扎克伯格提到开发一个人工智能系统,在 10 年的时间框架内检测仇恨言论。他的目标是赢回脸书用户和其他利益相关者的信任,比如立法者。然而,虽然这一战略具有明确的目标和实现目标的手段,但这些手段并不能完全满足目标——开发技术来筛选仇恨言论本身并不能赢回人们的信任。要做到这一点,脸书将需要一个完整的战略,以确保人们相信他们可以脸书可以保护他们免受仇恨言论——一个沟通或说服策略。

各地的数据科学团队都需要充分了解他们的目标,以便全面制定有效的战略。这通常意味着应用防御策略——一种预测对自身成功的威胁的策略。当然,成功的意义需要更密切的关注和更深入的思考。

查我的书进行中 懒惰的数据科学家 leanpub!

将 Twitter 数据流入 MySQL 数据库

原文:towardsdatascience.com/streaming-t…

鉴于我经常看到数据库语言被列为数据科学工作的要求,我认为今天在 MySQL 上发表一篇文章是个好主意。特别是,我想看看我们如何使用 python 和 API 将数据直接传输到 MySQL 数据库中。我最近为一个个人项目这样做了,我想我应该分享我的代码,并为那些可能不熟悉这些工具的人提供一个入门教程。

我们将使用 Twitter API 来搜索包含特定关键字的推文,并将其直接传输到我们的数据库中。一旦我们做到了这一点,数据将随时可供进一步分析。这项任务需要几样东西:

  1. Twitter 帐户和 API 凭证
  2. MySQL 数据库
  3. Tweepy 和 mysql-connector Python 库

Twitter API

在我们访问 API 之前,您需要设置一个 twitter 应用程序。我不会就此做深入的指导,但简单地说,你需要做以下事情:

  • 转到以下网站developer.twitter.com/并创建一个帐户。(这一步比以前要复杂一些,包括提供一个简短的概要,说明你打算如何处理这些推文,以及它们的用途。我认为这与新的欧盟隐私法有关。)
  • 一旦您验证了您的电子邮件,您就可以登录您的帐户。你应该可以在下面的网页上创建一个新的应用:【developer.twitter.com/en/apps
  • 填写关于您的应用程序的所有详细信息,然后创建您的访问令牌。
  • 记下您的消费者密钥、消费者机密、OAuth 访问令牌和 OAuth 访问令牌机密。这些是连接到 API 所需要的。

想要更完整的教程,我推荐这篇的博文。完成这些步骤后,如果我们编写了正确的代码,我们的应用程序现在就可以连接到 Twitter 流 API 了。接下来,我将完成 MySQL 数据库的设置,这样我们就有了存储所有数据的地方。

MySQL 工作台

有许多不同类型的数据库可以用于这个特定的任务,包括 NoSQL 数据库,如 MongoDB 或 Redis。然而,我选择使用 MySQL,因为我对它更熟悉,而且它仍然是最受欢迎的数据库之一。在开始之前,我们需要安装 MySQL Workbench 和 MySQL server。这里的是一个视频教程,解释如何安装两者,并设置好一切开始收集数据。

一旦你完成了上面的教程,你应该已经建立了一个连接和一个模式/数据库(我的数据库被形象地称为 twitterdb )。在我们设置好 MySQL workbench 并对界面有所熟悉之后,我们最终可以创建一个表来存储我们的 twitter 数据。创建一个表非常简单,我们可以使用 UI 甚至使用查询。使用 UI,我们只需右键单击数据库,然后单击 create a table。然后,我们可以直接输入列名和数据类型。此时,值得考虑我们要存储的数据以及它们将是什么样的数据类型。为了更好地理解我们需要的数据类型,我们应该看一看 TwitterAPI 文档。本质上,我想要写下 tweet 的人的用户名,创建的时间tweetretweet count ,tweet 发起的地点地点(下面有更多信息)。这相当于 6 列加上主键,我们可以如下定义数据类型:

  • 主键:INT(11)
  • 用户名:VARCHAR(255)
  • created_at: VARCHAR(45)
  • 推文:文本
  • retweet_count: INT(11)
  • 位置:VARCHAR(100)
  • 地点:VARCHAR(100)

计算机编程语言

好了,现在我们已经建立了数据库,是时候开始学习 Python 代码了。我们希望代码做几件事:

  1. 我们想要创建一个允许我们连接到 Twitter API 的类。
  2. 我们还需要创建一些连接到数据库的代码,并将数据读入正确的列。

我们将使用 Tweepy 库,这将使我们很容易连接到 API 并开始传输数据。在我们开始之前,我们将再次看一些美味的文档。在 Tweepy 文档中,我们可以找到一些真正有用的类和方法的例子,我们需要用它们来与 API 进行交互。下面的代码是一个简单的例子,它允许我们连接到 API 并从我们的时间线打印推文:

import tweepyauth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)api = tweepy.API(auth)public_tweets = api.home_timeline()
for tweet in public_tweets:
    print(tweet.text)

好吧,希望这很简单。看起来我们只需要设置我们的凭证,访问时间线并循环打印出来。我们想做的有点不一样。我们希望将实时推文传输到我们的数据库中,根据文档,需要做以下三件事:

  1. 创建一个从 StreamListener 继承的类。
  2. 从此类实例化一个对象。
  3. 使用此对象连接到 API。

这似乎很简单。让我们看看我们是如何用 Python 来做这件事的( 完整代码在 文章的最后)。我们需要导入一些库,还需要为数据库设置令牌、密钥和密码。我将所有这些保存在 setting.sh 文件中,该文件使用下面的代码调用,并将令牌和密钥设置为环境变量。

subprocess.call(“./settings.sh”, shell=True)

注意,在我们的导入中,我们需要 mysql-connector 。同样,这里有一些关于这个库如何工作的有用的例子。我们可以在终端(我在 Mac 上)使用 pip 命令安装任何我们没有的库,如下所示。然后,我们应该能够从脚本中导入这些库。

pip install mysql-connector
pip install tweepy

接下来,我们需要设置从 StreamListener 继承的类。我们将给这个班三种方法。这些是类已经实现的方法,我们将覆盖它们。下面的代码实现了这一点。

让我们一步一步地检查一下,以确保一切都很清楚。第一个方法, on_connect() 只是在我们连接到流时通知我们。每当我们的 HTTP 状态代码不是 200 (200 表示一切正常)时, on_error() 方法就会打印一个错误。感兴趣的代码列表:en.wikipedia.org/wiki/List_o…

好了,下一个方法, on_data() 稍微复杂一点。为了理解这一点,我们需要对 tweets 的结构有更多的了解。当我们访问 API 时,我们得到一个 JSON 响应(非常类似于 python 字典的结构)。更多信息在这里

本质上,我们返回的 tweet 对象如下所示:

{ “created_at”:”Thu Apr 06 15:24:15 +0000 2017", 
  “id”: 850006245121695744, 
  “id_str”: “850006245121695744”, 
  “text”: “1/ Today we’re sharing our vision for the future of the    Twitter API platform!nhttps://t.co/XweGngmxlP", 
  “user”: {}, 
  “entities”: {} }

因此,我们有一个 JSON 对象,它包含键、值对(注意,这里没有列出我们将使用的一些属性)。那么,我们实际上想要从中获得什么数据呢?tweet 对象实际上提供了相当多的信息,我建议浏览一下文档,看看您可能对哪些属性感兴趣。对于这个分析,我选择收集用户名、推文创建时间(如果我们随着时间的推移收集推文,这将更有用)、实际推文、推文的国家、位置(更接近本地)以及最后的转发数的数据,这反映在上面的代码中。

最后几行调用了将变量作为参数的 connect() 方法。这段代码全部被包装在一个 try 中,除了语句来捕捉我们可能遇到的任何错误。

好了,你可能已经注意到我们还没有创建 connect()方法,所以让我们创建它。这个方法并不奇怪,它会连接到我们的数据库并输入所有的数据。如前所述,该方法接受在 StreamListener 类的 on_data()方法中创建的变量作为参数,并将它们插入到数据库中同名的列中。要连接到我们的数据库,我们只需使用 connector.connect 方法,并传入我们的数据库信息,这些信息可以从 MySQL workbench 中找到。如果连接成功,就会创建一个游标对象,允许我们执行 SQL 语句。现在我们可以编写查询,并使用 execute 命令将数据插入到我们的 twitterdb 数据库的正确表中。当 is_connected()为 true 时,我们的数据库连接保持打开,并不断地将数据输入数据库,直到我们在终端中终止它(使用 Ctrl+C)。

我们可以创建一个单词列表来过滤流。我是一个高尔夫迷,所以我决定搜索与高尔夫相关的单词。实际上,你可以在这个列表中放入任何你想要的东西。

现在,我们只需要设置我们的脚本,以便在从终端执行文件时调用这些函数。为了访问 API,我们需要将我们的凭证作为参数传递给oauthandler方法和 set_access_token 方法。接下来,我们通过传入经过验证的 api 对象和侦听器来创建流。我们还可以在这里创建要过滤的单词列表。要启动这个流,我们只需在我们的流对象上调用 filter 方法,并将我们的单词列表作为参数传入。我将这个脚本保存为 StreamSQL.py.

如果我们想运行这段代码并开始收集 tweets,我们可以使用终端。这里需要注意的一件重要事情是,我们需要确保我们的 SQL server 已经启动并且正在运行,以便脚本能够正常工作,因此在运行脚本之前仔细检查这一点是值得的。

我们可以直接从存储脚本的文件夹中打开终端,只需输入:

python StreamSQL.py

结论

希望这表明用 MySQL 建立数据管道并不复杂,尤其是在利用 Python 提供的强大库时。SQL 是从事数据科学的一个非常重要的方面,如果你曾经在招聘广告中看到过数据科学家的要求,这一点是非常明显的。尽管这并不涉及对 SQL 或编写复杂查询的深入理解,但我认为能够理解这种任务仍然非常有用。

对于那些有兴趣学习更多 SQL 知识的人,我参加了以下免费的课程,我发现它非常适合练习一些关键概念和理解一些更高级的功能。我向任何对提高 SQL 技能感兴趣的人推荐这本书。在以后的帖子中,我将集中精力提取我们收集的原始数据,清理它并执行一些简单的分析,这将说明我们可以用这种类型的数据做一些有趣的事情。

下次见!!

链接第二部分:https://towardsdatascience . com/building-an-ETL-pipeline-in-python-f 96845089635

加强大会的职业规划

原文:towardsdatascience.com/strengtheni…

在开始我的职位后,我花了一些时间来反思我在大会的数据科学沉浸式项目中的经历。该计划的教育部分非常出色,为我在当前职位上使用的技能奠定了基础。我可以毫不犹豫地说,课程很有针对性,老师也很有帮助。然而,事后看来,当我写了我的文章,讲述我是如何从该项目的教育部分毕业到职业服务部分(又名 Outcomes) 时,我认为我太乐观了。

不要误解我,GA 的职业服务部门 Outcomes 做了很多正确的事情。我们每周四在项目的教育部分会见 Outcomes,这很有用。他们查看了我的简历,和我一起做了面试准备,帮助该领域的数据科学家讲课,等等。在项目结束时,他们还促成了一场名为“学生聚焦”的招聘会,我们在会上向优步、蓝色实验室和摩根富兰克林咨询公司展示了我们的投资组合。此外,如果不是 Outcomes 指导我定期写作,我可能不会有这个博客,对于以上所述,我很感激。

然而,当我们从这个项目毕业并进入全面求职模式时,我们每周都与蔻驰的 Outcomes 公司进行电话会议。起初,我对入住感到非常兴奋。但是随着时间的推移,我想知道“这对我真的有帮助吗?”考虑到这一点,我提出两个建议,我相信如果大会实施这些建议,将会加强他们的毕业后职业规划:

  1. 双重责任— 要获得成果支持,你需要每周申请 10 份工作,每月参加 2 次社交活动。我们必须将此输入到谷歌文档中,以便我们的成果职业蔻驰进行审查。

Outcomes 知道我每周都在找工作。但我总是不知道在同一时间段内 Outcomes 对我有什么帮助。

Outcomes 应该使用的责任衡量标准是他们与你联系的雇主数量。简历回顾和面试准备是很好的,但是最快的方法是在一家公司认识某人。Outcomes 应该每周向学生报告这一点,就像学生应该向 Outcomes 报告他们的求职进展一样。

2。拓宽其职业论坛— General Assembly 使用 Slack 与学生交流。我们有自己的 DC-DSI Slack 团队和机会渠道。如果校友/员工正在招聘或知道有人在招聘,他们会发布帖子。这很有用,但下面是 GA 如何让它更上一层楼:

  • 在全国范围内扩张——如果出现合适的职位,我愿意留在 DC,但我更愿意搬回洛杉矶。其他学生也在考虑搬到西海岸、纽约和北卡罗来纳州。大会应该为所有全球校友创建一个论坛,这样我们就可以知道所有潜在的工作机会,无论他们在哪里。
  • 扩大到雇主——这个论坛也应该向在大会登记的潜在雇主开放。如果他们想发布一个机会,他们需要发布他们的姓名和电子邮件,以便候选人可以直接与他们联系。在进步社区取得成功的模式是威尔斯通工作论坛。大会应该复制这一点,而是使它成为一个只对校友、员工和雇主开放的论坛。

参加任何大会项目的学生都不应该期望一毕业就被安排在 T2 工作。你需要在求职过程中投入和程序本身一样多的血、汗和泪。但通过介绍和更好的就业论坛与雇主建立联系将是一笔巨大的财富。

强类型递归神经网络

原文:towardsdatascience.com/strongly-ty…

我对深度学习原理的探索

“Newton” by William Blake.

这篇文章不代表我自己的想法,因为我很少有毫无根据的想法。这是我在寻找深度学习背后的指导原则时,对他人发表的观点进行的分析和思考。在这篇文章中,我提出了对深度学习原理的需求,然后我解释了强类型递归神经网络的范例。你可以跳过前半部分,但这能激发你展示后半部分的动力。

假设有递归神经网络的基本知识。

数学原理简史

在艾萨克·牛顿爵士出版“《哲学自然数学原理》”之前,人们以两种不同的方式对待科学——或者他们称之为自然哲学。大多数科学研究要么基于演绎原理,要么基于归纳原理。定义将有助于:

演绎法是一种在假设为真理的前提下,从观察中得出结论的方法。 只要前提为真,演绎就是真的,即演绎在我们已知的基础上解释观察结果。这就限制了演绎方法在前提不成立的情况下得出结论。

归纳法是一种通过反复实验和观察来测试新思想和理论的方法。然而,这种方法承认得出的结论可能是错误的。这种方法打开了新思想的研究领域,承认新思想也可能是错误的。

牛顿——在双方的争论中失败了——采取了一种混合的方法来研究自然现象。他首先通过仔细的实验和观察建立了公理,然后他在已经建立的数学原理的基础上,基于演绎将那些公理形式化。这种对观测数据的逐步概括产生了《数学原理》,它给了我们三个运动定律,奠定了万有引力的原理。然后他用平方反比定律从数学上解释了开普勒的椭圆轨道。

“These forces being unknown, philosophers have hitherto attempted the search of Nature in vain; but I hope the principles here laid down will afford some light either to this or some truer method of natural philosophy” — Newton, Principia Preface.

对《原理》的一个有效批评是,牛顿通过自己的数学模型解释了力的定律,但他无法解释力背后的原因。对此,牛顿回答说,他是想解释万有引力的运作,而不是解释万有引力是由什么产生的。承认自己无知,但有一种新的想法,一种看待世界的新方式。它为美国提供了观察世界的新的数学工具和模型,被许多人认为是已经出版的最伟大的科学著作。正是这些源自归纳和演绎方法的结构化原则推动了科学进步,并最终改变了世界。

我们在深度学习中缺乏这些结构化的原则,但这是一个非常新的领域。然而,以目前该领域的进展速度和所做的大量研究来看,寻找深度学习原理还为时不早。

深度学习指导原则的需求

形成深度学习主干的想法结构合理。训练过程的工作机制是很好理解的。神经元、损失函数、矩阵运算和我们部署的架构的数学定义非常明确。但是我们无法解释为什么深度神经网络(DNN)工作得如此之好。有一些模糊的想法在流传,但没有确凿的研究来支持证据。随着我们深入架构,我们开始失去每一层学习的抽象概念,因此术语“黑盒在深度学习研究的媒体报道中很突出。

然而,这并没有阻止该领域的创新。 Carlos E. Perez 在深度学习和炼金术之间进行了类比,在某种意义上,深度学习创新是炮制 DNN 架构、将它们与不同的超参数混合并应用各种成本函数的结果。他写过一篇大胆的帖子,质疑“的必要性,深度学习创新仅仅是因为蛮力吗?”。这表明,大多数研究都是基于演绎的,试图根据我们已知的理论来解释一个模型的工作原理。

凭借我仅有的一点经验,我开始意识到我们并不了解通过这些深层神经网络的信息流。我们不知道当信息通过各种神经网络架构时会发生什么。我们有一个模糊的想法,即隐藏层学习信息的简明表示,但是我们不知道有多少这样的层适合于对信息进行建模以满足我们的需求,并且我们不知道需要哪种层来对该信息进行建模。

很多次我读到一项新的研究,想知道研究人员是如何设计一个特定的模型的。什么思维过程,什么直觉,最重要的,什么数学?答案几乎总是一样的。他们依靠自己的直觉,尝试不同的架构,选择最有效的架构。这自然产生了疑问,有没有更好更简单的模型?有没有可能,也许,我们对通过这些模型的信息流还不够了解,因此我们被我们能设计的东西所限制。

这表明需要一种归纳方法来提出定义信息流数学的新思想,而一篇旨在这样做的论文就是强类型递归神经网络。

强类型递归神经网络

本文的思想来源于物理学和函数式编程。在物理学中,我们有同质性原理来约束不同类型的两个量之间的运算。例如,你不能把 27 牛顿的力加到 35 千克的质量上。

同样,本文探讨了信息也可能是不同种类的想法,并在流经深层神经网络时改变其类型。作者使用了优美的措辞:

“一个范例是物理学家从自然中雕刻出来的测量系统。它规定了表示标准化测量设备读数的单位(例如温度计的开尔文和时钟的秒)以及组合它们的规则。”

在我讨论文件的技术细节之前,我想反映一下这里表达的观点。物理学家观察了这个世界,并为热、力、压力等自然现象设计了一套测量系统。,通过归纳推理。深度思维的戴密斯·哈萨比斯认为信息和能量或物质一样是基本的存在。因此,对于研究人员来说,开拓一种新的信息测量系统,开发一种新的数学来理解通过深度神经网络的信息流是很自然的。这篇论文是朝着这个方向迈出的漂亮的一步。

他们引入强类型准线性代数来表示 DNNs 中的信息流,我用我理解的简单术语解释这些定理。

  • 定理 1:一个类型(T)是一个在‘d’维中具有正交基的向量空间。 就像二维欧氏空间中的一个点由两个正交基的组合来表示(x 坐标,和 y 坐标;正交意味着 x 和 y 坐标是彼此独立的),一个信息可以在称为“类型”的 d 维空间中表示。
  • 定理 2:信息可以有多种类型,代表不同的解读。当信息流经深层神经网络的不同部分时,它的类型会发生变化。
  • **定理 3:信息可以通过在特定类型中进行一元或二元运算来改变。 这些操作保留了信息的类型。 不允许两个不同类型之间的二元运算。 这类似于通过对特定二维空间中的 x 和 y 分量进行一元或二元运算来改变二维空间中的点的坐标。但是,只允许少数操作。 一元运算:{tanh,relu,sigmoid,标量乘法等。} 二元运算:{+,-,max,min}

我试图通过用一维向量空间进行类比来解释这种类型的范例:

  • 定理 4: 一个型变换(T1 → T2) 是通过两个不同型之间的一个矩阵乘法来实现的。
  • 定理 5:类型 T1、类型 T2 之间的元素乘法导致从类型 T1 到类型 T2 的直接转换。 这与定理 4 不同,因为 T1 类型与 T2 类型的“矩阵乘法”将产生 T3 类型。但是,类型 T1 与类型 T2 的“元素乘法”将产生类型 T2。

Types of the Information changes as it passes through the Deep Neural Network. This is because of various Matrix Multiplications and Elemenwise Multiplications.

这是基于归纳的推理。这些操作模式是通过观察 rnn 的行为而制定的。他们要带着这个去哪里?

这些定理将深度神经网络分为两类。强类型(类型一致)弱类型(类型不一致)。

如果将这些约束应用于经典架构,如香草 RNNs、LSTMs 和 GRUs,似乎这些 经典网络是 弱类型 *,*即它们具有由于添加两种不同类型而产生的类型不一致。让我们以 LSTMs 为例;更新公式为:

在文中,一个数学证明表明这种结构是类型不一致的,为了保持简单性,我省略了数学证明。然而我提供了一个直观的解释。考虑上述定理,输出 h[t]取决于它的前一状态 **h[t-1]和输入 x[t]。**所以:

  1. 如果我们假设 h[t-1]是 h 型的。
  2. 假设输入 x 是 x 类型。
  3. 假设加权矩阵乘以 h[t-1]和 x[t],将它们各自的类型改变为允许它们之间二元运算的单个类型 Y。这意味着 h[t]将是 y 类型。
  4. 现在,h[t]和 h[t-1]表示跨不同时间步长的相同类型的信息。所以,这意味着 Y 型和 h 型是一样的,也就是说,没有类型转换发生。
  5. 但是,根据定理 4,矩阵乘法将导致类型转换,本质上意味着类型 Y 不能与类型 h 相同。这推翻了我们在(4)中所做的假设。因此,类型 Y 不同于类型 h,这是不一致的,因为“h”应该在所有状态中保持它的类型。

发生这种情况是因为存在递归关系,即当前状态依赖于前一状态。在经典架构中,递归关系也会导致爆炸梯度。因此,受函数式编程的启发,作者介绍了一种设计 RNN 单元的新范式。这带来了更好、更快的架构,也让我看到了电池设计的前景,我开始觉得它的方程看起来很美。

Learnware 和固件的典范

我们不能从 RNNs 中删除递归关系,因为递归定义了 RNNs。但是,我们可以把 RNN 细胞分成两个区块。一个模块进行学习,另一个模块维护递归关系。术语是 Learnware(无状态)固件(状态相关)

Abstraction showing the difference between RNN and T-RNN. The paradigm of Learnware and Firmware enables parallel operations, thus making computation much faster.

这个想法很简单,但是很强大。Learnware 将具有学习参数,仅取决于输入。并且固件将采用这些学习到的参数并进行依赖于状态的循环操作来保存该存储器。请注意,学习阶段和递归阶段之间的区别支持学习阶段中的并行性。这使得计算速度更快。

由于没有状态更新返回到 learnware 中,在长时间内不会有任何梯度爆炸,因为学习是在输入上发生的。这也意味着不需要对输入应用非线性来抑制它。他们在论文中用数学方法证明了这一点。基于这个范例,他们设计了一个新的 LSTM 单元块,它是强类型的。他们称之为 T-LSTMs:

看看这些方程。输入门、遗忘命运和输出门从输入数据中学习。单元状态包含必须传递给下一时间步的信息,输出取决于该单元状态和输出门。文中还有进一步的探索和推论,我就不深究了。当我获得丰富的计算资源时,我会亲自尝试这些想法。

总之,以我的理解,强类型 RNNs 的优点是:

  • 强类型化信息流似乎比假设所有信息都是同类的更合理。
  • Learnware 和固件之间的区别是一个定义性的设计原则,比经典设计更容易理解。它解决了分解渐变的问题,从而消除了对渐变裁剪的需要。
  • 借助 Learnware 和固件的强大功能,实现并行处理。
  • 由于减少了非线性,计算的复杂性已经降低,并且该论文报道强类型 lstm 比经典 lstm 快大约 1.6 倍。
  • 基于元素的状态更新使架构更加稳定。
  • 另一个有趣的发现是,强类型体系结构在各种任务中具有较低的训练错误。

强类型指导原则显示出比经典架构稍好的结果,然而,作者说他们没有做足够的实验。虽然后来,qrns出现了,采用了比经典 LSTMs 快 16 倍的强类型设计的知识。因此,我的结论是,这种限制信息流的想法有些分量,需要进一步探索。

最后,我将再次强调深度学习原理的必要性。我个人需要它来尝试不同的架构,但我缺乏资源来进行研究实验室所做的大规模实验。我的直觉告诉我,强类型深度学习不会导致人工智能,而是进一步借鉴深度学习和炼金术之间的类比;炼金术被用来实现一个雄心勃勃的目标,即找到长生不老药——就像深度学习试图解决智力问题一样——但相反,我们发现了化学。天啊,结果还不错。

我感谢David Balduzzi,帮助我理解这篇论文背后的思想。

机器学习项目的结构和自动化工作流程—第 2 部分

原文:towardsdatascience.com/structure-a…

H 我!我希望前一部分是有用的。今天,我们将讨论一些其他方面。我们将从预处理数据开始,并执行简单的探索性分析。然后我将向您展示如何创建自动化测试。最后,我们将训练一个模型。请记住,我将此描述为一个过程,而不仅仅是显示最终结果;)

以防你错过,第一部分是这里是

介绍

首先,我们需要添加一些额外的包。这是今天的完整列表。

**dependencies:** - python=3.5
 - numpy
 - scipy
 - scikit-learn
 - jupyter
 - requests
 - pandas
 - seaborn
 - click
 - openpyxl
 - **pip:** - watermark
   - pytest

对于探索,我个人更喜欢用 jupyter 笔记本。让我们在目录notebooks/00-initial-exploration.ipynb中创建一个

jupyter notebook

这个00非常重要——它指示了执行的顺序。

笔记本的第一个单元格包含:

%load_ext watermark
%watermark -v -n -m -p numpy,scipy,sklearn,pandas

这将加载水印扩展并打印关于运行平台的详细信息。这对其他人很有用,特别是当他们很难复制你的结果时。我的机器的输出:

Mon May 29 2017CPython 3.5.3
IPython 6.0.0numpy 1.12.1
scipy 0.19.0
sklearn 0.18.1
pandas 0.20.1compiler : MSC v.1900 64 bit (AMD64)
system : Windows
release : 7
machine : AMD64
processor : Intel64 Family 6 Model 69 Stepping 1, GenuineIntel
CPU cores : 4
interpreter: 64bit

探测

在下一个单元格中,我们导入所需的库并存储根目录——这非常有用。

%matplotlib inline
import pandas as pd
import numpy as np
import seaborn as sns
import os
PROJ_ROOT = os.path.abspath(os.path.join(os.pardir))
print(PROJ_ROOT)

稍后,我们想要实际加载并查看数据:

data_fname = os.path.join(PROJ_ROOT, ‘data’, ‘raw’, ‘iris.csv’)
dframe = pd.read_csv(data_fname, header=None)
dframe.head()

输出:

0 1 2 3 4 
0 5.1 3.5 1.4 0.2 Iris-setosa 
1 4.9 3.0 1.4 0.2 Iris-setosa 
2 4.7 3.2 1.3 0.2 Iris-setosa 
3 4.6 3.1 1.5 0.2 Iris-setosa 
4 5.0 3.6 1.4 0.2 Iris-setosa 

我们知道第 4 列包含我们想要预测的标签。由于 iris 是著名的数据集,我们也知道列【0,3】中特征的名称——它们是:萼片长度萼片宽度花瓣长度花瓣宽度。但出于练习目的,让我们假设我们不知道它们,并给出通用名称:

dframe.columns = [‘x0’, ‘x1’, ‘x2’, ‘x3’, ‘y’]
dframe.head() 

输出:

 x0 x1 x2 x3 y 
0 5.1 3.5 1.4 0.2 Iris-setosa 
1 4.9 3.0 1.4 0.2 Iris-setosa 
2 4.7 3.2 1.3 0.2 Iris-setosa 
3 4.6 3.1 1.5 0.2 Iris-setosa 
4 5.0 3.6 1.4 0.2 Iris-setosa 

现在是施展魔法的时候了:

sns.pairplot(dframe, vars=[‘x0’, ‘x1’, ‘x2’, ‘x3’], hue=’y’)

哇哦。通过使用 seaborn 我们能够绘制所有变量之间的配对分布。这对于直观地检查数据非常有用。而且第一次用的时候印象深刻;)

重构

到目前为止,我们执行了两个基本步骤

  • 加载和标记数据
  • 外观检验

笔记本对于实验来说很棒,但是对于执行这个过程来说却很差。现在,我们将代码转移到src。此外,我们将通过两个新项目扩展我们的渠道:

  • 标签-数据:添加标签(x0,…,y)并将其保存回来
  • 探索性-可视化生成绘图并保存它

我们可能会争论我们是否真的需要仅仅通过添加列名来保存回数据。可能不会,但通常我们的第一轮预处理会更复杂。

在文件src/data/preprocess.py

我们真的需要 read_raw_data 方法吗?只有一行代码。是的,我们需要。您的同事会记住非标准 csv 文件的所有参数吗?请记住,读取数据可能要复杂得多,包括 PCA 之类的东西。在preprocess_data中,我复制了一帧。这是因为我喜欢参数不可变的函数式风格。

为了避免枚举所有特征,这里有一个函数。

另外一个值得一提的是这个 excel 文件。它不会在任何地方使用,但是,我发现它非常有用,可以导出 Excel 文件,以便在需要时手动查看。但是这是完全可选的(考虑到这一点,它也使用一个可选参数)。

为了使其完整,创建包含内容的文件src/data/__init__.py:

**from** .preprocess **import** read_raw_data, read_processed_data, preprocess_data, get_label, get_featues

重构情节

绘图代码要简单得多:

src/visualization/exploratory.py

我将 matplotib 后端设置为agg,因为我发现在我的系统上使用默认的(QtAgg)会导致不正确的渲染。

我们还必须像第一部分一样创建reports/figures/.gitkeep文件。

更新 Makefile

更新依赖关系图的时间。对于绘制代码:

reports/figures/exploratory.png: data/processed/processed.pickle
   python src/visualization/exploratory.py $< $@

上次我解释了<@的意思。概括地说,这是第一个先决条件(本例中为data/processed/processed.pickle)。因此,$<表示第一个目标。所以,上述规则相当于:

reports/figures/exploratory.png: data/processed/processed.pickle
   python src/visualization/exploratory.py data/processed/processed.pickle reports/figures/exploratory.png

我他妈的为什么要在乎$@$<

你可能想知道为什么我使用这个疯狂的符号,而不是仅仅粘贴文件名两次。答案是:因为 make 可以使用泛型规则。

设想如下规律:

%.o : %.cpp
 gcc $< -o $@

这将使用gcc将每个*.c文件编译成相应的*.o。我们将在后面使用这个语法。

预处理规则:

data/processed/processed.pickle: data/raw/iris.csv
      python src/data/preprocess.py $< $@ --excel data/processed/processed.xlsx

清除规则:

clean:
   rm -f data/raw/*.csv
   rm -f data/processed/*.pickle
   rm -f data/processed/*.xlsx
   rm -f reports/figures/*.png

和所有:

all: data/processed/processed.pickle reports/figures/exploratory.png

现在我们可以更新笔记本了!这将为我们提供如下信息:

%load_ext watermark
%watermark -v -n -m -p numpy,scipy,sklearn,pandas

%matplotlib inline
import pandas as pd
import numpy as np
import seaborn as sns
import os
PROJ_ROOT = os.path.abspath(os.path.join(os.pardir))
print(PROJ_ROOT)
import sys
sys.path.append(os.path.join(PROJ_ROOT, ‘src’))

src导入代码

import sys
sys.path.append(os.path.join(PROJ_ROOT, ‘src’))
from data.preprocess import read_raw_data, preprocess_data
from visualization.exploratory import exploratory_visualization

加载原始数据

data_fname = os.path.join(PROJ_ROOT, ‘data’, ‘raw’, ‘iris.csv’)
raw_data = read_raw_data(data_fname)
raw_data.head()

预处理数据

preprocessed_data = preprocess_data(raw_data)
preprocessed_data.head()

和绘图

exploratory_visualization(preprocessed_data) 

重新加载模块

一切都很好,除了一件事。我改变了主意,决定在图上使用核密度估计。将exploratory.py修改为...pairplot(dframe, diag_kind=**’kde’**, vars=[**‘x0’..**后,我重新运行笔记本,没有任何反应。这是因为 jupyter 没有重新加载我的模块。要解决这个问题,请添加

%load_ext autoreload
%autoreload 2

笔记本的开头。它会导致在执行代码时重新加载模块。

测试

自动化测试可以提供很多价值。为机器学习项目设计测试是另一篇文章的主题,所以这里我将只介绍非常基础的内容。

现在,我们将只测试我们关于数据形状的假设。创建文件src/tests/test_data.py

它包含两个简单的测试。首先,检查原始数据是否具有假定的维度。第二个检查是否有 4 个特征和 1 个标签。实际测试是通过使用内置的assert语句来完成的。要运行测试会话,请在项目根目录下打开终端并键入:

pytest src

结果应该是这样的:

=========== test session starts ===========
platform linux -- Python 3.5.2, pytest-3.1.1, py-1.4.34, pluggy-0.4.0
rootdir: /home/xevaquor/code/overcome-the-chaos, inifile:
collected 2 itemssrc/tests/test_data.py ..======== 2 passed in 0.28 seconds =========

我们还应该将测试纳入我们的工作流程:

test: all
   pytest src

不要忘记把它标记为。假的,因为它不创建任何文件

.PHONY: all clean test

创建模型

最后,让我们创建一个模型。它可以使用各种库来实现——sk learn、theano、xgboost 等等,所以最好有一个通用的接口。src/models/random_forest.py

这很简单。我只想提一下保存和加载方法。它们在这里是为了提供一种方便的方法来持久化训练好的模型。每个模型应该自己定义它,因为它有很强的依赖性。

注意:我跳过模型评估。这是一个非常重要的话题,但在这里没有它的位置。

训练模型

在我们的渠道中,我们还需要模特培训。

这个很简单。只需加载预处理数据并将训练好的模型保存到一个文件中。当然,我们必须确保训练模型目录的存在。

mkdir models
touch models/.gitkeep
git add --force models/.gitkeep

并更新 Makefile

all: reports/figures/exploratory.png models/random_forest.modelclean:
   rm -f data/raw/*.csv
   rm -f data/processed/*.pickle
   rm -f data/processed/*.xlsx
   rm -f reports/figures/*.png
   rm -f models/*.model...models/random_forest.model: data/processed/processed.pickle
   python src/models/train_model.py $< $@

自动化测试的示例思想是检查模型是否达到合理的精确度水平。

整个依赖关系图现在看起来如下:

摘要

我们今天做了很多。在接下来的最后一部分,我将向您展示如何部署您的模型。我们将创建一个简单的 web 服务,并使用 docker 使其在线。如果你想阅读一些东西,请在评论中告诉我。

一会儿见:)