从谷歌日历到 Python 音频
照片由伊恩·杜利(左)和托马斯·勒(右)在 Unsplash 上拍摄
使用 python 构建日常任务阅读器
音频生产力
我们听音乐,我们听播客,YouTube 视频,甚至鸟儿啁啾。倾听是我们生活中很重要的一部分,然而,利用这种感觉来提高我们工作效率的工具似乎很少。
今天我想向你展示如何使用 python 来构建一个简单的任务阅读器,它可以大声背诵你的日常任务,并给你带来情绪上的提升。
从简单的文本到音频
有这么多令人惊叹的 python 库,这么多令人难以置信的框架,让我们的编程体验更加愉快。
就是其中的一个包。它使得将文本转换成音频成为一个简单的过程 。这是一个脱机工作的文本到语音转换库。
这个工具打开了简单文本的可能性之门,因为它为我们的书面内容提供了另一个媒体层。简单的工具,如任务清单,个人咒语,甚至更复杂的。pdf 阅读器可以快速制作。
作为一个例子,我们将使用这个库构建一个简单的任务阅读器 使用谷歌日历 API,额外的好处是阅读个人原则,让你在难以集中注意力的日子里保持正轨。
从谷歌日历到任务阅读器
基本管道将是:
- 使用日历 API 从 google calendar 获取任务。
- 选择当天的任务。
- 循环完成任务,并大声朗读出来。
- 在听完任务之后,用户将会听到一组预先定义好的咒语。
现在,让我们详细介绍一下这些步骤。
启用 Google 日历 API
- 登录您的谷歌账户,点击这里的,启用谷歌日历 API。
- 安装谷歌客户端库
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib.
- 从 google calendar API 页面中的 quickstart.py 复制示例代码,并将其放在一个文件夹中。
设置扬声器
- 安装
pyttsx3
库:pip install pyttsx3.
- 用 python 或 ipython 打开终端:
ipython
。 - 从
pyttsx3
开始测试扬声器。
import pyttsx3
text = "Hello World of Audio!"
speaker = pyttsx3.init()
speaker.say(text)
spaker.runAndWait()
你应该听清楚这个句子。
把所有的放在一起
现在我们已经有了所有的依赖项,让我们组装部件。
我们将修改来自 google API 页面的示例,以返回今天的任务列表。
现在,我们已经有了从 google 日历中获取任务的代码,我们将编写一个函数来获取任务列表并大声朗读出来:
厉害!我们就要完成了,我们要做的就是增加一个额外的选项来听一列您希望被提醒的关键原则:
我们首先编写一个名为principles.txt
的文件,并将其添加到同一个文件夹中。然后,我们可以编写一个函数来从该文件中获取句子列表:
现在,我们要做的就是编写另一个简单的函数来播放原则列表:
就是这样!完整的代码可以在我的 github 上找到。
音频作为生产力工具的潜力
我们应该总是寻求多种输入方式,而不是局限于那些更明显的方式,如视频或文本。我们可以用 python 或任何其他编程语言编写这些简单的音频工具,这表明了这种媒体作为一种方式来增强我们甚至不知道可能实现的日常工作的潜力。
如果您喜欢 Python 和 API 集成,请查看 Udemy 课程:
这是一个附属链接,如果你使用该课程,我会得到一小笔佣金,干杯!😃
如果你喜欢这篇文章,别忘了给👏,在 Twitter 或 LinkedIn 上与我联系。谢谢,下次再见!🤓
从谷歌表单到你的 Jupyter 笔记本
如何将 google sheet 连接到笔记本
Jupyter Notebook 是数据科学家的强大工具。您可以用几行代码执行许多复杂的算法,并对大量数据进行分析。Jupyter 笔记本本身能够连接到一个数据库系统,其中的数据睡眠。尽管如此,如果我们谈论数据库,作为一名数据科学家,首先想到的往往是 SQL。
当然,如果我们谈论数据库,SQL 目前仍然是主要的东西,但是许多没有编程背景的人不会那么熟悉 SQL。特别是有经验的专业人士,他们希望进入编程数据科学领域,他们经常使用 google sheet 来放置他们的数据。
因此,我想向您展示如何将我们的 Jupyter 笔记本连接到我们的 Google Sheets。
资格证书
将 Jupyter Notebook 连接到 Google Sheets 并不麻烦;你可以稍微准备一下。幸运的是我们只需要做一次。
我们需要做的第一件事是从 Google 开发者控制台获得一个合适的凭证。凭证要求我们访问谷歌表单。
在控制台中,点击创建项目。在那里,您会发现类似下图所示的屏幕。
你给项目起什么名字并不重要,重要的是你创建了一个新的项目。为了连接到 Google Sheets,我们只需要这一个项目,所以至少要选择一个你能记住的名字。
回到我们的控制台,看看项目是否已经创建。选择新创建的项目,点击左上角的汉堡菜单(Google APIs 符号旁边的那个)。在那里选择API&服务,然后选择仪表板。
在仪表板上,选择启用 API 和服务按钮。
从那里我们将被带到 API 库。应该是下图这样的。
在搜索栏上,键入“Google Sheets”来查找 Google Sheets API。
从那里点击 Google Sheets API 并启用该 API。
在这一步中,我们还启用了 Google Drive API,因此也可以搜索“Google Drive API”。
现在我们将被带到 Google Sheets API 仪表板。要使用这个 API,首先,我们需要创建凭证。
这里,另一个屏幕会提示我们创建凭据。选择 Google Sheets API 用于哪个 API,选择其他 UI 用于从哪里调用 API,选择用户数据用于访问什么数据。现在,单击“我需要什么凭据?”?按钮。步骤如下图所示。
如果是第一次创建凭证,系统会提示您创建 OAuth 同意屏幕。单击设置同意屏幕创建一个。
在这里,只需在应用程序名称中输入您喜欢的任何名称,然后单击 save。
回到仪表板,现在点击创建凭证按钮并选择 OAuth 客户端 ID 。
在这里,只需选择其他类型,然后键入您喜欢的任何名称。然后单击创建。
您将返回到仪表板。现在下载您新创建的 OAuth 客户端 ID,并将其放在您将使用 Jupyter 笔记本的文件夹中。
上面的这一步对于连接来说并不是必须的,但是我们这样做只是为了以防我们以后需要它。
我们还需要一样东西。现在回到创建凭证并点击服务帐户按钮。
键入您喜欢的任何名称,然后点按“创建”按钮。在下一个屏幕中,选择角色作为服务帐户用户。
然后点击创建密钥按钮。
选择 JSON 密钥类型,然后单击创建。将文件保存在与您想要的笔记本相同的文件夹中。
现在我们得到了所有我们需要的证书。这是一个漫长的步骤,但我们只需要做一次。
将 Google Sheets 连接到 Jupyter 笔记本
在开始之前,我们需要安装 3 个不同的 Python 模块。
pip install gspread oauth2client df2gspread
现在我们到了可以将纸张连接到 Jupyter 笔记本的部分。我将在下面的步骤中展示它。
- 导入所有重要的模块
#Importing the module
import gspread
from df2gspread import df2gspread as d2g
from oauth2client.service_account import ServiceAccountCredentials
2.在 Google Sheet 中创建一个新的工作表。然后点击右上角的 share 按钮,在 google API 仪表板中输入来自服务帐户的电子邮件。这是为了确保工作表连接到我们的 Jupyter 笔记本。
3.初始化所有重要的变量
#The scope is always look like this so we did not need to change anything
scope = [
'[https://spreadsheets.google.com/feeds'](https://spreadsheets.google.com/feeds'),
'[https://www.googleapis.com/auth/drive'](https://www.googleapis.com/auth/drive')]#Name of our Service Account Key
google_key_file = 'service_key.json'credentials = ServiceAccountCredentials.from_json_keyfile_name(google_key_file, scope)gc = gspread.authorize(credentials)
现在我们已经有了我们需要的所有重要连接。
将数据上传到 Google Sheet
首先,让我们尝试将 Jupyter Notebook 中的数据上传到 Google Sheet。
import seaborn as sns#I would use tips dataset as an example
tips = sns.load_dataset('tips')
这是我们的数据。
现在,当我们想要将数据上传到 google sheet 时,有一些事情需要注意。我们需要工作表 ID 和工作表名称。如何获取如下图所示。
现在让我们将数据上传到这个空的 Google 工作表中。
#This is the Worksheet ID
spreadsheet_key = '1ZJzLxLyfExKC-vziq21JFNzVcCISJVQxa0Dx-55Qc8k'#This is the sheet name
wks_name = 'test_data'#We upload the tips data to our Google Sheet. Setting the row_names to False if you did not want the index to be included
d2g.upload(tips, spreadsheet_key, wks_name, credentials=credentials, row_names=False)
好了,现在我们在谷歌表单中有了我们的数据。
从谷歌工作表中提取数据
如果我们想提取数据,就像把数据上传到 google sheet 一样简单。我将在下面的代码中展示它。
#Opening the worksheet by using Worksheet ID
workbook = gc.open_by_key(spreadsheet_key)#Selecting which sheet to pulling the data
sheet = workbook.worksheet('test_data')#Pulling the data and transform it to the data frame
values = sheet.get_all_values()
pull_tips = pd.DataFrame(values[1:], columns = values[0])pull_tips
就是这样。我们已经从我们的 Jupyter 笔记本上连接了我们的 Google Sheet。
结论
我已经向您展示了将我们的 Jupyter 笔记本连接到 Google Sheets 所需的步骤。我还展示了如何在 Google Sheets 中上传和提取数据。
希望有帮助!
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。
如果您没有订阅为中等会员,请考虑通过我的介绍订阅。
从图形数据库到图形嵌入
图片由 TheAndrasBarta ,授权。
7 个简单的步骤
所有的创新技术最终都会越过一个“膨胀预期的顶峰”,当所述技术得到大量营销资金的支持时,这种现象尤其如此,这些资金主要用于助长炒作和加剧公众预期。
机器学习的前景正在慢慢成熟,超越了它的“我是一把锤子,一切都是钉子”的框架,诞生于过去十年左右市场营销热情的爆发。
对于图形数据库也是如此;曾经被誉为每个企业圣诞节必备的热门新技术,它们已经达到了成为系统工程师剧本的一部分的快乐境界。
当它们与一起使用时,它们比传统的 RDBMS 提供了显著的优势,RDBMS 在过去的 40 多年里一直统治着数据库领域。简单地说,它们只是做 SQL 数据库做不到的某些事情(反过来也是如此)。
考虑到这一点,我们来找点乐子吧。
下面,我为安装图形数据库、获取数据集、创建图形的矢量嵌入表示以及可视化输出做了一个简单的入门指南。
在本教程中,我们将使用 Linux 基金会支持的图形数据库 JanusGraph 。JanusGraph 被设计用来处理数十亿个顶点和边,但是为了本教程,我们将保持它的简洁。不过,我会给你一些建议,告诉你如何扩展你的解决方案。
在开始之前,让我们先解决一些潜在的问题。
- 为什么不直接用 NetworkX?尽管 NetworkX 功能丰富,但它的可扩展性并不好。虽然下面的步骤显然不符合给定表格中的,但它们代表了可能的基础。(例如,将 JanusGraph 部署到集群,并使用 Spark 运行以下所有操作)
- 为什么是 JanusGraph 而不是另一个 db?有许多伟大的图形数据库可供选择。我在下面使用它是因为 JanusGraph 维护得很好,在 Apache 2.0 下获得许可,可伸缩,并且使用最接近通用图查询语言的东西:Gremlin。您还可以使用 gremlin-python 实现轻松地将 gremlin 嵌入到我们的 python 代码中。(虽然 Cypher 在 StackOverflow 上通过 Q &更受欢迎,但 Gremlin 得到了更多图形数据库的支持)。
- node 2 vec 的特性比定制的、手工构建的特性更有用吗?嗯,那要看情况。Node2Vec 允许我们轻松地将图形的拓扑表示编码成一系列实数,而不必繁琐地尝试手动创建它们。这节省了时间和精力,并且最终包含了比手工创建的图表更多的信息。
我们将用来加载的数据将是 Kelvin Lawrence 的机场数据集。在这里可以找到他的数据,在这里可以找到他关于 Gremlin(一种流行的图形查询语言)的(优秀)书籍。
步骤 1 —下载骏利图表
导航到 JanusGraph 发布页面并下载最新版本(在撰写本文时是 0.52-文件名Janus graph-full-0 . 5 . 2 . zip)
步骤 2-启动骏利图像服务器
下载后,将文件解压缩,并将光盘放入可执行文件和 shell 脚本所在的bin/
目录。
要启动服务器(基本后端是 Cassandra、ElasticSearch 和 gremlin-server),使用命令./janusgraph.sh start
。您应该会看到以下输出:
步骤 3-将数据集加载到数据库中
有多种方法来序列化您的图形数据。下面,我将摄取一个graphml
文件,但你也可以轻松地使用graphson
或csv
。
将以下内容保存到扩展名为.groovy
的文件中。
所有对 JanusGraph 的远程访问都是通过 Gremlin 服务器进行的;我们可以通过首先进入 gremlin 控制台来访问/加载我们的数据。通过使用命令——仍然在 bin 目录中— ./gremlin.sh
来完成。您应该会看到以下输出:
进入 gremlin 控制台后,使用以下命令加载机场数据。根据数据集的大小,所需的时间会有所不同。
:load path/to/file/load_airports.groovy
您可以通过运行计数g.V().count()
来验证它是否正常工作。尽管这对于大量数据来说会很慢——在这种情况下,设置一个顶点索引并从那里开始计数。
**扩展选项:**部署 JanusGraph 到集群,玩玩后端组件,批量加载,增加线程,增加工人等。关于这个主题的精彩文章,请点击这里。
步骤 4-创建随机漫步
word 2 vec——node 2 vec 的下游等价物——需要一组序列作为输入。我们可以使用随机漫步从我们的图中构造序列。简而言之,我们将使用节点,而不是单词,我们使用随机漫步,而不是句子。在这个过程中,我们将节点映射到实数。
让我们创建这些随机漫步。对于每个顶点,我们将创建 50 个深度为 6 的随机行走(根据需要进行调整,这只是一个演示)。下面的代码使用了[gremlinpython](https://pypi.org/project/gremlinpython/)
实现,它可以无缝集成到我们的 Python 脚本中。
从 3619 个顶点中,我们提取了 181k 个随机游走。
注意,下面的查询实际上是随机漫步的一个不完美的表示,它将被提供给 Node2Vec。Node2Vec 指定了两个额外的超参数来控制顶点之间的转移概率,因此您可以控制您的行走是局部的(广度优先搜索)还是全局的(深度优先搜索)。
**扩展选项:**通过使用多处理库,您可以轻松地垂直扩展该解决方案。通过使用 PySpark 这样的 Spark 实现来查询 JanusGraph,您可以横向扩展这个解决方案。要提取顶点 id,最好是直接查询弹性索引,而不是尝试 g.V()查询,或者在加载数据时梳理出来。
步骤 5— Word2Vec/Node2Vec 嵌入
神奇的事情就发生在这里。让我们在随机行走的集合上训练一个 Word2Vec 模型,得到一个实数的输出。
输出X
是矢量集,形状为 181,000 x 50。如果你要训练一个 ML 模型,这是你可能会用到的数据。
**缩放选项:**使用 Word2Vec 的 Spark 实现。
步骤 6 —降维
想象 50 维几乎是不可能的。我们可以使用降维技术来提取数据集中包含的大量差异,并将其压缩到更少的维度。这个过程是有损耗的,但如果我们能够保留足够的信息,同时能够在低维(~2D)空间中查看数据的全局结构,这是很值得的。
虽然这里可以使用 PCA 或 TSNE,但我选择了 UMAP,因为它很好地保留了全局结构,而且速度很快。以下参数将需要调整。
这是一篇关于 UMAP 的好文章。
缩放选项:虽然我找不到 UMAP 的 Spark 实现,但你可以尝试使用 MLlib PCA 实现。
第七步——想象
让我们把 50 维数据简化成两个部分,并把它们可视化。对于悬停数据和颜色数据,屏幕外有一些多余的添加。如果有足够的兴趣,我会张贴整个笔记本供参考。
这是输出——试着将鼠标悬停在上面,摆弄数据。
Plotly 图可以直接嵌入介质?非常酷。
感谢您的阅读,祝您编码愉快!
从混乱到信息
为机器学习准备数据
2016 年,CloudFlower 发布了他们的年度数据科学报告:试图阐明作为一名数据科学家意味着什么,这是一个最近才出现在普通词汇中的术语。从该报告中得出的一个关键见解是,数据科学家平均花费大约 80%的时间来收集、清理、争论或准备用于分析的数据。
2016 数据科学报告,CloudFlower
接下来是一长串标题,大意是这是工作中最平凡的部分,基本上是浪费时间和生产力。
80/20 法则相当准确,但认为这会降低生产率或带走本可以更好地用于培训模型的精力和资源的观点是错误的
引起人们注意 80/20 法则的文章。
预处理包括许多步骤。其中一些可能看起来更琐碎,比如解决不一致,一些需要更深入的统计理论知识,比如缺失数据的插补,但它们都有一个共同点:它们都是决策点,答案在任何教科书或手册中都找不到,因为它们非常依赖于您试图解决的问题和您正在处理的特定数据集。
出于这个原因,预处理不是过程中的一个微不足道的步骤,它为项目增加了很多价值:当您通过不一致、异常值和缺失数据进行工作时,您会更好地理解手头的问题和可用于解决它的数据,这反过来会使最终构建模型更加容易。
本文描述了预处理过程中解决的一些问题,以及在每个步骤中做出的决策。
机器学习模型的好坏取决于它们接受训练的数据。这可以用垃圾输入,垃圾输出的概念来概括:如果你的训练集有噪音,有错误,或包含偏见,不管你的数学有多好,也不管你花多少时间优化你的参数,你的模型结果将不可避免地不准确。
什么是数据质量?
数据质量比算法的复杂性更能区分好模型和坏模型。但是质量数据是如何定义的呢?严格的定义并不存在,但我喜欢来自维基百科页面关于数据质量的一个定义:
使数据适合特定用途的完整性、符合性、一致性、及时性、复制性、完整性和准确性的状态。
用更一般的术语来说,质量数据是“适合使用”的数据,并且正确地代表了它所涉及的现实。
让我们看一个例子,看看我们在准备数据进行分析时可能会遇到什么样的问题,以及我们可以采取什么步骤来解决这些问题。
科技调查中的心理健康
由 OSMI (开源精神疾病)每年进行的科技领域心理健康调查,衡量了科技工作场所对心理健康的态度,并调查了科技工作者心理健康障碍的频率。
在 2014 年的版本中,1259 名受访者回答了 25 个问题。这些问题中有几个允许自由输入,因此在将数据用于任何分析或将其输入模型之前,需要解决数据中存在的大量不一致和错误。
以下是一些不一致、异常值和缺失数据的例子。在我的 Github 上有一个笔记本,上面有这个数据集的完整分析。
发现不一致
第一步是检查数据的不一致性。这是从无关数据到语法错误的任何东西。下面是一些例子的非详尽列表。
- 不相关的数据,例如不应该包含的行和列。
- 重复数据。
- 类型转换错误,例如,数字列被解释为字符串。
- 语法错误,例如类别名称的拼写错误。
- 非标准缺失值,例如*【不适用】**【空】*不适用。
运行一些简单的描述性统计通常有助于发现这些和其他不一致之处。这个步骤有时被称为剖析。
在科技心理健康调查中,我们注意到的第一个奇怪现象是年龄分布。
df['Age'].describe()# count 1259.000
# mean 79428148.311
# std 2818299442.982
# min -1726.000
# 25% 27.000
# 50% 31.000
# 75% 36.000
# max 99999999999.000
# Name: Age, dtype: float64
年龄分布的初始直方图
我们稍后将处理异常值,现在,我们将实施一个简单的业务规则——年龄应该在 14 到 100 之间——并且我们将认为该区间之外的所有值都是缺失的。
年龄直方图现在更有意义了。
添加了受访者年龄必须在 14 到 100 岁之间的规则后的年龄分布直方图。
性别是问卷中另一个开放式的答案,所以这个专栏包括了很多很多拼写男性、女性和非二进制的方法。幸运的是,大多数都可以使用正则表达式和一些模糊匹配来纠正。
调查结果中性别(计数)的初步分布。
清理后的性别分布(计数)。
接下来,国家的分布似乎没有同样的问题(没有拼写错误),但有一大群国家出现的频率非常低。这里不需要采取特别的行动,但是一个可能的选择是将分析限制在国家的一个子集——哪些国家将取决于我们正在寻找的答案的类型。这里的一个选择是将分析限于美国的数据。
极端值
离群值也没有严格的定义。异常值是与其他观察值显著不同的数据点。这可能是由测量中的实际变化或误差引起的。
因为离群值没有单一的定义,每个项目定义离群值的方式决定了检测离群值的方法。一种常见的方法是 Tuckey ’ s fence,也称为箱线图规则。该方法基于四分位数范围(IQR),即第一个四分位数 Q1 和第三个四分位数 Q3 之间的差异:范围*【Q1-k *(IQR),Q3+k *(IQR)】*之外的任何观察值都被标记为异常值。传统上, k=1.5 用于常规异常值,而 k=3 用于大异常值。
年龄箱线图。方框表示第一和第三四分位数之间的年龄分布,分别由方框的下侧和上侧表示。Q1 和 Q3 之间的实线代表中值,虚线代表平均值。红色和深蓝色点分别代表常规(k=1.5)和大(k=3)异常值。
由于一些模型(例如线性回归)对异常值的稳健性不如其他模型,因此在选择模型之前了解它们的存在是有好处的——虽然我们现在不需要采取行动,但我们会标记它们并进入下一步。
请注意,这种方法最适用于有点正态分布的数据,但不适合,例如,两边都有很大偏斜的数据。
缺失数据
缺失数据是类型已知但值未知的数据点,例如调查中未回答的问题。大多数机器学习模型不处理丢失的数据,这意味着丢失的值必须被删除或替换。有 3 种主要机制会导致数据丢失,能够区分这三种机制非常重要,因为丢失数据背后的机制将决定如何处理它。
- 完全随机缺失(MCAR):导致特定值缺失的因素与可观察(或不可观察)变量无关。例如,有些人不填写心理健康调查暗示 MCAR——没有具体的原因会发生这种情况。
- 随机缺失(MAR):缺失数据背后有一种非随机的可观察机制。例如,男性不太可能填写心理健康调查,因为他们是男性暗示着 MAR:只要我们能观察到变量性别,我们就能解释缺失数据的非随机性,并建立无偏估计量。
- 不是随机失踪:失踪是由于一些不可见的因素。例如,男性不太可能填写心理健康调查,因为他们的心理健康暗示 MNAR。
那么如何看待缺失数据呢?在某些情况下,例如当一列有大量缺失值时,删除是一种有效的方法。然而,在大多数情况下,缺少的值会被替换为一些替代值。这个过程叫做插补。有许多可能的估算方法,有些比另一些更复杂。
- 数值插补:用单个值代替所有缺失的观察值,通常是平均值。
- 从分布中随机选择。
- 热卡插补:缺失值从数据集中的相似记录进行插补。
- KNN 插补:确定最近的邻居,并使用他们值的集合来插补缺失的那个。
没有单一的规则来决定使用哪种方法,选择取决于多种因素的组合,如缺失数据的记录数量、我们正在处理的数据类型、特定的用例以及缺失的底层机制。要记住的一条重要规则是,插补不应改变数据的分布,因此比较插补前后的分布是一种好的做法,以确保我们没有注入任何偏差。
让我们看几个科技心理健康调查的例子。
自主创业的变量有一些缺失。对于其中的每一个,我们将从所有可能值的集合中随机选择一个值(是/否),其概率与数据集中是/否的分布成比例。这确保了插补后的分布是相同的。
在(p_original)插补之前和(p_imputed)插补之后自营职业的概率。
在这个过程的第一阶段,我们发现年龄有一些超出范围的值,我们决定假设它们丢失,所以现在是时候估算它们了。对于这个变量,我们将使用一个更有趣的方法:KNN 插补。对于每个年龄缺失的受访者,我们会找到最相似的邻居,并用这些邻居的平均年龄来估算缺失值。
插补前后的年龄分布。
流程和最佳实践
预处理不是一个线性过程。您可以在流程的任何给定点返回、编辑和重复所有步骤。
通常有 4 个主要步骤。
- **检查:**检测意外的、不正确的和不一致的数据(数据剖析和可视化)。
- **清除:**删除、纠正或估算不正确的数据。
- **验证:**现在数据正确吗?重新检查和测试以验证没有违反假设。
- **报告:**记录发现的不一致和错误,以及它们是如何解决的。
这些步骤在概念上是连续的,但过程远不是线性的!在任何给定的步骤中,您可能必须返回、编辑并重复所有步骤,这甚至可能发生在您将数据输入到模型中之后,因此重要的是,它们中的每一个都被很好地记录下来并可重复,并且没有任何东西是手动编辑的,无论多么简单,将来您会非常感激。
摘要
这不是一个完整的预处理指南,但它应该给出一个更清晰的过程是什么样子的前景。有许多决策要做,而解决方案并不总是直截了当的,这就产生了许多可能的故障点。花时间分析和准备数据将使您更好地理解手头的问题,同时确保输入预测模型的数据真正代表正在解决的问题。这一点尤为重要,因为越来越多的决策过程依赖于机器学习模型来做出公平的决策,因此这些模型必须根据可靠、一致和无偏见的数据进行训练。
从创意到生产
如何将一个数据科学项目从想法变为现实
由凯特·玛丽·路易斯 — 16 分钟阅读
我面试过很多数据科学候选人,他们都是各种各样的角色。从初级数据科学家到雇佣我所在的数据科学团队的负责人。在我参加过的无数次面试中,有几个问题是我非常喜欢反复问的。
熊猫变漂亮了
丽贝卡·维克里——5 分钟阅读
流行的 Python 数据分析库 Pandas 中的绘图功能一直是我制作超级快速图表的常用方法之一。然而,可用的观想总是相当基础的,并不特别漂亮。
重新思考数据科学的持续集成
爱德华多·布兰卡斯 — 29 分钟阅读
随着数据科学和机器学习得到更广泛的行业采用,从业者意识到部署数据产品会带来高昂的(往往是意想不到的)维护成本。
搭配:火烧考拉(第一部、第二部)
由 Svitlana Midianko 和 Magali de Bruyn — 15 分钟读取
匹配是一种计算工具,用于提高因果推理的稳健性或可信度。为此,它将来自治疗组的数据点与来自对照组的数据点配对——基于它们在所选特征上的相似性。
美国宇航局的数据科学
杰瑞米·哈里斯和大卫·梅萨
机器学习不是火箭科学,除非你在 NASA 做。如果你碰巧在美国国家航空航天局做数据科学,你和我今天播客的嘉宾大卫·梅萨有共同之处。
从不平衡数据集到助推算法
艰难的教训,真正的秘诀
不平衡数据集完整工具包
在 Unsplash 上 engin akyurt 拍摄的照片
不平衡数据集出现问题有两种不同的情况。
第一类是当错误分类的成本对少数阶级来说比多数阶级高得多的时候。换句话说,我们模型的主要目标是最小化假阳性预测。一些例子是:检测信用卡欺诈,客户流失,检测一种罕见的致命疾病。为了更好地理解不同类型的错误预测如何转化为实际的业务成本,请查看我的帖子: 为什么我们必须谈论第一类错误和第二类错误?
第二种是我们没有为少数群体收集足够的数据。我们的样品不够有代表性。换句话说,不平衡的数据集应该是平衡的。
在 python 中,我们的工具箱中有几个工具可以修复不平衡的数据集。然而,每个工具都是为解决不同类型的问题而构建的。
文章大纲:
- 介绍所有工具:下采样,上采样,平滑,改变类权重
- 用我上周完成的项目展示他们用树算法的表现。
- 讨论我们应该何时使用每种工具
- 解释与升压算法的联系和比较
工具概述
**下采样:**从多数类中随机选择一些点并删除。
**上采样:**从少数类中随机选择一个点,复制粘贴做一个新点。重复这个过程,直到你有和大多数班级一样多的样本。
SMOTE: 在少数类中创建更多的样本。然而,不是通过复制现有的数据点,而是通过在可能的范围内创建新的点。换句话说,它在现有数据的周围创建新的数据点**。请参见下图进行说明。(关于这个的一个很棒的视频: SMOTE(合成少数过采样技术))**
调整等级权重:有两种方法可以实现。一种是将决策树和随机森林中的参数 class_weights 改为class _ weight =‘balanced’。该算法将使用分层抽样来构建树,而不是默认设置:随机抽样。
第二种方法只适用于随机森林。您可以手动将权重分配给不同的类别。下面我就分享一下代码。通过给一个阶层分配较重的权重,我们将使用加权基尼系数。加权基尼系数将使我们用来制作树的所有变量对少数民族阶层更加敏感。例如,当我们计算我们的基尼系数时,能够更好地识别少数群体的变量将具有较低的杂质分数,因此,更有可能被选择来构建一个树。
性能概述
背景:数据集来自一家电信公司。它有 3333 个样本(原始数据集通过 Kaggle)。在这些样本中,85.5%来自“流失= 0”组,14.5%来自“流失= 1”组。目标是预测客户流失。我将展示 4 种树算法的性能——决策树、随机森林、梯度推进和 XG 推进。
原始数据集的性能:
下采样后的性能:
缩减采样代码
上采样后的性能:
用于上采样的代码:
击打后的表现:
RF 和决策树使用平衡类权重的性能:
手动调整权重后射频的性能
见解:
当谈到每种方法的优缺点时,许多文章都是这样说的:
**随机下采样:**遗漏一些有价值的信息。众所周知,样本越多越好,因为这让我们更接近现实。但是下采样减少了样本。
随机上采样:倾向于过度拟合少数群体的现有数据点,因为我们一直在复制现有数据点。
这个弊端其实从上面的分析就反映出来了。比较假阳性的数量,上采样的假阳性没有其他方法减少的多。
**SMOTE 和加权类:**通常被描述为“高级”方法,用来克服下采样和上采样的缺点。确实,SMOTE 找到了一种合理的方式来提供新数据,这是一种革命性的想法。加权类方法保留了所有的信息,这也是事实。
但是如果你是商业决策者,看着结果,你会选择哪种方法?
要回答这个问题:我们可以用数字来表示事物。我们就挑随机森林的表现来举例吧。假设在我们预见到客户会流失之后,我们能够挽救所有的客户。
- 缩减采样成本=失去 2 个客户+在 38 个客户身上浪费营销努力和金钱,因为我们认为我们会失去他们
- 上采样成本=失去 22 个客户+浪费 15 个客户。
- SMOTE 成本=失去 17 个客户+浪费 27 个客户。
- 平衡级成本=失去 20 个客户,浪费 16 个客户。
- 加权成本=失去 12 个客户,浪费 24 个客户。
尽管成本会因行业而异,但我愿意说我会选择下采样。一是因为我失去的客户最少,这是我的首要目标。另一个原因是,既然这 38 位客户打算和我们住在一起,我想我们应该不会花太多精力或成本去“拯救”他们。
当然,这取决于我们的“储蓄”方法和样本量的大小。如果我们有一万个客户,考虑的可能就不一样了。
不管怎样,这里的关键观点是——没有更好或更坏的方法,我们需要始终牢记上下文。
Gif via GIPHY
有一般的经验法则吗?
是的。我提到过不平衡的数据集成为问题的两个原因。第一类是假阳性数字对我们来说比整体准确性更重要。类型 2 在数据收集过程中有偏差。流失率问题是第一类问题。换句话说,这里的主要问题不是我的数据集有偏差,而是他们是天生的少数。在这种情况下,下采样和加权类最好地解决了我们的问题,因为它们扩大了少数类的声音。
如果我们面对的是 2 型问题,那么 SMOTE 应该比其他方法更好,因为它在少数类中引入了新的样本。它试图填补少数阶级的空白,缓解有偏见的人。
上采样和平衡类方法的工作方式相同,因此结果非常相似。它们并不特别适合任何一种类型。原因是在你不停地从少数数据集复制数据之后,不可能没有过拟合的问题。
萨汉德·巴巴里在 Unsplash 上的照片
有趣的技术见解:(随意跳过)
注意最大深度和假阳性的数量。在下采样中,如果我限制深度,我实际上会有更多的假阳性和更低的准确性。但是在手动调整类权重时,我减少的深度越多,我得到的假正数就越少。缺点是我会因为一个 0 的假阳性数字而牺牲整体的准确性。
这个细节真正展示了这两种方法之间的区别。当使用缩减采样时,我们仍然通过寻找最佳变量进行分割来构建树。它就像一个普通的随机森林。随机森林非常适合处理过度拟合。当我限制深度时,我可能真的会不适应。而且不可能有 0 假阳性,除非我们以后做一些正则化。
然而,在调整类权重的情况下,它像正则化一样工作。也就是说,我们需要小心选择重量。
增压连接
通过调整类权重,我们刚刚从 bagging 算法转移到伪 boosting 算法。
再看看数据。您是否注意到加权类的性能与 boosting 算法的性能非常相似?还有,你注意到别的了吗?梯度增强和 XG 增强这两种增强方法没有其他两种树方法波动大。他们的两类错误一开始也更平衡。这是为什么呢?
GIF via GIPHY
bagging 和 boosting 算法的核心区别之一是,在 bagging 算法中,它遵循 1 树 1 票的规则。不管在什么情况下,没有一棵树高于另一棵树。对于助推来说,不等于。在最终决定上,有些人会比其他人更有发言权。不同的提升算法有不同的方式来决定一棵树在最终决策中有多少发言权。但原则是,声音是不平等的。因此,我说加权随机森林是伪提升算法。
为什么这只是伪 boosting 算法而不是 boosting 算法?
不同之处在于 boosting 算法改变样本的权重,而加权随机森林改变类的权重。如果以人为类比。一个加权随机森林说:每个投 A 的人都会被多算。一个增强算法说:谁更有资格,谁就能投更多的票。
棘手的部分是:我们如何证明谁比谁更有资格,权力大多少?这就是助推算法试图解决的问题。
那么为什么 boosting 算法波动更小呢?助推算法一瞥。
在助推算法的背景下,谁是“合格的人”?他们是产生更多正确结果的树,并且持续地产生正确结果。
如果树 X 总是比树 Y 产生更多正确的结果,那么树 X 比树 Y 更善于识别少数类(当存在不平衡的数据集时,所有的树都善于识别多数类)。增强算法放大这些声音。这就是为什么 boosting 算法一开始就比其他算法做得更好。
Boosting 算法通过反复测试不同树的准确性来确保性能的一致性。该算法在每次测试后调整树的功率,直到调整仅具有微小的波动。这是 boosting 和 bagging 算法之间的第二个主要区别(第一个是分配不同的权重)。在 bagging 算法中,树有许多期末考试,期末成绩是通过和失败的简单相加。在推进算法中,你有测验和期中考试。每次测验都会影响你的期末成绩。
因此,有了一个平衡的数据集,无论数据集的结构如何,产生更正确结果的树总是占主导地位。这就是为什么在我们实现 SMOTE 和上采样后,梯度增强的性能丝毫没有改变。
因此,第二个关键的见解是:当你不确定不平衡的主要原因是什么时,使用一个增强算法。你会少错一些。
好了,这是升压算法的一瞥。我正在写一篇文章来更详细地解释 boosting 算法。
GIF via GIPHY
更多信息:
- 成本敏感学习与阶层失衡问题,x .凌,s .盛
- 树木的不同重采样方法我在 Kaggle 上的原始重采样分析
- 使用树模型的客户流失我在 Kaggle 上的全面流失分析
从隐形女人到派对生活
硅谷的一份数据科学工作改变了人们对我价值的看法
我在阿德莱德的朋友有各种不同的职业,但在旧金山,我遇到的几乎所有人都是科技行业的。我制作了这张图片来说明不同之处。
当我第一次搬到硅谷时,是为了在一个世界领先的研究中心进行脑瘤研究。很有趣,对吧?似乎不在旧金山。
在澳大利亚,我的朋友们有着不同的背景和职业。我喜欢我们都有不同的观点。当你能听到别人的观点和经历与你不同时,谈话会变得有趣得多。我的朋友中有律师、教师、会计师、护士、美容师和许多不同的职业。
认识拥有这些不同专业知识的人不仅有帮助,还能让生活不会变得无聊。我不知道你怎么想,但是当我下班的时候,我不想在我和朋友在一起的时候谈论我的工作。那将是极其单调的。相反,我喜欢和朋友交谈,给我新的想法来处理事情。
我的工作只是我的一部分。
我需要我的友谊来培养我的整个自我,而不仅仅是我的职业部分。所以我喜欢和与我有共同价值观和兴趣,但又与我不同的人在一起。
当我完成博士学位时,我有一种变得狭隘的倾向。我的研究将永远在我脑海深处滴答作响。所以花时间和科学之外的人在一起让我的大脑得到喘息是很重要的。这让我不会太专注于自己的工作。
我坚信人们的工作可能很有趣,但它们很少是一个人最有趣的事情。我喜欢倾听人们的激情。例如,我在阿德莱德有一些朋友,他们喜欢骑越野自行车下坡、钩针编织、研究古埃及、芭蕾、肚皮舞、摇摆舞和在唱诗班表演。
搬到世界的另一边是很难的,我离开了我的朋友和家人去追求我的研究事业。我积极努力去认识新的人,结交新的朋友。然而,我发现我在高科技聚会上受到的接待并不热情。
社交聚会往往不是为了社交,而是为了获得优势。湾区是非常短暂的。人们倾向于去科技圣地做科技。每个人都想结交朋友,这使得结交真正的朋友变得更加困难。你知道那种你可以真正交谈的人。只是闲逛和喝杯茶,而不是计划令人兴奋的郊游。
当人们发现我不在科技行业工作时,他们似乎完全没有兴趣了解我。你有没有遇到过有人在你谈话时鬼鬼祟祟的?看到他们眼中的变化,从评估你的潜力到忽略你,再到扫视房间寻找另一个潜在客户,这给人留下了深刻的印象。
当我在旧金山的一家初创公司找到第一份数据科学工作后,一切都变了。我突然变成了一个很酷的孩子,人们想知道我的一切。令人不安的是,我的感知价值与我的职业联系如此紧密。
你想知道为什么科技有包容性问题吗?技术不重视不从事技术的人。
我的癌症研究
我的研究旨在帮助脑瘤患者,或者从一开始就阻止他们生长。旧金山以外的大多数人都觉得这很有趣。
让我给你高水平的音高。
近年来,癌症治疗越来越好。随着早期检测和这些新的治疗方法,越来越多的人从他们的原发性癌症中存活下来。今天,许多癌症死亡是由于癌症扩散到身体的其他部位。这些继发性癌症很难治疗。
乳腺癌经常扩散到大脑。血脑屏障应该阻止癌细胞从血液循环进入大脑,但出于某种原因,它没有。科学家们不知道为什么癌细胞可以通过。我的博士研究调查了癌细胞如何穿过血脑屏障进入大脑。有点意思,对吧?
在我的博士后论文中,我研究了大脑中正常细胞如何变成癌细胞。大脑中的大多数细胞都是高度特化的,因此不再分裂。一般来说,正是分裂最频繁的细胞获得了导致癌症的基因突变。干细胞是大脑中少数仍在分裂的细胞类型之一。我所在的实验室研究了神经干细胞是否是脑癌的起源细胞。
如果我们是正确的,这将意味着我们可能能够开发出一种早期干预或药物来预防脑瘤的形成。对于癌症来说,唯一比治疗更好的是预防。
在我搬到旧金山之前,我遇到的人都有兴趣更多地了解大脑是如何工作的,以及为什么癌症无法治愈。然而,当我住在硅谷时,这一切都变了。
成为隐形女人
我和我的男朋友搬到了旧金山,他在一家科技创业公司工作。我们参加了很多科技聚会和创业发布会。我参加这些聚会和联谊会的目的是认识新的人和交朋友。我不想在一个新的地方生活感到孤独。所以当我发现人们对认识我不感兴趣时,我很沮丧。
做一个科技行业的女性很难,做一个非科技行业的女性会让你隐形。
科技派对让人觉得排外,我不是其中一员,至少现在不是。在技术领域,你会在工作中交到朋友。他们只对为自己的创业公司建立关系网、筹集资金和招聘人才感兴趣。
当我的男朋友在这些活动中向人们介绍我时,他们最初会问我做了什么。当我告诉他们我的研究时,我得到了与我在澳大利亚得到的截然不同的反应。旧金山人似乎比澳大利亚人更痴迷于人们的工作。
他们的目光会变得呆滞,从我身边滑过,落到下一个人身上。或者他们会开始从我的肩膀上看还有谁在那里。有一次,一个家伙甚至滑稽地向后转,朝另一个方向走去,就像在一个训练队里一样。
在我看来,他们的行为相当粗鲁。他们甚至不能假装有礼貌。人们希望从他们遇到的人身上得到一些东西,如果我不能帮助他们,那么他们需要尽快离开。
有几个例外,但我基本上被忽略了。创业界的人似乎对我或我做的事情一点也不感兴趣。
似乎一旦他们意识到我没有直接的价值可以传授给他们萌芽中的创业企业,他们就想尽快离开。这些人是铁杆网络爱好者,他们很快就意识到认识我对他们没有任何好处。因此,他们不想浪费时间进行礼貌的闲聊。
这确实让我想知道旧金山是不是适合我的地方。这些人我根本不认识。所以如果他们不想跟我说话,我也能克服?但后来还是不断发生。
过了几个非常无聊的晚上后,我开始想,如果我没有一份技术工作,我是否会在硅谷交到朋友。我会尴尬地站在一群人中间听着,对谈话没什么贡献。
在大多数这些聚会上,我都感到很不自在。他们主要是 20 多岁或 30 多岁的白人男性。我是那里为数不多的女性之一,也是为数不多的不从事技术工作的人之一。
我还想知道,我收到的部分不热情的回应是否可能是因为那些经常被技术职业所吸引的人。我遇到的一些人可能在与非技术人员交谈时缺乏自信。也许他们不重视闲聊,并为与技术无关的交流而挣扎。
初创公司的数据科学家
住在旧金山时,我决定放弃癌症研究,转而从事数据科学。科技场景的诱惑对我来说太大了。如果你想更多地了解我是如何实现这一职业转变的,你可以在我之前的一些故事中找到细节,比如‘我是如何在 6 个月内从零编码技能变成数据科学家的’。
更高的工资、更好的条件和更直接的影响的诱惑让我在硅谷的一家医疗保健初创公司找到了一份数据科学的工作。我开始着手分析大量医疗索赔数据,以帮助美国人做出更好的医疗决策。
因此,我进入了神圣的创业领域,不仅草更绿,而且有一个园丁为你照顾它。在科技行业工作完全改变了人们对我的看法。
我的新人气
我突然就红了。我在科技活动中遇到的人想向我推销他们的想法。有时希望我能把他们介绍给我认识的人。其他时候,他们希望我加入他们的团队。
他们问了我所在团队的情况,工作流程如何,我喜欢什么,不喜欢什么,以及许多后续问题。
从一个社会弃儿变成一个受欢迎的孩子是一种奇怪的感觉。即使人们真的在听我的每一句话,就像我要揭示生活的秘密一样,这感觉很空洞。我总能感觉到要求的到来,他们不可避免地想要一些东西,一些他们认为我可以带给他们努力的东西。
以这样一种方式行事,你对待人类,无论是对你自己还是对他人,总是同时作为一个目的,而不仅仅是一种手段。
-伊曼纽尔·康德
我当然有这样的印象,我更多的是“达到目的的手段”,而不是目的本身。我猜之前被忽视的经历让我变得愤世嫉俗,多疑。我觉得这些品质并不吸引我。所以我努力改变自己的态度,用新的眼光看待每一次新的互动。
我想,人们尽最大努力让自己的创业公司起步,并尽可能地建立联系,这并没有那么糟糕。如果他们在这个过程中没有让我觉得被评判,那就好了。我还认为,如果他们对别人和他们要说的话更感兴趣,他们会更成功地找到他们想要的东西。但这只是我的拙见。
我如何在旧金山交到真正的朋友
科技行业的某些部分可能非常排外,甚至当你身处其中时也是如此。我最初在旧金山结交的许多朋友都不是来自科技界。
我通过我的博士后和我的同事交了朋友。我发现的另一个认识人的有用途径是通过我的爱好。当我住在海湾地区的时候,我参加了很多马戏班。我尝试了空中飞人、空中丝绸、天琴座和杂技,所有这些都吸引了奇怪但精彩的人群。
最终,当我成为旧金山一家医疗保健初创公司的数据科学家后,我和许多同事成为了好朋友。有趣的是,这些技术人员有着广泛的外部兴趣。两个是作者,一个创建了技术杂志,一个曾经是僧侣,一个在瓶子摇滚乐队演奏,一个是合格的跳伞教练,一个是令人敬畏的吉他手,一个创造了惊人的光艺术装置。我可以继续说下去,但你应该明白。
所以最终我在科技行业找到了我的部落。我觉得这些朋友把我当成了一个完整的人,而不仅仅是技能和关系的集合。有一群我可以完全做我自己的人在一起是如此的不同。
在技术领域找到我的人也帮助我享受旧金山提供的所有冒险。我和我的同事们有机会去海湾航行,在电影放映前看阿拉米达的达人秀,参加瓶摇滚音乐节,我的朋友在那里,在奥克兰的 Yoshis 看我从未见过的古典吉他手,去 Taho 滑雪,参加 Hardly Strictly Bluegrass 等等。如果没有我在那里遇到的人,我永远也不会发现所有这些事情。
所以一旦我周围有了这些支持我的人,海湾地区就更像是我的第二个家了。
除了数据,我的另一个爱好是绘画。你可以在 www.katemarielewis.com 找到我的野生动物艺术
了解我是如何成为数据科学家的:
我用来自学数据科学的 4 个工具没有花一美元
towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3) [## 让我获得第一份数据科学工作的面试策略
我是如何展示自己得到这份工作的
towardsdatascience.com](/interview-strategy-that-landed-me-my-first-data-science-job-bdd5e77bfb49)
从朱庇特笔记本到剧本
不要玩玩具模型;准备好生产你的作品吧!
8 月 16 日:从脚本到预测 API
2 月 23 日:从 cURL 到自动化工作流程
2022 年 1 月:面向高级初学者的 Python
作为高级初学者,我们知道很多:EDA、ML 概念、模型架构等……我们可以写一个大的 Jupyter 笔记本,点击“重启并运行全部”,生成最先进的结果。好吧,接下来呢?别人如何使用/复制/扩展你的成果?
在本文中,我将向您展示我如何将 Jupyter 笔记本从葡萄酒数据集上的 Kaggle 转换为脚本,分享一些我们可以轻松适应并立即带来好处的工程实践。
对于它们中的每一个,都有更多的内容需要挖掘,但我们将只介绍基本的内容,展示其优势,并解释思考过程!目标是尽量减少工程师在和你说话时翻白眼的可能性。
Jupyter 笔记本
Jupyter 笔记本是很好的探索和原型,但我们不能永远停留在那里。没有工程师(或没有人)愿意阅读你的代码并重写它。即使你足够幸运地拥有工程资源,它也只会减慢整个过程🙁
不知何故,我们需要调整工程实践,使其可重复、可自动化和可部署!第一步是将笔记本转换成脚本,这是本文的主题!
回购中这部伟大笔记本的所有功劳归原创者所有!
脚本:ipynb–>。巴拉圭
为什么要写剧本?为什么我们不能在交互式笔记本工作正常的时候使用它呢?让我提出一些场景来证明为什么在探索之外使用脚本是一个好主意!
- 如果要并行运行 20 个大机型,会开 20 台笔记本吗?
- 假设你愿意打开 20 台笔记本,你会如何配置超参数?去每个笔记本找相关单元格?
- 假设你手动配置 20 台笔记本,你会如何分析结果?转到每个笔记本?
- 假设您可以在前 3 步处理 20 台笔记本电脑,如果您有一个伟大的想法,但您需要用 200 组超参数进行实验,您愿意重复步骤 1-3 吗?
- 假设您在原始笔记本中发现了一个错误,需要重新运行所有内容,您愿意重复步骤 1–3 吗?
如果你的回答都是肯定的,那么这篇文章不适合你,再见,祝你有美好的一天😊
我构建管道的方式是将它分解成 etl.py 、 train.py 和 predict.py 。每个脚本都有自己的职责,并尽量做到原子化,这样,只要职责明确,每个团队成员都可以开发它们。
etl.py :转换原始数据,做一些转换,在数据文件夹【train_test_split】下创建 train.csv 和 test.csv
train.py :使用 train.csv 中的数据,将模型导出到模型文件夹【model.fit(X,y)】
predict.py :使用 test.csv 中的数据和训练好的模型,导出预测,并对[model.predict(X,y)]求值
脚本关系,各自处理自己的部分
# File structure
.
├── README.md
├── __init__.py
├── autoformat.sh
├── data
│ ├── predict.csv
│ ├── test.csv
│ ├── train.csv
│ └── winequality.csv
├── log
│ ├── etl.log
│ ├── predict.log
│ └── train.log
├── model
│ └── model.pkl
├── notebook
│ └── prediction-of-quality-of-wine.ipynb
├── requirement.txt
└── scripts
├── config.yml
├── **etl.py**
├── **predict.py**
├── test_train.py
├── test_utility.py
├── **train.py**
└── utility.py
如果我搞砸了什么,我不会试图找出原因[想象 Jupyter 中的状态突变,因为你随机运行细胞],我只会再次运行脚本,看看。
# Run in command line, as simple as this :)$ python3 ./scripts/etl.py
$ python3 ./scripts/train.py
$ python3 ./scripts/predict.py
太好了,我们可以在命令行中加载和运行脚本了!但是正如我们在上面的场景中提到的那样[№2],我们如何配置超参数呢?_?
配置文件作为输入:单击
原则是尽量不要接触代码,我已经创建了另一个 config.yml 来包含所有的配置,并通过点击来加载它们。这样,每一个新的模型都是另一个配置,这保证了可复制性,避免了手动修改代码和引入错误🙁 ].
# config.yml example, I only use this to configure the scripts
etl:
raw_data_file: "data/winequality.csv"
processed_path: "data"
test_size: 0.2
random_state: 42train:
processed_train: "data/train.csv"
ensemble_model: "RandomForestClassifier"
model_config: {n_estimators: 300}
model_path: "model/model.pkl"predict:
model_path: "model/model.pkl"
processed_test: "data/test.csv"
predicted_file: "data/predict.csv"
export_result: True
在脚本中,我创建了一个实用函数来解析配置文件
def parse_config(config_file):
with open(config_file, "rb") as f:
config = yaml.safe_load(f)
return config
然后,我们可以以可扩展的方式将配置加载到脚本中!
[@click](http://twitter.com/click).command()
[@click](http://twitter.com/click).argument("config_file", type=str, default=**"scripts/config.yml"**)
def etl(config_file):
config = **parse_config**(config_file)
raw_data_file = config["etl"]["raw_data_file"]
processed_path = Path(config["etl"]["processed_path"]).......DO SOMETHING.......
如果我们有 20 个具有相似体系结构的模型,我们只需准备 20 种配置,仅此而已
不打印:记录
我们现在可以在命令行环境中组合脚本和配置了!我如何获得输出?在 Jupyter 世界中,我可以打印和查看,但这意味着我需要浏览一个很长很长的笔记本,如果我有很多模型怎么办?有什么具体的方法可以将输出收集到一个文件中吗?
放开打印,学习日志!Python 中的日志模块顾名思义就是用 Python 做日志。我们可以定义和记录我们感兴趣的事情,例如,脚本的哪个阶段[用于调试],指标的总结[用于评估],我从模型预测和评估中提取了一段作为示例
这段代码将生成如下所示的日志
从本文中了解更多关于日志记录的信息!https://www . machinelingplus . com/python/python-logging-guide/
旁白:
日志记录很好,但是如果我们有 100 个实验,我们将得到 100 个日志文件🙁即使是具体的,我们也不一定想一个一个看,有没有更好的方法来评价?以下是一些可能的解决方案:
- 还有一个脚本,利用 grep 或 regex,解析并提取关键信息[但是如果有人改变了格式或拼写怎么办!?]
- 又一个工具,checkout MLFlow 或者 ModelDB ![日志记录只是这两款产品的功能之一]
再现性问题:康达环境
哟,现在情况似乎不错!我可以推送至 GitHub,我的朋友/同事可以克隆并运行他们在的电脑😊
哦,等等………他们的电脑………如果我们使用不同的版本呢?之所以常见,是因为每个包都有很多版本,比如: sklearn 。APIs 接口可能会随着时间而改变[并破坏代码🙁],我们如何确保使用相同的软件包?
简答:康达 env,查看马特的文章
我在下面列出了一些有用的命令,刚好满足我们的需求
# In terminal# Create the environment
$ conda create — name YOU_CHANGE_THIS python=3.7 -y# Activate it
$ conda activate YOU_CHANGE_THIS# Install the needed package
$ pip install –r requirements.txt# # ## # ## # ## # ## # ## # ##
# # # Do your development # # #
# # ## # ## # ## # ## # ## # ### Deactivate and back to normal environment
$ conda deactivate# This will remove the environment, do it when you finish the project?
$ conda remove –name YOU_CHANGE_THIS –all
*在 requirements.txt 中,您应该始终指定版本!如果你不指定它,它会尝试下载最新的版本,但是你的最新版本可能不是我的最新版本,这样就失去了使用 Conda env 的意义
# this is what I have inside requirements.txt
pytest==5.3.5
pandas==1.0.1
Click==7.0
scikit-learn==0.22.1
black==19.10b0
isort==4.3.21
PyYAML==5.2
不要破坏你以前的代码:pytest
在软件/ ML 的世界里,变化是永恒的,无论何时我们工作,我们都会改变一些东西。但是我们如何确保新的变化不会破坏现有的变化(尤其是你几个月前写的变化)?
单元测试是有帮助的😊我们可以为每个功能编写测试用例,以确保它们具有预期的行为。单元测试不能证明程序的正确性,但是它们可以保护你列出的场景!
例如,下面的代码断言类型和输出维度是预期的。这看起来很傻也很简单,但是如果你的 load_data 函数变得更复杂,你会感激一些东西一直保护着你[特别是如果你想改变一些东西,不要问我是怎么知道的]!
要运行单元测试,只需在终端中运行 pytest ,您应该会看到如下输出
酷,我们可以在推 GitHub 之前运行 pytest,并尝试维护一个可行的程序!但是人类是不可靠的,如果我们在 push 之前忘记运行 pytest 并破解代码怎么办!?在这种情况下,我们该如何保护自己?
如果可能,不要依赖人类:持续集成
如果程序本身可以在我们推送/创建拉取请求时自动运行单元测试,那会怎么样?如果不能通过测试,它就可以停止合并!如果您听说过持续集成,这是特性的一部分!市场上流行的产品是 CircleCI / TravisCI / jenkins,但是我很懒,如果不需要,我不想做任何额外的配置工作,所以我们将使用相对较新的 GitHub 动作😊
在过去,我认为工程师是如此聪明,他们怎么能记住语法并自己想出这样的脚本(这已经很简单了)?不要这样想,大多数人只是像我一样复制和修改模板 GitHub Actions 中 CI workflows 下有一个名为 Publish Python package 的模板]
现在你看到了!脚本、包版本和 pytest 一起工作来确保包版本是正确的,程序是可行的!当我们增量开发时,他们会保护我们,如果代码破坏了单元测试,他们会说不。如果我们发现了一个 bug,我们可以把它作为另一个测试用例,以确保我们不会犯两次同样的错误!
你能以同样的信心在 Jupyter 笔记本上做同样的事情吗?
代码风格问题:黑色,isort
你听说过 pep8 吗?这是写 Python 的风格惯例,有许多(好)点,但老实说,请不要在这方面测试我,我的大脑不能记住它们!
我记得在我的一堂课上,我的教授要求我们使用 pycodestyle 这是一种检查代码风格的工具,然后我得到了这些消息并逐一修复它们。例如:
$ pycodestyle --first optparse.py
optparse.py:69:11: E401 multiple imports on one line
optparse.py:77:1: E302 expected 2 blank lines, found 1
optparse.py:88:5: E301 expected 1 blank line, found 0
我认为这是一个很好的工具,但有点不完整,如果你能找到我的问题,为什么不帮我纠正一下,节省我的时间呢?
Simply run this and the script will do the rest!# If you get permission error, you can try
# chmod +rx autoformat.sh
$ ./autoformat.sh
结论
事情现在对本地有利!我可以把它们推送到 GitHub,我的朋友可以克隆并在他们的电脑上运行它
但是!我们知道重要的(不好的)信息通常以但是开头,例如:工作申请被拒🙁
但是如果我们想要生产这个模型呢?_?
问:首先,生产化意味着什么?
答:狭义的意思是模型消费,我给你输入,你给我返回输出[可能以 JSON 的形式],例如:web 端点/ API。我们需要一台服务器[另一台计算机]来托管模型和端点,我不想用我的计算机 T11 来托管它,否则整个产品将依赖于我可怜的 Macbook🙁
我在上面突出了两个字,它们正是挑战
1.如何找到另一台计算机来托管模型?
简短的回答:要么买一台电脑,要么从云提供商那里租一台[例如:AWS,Azure,GCP],然后我们就可以宣称我们了解云计算😊
2.如果另一台计算机不是 MacOS,我如何确保我的代码在那里工作?
简答:Docker
总结一下,我们:
a. start from a Jupyter Notebook
b. Code conversion [ipynb to .py]
c. Make the scripts configurable [Click]
d. Include logging [logging]
e. Make sure the local environment is the same [Conda env]
f. Include unit test and basic CI [pytest, GitHub Action]
g. Autoformat the script style [black, isort]
我希望带有注释的文件树结构可以向您展示代码的演变,不要被许多文件夹吓到,因为它们是一步一步开发的,如果您理解思维过程,它是非常简单的!
.
├── README.md
├── __init__.py
├── .github/workflows [f]
├── autoformat.sh [g]
├── data
│ ├── predict.csv [b]
│ ├── test.csv [b]
│ ├── train.csv [b]
│ └── winequality.csv
├── log
│ ├── etl.log [d]
│ ├── predict.log [d]
│ └── train.log [d]
├── model
│ └── model.pkl [b]
├── notebook
│ └── prediction-of-quality-of-wine.ipynb [a]
├── requirement.txt [e]
└── scripts
├── config.yml [c]
├── etl.py [b, c]
├── predict.py [b, c]
├── test_train.py [f]
├── test_utility.py [f]
├── train.py [b, c]
└── utility.py
我们提到但没有详细说明的东西:
-> Databricks 的 MLFlow / VertaAI 的 ModelDB
我们可以多讨论的事情:
- 云中的模型部署[AWS]
- 集装箱化[码头工人]
现在我们已经建立了一个坚实的基础,这些脚本的形式,我们可以进一步重用它!想象一下,你如何用 Jupyter 笔记本做到这一点?
我理解当有人说你应该尝试 ABC / XYZ 时的感受,但他们没有解释为什么或如何从零开始发展,我希望这篇文章能有所贡献:)
如果这篇文章有用,可以留下一些评论
或者你可以开始我的回购!
或者我的 LinkedIn 【欢迎但请留下几句话表明你不是僵尸】!
这些东西大部分都是我在实习@ 流形 AI 中学到的
从 LeNet 到 efficient net:CNN 的演变
一个易于跟随的旅程,通过主流 CNN 的变化和新奇
卷积神经网络:构建模块
卷积神经网络,或简称 CNN,是一种常用的移位不变方法,用于提取*‘可学习特征’*。CNN 在深度学习和神经网络的发展和普及中发挥了主要作用。我有一个单独的博客,讨论各种类型的卷积核及其优势。
对迷人的 CNN 层的不同变化的直观介绍
towardsdatascience.com](/types-of-convolution-kernels-simplified-f040cb307c37)
然而,这里我将关注完整的 CNN 架构,而不是关注单个内核。我们可能无法单独访问 CNN 历史上的每一个主要发展,但我将尝试带您了解一般 CNN 架构是如何随着时间的推移而演变的。你需要对 CNN 有一些基本的了解。
卷积神经网络:概述[ 来源
莱内特:一切开始的地方
LeNet 是第一个将反向传播用于实际应用的 CNN 架构,突然间深度学习不再只是一个理论。LeNet 用于手写数字识别,能够轻松胜过所有其他现有方法。LeNet 架构非常简单,只有由 55 卷积和 22 最大池组成的 5 层,但为更好、更复杂的模型铺平了道路。
LeNet 架构[1]
AlexNet:越深越好
AlexNet 是第一批在 GPU 上实现的 CNN 模型之一,真正将当时日益增长的计算能力与深度学习联系起来。他们创建了一个更深入、更复杂的 CNN 模型,该模型具有各种大小的内核(如 1111、55 和 3*3),频道数量明显多于 LeNet。他们还开始使用 ReLU 激活代替 sigmoid 或 tanh,这有助于训练更好的模型。AlexNet 不仅赢得了 2012 年的 Imagenet 分类挑战赛,还以突然让非神经模型几乎过时的优势击败了亚军。
AlexNet 架构[2]
概念网:多尺度特征提取
在 CNN 的历史上,InceptionNet 是一个巨大的进步,它从多个方面解决了问题。首先,InceptionNet 比现有的模型更深入,参数更广泛。为了处理训练更深模型的问题,他们采用了在模型之间存在多个辅助分类器的想法,以防止梯度消失。然而,他们的主要主张之一是并行使用不同大小的内核,从而增加模型的宽度而不是深度。他们提出,这样的架构可以帮助他们同时提取更大和更小的特征。
InceptionNet v1 架构[5]
VGG:3x 3 卷积的力量
虽然 CNN 模型之前的所有迭代都相信更大感受野的想法(例如,AlexNet 有 1111 个卷积核),但 VGG 提出了将所有这些分解为 33 个卷积的想法。根据 VGG 体系结构,堆叠在一起的多个 3×3 卷积能够复制更大的感受野,并且在它们之间存在更多的非线性(就激活函数而言),它甚至可以比具有更大感受野的对应物表现得更好。他们甚至引入了 1*1 卷积,以进一步增加模型中的非线性。从那以后,VGG 模型变得非常有名,甚至在今天还被用于各种教程中向 CNN 的新成员介绍。
VGG-16 建筑[3]
ResNet:处理消失渐变
简单堆叠多个 CNN 层来创建更深模型的总体趋势很快就停止了,原因是深度学习中一个非常常见的问题,称为消失梯度。更简单地说,在训练 CNN 时,梯度从最后一层开始,在到达初始层之前,需要穿过中间的每一层。这可能会导致渐变在某处完全消失,从而难以训练模型的初始层。ResNet 模型引入了剩余或快捷连接,为渐变创建了替代路径,以跳过中间层并直接到达初始层。这使得作者可以训练早期表现不佳的非常深入的模型。现在,在现代 CNN 架构中使用剩余连接已经成为一种常见的做法。
ResNet 架构[4]
MobileNet & MobileNetV2:向边缘友好型发展
CNN 在这个阶段的总趋势是创建越来越大的模型以获得更好的性能。虽然 GPU 提供的计算能力的进步允许他们这样做,但一系列新的产品也在 ML 世界中引起了注意,称为边缘设备。边缘设备具有极大的内存和计算限制,但却为 GPU 无法应用的许多应用打开了大门。
为了创建更轻的 CNN 模型,使其能够与现有的最先进技术相媲美,MobileNet 应运而生。MobileNet 引入了可分卷积的概念(我在之前的博客中详细讨论过)。更简单地说,它将 2D 卷积核分解为两个独立的卷积,深度卷积负责收集每个通道的空间信息,点卷积负责各个通道之间的交互。后来,MobileNetV2 也引入了剩余连接和架构中的其他调整,以进一步减小模型大小。
深度方向可分的 2D 卷积[ 来源
效率网:挤压和激励层
有了各种关注性能或计算效率的独特模型,EfficientNet 模型提出了这两个问题可以通过类似的架构来解决的想法。他们提出了一个通用的 CNN 框架结构和三个参数,即宽度、深度和分辨率。模型的宽度是指各层中存在的通道的数量,深度是指模型中的层数,分辨率是指模型的输入图像大小。他们声称,通过保持所有这些参数较小,可以创建一个有竞争力但计算效率高的 CNN 模型。另一方面,仅仅通过增加这些参数的值,就可以创建更注重精度的模型。
虽然挤压层和激发层早就提出来了,但他们是第一个将这个想法引入主流 CNN 的人。S&E 图层创建跨通道的交互,这些交互对于空间信息是不变的。这可以用来降低不太重要的渠道的影响。他们还引入了新提出的 Swish 激活,而不是 ReLU,这是性能提高的一个重要因素。EfficientNets 是目前在各种计算资源可用性类别下表现最好的分类模型。
挤压和激励网络[ 来源
下一步是什么?
如今,CNN 模型在其图像分类性能以及跨各种其他问题陈述(如对象检测和分割)的迁移学习能力方面受到测试。这些问题中的一些被认为已经解决了。焦点正转向 CNN 模型,如沙漏架构,其中输出图像分辨率与输入相同。然而,即使在今天,我在这篇博客中介绍的主干直接用于各种深度学习任务,因此即使图像分类问题几乎得到解决,该领域的发展在未来仍将具有很大的重要性。
参考
[1] LeCun,Yann 等,“基于梯度的学习在文档识别中的应用”IEEE 86.11 会议录(1998):2278–2324。
[2]克里热夫斯基、亚历克斯、伊利亚·苏茨基弗和杰弗里·e·辛顿。"使用深度卷积神经网络的图像网络分类."神经信息处理系统进展。2012.
[3]西蒙扬、卡伦和安德鲁·齐塞曼。“用于大规模图像识别的非常深的卷积网络。”arXiv 预印本 arXiv:1409.1556 (2014)。
[4]何,,等.“用于图像识别的深度残差学习”IEEE 计算机视觉和模式识别会议录。2016.
【5】塞格迪,克里斯蒂安,等着《用回旋深化》IEEE 计算机视觉和模式识别会议录。2015.
【6】Howard,Andrew G .等,《移动网络:用于移动视觉应用的高效卷积神经网络》arXiv 预印本 arXiv:1704.04861 (2017)。
[7]谭、明星、郭诉乐。"效率网:重新思考卷积神经网络的模型缩放."arXiv 预印本 arXiv:1905.11946 (2019)。
从线性回归到岭回归,套索和弹性网
图 1:普通回归与套索回归、山脊回归和弹性网回归相比的图像。图片引用:邹,h .,&哈斯蒂,T. (2005)。通过弹性网的正则化和变量选择。
以及为什么您应该学习替代回归技术
简介:
普通最小二乘法(()OLS()是最古老、最简单的回归算法之一。然而,现在有几个变种被发明出来,以解决使用常规最小二乘回归时遇到的一些弱点。
尽管是最古老的算法之一,线性模型仍然非常有用。事实上,它们往往能胜过花哨复杂的模型。当没有大量的观察值时,或者当输入可靠地预测响应时(低信噪比),它们特别有用。
在本文中,我们将首先回顾使用线性回归的基本公式,讨论如何使用梯度下降法求解参数(权重),然后介绍岭回归。然后我们将讨论套索,最后是弹性网。这篇文章也将属于我的从零开始构建机器学习算法系列(大部分)。到目前为止,我已经从头开始讨论了逻辑回归,从奇异值分解和遗传算法中导出主成分。
我们将使用来自 1989 年研究的真实世界癌症数据集来了解其他类型的回归、收缩以及为什么有时线性回归是不够的。
癌症数据:
这个数据集由 1989 年完成的一项真正的科学研究的 97 个观察数据组成。数据包括 8 个预测因子,感兴趣的结果是 lpsa(对数前列腺特异性抗原)。
这个数据集在 统计学习的要素 中有所详细讨论。
首先,我们加载将要使用的库,然后读入数据集。
下面是最初的一些观察结果:
图 2:前列腺癌数据集的最初几个观察结果。预测因子包括 log cavol、log weight、age、lbph、sci、lcp、gleason、pgg45。我们还有一个指示器,告诉我们观察值是属于训练集还是测试集。图片来自作者。
在 97 个观察值中,67 个被指示为属于训练,而剩余的 30 个被保存用于在算法训练结束时进行测试。请注意,我们不需要“Id”列或“train”列,因此我们将其删除。在回归之前,我们还经常建议缩放和居中我们的列。
我们首先将 97 个观察结果分成初始训练集和测试集。初始训练集的大小为 67,剩余的 30 个观察值在测试集中。(x_train,y_train)和(x_test,y_test)。在本文的后面,我们将进一步把我们的训练集分解成一个训练/验证集。请注意,我们的模型将根据测试数据进行评估,因此我们在拟合模型时不使用任何测试数据。
回归设置:
首先,考虑一个简单的回归问题,有 N 个观察值(行)和 p 个预测值(列),包括:
- N x 1 个结果向量, Y.
图 3:我们 N 次观察的结果向量。图来自作者。
- 观察值的 N x (p+1)矩阵, X
图 4:N 个观察值中的每一个都表示在一行中。考虑到截距或“偏差”项,我们还在每个观察值上加 1。图来自作者。
- (p+1) x 1 个权重向量, W 。
图 5:我们的权重向量,w。图来自作者。
为了获得我们的预测,我们将我们的权重 W 乘以我们的观测值 x。因此,残差或真实结果与我们的预测之间的差异可以用 N x 1 矩阵表示:
图 6:我们的预测减去我们的估计。请注意,估计值是通过将权重乘以我们的观察值获得的。我们的预测越接近真实值,该行就越接近零。图来自作者。
“完美”的情况是图 6 中的矩阵充满了零,因为这将代表对训练数据的完美拟合。但这种情况几乎从来没有发生过,这也可能是“过度拟合”模型的一种情况。
成本函数:
为了确定一个模型有多好,我们需要一些“好”的定义。在线性回归中,这几乎总是均方误差(MSE)。这只是我们的估计和真实观察之间的误差平方和。
图 7:红点代表实际观察,表面代表我们在任一点(X1,X2)的预测。这些线条表示我们的预测与实际观测数据之间的距离。这些距离的平方和定义了我们的最小二乘成本。图片引用:该图片经许可使用,如图 3.1 所示,出现在《统计学习要素》第二版中。
通常,这在一个例子中被定义为损失函数。对于整个训练数据,我们使用成本函数,即每个训练示例的平均损失。
为了找到成本曲面的最小值,我们使用梯度下降,这涉及到对每个参数进行求导。
当只有两个参数时,成本表面实际上可以被可视化为等高线图。在更高维度中,我们不能直接看到表面,但是寻找最小值的过程是一样的。梯度下降依赖于学习率α,它控制我们采取的步长。
图 8:梯度下降就是采取步骤寻找损失面最小值的过程。图片引用:https://www . research gate . net/figure/Non-convex-optimization-We-utilize-random-gradient-descent-to-find-a-local-optimum _ fig 1 _ 325142728
对于每个时期或迭代,我们计算每个参数相对于成本函数的导数,并在方向(最陡)方向上迈出一步。这确保我们(最终)达到最小值。实际上,这并不简单,因为学习率可能太大或太小,导致陷入局部最优。
图 9:梯度下降。训练我们的重量(参数)的步骤。这包括通过减去成本函数相对于权重的导数,再乘以α(学习率)来更新每个权重。图来自作者。
现在是定义我们稍后将使用的一些助手函数的好时机:
线性回归:
线性回归是最简单的回归算法,于 1875 年首次被描述。“回归”这个名字来源于弗朗西斯·高尔顿注意到的向平均值回归的现象。这指的是这样一个事实,当非常高的父母或非常矮的父母的孩子通常仍然更高或更矮时,他们倾向于接近平均身高。这被称为“回归均值”。
图 10:高尔顿在遗传地位上回归平庸。图片引用:https://RSS . online library . Wiley . com/doi/full/10.1111/j . 1740-9713.2011 . 00509 . x
最小二乘回归的工作原理是简单地拟合一条线(或二维以上的超曲面)并计算从估计值到实际观察点的距离。最小二乘模型是最小化模型和观测数据之间的平方距离的模型。
图 11:线性回归的成本函数。成本是单个损失函数的归一化总和。这和均方误差乘以一个标量是一样的(最后的结果是等价的)。图来自作者。
图 12:线性回归的成本函数的导数。图来自作者。
您可能会注意到,这可能会使我们的算法容易受到离群值的影响,其中一个孤立的观察值可能会极大地影响我们的估计。这是真的。换句话说,线性回归对异常值并不稳健。
另一个问题是,我们可能对训练数据拟合得太好了。假设我们有许多训练数据和许多预测器,有些具有共线性。我们可能会获得非常适合训练数据的线,但它可能不会在测试数据上表现得那么好。这就是替代线性回归方法的优势所在。因为我们在最小二乘法中考虑了所有的预测值,这使得它容易过度拟合,因为添加额外的预测值没有损失。
因为线性回归不需要我们调整任何超参数,所以我们可以使用训练数据集来拟合我们的模型。然后,我们在测试数据集上评估线性模型,并获得我们的均方误差。
从零开始渐变下降:
下面的代码从头开始实现梯度下降,我们提供了添加正则化参数的选项。默认情况下,“reg”设置为零,因此这将等同于与简单最小二乘法相关联的成本函数的梯度下降。当 reg 大于零时,算法将产生岭回归的结果。
由于我们现在使用自定义函数,我们需要向矩阵 x_train_scaled 添加一列 1,这将考虑截距项(将乘以权重 W0 的项)。我们还将对象转换成 numpy 数组,以便进行更简单的矩阵计算。
让我们来看看梯度下降是如何进行的:
图 14:随着我们不断制造越来越好的砝码,成本下降得相当快。图来自作者。图来自作者。
现在让我们使用通过梯度下降获得的权重来对我们的测试数据进行预测。我们内置的 MSE 函数将使用wllinear来计算预测,并将返回测试 MSE。
使用梯度下降来获得我们的权重,我们在我们的测试数据上获得 0.547 的 MSE。
岭回归:
与最小二乘成本函数相比,岭回归使用增强的成本函数。岭回归引入了一个附加的“正则化”参数,而不是简单的平方和,该参数会对权重的大小产生不利影响。
图 15:岭回归的成本函数。成本是单个损失函数的归一化总和。该成本函数通过正参数λ来惩罚权重。图来自作者。
幸运的是,这个成本函数的导数仍然很容易计算,因此我们仍然可以使用梯度下降。
图 16:岭回归的成本函数的导数。图来自作者。
快速事实:
- 岭回归是吉洪诺夫正则化的特例
- 存在封闭形式的解,因为在矩阵上添加对角元素确保了它是可逆的。
- 允许可容忍的额外偏置量,以换取效率的大幅提高。
- 在神经网络中使用,这里称为权重衰减。
- 当您有太多预测值,或预测值之间有高度多重共线性时使用。
- 等效于 lambda 为 0 时的普通最小二乘。
- 又名 L2 正规化。
- 在应用岭之前,必须缩放预测值。
图 17:二维情况下 OLS 估计和岭回归估计的比较。请注意,在成本函数中正则化项的原点处,岭估计被限制在一个圆内。岭估计可视为线性回归系数等高线与 B1+B2≤λ定义的圆相交的点。图像引用:统计学习的要素,第 2 版。
因为我们在岭回归中有一个超参数 lambda,所以我们形成了一个额外的维持集,称为验证集。这与测试集是分开的,允许我们调整理想的超参数。
选择λ:
为了找到理想的λ,我们使用一系列可能的λ值来计算验证集的 MSE。函数 getRidgeLambda 在维持训练集上尝试一系列 Lambda 值,并在验证集上检查 MSE。它返回理想的参数 lambda,然后我们将使用它来拟合整个训练数据。
理想的λ是 8.8,因为它导致验证数据的最低 MSE。
使用交叉验证,我们获得了λ= 8.8 的理想“reg”参数,因此我们使用该参数通过梯度下降来获得我们的岭估计。
使用岭回归,我们在 0.511 的测试数据上得到甚至更好的 MSE。请注意,与最小二乘法估计的系数相比,我们的系数被“缩小”了。
套索回归:
套索回归或(最小绝对收缩和选择算子’)也适用于替代成本函数;
图 Lasso 回归的成本函数。我们仍然正则化,但使用 L1 正则化,而不是在山脊 L2。这个成本函数的导数没有封闭形式。图来自作者。
然而,成本函数的导数没有封闭形式(由于 L1 在权重上的损失),这意味着我们不能简单地应用梯度下降。Lasso 允许系数实际上被强制为零的可能性(见图 19),本质上使 Lasso 成为一种模型选择方法以及一种回归技术。
快速事实:
- 被称为“诱导稀疏”的方法。
- 有时被称为基础追踪。
图 19:OLS 估计和 Lasso 回归估计的比较。请注意,Lasso 估计值被限制在成本函数中正则化项的原点处的一个框中。椭圆与边界框相交的点给出了套索估计。注意,在上面的例子中,我们在一个拐角处相交,这导致上面例子中的系数(B1)被设置为零。统计学习的要素,第二版。
由于我们不能应用梯度下降,我们使用 scikit-learn 的内置函数来计算理想的权重。然而,这仍然需要我们选择理想的收缩参数(就像我们对山脊所做的那样)。我们采用与岭回归中相同的方法来搜索验证数据上的理想正则化参数。
Lasso 在测试数据上提供了 0.482 的 MSE,甚至小于岭和线性回归!而且,Lasso 还将一些系数设置为零,完全排除在考虑范围之外。
弹性网:
最后,我们来到弹性网。
图 20:弹性网的成本函数。它包含了 L1 和 L2 的损失。图来自作者。
弹性网有两个参数,因此,我们需要搜索组合网格,而不是搜索单个理想参数。因此训练可能会有点慢。不是直接搜索λ1 和λ2,通常最好是搜索这两个参数之间的理想比率,以及λ1 和λ2 之和的α参数。
快速事实:
- 线形、脊形和套索都可以看作是弹性网的特例。
- 2014 年证明了弹性网可以化简为线性支持向量机。
- 损失函数是强凸的,因此存在唯一的最小值。
这个弹性网是套索的延伸,它结合了 L1 和 L2 的正规化。所以 L1 需要一辆 lambda1,L2 需要一辆 lambda2。类似于套索,导数没有封闭的形式,所以我们需要使用 python 的内置功能。我们还需要找到我们的两个参数之间的理想比率,以及作为λ1 和λ2 之和的附加α参数。
图 21:弹性网(红色)是脊回归(绿色)和套索(蓝色)的组合。图片引用:https://www . research gate . net/figure/Visualization-of-the-elastic-net-regularity-red-combining-the-L2-norm-green-of _ fig 6 _ 330380054
我们不会从头开始编码弹性网,scikit-learn 提供了它。
然而,我们执行交叉验证来选择两个参数,alpha 和 l1_ratio。一旦我们有了理想的参数,我们就使用选择的参数在完全训练上训练我们的算法。
哇!弹性网提供了比所有其他模型更小的 MSE (0.450)。
综合起来看:
最后,我们计算了最小二乘法、脊线法、套索法和弹性网格法的结果。我们已经获得了每种方法的权重,还获得了原始测试数据集的 MSE。我们可以在表格中总结这些方法的表现。
图 22:我们每个模型的最终比较。此表总结了测试集的最终估计系数和均方误差。图来自作者。
与所有其他模型相比,简单最小二乘法在我们的测试数据中表现最差。岭回归提供了与最小二乘法相似的结果,但它在测试数据上做得更好,并缩减了大多数参数。最终,Elastic Net 在测试数据集上提供了最好的 MSE,而且差距很大。弹性网去掉了 lcp,格里森,年龄,缩水了其他参数。拉索也去除了年龄、lcp 和格里森的考虑,但表现略差于弹性网。
总结:
了解基本的最小二乘回归仍然非常有用,但也应该考虑其他改进的方法。常规最小二乘法的一个问题是它没有考虑过拟合的可能性。岭回归通过缩小某些参数来解决这个问题。Lasso 更进一步,允许将某些系数直接强制为零,从模型中消除它们。最后,弹性网结合了套索和脊的优点。
在某些情况下,我们可以推导出最小二乘的精确解,只要λ> 0,我们总是可以推导出岭的解。选择 lambda 是困难的部分(你应该在训练数据集上使用交叉验证来选择理想的 lambda)。在本指南中,我们没有显示封闭形式的解决方案,因为最好从头开始了解解决方案是如何解决的,并且因为封闭形式的解决方案通常不存在于高维空间中。
感谢您的阅读,如果您有任何问题或意见,请发送给我!
想了解更多?
如果您喜欢这些主题,并想学习更高级的回归技术,请查看以下主题:
来源:
来自统计学习的元素的图像被允许使用。“作者(Hastie)保留所有这些数字的版权。它们可以用在学术报告中。”
GitHub 上的代码:
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/Robby955/CancerData/blob/master/pythonRegression.py)
[1]邹,h .,,哈斯蒂,T. (2005).通过弹性网的正则化和变量选择。皇家统计学会杂志:B 辑(统计方法学)。
[2]阿米尼,亚力山大&索莱马尼,艾娃&卡拉曼,塞尔塔克&鲁斯,达尼埃拉。(2018).用于端到端控制的空间不确定性采样 。神经信息处理系统。
[3]斯塔梅、T. A .、卡巴林、J. N .、麦克尼尔、J. E .、约翰斯通、I. M .、弗赖哈、f .、雷德温、E. A .、杨(1989)。前列腺特异性抗原在前列腺癌诊断和治疗中的应用。二。根治性前列腺切除术治疗的患者。《泌尿外科杂志》, 141 (5),1076–1083。https://doi . org/10.1016/s 0022-5347(17)41175-x
*【4】*哈斯蒂,t .【哈斯蒂,t .】蒂布希拉尼,r .&弗里德曼,J. H. (2001)。统计学习的 要素 :数据挖掘、推断、预测。纽约:斯普林格。
[5]霍尔,A. E .,&肯纳德,R. W. (1970 年)。岭回归:非正交问题的有偏估计。技术指标。
6 TiB shirani,R. (1996 年)。通过套索的回归收缩和选择。英国皇家统计学会杂志:B 辑(方法论), 58 (1),267–288。
从机器学习到深度学习,这里有 15 个你一定会遇到的术语
说明
人工智能领域内值得学习的关键词…
埃迪·科普在 Unsplash 上的照片
介绍
人工智能作为一个领域包括各种子领域和实践,如计算机视觉、自然语言处理、语音识别、机器学习等。在这些提到的领域中有一些概念和术语,用于描述所设计的算法和技术的目的。
本文将介绍一些你在人工智能相关研究或媒体资源中最有可能遇到的常见概念、术语和关键词。本文提供的信息只是一个高层次的概述;每个术语都有为那些寻求获得更深入知识的人提供的资源。
尺度不变特征变换
这是一种用于生成图像关键点描述符(特征向量)的计算机视觉技术。生成的描述符包含关于诸如边、角和斑点的特征的信息。该描述符可用于检测不同比例和失真的图像中的对象。SIFT 被用在诸如对象识别、手势识别和跟踪的应用中。这里有一个介绍这项技术的原始研究论文的链接。SIFT 的关键在于它的检测特征对于任何仿射变换都是不变的,例如缩放、平移和旋转。
方向梯度直方图(HOG)
这是一种用于从图像中提取特征的技术。所提取的特征是从通过图像内的边缘和拐角提供的信息中导出的,更具体地说,是从图像内的对象中导出的。对这些技术的简单描述是,它识别图像内的边缘(梯度)、角和线的位置,并且还获得关于边缘方向的信息。HOG 描述符生成直方图,该直方图包含从图像中检测到的边缘分布信息和方向信息。这种技术可以在计算机视觉应用和图像处理中找到。这里有一个包含更多信息的链接。
主成分分析
主成分分析(PCA): 对特征丰富的数据集进行降维的算法。降维是通过将数据点从较高维度投影到较低平面来实现的,但仍然保持信息并使信息损失最小化。
神经类型转移
神经风格转移(NST): 利用深度卷积神经网络和算法从一幅图像中提取内容信息,从另一幅参考图像中提取风格信息的技术。在提取样式和内容之后,生成组合图像,其中所得图像的内容和样式源自不同的图像。
递归神经网络(RNN)和 LSTM
递归神经网络(RNN)和 LSTM :人工神经网络架构的一种变体,能够接受任意大小的输入,并产生任意大小的输出数据。RNN 神经网络结构学习时间关系。rnn 用于语音识别、图像字幕和自然语言处理等应用中。
Richmond Alake 的递归神经网络解码器阶段
下面是 Luis Serrano 解释 RNNs 基础知识的精彩视频:
人脸检测
人脸检测:实现能够自动识别和定位图像和视频中人脸的系统的术语。面部检测存在于与面部识别、摄影和动作捕捉相关联的应用中。
面部检测和面部特征跟踪
姿态估计
姿势估计:从提供的数字资产,如图像、视频或图像序列,推断身体主要关节位置的过程。姿态估计的形式存在于诸如动作识别、人类交互、虚拟现实和 3D 图形游戏的资产创建、机器人等应用中。
物体识别
**物体识别:**识别与 a 类目标物体相关的过程。对象识别和检测是具有相似结果和实现方法的技术,尽管在各种系统和算法中识别过程先于检测步骤。
跟踪
**跟踪:**一种在一段时间内在一系列图像中识别、检测和跟踪感兴趣的物体的方法。在许多监控摄像机和交通监控设备中可以找到系统内跟踪的应用。
目标检测
目标检测:目标检测与计算机视觉相关联,描述了一种能够识别图像中期望的目标或身体的存在和位置的系统。请注意,要检测的对象可能出现一次或多次。
最优化算法
优化算法:执行预定次数的算法,用于寻找问题的最优解;在数学术语中,这些“问题”被称为函数。
梯度下降
梯度下降:该优化算法用于寻找降低成本函数的值。这是通过梯度值的计算来完成的,该梯度值用于在找到成本函数的局部最小值的每一步选择值。梯度的负值用于寻找局部最小值。
价值函数
成本函数:这是一种量化机器学习模型执行“有多好”的方法。量化是基于一组输入的输出(成本),这些输入被称为参数值。参数值用于估计预测,而“成本”是预测值和实际值之间的差异。
全局极小值
全局最小值:这是位于成本函数整个域内的最小参数值。您可能会遇到局部最小值,它是指位于成本函数的设定范围内的最低参数值。
趋同;聚集
收敛:这描述了在机器学习环境中使用时,向最佳参数值或全局最小值移动的概念
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
- 订阅我的 YouTube 频道 视频内容即将上线 这里
- 跟着我上 中
- 通过 LinkedIn 联系我
[## 为什么机器学习工程师(或数据科学家)不是这场秀的主角
但是我们仍然是成功的员工队伍中不可或缺的一部分
towardsdatascience.com](/why-machine-learning-engineers-or-data-scientists-are-not-the-stars-of-the-show-d91ec9c5256b) [## 理解卷积神经网络中的局部感受野
想过为什么卷积神经网络中的所有神经元都没有连接起来吗?
towardsdatascience.com](/understand-local-receptive-fields-in-convolutional-neural-networks-f26d700be16c)
从模型拟合到生产只需几秒钟
我能写的关于有效部署 ML & AI 模型的最短的教程
将 ML 模型投入生产是一个挑战;超过 60%的型号从未真正投入生产。事实并非如此:只需几行代码就能有效地将模型投入生产。
模型拟合
由于拟合不是本教程的目的,我将只在标准的 scikit-learn 乳腺癌数据上拟合一个 XGBoost 模型:
# Get the data:
from sklearn.datasets import load_breast_cancercancer = load_breast_cancer()X = cancer.data
y = cancer.target# And fit the model:
import xgboost as xgbxgb_model = xgb.XGBClassifier(objective="binary:logistic", random_state=42)
xgb_model.fit(X, y)
(我忽略了模型检查和验证;让我们来关注部署)
部署模型
现在我们有了合适的模型;让我们使用[sclblpy](https://pypi.org/project/sclblpy/)
包来部署它:
# Model deployment using the sclblpy package:
import sclblpy as sp# Example feature vector and docs (optional):
fv = X[0, :]
docs = {}
docs['name'] = "XGBoost breast cancer model"# The actual deployment: just one line...
sp.upload(xgb_model, fv, docs)
完成了。
使用部署的模型
运行上面的代码几秒钟后,我收到了以下电子邮件:
模型部署完成。
点击蓝色的大按钮,进入一个页面,我可以直接运行推论:
在网络上产生推论
虽然这很好,但是您可能希望创建一个更好的应用程序来使用部署的模型。只需复制粘贴项目所需的代码:
将已部署的模型简单地复制粘贴到软件项目中。
你走吧!
包裹
关于模型部署(以及如何高效地部署:上面的过程实际上将您的模型传输到 WebAssembly 以使其高效和可移植)还有很多要说的,我不会说。
这是我能想到的最短的教程。
放弃
值得注意的是我自己的参与:我是 Jheronimus 数据科学院 的数据科学教授,也是Scailable的联合创始人之一。因此,毫无疑问,我对 Scailable 有既得利益;我有兴趣让它成长,这样我们就可以最终将人工智能投入生产并兑现它的承诺。这里表达的观点是我自己的。
将工作减半的 Python 妙招:自动化执行
使用 VBA、Powershell 和任务调度程序自动执行脚本并通过电子邮件发送结果
作者图片,来自维基共享和 Flickr 的徽标
摘要: 这篇文章讲述了如何调度你的常规 python 脚本。假设你
- 将每天/每周/每月更新的 excel 报告放入共享网络或电子邮件
- 启动并运行 python 脚本来处理您的报告,并以图像、工作表或其他数据形式提供见解。
- 希望以固定的时间间隔长时间运行流程,但又非常担心必须手动运行。
数据工程也有有趣的部分——比如编程和分析数据。然后是无聊的部分,比如定期使用已经写好的程序来获得最新的结果。显然,没有人想做后者。这里有一个快速解决方法,我用它来避免运行那些需要每天/每周/每月执行的脚本,以便更好地利用这些时间。
三个词—宏、批处理和调度。
- 我使用一个宏将我收到的 excel 报告保存到一个位置。(我从一个执行分析并手动向我发送报告的地方获得它。不,这个没办法)。
- 我设置了一个 outlook 规则,只在想要的文件夹上运行宏,并附带一些其他条件(发件人、主题等)。
- 我写一个批处理文件(。bat),单击它将在命令提示符下执行脚本。
- 我使用 Windows 任务调度器调度 bat 文件,以与新 excel 报告到达的频率相同的频率执行脚本
- 我写了一个 PowerShell 脚本,将最新的结果通过电子邮件发送给所有必要的接收者,然后我安排它在 bat 文件执行后马上运行。
步骤 1: Outlook 宏
- 通过在 outlook 的选项窗格中激活 VBA 脚本,可以在 Outlook 中激活它。
- 然后,您会看到一个开发人员工具按钮出现在 outlook 主页窗口的顶部。
3.转到“开发工具”选项卡,启动 Visual Basic 脚本。
4.在这里创建一个新模块,并编写代码脚本来保存传入的附件。
很简单。
在下面的示例中,报告名称始终是我收到的自动电子邮件的主题。所以我用这个标准来决定我的文件的文件名,并把它保存到一个文件夹中。
(我还确保保存它的日期,这样我就知道在执行我的脚本之前,目标文件夹总是有最新的文件。)
在收到的电子邮件中保存附件的 VBA 脚本:
Public Sub SaveRegularReports(MItem As Outlook.MailItem)
Dim oAttachment As Outlook.Attachment
Dim sSaveFolder As String
sSaveFolder = "/You/want/to/save/here/"
If MItem.Subject = "Quarterly_rep" Then
savename = "QRep"
ElseIf MItem.Subject = "JustSomeRegRep" Then
savename = "RegRep"
ElseIf MItem.Subject = "WeeklyReport" Then
savename = "WeeklyUpdate"
End If
For Each oAttachment In MItem.Attachments
oAttachment.SaveAsFile sSaveFolder & savename & Format(MItem.ReceivedTime, "mmddyyyy") & ".xlsx"
Next
End Sub
原谅我的德语,但我相信你也能认出这些英语设置!
现在,我要做的就是决定这些规则适用于谁。因此,我转到规则,并设置我想要应用脚本的条件。
在我的例子中,我的条件是电子邮件总是来自一个特定的地址,其主题包含报告的名称。(为了安全起见,我将所有此类常规报告都移到了收件箱中的一个单独文件夹中)
在下一步中,作为一个动作,每当这个文件夹得到一个新手时,我就执行上面的脚本 SaveRegularReports。
瞧吧!不费吹灰之力就自动保存了我需要的一切!!
第二步。编写 bat 文件以在保存的 excel 表上执行 python 脚本
这也是小菜一碟。bat(或批处理)文件是一组命令,当您单击它时,命令提示符会执行这些命令。如果您曾经编写过 bash 命令或者使用过 windows 命令提示符 shell 脚本来“pip install”之类的,那么您应该知道我在说什么。
- 打开一个文本文件,编写与下面类似的命令来执行 python 脚本,就像在命令提示符下一样。(我使用的是 anaconda,所以在执行 python 脚本之前,我首先激活了 Anaconda 提示符)。
- 将该文件另存为 filename.bat
[@echo](http://twitter.com/echo) offcall C:\Users\myUSer\AppData\Local\anaconda\Scripts\activate.batC:\This\is\Where\Your\Script\Lives\Scriptchen.pypause
当我点击上面的 bat 文件(scriptchens_bat.bat)时,我的 python 脚本被执行。它使用步骤 1 中保存的 excel 报告。
第三步。任务-计划您的脚本执行
注意:我知道我每周都会收到报告,比如说周五上午 10 点。我将这个脚本设置为每周五 10:30 运行。
- 从 Windows 中的搜索栏打开任务计划程序。转到创建基本任务。
- 在出现的窗口中命名和描述后,转到触发器窗格并设置您的时间表。在这个例子中是星期五的 10:30。
现在是肉的部分。转到操作窗格。这里是您设置 bat 文件以便执行的地方。从“操作”中选择“启动程序”,在程序窗格中,给出您的。您在步骤 2 中编写的 bat 文件。
单击确定并确认。
瞧啊。现在,您每周都可以轻松地输出 Python 脚本了!
第四步。通过电子邮件发送结果
如果你对最新的结果感到满意,你可以就此打住。但是,如果您想更进一步,也想自动分发您的处理结果,请喝杯咖啡,通读最后一步。
我决定使用 powershell 将我的 outlook 结果通过电子邮件发送给其他同事。以下是方法:
- 从 windows 搜索打开 PowerShell ISE。
- 下面的脚本是我的案例的一个例子,它将结果分别用正文和主题行发送给所有收件人。你可以修改你的脚本来满足你的需要。
$OL = New-Object -ComObject outlook.applicationStart-Sleep 5$recipients = @(“recipient_one@company.de”,”recipient_two@company.de”,”recipient_three@company.de”)foreach ($recipient in $recipients){$mItem = $OL.CreateItem(“olMailItem”)$mItem.To = $recipient$mItem.Subject = “Automatic Email: Weekly Report”$mItem.Body = “This is an automated email sent using powershell. In case of any questions please contact Me. Dieses Dokument enthält… “$mItem.Attachments.Add(“\This\is\where\my\python\output\lives\file_to_email.xlsx”)$mItem.Send()}
自动发送电子邮件的 Powershell 脚本
第五步。设置任务计划程序,将您的结果通过电子邮件发送给收件人
与步骤 3 类似,现在您将安排 powershell 脚本在 python 脚本执行后每周执行一次。
- 转到任务计划程序中的新任务
- 命名并描述您的任务
- 转到 trigger 并设置您的计划
- 开始行动。在程序/脚本栏中,输入 PowerShell 应用程序的地址。它通常在这里:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
在参数栏中,输入之前编写的. ps1 脚本的路径。
瞧啊。你不费吹灰之力就发了邮件!
总而言之,您自动化了整个事件链,从接收 excel 文件开始,将其保存到某个位置,用 python 处理它,然后用电子邮件发送结果。这是一个非常巧妙的方法,节省了我大量的工作时间。希望它也能帮助你!
从哲学专业到 DevOps 工程师
办公时间
我是如何从一个非 STEM 专业的学生成为一家财富 100 强公司的开发工程师的
听到我有哲学学士学位,我的许多工程同事都很惊讶。我团队中拥有 STEM 学位的人经常告诉我,拥有非 STEM 学位是一种优势。但是成为一名 DevOps 工程师的道路并不短,在这一过程中我也犯过错误。许多人想知道我是如何走过从哲学学位到 DevOps 工程师的奇异道路的。这篇文章将阐明我是如何做到的。简而言之,这是一点点运气,重要的家庭支持,以及大量的努力和耐心。但首先,一个故事。
一个故事
当我的经理问我是否可以在我的母校 UCSD 做一些招聘工作时,我正在甲骨文公司担任云工程师。当我到达时,进入加州大学圣迭戈分校技术招聘会的队伍很长。我遇到了各种各样的学生。有些人递给我一份计算机科学 GPA 为 4.0 的简历,但无法表达连贯的思想,还有一些人不会用任何编程语言输出“hello world”。
但是我特别记得一个学生。她是非 STEM 专业,有一些有趣的技术项目。当她把简历递给我时,我能看出她很害羞,担心我会如何看待她的技能或缺乏技能。我还没来得及提问,她就开始为自己的简历辩护了。我说,“嘿,我懂你的意思”。当我告诉她我从加州大学圣迭戈分校哲学专业毕业时,她的眼睛亮了起来。我们后来在 LinkedIn 上联系上了。我给了她一些建议,鼓励她继续下去。
开始
照片由 Jukan Tateisi 在 Unsplash 上拍摄
我毕业于加州大学圣迭戈分校,获得了哲学本科学位。老实说,我不知道我在做什么。我主修哲学作为一个双学位,这样我就可以继续我在这个选民登记组织的工作,这个组织是我帮助建立的,叫做 SOVAC。经过反思,增加一个哲学专业来继续在 SOVAC 工作是一个在大学多呆一年的荒谬理由。我对学生组织的奉献妨碍了我的未来。当我毕业的时候,我意识到我没有市场需要的技能。幸运的是,就在我毕业前,我获得了国家科学基金会(NSF)的资助,从事一个激情项目。
国家科学基金会的拨款给我的钱只够我生存,但我知道这不会持续很久。这笔拨款滚雪球般地变成了我和一个大学朋友创办的公司。我们建立了一个在线投票服务,并签下了一个付费客户,圣地亚哥联盟-论坛报。有了一个想法,把想法变成产品,然后卖给一个付费的顾客,就打开了开关。我就知道这里有东西。我发现了技术故障。
转变
帕特里克·亨德利在 Unsplash 上的照片
我最终得到了一份全职工作,在一家优秀的政府非营利机构担任顾问,但我的心思却被国家科学基金会的工作和我最终创办的公司牢牢占据。我的大学朋友帮助开发了这个产品,他最终被脸书公司提供了一份软件工程的工作。和我一样,他也不是 STEM 专业的学生,但在毕业前,他决定攻读计算机科学,成为一名软件工程师。在大学里,我再也没有机会改变主意了。我已经在现实世界中作为一名非盈利顾问工作。我能回头吗?
我记得当时接到经理的电话,问我是否想成为全职员工,成为员工中的一员。再说一次,我没有真正的计划,拒绝了。事后看来,我或许应该找一份全职工作,让自己有更多选择。也许我本来可以白天工作,上夜校,但我没想那么远。我只知道我想进入科技行业。
当时,训练营开始获得很大的吸引力。但是我决定在一所社区大学尝试一下 Java 入门课程。我已经全职工作了,所以这门课是我时间的一个很大的承诺。我很快意识到我热爱编程。最让我兴奋的是能够用我学到的一点点知识来构建应用程序。就是在这个时候,我决定回到学校学习计算机科学。
要学位还是不要学位?
我决定注册成为一名计算机科学研究生,因为我想了解基础知识,并有一份证明我所发展的技能的文件。我花了太多时间准备 GRE 考试。最后,我报名参加了一个甚至不要求 GRE 成绩的项目。我才意识到,本科无论去哪里都差不多。关于课程,我在哪里上并不重要。
获得学位相当于工作保障。许多人告诉我,获得学位是浪费时间,我可以学到找工作所需的任何东西。这在一定程度上是真实的。现在回想起来,很难说哪条路会更好。我认为更快的途径是参加一个训练营,或者简单地参加一些数据结构和基础编程的在线课程。但我认为获得学位更安全,虽然慢得多。事实是,计算机科学学位并不能保证什么。
在攻读硕士学位大约一年半后,我开始坐立不安。我想要一份工作。此时,我已经完成了计算机科学学位所需的几乎所有本科课程。我看了一些硕士水平的课程,觉得高级课程没什么价值。我只是想要一份工作和经验。我不想借更多的贷款,也不想花更多的时间去完成一个学位。我开始申请世界上所有的东西。我搞砸了一些采访。我显然生疏了。最终,我获得了甲骨文公司云工程师的面试机会。老实说,我不知道什么是云,也不知道甲骨文甚至有云服务。我甚至不知道云工程师是做什么的。
开始
Ashwini Chaudhary 在 Unsplash 上拍摄的照片
我做了准备,并认为我没有通过面试,但我惊讶地得到了一份工作。我很兴奋我的脚进入了门。现在回想起来,我觉得我在甲骨文工作的时间比完成硕士学位更好。与此同时,我没有一个学位,我之前说过,它会给我一些工作保障,并记录我的技能。但现在我有了技术工程师的工作经验,有些人可能会认为这比学位更好。虽然从长远来看,有学位可能更有利。无论如何,我的长期目标是最终完成我的学位,也许能拿到 MBA。
我最近接受了一份工作邀请,在 OCI (Oracle 云基础设施)担任 DevOps 工程师,这让我进行了反思,并促使我写下了这篇文章。如果像我这样的人可以到这里,任何人都可以。我很感激我取得的进步,但是我还有很长的路要走。坦率地说,决定从事计算机科学、工程和技术领域的工作是对学习的终生承诺。科技生态系统是巨大的。技术总是在变化。就在我们说话的时候,一些新的范例正在形成。任何选择这种生活的人,一定是愿意并且有兴趣跟上的。
给以前的自己的建议
许多人问我,我会采取什么不同的做法,我的建议因人而异。但是我会尽我最大的努力告诉顽强的 20 多岁的我,我决定要改变道路。
我会参加基础编程(用 C++,而不是 Python)、数据结构和算法的课程,无论是在线还是面对面(在社区大学或其他地方提问)。然后我会读《破解编码面试》,做一堆 Leetcode 题(用 Python),做一些小项目,申请软件工程实习。最大的问题是需要多长时间才能得到工作机会?
我有一些朋友毕业于计算机科学专业,但他们仍然花了 1 年时间才找到一份技术工作。拥有计算机科学学位并不一定能说服雇主给你一份工作。你必须证明自己。参与项目会有所帮助。这意味着向 Github 发布显示一致提交的代码。你越能表现出对该领域的兴趣,招聘人员或招聘经理就越有信心在你身上投资。因为最终招聘过程相当于降低风险。你表现得越多,他们决定雇佣你的风险就越小。
参加研究生项目甚至训练营的好处是,你周围都是和你有相同目标的人。你可以了解他们如何追求这些目标,交换意见,并建立一个网络。我仍然和以前的同龄人保持联系。我后悔的一件事是没有利用已经在科技行业工作的朋友。我应该多接触一下,也许可以要求一次面试。不要骄傲。接受别人提供的帮助。当你取得一些成功时,把它传递下去。最终,它需要一个村庄。很少有人靠自己成功。你不太可能是例外。
最后的想法
技术很难。冒名顶替综合症猖獗。每个人都或多或少地感觉到称自己为工程师的负担。只要记住你不是一个人。通往成功的道路充满了失败和失望。有时我让失败的恐惧麻痹了我。我内心深处担心,如果面试失败,我可能会放弃。也许我会因为工程师的反馈而气馁,从而停止尝试。但是每次面试失败后,我对自己了解了很多。我感到很振奋,因为我觉得离得到一份工作更近了。每次面试后,我开始意识到什么是重要的,并集中精力。
不要放弃。
从物理到金融:我在工业界的第一年
这是我大约 4 年前发表的文章的修订版。我很幸运地经历了一次激动人心的旅程,所以你们中许多人可能有的一个问题的答案是否定的!我从未后悔离开学术界的决定。
许多研究生和博士后在工业界从事非研究性职业。这是其中一个人的故事。
2016 年 4 月 25 日下午 5 点,我离开了我在杜克大学的办公室,开始了新的不同的旅程,下周一上午 9 点。
在获得理论物理的两个硕士学位和一个博士学位,并在计算生物化学领域做了两年博士后,与各自领域备受尊敬的科学家合作,发表了 12 多篇同行评议论文并获得国际奖项后,寻求一个永久的学术职位似乎是合乎逻辑的下一步。
然而,在学习期间,我有幸参加了由美国光学学会和 SPIE 国际光学和光子学会等科学组织组织的专业发展活动,在那里我接触了行业领导者,了解了他们所面临的挑战。我探索得越多,就越发现自己对学术界之外的现实世界的问题和机遇着迷。
问题是,多年来,我在学术界一步一步地创造了成功的职业生涯,但我对外面的世界和适合理论物理学家的角色几乎一无所知;尽管如此,我相信没有多少职位可以利用我的量子力学或电动力学知识!
不幸的是,了解二阶光学非线性(在医学领域和电信领域有许多应用)或光裂酶修复光损伤的 DNA(使地球上的生命成为可能)并没有让许多招聘经理感到兴奋。事实上,我在这个过程中学到的第一课是
专注于我获得的技能,而不是我完成的项目。
技能,如解决问题,数值分析,编程,发表文章和演示。
几个月的阅读、学习、参加研讨会、打电话和咖啡聚会来探索不同的行业职位,将我引向了数据科学。我寻找新的职业道路是在这样一个时代,有史以来第一次,我们能够利用我们产生和储存的大量数据。这反过来又导致了对数学、统计和编程方面的熟练人才的大量需求,以便将原始数据转化为真知灼见。与此同时,任何行业都欣赏批判性思维、获得新技能的能力、有效的沟通和对新工作场所的快速适应,其中许多我以前都经历过。
对数据分析的需求正成为公司不可或缺的一部分,以至于数据科学候选人可以想象在任何领域的职业生涯,从医疗保健或航空领域的大型企业到金融或体育领域的初创公司。
就我而言,行业的选择并不是一个大问题。在我的学术生涯中,我意识到与合适的人一起工作比从事最令人兴奋的项目更有成就感。合适的人激励和挑战你,比起到达目的地,你更喜欢和他们一起旅行。正如保罗·格拉厄姆所说
重要的不是想法,而是拥有想法的人。好人可以修正坏想法,但好想法救不了坏人。
[更新:]将我过去的一些经验添加到这篇文章中,我再怎么强调和我们一起工作的人的重要性也不为过。简而言之,你最终将为你的经理和/或团队缺乏经验或远见付出代价。
我在当地的一次分析聚会上遇到了 Spreedly 的首席技术官。被他的热情和鼓励所打动,我递交了申请。后来,我会见了该公司的首席技术官和首席执行官,提交了工作样本,参加了现场面试,几周后,我疯狂地加入了他们,填补了他们的第一个数据科学职位。
在招聘过程中,我喜欢公司高管对我的角色的清晰看法,这在我做出决定时发挥了重要作用。我曾被其他公司面试过,这些公司不知道他们为什么需要一名数据科学家。
Spreedly 是一家成立 6 年的金融科技初创公司,通过存储和标记支付方法来促进在线支付,为商户简化 PCI-DSS(如果你接触金融数据,你必须遵守的规则)合规性,最重要的是,通过允许商户通过一个 API 与多个支付网关合作。因此,在 Spreedly,我可以访问交易、支付方式和支付网关的数据库。
作为创业公司的第一个数据科学雇员,与其他团队互动和学习的机会是无限的。我定期与工程师、业务开发、营销、客户成功和设计团队交流:这是一个了解其他领域、不同部门如何运作以及整体金融技术的独特机会。
以下是我一路走来学到的一些经验:
- 不要害怕问:这可能是我疯狂加入后得到的最好的建议。问得越多,学得越快!
- 机构知识:领域知识是数据科学家维恩图的一部分。然而,我想强调的是机构知识:如果不了解公司如何运作,存储什么类型的数据,每个功能到底代表什么,以及商业模式如何随着时间的推移而演变,你的数据分析可能会有缺陷。
- 耐心:这在数据基础设施可能还没有准备好的启动环境中变得更加重要。一个解决办法是考虑做几个项目,在一个项目上取得进展,同时等待合适的时机开始其他项目。
- 商务人士是你最好的朋友!它们可以帮助您确定要用数据瞄准的重要问题。利用他们的商业智能更有效地工作,并获得关于数据解释的宝贵见解。在发布结果或向客户展示之前,一定要和他们讨论你的发现。
- 重要与有趣:关注看似有趣的问题很容易,但它们与公司的使命或利益不一致,也不会让客户受益。因此,投资于真正重要的问题,而不是那些仅仅看起来有趣的问题,总是一个好主意。
- 与数据驱动的人一起工作:数据科学仍然是一个新领域。因此,无论你的工作多么出色,无论你的发现多么令人兴奋,如果你不和那些欣赏数据的力量并愿意用它来做决策的人一起工作,你的努力就会白费。
- 我提到过和一群很有幽默感的人一起工作真的很有趣吗?
各种组织已经研究了从学术界到工业界的路径。根据 T4 的简历,只有 18%完成这一转变的年轻研究人员会回到学术界。我相信我是那 82%中的一员。
*更新(2020 年 12 月):*在我发表这篇帖子大约 4 年后,我仍然收到许多研究生和博士后的邮件和消息,他们正在谨慎地评估自己从学术界到工业界的退出路线。以下是我给这些人和其他考虑改变或职业转变的人的信息:只要你真诚对待你所做的事情,评估每一步,从过去吸取教训并用于未来,并且不害怕道路上的起起落落,你就会没事!去做吧,你会发现一种巨大的快乐。一定要让我知道你的故事…
从 PyTorch 到 py torch Lightning——一个温和的介绍
这篇文章回答了如果你使用 PyTorch 为什么需要 Lightning 这个最常见的问题。
PyTorch 非常容易用来建立复杂的人工智能模型。但是一旦研究变得复杂,并且像多 GPU 训练、16 位精度和 TPU 训练这样的事情混合在一起,用户很可能会引入错误。
PyTorch 闪电正好解决了这个问题。Lightning 构建了 PyTorch 代码,因此它可以抽象训练的细节。这使得人工智能研究具有可扩展性,迭代速度快。
PyTorch 闪电是为了谁?
PyTorch Lightning 是在 NYU 和费尔做博士研究时创造的
PyTorch Lightning 是为从事人工智能研究的专业研究人员和博士生创造的。
闪电诞生于我在 NYU CILVR 和脸书 AI Research 的博士 AI 研究。因此,该框架被设计成具有极强的可扩展性,同时使得最先进的人工智能研究技术(如 TPU 训练)变得微不足道。
现在核心贡献者都在使用闪电推进人工智能的艺术状态,并继续添加新的酷功能。
然而,简单的界面让专业制作团队和新人能够接触到 Pytorch 和 PyTorch Lightning 社区开发的最新技术。
Lightning counts 拥有超过 320 名贡献者,由 11 名研究科学家,博士生和专业深度学习工程师组成的核心团队。
它是经过严格测试的
并且彻底记录了
概述
本教程将带你构建一个简单的 MNIST 分类器,并排显示 PyTorch 和 PyTorch Lightning 代码。虽然 Lightning 可以构建任何任意复杂的系统,但我们使用 MNIST 来说明如何将 PyTorch 代码重构为 PyTorch Lightning。
典型的人工智能研究项目
在一个研究项目中,我们通常希望确定以下关键组成部分:
- 模型
- 数据
- 损失
- 优化程序
模型
让我们设计一个 3 层全连接神经网络,它将 28x28 的图像作为输入,输出 10 个可能标签的概率分布。
首先,让我们在 PyTorch 中定义模型
该模型定义了计算图形,将 MNIST 图像作为输入,并将其转换为数字 0-9 的 10 个类别的概率分布。
三层网络(插图作者:威廉·法尔孔)
为了将这个模型转换成 PyTorch Lightning,我们简单地替换掉 nn。带 pl 的模块。照明模块
新的 PyTorch Lightning 类与 PyTorch 完全相同,除了 LightningModule 为研究代码提供了一个结构。
闪电为 PyTorch 代码提供了结构
看到了吗?两者的代码完全一样!
这意味着你可以像使用 PyTorch 模块一样使用 LightningModule 模块,比如预测模块
或者将其用作预训练模型
数据
对于本教程,我们使用 MNIST。
来源:维基百科
让我们生成 MNIST 的三个部分,培训、验证和测试部分。
同样,PyTorch 和 Lightning 中的代码是一样的。
数据集被添加到 Dataloader 中,data loader 处理数据集的加载、混排和批处理。
简而言之,数据准备有 4 个步骤:
- 下载图像
- 图像转换(这些非常主观)。
- 生成训练、验证和测试数据集拆分。
- 包装数据加载器中拆分的每个数据集
同样,除了我们将 PyTorch 代码组织成 4 个函数之外,代码完全相同:
准备 _ 数据
这个函数处理下载和任何数据处理。这个函数确保当您使用多个 GPU 时,您不会下载多个数据集或对数据应用双重操作。
这是因为每个 GPU 将执行相同的 PyTorch,从而导致重复。Lightning 中的所有代码确保关键部分仅从一个 GPU 中调用。
train_dataloader,val_dataloader,test_dataloader
其中每一个都负责返回适当的数据分割。Lightning 以这种方式构建它,以便非常清楚数据是如何被操纵的。如果你读过用 PyTorch 写的随机 github 代码,你几乎不可能看到他们是如何处理数据的。
Lightning 甚至允许多个数据加载器进行测试或验证。
这段代码被组织在我们称之为数据模块的地方。尽管这是 100%可选的,并且 lightning 可以直接使用数据加载器,但是一个数据模块使您的数据可以重用并且易于共享。
优化器
现在我们选择如何进行优化。我们将使用 Adam 代替 SGD,因为在大多数 DL 研究中,它是一个很好的缺省值。
同样,这是完全相同的**,除了它被组织到配置优化器功能中。**
Lightning 是极其可扩展的。例如,如果你想使用多个优化器(比如:GAN),你可以在这里同时返回两个。
您还会注意到,在 Lightning 中,我们传入了*self . parameters()*而不是模型,因为 LightningModule 是模型。
损失
对于 n 路分类,我们想要计算交叉熵损失。交叉熵与负对数似然度(log_softmax)相同,我们将使用负对数似然度。
再次…代码完全相同!
训练和验证循环
我们收集了训练所需的所有关键材料:
- 模型(三层神经网络)
- 数据集(MNIST)
- 优化器
- 损失
现在,我们实施一套完整的训练程序,包括以下内容:
- 迭代多个历元(一个历元是对数据集 D 的一次完整遍历)
在数学方面
用代码
- 每个历元以称为批次 b 的小块迭代数据集
在数学方面
用代码
- 我们向前传球
在数学方面
代码
- 计算损失
在数学方面
用代码
- 执行反向传递以计算每个权重的所有梯度
在数学方面
用代码
- 将渐变应用于每个权重
在数学方面
用代码
PyTorch 和 Lightning 中的伪代码都是这样的
这就是闪电与众不同的地方。在 PyTorch 中,你自己编写 for 循环,这意味着你必须记住以正确的顺序调用正确的东西——这给 bug 留下了很大的空间。
即使你的模型很简单,但一旦你开始做更高级的事情,如使用多个 GPU、渐变裁剪、提前停止、检查点、TPU 训练、16 位精度等,它就不再简单了。你的代码复杂性将迅速爆炸。
即使你的模型很简单,一旦你开始做更高级的事情,它就不再简单了
下面是 PyTorch 和 Lightning 的验证和训练循环
这就是闪电的妙处。它抽象了样板文件(不在盒子里的东西),但是没有改变其他任何东西。这意味着你仍然在编写 PyTorch,除非你的代码已经被很好地结构化了。****
这增加了可读性,有助于再现性!
闪电教练
培训师就是我们如何抽象样板代码。
同样,这也是可能的,因为您所要做的就是将 PyTorch 代码组织成一个 lightning 模块
PyTorch 的完整训练循环
用 PyTorch 编写的完整 MNIST 示例如下:
闪电中的完整训练循环
lightning 版本完全相同,除了:
- 核心成分已经由照明模块组织起来
- 培训师已经提取了培训/验证循环代码
这个版本不使用数据模块,而是保持自由定义的数据加载器。
这是相同的代码,但是数据被分组到数据模块下,变得更加可重用。
突出
让我们指出几个要点
- 如果没有 Lightning,PyTorch 代码可以位于任意部分。有了闪电,这是结构化的。
- 这两者的代码完全相同,只是它是用 Lightning 构建的。(值得说两遍 lol)。
- 随着项目变得越来越复杂,你的代码不会,因为 Lightning 抽象出了大部分内容。
- 您保留了 PyTorch 的灵活性,因为您可以完全控制培训中的关键点。例如,您可以有一个任意复杂的 training_step,比如 seq2seq
5.在《闪电》中,你得到了一堆赠品,比如一个恶心的进度条
你还得到了一份漂亮的重量总结
tensorboard 日志(没错!你什么都不用做就能得到这个)
免费检查点和提前停止。
全部免费!
附加功能
但闪电最出名的是开箱即用的好东西,如 TPU 培训等…
在 Lightning 中,您可以在 CPU、GPU、多个 GPU 或 TPU 上训练您的模型,而无需更改 PyTorch 代码的任何一行。
也可以做 16 位精度训练
使用 5 个其他替代物对张量板进行测井
与海王星一起伐木。AI(鸣谢:Neptune.ai)
用 Comet.ml 记录日志
我们甚至有一个内置的分析器,可以告诉你训练中的瓶颈在哪里。
将此标志设置为 on 会产生以下输出
或者更高级的输出
我们还可以同时在多个 GPU上训练,而不需要你做任何工作(你仍然需要提交一个 SLURM 作业)
你可以在文档中读到它支持的大约 40 个其他特性。
带挂钩的可扩展性
你可能想知道 Lightning 是如何为你做这些事情的,而且还能让你完全控制一切?
与 keras 或其他高级框架不同,lightning 不隐藏任何必要的细节。但是如果你确实发现需要自己修改训练的每一个方面,那么你有两个主要的选择。
首先是通过覆盖钩子的可扩展性。下面是一个不完整的列表:
- …
- 您需要配置的任何东西
这些覆盖发生在照明模块中
回调的可扩展性
回调是您希望在培训的各个部分执行的一段代码。在 Lightning 中,回调是为非必要的代码保留的,比如日志或者与研究代码无关的东西。这使得研究代码非常干净和有条理。
假设您想在培训的各个阶段打印或保存一些东西。这是回调的样子
PyTorch 闪电回拨
现在你把它传递给训练者,这个代码会在任意时间被调用
这种范式将您的研究代码组织成三个不同的类别
- 研究代码(LightningModule)(这就是科学)。
- 工程代码(培训师)
- 与研究无关的代码(回调)
如何开始
希望这份指南能准确地告诉你如何开始。最简单的开始方式是用运行 colab 笔记本,这里是 MNIST 的例子。
或者安装闪电
或者查看 Github 页面。
从报告到洞察:提高分析成熟度
freepik 创作的背景照片—www.freepik.com
今天的公司面临着巨大的挑战:如何从信息中提取价值,并在快速的 数据驱动的 环境中运营。长期以来,良好的洞察力在商业中一直扮演着关键角色,高管们对此心知肚明。但是,这从来没有成为全公司沮丧的根源。简单来说,想成为 数据驱动 和搞定是有区别的。原因是数据和分析之间存在巨大的基础设施和技能差距。
一个组织的业务不是写报告,而是基于洞察力采取行动
当今的分析解决方案通常在简单和假设的场景中进行测试和呈现,无法反映日常交易和真实组织的细微差别。它错误地促使企业领导相信将数据集插入工具很容易,而且会产生立竿见影的业务影响。事实并非如此,在任何可见的结果之前,数据都需要大量的提炼。
成功实施数据驱动的文化有三个关键要素:
- 领导者需要向数据和分析的新观点飞跃。摆脱将孤立的数据、业务应用程序和分析应用程序基于数据仓库和业务智能系统的旧思维,主要用于企业报告;
- 团队需要开始将数据作为决策和计划的原材料;
- 公司需要接受新的方法和工具,这将引导他们走向分析的成熟。
走向有洞察力的决策
其中一个工具是连续分析。由 Gartner 推出,它代表了组织积极处理数据的不同阶段。这是一个非常有用的工具,有助于组织了解他们当前的情况,并为未来的发展做好规划。
基于我们在各种行业帮助众多公司的经验,我们在 Math Marketing 展示了如下分析连续体:
连续分析(通过数学营销)
**描述性分析:**允许公司确定以前期间发生的事情。它有助于管理人员衡量绩效和关键指标,并经常转化为报告和仪表板。它关注过去的绩效,并在检测到偏差时触发反应。
不幸的是,现在有一种趋势,要么报告法规和合规性要求的最低限度(如季度财务报告和税务报告),要么生成大量报告,这些报告需要大量工作,很少及时相关,并且容易不作为。尽管如此,一个好的描述性分析是一个宝贵的基础。
**解释性分析:**通过关注为什么,解释性分析旨在理解描述性分析报告的结果背后的原因。它经常需要研究变量之间的相关性和回归。然而,它仍然只能提供一个向后的视野。它是关于理解关系以及为什么某些事情会发生而其他事情不会发生。好的解释模型可能会变成好的预测模型,但是开始的目标是不同的。
连续体的每个阶段都意味着技能和难度的显著增加。但是,从描述性分析到解释性分析的转变最为引人注目。法规、下架率和商业头脑可以产生可接受的报告,即使是无关紧要的报告。但是解释需要最低限度的统计知识。公司的墓地充满了仓促的结论和轶事般的关联。
**探索性分析:**使组织能够探索事件背后的原因和检测到的解释。它意味着拓宽对模式、趋势、异常值、意外结果的观察,并利用定量和可视化方法的混合来了解故事数据想要讲述的内容。 因果关系 比相关性更进了一步。它说一个变量的值的任何变化都会引起另一个变量的值的变化。了解原因是预测的敲门砖。
**预测分析:**是预测可能发生的事情,估计影响和预测未来。它允许组织创建和探索不同的场景并提前计划。它需要对环境有深入的了解,并对数据有很强的控制能力。虽然工具集在这里发挥了作用,但主要部分是关于高级统计学/计量经济学和商业知识。
**规定性分析:**给定已经收集的深层知识,它为组织提供了一条通向特定目标的道路。它基本上回答了“应该做些什么来实现结果 X”这个问题。在这个阶段,人类的干预可能是最少的,并且有可能将决策委托给机器来实现业务目标。(例如:对冲基金交易算法)
在一家金融服务公司的营销部门的上下文中,描述性分析提供了关于上个月特定活动参与情况的信息。解释性分析研究了参与度和营销支出之间的关系。探索性分析探索受众群以发现可能的趋势。预测分析总结未来的营销活动参与情况,并告知管理层实现预期参与目标的最佳营销活动。
你的数据有多深
分析深度(数学营销)
经常被忽视的一个方面是不同数据源所扮演的角色。即使没有提高分析的成熟度,也可以从扩展的数据源中产生价值。在某些情况下,具有大量数据源的描述性分析与基于内部信息的预测性分析一样有用。我们称之为分析深度,并认为属于以下类别之一:
**内部结构化数据:**公司在正常交易过程中收集的信息,如销售额和金额、客户联系信息或产品日志。它们是有意收集信息过程的结果。对于公司来说,这是最简单的,有时也是唯一的信息来源。
**外部结构化数据:**来自外部数据库的信息,可以公开获得,也可以来自数据提供商。它包括政府统计数据、客户报告或市场调查等。信息通常以表格形式或任何其他结构化形式提供,由组织来寻找与内部数据的相关性。它增加了公司可用的数据量。
**内部非结构化数据:**并非所有内部信息都可供消费。商业知识通常通过电子邮件、聊天室、论坛或维基等非正式工具传播。有些甚至可能在合同或产品手册等任何数字形式上都找不到。合并非结构化数据源是一项复杂工作。增加公司可用数据的种类
**外部非结构化数据:**包括来自社交媒体、社区博客和公司与客户或利益相关者互动的其他在线论坛的信息。考虑到如今创建的数据的共享量和速度,将其纳入决策流程是一项挑战。
分析深度有助于组织理解的是,通往分析成熟度的道路更多地依赖于流程评估、提出正确的问题以及使数据源多样化,而不是投资于新工具。
洞察力需要新的技能
组织在分析上花费如此多的时间和精力的核心原因不应该只是为了获得最新的报告。虽然知道刚刚发生了什么是重要和有用的,但它只能提供事情执行得如何的细节,并在粘贴中给出财务表现的概述。然而,它常常不能提供任何关于明天应该做什么的洞察力。
许多公司在描述性分析和工具上花费了太多的时间和金钱。不幸的是,让管理层感到沮丧的是,在充分发挥其潜力之前,这些工具需要的比他们预期的更多。技能仍然是企业面临的最大挑战。这些额外的能力通常需要具备额外的定量、内容和分析技能的新角色,可能是统计分析师或数据科学家。
大多数组织未能进行文化或业务模式调整来真正利用信息。提出如何使用信息或分析的想法是很棒的。但是,如果组织没有准备好实际行动,那么它可能真的会变成一个时间之水。许多见解,但实际上并没有将它们与业务联系起来
最终想法
组织每天在不同的层面做出数百个甚至数千个决策,这些决策具有不同程度的影响、复杂性、频率和用途。唯一不变的是变化,而分析代表了适应变化的一种方式。识别模式、预测结果并积极应对将是未来竞争的基础。
数学营销已经帮助各行各业的公司实施数据驱动流程。通过将统计能力、商业知识和高级工具相结合,我们帮助客户回答问题。一些最大的品牌与我们分享了他们的数据挑战,并相信我们的数据能够为日常运营和战略决策提供真知灼见。
如果您想了解我们的项目和方法,请通过电子邮件联系我们,或者直接通过 Linkedin 联系我们的任何团队经理。我们随时准备与您分享我们的见解,倾听您的经验。