在谷歌 Colab 上使用 Mask R-CNN 进行网络摄像头对象检测
如何使用 Mask R-CNN 在 Google Colaboratory 上通过实时摄像机流进行对象检测
在弱光下屏蔽 R-CNN 算法——认为它看到了一只猫_(ツ)_/
有很多方法可以进行物体检测。YOLO(你只看一次)是许多人选择的算法,因为它通过完全卷积神经网络(FCNN)的图像只有一次。这使得推断很快。在 GPU 上大约每秒 30 帧。
YOLO 预测的物体包围盒
另一种流行的方法是使用区域提议网络(RPN)。基于 RPN 的算法有两个部分。第一部分给出感兴趣区域(RoI)的建议…即图像中可能有物体的位置。第二个组件对这些建议的区域执行图像分类任务。这种方法比较慢。Mask R-CNN 是脸书人工智能公司的一个框架,它利用 RPN 进行目标检测。Mask R-CNN 可以在 GPU 上以每秒 5 帧的速度运行。我们将使用面具 R-CNN。
当有更快的替代方案时,为什么要使用慢的算法呢?很高兴你问了!
Mask R-CNN 除了对象检测和边界框预测之外,还输出对象遮罩。
由遮罩 R-CNN 预测的对象遮罩和边界框( Matterport
以下部分包含对代码和概念的解释,有助于理解对象检测,以及在 Colab 上使用 Mask R-CNN 处理摄像机输入。这不是一个循序渐进的教程,但希望它会一样有效。在本文的最后,你会找到 Colab 笔记本的链接,让你自己尝试一下。
Matterport 使用 Keras 和 Tensorflow 对 Mask R-CNN 进行了很好的实现。他们提供了笔记本来玩 Mask R-CNN ,用自己的数据集训练 Mask R-CNN,并检查模型和重量。
为什么选择 Google Colab
如果你没有 GPU 机器或者不想经历设置开发环境的繁琐任务,Colab 是最好的临时选择。
就我而言,我最近丢失了我最喜欢的笔记本电脑。所以,我用的是我的备份机——一台带键盘的 windows 平板电脑。Colab 使你能够在浏览器中的 Jupyter 笔记本上工作,连接到强大的 GPU 或谷歌云中的 TPU(张量处理单元)虚拟机。虚拟机预装了 Python、Tensorflow、Keras、PyTorch、Fastai 和许多其他重要的机器学习工具。全部免费。请注意,您的会话进度会因为几分钟的不活动而丢失。
Google Colab 入门
欢迎使用合作指南让您轻松入门。当从相机获取输入、在笔记本的不同单元之间通信以及在 Python 和 JavaScript 代码之间通信时,高级 Colab 指南就派上了用场。如果你没有时间看它们,只要记住以下几点。
Colab notebook 中的一个单元格通常包含 Python 代码。默认情况下,代码在连接的虚拟机的/content
目录中运行。Ubuntu 是 Colab VMs 的操作系统,您可以通过用!
开始命令行来执行系统命令。
以下命令将克隆存储库。
!git clone https://github.com/matterport/Mask_RCNN
如果你在同一个单元格中有多个系统命令,那么你必须将%%shell
作为单元格的第一行,后跟系统命令。因此,下面的命令集将克隆存储库,将目录更改为 Mask_RCNN 并设置项目。
%%shell
# clone Mask_RCNN repo and install packages
git clone https://github.com/matterport/Mask_RCNN
cd Mask_RCNN
python setup.py install
导入屏蔽 R-CNN
以下代码来自 Matterport 提供的演示笔记本。我们只需要将ROOT_DIR
改为./Mask_RCNN
,这是我们刚刚克隆的项目。
python 语句sys.path.append(ROOT_DIR)
确保后续代码在Mask_RCNN
目录的上下文中执行,在该目录中我们有 Mask R-CNN 实现可用。代码导入必要的库、类,并下载预先训练好的 Mask R-CNN 模型。穿过它。注释使理解代码变得更容易。
根据训练的权重创建模型
以下代码在推理模式下创建模型对象,因此我们可以运行预测。然后,它将我们之前下载的预训练模型中的权重加载到模型对象中。
运行对象检测
现在我们在一些图像上测试这个模型。Mask_RCNN 存储库有一个名为images
的目录,其中包含…你猜对了…一些图像。下面的代码从该目录中取出一幅图像,将它传递给模型,并在笔记本上显示结果以及边界框信息。
预测的结果
使用相机图像
在 Colab 的高级使用指南中,他们提供了代码,可以从笔记本中的网络摄像头捕捉图像,然后将其转发给 Python 代码。
Colab notebook 预装了名为google.colab
的 python 包,其中包含了方便的助手方法。有一个叫做output.eval_js
的方法可以帮助我们评估 JavaScript 代码并将输出返回给 Python。在 JavaScript 中,我们知道有一种叫做[getUserMedia()](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)
的方法,它使我们能够从用户的网络摄像头和麦克风中捕获音频和/或视频流。
看看下面的 JavaScript 代码。使用 JavaScript 的 WebRTC API 的getUserMedia()
方法,它捕获网络摄像头的视频流,并在 HTML 画布上绘制各个帧。像google.colab
Python 包一样,我们在 JavaScript 中也有google.colab
库。这个库将帮助我们使用 JavaScript 代码中的kernel.invokeFunction
函数调用 Python 方法。
从网络摄像头捕获的图像被转换为 Base64 格式。这个 Base64 图像被传递给一个 Python 回调方法,我们将在后面定义它。
我们已经讨论过,将%%shell
作为 Colab 笔记本单元的第一行使其作为终端命令运行。同样,您可以通过以%%javascript
开始单元格,在整个单元格中编写 JavaScript。但是我们将简单地把上面写的 JavaScript 代码放在 Python 代码中。像这样:
Python — JavaScript 通信
我们上面写的 JavaScript 代码调用了我们的 Python 代码的notebook.run_algo
方法。下面的代码定义了一个 Python 方法run_algo
,它接受一个 Base64 图像,将其转换为一个 numpy 数组,然后将其传递给我们上面创建的 Mask R-CNN 模型。然后显示输出图像和处理统计数据。
重要!别忘了在
*try / except*
块中圈出你回调方法的 Python 代码,并记录下来。因为它将被 JavaScript 调用,并且在调用 Python 回调时没有发生错误的迹象。
我们把run_algo
注册成notebook.run_algo
吧。现在 JavaScript 代码可以调用它了。我们还调用上面定义的take_photo()
Python 方法,来启动视频流和对象检测。
你自己试试
您现在已经准备好在 Google Colab 中尝试 Mask R-CNN on camera。笔记本会一步一步地引导你完成这个过程。
(可选)出于好奇
我们上面使用的过程在浏览器(JavaScript)中将相机流转换为图像,并将单个图像发送到我们的 Python 代码进行对象检测。这显然不是实时的。所以,我花了几个小时试图将 WebRTC 流从 JavaScript(对等体 A)上传到 Python 服务器(对等体 B),但没有成功。也许我对async / await
和 Python Threads
的组合不熟悉是主要的障碍。我试图使用[aiohttp](https://github.com/aio-libs/aiohttp)
作为 Python 服务器,它将使用[aiortc](https://github.com/aiortc/aiortc)
处理 WebRTC 连接。Python 库aiortc
使得创建 Python 作为 WebRTC 的对等体变得容易。这里是到 Colab 笔记本的链接,创建 WebRTC 服务器的工作尚未完成。
原载于 2020 年 1 月 29 日 https://emadehsan.com。
Python 中用于 NLP 的 HTML 数据清理
如何彻底清理由废弃的 HTML 网站组成的数据集
任何数据驱动项目最重要的一步是获得高质量的数据。如果没有这些预处理步骤,项目的结果很容易产生偏差或被完全误解。这里,我们将重点关注清理由抓取的网页组成的数据。
获取数据
有很多工具可以抓取网页。如果你正在寻找快速简单的方法,Python 中的 URL 处理模块 urllib 可能会帮你实现。否则,我推荐 scrapyd ,因为可能的定制和健壮性。
确保您抓取的页面包含适合您的用例的富文本数据是很重要的。
从 HTML 到文本
一旦我们获得了抓取的网页,我们就开始从每个网页中提取文本。网站上有很多标签并不包含 NLP 的有用信息,比如<script>
和<button>
。令人欣慰的是,有一个名为 boilerpy3 的 Python 模块使得文本提取变得容易。
我们使用ArticleExtractor
来提取文本。这个提取器已经针对新闻文章进行了调整,适用于大多数 HTMLs。您可以尝试 boilerpy3 文档中列出的其他提取器,看看哪种最适合您的数据集。
接下来,我们将所有换行符(\n
和\r
)压缩成一个\n
字符。这样做是为了当我们用\n
和句号将文本分成句子时,我们不会得到没有单词的句子。
如果 boilerpy3 中的提取器对您的网页不起作用,您可以使用 beautifulsoup 来构建您自己的自定义文本提取器。下面是一个替换parse_html
方法的例子。
大 N 克清洗
一旦文本被提取出来,我们希望继续清理过程。网页包含重复信息是很常见的,尤其是当你从同一个领域抓取多篇文章时。网站标题、公司标语和页脚等元素可以出现在解析后的文本中。为了检测和删除这些短语,我们通过查看大 n 元语法的频率来分析我们的语料库。
N-grams 是 NLP 中的一个概念,其中“gram”是来自文本主体的单词的连续序列,“N”是这些序列的大小。这经常被用来建立语言模型,它可以帮助从文本摘要到单词预测的任务。以下是三元模型(3 元模型)的示例:
input = 'It is quite sunny today.'
output = ['It is quite', is quite sunny', 'quite sunny today.']
当我们阅读文章时,有许多单个单词(unigrams)会重复出现,例如“the”和“a”。然而,当我们增加 n-gram 的大小时,n-gram 重复的概率会降低。三元组开始变得更加罕见,文章几乎不可能包含 20 个单词的相同序列。通过搜索频繁出现的大型 n 元语法,我们能够检测出语料库中跨网站的重复元素,并手动将其过滤掉。
我们通过用换行符和句号将文本块分割成句子来开始这个过程。接下来,我们对句子进行分词(将句子分解成单词串)。有了这些标记化的句子,我们能够生成特定大小的 n 元语法(我们希望从大的开始,大约 15 个)。我们希望使用nltk
提供的FreqDist
函数按频率对 n 元文法进行排序。一旦我们有了频率字典,我们就打印前 10 个 n-gram。如果频率高于 1 或 2,那么你可能会考虑从语料库中删除这个句子。要删除句子,复制整个句子并将其作为一个字符串添加到filter_strs
数组中。复制整个句子可以通过增加 n-gram 的大小来完成,直到整个句子被捕获在一个 n-gram 中并打印在控制台上,或者简单地打印parsed_texts
并搜索句子。如果有多个单词略有不同的不想要的句子,可以将共同的子串复制到filter_strs
,正则表达式会过滤掉所有包含该子串的句子。
如果您在数据集上运行上面的代码,而没有向filter_strs
添加任何过滤器,您可能会得到类似于下图的图形。在我的数据集中,你可以看到有几个 15 克重复了 6 次,3 次,2 次。
一旦我们经历了用不想要的句子填充filter_strs
的过程,我们的 15-grams 图就变平了。
请记住,对于 n-gram 的大小和频率,没有一个最佳的阈值来决定一个句子是否应该被删除,所以请随意使用这两个参数。有时,您需要将 n-gram 的大小降低到 3 或 4,以提取重复的标题,但注意不要删除有价值的数据。这段代码被设计成一个迭代的过程,在这个过程中,你在许多不同的实验之后慢慢地构建filter_strs
数组。
标点、大写和标记化
在我们清理了语料库之后,下一步是处理我们的语料库的单词。我们希望删除标点符号,将所有单词小写,并将每个句子分解成单个单词的数组(标记化)。为此,我喜欢使用来自 gensim 的simple_preprocess
库方法。这个函数一次完成所有这三个任务,并且有几个允许定制的参数。通过设置deacc=True
,重音将被移除。删除标点符号时,标点符号本身被视为空格,标点符号两边的两个子字符串被视为两个单独的单词。在大多数情况下,单词将被拆分成一个长度为 1 的子串。比如“不要”最后会变成“don”和“t”。因此,默认的min_len
值是 2,所以不保留带有 1 个字母的单词。如果这不适合您的用例,您还可以从头创建一个文本处理器。Python 的string
类包含一个punctuation
属性,列出了所有常用的标点符号。使用这组标点符号,您可以使用str.maketrans
删除字符串中的所有标点,但保留那些有标点的单词作为一个单词(“不”变成“不”)。请记住,这不会像 gensim 的simple_preprocess
一样捕捉标点符号。例如,有三种类型的破折号(’ em 破折号,-’ en 破折号,-'连字符),而simple_preprocess
将它们全部删除,string.punctuation
不包含 em 破折号,因此不会删除它。
停止言语
一旦我们很好地标记了语料库,我们将从语料库中删除所有停用词。停用词是对句子没有太多额外意义的词。英语词汇中的单词包括“the”、“a”和“in”。nltk
包含一个英文停用词列表,所以我们用它来过滤我们的令牌列表。
词汇化和词干化
词汇化是将同一单词的不同形式组合在一起,并用单词的词汇(词典形式)替换这些实例的过程。比如“functions”简化为“function”。词干化是将一个单词缩减为其词根(没有任何后缀或前缀)的过程。比如“跑”就简化为“跑”。这两个步骤减少了词汇量,使机器更容易理解我们的语料库。
现在您已经知道如何提取和预处理文本数据,您可以开始数据分析了。祝你的 NLP 冒险之旅好运!
笔记
- 如果您使用词性标签对语料库进行标记,那么停用词应该保留在数据集中,并且在标记之前不应该进行词汇化。
- Jupyter 笔记本的 GitHub 库可以在这里找到。
Websocket —检索实时数据
如何有效检索实时加密货币价格
诺亚·西利曼在 Unsplash 上的照片
为什么我们需要学习如何从 WebSocket 中提取数据?
不是已经可以抓取几乎所有类型的网站了吗?
首先我简单介绍一下 WebSocket,你就知道为什么我们需要学习如何刮了。
Websocket 协议用于提供持久的实时连接。这意味着大多数网站使用 WebSocket 从其服务器向网络发送实时数据,以便您能够查看不断变化的实时数据。
你可能会问,一般什么样的网站会用 WebSocket?
我知道有一些特定类型的网站使用 WebSocket。例如,现场赌博、加密货币和股票市场网站。
现在,让我们全面了解 WebSocket 是如何工作的。为了让它更实用,我将使用 Python 来抓取 Cryptocompare (一家全球加密货币市场数据提供商)作为示例。
首先,您需要找到 WebSocket URI。
在这里,我使用 Chrome 开发工具来检查。打开 Chrome DevTools 后,点击 WS (Web Socket)标签,然后你就可以找到上面紫色方框所包围的请求 URL。
request _ URL:WSS://streamer . crypto compare . com/v2
此外,需要注意的一点是成功状态代码不同于普通的请求。通常,当你请求一个网站时,成功状态码是 200,但是 WebSocket 的成功状态码是 101,在上面的截图中被红框包围。
在开始握手部分之前,让我们讨论一些通过 WebSocket 连接时简单而重要的概念。让我们看看下面的图表。
单击“消息”选项卡,您将看到与我相同的视图。你会注意到有绿色和红色的箭头。绿色箭头表示您正在向网站发送此消息。另一方面,红色箭头是通过 WebSocket 连接时您将收到的消息。
让我们进入下一部分——握手。还记得上图有个绿色箭头吗?这实际上是一个握手的过程。
这是什么意思?
你可以把这个过程想象成一个验证过程。在您设法将此消息发送到网站后,您将能够检索实时数据。整个过程到此结束,让我们进入代码部分。
您可以使用几个包,但是在这种情况下,我将使用 websocket-client Python 包。
编码部分
首先,您需要将 web 浏览器的标题复制到这里,并使用json.dumps
将其转换为字符串格式。
之后,使用create_connection
创建到服务器的连接。然后,通过发送消息来执行握手,您将能够看到您这边的数据。
下面是您应该看到的类似输出。
你可能会想,这条信息似乎毫无意义而且混乱,你确定价格在这里的信息里吗?
答案是肯定的。你可以看看上面截图中紫色方框所围的文字,那其实是 BTC 对美元的现价。
抓取这个网站后,你会发现通过 WebSocket 检索信息是多么容易。如果你有兴趣知道为什么你应该勉强通过 WebSocket,请随意访问这个链接。
最终想法
胡安·门德斯摄于 Pexels
写这篇文章是为了回答我在文章评论区收到的一个问题。如果你有任何想让我澄清的问题,欢迎在下面评论。
谢谢你一直读到最后。下期帖子再见!
关于作者
低伟鸿是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。
他提供爬行服务,可以为你提供你需要的准确和干净的数据。你可以访问这个网站查看他的作品集,也可以联系他获取抓取服务。
在媒体上阅读低纬鸿的作品。数据科学家|网络抓取服务:https://www.thedataknight.com/.每…
medium.com](https://medium.com/@lowweihong)
弱监督学习:具有有限标注能力的分类
随着大量基于海量数据训练的预训练模型的引入,机器学习在工业应用中的成功呈指数级增长。虽然我们可以通过迁移学习(作为特征提取器或通过对我们的特定数据集进行微调)来轻松利用这些模型,但通常情况下,如果模式与这些模型最初训练的数据明显不同,性能不会很好。
特别是在自然语言处理的情况下,有许多特定于数据的模式,这通常会降低预训练模型的适用性。与此同时,获取特定于应用程序的注释所涉及的挑战不仅降低了数据的可用性,还降低了建模的监督(转移)学习的可用性。
由于未标注的文本数据通常大量存在,无监督/弱监督方法成为数据探索甚至建模的第一手选择。因为建立一个具有领域专业知识的注释者团队不仅昂贵而且耗时,所以最近,从业者已经转向了较弱形式的监督,这也是这篇博客的主要焦点。
图片(按作者):结构化非结构化信息的各种方法
什么是监管不力?
正如在维基百科中提到的,弱监督是机器学习的一个分支,其中嘈杂、有限或不精确的来源被用来提供监督信号,以便在监督学习设置中标记大量训练数据。这种方法减轻了获取手工标记的数据集的负担,这可能是昂贵的或不切实际的。取而代之的是,使用廉价的弱标签,因为它们是不完美的,但是仍然可以用来创建强预测模型。
弱监督学习在亚马逊商品评论上的应用
对于大规模数据集,例如亚马逊情感评论,目标是识别关于用户在图书的负面评论 中提及的内容的广泛类别,并进一步构建可用于向卖家提供分类反馈的预测模型。
表:亚马逊评论数据示例(总共 360 万行)
通过集群上的批量注释建立训练数据集
- 启发式提取评分较低的评论
import pandas as pd# Load dataset
df = pd.read_csv("amazon_product_reviews.csv")# Negative Reviews (With rating 1-2)
df = df[df['Rating'] == '1-2']# Sample set of negative Review that mentions book
df = df[df['Amazon Review'].str.contains(
'book|publication|novel|paperback|hardcover')].sample(50000)
2。文本数据的标准预处理
import re
import nltk
import itertools
import contractions # Load dataset
df = pd.read_csv("amazon_product_reviews.csv")column = 'Amazon Review'# Lowercase text
df[column] = df[column].apply(
lambda x: x.lower())# Fix contraction in the words
df[column] = df[column].apply(
lambda x: contractions.fix(str(x)))# Standardise words
df[column] = df[column].apply(
lambda x: ''.join(''.join(c)[:2] for _, c in itertools.groupby(x)))# Remove punctuations
punctuations_regex="!#%&\'()\*+,-/:;<=>?@\[\]^_`{|}~.1234567890"
df[column] = df[column].apply(
lambda x: re.sub('[%s]'%re.escape(punctuations_regex), ' ', x))# Tokenize words
df[column] = df[column].apply(
lambda x: ' '.join(nltk.word_tokenize(x)))
3。特征提取和聚类
- 可以进一步试验 ngram_range 和 min_df,以优化对重要短语的更多覆盖和对不重要短语的更少覆盖。
- n_clusters 基于 Elbow 方法+后续步骤中注释集群的专家的可用性进行了优化。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans# Extract TFIDF features with 1-4 grams
TFIDF_PARAMS = {
'strip_accents': 'ascii',
'stop_words': 'english',
'sublinear_tf': True,
'ngram_range': (1, 4),
'min_df': 0.003,
}
vectorizer = TfidfVectorizer(**TFIDF_PARAMS)
tfidf_model = vectorizer.fit(df[column])
train_features = tfidf_model.transform(df[column])# Identify clusters on the model
cluster_model = KMeans(n_clusters=200).fit(train_features)
df['cluster_label'] = cluster_model.labels_
4。分析和注释集群
- 所有的聚类由领域专家标记,并且聚类标签被分配给所有的聚类样本。这极大地减少了标注时间和成本,因为只有 n 个聚类被标记为 ,而不是所有 360 万个样本。
图:分析基于 TFIDF 分数的聚类,并为其添加标签。
- 最后,对提取的数据集上的“最终类别”的采样结果表明,它的 85 ( 5 ) %准确。
训练预测模型以分配最终类别进行审查
最后,通过对整个非结构化数据运行聚类模型来管理大型训练数据集,并基于聚类标识符来分配标签。最终的预测模型以受监督的方式在该数据集上训练,这不仅处理数据集中的错误,而且以更高的置信度(基于置信度阈值)提供高质量的预测。
# Training XGBoost (Weak supervision)
from xgboost import XGBClassifier
from sklearn.metrics import classification_reportclf = XGBClassifier(n_jobs= -1, objective='multi:softmax')
clf = clf.fit(X_train, y_train)
scores = clf.predict_proba(X_test)y_true = pd.DataFrame(scores,columns=clf.classes_).idxmax(axis=1)
print (classification_report(y_test, y_true, digits=4))
图:对 XGBoost 模型的评估,该模型根据聚类定义的类别进行训练
该模型在弱监管下表现异常出色,但根据类别和属于该类别的簇的纯度,准确性可能会在现场设置中下降 5–15%。
这种方法无疑帮助我们快速解决问题,而无需花费大量的时间和金钱来构建大量的训练数据。此外,它可以是基于启发法、分层聚类和建模的学习算法的迭代过程,直到我们获得高质量的基础事实标签。
通过对更高质量的数据集进行重新训练,预测模型的性能会随着时间的推移而提高,该数据集是由领域专家对模型预测进行重复采样而收集的。
参考文献:
- https://medium . com/@ datasciencemilan/weak-supervised-learning-introduction-and-best-practices-c 65 f 490d 4a 0 a
- https://academic . oup . com/nsr/article-pdf/5/1/44/31567770/nwx 106 . pdf
- https://en.wikipedia.org/wiki/Weak_supervision
- https://pdfs . semantic scholar . org/3 ADC/FD 254 b 271 BC C2 FB 7 e 2 a 62d 750 db 17 e 6 C2 c 08 . pdf
- https://EGC 2020 . science conf . org/data/pages/e _ EGC _ 2020 _ vle maire . pdf
- 【http://ai.stanford.edu/blog/weak-supervision/
权重衰减== L2 正则化?
神经网络是很好的函数逼近器和特征提取器,但有时它们的权重变得过于专业,导致过度拟合。这就是正则化概念出现的地方,我们将讨论这两种被误认为相同的主要权重正则化技术之间的细微差别。
(来源)
简介:
神经网络由沃伦麦卡洛克和沃尔特皮茨于 1943 年首次推出,但当时还不够流行,因为它们需要大量的数据和计算能力,这在当时是不可行的。但是,随着上述约束以及其他训练进步(如参数初始化和更好的激活功能)变得可行,它们再次开始主导各种比赛,并在各种人类辅助技术中找到应用。
今天,神经网络形成了许多著名应用的主干,如自动驾驶汽车、谷歌翻译、面部识别系统等,并应用于进化人类使用的几乎所有技术中。
神经网络非常擅长逼近线性或非线性函数,在从输入数据中提取特征时也非常出色。这种能力使他们能够在大范围的任务中创造奇迹,无论是计算机视觉领域还是语言建模。但是我们都听过这句名言:
“权力越大,责任越大”。 这句话同样适用于无所不能的神经网络。他们作为强大的函数逼近器的能力有时会导致他们通过逼近一个函数来过度拟合数据集,该函数在它被训练的数据上表现得非常好,但在它从未见过的数据上测试时却悲惨地失败了。更专业地说,神经网络学习更专门针对给定数据的权重,而不学习可以概括的特征。
为了解决过度拟合的问题,应用了一种称为正则化的技术来降低模型和约束权重的复杂性,其方式是迫使神经网络学习可概括的特征。
正规化:
正则化可以被定义为我们对训练算法进行的任何改变,以便减少泛化误差,而不是训练误差。正则化策略有很多。一些对模型施加额外的约束,例如对参数值添加约束,而一些对目标函数添加额外的项,这可以被认为是对参数值添加间接或软约束。如果我们小心使用这些技术,这可以提高测试集的性能。在深度学习的背景下,大多数正则化技术都基于正则化估计器。当正则化一个估计量时,有一个权衡,我们必须选择一个增加偏差和减少方差的模型。一个有效的规则化是一个有利可图的交易,显著减少方差,同时不过度增加偏差。
实践中使用的主要正则化技术有:
- L2 正则化
- L1 正则化
- 数据扩充
- 拒绝传统社会的人
- 提前停止
在这篇文章中,我们主要关注 L2 正则化,并讨论我们是否可以将 L2 正则化和权重衰减视为一枚硬币的两面。
L2 正规化:
L2 正则化属于被称为参数范数罚的正则化技术类别。之所以这样说,是因为在这类技术中,特定参数(主要是权重)的范数被添加到被优化的目标函数中。在 L2 规范中,通常称为正则化项的额外项被添加到网络的成本函数中。
例如:
让我们考虑交叉熵成本函数,其定义如下。
**图一。**交叉熵损失函数
为了将 L2 正则化应用于任何有交叉熵损失的网络,我们将正则化项添加到成本函数中,正则化项如图 2所示。
图二。 L2 范数或欧几里德范数
在图 2 中,λ是正则化参数,与应用的正则化量成正比。如果λ =0,则不应用正则化,当λ为 1 时,将最大正则化应用于网络。
λ是一个超参数,这意味着它不是在训练期间学习的,而是由用户手动调整或使用一些超参数调整技术,如随机搜索。
现在让我们把这些放在一起,形成应用于图 3 给出的交叉熵损失函数的 L2 正则化的最终方程。
**图 3。**最终 L2 正则化成本函数
上面的例子示出了应用于交叉熵损失函数的 L2 正则化,但是这个概念可以推广到所有可用的成本函数。下面在图 4 中给出了 L2 正则化的更一般的公式,其中 Co 是未正则化的成本函数,C 是添加了正则化项的正则化成本函数。
**图四。**任意代价函数的 L2 正则化的一般形式
注意 : 我们在正则化网络时不考虑网络的偏差,原因如下:
1 .与权重相比,偏差通常需要较少数据来精确拟合。每个权重规定了两个变量(w 和 x)如何相互作用,因此很好地拟合权重需要在各种条件下观察两个变量,而每个偏差仅控制一个变量(b)。因此,我们不引入太多的偏差,让偏差不规范。
2。调整偏差会引入大量的不匹配。
为什么 L2 正规化有效??
实际原因:
让我们试着理解基于成本函数梯度的 L2 正则化的工作原理。
如果我们采用图 4 中所示方程的偏导数或梯度,即网络中所有权重和偏差的∂C/∂w 和∂C/∂b。
取偏导数我们得到:
**图 5。**成本函数关于权重和偏差的梯度。
我们可以使用反向传播算法计算上述方程中提到的∂C0/∂w 和∂C0/∂b 项。
偏差参数的偏导数将保持不变,因为没有正则化项应用于它,而权重参数将包含额外的((λ/n)*w)正则化项。
偏差和权重的学习规则因此变成:
**图 6。**偏差参数的梯度下降学习规则
**图七。**权重参数的梯度下降学习规则
上面的权重公式类似于通常的梯度下降学习规则,除了现在我们首先通过**(1(η*λ)/n)重新调整权重 w 。这一项是 L2 正则化经常被称为权重衰减**的原因,因为它使权重变小。因此,你可以看到为什么正则化工作,它使网络的权重更小。权重的小意味着,如果我们在这里或那里改变一些随机输入,网络行为不会改变太多,这反过来使得正则化网络难以学习数据中的局部噪声。这迫使网络只学习那些在训练集中经常看到的特征。
个人直觉: 从优化成本函数的角度来简单考虑 L2 正则化,当我们将正则项添加到成本函数中时,我们实际上增加了成本函数的值。因此,如果权重较大,也会导致成本上升,训练算法会通过惩罚权重来降低权重,迫使权重取较小的值,从而调整网络。
L2 正则化和权重衰减是一回事吗?
没有 L2 正则化和权重衰减是不同的东西,但可以通过基于学习速率的权重衰减因子的重新参数化来使 SGD 等效。迷茫?我来给你详细解释一下。
重量衰减方程如下所示,λ为衰减系数。
图 8 :神经网络中的权重衰减
在 SGD 的情况下,L2 正则化可以在以下证明中被证明为等价于权重衰减:
- 让我们首先考虑下面图 9 中给出的 L2 正则化方程。我们的目标是对其进行重新参数化,使其等效于图 8中给出的重量衰减方程。
**图九。**神经网络中的 L2 正则化
2.首先,我们找到 L2 正则化成本函数相对于参数 w 的偏导数(梯度),如图图 10 所示。
图十。损失函数 C 关于 w 的偏导数
**注:**图中两个符号的意思相同。
3.在我们获得成本函数的偏导数的结果后(图 10 ),我们将该结果代入图 11 所示的梯度下降学习规则中。代入后,我们打开括号并重新排列术语,使其在某些假设下等同于重量衰减方程(图 8 )。
图 11 。替换梯度下降规则中成本函数的梯度并重新排列术语。
4.正如你所注意到的,最终重新排列的 L2 正则化方程(图 11 )和权重衰减方程(图 8 )之间的唯一区别是α(学习速率)乘以λ(正则化项)。为了得到两个方程,我们通过用λ′/α代替λ
来重新参数化 L2 正则化方程,如图图 12 所示。
**图 12。**L2 正则化与权重衰减等价的条件
5.在用λ代替λ′后,L2 正则化方程被重新参数化,现在等价于重量衰减方程(图 8 ),如图图 13 所示。
**图十三。**重新参数化的 L2 正则化方程
从上面的证明中,你一定已经理解了为什么在 SGD 的情况下,L2 正则化被认为等同于权重衰减,但是对于其他优化算法,如 Adam、AdaGrad 等,情况并非如此,它们是基于自适应梯度的。特别地,当与自适应梯度结合时,L2 正则化导致具有大历史参数和/或梯度幅度的权重被正则化得比使用权重衰减时更少。与 SGD 相比,当使用 L2 正则化时,这导致 adam 表现不佳。另一方面,体重下降在 SGD 和 Adam 上的表现是一样的。
令人震惊的结果是,具有动量的 SGD 优于 Adam 等自适应梯度方法,因为常见的深度学习库实现了 L2 正则化,而不是原始的权重衰减。因此,在使用 L2 正则化对 SGD 有利的任务上,Adam 导致比带动量的 SGD 差的结果。
结论
因此,我们得出结论,尽管权重衰减和 L2 正则化在某些条件下可能达到等价,但仍然是稍微不同的概念,并且应该被不同地对待,否则会导致无法解释的性能下降或其他实际问题。
我希望你喜欢这篇文章,并学到一些新的东西。如果您有任何疑问或想进一步讨论,请随时通过 Twitter 或 Linkedin 与我联系。
进一步阅读 g:
参考资料:
- 神经网络和深度学习。
- 伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔的《深度学习》。
神经网络的权重初始化——重要吗?
不同权重初始化技术的比较研究
作者对不同统一初始化|图像的验证准确性和损失比较
机器学习和深度学习技术已经侵入了你能想到的每一个可能的领域。随着数字化数据可用性的增加和现代计算机计算能力的提高,它可能在不久的将来蓬勃发展。作为其中的一部分,每天都有越来越多的人钻研构建和训练模型的任务。作为该领域的新手,我还必须建立和训练一些神经网络模型。嗯,大多数时候,我的主要目标仍然是建立一个高度精确且通用的模型。为了实现这一点,我通常会绞尽脑汁为我的模型找到合适的超参数,我可以应用哪些不同的正则化技术,或者思考这样一个问题,我是否需要进一步深化我的模型等等。但是我经常忘记使用权重初始化技术。我相信很多像我一样的人也是如此。
等等,重量初始化?这有关系吗?我写这篇文章来寻找这些问题的答案。当我上网寻找这个问题的答案时,关于它的信息铺天盖地。有些文章讨论了这些文章背后的数学原理,有些文章从理论上比较了这种技术,有些文章则更倾向于决定统一初始化更好还是普通初始化更好。在这种情况下,我采用了基于结果的方法。我试图通过一个小实验来找出权重初始化技术的影响。我将这些技术中的一些应用到一个模型中,并试图将训练过程本身可视化,暂时将实现高准确性的目标放在一边。
设置:
模特|作者图片
我创建了一个简单的 CNN 模型,结合了 Conv-2D,最大池,辍学,批量-规范,密集层与 Relu 激活(除了最后一层,这是 Softmax)。我已经为 Cifar-10 数据集的分类任务训练了它。我已经用六种不同的内核初始化方法初始化了模型,并分析了训练阶段。我使用 SGD 优化器,用 30 个时期和 512 个批处理大小来训练模型。本实验中使用的六种初始化方法分别是:
- 格洛特制服
- 格洛特正常
- 何制服
- 他正常吗
- 随机制服
- 随机正态
用于模型构建和训练的代码片段|按作者排序的图像
注意:Keras 层默认的内核初始化方法是 Glorot Uniform。
实验结果:
让我们首先来看看三种不同方法的统一和正常初始化是如何表现的。
不同初始化方法的验证准确性|图片由作者提供
对于前两种方法,使用正常初始化技术的模型的验证准确性曲线几乎遵循统一技术,如果不是始终如此的话。对于 Glorot 方法(第一个情节)后,它采取了缓慢的开始,然后它开始上升。在第十个时期之后,正常和均匀的曲线都显示出非常跳动的行为。但是在过去的几个时期,正常曲线呈下降趋势,而统一曲线的总体趋势是上升的。
对于随机方法(最后一个图),两条曲线的趋势完全不匹配。随机正态的总体验证准确性趋势仍然非常低,低于 40%(除了两个向上的尖峰)。而均匀方法显示出更好的结果。尽管均匀技术的曲线本质上是非常不稳定和跳动的。在第 23 个时期之后,两条曲线都显示了验证准确性的下降。随着 Glorot 方法的趋势,我们在这里也看到一个非常缓慢的启动到第 5 纪元,显示验证精度低至约 10%。对于 Glorot 和随机方法,验证精度曲线没有显示出合适的收敛模式,并且在整个训练过程中保持不稳定。
在这方面,he 方法(中间图)比其他两种方法表现得更好。统一技术和正常技术的曲线是相似的,并且彼此跟随,直到 30 个时期的训练结束。它们都显示出整体上升的趋势,曲线相对来说不那么跳跃。与 Glorot 和 Random 不同,当使用 He 方法时,验证准确性从第一个时期开始上升,而没有表现出缓慢的开始。
现在让我们深入分析这些方法在几个方面的性能。
比较统一技术之间的验证准确性和损失|图片由作者提供
常规技术验证准确性和损失的比较|图片由作者提供
- 准确度:就准确度而言,使用 Glorot 方法(蓝色曲线)可获得最高的验证准确度。尽管如曲线所示,它未能保持位置,而是表现出非常不稳定的行为。方法(橙色曲线)比其余两种方法更稳定可靠,验证精度与 Glorot 相当。在这些技术中,随机技术,包括统一的和正常的,在整个训练中产生最低的验证准确性。下表将为您提供这些方法行为的总体总结。
准确度对照表|作者图片
- 趋同:现在的人都在训练非常深度的模型。GPT-3 有 1750 亿个参数要训练,因此更快和更明显的收敛总是一个可取的方面。正如我已经提到的 Glorot 和 Random 方法的曲线非常不稳定和跳动,所以很难推断是否达到了收敛。如果我们分析整体趋势,随机初始化方法表现很差,我们可以说随机正态的训练收敛在 40%左右,而随机均匀的训练在 50%以下。随机曲线至少需要 15-16 个时期才能达到验证准确度的水平。对于 Glorot 均匀和正常初始化,验证精度收敛在 50–60%之间(一些随机峰值超过 60%)。并且在 15 个时代之后,融合趋势开始正式化。增加后的 he 曲线在大约 12 个时期不断越过 50%标记(He 正常曲线更快)。此后,均匀曲线和正常曲线都继续向上,并在 60%左右结束。此外,如果我们查看 he 损耗曲线,Glorot 均匀和随机均匀方法的起始损耗低于 He 均匀方法。这可能是因为 he 初始化方法将权重初始化得偏高。
- **训练的稳定性和随机性:**验证精度对比曲线非常清楚地表明,Glorot 和 Random 方法非常不稳定,因此阻碍了设计者的决策能力,使训练过程提前停止。这是一个非常重要的技巧,可以减少过度拟合,建立一个通用的模型。另一方面,当用均匀或随机方法初始化模型时,验证精度曲线显示出非常稳定和一致的行为。这也给了设计者关于模型的训练过程的信心。设计师可以随心所欲地停在任何想要的位置。为了证明我们的发现是正确的,我们用每种初始化方法对模型进行了五次训练。
作者对统一初始化(多次运行)|图像的验证准确性比较
Glorot Uniform(多轮)|图像的验证准确性比较(由作者提供)
作者对随机均匀(多次运行)|图像的验证准确性比较
这些图清楚地显示了当用 Glorot 和 Random 方法初始化时,训练过程会有多不稳定。随机均匀方法未能显示直到第 5 个时期的任何增量,并且对于 Glorot 均匀直到第 3 个时期的情况是相同的。
- 一般化:除了准确性,我们作为设计师希望训练一个既一般化又精确的模型,这样他们就能在看不见的数据上表现良好。因此,我们希望我们的模型显示出训练和测试之间的最小差距。
培训与验证(Glorot 制服)|作者图片
培训与验证(随机统一)|作者图片
培训与验证(He 制服)|作者图片
因为以上这些图表明,当用统一方法初始化模型时,训练和测试之间的差距最窄。验证损失和训练损失曲线几乎相互叠加。当用随机均匀技术初始化模型时,差距最大,以高度过度拟合的模型结束
- 环境:是你没看错。标题是环境。发表在《麻省理工技术评论》上的一篇文章说,“训练一个人工智能模型在其一生中可以排放五辆汽车一样多的碳”。
[## 训练一个人工智能模型在它们的一生中可以排放相当于五辆汽车的碳
人工智能行业经常被比作石油行业:一旦被开采和提炼,数据就像石油一样,可以…
www.technologyreview.com](https://www.technologyreview.com/2019/06/06/239031/training-a-single-ai-model-can-emit-as-much-carbon-as-five-cars-in-their-lifetimes/)
由于人工智能正在塑造人类的未来,另一方面,在训练我们的模型时,我们必须减少通过利用计算机的计算能力来保持世界宜居而产生的碳足迹。由于模型训练是一个循环过程,我们必须寻找快速收敛的技术。查看训练曲线,我们可以看到用这些方法初始化的模型收敛得很快,平滑的训练曲线可以使设计者提前停止。
结论:
当深度学习社区对哪种初始化方法最有效,我们应该使用统一还是正常的方法产生分歧时,这个实验给了我信心,在给定模型的任务设置下,初始化方法在几个方面表现更好。
1)非常稳定和平稳的训练进度
2)快速收敛到期望的验证精度
3)从非常快的历元开始验证精度的不断增加
4)多次运行相似,训练过程中随机性较小
5)与其他相比,明显的收敛和非常小的泛化差距(训练与测试)。
深度神经网络中的权重初始化
了解神经网络中不同的权重初始化方法
作者图片
权重和偏差是神经网络的可调参数,在训练阶段,使用梯度下降算法来改变它们,以最小化网络的成本函数。然而,在可以开始训练网络之前,它们必须被初始化,并且这个初始化步骤对网络训练有重要影响。在本文中,我将首先解释权重初始化的重要性,然后讨论可用于此目的的不同方法。
符号
目前 Medium 只支持数字的上标,不支持下标。所以要写变量的名字,我使用这个符号:^后面的每个字符都是上标字符,而 _(和^之前,如果有的话)后面的每个字符都是下标字符。例如
在这个符号中被写成 w_ij^[l。
前馈神经网络
在我们讨论权重初始化方法之前,我们简要回顾一下控制前馈神经网络的方程。关于这些方程的详细讨论,可以参考参考文献[1]。假设您有一个前馈神经网络,如图 1 所示。这里
是网络的输入向量。每个 x_i 都是一个输入特征。网络有 L 层,层 l 中的神经元数量为n[l】*。输入层被认为是零层。所以输入特征的数量是*n[0】。层 l 中神经元 i 的输出或激活为a_i^[l】。
图 1(作者图片)
层 l 中神经元 i 的权重可以由向量表示
其中*w_ij^[l】*代表输入 j (来自 l-1 层神经元 j )进入 l 层神经元 i 的权重(图 2)。
图 2(作者图片)
在层 l 中,每个神经元接收前一层中所有神经元的输出乘以其权重, w_i1 , w_i2 ,。。。, w_in 。加权输入被加在一起,一个被称为偏差(b_i^[l】)的常数值被加到它们上,以产生神经元的净输入
层 l 中神经元的净输入可以由向量表示
类似地,层 l 中神经元的激活可以由激活向量表示
所以情商。3 可以写成
其中求和已经被权重和激活向量的内积所代替。然后,净输入通过激活函数 g 产生神经元 i 的输出或激活
我们通常假设输入层是零层
所以对于第一层,Eq。7 写为
我们可以将一个层的所有权重组合成该层的权重矩阵
所以w*【^[l】*是一个 n1 × n^[l-1 矩阵,这个矩阵的( i,j )元素给出了从层 l-1 中的神经元 j 到层 l 中的神经元 i 的连接的权重。我们还可以为每一层设置一个偏置向量
现在我们可以写 Eq 了。6 以矢量化的形式
并利用 Eq。7 我们得到
我们通常用 yhat 来表示输出层的激活
以及向量 y 来表示输入向量的实际标签(等式)。1).对于二元分类 y 只有一个元素,可以认为是标量。但是对于多类和多标签分类,它是一个一热或多热编码向量(参考[1]了解更多细节)。在反向传播过程中,我们首先计算最后一层神经元 i 的误差。误差定义为损失函数相对于净输入的偏导数
误差是该神经元改变整个网络的损失函数的效果的量度。然后我们用这个误差项来计算前一层神经元的误差
这样,我们使用前一层的误差项来计算每一层的误差项,直到我们到达第一层。我们可以使用每层的误差项来计算该层中损失函数相对于权重和偏差的梯度
并且使用它们,我们可以为梯度下降的下一步更新权重和梯度的值
其中 J 是网络的成本函数。权重和偏差被更新,直到它们收敛到最小化成本函数的最优值。
随机权重初始化的重要性
我们可以用于权重初始化的最简单的方法是为所有权重分配一个常数。例如,我们可以将所有权重初始化为零。然而,事实证明这是一个坏主意。让我更详细地解释一下。假设我们有一个神经网络(称为网络 A ),有 L 层,每层有*n[l】*个神经元。现在,对于网络的每一层,我们用恒定值*ω[l】初始化权重矩阵,用恒定值β^[l】*初始化偏置向量。所以在层 l 中我们有
对于 i 和 j 的所有值。请注意,两个不同的层可以有不同的值ω[l】*和*β[l】。如果我们用等式初始化权重和偏差。21,则可以证明在梯度下降的每一步中,每一层中的权重和偏差都是相同的(证明在附录中给出)。所以我们可以假设,在一个数据集上训练网络 A 之后,它的权重和偏差收敛到*ω_f^[l】*和 *β_f2.*所以在每一层中,的权重和的偏差对所有的神经元都是一样的。
现在假设我们有第二个网络(称为网络 B ,层数相同,它每层只有一个神经元。为了能够比较网络 A 和 B ,我们使用上标 < B > 来表示属于网络 B 的数量。两个网络如图 3 所示。
图 3(作者图片)
在每一层,两个网络具有相同的激活函数,并且它们也具有相同的输入特征,所以
我们用*β^[l】*初始化所有的偏置值(来自等式。21).对于第一层,我们初始化权重矩阵(等式)。10)具有相同值的网络 A
由于我们只有一个神经元和n[0】<b>*输入特征,权重矩阵确实是一个行向量。这个矩阵的每个元素都是常量值*ω_f[1】。对于接下来的层,我们将权重矩阵定义为
其中n^[l】是网络 A 中 l 层神经元的数量。由于我们只有一个神经元,每层只有一个输入 l≥1 ,权重矩阵只有一个元素,这个元素就是ω_f[l】n[l】。因此,对于网络 B 中的每一层 l≥1 ,我们用网络 A 的权重乘以网络 A 的同一层中的神经元数量来初始化权重矩阵。现在我们可以很容易地证明(证明在附录中给出)网络 B 等价于网络 A ,这意味着对于相同的输入向量,它们在梯度下降期间和收敛后产生相同的输出。
因此,通过使用这种对称权重初始化,网络 A 表现得像具有有限学习能力的网络 B 一样,然而,计算成本保持不变。用相同的值初始化网络的所有权重和偏差是导致相同问题的这种方法的特例。最坏的情况是我们用零初始化所有的权重。在这种情况下,根据等式。16,除了最后一层,所有层的误差项将为零,因此损失函数的梯度也将为零(等式)。第 19 和 20 段)。因此,这些层中的权重和偏差不会更新,网络根本无法训练。
神经网络可以被认为是具有两个元素的矩阵。它有一个深度即层数,一个宽度即每层的神经元数(为了简单起见,假设所有层的神经元数相同)。在所有层中使用线性激活函数缩小了网络的深度,因此它的行为类似于只有一层的网络(证明在[1]中给出)。使用对称权重和偏差初始化将缩小网络的宽度,因此它的行为就像一个每层只有一个神经元的网络(图 4)。
图 4(作者图片)
因此,为了打破对称性,权重或偏差都不应该以这种方式初始化。在实践中,我们对权重使用随机初始化,并用零或一个小数字初始化所有偏差。为此目的选择权重,因为它们适当的随机初始化不仅破坏了对称性,而且有助于解决下一节讨论的消失和爆炸梯度问题。
消失和爆炸渐变
使用反向传播方程(方程。15 和 16),我们可以计算网络中任何一层的误差项。假设我们想为层 l 计算它。我们首先计算输出层的误差项,然后向后移动并计算先前层的误差项,直到我们到达层 l 。可以看出,层 l 的误差项为
这个方程的推导可以参考[1]。基于这个等式,误差向量的每个元素(该层中一个神经元的误差)与下一层中神经元的权重的链式乘积成比例。现在,如果权重是小数字,这些权重的链式乘法可以产生极小的误差项,特别是如果您有一个有这么多层的深度网络。因此,误差向量的一些或所有元素将会非常小。
根据方程式。如图 17 和 18 所示,损失函数和成本函数的梯度与误差项成比例,因此它们也将变成非常小的数,这导致梯度下降中的权重和偏差更新的步长非常小(等式 1 和 2)。第 19 和 20 段)。最终结果是梯度下降法和网络的学习过程变慢。这被称为消失梯度问题。
也有可能权重是非常大的数字。然后,这些的链式相乘就变成了一个非常大的数,梯度下降中的梯度和步长可以爆炸。结果是不稳定的网络,并且梯度下降步骤不能收敛到权重和偏差的最佳值,因为步骤现在太大并且错过了最佳点。这被称为爆炸梯度问题。我们可以使用权重初始化技术来解决这些问题。
均值和方差规则
在讨论初始化方法之前,我们需要回顾一下均值和方差的一些性质。我们用*E【X】*表示随机变量 X 的均值,用 Var(X) 表示其方差。如果 X_1,X_2,.。。,X_n 为有限均值的独立随机变量,若 a_1 , a_2 ,。。。、 a_n 和 b 为任意常数,则
另外,如果 X 和 Y 是两个独立的随机变量,那么我们有
方差也可以用平均值来表示。如果我们有一个随机变量 X,那么
随机初始化方法
将在下一节中介绍的初始化方法是基于随机权重初始化来打破对称性的。然而,由于权重不再对称,我们可以安全地用相同的值初始化所有的偏差值。所以在所有这些方法中,偏置值初始化为零。初始化方法基于一些假设,这些假设将在下一节讨论。
假设
1-我们假设每一层的权重是独立且同分布的(IID)。它们被初始化为均匀或正态分布,平均值为 0,方差为var(w^[l】)
每层中的权重独立于其他层中的权重。
2-特征输入也被假设为独立且同分布(IID)。特征输入与权重无关。此外,它们是规范化的,所以
我们还需要对激活函数做一个假设。我们有两种类型的激活函数。在 z =0 处可微的(像 sigmoid)和不可微的(像 ReLU)。如果激活函数在 z =0 处可微,那么当 z 较小时,我们可以用 Maclaurin 级数来逼近它。函数的 Maclaurin 级数被定义为
当 x 接近零时,其可用于计算 f(x) 的近似值。 tanh 的 Maclaurin 系列是
当 z 接近零时,我们可以忽略 z 的较大幂并写入
乙状结肠的马克劳林级数是
对于小的 z 值,我们可以写为
因此,当 z 接近零时,sigmoid 和 tanh 可以用一个线性函数来近似,我们说我们处于这些函数的线性区域。由于我们假设输入特征是归一化的,它们的值在第一次迭代中相对较小,并且如果我们用较小的数字初始化权重,则神经元的净输入(【z_i^[l】)最初将较小。所以我们假设:
3-激活函数在第一次迭代时处于线性状态。
现在基于这些假设我们可以得出一些结论:
1-在梯度下降的第一次迭代期间,每层中神经元的权重和前一层中神经元的激活是相互独立的。此外,在每一层中,所有激活都是独立的。
基于等式。我们有 3,7 和 9
假设偏差为零。因此*【a_k[l-1】*可以从前一层的激活开始递归计算,直到我们到达第一层,并且*【a_i[l】*是输入特征和层 1 到层 l 的权重的非线性函数
由于每层中的权重是独立的,并且它们也独立于 x_j 和其他层的权重,因此它们也将独立于等式中的权重和 x_j (f 的函数。42 ) 。因此和【a_i^[l-1】*对于 *i,p,k,和 l 的所有值都是独立的。
此外,由于所有的权重是独立的,并且输入特征也是独立的,所以它们的功能( f(w_kp^[m】,x_j) )也是独立的。因此在层 l-1 中,所有的a_i^[l-1】都是独立的,这意味着在每一层中,所有的激活都是独立的。当然,如果我们有 softmax 激活函数,那么输出层就不是这样了。Softmax 定义为
softmax 激活函数中每个神经元的输出是其他神经元输出的函数,因为它们的总和应该是 1。然而,由于 z 的值在第一次迭代中很小,我们可以写成
因此,softmax 函数的输出对于所有神经元大致相同,并且只是输出层中神经元数量的函数。因此,我们可以假设激活仍然不依赖于彼此或该层的权重。
2-在第一次迭代中,每一层的净输入的平均值为零。
使用等式。6、26 和 28 以及权重和激活在第一次迭代中相互独立的事实,我们可以写
基于第一个假设,权重的平均值为零(等式)。31).所以对于 l 的所有值 T21,我们有
同样,我们可以使用 Eq。6、27 和 29 来写
使用等式。31 和 32,前面的等式可以简化
LeCun 重量初始化
该方法最早由 LeCun 等人提出[2]。如前所述,我们希望在反向传播过程中防止梯度的消失或爆炸。所以我们不应该允许 Eq 中的错误。25 消失或爆炸。每层中的误差是输出层误差的函数(【δ^[l】)。另一方面,输出层的误差是输出层激活的函数(等式)。15).因此,如果在正向传播过程中,激活消失或爆炸,同样的事情会发生在错误上。因此,在正向传播过程中,我们应该防止每一层中激活的爆炸或消失。方差代表数据围绕其均值的分布,因此如果层 l 中激活的均值和方差大致等于层 l-1 的均值和方差,那么这意味着激活不会从层 l-1 传播到层 l 而消失或爆炸。所以对于所有的值,I 和 j 应该有两个条件
**
对于 l =1,前一层的激活是输入特征(等式。8),并且它们的方差等于 1(等式。34).因此,前面的等式可以写成
这个 LeCun 方法只对在 z =0 处可微的激活函数有效。它最初是针对 tanh 激活函数推导出来的,但也可以扩展到乙状结肠。
Tanh 激活功能
对于 tanh,我们可以使用等式。37 和 48 来写
使用等式。37,46 和 49 我们得到:
这个等式适用于所有的 l 值。所以等式中的条件。49,并且激活的平均值在不同层中不变。通过替换等式。53 进 Eq。52,并利用层中所有激活的方差相同的事实(等式。51),我们得到
现在来满足 Eq 的条件。51 我们应该有
这是 LeCun 初始化公式。如果我们假设权重具有正态分布,那么我们需要从均值为零且方差为1/n^[l-1】的正态分布中选择权重。我们也可以对权重使用均匀分布。如果我们在区间[ a,b ]上有一个均匀分布,它的平均值将是
它的方差是
所以如果我们从区间上的均匀分布中选择每一层的权重
其平均值将为零,其方差将与等式中给出的方差相同。55.
Xavier 权重初始化
Lecun 方法只考虑输入信号的正向传播。我们也可以把前面的讨论扩展到反向传播。基于此,Xavier Glorot 等人[3]提出了包括信号反向传播的另一种方法。
反向传播
输出层中每个神经元的误差由等式给出。15.所以【δ^[l】是输出层激活的函数(yhat)和标签向量( y )。我们已经表明,在每一层中,所有的激活都是独立的。对于二元分类 y 只有一个元素(在那种情况下是标量 y)。对于多类和多标签分类,它要么是一个热码,要么是多个热码的编码向量,显然,所有的元素都是相互独立的。所以输出层中神经元的误差是一些独立变量的函数,它们将是相互独立的。对于等式中的 tanh 。37,我们得到
把这个等式代入等式。我们有 16 个
因此δ_i^[l】可以从下一层的误差递归计算,直到我们到达输出层,并且它是输出层的误差和层 l+1 到 L 的权重的线性函数
我们已经知道层l*(*【w_ik[l】*)的所有权重都是独立的。输出层的误差是独立的。权重和误差不是完全独立的。因为误差取决于输出层的激活,输出层可以写成网络权重的函数(等式)。42).然而,每个权重*w_pk[l】仅被使用一次来产生层 l 中神经元 p 的激活。由于我们有这么多层,通常每层有这么多神经元,单个权重对输出层的激活和错误的影响可以忽略不计,因此我们可以假设输出层中的每个激活都独立于网络中的每个权重。
因此,我们也可以假设每层中的误差与该层的权重无关。现在利用这个假设和等式。我们有 26、28 和 57 个
现在我们可以使用这个等式和方程。27、29、31 和 32 来写
基于这个等式δ_i^[l】不是 i 的函数,这意味着每层中所有误差的方差是相同的
所以我们可以简化 Eq。60 和写
类似于正向传播,误差的平均值对于所有层都是相同的(等式)。59),我们希望方差保持不变。所以从情商来说。62,我们得到
正如您在反向传播中看到的,每层中权重的方差等于该层中神经元数量的倒数,然而,在前向传播中,则等于前一层中神经元数量的倒数。为了解决这一冲突,我们可以从均值为零且方差为的正态分布中选取每个图层的权重
这个方差是方程中给出的方差的调和平均值。55 和 63。这是 Xavier 初始化公式。我们也可以对权重使用均匀分布。所以如果我们从区间上的均匀分布中选择每一层的权重
其平均值将为零,其方差将与等式中给出的方差相同。64.
sigmoid 激活函数的 Kumar 初始化
Kumar [4]研究了神经网络中的权重初始化。他对任意可微的激活函数提出了一种通用的权重初始化策略,并用它来导出 sigmoid 激活函数的初始化参数。这里我们不打算讨论他的方法。相反,我们扩展了 Xavier 方法,将其用于 sigmoid 激活函数。我们可以用等式。27、39 和 48 来写
使用等式。我们得到 26,39 和 46
通过替换等式。66 入 Eq。并利用层中所有激活的方差相同的事实(等式)。50),我们得到
但是我们知道每一层中激活的方差是 1(等式。51),所以我们可以简化前面的等式
这是 Kumar 得到的结果,他认为没有必要为反向传播过程中激活的变化设置另一个约束。因此,您可以根据等式中给出的方差从正态或均匀分布中选择权重。68.然而,我们也可以研究反向传播。对于反向传播,我们首先需要计算误差的平均值。来自 Eq。我们有 39 个
误差的平均值是
他们的方差是
所以为了保持不同层的方差相同,我们应该
如果我们假设权重具有正态分布,则它具有零均值,并且它的方差可以从等式的调和均值中得到。68 和 72。
权重初始化
该方法最早由何等人提出[5]。如果我们有一个在 z =0 处不可微的激活函数(像 ReLU),那么我们不能用 Maclaurin 级数来近似它。因此,Xavier 方法不能再用了,我们应该使用不同的方法。
ReLU 激活功能
ReLU 是广泛使用的非线性激活函数,定义为
它在 z=0 处不可微,我们通常假设它的导数在这一点上是 0 或 1,以便能够进行反向传播。然而,当 z 接近零时,我们不能使用 Maclaurin 级数来近似它。来自 Eq。我们有 49 个
对于 l 的所有值。为了使用 he 初始化方法,我们从等式开始。48,我们用等式。30、51 和 74 来简化它
基于情商。75, z_i3 的方差对于层 l 中的所有神经元是相同的。所以我们可以写作
回想一下,我们假设权重具有均值为零的均匀或正态分布。所以它们应该在零附近对称分布。我们知道这一点
所以 z_i4可以被认为是权重的线性组合。我们也知道它的均值为零(等式。46),所以也应该在零附近有对称分布。因此,它的分布是一个均匀的函数。现在我们可以写了
因为被积函数是一个偶数函数。基于 ReLU 激活的定义(等式)。73),我们有
所以用等式。我们有 77 和 78
现在我们可以用 Eq 了。30 和写作
所以用等式。我们得到 74 和 76
通过替换等式。81 成情商。我们有 75 个
为了防止正向传播过程中每层激活的爆炸或消失,我们应该确保网络输入不爆炸或消失,因此层 l 的网络输入的方差应该大致等于层 l-1 的方差。因此,根据前面的等式,我们得出结论
反向传播
如前所述,虽然 ReLU 在 z =0 处不可微,但我们假设它在这一点的导数为零或一(这里我们假设它是一)。所以 ReLU 的导数是
因为 g’(z)的一半值是 1,另一半是 0,所以它的平均值将是
并且g’(z)的每个值与其平均值的距离将是 0.5。所以我们可以写作
*g’(z_i^l) 是 z_i^l 的函数,δ_对z_i[l】*的依赖性很弱,所以我们可以假设*g’(z_il)*δ_k^[l+1】是独立的。此外, g’(z_i^l) 与层 l+1 中的权重无关。因此我们可以写
基于等式。16 和 29 我们可以写
正如我们针对 Xavier 方法所展示的,单个权重对输出层的激活和错误的影响可以忽略不计,因此我们可以假设输出层中的每个激活都独立于网络中的每个权重。因此
*以及 Eq 右边的最后一项。88 变成零。通过将*g’(z)的平均值和方差代入等式。88 我们得到
现在我们可以使用 Eqs。29、31、32 和 87 来简化它
这个等式的右边不依赖于 i ,所以层 l 中所有误差的方差是相同的,并且这对于所有其他层也是成立的。所以,我们可以写
与 Xavier 方法类似,所有层的误差均值都是相同的,我们希望其方差保持不变。所以从情商来说。91,我们得到
这种方差可以表示为等式 2 中给出的方差的调和平均值。83 和 92
因此,我们可以从均值为零、方差为 Eq 的正态分布中选取权重。93.
本文中讨论的权重初始化方法对于训练神经网络非常有用。权重初始化方法可以打破对称性,并解决消失和爆炸梯度问题。对称权重初始化会缩小网络的宽度并限制其学习能力。用零初始化权重,不允许权重和偏差被更新。
权重初始化技术基于随机初始化。权重从正态或均匀分布中选取。该分布的平均值为零,并且仔细选择其方差以防止在梯度下降的第一次迭代期间权重的消失或爆炸。当激活函数可微时,LeCun 和 Xavier 方法是有用的。然而,今天大多数深度神经网络使用类似 ReLU 的不可微激活函数。对于这样的激活函数,我们应该使用 he 初始化方法。
权重初始化是训练深度神经网络的必要部分。然而,重要的是要注意,他们不能完全消除消失或爆炸梯度问题。权重初始化方法只能在梯度下降的第一次迭代期间控制权重的方差。权重将在下一次迭代中改变,并且它们仍然可以在以后变得太小或太大。然而,正确的权重初始化可以延迟这个问题,使其稍后发生。通过在第一次迭代期间控制权重的方差,网络可以在权重消失或爆炸之前进行更多次迭代,因此它具有更高的收敛机会。
参考
[1] Bagheri,r .,深度前馈神经网络简介,https://towards data science . com/An-Introduction-to-Deep-forfeed-Neural-Networks-1af 281 e 306 CD
[2] LeCun Y.A .,Bottou L .,Orr G.B .,Müller KR .高效的反向投影。在:蒙塔冯 g,奥尔 G.B .,米勒 KR。神经网络:商业诀窍。计算机科学讲义,第 7700 卷。斯普林格(2012)。
[3] Glorot,x .,Bengio,y .:理解训练深度前馈神经网络的难度。载于:第十三届人工智能和统计国际会议论文集,第 249-256 页(2010 年)。
[4] Kumar,S.K .:关于深度神经网络中的权重初始化。预印于 arXiv:1704.08863 (2017)。
[5],何,,,任,.深入研究整流器:在 imagenet 分类上超越人类水平的性能。IEEE 计算机视觉国际会议论文集,第 1026–1034 页(2015)。
附录
用恒定值初始化权重
*我们首先从网络 A 开始,使用等式计算层 l 的净输入。12(回想一下,所有的权重都是用*ω^[l】初始化的):
因此
*这意味着层 l 中所有神经元的净输入是相同的,并且我们可以假设它等于*z[l】*(*z[l】没有索引,因为它对于所有元素都是相同的,然而,它对于每一层仍然可以是不同的数目)。此外,这一层中所有神经元的激活将是相同的
并且我们假设它等于a^[l】。类似地,所有其它层中神经元的净输入和激活将是相同的。对于第一层,我们可以用 Eq。8 并写出等式。A2 组件
但是对于其他层,我们可以使用 Eq。A2 并将其写成
现在,如果我们在输出层只有一个具有 sigmoid 激活函数的神经元,并使用二进制交叉熵损失函数,等式。15 转变成
这个方程的推导可以参考[1]。由于我们在输出层中只有一个神经元,因此前面等式中的变量没有索引。现在情商。16 可以写成
由于我们在输出层只有一个神经元, k 可以只有 1。此外,对所有神经元都是一样的,所以我们可以简化 Eq。A7 并将其写成
因此层 L-1 的误差向量的所有元素等于δ^[l-1】。对于层 l ,我们可以写成**
因为层 l+1 的所有误差项、所有权重以及层 l 的所有净输入都是相同的。因此层 l 的所有神经元的误差项将相等。使用 Eq。18 我们可以写
因此损失函数相对于偏置的梯度对于层 l 中的所有神经元将是相同的。最后用 Eq。17 我们可以写
这意味着层 l 中所有神经元的损失函数相对于权重的梯度是相同的。结果,当我们更新等式中层 l 的权重和偏差值时。如图 19 和 20 所示,初始值和梯度对于所有神经元都是相同的,并且在梯度下降的每一步,更新的值都是相等的
****
因此,我们最终得到一个网络,其中每一层的权重和偏差都是相同的。在这种初始化方法中,我们对每一层中的所有神经元都有一个对称的行为,它们将一直有相同的输入和输出。
现在假设网络 A 已经使用梯度下降在数据集上训练,并且它的权重和偏差已经收敛到ω_f[l】*和*β_f[l】,这对于每层中的所有神经元都是相同的。假设我们有第二个网络(称为网络 B ),层数相同,它每层只有一个神经元(图 3)。为了能够比较网络 A 和 B ,我们使用上标B>来表示属于网络 B 的数量。
在每一层,两个网络具有相同的激活函数,并且它们也具有相同的输入特征,所以
我们在每一层用β^[l】初始化网络 B 的所有偏置值(来自等式。21).对于网络的第一层 B ,我们初始化权重矩阵(等式。10)具有相同值的网络 A
由于我们只有一个神经元和n[0】*输入特征,权重矩阵确实是一个行向量。这个矩阵的每个元素都是常数*ω_f[1】。对于网络的下一层 B ,我们将权重矩阵定义为
其中n^[l】是网络 A 中 l 层神经元的数量。在网络 B 中,我们只有一个神经元,每层只有一个输入 l≥1 ,所以权重矩阵只有一个元素,这个元素就是ω_f[l]n[l】。因此,对于网络 B 中的每一层 l≥1 ,我们用网络 A 的权重乘以该层中网络 A 的神经元数量来初始化权重矩阵。
现在我们可以很容易地证明网络 B 等价于网络 A 这意味着对于相同的输入向量,它们产生相同的输出。对于网络 B,我们可以使用等式。6、8 和 A14 来写
使用等式。A4 和 A5,网络 A 收敛后的净输入为
**
因此,网络 A 中第 1 层的每个神经元的净输入等于网络 b 中同一层的单个神经元的净输入。由于它们共享相同的激活函数,它们的激活也将相等
我们可以用等式。3 和 A16,以获得网络 B 中其他层的网络输入
对于第二层,我们可以使用等式。A20 和 A21 到达
这与网络第二层 A 中神经元的净输入相同(等式。A18)。所以我们得到了
同样,我们可以证明网络 B 每层中单个神经元的净输入和激活等于网络同一层神经元的净输入和激活。所以我们有
因此,通过使用这种对称权重初始化,网络 A 的行为类似于具有有限学习能力的网络 B ,然而,计算成本保持不变(图 3)。
加权 K 均值聚类示例-人造国家
应用于世界人口地图的加权 K 均值聚类示例,看看会发生什么。
图一。世界人口密度图。为了可视性,我们对每个像素取对数。
介绍
WKMC 算法可以应用的领域之一是人口统计学。想象一下这样一种情况,如果所有的行政区划或历史冲突都消失了,或者种族、民族或部落身份不再重要,你希望看到人们如何分组或愿意分组?那么人们如何着手创建社区呢?
在本帖中,我们将使用 WKMC 算法来找出人们如何根据他们目前的地理分布来分组。为此,我们将关注两个参数:
- 地理坐标,
- 特定位置的人口密度。
由于这是一个好奇心驱动的模拟,这是一个具有纯粹假设性质的极大简化。该模拟没有考虑自然资源或地形障碍等会阻碍人们定居的条件。然而南极洲是唯一的例外。我们将它排除在外,因为它是地图的一大部分,对于算法来说太大而无法忽略,但几乎完全可以居住。
数据集
我们将使用美国宇航局的人口密度数据集。该网站提供了四个版本的数据集,有不同的分辨率,非常适合实验。
图一。世界人口密度图。为了可视性,我们对每个像素取对数。
该数据集有四种不同的分辨率版本。当然,最高分辨率的分辨率会给出最好的结果,尽管必要的计算可能会成为一个问题。要获取数据集,请执行:
mkdir dataset
wget -O dataset/world.csv "https://neo.sci.gsfc.nasa.giv/servlet/RenderData?si=875430&cs=rgb&format=CSV&width=360&height=180"
然后:
import pandas as pd
df = pd.read_csv('./dataset/world.csv', header=-1)
df = df.replace(df.max().max(), 0)
df = df.loc[10:145, :]
df = df.reset_index()
df = df.drop(columns=['index'])
df.columns = range(df.shape[1])
对于这个数据集,地理经度和纬度被简单地表示为整数,并被视为一个矩阵的 (x,y) 索引,地图具有圆柱表示。同时,这个矩阵的每一个元素都代表了居住在特定区域的人口密度。
海洋被标记为99999.0
,这是不自然的,因此我们将其置零。稍后,我们移除北冰洋(只是为了稍微加快计算速度)和南极洲的“狭长地带”,正如前面示意的那样。然后,我们重新枚举行和列的索引,使它们从零开始计数。
特征工程
在我们继续之前,我们需要对我们的数据集进行一点转换,以适应聚类问题。首先,我们需要将数据集的表示从一个人口密度矩阵改为一个经度和纬度坐标点的列表,以便 WKMC 能够计算距离。但是,我们还需要保留人口密度值,我们和机器都可以将其解释为每个数据点的权重。换句话说,与农村地区或沙漠相比,大城市等大型居住区更倾向于将最近的点拉入聚类。
latitude_idx = df.index.to_numpy()
longitude_idx = df.columns.to_numpy()
lat_max = len(latitude_idx)
lon_max = len(longitude_idx)
x0 = latitude_idx.repeat(lon_max)
x1 = np.tile(longitude_idx, lat_max)
x = df.to_numpy()
dd = pd.DataFrame({
'x0': x0,
'x1': x1,
'weight': x.flatten()
})
首先,我们从 dataframe 对象中提取纬度和经度。然后,我们重复纬度和纬度值,以便它们形成沿着某个新索引排序的唯一对。我们还转储所有的权重并将它们展平为一个系列,我们将其加入到一个新的数据帧中,这样我们就可以保留引用。
世界是圆的…
我们知道现在人们倾向于把所有事情都放在一起讨论,但是不……地球还在转。这里我们有一个圆柱表示的地图,这个地图有一个重要的结果:地图的左右两边连在一起。因此,确保我们的算法不会将靠近两条边的两个点视为非常分离是至关重要的。
因为 skearn API 不允许我们轻易覆盖距离度量,所以我们必须对数据集进行不同的参数化:
dd['latitude'] = (x0 / x0.max() - 0.5) * 2.0
dd['longitude_sin'] = np.sin((x1 / x1.max()) * np.pi * 2.0)
dd['longitude_cos'] = np.cos((x1 / x1.max()) * np.pi * 2.0)
经度是循环的维度,如果我们把它换算成一个区间[0:2.0*np.pi]
,它就会变成纵向角度。问题是 1 和 360 度之差是 360 度,而距离应该等于 1 度。所以我们可以把这个维度分解成两个特征,分别用正弦和余弦。
这里的纬度不应该是循环的。但是,如果我们查看刚刚定义的与经度相关的特征,我们可以看到沿这些轴出现的最大值是 2。因此,为了在缩放纬度时补偿它,我们需要确保沿它的最大距离也是 2。
因为我们的 dataframe dd
保存了所有的引用,所以我们可以简单地向其中添加新的特性,就像我们刚刚做的那样。
解决办法
现在,我们的特征矩阵X
可以通过参考通过纬度和经度的正弦/余弦投影的所有点来构建。同时,我们把人口密度作为权重。然而,在此之前,我们移除所有权重严格为零的点。由于我们的飞机表面大约 70%是水,这可以大大减少所需的计算。
N_CLUSTERS = 195
dd = dd[dd['weight'] != 0.0]
dd = dd.reset_index()
dd = dd.drop(columns=['index'])
X = dd[['latitude', 'longitude_sin', 'longitude_cos']].to_numpy()
weights = dd['weight'].to_numpy()
dd['cluster'] = KMeans(n_clusters=N_CLUSTERS).fit_predict(X,
sample_weight=weights)
195 这个数字不是偶然的。目前,我们有 195 个地区被认定为国家。我们可以用这个数字作为新世界的参考。
解决了 WKMC 问题后,我们需要“重组”旧坐标的解决方案,这相当容易,因为我们保留了对原始索引的引用。
XX = -1 * np.ones((lat_max, lon_max))
for i in range(len(dd)):
u, v = dd['x0'].iloc[0], dd['x1'].ilox[i]
cluster_id = dd['cluster'].iloc[i]
XX[u, v] = cluster_id
现在,让我们画出结果。我们将用新的“国家”覆盖原始人口密度图。(请注意,np.where
功能仅用于增强绘图。)
fig, ax = plt.subplots(1, 1, figsize=(24, 24))
ax.imshow(np.where(XX == -1, np.NaN, XX),
cmap='Spectral',
alpha=0.75)
ax.imshow(df.apply(lambda x: np.log(x)), alpha=0.25, cmap='gray')
ax.contour(longitude_idx, latitude_idx,
np.where(XX == -1, -10, XX),
levels=N_CLUSTERS,
linewidths=0.1,
alpha=0.5,
colors='k')
plt.show()
通过 K-Means 聚类算法定义的 195 个国家的世界。
讨论
我们终于聚集了人口。观察 WKMC 算法假设的结果是有用的。
首先,因为我们已经移除了零权重的点,所以没有聚类的标签被分配给这些点。然而,人口密度越大,集群就越集中。这在印度和中国这两个世界上人口最稠密的地区尤为明显。西伯利亚和加拿大北部、格陵兰岛、撒哈拉和澳大利亚形成较大的星团。
其次,通过缩放特征(记住,所有特征都在[-1, 1]
范围内),集群在任何方向都不会表现出各向异性。换句话说,如果例如 x 轴具有 5 倍的范围,我们将期望它的影响更强,因此集群将被垂直拉长。
最后,通过确保东西轴的连续性,我们的集群不会因为边界条件的存在而失真。
结论
我们已经看到了 K-Means 聚类算法是如何在我们的假设世界中投入使用的。然而,刚刚演示的用法实际上非常传统,可以应用于类似的情况,在处理较小的地图时会产生特别好的效果。该算法有助于发现存在的相似性,而不管行政区划如何。
还会有更多…
我计划把文章带到下一个层次,并提供简短的视频教程。
如果您想了解关于视频和未来文章的更新,订阅我的 简讯 。你也可以通过填写表格让我知道你的期望。回头见!
不平衡数据集的加权 Logistic 回归
数据集中标签的不平衡分布
在数据科学中,分类是将事物或样本分配到相同类型的类或类别中的任务。在机器学习中,分类是一种监督学习,其中每个样本点或实例都与一个目标相关联,该目标称为类或类别,或简称为标签。一个基本的例子是将一个人分类为男性或女性,或者将一封电子邮件分类为“垃圾邮件”或“非垃圾邮件”,或者将一笔金融交易分类为“欺诈”或“非欺诈”。
用外行人的话来说,分类算法是将事物或样本排列成类或类别的基本认知过程。在机器学习中使用分类算法是一个两步过程。在称为训练或拟合的第一步中,分类算法使用标签数据集(也称为训练数据集)来获得每个标签的边界条件。在这个训练过程中,识别分类器的基本权重或函数,以给出最准确和最好的标签分离。在称为预测的第二步中,每个样本/数据点或实例被馈送到算法中以预测目标标签,即算法将标签分配给输入样本/数据点。
在机器学习中,有许多分类算法可用,如逻辑回归、决策树、SVM、朴素贝叶斯、KNN 等。每种算法都有不同的底层逻辑/过程,并有自己的优缺点和用例。此外,在现实世界中,分类问题可以有两个以上的标签,例如花卉种类分类、水果分类、物体分类等。许多分类算法能够或能够在这样的多类/标签数据集上工作。
不平衡数据集
不平衡数据集是一种数据集,其中标签在数据集上的分布不平衡,即分布有偏差或偏斜。具有更多数据点/样本的组被称为多数类,而具有较少数据点的组被称为少数类。数据集中的分布可能有轻微不平衡或高度不平衡。完全均等的分布是非常罕见的,尽管大多数时候分布稍微偏向一个阶层。
在这种情况下,分布是高度倾斜的,以至于对于数百、数千或数百万多数类的数据点,可能有一个少数类的数据点。一些实际的场景是:
- 信用卡欺诈交易(欺诈交易在所有金融交易中非常少)
- 电子邮件的垃圾邮件分类(与普通电子邮件相比,垃圾邮件非常少)
- 机器故障(机器发生故障的情况很少)
- 保险索赔预测。
- 员工流失率(通常员工流失率最高为 20%)
在这种情况下,少数类比多数类更重要,分类器的目的是有效地将少数类从多数类中分类出来,例如从所有交易中识别欺诈交易。这种高度不均衡分布对类别预测提出了挑战。原因是大多数分类器被设计或具有默认值,假设每个标签的分布相等。轻微的不平衡不构成任何挑战,可以像正常的分类问题一样对待。
使用准确度分数作为这种高度不平衡的数据集的评估度量不是分类器性能的良好度量。例如,如果多数类与少数类的分布是 95:1,那么将所有数据点标记为多数类将得到 95%的准确性,这在预测建模中是非常好的分数。但是在这种情况下,分类器算法没有学习到关于手边问题的任何东西,即少数类,例如欺诈交易、垃圾邮件等。在某些情况下,如欺诈交易,阶级分布的不平衡可能高达 99%。
在这种情况下,ROC-AUC 曲线等评估指标是分类器性能的良好指标。这是一个衡量模型区分不同类别能力的标准。ROC-AUC 分数越高,模型预测 0 为 0 和 1 为 1 的能力越强。提醒一下,ROC 是概率曲线,AUC 代表可分性的程度或度量。除了这个指标,我们还将在构建分类器时检查召回分数、假阳性(FP)和假阴性(FN)分数。
在本文中,我将坚持只在不平衡 2 标签数据集上使用逻辑回归,即用于不平衡二元分类的逻辑回归。尽管基本方法可以应用于多标签/类数据集。我已经创建了一个包含两个类的人工不平衡数据集。对于每 99 个多数类样本,数据集具有 1 个少数类样本。因此,每 100 个数据点中,少数群体只有一个样本,而且分布高度偏向多数群体。
# basic libraries
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
import seaborn as sns
from sklearn.datasets import make_blobs, make_classification# create a imbalanced dataset of 10K with 2 class
x,y = make_classification(n_samples=10000 # number of samples
,n_features=2 # feature/label count
,n_informative=2 # informative features
,n_redundant=0 # redundant features
,n_repeated=0 # duplicate features
,n_clusters_per_class=1 # number of clusters per class; clusters during plotting
,weights=[0.99] # proportions of samples assigned to each class
,flip_y=0 # fraction of samples whose class is assigned randomly.
,random_state=13 )# club together into a dataframe
df = pd.DataFrame(x,columns=['x1','x2'])
df['y'] = y
生成数据集后,让我们检查数据以确认分布是否不平衡。
# check the distribution
df[‘y’].value_counts()/df.shape[0]
输出:
0 0.99
1 0.01
Name: y, dtype: float64
让我们用不同的颜色为每个类绘制分布图。
# scatter plot
plt.figure(figsize=(10,5))
sns.scatterplot(data=df,x=’x1',y=’x2',hue=’y’)
阶级不平衡散点图
视觉分布看起来很吸引人。多数标签(0)在数据集中占 99%,而少数标签(1)仅占 1%。因此,99%的准确度可以简单地通过将完整集预测为多数标签即 0 来实现。但是这是没有帮助的,因为我们正在建立分类器来从多数标签中分类少数标签(重要的)。
有许多技术可以用来处理阶级不平衡。一种流行的技术是上采样(例如 SMOTE),其中将更多相似的数据点添加到少数类,以使类分布相等。在这个上采样的修改数据上,可以应用任何分类器。
在逻辑回归中,另一种技术可以方便地处理不平衡分布。这是根据等级分布使用等级权重。类权重是算法因该类的任何错误预测而受到惩罚的程度。
使用默认权重,分类器将假设两种标签错误,即假阳性(FP)和假阴性(FN)具有相同的成本。或者换句话说,分类器假设任一标签的错误预测具有相同的成本。但事实上,少数阶级的错误预测比多数阶级的错误预测更糟糕。在欺诈交易等情况下,未检测到欺诈交易比错误地将非欺诈交易标记为欺诈交易对组织造成的损失更大。
逻辑回归(默认)
说够了,现在让我们看看加权逻辑回归的作用。
# import model and matrics
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score, RepeatedStratifiedKFold, StratifiedKFold
from sklearn.metrics import accuracy_score, confusion_matrix,roc_curve, roc_auc_score, precision_score, recall_score, precision_recall_curve
from sklearn.metrics import f1_score# split dataset into x,y
x = df.drop('y',axis=1)
y = df['y']# train-test split
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=13)
在上面的测试训练分割之后,让我们用默认的权重建立一个逻辑回归。
# define model
lg1 = LogisticRegression(random_state=13, class_weight=None
# fit it
lg1.fit(X_train,y_train)
# test
y_pred = lg1.predict(X_test)# performance
print(f'Accuracy Score: {accuracy_score(y_test,y_pred)}')
print(f'Confusion Matrix: \n{confusion_matrix(y_test, y_pred)}')
print(f'Area Under Curve: {roc_auc_score(y_test, y_pred)}')
print(f'Recall score: {recall_score(y_test,y_pred)}')
输出:
Accuracy Score: 0.9946666666666667
Confusion Matrix:
[[2970 1]
[ 15 14]]
Area Under Curve: 0.7412110168409568
Recall score: 0.4827586206896552
对于少数类,上述模型能够预测 29 个样本中 14 个正确。对于多数类,模型只有一个预测错误。模型在预测少数民族阶层方面做得不好。尽管如此,有了这些默认的权重性能值,我们就有了衡量后续模型修改的基准。
加权逻辑回归
在不平衡标签分布的情况下,权重的最佳实践是使用标签分布的反转。在我们的集合中,标签分布是 1:99,因此我们可以将权重指定为标签分布的倒数。对于多数类,将使用权重 1,对于少数类,将使用权重 99。因此,少数类错误预测的惩罚将比多数类错误预测的惩罚重 99 倍。此外,有了这个类权重值,我们会期望我们的模型比默认模型(即以前的模型)表现得更好。
为了指定权重,我们将利用逻辑回归的 class_weight 超参数。class_weight 超参数是一个定义每个标签权重的字典。与形式为 {class_label: weight} 的类相关联的权重。如果没有给出,所有的类都应该有相同的权重值。
# define class weights
w = {0:1, 1:99}# define model
lg2 = LogisticRegression(random_state=13, class_weight=w)
# fit it
lg2.fit(X_train,y_train)
# test
y_pred = lg2.predict(X_test)# performance
print(f'Accuracy Score: {accuracy_score(y_test,y_pred)}')
print(f'Confusion Matrix: \n{confusion_matrix(y_test, y_pred)}')
print(f'Area Under Curve: {roc_auc_score(y_test, y_pred)}')
print(f'Recall score: {recall_score(y_test,y_pred)}')
输出:
Accuracy Score: 0.898
Confusion Matrix:
[[2669 302]
[ 4 25]]
Area Under Curve: 0.880209844589654
Recall score: 0.8620689655172413
对于加权 LG,曲线下面积(AUC)从 0.7412 急剧增加到 0.8802。回忆分数从 0.4827 提高到 0.8620。对少数民族标签的正确预测也增加了。尽管模型在多数类中几乎没有错误预测,但是自定义权重在预测少数类中如预期的那样显示出改进。
权重网格搜索
可以有其他权重组合,它们可以表现得同样好或者可能更好。在这一部分中,将对不同的权重组合执行网格搜索,并将保留具有更好性能得分的权重组合。
# define weight hyperparameter
w = [{0:1000,1:100},{0:1000,1:10}, {0:1000,1:1.0},
{0:500,1:1.0}, {0:400,1:1.0}, {0:300,1:1.0}, {0:200,1:1.0},
{0:150,1:1.0}, {0:100,1:1.0}, {0:99,1:1.0}, {0:10,1:1.0},
{0:0.01,1:1.0}, {0:0.01,1:10}, {0:0.01,1:100},
{0:0.001,1:1.0}, {0:0.005,1:1.0}, {0:1.0,1:1.0},
{0:1.0,1:0.1}, {0:10,1:0.1}, {0:100,1:0.1},
{0:10,1:0.01}, {0:1.0,1:0.01}, {0:1.0,1:0.001}, {0:1.0,1:0.005},
{0:1.0,1:10}, {0:1.0,1:99}, {0:1.0,1:100}, {0:1.0,1:150},
{0:1.0,1:200}, {0:1.0,1:300},{0:1.0,1:400},{0:1.0,1:500},
{0:1.0,1:1000}, {0:10,1:1000},{0:100,1:1000} ]
hyperparam_grid = {"class_weight": w }
我将对上述一组权重值组合进行网格搜索。这个列表可以详尽到你想要的程度。甚至可以制作一个简单的函数来创建一个不同组合的大网格。因为 ROC-AUC 分数是这里的评估度量,所以这个分数将被优化。
# define model
lg3 = LogisticRegression(random_state=13)# define evaluation procedure
grid = GridSearchCV(lg3,hyperparam_grid,scoring="roc_auc", cv=100, n_jobs=-1, refit=True)grid.fit(x,y)print(f'Best score: {grid.best_score_} with param: {grid.best_params_}')
输出:
Best score: 0.964040404040404 with param: {'class_weight': {0: 0.01, 1: 1.0}}
请注意,GridSearch 确定的权重分布的最佳值与我们之前使用的略有不同,即类别分布的倒数。在这里发挥作用的因素是评估指标和交叉验证。如果选择使用不同的评估指标,您可能会收到不同的权重值。使用上述权重值,让我们建立逻辑回归。注意,我也可以使用 grid.predict。
# define model
lg3 = LogisticRegression(random_state=13, class_weight={0: 0.01, 1: 1.0})
# fit it
lg3.fit(X_train,y_train)
# test
y_pred = lg3.predict(X_test)# performance
print(f'Accuracy Score: {accuracy_score(y_test,y_pred)}')
print(f'Confusion Matrix: \n{confusion_matrix(y_test, y_pred)}')
print(f'Area Under Curve: {roc_auc_score(y_test, y_pred)}')
print(f'Recall score: {recall_score(y_test,y_pred)}')
输出:
Accuracy Score: 0.8863333333333333
Confusion Matrix:
[[2633 338]
[ 3 26]]
Area Under Curve: 0.8913926577606518
Recall score: 0.896551724137931
使用新的权重,我们在 AUC 和回忆分数上有了轻微的提高。从混淆矩阵可以看出,模型在预测少数民族阶层方面做得很好。虽然我们对多数标签有轻微的错误预测,但它应该是可行的,主要是因为少数标签在这里很重要,并且有很高的相关成本。
超参数网格搜索
逻辑回归的其他超参数的非缺省值有可能实现更好的性能。因此,在这一部分中,我们将对逻辑回归的各种超参数的一系列不同值进行网格搜索,以获得更好的性能分数。下面是执行网格搜索的参数网格和各种数值范围。
# define hyperparameters
w = [{0:1000,1:100},{0:1000,1:10}, {0:1000,1:1.0},
{0:500,1:1.0}, {0:400,1:1.0}, {0:300,1:1.0}, {0:200,1:1.0},
{0:150,1:1.0}, {0:100,1:1.0}, {0:99,1:1.0}, {0:10,1:1.0},
{0:0.01,1:1.0}, {0:0.01,1:10}, {0:0.01,1:100},
{0:0.001,1:1.0}, {0:0.005,1:1.0}, {0:1.0,1:1.0},
{0:1.0,1:0.1}, {0:10,1:0.1}, {0:100,1:0.1},
{0:10,1:0.01}, {0:1.0,1:0.01}, {0:1.0,1:0.001}, {0:1.0,1:0.005},
{0:1.0,1:10}, {0:1.0,1:99}, {0:1.0,1:100}, {0:1.0,1:150},
{0:1.0,1:200}, {0:1.0,1:300},{0:1.0,1:400},{0:1.0,1:500},
{0:1.0,1:1000}, {0:10,1:1000},{0:100,1:1000} ]
crange = np.arange(0.5, 20.0, 0.5)
hyperparam_grid = {"class_weight": w
,"penalty": ["l1", "l2"]
,"C": crange
,"fit_intercept": [True, False] }
使用上述范围值,我们对逻辑回归进行网格搜索。
# logistic model classifier
lg4 = LogisticRegression(random_state=13)# define evaluation procedure
grid = GridSearchCV(lg4,hyperparam_grid,scoring="roc_auc", cv=100, n_jobs=-1, refit=True)grid.fit(x,y)print(f'Best score: {grid.best_score_} with param: {grid.best_params_}')
输出:
Best score: 0.9649494949494948 with param: {'C': 13.0, 'class_weight': {0: 1.0, 1: 100}, 'fit_intercept': True, 'penalty': 'l2'}
用上述最优值建立 logistic 回归模型。
# define model
lg4 = LogisticRegression(random_state=13,C=13.0,fit_intercept=True, penalty='l2',class_weight={0: 1, 1: 100} )
# fit it
lg4.fit(X_train,y_train)
# test
y_pred = lg4.predict(X_test)# performance
print(f'Accuracy Score: {accuracy_score(y_test,y_pred)}')
print(f'Confusion Matrix: \n{confusion_matrix(y_test, y_pred)}')
print(f'Area Under Curve: {roc_auc_score(y_test, y_pred)}') # 0.5
print(f'Recall score: {recall_score(y_test,y_pred)}')
输出:
Accuracy Score: 0.8876666666666667
Confusion Matrix:
[[2637 334]
[ 3 26]]
Area Under Curve: 0.892065831776135
Recall score: 0.896551724137931
我们的 ROC-AUC 评分略有改善。使用最佳超参数,it 得分从之前的值 0.8913 提高到 0.8920,而回忆得分保持不变。准确度也略有提高。现在,有了这些超参数值,逻辑回归可以很好地用于上述不平衡数据集。这也表明准确性并不总是最好的评估方法。
结论
拥有不平衡的数据集并不一定意味着这两个类不可预测。对于处理不平衡数据集,上采样(例如 SMOTE)不是唯一的选择。虽然大多数算法被设计成以相等的类分布工作,但是对于处理类不平衡,上采样(例如 SMOTE)不是唯一剩下的选择。在逻辑回归的情况下,类权重(一个模型超参数)可以被修改以加权每个类分布的模型误差。
本文是针对欺诈检测等场景的实践,在这些场景中,类别不平衡可能高达 99%。此外,准确性并不总是模型的最佳评估标准。评估指标的选择取决于数据集和手头的情况。
希望你喜欢这篇文章。如果你想分享关于任何方法的任何建议,请在评论中畅所欲言。读者的反馈/评论总是给作家带来灵感。
权重、偏差和反向传播
神经网络的一些基本组件的简化视图。
从 Adobe Stock 获得许可的图像
神经网络是复杂、强大的人工智能(AI)系统,可以执行诸如识别照片中的对象或现场或录制语音中的单词等任务。这个名字来自于这些系统如何模仿人类大脑的一个方面——一个相互连接的神经元系统。许多优秀的资源可以在线获得,以了解神经网络和一般的人工智能,特别是在 YouTube 和像走向数据科学这样的出版物上。在本文中,我将简要介绍神经网络的两个基本组成部分:权重和偏差。
神经网络
神经网络包含多层“节点”例如,如果一幅图像由 28 x 28 像素的灰度网格组成,就像通常使用的 MNIST 手写数字训练集一样,神经网络的第一层将有 784 (28x28)个节点。每个初始层节点对应于图像中的一个像素,并且具有从 0 到 1 的值。“0”意味着像素是白色的,而“1”意味着像素是黑色的。第二层节点可以有另外 784 个节点,也可以有更多或更少的节点。为简单起见,我们假设第一层中的每个节点都“连接”到第二层中的每个节点。在神经网络中,可以使用许多后续的“隐藏”连接层,每个节点的值称为其“激活”最后一层称为输出层,其节点数量与“标签”(类别等)相对应。)的数据来训练网络。在 MNIST 的示例中,输出图层有十个节点,每个节点对应一个以 10 为基数的数字系统(0–9)中的一位数字。输出层(0–9)中具有最高值的节点将是系统对其刚刚评估的数字的猜测。
从 Adobe Stock 获得许可的图像
权重和偏差
一层中的单个节点与下一层中的每个节点之间的每个“连接”都有一个“权重”(正或负),它表示该源节点对它所连接的任何特定节点的影响有多强。当网络初始化时,所有这些权重都是随机选择的。
以 MNIST 为例,如果第二层有 16 个节点,将有 12,544 个权重将输入层连接到第二层(784 x 16)。新的 16 个节点中的每一个都有 784 个不同的连接,一个连接到输入层中的每个节点。
计算下一层中节点值的第一步是将源节点的值乘以它与下一层中每个节点的连接权重。接下来,为新层中的每个节点分配一个“偏移”值(正或负),以允许进一步“调整”该节点的值。最后一步包括将这两个计算的结果“压缩”到 0 到 1 的范围内,这就给出了每个连接节点的激活(值)。可以使用不同的“压缩”值的方法,但这超出了本文的范围。
每个后续层中所有连接的节点都以相同的方式计算:
第一步:((节点值)x(权重))+偏差
第二步:“Squishify”(将结果压缩到 0 到 1 的范围内)
步骤 3:将该值放入连接节点中
因此,网络在每个输出层节点中以激活值(0 到 1)结束。然后,基于这些激活的准确性,计算“成本”。例如,如果一个手写数字在 MNIST 数据集中是 7,但是“7”的输出节点有一个小的激活(0.15),但是“1”节点(0.72)和“9”节点(0.68)有较高的激活,这将产生一个高“成本”“猜测”的成本是每个输出节点的正确值和预测值之间的差的平方和。
反向传播
使用微积分来计算将使该特定预测更准确的权重和偏差的改变(以实现不正确输出节点的较低激活和正确输出节点的较高激活)。这个过程被称为反向传播,是神经网络“学习”的本质
在系统评估了“足够多”的图像之后(为了提高训练网络的效率,通常最好将数据分成块),所有这些针对权重和偏差变化的单独反向传播“投票”被组合起来,以得出考虑所有不同“投票”的“轻推”
一遍又一遍地重复这个过程,每次都使用组合的“投票”来微调权重和偏差,网络聚焦于每个权重和偏差的最佳值。即使在只有几层的简单网络中,这也意味着成千上万的计算。
如果你是神经网络的新手,我希望这些信息是有用的。如果你想深入了解,我最喜欢的资源之一是 YouTube 上的 3Blue1Brown 的一个系列。
我乐观地认为,人工智能将越来越多地被用来让我们所有人的生活变得更好。您是否面临数据科学问题/挑战?我很乐意帮忙;我们连线吧!
感谢阅读!
奇怪而不寻常的 SQL
照片由Meagan car science在 Unsplash 上拍摄
数据工程
使用异常的 SQL 查询探索数据库行为
答虽然阅读数据库理论和数据库文档是最重要的,但是通过尝试来习惯一个系统也是非常重要的。为了更好地掌握 SQL,从实验开始,无止境地编写愚蠢的查询,使用查询解决数学难题,使用查询创建一个随机的国际象棋游戏等等。当然,你可能没有机会在工作中做这些事情,所以抽出时间,尤其是如果你是一名数据人员的职业生涯的早期阶段。很明显,在你自己的机器上做。
了解 where 子句如何求值、子查询如何工作、排序如何工作以及空值在数据库中的行为,如果您进行实验,将会对这些内容有更深的理解。这样做也能为面试中被问到的任何棘手问题做好准备。然而,现在在面试中问一些刁钻的问题已经不太流行了。
查询任何传统关系数据库的经验法则
towardsdatascience.com](/easy-fixes-for-sql-queries-ff9d8867a617)
首先,看看这个例子——所有的 SQL 都归结于对WHERE
子句的有效使用。理解它的行为是很重要的。
SQL 中整数是如何求值的!
当您在WHERE
子句中使用整数时,它表示整数,但是当您在GROUP BY
和ORDER BY
子句中使用整数时,整数表示列在结果集中的位置号(不在表中)。这是另一个让查询写得更快的懒惰伎俩。但是,建议您不要使用GROUP BY 1, 3 ORDER BY 1 DESC
,因为它为将来其他人编辑查询时导致错误留下了空间,特别是如果它是一个复杂的查询。一些零怎么样?
空值的行为方式!
对于大多数数据库,您会发现一篇专门的文档讨论如何处理空值。这里有一段来自 MySQL 的官方文档,讲述了使用空值的,还有一段是关于空值的问题的信息。阅读这些内容,您会发现不能对空值使用等式或比较运算符。
让您的 SQL 代码更易读、更容易理解
towardsdatascience.com](/how-to-avoid-writing-sloppy-sql-43647a160025)
继续前进。理解逻辑运算符对于编写 SQL 查询非常重要。大多数 SQL 引擎支持所有主要的局部运算符,如 AND、or、NOT、XOR。尽管我们在 where 子句中没有看到它们的替代项,但我们绝对可以编写这样的查询——
逻辑运算符&波浪号的使用
我在这里有了一些有趣的发现。对整数使用波浪号将从数据库中可能的最大整数中减去该数字,并返回结果。但是如果单独选择~
,会给你一个错误。关于 and 和& &的可互换性,建议您在整个代码库中使用 AND 而不是& &或反之亦然,以便具有良好的可读性。否则会很混乱。还有,大家最喜欢的工具搜索&替换不会正常工作。
关于逻辑运算符的另一点是,它们支持所有附带的逻辑数学。例如,SELECT NOT NOT 1
会给我们 1。当我们做SELECT NOT NOT 'Nice'
时会发生什么。这里有几个例子来演示。
以串行方式使用多个逻辑运算符
当与数学运算符一起使用时,逻辑运算符应该用括号分隔,否则数据库引擎将无法识别逻辑运算符,并将其视为字符串,从而引发错误。
结合使用逻辑和算术运算符
我发现这种探索数据库行为的方法非常迷人。大多数已编写的查询都使用了内置于数据库引擎中的上述原则,大多数数据库都处理空值,但是我们了解数据库实际上是如何读取和解释我们的查询的吗?我认为,为了更深入地理解数据库,人们必须经历这样的随机查询。它们就像数学难题,但显然非常简单。
几乎所有支持 SQL 的数据库都是如此。我已经在这里写下了—
2020 年的 SQL 前景会是怎样的?它的未来会是怎样的?
towardsdatascience.com](/the-many-flavours-of-sql-7b7da5d56c1e)
欢迎来到人工智能游戏。你敢吗?
在探索机器学习及其算法背后的主要概念时获得乐趣。
“只是玩玩。玩得开心。享受比赛”——迈克尔·乔丹
我们将从头开始。在机器学习中,我们将使用矩阵、数组和向量符号来指代数据。
游戏规则是这样的:
- 一行、一次观察或特定数据。
- 前一次观察的一列、一个特征(或属性)。
- 在最一般的情况下,会有我们会称之为“目标”,标签或回应,这将是我们要预测或实现的价值。
仅此而已。我让你轻松了,对吧?
如果你想了解更多,请访问oscargarciaramos.com
现在,三种不同的机器学习技术:
监督学习,
“我们的第一场比赛”。这些算法采用一组已知的输入数据集及其对数据的已知响应(输出)来学习。我们知道什么“进”,什么“出”。一旦算法学习并得到适当的训练,我们就可以进行“泛化”,即模型有能力适当地适应新的、以前从未见过的数据。我们将区分两种类型的监督学习算法:回归和分类。
—标记数据、直接反馈、预测结果/未来
无监督学习
“走出下一步”。这一次,数据将被取消标记,结构将是未知的。我们的任务?找到数据的内在结构或模式。我们会发现两种类型的算法:聚类和降维。
— 没有标签,没有反馈,在数据中找到隐藏的结构
强化学习
“从经验中学习”。我们最后一个。尝试最大化算法因其行为而获得的回报。使用反馈反复试验。
—决策过程、奖励系统、学习系列行动
我们可以开始玩了吗?
线性回归
你家里有原木吗?根据体重有条理地摆放。但是,你不能称它们。你必须通过观察高度和它的直径来猜测(视觉分析)通过组合这些“可见”的参数来组织它们。 那是一元线性回归 。
我们该怎么办?我们通过将自变量和因变量拟合到一条直线上来建立它们之间的关系,这条直线就是我们的回归线,表示为 Y = a * X + b
- y-因变量
- a-斜率
- X —独立变量
- b —截距
我们如何计算系数 a 和 b?最小化数据点和回归线之间距离的平方差之和。
逻辑回归
我们将讨论 0 和 1,我们的离散值,我们必须从一组独立变量中估计它们。
该模型将尝试用一条线来拟合这些点,它不可能是一条直线,而是一条 S 形曲线。它也被称为 logit 回归。
如果我们想改进我们的逻辑回归模型呢?包括交互项、消除特征、调整技术或使用非线性模型。
决策图表
当今数据科学家最喜欢的算法之一。
这是一种用于分类问题的监督学习算法。我们将从对某个项目的观察(在分支中表示)到关于该项目的目标值的结论(在树叶中表示)。它对分类变量和连续因变量的分类都很有效。
它是如何工作的?我们根据最重要的属性/独立变量将总体分成两个或更多的同类集合,然后…我们往下走!
SVM(支持向量机)
SVM 是一种分类方法,在这种方法中,算法将原始数据绘制为 n 维空间中的点,其中 n 是您拥有的要素数量。然后,每个要素都被绑定到一个特定的坐标,这使得对数据进行分类变得很容易。
算法的特别之处在哪里?我们将以苹果和橘子为例。它不是在群体中寻找那些最能被描述为苹果和橘子的,而是寻找苹果更像橘子的情况,这是最极端的情况。这将是我们的支持向量!一旦确定,我们将使用称为“分类器”的线来分割数据,并将它们绘制在图表上。
朴素贝叶斯
朴素贝叶斯分类器。它是一种基于贝叶斯定理的分类技术,假设预测器之间是独立的。朴素贝叶斯之所以“朴素”,是因为它假设测量的特征是相互独立的。
一种快速简单的方法来预测类,用于二进制和多类分类问题。
KNN(K-最近邻)
想象一下,你要去拜访一个比你的朋友或家人更好的人,对吗?
这是一样的。我想和我的朋友在一起。
我们可以将这种算法应用于分类问题和回归问题。它是如何工作的?简单,我们将所有可用的案例进行排列,并根据其 K 个邻居的多数投票对新案例进行分类。案例将被分配到具有最大共同点的类别或分类中。测量是如何进行的?用一个距离函数,一般是欧几里德距离。
注意:KNN 计算量很大,变量应该归一化。
k 均值
这是一种解决聚类问题的无监督算法。橘子配橘子,苹果配苹果。数据集被分类成特定数量的簇,我们的 k 数,因此一个簇中的所有数据点都是同质的,同时与其他簇中的数据是异质的。很简单:
- 1.选择 k 个簇的数量。
- 2.选择一个随机的 k 点,质心。
- 3.将每个数据点分配到最近的质心(欧几里得)。
- 4.计算并放置每个簇的新质心。
- 5.将每个数据点重新分配给新的最近质心。
再次执行第 4 步…第 5 步,一遍又一遍…
随机森林
随机森林背后的基本思想是将许多决策树组合成一个模型。
*为什么?*作为一个委员会运作的大量相对不相关的模型(树)将胜过任何单个组成模型。
这个模型确保了 bagging *(允许每棵树随机地从数据集中进行替换采样,从而产生不同的树)*和特征随机性 (其中每棵树只能从随机的特征子集中选取,从而产生更多的变化)。
降维算法
虽然看起来不合逻辑,但是“多多益善”并不总是对的。由于这种类型的算法,我们通过获得一组主要变量来减少所考虑的随机变量的数量。 PCA (主成分分析) 缺失值比率 或 因子分析 就是一些例子。
梯度增强和 AdaBoost
我们的赢家! *其主要目标是什么?*进行高精度的预测。
我们将组合多个“弱或平均”预测器来构建一个强预测器。它结合了几种基本估计量的预测能力,以提高模型的稳健性。
这是最优秀的算法,也是当今最受欢迎的算法。
那么,下一步是什么?
现在开始,开始玩吧!这就是我要说的全部…
欢迎留言、鼓掌或分享这篇文章。以后的帖子关注 me 。
如果你想了解更多,你可以在 oscargarciaramos.com找到我
欢迎加入数据团队!请解决一切。(第一部分:问题)
数据产品不是灵丹妙药。
先说一个常见的情况。不管是勇敢的 MBA 市场实习生还是首席执行官,至少拥有一点权力的人都会面临一个难题。他们安排了一个项目启动会议,与不同的人一起集思广益,想出一个解决方案,并且知道如果它有任何机会被他们的上级批准,它将需要数据的支持。虽然他们让会议邀请对一些人来说是可选的,但他们确保来自数据分析或科学团队(以下称为“数据团队”)的一些人会出席。
简要说明:在我看来,关于数据分析和数据科学之间的区别,还没有达成共识。一家公司的数据分析师执行的任务符合另一家公司的数据科学家的工作描述。无论如何,当我在本文的其余部分和以后的文章中提到“数据团队”时,我指的是数据的最终用户,他们进行数据报告、分析和/或建模,以帮助组织实现其目标。他们不是数据工程师,任务是建立、维护和改进数据管道和其他基础设施。他们也不是机器学习工程师,他们正在构建集成到公司产品中的模型,如推荐器或算法定价系统。
让我们假设您在这个高要求数据团队中。一方面,你直接参与解决公司面临的一些最重要的问题。另一方面,你面临的一些问题很可能属于以下不幸的类别之一:
1。这个问题不是由数据提供的。
虽然在自然语言处理方面正在取得进展,但创造性写作最好留给人类。特别想到的是品牌信息。
我们没有得到成功的口号"牛肉在哪里?、就这么做,还是得了奶?“从大数据进入花哨的建模框架和动态仪表盘。事实上,如果我们想象一个可以访问历史品牌广告活动表现的数据和建模团队大量参与后两个活动的广告代理,我们可能会以“空气在哪里而告终?”和“牛奶在哪里?”这些广告商的目标是想出一个强有力的原创口号,让将与其他品牌区分开来。我分享的算法生成的口号显然是荒谬的,但它们揭示了一个事实,即历史广告数据和典型的建模技术不适合这个问题。
将创意作为 crtv 导入。照片由 Pixabay 从像素拍摄。
在最好的情况下,参与项目的数据人员会浪费他们的时间,并随着项目的进展礼貌地原谅自己。最坏的情况是,他们用令人印象深刻但不相关的分析迷惑涉众,挤走了需要由其他项目贡献者完成的实际工作。
随着越来越多的数据(尤其是新数据集)随着时间的推移而产生,因此决策对数据的依赖也在增加,我们会发现自己在这种情况下的频率低于后续情况。
2。问题是有数据告知的,但是你没有。
现在,假设你是一名初级数据科学家,在一家个人金融初创公司协助产品团队。你被要求帮助他们,因为你已经工作了几个月,在其他项目上表现出色,并证明了你了解公司的内部数据集。贵公司目前的产品是一种工具,它允许人们通过导入和显示信用卡消费来设置预算并跟踪预算。您公司的领导层希望扩大初创公司的产品种类,并考虑增加个人贷款或投资平台,但没有产品开发资源来同时完成这两项工作。他们希望利用您的数据能力来提出合理的预测,如潜在受众和预测的贷款和投资金额,以帮助他们选择要开发的产品。
让我们从个人贷款产品开始。我在上面提到过,我们可以访问信用卡消费,但如果进一步检查,我们的数据集可能也包含还款历史或未偿余额。使用这些信息,我们可以确定我们服务中的用户数量,我们认为这些用户会对信用卡支付整合的个人贷款感兴趣。如果我们能够获得未偿余额,我们甚至可以预测贷款金额。不错!
对于在我们的平台上识别潜在的投资者来说,这有点棘手,但我们有创造力和毅力。我们可以浏览我们的数据集,确定可能的投资者会进行的购买,例如订阅投资出版物,如 Barrons 、投资者商业日报和 Kiplinger 的个人理财,以及服务,如 The Motley Fool 和 Seeking Alpha 。为了预测在我们的潜在平台上可以投资的金额,我们可以选择我们可能的投资者,并应用一些假设,预测他们的收入和可投资的储蓄。太棒了。
我们向项目组的其他人介绍我们的方法和结果,用我们对棘手问题的冷静、冷静的回答给一些高管留下了深刻的印象。他们会审查您提供的信息,并决定使用您的作品来构建和发布哪种产品。你对自己得到的认可感到兴奋,你的公司必然会取得成功,你在做白日梦,想着如何在你职业生涯后期的开创性 ted 演讲中描述这段经历。
但是沉住气,在训练中,你错过了一些重要的东西。我想,这里有一些你没有解决的问题,这些问题很容易影响产品发布的选择:
- 竞争对手:对于我们的竞争对手,我们有太多的不了解。对于那些我们认为可能对个人贷款感兴趣的人,我们如何知道他们是否在积极考虑其他贷款提供商?我们的产品如何与那些竞争?类似的推理也适用于投资的例子,更糟糕的是,他们可能已经在其他地方投资,并且对他们选择的平台非常满意。尽管他们是我们平台上的重要客户,但我们没有赢得他们的机会,并且对此视而不见。
- 个人贷款的其他原因:仅从我们内部的信用卡消费数据来看,我们可能低估了个人贷款市场。获得个人贷款还有很多其他原因:为现有贷款再融资或支付紧急费用。在我们即将成为竞争对手的 LendingClub 上,只有 23%的个人贷款用于信用卡整合。
资料来源 : LendingClub 统计截至 2020 年 6 月 26 日。
- 其他各种原因:我们可能无法获得用户所有信用卡的数据,这影响了我们的销量估计;对于我们可能的美元投资估计,我们猜测信用卡消费的总收入,但不是所有的消费都发生在信用卡上;并不是所有有信用卡债务的人都需要或对个人贷款感兴趣…
那么,有什么解决办法呢?在第一次项目会议上,我们是否会先发制人地指出这些与拟议分析相关的突出问题,然后几周内无所事事?不。事实证明,有一些偷偷摸摸的方法可以代替或补充我们的内部数据分析来获取我们需要的数据:
- 求:可能就那么简单。让我们通过设计一份调查问卷并发送给用户来询问他们。显然,我们在准确性方面也有自己的一系列挑战(例如,当我们推出产品时,那些说要利用我们进行个人贷款的人真的会这样做吗?)、回复率(即,如果太多用户忽略调查怎么办?),以及抽样(即,如果非受访者与受访者在结构上不同怎么办?).好的调查设计可以帮助我们改善这些问题。作为奖励,我们甚至可以在调查中更详细地描述我们提议的服务,或者让用户告诉我们在个人贷款或投资服务中对他们来说什么是重要的。
- 让我们通过使用越来越流行的安慰剂按钮,让我们的用户给我们提供有用的信息。我们在网页上添加了一个按钮,标有“个人贷款”、“投资”或两者之一。当用户导航到那里时,他们被告知该功能尚不可用,但他们可以注册了解更多信息。我们甚至可以将此与 Beg 战略相结合,通过发送后续调查来确定可能的贷款和投资量、两种产品的预期功能,并进一步评估兴趣。
- 购买:让我们与第三方数据提供商合作,进一步了解我们的用户中有多少人对个人贷款或投资感兴趣,以及他们是否已经在使用有竞争力的服务。
期望其中一方(数据科学家或产品团队)知道寻找替代数据来解决问题公平吗?我的答案是否定的。数据科学家为他们的工作做准备的大部分课程都不涉及数据采购。甚至在问题集的第一个问题之前,他们通常会得到完成问题所需的数据集。倡导这些替代数据集不应该是他们的责任。同样,要求新数据的责任也不应该由产品人员承担。他们可能专注于其他一切:战略、设计、开发和上市计划。尽管这种情况令人沮丧,但我发现这三个类别中的下一个非常令人恼火。
3。问题是由数据告知的,你有数据,但没有人要求你这么做!
在这种情况下,组织如此接近做出正确的行动,但最终还是搞砸了。这就像学习了 SAT 考试中涵盖的所有概念,但却把错误类型的铅笔带到了考试中心。
你忘在家里的东西。照片由金·戈尔加在 Unsplash 上拍摄。
让我们想象一下,尽管在前面的例子中,我们的初创公司在决策过程中可能犯了一些错误,但我们已经成功地推出了个人贷款和投资服务。事情进展顺利,我们新雇了一位首席营销官(CMO),他想给首席执行官留下深刻印象。
CMO 自称是一个有创造力和远见的人。他总是有模糊的晚上计划。在他的 LinkedIn 个人资料照片中,他把一盆盆栽植物放在面前。他去年没去火人节是因为“他们毁了”(他们是谁?!).通过结合直觉、经验和吸毒的长期影响,他单方面决定让更多的大学生上你的网站将使公司进入“超增长”模式。他已经计划好了整个营销活动:专门针对 Z 世代的信息、学生品牌大使策划的游击营销策略、t 恤,但有一个问题:首席执行官希望看到支持这一大赌注的数据。为了得到 CMO 需要的数据,他需要你。
一天早上,你醒来时发现 CMO 在早上 5:53 分直接给你发了一封非常重要的电子邮件。你知道它非常重要,因为他添加了非常重要的标志,并在主题行中添加了“非常重要”。他直到最后一刻才开始填写演示文稿的数据幻灯片,并且需要了解贵公司活跃用户的平均生命周期价值(LTV) 。
你很兴奋,你建立的复杂的用户级 LTV 预测模型正在获得牵引力,并一直向上通过 c-suite 没有少!您已经设置了这个重要指标的自动报告,并催促他回复。
他对你表示感谢,并告诉你这个数字“比我预期的要好得多”,还说他欠你一杯啤酒,但就像急躁的人喝的一种非常特别的啤酒。在他得到你的回应后,他把平均 LTV 数放在一张幻灯片上,与这些大学生低得多的客户获取成本(CAC) 进行对比,证明有大量利润可赚。他在公园里睡了两个小时,完成了给首席执行官的报告。超增长,我们来了!
没那么快。如何使用你的分析发现各种问题?下面是一些被忽略的被收购用户的属性,这可能对我们不利:
- **大学生:**大学生可能有一些特定的特点,这些特点可能使他们比普通用户更有价值或更无价值。他们可能需要个人贷款服务,但不一定是大额信用卡债务合并,但可能是学生债务。你们公司的产品有竞争力吗?他们也不太可能需要一个投资平台,直到他们毕业之后。这两个特征可能意味着你提供的 CMO 的 LTV 数太高了。
- 新消息:你的平均 LTV 包括那些已经使用你的服务一段时间的用户和那些最近加入的用户。如果任期越长的越值钱,这也是你给 CMO 的 LTV 数太高的另一个原因。
- 主动:痛苦列车不断驶来。我们发送了活跃用户的平均 LTV,但是活跃用户到底是怎么定义的呢?让我们假设一个用户是活跃的,如果他们建立一个账户和导入信用卡数据,获得个人贷款,或投资金钱。如果 CMO 使用的是 CAC 估计值,其中包括刚刚开设账户的用户,会怎么样?这也是我们的 LTV 数过高的另一个原因。
整个情况最糟糕的部分是,如果我们知道 CMO 计划如何使用我们的号码,我们可能已经能够使用我们已经拥有的数据为这些用户发送更准确的 LTV 估计。我们可以将我们的 LTV 预测数据集分成新注册的大学生的子集,包括活跃的和不活跃的,以便更好地估计类似用户的价值。
总结,并提示解决方案
在这三种情况下,数据的使用方式都无法最好地实现组织的目标。在品牌口号的例子中,数据团队的努力分散了需要完成的实际工作,这些工作甚至不需要数据分析或建模。在个人贷款或投资特征的例子中,预先存在的数据被用于体面的效果,但是需要获得的新数据会更好。在营销收购的例子中,错误的数据点被用于通知计划,即使正确的数据点是可用的。
如示例所示,由于缺乏数据,这些问题更加频繁和严重。数据盲有各种形式。有些人,比如第一个例子中的人,希望数据能够提供更多的东西,从类固醇(加速增长)到万能药(修复一切)都可以。其他人把它看作是一个被勾选的框: ☑ 用过的数据。在我们的第二个例子中,产品团队让他们的决策完全依赖于糟糕的数据,我认为这反映了一种普遍的态度:如果一个决策是由数据决定的,那么它一定是一个好的决策。在第三个例子中,CMO 已经决定吸引更多的大学生加入我们的平台。他只需要处理向首席执行官展示数据点以获得她的批准的麻烦。数据请求者和提供者之间权限的巨大差异会加剧这些问题。数据盲越往上走,数据团队就越不可能澄清(或直接拒绝)请求。
因此,解决方案是让某人明确负责确保数据得到负责任和有效的使用。这个人首先确定数据对于完成一个项目的目标是否必要,寻找数据,如果数据不可用,甚至生成或获取数据。
我鼓励你花一点时间思考一下你希望谁来承担这些责任。他们的工作描述是什么样的?你希望他们拥有什么样的技能和背景?是否已经存在类似的角色或领域?在“欢迎加入数据团队!请解决一切。(第二部分:解决方案)”,链接如下!
[## 欢迎加入数据团队!请解决一切。(第二部分:解决方案)
数据产品不是灵丹妙药,但无论如何请负责任地饮用。
medium.com](https://medium.com/@jarussingh/welcome-to-the-data-team-please-solve-everything-part-ii-the-solution-91cc06d55316)
欢迎加入数据团队!请解决一切。(第二部分:解决方案)
数据产品不是灵丹妙药,但无论如何请负责任地饮用。
在"欢迎加入数据团队!请解决一切。(第一部分:问题),如果您还没有读过,我鼓励您去读一读,我分享了三个例子来说明组织滥用数据的常见方式。我们遇到的所有这三种类型的问题都可以通过让某人负责负责和有效地使用数据来解决。在这篇文章的结尾,我暗示了类似的角色在其他地方也存在。是图书管理员**!出于我们的目的,我们需要拥有更大权力的人,我称之为数据超级图书馆**。
那么,什么是数据超级图书馆?让我们从思考普通的非数据图书馆员的职责开始。图书馆员的任务是提供和维护信息。通过进行反事实分析,我们可以更好地理解图书馆员通过想象一个没有他们的世界所提供的价值。
在这个反事实中,我们是大学历史课的学生,我们的教授给我们布置了一篇关于珠宝在中世纪所扮演的角色的论文。奇怪的具体。我们参观了理论上没有图书馆的校园图书馆开始研究。我们穿过前门,在前台闲着,但是没有人帮助我们。没关系,我们自己找到历史部分,开始浏览。但是在一个没有图书馆员的世界里,没有人来组织书籍,甚至没有人来为不同的部分设计布局。我们面对的是随意摆放在书架上并散落在地板上的书籍!
我们开始拿起离我们最近的书,浏览它们的内容,但这需要太长时间。找到任何一本关于中世纪或珠宝的书的几率都很低,所以我们开始扫描书名。几个小时过去了,我们终于中了头彩!我们发现有一本书在书名中有封建称谓和一种珠宝。我们把它带回家,从头到尾读完,敲出我们的论文,第二天交一篇关于珠宝如何在中世纪发挥关键作用的文章,事实上,一个邪恶的领主为了统治人类而铸造了一枚戒指,多个王国组成的多样化的特种部队摧毁了它以确保我们的救赎。
我希望你喜欢我的宝贝,尽管这个例子有些夸张。让我们开始在 it 和商业世界之间进行比较。你可能认为书是数据,但是我想用一个更宽泛的定义。图书馆的书籍是一个组织目前拥有的数据产品,如报告、分析或建模。图书馆顾客是使用数据产品的商业利益相关者。在没有任何图书馆员指导的情况下,他们在数据产品中搜寻,直到找到一个他们认为可以解决问题的产品——即使这个产品不适合或不符合他们的目的。
图片作者。
当一个组织有一个数据管理员时,这个人可以将涉众与适当的数据产品联系起来。这可以对业务成果产生巨大的积极影响。适用于其用例的数据产品提供了改进优化的信息(例如,我们公司可以盈利的获取用户的最大数量是多少?)和决策制定(例如,是否有足够的需求来证明开发新功能的合理性?).
图片作者。
数据超级图书馆员甚至比他们的非超级同行拥有更大的权力和责任。他们还可以联系内部数据团队成员和外部服务,以委托最能解决业务问题的数据产品。在下图中,他们认识到需要现有的和新的数据来解决利益相关者的问题,这些数据可以是内部生成的(如调查数据)或外部生成的(如从第三方购买的),并将数据团队成员与这两种来源联系起来,为给定的用例创建最佳的数据产品。
图片作者。
我希望我已经让你相信这是组织中的一个关键角色,并且我不是唯一一个这样想的人。拥有一个数据超级图书馆的想法并不新鲜。在为本文做研究的过程中,我偶然发现了各种类似的职位,比如数据翻译、数据策略师和数据产品经理。尽管一些组织意识到了数据超级图书馆员的重要性,但对这类工作的讨论远远少于对数据科学、机器学习和人工智能的讨论。我将在下一篇文章“欢迎加入数据团队”中深入探讨为什么我认为这项工作普遍被低估了。请解决一切。(第三部分:被忽略的解决方案)”,链接如下。
[## 欢迎加入数据团队!请解决一切。(第三部分:被忽略的解决方案)
数据产品不是灵丹妙药——因为利益相关者更像图书馆的顾客,而不是巫师。
medium.com](https://medium.com/@jarussingh/welcome-to-the-data-team-please-solve-everything-part-iii-the-solution-ignored-f61573ac56c7)
欢迎加入数据团队!请解决一切。(第三部分:被忽略的解决方案)
数据产品不是灵丹妙药——因为利益相关者更像是图书馆的老顾客,而不是弱者。
这篇文章是我的“欢迎加入数据团队!请解决一切”系列。在第一篇文章中,我分享了组织中常见的数据误用,这是由非数据人员的过度自信或天真造成的。
数据产品不是灵丹妙药。
towardsdatascience.com](/welcome-to-the-data-team-please-solve-everything-part-i-the-problem-13a157551804)
第二,我建议这个问题的解决方案是给某人一个数据超级图书馆员的职责——通常被称为 数据翻译数据战略家 或 数据产品经理——他决定哪些现有的数据产品最适合于实现企业的目标,并且如果需要,还有权委托新的产品。
[## 欢迎加入数据团队!请解决一切。(第二部分:解决方案)
数据产品不是灵丹妙药,但无论如何请负责任地饮用。
towardsdatascience.com](/welcome-to-the-data-team-please-solve-everything-part-ii-the-solution-91cc06d55316)
数据超级图书馆员决定这些产品是否应依赖预先存在的或尚未生成的(例如通过调查)或获取的(例如通过第三方)数据。尽管这一角色的责任很重要,但大多数数据科学和分析文章、讲座和课程都侧重于学习和应用统计或预测技术。虽然掌握编程语言和算法很重要,但在您的大型数据组织中有人负责有效地使用数据对于成功至关重要。以下是阻碍数据超级图书馆获得更多关注的态度。
组织没有意识到角色的存在
作者 Mummelgrummel——自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=25796381
让我们考虑一个常见的情况。业务领导和数据团队为解决业务的一个关键问题开了一个长会,双方都不满意地离开了。数据团队不能回答简单的问题,解释他们提出的解决方案,并同意交付具体的结果,这让业务领导感到沮丧。数据团队感到沮丧的是,业务领导过度简化问题,不理解简单的统计概念,并频繁改变需要解决的问题的范围。
无论是否公开承认,双方都不得不接受与对方进行无益的互动。“这就是他们的方式,”两个团体的成员都声称。由于这种态度,双方都没有意识到中间人的必要性,此外,他们的态度使他们意识不到——随着思维的转变和一些培训——填补这一角色的人不需要成为外部雇员,也可以是他们中的一员。
也是一种我们不知道自己不知道的情况。不像在工厂车间闲置机器或运送有缺陷的产品,这是显而易见的问题,对于任何相关人员来说,组织没有有效地使用数据并不明显。
组织认为他们不需要这个角色
公司里谁负责决策通常是显而易见的。最有影响力的决策是由首席执行官制定的,或者至少是由首席执行官审核和批准的。下一层决策仍然是重要的,并且可能需要领域专业知识,是由剩余的高层管理人员做出的。随着我们沿着链条往下走,我们变得越来越专业化,影响力越来越小。这有道理;决策的影响力越大,决策者做出正确选择所需的资源和权力就越大。如果某个底层的人由于精明的决策对公司产生了不成比例的巨大影响,那么他们早就该升职了!
决策过程怎么样?谁对此负责?在这里,我怀疑大多数组织无疑是在以下假设下运作的:
负责决策的人* 也应该*负责请求最有助于做出决策的数据产品。
通过雇佣数据超级图书馆员来确定最合适的数据产品,为决策提供信息,决策者正在放弃一项他们可能认为是其工作一部分的责任,一项他们可能不一定做得特别好的责任,特别是如果他们没有在负责任的数据应用方面的强大背景。这些高管不愿意相信任何其他人,甚至是一个熟练的专家,可以改善他们的决策过程。
作者 Jacob Peter Gowy—http://www . museodelprado . es/imagen/alta _ resolution/p 01540 _ 01 . jpg,公共领域,【https://commons.wikimedia.org/w/index.php?curid=27493281】T2
组织假设他们的数据团队管理已经在扮演这个角色
我发现,商业领袖对数据的二元态度常常是这种假设的基础。在本系列第一篇文章的第三个例子中,我谈到了一位假设的高管,他认为使用数据来支持他的决策是不方便的。对他来说,与预期目的相关的数据质量并不重要;这位高管只需要用足够的相关表面数据点来填充一副牌,以确保他的项目获得批准。
我见过这种同样的二元态度被应用到那些处理数据的人身上。假设您是数据团队的一员,通常只需要 SQL、Python、R、Tableau 或 Excel 的基础知识,您总是知道支持给定任务的合适或最佳数据产品。我们可以理解为什么他们会有这种想法。如果您自己在有效使用数据方面没有太多经验,但您看到它几乎被普遍应用,而且经常取得难以置信的成功,它看起来像是企业的灵丹妙药。如果数据产品是灵丹妙药,那就意味着创造它们的人一定是巫师。你不要干涉他们的神秘药水制作过程;你退后,给他们需要的资源,毫无疑问地一饮而尽。
作者威廉·亨利·马杰特森——http://d . lib . rochester . edu/Camelot/image/Margetson-she-was-known-have-study-magic(已剪辑),公共领域,https://commons.wikimedia.org/w/index.php?curid=69727077
尽管所有相关人员都希望如此,我还是要把我的魔药食谱放回架子上,脱掉我的斗篷,并解释为什么不是这样。iRobot 的分析、数据科学和机器学习主管安吉拉·巴萨(Angela Bassa)表示:“(T2)任何数据科学团队的经理之所以成为经理,是因为他们是伟大的个人贡献者。“我们可能会同意,这些战场提拔的数据科学经理是强有力的思想家,毕竟,他们是如何获得晋升的,但这并不能使他们免受偏见(心理的,而不是统计的)。
我接触过的大多数数据科学家都是在内部的、用户生成的数据上积累经验的,这是有充分理由的。如何收集的细节都有记录。有很多。一旦数据管道到位,它实际上是免费的。从一组用户行为中收集到的见解可以直接应用于产生这些行为的用户。
但是如何判断其他数据的相对有用性呢?当涉及到开发新功能时,是否完全依赖于对内部数据的用户细分分析来确定应该鼓励哪些行为来提高整体参与度?一个人会调查用户的潜在功能吗?他完全知道收集的数据可能不可靠。如果一个人既做内部分析又做外部分析,他如何权衡每一种分析的结果?在这个世界上,大多数数据科学管理人员最喜欢使用大量内部用户生成的数据来提出建议,调查数据是否得到了适当的重视?它甚至是作为一个选项提出来的吗?如果数据科学管理人员对如何有效地将调查数据集成到他们的分析中没有信心,他们就没有动力谈论调查数据。宣传你的弱点不是一个成功的策略。传统的数据科学管理人员不是我们要找的超级图书馆员,因为他们对图书馆的某些部分比其他部分更熟悉,因此更有可能误导他们的顾客。
充满希望的结论
事实证明,我们需要我们的数据超级图书馆员拥有的纪律是存在的!它被称为决策智能,自 2018 年以来一直在谷歌由他们的首席决策官凯西·科济尔科夫领导开发。在为这篇文章做研究时,我了解到她写了关于数据科学领导的问题——以及其他所有人——没有得到足够的培训来改进决策和最大限度地提高数据产品的有效性。作为一门新兴学科,在谷歌、麦肯锡和 Instagram 等公司内部发展(名称不同),目前没有太多资源可以开始学习它。
由 Jeremykemp 在英文维基百科,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=10547051。作者所做的编辑。
如果你现在想在你的公司推出一个包装整齐的解决方案,这是一个令人沮丧的消息,但如果你想帮助发展这个学科并使其最佳实践民主化,这是一个巨大的机会。就我而言,我很高兴通过决策智能的视角来查看我所有的个人和工作数据项目,付出额外的努力来评估不同技术和框架的有效性,并分享我的发现。通过这样做,我回答了 Kozyrkov 在 2018 年发出的挑战,即“T16 加入[她]的行列,承认[决策智能]是一门独立的学科,并尽可能广泛地[产生以及]分享我们的智慧。“我希望我的系列文章为你做同样的决定提供足够的数据。
数据科学家与钟形曲线的幽会
以及为什么数据科学家无法逃脱它
弗兰基·查马基在 Unsplash 上拍摄的照片
对于我们大多数人来说,数据科学和机器学习最可怕的部分是其中涉及的数学和统计学。
如果你是一个科学家,你必须有一个答案,即使在没有数据的情况下,你也不会成为一个好科学家。
-尼尔·德格拉斯·泰森
每个人都有自己培养对数据和数据科学的热爱的方式。对我来说,理解基础知识就像变魔术一样。曾经,我掌握了数据类型、分布和分布形状等基本概念。,深入研究高级概念是相当容易的。
我们来分解一下。
数据科学项目的主要输入是观察值:换句话说就是“特征值”。这些特征值(也称为变量)可以是定量的,也可以是定性的。
如果你的焦虑水平仅仅因为阅读这两个术语而增加,并且在你看完所有定量和定性数据之前你不会前进,请看下图。
作者图片
不要对自己太苛刻。先来了解一下这两种类型。
1.定量/数字数据
如果你能把数据加、减、乘、除,那就是定量的。数字数据被进一步细化为
- 连续数据:可测量的数据。可以取任何值。例如:比赛时间、个人收入、个人年龄等。比赛中的时间可以是任何值,可以是小时、分钟、天等等…对值没有限制。
Jonathan Chng 在 Unsplash 上拍摄的照片
- 离散数据:有限的和可计数的数据。只能接受某些整数值。《出埃及记》掷骰子的结果,一个班的学生人数,一朵花的花瓣。如果你掷骰子,你可以得到 1,2,3…最多 6 个。可能性是有限的。
吉列尔莫·贝拉尔德在 Unsplash 上拍摄的照片
1.1 连续数据
如果您打算为金融机构、零售行业等企业工作,那么您在数据科学领域的大部分时间都将与连续数据打交道。顾名思义它就像水一样。就像水可以流向任何地方一样,连续的数据可以取任何值。
要理解连续数据,你必须找到以下问题的答案。
- 数据的意义是什么?
- 数据值有多分散?即方差。
- 关于平均值,总体数据分布是什么?
- 有没有异常值?即标准偏差。
虽然我不想用公式来吓唬你,但只是触及表面并无大碍。
连续数据分布的均值是如何计算的?
连续数据分布的方差是如何计算的?
方差计算为平均值和单个值之差的平方和。
连续数据分布的标准差是如何计算的?
标准差是方差的平方根。
连续数据分发:
既然您已经了解了如何度量连续数据的均值、方差和标准差等具体细节,那么让我们来了解一下它的分布性质。
连续数据遵循以下分布之一。
- 正态分布
- t 分布
正态分布
我们周围的大部分事物都遵循正态分布。
奇怪!!
这个怎么样,如果你取你国家的人的身高,创建一个身高范围和该身高人数的图表,它将是正态分布,图表将类似于下图。
正态分布:作者图片
你可能会想,这是不可能的。
这看起来很奇怪,但却是真的。自然界中的许多其他东西。血压、智商、鞋码、出生体重,以及某种程度上的科技股市场,都遵循这个钟形曲线形状,数据以平均值为中心,并在平均值的两侧显示对称分布。
当我们谈论对称分布时,你也应该记住下面的公式来计算数据分布的偏斜度。
正态分布数据的偏斜度为 0。
你可能永远都不需要它,但是万一你需要,下面是绘制这个图表的方程式
以下是正态分布的主要特征。
- 数据总体均值和中值是相同的。
- 大多数数据点都以平均值为中心。
- 数据点以对称的方式分散在平均值周围。
埃文·丹尼斯在 Unsplash 上的照片
如果你还在读这篇文章(我希望你是!!),现在您一定在想,为什么您需要理解数据分布呢?
答案是一个词概括。
作为数据科学家,你可能会遇到很多垃圾数据、离群值等。来到你身边,你将会被迫去理解这些数据的意义,并根据这些数据来预测下一步的行动。
如果您了解数据分布的整体性质,您就可以排除离群值和不需要的数据,并使信息有意义。
记住这句“宇宙无混沌!”。
数据分布遵循一种模式。除了决策树之外,大多数机器学习模型期望具有连续数据的特征遵循正态分布。您可能会遇到这样的情况,即特征值本身并不遵循正态分布,但是如果您对值应用类似 log 的函数,它将遵循正态分布。
统计学家喜欢正态分布。一些统计学家会试图用正态分布中的连续数字来拟合每个观察值。有些人认为,如果数据总体不符合正态分布,这意味着我们没有足够的观察数据。
任何关于正态分布的讨论不提及 z 得分都是不完整的。z 得分表示特定数据值与数据总体的平均值有多远。下面是 z 分数的公式。
如果您计算数据总体中每个数据点的 z 得分,并根据标准差绘制它们,结果如下所示
https://www . int math . com/counting-probability/14-normal-probability-distribution . PHP
这被称为标准正态分布。标准正态分布的主要特征是
- 它遵循正态分布。
- 平均值、中值和众数值为 0。
- 68.27%的数据位于 1 个标准差以内。95.45%的数据位于 2 个标准偏差内,99.73%的数据位于 3 个标准偏差内。
z score 将帮助您在特征工程期间发现异常值并验证零假设(p 值)和反向消除。
示例:如果特征值的 z 得分小于 1.96 且大于 1.96,则拒绝零假设。
在结束我最喜欢的话题,正态分布之前,我先给大家讲讲中心极限定理(CLT) 。
根据中心极限定理,如果你从一个数据群体中取几个样本,计算平均值并绘制平均值的频率,它将看起来像一个正态分布。样本数量越多,就越符合正态分布。即使从中抽取样本的总体数据不符合正态分布,也是如此。
这不是很奇怪吗!!!
这篇文章太大了。让我们总结一下正态分布,然后继续讨论 t 分布。
1.1.2 t 分布
现在你已经理解了正态分布和 CLT,是时候复习一下 t 分布了。
根据 CLT,只要样本量足够大(至少 30 次观察),样本的均值就遵循正态分布。因此,如果您知道数据总体的标准偏差,您可以计算 z 得分,并且使用正态分布,您可以使用样本平均值来评估概率。
如果样本量很小,并且不知道总体的标准差,该怎么办?当数据科学家遇到这样的约束时,他们依赖于 **t 分布。**计算如下。
数据科学家在无法使用正态分布的情况下使用 t 分布来分析数据集。数据总体应该是近似正常的。
作为一名数据科学家,您将在以下情况之一中使用 t 分布。
- 如果数据大小大于 10 但小于 30。如果数据总体大小小于 30,则太小,无法显示正态分布。
- 您经常会遇到这样的情况,您有数百万的数据要处理,而您不知道数据的分布(标准偏差)。在这种情况下,您必须首先获得少量数据样本(样本大小相同),然后计算其平均值、中值、众数、方差和标准差。基于这些样本大小的值,你将不得不推导出整个人口的这些值。
对了,t 分布也叫学生分布。但是,与学生使用这些统计数据无关。阅读下面链接背后的历史。
威廉·戈塞特是一名为吉尼斯啤酒厂工作的英国统计学家。他为…开发了不同的方法
365datascience.com](https://365datascience.com/explainer-video/students-t-distribution/)
如果您想在 excel 中体验这些发行版,下面的链接包含了您可以使用的交互式 Excel 模板。
[## 交互式电子表格介绍商业统计-第一版加拿大
本书中使用的交互式电子表格已被锁定,除了允许学生…
opentextbc.ca](https://opentextbc.ca/introductorybusinessstatistics/back-matter/appendix-interactive-spreadsheets-editable/)
2.定性/分类
安德鲁·斯图特斯曼在 Unsplash 上的照片
分类数据没有数学意义,因为像加、减、乘、除这样的数学运算不能在这样的数据上执行。例如,加拿大的省份是一个分类变量。你不能像数学数字一样比较这些省份。分类数据可以进一步分为。
- 二项式数据
- 标称数据
- 序数数据
不幸的是,我现在需要结束这篇文章。我喜欢理解数据,而且我可以继续下去。但是太大的文章意味着被出版商拒绝:(
如果你是一名有抱负的数据科学家,一定要培养你对数据的热爱。并且,爱因理解而绽放,所以花必要的时间去理解数据和它的本质。
参考:
加入最全面的机器学习实践课程,因为现在是开始的时候了!从基础…
www.udemy.com](https://www.udemy.com/course/applied-machine-learning-hands-on-course/?referralCode=00F08274D257B06E3201) [## 端到端机器学习
Sanrusha 是基于机器学习和人工智能的解决方案的领先提供商。我们努力通过使用人工智能让生活变得更美好。
www.youtube.com](https://www.youtube.com/c/endtoendmachinelearning)
我们总会有续集
卡斯帕·卡米尔·鲁宾在 Unsplash 上的照片。这幅作品的标题灵感来自在《卡萨布兰卡》中的这一幕。
数据工程
为什么 SQL 会在数据工程、数据科学和软件开发领域占据一席之地
第一次做对的技术往往会持续很长一段时间。SQL 就是这些技术中的一种。然而,像许多伟大的技术一样,它在早期的迭代中不得不经历一些变化。在设计这种语言时,我们投入了大量的思考,让它易于理解,易于使用,并发挥其最大的威力。
SQL 为什么不消失
虽然许多人预测 SQL 的死亡,但它拒绝死亡。SQL 带来了许多独特的东西。没有可行的替代方案能像 SQL 那样提供灵活性、强大的功能和易用性。这些年来,有几件事让 SQL 生存了下来
- SQL 的通用性和可接受性已经在几十年中得到证明
- SQL 查询的强大威力和探索所有可能的数据访问模式
- 以最有效的方式表达结构化和关系数据的能力以及以确定性方式分析数据的能力
使用 SQL 还有更多原因,更不用说市场上已经存在的训练有素的劳动力,不仅包括软件工程师,还包括数据分析师、营销和销售人员、数据工程师等等。他们说数据是世界上最有价值的资源。如果是这样的话,SQL 是最有价值的技能,因为 SQL 是数据说话的语言。
为什么有人说 SQL 已死
在给它取名关系模型死了,SQL 死了,我自己也感觉不太好之后,发表在 SIGMOD Record Journal 上的论文的六位作者得出了以下结论——
我们都相信关系数据库系统和 NoSQL 数据库系统将继续共存。在大型、分散、分布式环境的时代,设备和数据的数量及其异构性正在失去控制,数十亿个传感器和设备收集、通信和创建数据,而 Web 和社交网络正在扩大数据格式和提供商的数量。 NoSQL 数据库最适合这类应用,它们要么不需要 ACID 属性,要么需要处理用关系术语 笨拙表示的对象。
总之,NoSQL 数据存储似乎是商业企业可以选择的附加设备,以完成其存储服务的分类。
学习 SQL 有多重要
SQL 天生就是一种简单易学的语言。这是它如此受欢迎的原因之一。学习如何编写 SQL 并不真的需要有计算机科学背景。产品经理、数据分析师、业务分析师、营销助理、销售主管、数据工程师、数据科学家、软件工程师——这些都是 SQL 有用的工作。有些人在谈论 为什么学习 SQL 很重要的时候,相当简洁地在 Reddit 线程上写道。
这就像为了运动而知道如何走路一样。基本水平,但很重要。
在一个 YCombinator 线程中,人们讨论 为什么 SQL 正在击败 NoSQL ,以及这对数据的未来意味着什么。关于 SQL 是什么和不是什么,它有多优雅或丑陋,SQL 的正交性问题,处理大规模数据的问题,以及在许多情况下对 SQL 带给您的所有功能的热爱,都出现了有趣的观点。
谁应该学习 SQL?为什么要学习 SQL?
第一个问题的答案是每个和数据打交道的人。SQL 是最重要的技能,是利用数据价值所需要的——不管你的数据放在哪里。如前所述,大多数数据技术都有某种 SQL 接口。Atlassian 的吉拉有 JQL,Salesforce 有 SOQL,Kafka 有 KSQL 等等。不可否认的是,每种数据技术都必须支持一种新的方言或 SQL 风格。这是去年 StackOverflow 开发者调查的快照。
不必要的批评
人们批评 SQL 不能帮助查询非结构化数据和实时查询数据。该语言旨在查询结构化的持久数据。不能责怪语言没有做它从未承诺或声称要做的事情。就像问这车为什么不飞?然而,许多基于 SQL 的包装器和层已经被引入市场,并被混合采用。
SQL 被设计成既可以作为交互式查询的独立语言,也可以作为 OLTP 的应用程序开发语言。
所有查询语言之母
我的个人经历
作为数据行业的一员,我多年来一直听说 SQL 的死亡,但它似乎不会消失。大约十年前,当大数据获得牵引力时,人们认为这将是传统数据系统的末日。事实证明情况并非如此。每天编写代码的业内人士可能知道,关系数据库和 SQL 不会很快走向任何地方。原因是,
SQL 是数据交流的语言