TowardsDataScience 博客中文翻译 2020(一千零一十八)
## 完全理解精确度、召回率和 F 分数的概念Google Cloud 上的机器映像让您轻松创建、备份、恢复和共享您定制的虚拟机。如果将磁盘映像、快照和实例模板结合起来,就可以得到它们。(呃,好吧,生孩子不是这样的。虚拟机镜像轻松创建、备份、恢复和共享虚拟机。哦,如果你预算紧张,你会以一种你永远不会喜欢虚拟机副本的方式喜欢它们。创建地块后对其进行自定义涉及到在地块顶部添加特征以增加可读性或信息。*
如果你的 ML 算法表现不好
罗布·施莱克希斯在 Unsplash 上拍摄的照片
如何发现问题
我们花了这么多时间开发机器学习算法。但是在部署之后,如果该算法表现不佳,就会变得令人沮丧。问题是,如果算法没有达到预期效果,下一步该怎么办。哪里出了问题?训练数据的数量足够吗?我们使用了正确的功能吗?我们应该继续收集更多的数据吗?我们可以,但是那非常耗时而且昂贵。我们应该增加更多的功能吗?那也会很贵。
往哪个方向走?
如果你的机器学习算法没有达到预期效果,下一步该怎么办?有几个选项:
- 获取更多的训练数据非常耗时。甚至可能需要几个月才能获得更多的研究数据。
- 获得更多培训功能。这也可能需要很多时间。但是,如果添加一些多项式功能的作品,这是很酷的。
- 选择一组较小的训练特征。
- 增加正则项
- 减少正则项。
那么,接下来你应该尝试哪一个呢?开始尝试任何事情都不是一个好主意。因为你可能会在一些没有帮助的事情上花费太多时间。你需要首先发现问题,然后采取相应的行动。学习曲线有助于轻松发现问题,从而节省大量时间。
学习曲线对于确定如何提高算法的性能非常有用。确定算法是否存在偏差或欠拟合、方差或过拟合,或者两者兼而有之是很有用的。
学习曲线如何工作
学习曲线是成本函数的曲线。同一图中训练数据的成本函数和交叉验证数据的成本函数给出了关于算法的重要见解。提醒一下,下面是成本函数的公式:
换句话说,它是预测输出的平方减去原始输出除以两倍的训练数据。为了制作学习曲线,我们需要将这些成本函数绘制成训练数据数量(m)的函数。我们将只使用训练数据的一个较小子集来训练数据,而不是使用所有的训练数据。
请看下图:
这里是概念
如果我们用太少的数据来训练数据,算法将完全适合训练数据,并且成本函数将返回 0。
上图清楚地显示,当我们只使用一个、两个或三个数据训练数据时,算法可以很好地学习这几个数据,训练成本为零或接近于零。但是这种类型的算法不能在其他数据上很好地执行。
当您尝试用此算法拟合交叉验证数据时,它很可能在交叉验证数据上表现不佳。因此,交叉验证数据的成本函数将返回一个非常高的值。
另一方面,当我们采用越来越多的数据来训练算法时,它将不再完全适合训练数据。所以,培训成本会变得更高。
同时,由于该算法是在大量数据上训练的,它将在交叉验证数据上执行得更好,并且交叉验证数据的成本函数将返回更低的值。以下是如何建立一条学习曲线。
开发一个学习算法
我将一步步演示如何绘制学习曲线。为了绘制学习曲线,我们首先需要一个机器学习算法。为了简单起见,我将使用线性回归算法。我们先开发一个线性回归算法。
首先,导入包和数据集。我在这里使用的数据集取自吴恩达在 Coursera 上的机器学习课程。在该数据集中,X 值和 y 值被组织在 Excel 文件中的不同工作表中。
提醒一下,X 是我们将用来开发和训练机器学习算法的功能。y 是我们需要预测的输出特征。
交叉验证数据的 x 和 y 值也组织在同一个 Excel 文件的另外两个工作表中。我在本文末尾提供了数据集的链接。请随意下载数据集并自己练习。
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
file = pd.ExcelFile('dataset.xlsx')
df = pd.read_excel(file, 'Xval', header=None)
df.head()
同样,导入定型集的 y 值:
y = pd.read_excel(file, 'yval', header=None)
y.head()
让我们快速开发线性回归算法。
定义假设
线性回归使用非常基本的线性方程进行预测,我们在学校都学过。公式如下:
Y = C + BX
对于机器学习,我们使用不同的术语。
这里,“h”是假设或预测值,θ0 和θ1 是系数,X 是输入特征。
这里,我们已经有了 x。我们必须计算’ h '并且它应该与 y 的值匹配。因为我们的目标是能够预测 y 的值。
θ0 和θ1 在开始时被随机初始化。我们将通过迭代不断改进θ0 和θ1 的值。
在每次迭代中,我们将使用成本函数和梯度公式来计算成本,以更新θ值
成本函数和梯度下降
成本函数为我们提供了关于预测值与原始输出要素的差异的想法。这里,我们的输出特征是 y,预测输出将是‘h’。因此,成本函数会告诉我们“h”偏离“y”多少。我们希望成本函数值尽可能低。
下面是成本函数的公式:
我们将继续运行算法,直到成本函数最小。在每次迭代中,我们使用梯度下降来更新θ值。
为了更新θ值,我们将从先前的θ值中减去梯度下降。当我们把它编码的时候,它会变得更加清晰。
这里,m 是训练数据的数量,α是学习率。
开发线性回归算法
使用上述公式开发假设和成本函数。
m = len(df)def hypothesis(theta, X):
return theta[0] + theta[1]*Xdef cost_calc(theta, X, y):
return (1/2*m) * np.sum((hypothesis(theta, X) - y)**2)
现在,我们将定义梯度下降来优化参数θ0 和θ1。在每次迭代中,我们将更新θ值,并跟踪成本函数和θ值。
最后,它将返回每次迭代中的成本列表 theta 值。代码很简单。请检查这里。
def gradient_descent(theta, X, y, epoch, alpha):
cost = []
theta_hist = []
i = 0
while i < epoch:
hx = hypothesis(theta, X)
theta[0] -= alpha*(sum(hx-y)/m)
theta[1] -= (alpha * np.sum((hx - y) * X))/m
cost.append(cost_calc(theta, X, y))
i += 1
return theta, cost
完成了线性回归算法。我们需要一种方法来预测产量。在预测方法中,我们将使用来自梯度下降函数和假设函数的最终θ来进行预测。
def predict(theta, X, y, epoch, alpha):
theta, cost = gradient_descent(theta, X, y, epoch, alpha)
return hypothesis(theta, X), cost, theta
现在,将参数初始化为零,并使用预测函数来预测输出变量。
theta = [0,0]
y_predict, cost, theta = predict(theta, df[0], y[0], 1400, 0.001)
更新后的θ值为:[10.724868115832654,0.3294833798797125]
现在,将预测输出(h)和原始输出(y)与 df 或 X 绘制在同一个图中。
plt.figure()
plt.scatter(df, y)
plt.scatter(df, y_predict)
看起来算法运行良好。预测的输出线从中间位置开始。
是时候开发学习曲线了!!!
画一条学习曲线
现在,我们可以画一条学习曲线。首先,让我们为交叉验证数据集导入 X 和 y 值。正如我前面提到的,我们将它们组织在单独的 Excel 表格中。
file = pd.ExcelFile('dataset.xlsx')
cross_val = pd.read_excel(file, 'X', header=None)
cross_val.head()
cross_y = pd.read_excel(file, 'y', header=None)
cross_y.head()
为此,我想稍微修改一下 gradient_descent 函数。
在之前的 gradient_descent 函数中,我们计算了每次迭代的成本。我这样做是因为在传统的机器学习算法开发中,这是一个很好的实践。
但是对于学习曲线,我们不需要每次迭代的成本。因此,为了节省运行时间,我将排除在每个时期计算成本函数。我们将只返回更新的参数。
def grad_descent(theta, X, y, epoch, alpha):
i = 0
while i < epoch:
hx = hypothesis(theta, X)
theta[0] -= alpha*(sum(hx-y)/m)
theta[1] -= (alpha * np.sum((hx - y) * X))/m
i += 1
return theta
正如我前面所讨论的,为了开发学习曲线,我们需要用不同的训练数据子集来训练学习算法。
在我们的训练数据集中,我们有 21 个数据。我将只使用一个数据来训练算法,然后使用两个数据,然后使用三个数据,直到 21 个数据。
因此,我们将在训练数据的 21 个子集上训练算法 21 次。我们还将跟踪每个训练数据子集的成本函数。请仔细看看代码,会更清楚。
j_tr = []
theta_list = []
for i in range(0, len(df)):
theta = [0,0]
theta_list.append(grad_descent(theta, df[0][:i], y[0][:i], 1400, 0.001))
j_tr.append(cost_calc(theta, df[0][:i], y[0][:i]))
theta_list
以下是每个训练数据子集的训练参数:
以下是每个培训子集的成本:
查看每个子集的成本。当训练数据只有 1 个或 2 个时,成本为零或几乎为零。随着我们不断增加训练数据,成本也在增加,这是意料之中的。
现在,对所有训练数据子集使用上述参数来计算交叉验证数据的成本:
j_val = []
for i in theta_list:
j_val.append(cost_calc(i, cross_val[0], cross_y[0]))
j_val
一开始,成本确实很高,因为训练参数来自太少的训练数据。但是随着更多训练数据参数的改善,交叉验证误差持续下降。
让我们在同一个图中绘制训练误差和交叉验证误差:
%matplotlib inline
import matplotlib.pyplot as plt
plt.figure()
plt.scatter(range(0, 21), j_tr)
plt.scatter(range(0, 21), j_val)
这是我们的学习曲线。
从学习曲线中得出决策
上面的学习曲线看起来不错。它正按照我们预期的方式流动。刚开始的时候,训练误差太小,验证误差太高。
慢慢地,他们彼此完全重叠。所以那是完美的!但在现实生活中,这种情况并不经常发生。
大多数机器学习算法第一次并不完美。几乎每时每刻都有一些我们需要解决的问题。在这里我将讨论一些问题。
我们可能会发现我们的学习曲线是这样的:
如果训练误差和验证误差之间存在显著的差距,则表明存在高方差问题。这也可以被称为过度拟合问题。
获取更多的训练数据或选择更小的特征集,或者两者兼有,可能会解决此问题。
如果一个学习曲线看起来像这样,这意味着在开始的训练误差太小,验证误差太高。慢慢地,训练误差变高,验证误差变低。但是在某一点上它们变得平行。从图中可以看到,在一个点之后,即使有更多的训练数据交叉验证误差也不会再下降了。
在这种情况下,获得更多的训练数据并不会改善机器学习算法。
这表明学习算法正遭受高偏差问题。在这种情况下,获得更多的培训功能可能会有所帮助。
修复学习算法
假设,我们正在实现线性回归。但是算法并没有像预期的那样工作。
做什么?
首先,像我在这里演示的那样画一条学习曲线。
- 如果您检测到一个高方差问题,根据特性的重要性选择一个较小的特性集。如果那有帮助,那将节省一些时间。如果没有,尝试获取更多的训练数据。
- 如果您从学习曲线中发现高偏差问题,您已经知道获得额外功能是一个可能的解决方案。您甚至可以尝试添加一些多项式特征。大量的时间有助于节省大量的时间。
- 如果你正在实现一个带有正则项λ的算法,如果该算法正遭受高偏差,尝试减少λ,如果该算法正遭受高方差问题,尝试增加λ。这里有一篇文章详细解释了正则项与偏差和方差的关系:
本文解释了机器学习算法性能差的原因以及如何改进它。
towardsdatascience.com](/how-to-improve-a-machine-learning-algorithm-regularization-144a6697c2be)
在神经网络的情况下,我们也可能会遇到这种偏差或方差问题。
对于高偏差或欠拟合问题,我们需要增加神经元的数量或隐藏层的数量。为了解决高方差或过拟合问题,我们应该减少神经元的数量或隐藏层的数量。我们甚至可以使用不同数量的神经元来绘制学习曲线。
非常感谢您阅读这篇文章。我希望这有所帮助。
更多阅读:
在这个页面中,你会找到几个非常流行的机器学习算法的教程链接:
[## Python 中从头开始的 k 均值聚类算法:分步指南
并学习使用它来降低图像的维数
towardsdatascience.com](/k-mean-clustering-algorithm-from-scratch-in-python-and-dimensional-reduction-step-by-step-guide-9ebabe5ca433) [## Python Matplotlib 的日常备忘单
完整的可视化课程
towardsdatascience.com](/your-everyday-cheatsheet-for-pythons-matplotlib-c03345ca390d) [## 使用 Python 从零开始的多类分类算法:分步指南
本文介绍两种方法:梯度下降法和优化函数法
towardsdatascience.com](/multiclass-classification-algorithm-from-scratch-with-a-project-in-python-step-by-step-guide-485a83c79992) [## 完全理解精确度、召回率和 F 分数的概念
机器学习中如何处理倾斜数据集
towardsdatascience.com](/a-complete-understanding-of-precision-recall-and-f-score-concepts-23dc44defef6) [## 数据科学家假设检验完全指南,Python 示例
用样本研究问题、解决步骤和完整代码清楚地解释
towardsdatascience.com](/a-complete-guide-to-hypothesis-testing-in-python-6c34c855af5c) [## 用几行代码在 Python 中搜索相似的文本:一个 NLP 项目
使用 Python 中的计数矢量器和最近邻法查找类似的维基百科简介,这是一个简单而有用的…
medium.com](https://medium.com/towards-artificial-intelligence/similar-texts-search-in-python-with-a-few-lines-of-code-an-nlp-project-9ace2861d261)
你的 ML 代码结构良好…或者是吗?
如何为你的机器学习项目构建代码
我是从 Web 开发来到机器学习领域的。当我意识到没有任何明确定义的项目结构原则时,我真的很沮丧。也许更好的说法是几乎 不可能为这个特定领域(机器学习/数据科学)找到项目结构和整个应用模块询问的最佳实践。关于 MVC 的信息更容易找到。现在我已经从事 ML 项目有一段时间了,在这篇文章中,我将尝试总结我在这个主题上的经验和知识。
让我们从基础开始。在大多数情况下,ML 项目由核心模型和一些包装器(GUI、HTTP API、CLI 接口)组成,最终用户将通过它们来使用它。让我们专注于核心的模型部分,把包装留给已经知道该做什么的人: )我们都知道,在大多数情况下,ML 世界中的软件开发过程是由 CRISP-DM (数据挖掘的跨行业标准过程)或其来自 IBM ASUM 的兄弟(数据挖掘/预测分析的分析解决方案统一方法)决定的。****
CRISP-DM ( 来源)
从这两种方法中,我们可以突出 3 个主要的软件开发阶段:数据准备、建模和评估,它们在整个应用程序存在期间循环。不管你是刚开始项目还是添加新功能,你都必须通过这三个阶段。好,现在让我们定义一下什么是核心模型,或者我说的核心模型是什么意思?
****核心模型是一种算法,它以明确定义的数据结构对输入执行有限且明确定义的后续数据转换,并作为结果返回具有明确定义的数据结构的输出。我认为这个定义实际上适合所有的 ML 项目。现在让我们来定义这个算法在所有 3 个阶段是如何受到影响的。
数据准备:这里我们必须验证和清理从客户(或其他地方)获得的数据。实际上,我们正在做的是决定算法的输入应该是什么样子。
建模:这里我们必须定义数据转换步骤,这些步骤将在输入数据上执行,在输出上将返回所需结构的数据。重要提示:这里我们不仅创建了我们习惯称之为 ML 的模型(kNN,逻辑回归等。),还包括数据预处理、特征工程和其他可能的数据转换步骤。事实上,我们习惯称之为“ML 模型”的任何东西都只不过是数据转换器。
评估:这里我们必须使用一些度量来评估算法输出的相关性。
Uff,现在我们已经定义好了。那么代码呢?这三个阶段如何影响代码库?
当你在做数据准备的时候,你应该总是期望数据会及时变化,你当前正在解决的问题可能会被延长。例子:你要写一个模型,在显微镜图像上检测两种类型的粒子。您已经准备好了数据,并告诉客户以某种格式将输入发送给模型。在做出最终决定之前,您必须考虑的事情是:如果客户想要添加一种新型颗粒进行检测,这是否可行?
当你在做建模的时候,你应该总是期望评估的结果或者生产中的结果可能是不好的,你必须在模型中做出剧烈的改变,而且你必须尽可能快地去做。改变模型结构需要多长时间?
当您创建评估代码时,您应该始终预期评估指标、执行评估的数据甚至模型结构可能会改变。更改这些内容并再次运行评估需要多长时间?
所以现在我们看到在开发过程中可能会发生很多问题,我们的主要目标是尽可能快地解决它。那么,我们应该如何编写代码才能轻松做到这一点呢?我们都知道软件开发中主要的代码质量度量是可靠性、可维护性、可测试性、可移植性、可重用性。但是这些时髦的词语可能意味着任何事情,而不一定是特定领域的。
我们已经定义了核心模型,我认为这种模型的最佳技术实现是管道**。流水线是一组串联的数据处理步骤,其中一个步骤的输出是下一个步骤的输入。管道可以由几个管道构成。**
文本预处理管道示例
现在,我想说出并描述我为自己定义的主要原则,我认为每个机器学习/数据科学项目都必须遵循这些原则:
- ****管道由明确定义和有序的数据处理步骤组成。数据有清晰的处理路径,有严格定义的顺序。这部分保证了应用输出的稳定性(可靠性)
- 高层管道结构透明。任何不熟悉该项目的开发人员都必须能够理解(或者更好地写下一个有序列表)在应用程序管道中执行的所有步骤。这增加了整个应用程序的可维护性,并极大地简化了项目新人的加入。(可维护性
- 数据处理步骤原子性。每一步都有一个明确定义的输入和输出数据结构,其内部状态与其他步骤相隔离。这简化了流水线步骤单元测试。此外,它保证了管道步骤在管道的不同位置或在另一个管道中可重用的可能性。(可维护性、可测试性、可重用性)
- 流水线步骤参数的可访问性。每个数据处理步骤的任何参数都必须易于访问并可以修改。这对于手动和自动模型参数调整和评估都非常重要。它简化了单元测试的数据处理步骤。并且还提供了其他设置的可重用性,在这些设置中它可能是有用的。(可维护性
- 增加和删除流水线步骤的可能性。如果前一步的输出和下一步的输入具有相同的结构,则可以删除管道的每一步。如果新步骤的输入和输出与它们的输入和输出兼容,则可以在两个步骤之间添加新的数据处理步骤。这加速了对整个数据处理流程建模的过程,并且在将来加速了根据反馈对现有模型的修正。(维修性)
我认为遵循这 5 条规则将有助于你为你的 ML 项目写出干净、可测试和可维护的代码**。**
万一是sklearn
,可以用它的Pipeline
实现,真的很牛逼。如果你想有一些变压器,这是不在sklearn
,只是谷歌如何编写自定义变压器,并将其集成到您的管道,这真的很容易。
如果你使用除了sklearn
之外的东西,你有两个选择:把你的解决方案转换成sklearn
或者写你自己的管道接口,所有它必须满足的规则都摆在桌面上。不管你是和textual
、numeric
、image
还是mixed data
一起工作,这些规则都是通用的。
为了让语言与行动相匹配,我将展示这些原则是如何在实践中发挥作用的。假设我们有一个帖子数据集**。每个岗位都有一个image
、text
、category
、tags
、rating from critics
、authors rating
、price
。让我们想象一下image
和text
字段包含我们必须从中检索数据的文件名。我们的目标是估计帖子的数量。我想让你明白这个例子和现实没有任何联系。我用这个例子向您展示,您可以组合任意数量的具有不同接口和用途的工具,并将它们连接到**管道中,这满足了上述所有规则。让我们假设,为了简单起见,我们选择了 stack: pandas , sklearn , spacy 用于文本属性的 NLP, OpenCV 用于图像处理, YOLO 用于图像上的对象检测。
现在我将向你展示核心模型的一段代码,如果你不理解它的高层结构,那么我之前写的所有东西都不起作用,你可以立即离开这一页;)
模型核心代码
所以,如果你还在读这篇文章,我想你已经理解了代码。是不是看起来很棒,真的很好维护?首先我要强调的是,当然并不是所有的变形金刚都存在于 sklearn。但是就像我之前说的,你可以自己做一个。你可以看看我以前的帖子,最后你会发现使用 spacy API 的自定义 sklearn 转换器:****
所有文本预处理步骤的描述和可重用文本预处理管道的创建
towardsdatascience.com](/text-preprocessing-steps-and-universal-pipeline-94233cb6725a)
管道方案
现在让我们命名所有的步骤。高级别代表:
- 预处理
- 特征选择
- 回归模型
预处理:根据数据表示类型对不同组的列独立应用不同的预处理步骤,然后将所有转换后的特征合并到一个数据帧中。
图像数据:
- 使用 OpenCV 从文件中读取图像
- 将色彩图从OpenCVBGR 转换为 RGB
- 使用 YOLO 检测猫、狗和人,并为每张图像返回检测到的对象数组
- 将输出数组转换为指示器矩阵,其中 1 表示对象在图像上,0 表示对象不在图像上
文本数据:
- 从文件中读取文本
- 对所有单词进行词汇化
- 使用 TF-IDF 算法进行矢量化,按单词进行标记化,并使用最大大小为 10000 的单词包
数字数据:
- 使用中位数策略估算缺失值
- 执行标准化
分类数据:
- 用单词“missing”估算缺失值
- 执行一键编码
**分类多标签数据:**将数组转换为指示矩阵,其中 1 表示对象在列表中,0 表示对象不在列表中。
现在你可以看到你的模型看起来有多棒了。这段代码满足了上述所有规则。
我希望你喜欢这篇文章,我期待你的反馈!我真的很想开始讨论这个话题,所以不要犹豫写评论或直接给我发电子邮件。
如果您在将您的模型转换为 pipeline 时遇到问题,请写评论或直接给我发电子邮件,我会尽力帮助您。
我的邮箱:maksym.balatsko@blindspot.ai**
你的下一个雇员应该是应用数据科学家
这种时候,更明显的是,你的下一个雇员应该是一个全面的超级明星。
拥有单一技能的数据科学家很容易找到,但找到一个全面的数据科学家却很难。但是这 10 倍的资源将决定项目的成败。
一个企业超级明星,这就是他们…
企业环境中的数据科学家除了标准的技术要求之外,还需要具备很多技能。任何数据科学职位最难的部分是沟通,在一般人群中,良好的统计技能不一定与社交能力并存。
数据科学最难的部分是沟通。
当雇佣一名新的数据科学家时,问自己你在寻找什么是很重要的?你想象这个人如何经营你的企业?你想找一个有纯数学和统计技能的人吗?还是对底层编码有亲和力的人?或者,更有可能的是,某个可以成为桥梁建设者的人。能够向企业销售解决方案并获得项目(和未来费用)支持的人。
大多数公司都需要应用数据科学。数据科学专门应用于解决业务挑战。不是为了数据科学本身,而是为了一个目标。为了更好地理解应用数据科学能为你的公司做什么,我们必须理解“应用”部分实际需要什么,而不是所有的嗡嗡声。这也将帮助你确定你的公司真正需要的是什么,也许根本不是数据科学。
由团 Nguyễn 明在 Unsplash 上拍摄的照片
应用科学家
应用数据科学家是一个有趣的角色。应用型的 T21 应该和研究型的数据科学家相提并论。研究数据科学家整天都在改进项目;摆弄最细微的细节。研究新的模型并寻找应用它们的领域。
应用数据科学家是值得信赖的业务顾问。他们与企业沟通,挖掘他们的需求,并利用适用于该工作的工具来满足这些需求。简单的数据分析,数据提取,或者,当工作需要时,更高级的建模。
不要误解我的意思:这些研究数据科学家有一席之地,但这可能需要他们周围有一个强大的支持团队,以便填补他们不愿意或无法填补的空白。这些人无法在复杂的商业环境中独自经营。
应用数据科学家将多种技能和工具结合起来,以便在商业环境中保持高效。
那么,你应该从候选人身上寻找什么呢?
应用数据科学家清单
- **科学家。**数据科学家需要对数学、统计学和科学探究方法有扎实的理解。他们需要能够用各种语言编写程序,以便提取、转换和操作数据。这也包括分析复杂问题并将它们分解成更小的、可解决的部分的能力。这是他们的分析思维。
- 领域专家。科学家对深度垂直或领域知识的需求经常被忽视。领域专业知识对于正确构建手边的信息和创建对所述数据的缺点的认识是重要的。它还帮助数据科学家创造对业务直接有用的产品。真正的应用数据科学家利用他们的业务联系来获取每个项目的有用信息。
- 译者。他们作为翻译的角色不被重视,但却非常重要。业务环境中的数据科学通常受到业务经理想象力的限制,他们的问题应该通过分析来解决。然而,由于他们从自己的角度看待问题,他们将不可避免地只能用这种世界观来看待问题。数据科学家从技术角度处理这个问题,可以提出大量不同的(有时是独特的)新方法。由于通常是业务买单,因此数据科学家可以充当技术方面和业务元素之间的翻译非常重要。可以说是在出售未来。
在某种程度上,这些角色可以分开,但是,每个应用数据科学家都需要具备这些关键技能。这些人将极大地提高数据科学团队的整体交付能力,他们可以提升整个团队。
所以,下次你雇佣数据科学家时,不要只评估他们的技术能力,还要寻找其他特质,比如领域知识和沟通技能。祝你好运!
你的电话号码让世界知道你是谁:开源情报收集快速指南
你的手机泄露了你的什么信息——照片由 Unsplash 上的艾里克·索尔海姆拍摄
O 你的数据很重要!这是我们的隐私,公司不应该滥用它。不幸的是,这已经不是我们生活的世界了。这篇文章不会是危言耸听*“让我们回到我们的诺基亚 5110”*并关闭我们的账户,但它将是对我们数据的一种洞察,以及像电话号码这样平凡的事情如何能揭示这么多。在网络安全和数据科学中,有一个术语叫做开源情报收集(OSINT),它被描述为,
从公开来源收集的数据,用于情报环境。
在我们所处的疫情,我们的数据再次受到威胁,因为公司试图适应新的工作模式、新的连续性计划以及新的工具,因为他们希望完全采用远程观点。最近,越来越多的销售主管打电话来询问我是否对远程解决方案感兴趣。由于封锁,大多数人都不在办公室,少数人一直在使用手机号码,他们经常这样做是为了避免谷歌人工智能实际上可以根据谷歌搜索结果告诉你哪个公司在打电话(如果你有安卓系统,苹果的 IOS 也使用类似的功能)。使用手机号码至少可以让他们回避这个问题,和你搭讪。然而,一个日益增长的趋势是,由于持续的需求和供应链的中断,一些公司措手不及,现在要求员工使用个人手机并报销费用。对于销售主管来说,这实际上存在安全风险。你的手机号码可以透露很多关于你的信息,恶意攻击者可以利用它来获取更多关于你的信息,进行网络钓鱼攻击***()我写了一个关于如何设置网络钓鱼服务器的指南)***。
那么这在现实生活中是什么样子的呢?
在过去的几年里,我们都会收到一封电子邮件,告诉我们由于不安全的数据库等原因,我们的数据被泄露了,公司很抱歉,他们非常关心我们的数据。通常,这些电子邮件遵循相同的主题,即你的信用卡信息是安全的,但他们可能已经得到了你的电子邮件和电话号码。公司经常淡化这一重要部分,因为你的信用卡信息被认为比电子邮件或电话号码更有价值,对吗?
那么我泄露的信息会怎么样呢?📧📱
你可能经常会看到垃圾邮件的增加,但如果你使用 Gmail 或 Hotmail,你实际上永远不会看到这一点,因为他们的垃圾邮件过滤器会发现它。有了你的电话号码,它可能会被卖掉,你会通过短信或电话收到奇怪的网络钓鱼企图,内容是有一次你撞坏了一辆你从未拥有过的汽车。姓名和个人标识符通常不与这些数据保存在一起,或者受到保护(哈希)。然而,它们中的大部分最终会出现在粘贴箱中,这些是来自互联网漏洞的大量“复制和粘贴”数据。像这样的服务已经通过这些数据让你知道你的电子邮件是否出现在这些数据泄露中。
我的信息被泄露过吗?😱
无时无刻😡!令人沮丧的是,这不是我的错。因此,我查看了一封我用来注册时事通讯的旧电子邮件,随着时间的推移,它已经被泄露了 6 次,从 2012 年开始,直到最近的 2019 年 2 月。
影响我的一个电子邮件地址的漏洞截图。资料来源:HaveIbeenPwned
并非所有违规行为都被披露或易于跟踪
这就是粘贴箱的用武之地,有时黑客不会透露信息的来源,或者这可能是一个大的操作,有人已经把泄露的信息放在一起,然后决定分享它。他们会将信息上传到 Pastebin,通常没有任何指示,其他用户会下载并使用这些信息进行钓鱼攻击、暴力攻击,甚至训练机器学习模型。
值得庆幸的是,你可以在火狐或谷歌上设置提醒,当你的电子邮件被泄露时提醒你
从一个电话号码,别人怎么找到你的名字?
正如我们在上面看到的,在 CafePress 数据泄露事件中,除了电子邮件地址,密码,用户名和电话号码也被泄露。你能用电话号码做什么?
首先,我们无法像控制电子邮件或其他信息一样控制它。如果有人加了我的电话号码,我永远也不会知道,如果我的电话号码被泄露,O2,Virgin 或 EE 从来没有联系过我说,“嘿,你的号码被攻破了,注意安全。”
因此,如果恶意方找到我的号码并将其添加为联系人,我的号码会告诉他们什么?首先,这足以暴露我所有的社交媒体账户。Instagram 会显示你的哪些联系人在平台上,现在大多数社交平台也是如此。同意手机号码是一个单向系统,现在大多数应用程序都要求导入你的联系人列表,因此从这里开始,用户可以添加一个号码,并查看一些热门应用程序,看看该号码是否与某人对应。如果你使用像 WhatsApp 这样的流行信息平台呢?总是检查只有你的联系人可以看到你的个人资料照片,将设置为每个人意味着即使是偶然发现你号码的陌生人现在也可以看到你的个人资料照片。通常,如果我接到一个未知号码的未接来电,我首先会保存它,然后在 WhatsApp 上查看,以了解是谁打来的。对于目前在疫情期间使用私人电话的销售人员来说,这将很难控制,而且这是对你隐私的不必要的侵犯。
但是如果是你的银行告诉别人你的情况呢?🏦
在疫情期间,当企业努力应对远程支持的新需求时,一些企业已经走在了前面。让我们看看 Monzo ,一家只支持移动设备的银行,它已经有了支持和远程扩展的基础设施。作为 Monzo 的客户,我喜欢这家银行。但是我有一个问题。
为了让朋友更容易支付和即时支付,Monzo 有一个功能,它列出了所有与 Monzo 联系的人。从那里你可以选择一个联系人并给他们汇款。从 UX 的角度来看,它使生活变得容易,在这个时代,谁有时间写下分类代码和帐号,事实上,这似乎是万无一失的,因为你输入错误信息的可能性很小。但通常,像这样的功能虽然有用,但也可能对恶意攻击者有用。作为一名恶意攻击者,我可以从粘贴箱中找到一个电话号码,将其添加为联系人,检查他们是否有社交媒体,然后打开 Monzo,找出他们的完整政府名称。Monzo 应用程序将用户注册并通过政府 ID 确认的姓名显示给任何拥有该人手机号码的人。此功能可以关闭,但关闭后,您将无法在没有账号和分类代码的情况下汇款。很遗憾,用户经常面临一个决定,是安全还是 UX 便利?
好吧,你知道我的名字和号码,你能做什么?
这就是 OSINT 真正发挥作用的地方,一个伟大的查找信息的开源平台是 Google(或任何搜索引擎),如果攻击者知道你的全名,就不难进行显式搜索来查找关于你的更多信息。作为一个现代互联网用户,你应该知道谷歌上出现了哪些关于你的信息。
一个朋友最近让我自己谷歌一下,看看是否会弹出某个结果。令我惊讶的是,在第二页,它就在那里。正如她所描述的那样,这是一个已经废弃了我所有 LinkedIn 内容和信息的页面,现在正出售给声称拥有我的电话号码和电子邮件信息的公司。为了删除我的信息,我需要通过给他们更多的信息来证明我就是我所说的那个人。
我没有允许他们拥有我的数据,但我们在这里!—阿波罗 AIs 网站截图。
不幸的是,这不是唯一一个提供这类信息的网站。从快速的谷歌搜索中,你可以找到不同的网站提供你的数据,要么是从社交媒体平台购买的,要么是从数据库泄露的,要么是我们从未读过的一些条款和条件。LinkedIn 等公司需要采取更多措施来防范网络垃圾邮件。网络抓取是使用机器人从网站中提取内容和数据的过程。与只复制屏幕上显示的像素的屏幕抓取不同,网络抓取提取潜在的 HTML 代码,以及存储在数据库中的数据。然后,抓取工具可以将整个网站内容复制到其他地方,或者打包出售给寻找线索和数据的公司。
网页抓取的工作原理—来源— Imperva
更糟糕的是,在 2018 年,尽管我从未和他们有过账户,也不知道他们是谁。阿波罗人工智能不知何故丢失了一个我不用的电子邮件地址。这只是我用于测试系统的一个虚拟收件箱。
阿波罗——如果你正在读这篇文章,请删除我。—来源已更新
我的地址呢?
从你的政府名称来看,如果你在公布的选民名单上,你的名字和地址很容易被找到。由于在英国的信用评分过程,它经常被用来作为一个很好的指标对你的信用评分有你的名字在这个选民名册上。然而,获得这些数据的公司通常会出售这些信息。因此,通过谷歌搜索,人们实际上能够找到你是谁,谁住在你的房子里的信息*(是的,有一个网站列出了居住在某个地址的有资格投票的每个人,以及与该房产相关的以前的名字)*。如果你是一家公司的董事,那么,公司之家允许某人搜索你的名字,并获得关于你的更多信息。但是攻击者要寻找的关键信息是你的出生日期。虽然它没有列出具体的日期,但对于攻击者来说,它缩小了你出生的月份和年份。使用任何公共社交媒体资料,如果你曾经发布过“这是我的生日”帖子,他们所要做的就是查看你在那个月的帖子。
那么是回 Nokias 吗?
是的,我们可以,但我们也可以在保护数据时采取主动。虽然我们无法控制谁在篡改我们的数据,但我们可以做些事情来保护自己。这可以通过使用安全方法来实现,例如不包含容易获取的信息的强密码。如果你的出生年份可以在公司主页上找到,为什么会出现在你的密码里?如果谷歌搜索可以显示你 5 年前住的地址,为什么你的秘密问题是关于你找到工作后住的第一条路?一个人的垃圾是另一个人的黄金。数据也是如此,对您来说可能不那么重要的东西可能是网络钓鱼企图中缺失的部分。对于公司来说,他们还应该注意,通常在鱼叉式网络钓鱼攻击中,攻击者正在寻找一种方法,而任何系统最脆弱的部分就是使用它的人。
如果你从这篇文章中有所收获,请在网上搜索自己,看看会有什么收获。了解你的数据,给公司发邮件要求他们把它拿下来,在这段无聊的时间里,检查你下载的应用程序的权限。一个数字能说这么多,我们一定要保护他们。
作者斯蒂芬·查彭达玛
你的处理器在你开始使用人工智能之前很久就试图预测未来
以一种更原始但没有太大不同的方式
在 Unsplash 上由 Vladimir Malyutin 拍照
如果你学过计算机体系结构,你可能知道硬件执行某个程序的基本步骤。如果没有,下面简单解释一下这个过程【1】:
第一步是将高级代码翻译成汇编语言。编译器负责做到这一点。之后,汇编程序将把汇编语言翻译成二进制指令。因此,如果您的代码在某个高级语言中包含以下语句:
A + B
编译器将变成:
add A,B
汇编程序会翻译成这样:
000001010011
从这一点开始,处理器执行以下步骤:
- **获取:**从 RAM 中读取指令。
- **解码:**理解指令的目的(例如 add)并设置允许执行指令的所有标志和寄存器。
- **执行:**处理指令。指令可以使用也可以不使用算术逻辑单元(ALU)。算术逻辑指令使用 ALU,
内存指令也可以使用它进行地址计算。 - **回写:**将获得的结果写入寄存器组。
当处理器运行时,该序列一直重复,并且每个步骤花费一个时钟周期。执行依赖于解码,解码依赖于获取。然而,获取不依赖于解码,解码不依赖于执行,所以一旦某条指令的获取完成,下一条指令就已经可以被获取了。其他的也一样,那是处理器流水线(如下图所示)。
科林 M.L 伯内特在维基共享资源上的图片
预测从何而来?
要说预测,首先要说条件跳转(或者说条件分支)。条件分支指令是跳转到一个新地址,根据特定条件【2】可能发生也可能不发生。翻译成高级语言,它基本上是一个 if-then-else 子句:
if **some condition:**
do this;
else:
do this instead;
如果满足条件,代码将继续正常执行。如果不满足条件,代码将跳转到 If 块中的所有行,执行 else 块中的所有行。这是条件分支的一个例子。 For 的和 while 的也是条件分支,因为条件定义了代码是重复还是直接。关于条件分支的要点是:执行时需要计算条件结果。
这意味着当条件分支指令在流水线中出现时,处理器将只知道在计算条件结果之后,即在执行阶段之后,是否需要采取分支。因此,处理器不知道下一条指令是否会被执行,或者是否会跳转到另一条指令。这种依赖隐含着一个管道气泡。
图由二胡郝在 ResearchGate
一个流水线气泡,如上图所示,是处理器流水线上的一种延迟,目的是为了解决某种依赖(或者危害,在计算机架构语言中)【1】。灰色块代表空闲时间。考虑到上图中的第一条指令是条件分支,下一条指令只有在条件分支指令完成其执行步骤后才会被提取,以确保下一条要执行的指令是正确的。所以如果你仔细想想,这在性能上是不可持续的。这就是预测出现的地方。
分支预测
如果处理器没有等到条件分支的计算,它有什么选择?嗯,猜测或预测条件结果可能是一个不错的选择…事实也的确如此。预测条件结果而不是阻塞处理器的过程已经使用了几十年,它被称为“分支预测”。
它们已经使用了很长时间的事实并不意味着它们是完美的,总是有改进的空间。使用真实处理器的实验表明,减少 50%的预测失误会使处理器的性能提高 13%【4】。然而,设计分支预测器(BP)不仅要考虑精度,还要考虑许多其他因素,例如处理器芯片的面积、能耗等。
分支预测是如何工作的?
Harshal Parekh 写了一个很好的故事,不仅解释了它是如何工作的,还展示了它在真实情况下的影响。我非常推荐阅读:
在计算机科学中,谓词是一种体系结构特征,它为条件转移提供了另一种选择
medium.com](https://medium.com/swlh/branch-prediction-everything-you-need-to-know-da13ce05787e)
像大多数预测模型一样,分支预测通常基于条件分支的过去行为。最简单的分支预测算法可以使用一个标志来定义,该标志指示最后一个分支是否被采用,并且该算法将总是猜测上一次发生的事情也将在下一次发生。因此,标志需要采用初始值( 1 表示是, 0 表示否)。如果猜测正确,标志将保持其值。如果没有,标志会改变它的值。下面的情况可以举个例子。
运行某个例程后,给定分支 b 得到以下行为:
0 0 0 1 1 0 0 0 0 1
在前三次迭代中,没有执行分支,在接下来的两次迭代中,执行了分支。接下来的四个也没拍,最后一个拍了。考虑到我们的分支预测器以标记为 **0、**开始,准确度将为 70%。下图用一个红色箭头表示每次迭代,后面是当前标志值和一个表示分支行为预测是否正确的符号。
作者图片
第一次预测失误将发生在第四次迭代时,因为最后一次是 0 (第四次是 1) 。这样,标志现在将其值更改为 1 。由于将在下一次迭代中进行分支,所以预测将是正确的,然而,在第六次迭代中,分支不再进行,因此发生另一次未命中预测。现在,标志再次变为 0 ,并正确预测接下来的三次迭代,然后错过最后一次迭代。最终,我们得到了 7 个正确的预测和 3 个错误的预测。
显然,这不是现在处理器进行分支预测的方式。有一堆其他的技术可以给出更好的结果。你可以在 Sparsh Mittal 写的这篇文章中找到一些答案。
AI 可以用于分支预测吗?
很容易想知道这种问题是否可以由人工智能算法来解决,答案是是的,它们可以。事实上,从很久以前开始。使用这种方法的分支预测器的一个例子是感知器预测器,在 Sparsh Mittal 调查中也有涉及。由于人工智能领域的最新进展,这两个领域的结合可能是英特尔和 AMD 等主要科技公司建筑内的一个热门趋势,我们可以期待更多的到来。
因此,如果你喜欢计算机架构和人工智能,这是你可以利用你所有的知识来改进我们今天拥有的处理器的研究领域。
参考
[1]帕特森,大卫 a .,和约翰 l .轩尼诗。计算机组织与设计:硬件/软件接口 (2013)。平装本,摩根·考夫曼出版社。
[2]亨利、格伦和泰瑞·帕克斯。条件分支指令的静态分支预测机制 (2003)。美国专利 6571331 号。
[3]张宝勇。分类导向的分支预测器设计 (1997)。密歇根大学博士论文。
[4]米塔尔,斯巴什。动态分支预测技术综述 (2019)。并行性和计算:实践和经验。**
您的简化数据科学工作流已经到来!
数据科学家及其团队领导会喜欢的 Google Cloud 新功能
图片:来源。
嘿, 数据科学家 使用 谷歌云 :你怎么还没使用 机器图片 ?因为他们才出生两周,这就是为什么…
摘要
技术的
Google Cloud 上的机器映像 让您轻松创建、备份、恢复和共享您定制的虚拟机。如果将磁盘映像、快照和实例模板结合起来,就可以得到它们。(呃,好吧,生孩子不是这样的。)
虚拟机镜像 轻松创建、备份、恢复和共享虚拟机。
哦,如果你预算紧张,你会以一种你永远不会喜欢虚拟机副本的方式喜欢它们。
非技术性的
您是否曾经丢失过智能手机,然后使用一键解决方案来恢复您最喜爱的应用程序、联系人等。换一部手机吗?机器镜像就是那样,不过是针对 Google Cloud 上的虚拟机。
痛苦的非技术性
想象一下,你从谷歌云租用的虚拟电脑是一个视频游戏中的角色。在机器映像出现之前,这款视频游戏没有保存选项——每次你做了让你后悔的事情,你都必须从头开始玩游戏。现在,保存和加载你辛辛苦苦获得的所有物品和经验值变得超级容易。
咔嚓,咔嚓,搞定!
演示 GIF
要使用机器映像创建虚拟机:单击机器映像旁边的选项,单击 Create VM(命名您的小 best 是可选的),然后创建!哒哒,你漂亮的虚拟机的一个简单副本。(右下角是一个方便眼睛的放大图。)
为什么你应该关心你是不是一个…
数据科学家/研究员
如果你像大多数数据科学家一样,你无法在内心深处热爱虚拟机(VM)设置和其他计算琐事。这些事情会占用你处理数据的时间,而这正是你真正感兴趣的部分。当然,你有足够的洞察力想要你自己的特别定制设置——就像你喜欢的那样——所以你能够抑制你第一次抱怨。
几周过去了。你偶尔会安装闪亮的新包,调整设置,运行脚本,然后有一天…嘣!你打破了它。
理想情况下,你应该把时钟倒回到你完美的机器上,就像上周一样,但是…你不记得你点击了什么到达那里。即使你做了,从头开始也要花几个小时(如果你幸运的话)。
悲伤。
之前:恢复上周的设置意味着从头开始。
之后:咔嚓,咔嚓,搞定。更少的家务时间,更多的数据时间。
机器图像来拯救!机器映像是包含所有信息(机器类型、网络标记、标签等)的单一资源。—需要备份、拷贝、恢复和共享一个实例(虚拟机)。
这意味着您可以保存您喜欢的配置的副本,以便您可以轻松恢复实例的旧版本。听起来很简单。咔嚓,咔嚓,搞定。
**等等,为什么不直接保存虚拟机本身的副本呢?**因为您可能想在保存备份的同时省钱。
使用机器映像的成本远低于保存虚拟机的多个副本。
如果您制作了虚拟机的副本,您将获得双倍的计费磁盘空间。如果你创建一个机器映像,你只需要为磁盘内容的差异付费,所以即使你选择了一个华丽的虚拟机,每一个额外的机器映像也只需要你几分钱。
团队领导/经理
想象你是一名领导,有新的团队成员要加入。
您已经有了满足团队需求的完美设置,但是它存在于一个讨厌的文档中,该文档详细说明了每个新员工必须运行哪些脚本以及他们需要单击哪些按钮。
让新队友站起来并投入运行需要很长时间。
以前:让新队友起床跑步需要很长时间。
之后:更快的入职和一支能够跟上前沿的团队。
重复工作对你的业务没有好处,但幸运的是机器映像让我们跳过它。他们允许您定制一次,为您的团队创建一个黄金映像,并与整个团队共享。这让每个人的起跑线都向前移动,加快了你的入职速度。
“机器映像不仅仅是保存备份。这是加速你整个团队的一种方式。” —阿里·利伯曼,谷歌计算引擎产品经理
作为奖励,你会想不断更新黄金图像,以保持每个人的配置在最前沿。不用再跟踪你的小组的掉队者忘记做哪些更新了。
讲师/助教
给你给学生的编码作业打分——也许是在 TensorFlow 中的图像识别?—如果您不得不处理学生可能搞乱机器设置的所有不同方式的调试,这很快就会变成一场噩梦。(例如,你敢相信他们会想出如何获得 GPU 吗?)
当然,你可以告诉他们在市场解决方案上获得现成的解决方案——这个主意不错!—但是,如果您渴望定制该解决方案,该怎么办呢?你打算浪费一周的课堂时间来指导你的 100 名学生,让他们在试着按正确的顺序转动正确的旋钮时感到牙疼吗?你会放弃一个定制的起点吗?
有更好的方法。
以前:你浪费了宝贵的教学时间来指导学生按正确的顺序按正确的设置按钮。
之后:在您完成自己的定制后,您的学生可以立即开始(并停留在)同一页面上。
从您喜欢的任何地方开始(从零开始,从市场,从以前教授的机器映像开始)并定制到您满意的内容,然后与您的学生分享最终的机器映像。跳过课堂上的讨论,放心,如果他们的代码不工作,那不是因为他们在第一周忘记检查防火墙设置框。
另外,如果你在期中考试前对学生的设置感到后悔,很容易就可以替换。
如何
创建机器映像
选项 1 是从计算引擎中的 VM 实例创建一个机器映像,如第一个 GIF 所示。
是的,我给它们取名为“野兽”和“小野兽”不,当你与其他成年人合作进行专业数据科学工作时,这不是你命名事物的方式。似乎演示引出了我最糟糕的习惯!但在我看来,一个 VM 可以从很小的东西开始,如果需要,你总是可以选择将其扩展到相当大的规模。
选项 2 是直接进入机器映像部分,创建一个新的,在表单中指明 VM 实例源,如下一个 GIF 所示。
这将让你看到我们在上面的 GIF 中看到的相同的表格,以相同的方式进行…
使用机器映像
您已经看到了从您的机器映像创建 VM 的一种方法(本文中的第一个 GIF ),但是还有另一种方法:
几乎太容易了,对吧?差不多了。就我们这些数据科学家而言,不管有多容易,任何不涉及玩弄数据的事情应该总是更容易。但是在心灵感应界面出现之前,我很高兴拥有这个界面。
在谷歌云博客 了解更多机器图像 。
感谢阅读!人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。
您的终极数据操作和清理备忘单
资料来源:Unsplash。
解析日期、输入、异常检测等等
数据科学项目的大部分由数据清理和操作组成。这些数据清理任务中的大多数可以分为六个方面:
- **输入缺失值。**标准统计常数估算,KNN 估算。
- **异常值/异常检测。**隔离森林,一类 SVM,局部离群因子离群检测算法。
- **X 变量清洗方法。**应用自定义函数,删除重复项,替换值。
- **Y 变量清洗方法。**标签编码,字典映射,一键编码。
- 连接数据帧。连接、合并和连接。
- **解析日期。**自动格式检测字符串到日期时间的转换,日期时间对象到数字。
除非另有明确说明,否则图片由作者创作。
输入缺失值
缺失值经常困扰着数据,如果它们不太多,它们可以被估算(填充)。
简单的输入方法是统计常数测量,如用每列的统计测量值填充NaN
(缺失值)的平均值或中值。参数strategy
可以替换为‘均值’,‘中值’,‘最频繁’(模式),或‘常数’(带参数fill_value
的手动值)。
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')
data = imputer.fit_transform(data)
KNN 输入是输入缺失值的最流行和最复杂的方法,其中 KNN 算法在多维空间中寻找与缺失值相似的其他数据点。
from sklearn.impute import KNNImputer
imputer = KNNImputer()
data = imputer.fit_transform(data)
在使用 KNN 和其他基于距离的算法之前,需要对数据进行缩放或归一化以消除缩放差异(例如,一列代表孩子数量,另一列代表年薪——这些值不能从表面上看)。使用 KNN 估算遵循以下过程:
- 缩放/标准化数据。
- KNN-用于填充缺失值的估算。
- 反向缩放/归一化数据。
异常值/异常检测
隔离森林是返回样本异常分值的算法。该算法通过随机选择一个要素、随机选择一个分割值来创建路径,从而隔离观察值,路径长度表示其正态性。较短的路径代表异常-当随机树的森林共同为特定样本产生较短的路径长度时,它们极有可能是异常。
from sklearn.ensemble import IsolationForest
identifier = IsolationForest().fit(X)
identifier.predict(X)
异常检测器的预测输出是从-1 到 1 的分数数组,正分数表示异常的可能性较高。
一类 SVM 是另一种用于检测异常值的无监督方法,适用于像隔离森林这样的异常检测方法会产生太多差异的高维分布。
from sklearn.svm import OneClassSVM
identifier = OneClassSVM().fit(X)
identifier.predict(X)
局部异常值因子是三种常用异常值标识符中的第三种。每个样本的异常值(局部异常值因子)衡量给定样本相对于其相邻样本的局部密度偏差。基于 K-最近邻,密度显著低于其邻的样本被认为是异常值。
因为这种算法是基于距离的,所以在使用之前需要对数据进行缩放或归一化。该算法可被视为隔离森林的非线性高方差替代方案。
from sklearn.neighbors import LocalOutlierFactor
model = LocalOutlierFactor().fit(X)
model.predict(X)
对于所有三种异常算法,消除所有异常是数据科学家的选择。确保异常不仅仅是数据集群本身——确保异常的数量不会过多。PCA 可视化可以证实这一点。
x 变量清洁方法
对列应用函数经常需要对其进行清理。在内置函数无法完成清理的情况下,您可能需要编写自己的函数或传入外部内置函数。例如,假设 2 下面的列b
的所有值都是无效的。然后,要应用的函数可以充当过滤器,为没有通过过滤器的列元素返回NaN
值:
def filter_b(value):
if value < 2:
return np.nan
else:
return value
然后,通过使用熊猫的.apply()
函数应用过滤器,可以创建一个新的已清理列‘cleaned _ b’:
data['cleaned_b'] = data['b'].apply(filter_b)
另一个常见的用例是转换数据类型。例如,将字符串列转换成数字列可以通过使用 Python 内置函数float
的data[‘target’].apply(float)
来完成。
删除重复是数据清理中的常见任务。这可以用data.drop_duplicates()
来完成,它删除具有完全相同值的行。使用时要小心-当要素数量较少时,重复行可能不是数据收集中的错误。但是,对于大型数据集和大多数连续变量,重复项不是错误的可能性很小。
数据点采样在数据集过大(或出于其他目的)且数据点需要随机采样时很常见。这可以用data.sample(number_of_samples)
来完成。
重命名列是通过.rename
完成的,这里传递的参数是一个字典,其中键是原始列名,值是重命名的值。例如,data.rename({‘a’:1, ‘b’:3})
会将列‘a’
重命名为 1,将列‘b’
重命名为 3。
替换数据中的值可以通过data.replace()
来完成,它接受两个参数to_replace
和value
,这两个参数代表数据帧中将被其他值替换的值。这对于下一节输入缺失值很有帮助,可以用np.nan
替换某些变量,这样输入算法就可以识别它们。
更方便的专门用于数据操作的熊猫函数可以在这里找到:
熊猫没有白毛是有原因的
towardsdatascience.com](/7-pandas-functions-to-reduce-your-data-manipulation-stress-25981e44cc7d)
y 变量清洗方法
分类 y 变量需要标签编码。例如,如果数据有两个类别“猫”和“狗”,它们需要映射到 0 和 1,因为机器学习算法纯粹基于数学运算。
一种简单的方法是使用.map()
函数,它采用一个字典,其中键是原始类名,值是它们要被替换的元素。
data['target'] = data['target'].map({'cat':0, 'dog':1})
然而,如果有太多的类不能用字典手动映射,sklearn
有一个自动化的方法:
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder().fit(data['target'])
data['target'] = encoder.transform(data['target'])
使用这种标签编码方法的好处是可以使用encoder.inverse_transform(array)
对数据进行逆转换——也就是从数值到原始类的转换。
当标签编码对数据进行量化测量时,在具有多个类别的特定场景中,一键编码优于标签编码。类别“狗”、“猫”和“鱼”之间的标签编码为 0、1 和 2,假设不知何故“鱼”比“狗”大或者“狗”比“猫”小。
在 one-hot 编码中,每个y-值是一个向量,其长度为不同类的数量,其中“1”表示向量中的唯一索引,其余值标有“0”。例如,可以将向量[1, 0, 0]
、【猫】分配给[0, 1, 0]
、【鱼】分配给[0, 0, 1]
。
pandas
有一个内置函数get_dummies
,它自动接受一个序列或另一个数组形式,并输出一位热码编码数据帧。比如下面这个命令pd.get_dummies(data[‘target’]
。
连接数据框架
串联是数据帧的自顶向下连接。例如,pd.concat([df1, df2])
将产生一个主数据帧,其中df2
堆叠在df1
下方。
合并是一个从左到右的过程,横向合并两个数据帧,而不是用concat()
纵向合并。例如,pd.merge(left_df, right_df, on='ID')
将基于‘ID’
列合并左数据帧和右数据帧。
加入允许更专业的合并。默认情况下,合并是一个内部连接,它只适合关键字在两个数据框中的行。其他类型的连接包括左外部连接,其中包括左数据帧中的所有关键字,只有当其关键字存在于左数据帧中时,才包括右数据帧中的行。
可在merge
内的参数how=”outer”
或“right”
中概述选择的连接类型:
pd.merge(left = left_df, right = right_df, how = 'outer', on = 'id')
解析日期
日期可能是最难处理的数据对象,但对数据来说也是必不可少的。时间是现实生活中最重要的变量,重要的是不要让处理时间的困难影响到你的数据。
将字符串转换成日期是很常见的——数据集几乎从不带有可以方便访问的datetime
对象。把字符串转换成日期最好的库是dateutil
,可以自动推断日、月、年的位置,需要用其他库指定。
from dateutil import parser
dateutil
可以适应多种日期,其中每个命令都产生相同的结果(datetime.datetime(2040, 7, 3, 0, 0)
):
parser.parse(‘7/3/40’)
parser.parse(‘7–3–2040’)
parser.parse(‘7.3.40’)
parser.parse(‘July 3rd, 2040’)
parser.parse(‘July 3 2040’)
parser.parse(‘2040 July 3’)
parser.parse(‘3 July 2040’)
对一个列使用.apply(parser.parse)
可以将几乎任何形式的字符串转换成一个datetime
对象,在这里可以提取它的属性。
将日期转换成数字很重要,因为虽然时间对于模型来说是必不可少的,但它不能处理日期时间对象。相反,时间可以表示为整数,其中每个日期表示自数据中最早的日期以来经过的天数。在下面的示例中,2016 年 3 月 8 日是数据集中最早的日期(这需要找到并替换)。
import datetime
def convert_date_to_num(date):
return (date - datetime.datetime(5,8,16)).daysdata['number date'] = data['date'].apply(convert_date_to_num)
使用.apply()
将该函数应用于日期列(假设日期列的元素是datetime
对象)。
感谢阅读!
如果你觉得有帮助的话,一定要把这个页面加入书签,以便于参考。如果您喜欢,您可能还会喜欢其他数据科学备忘单:
机器学习指标、统计指标等
medium.com](https://medium.com/@andre_ye/your-ultimate-data-science-statistics-mathematics-cheat-sheet-d688a48ad3db) [## 您的终极数据挖掘和机器学习备忘单
特性重要性、分解、转换等
medium.com](https://medium.com/analytics-vidhya/your-ultimate-data-mining-machine-learning-cheat-sheet-9fce3fa16) [## 您的最终 Python 可视化备忘单
这个备忘单包含了你最常需要的一个情节的要素,以一种清晰和有组织的方式,用…
medium.com](https://medium.com/analytics-vidhya/your-ultimate-python-visualization-cheat-sheet-663318470db)
您的终极数据挖掘和机器学习备忘单
来源: Pixabay 。
特性重要性、分解、转换等
本备忘单将涵盖数据挖掘和机器学习的几个领域:
- **预测建模。**用于监督学习(预测)的回归和分类算法,用于评估模型性能的度量。
- **聚类。**将无标签数据分组为聚类的方法:K-Means,选择基于客观度量的聚类数。
- **降维。**降低数据和属性维数的方法:PCA 和 LDA。
- **特征重要性。**寻找数据集中最重要特征的方法:排列重要性、SHAP 值、部分相关图。
- **数据转换。**转换数据以获得更大预测能力、更容易分析或揭示隐藏关系和模式的方法:标准化、规范化、box-cox 转换。
预测建模
训练-测试-分割是测试一个模型表现如何的重要部分,通过在指定的训练数据上训练它,并在指定的测试数据上测试它。通过这种方式,可以衡量模型归纳新数据的能力。在sklearn
中,两个列表、熊猫数据帧或 NumPy 数组都在X
和y
参数中被接受。
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)
训练一个标准的监督学习模型采取导入、创建实例和拟合模型的形式。
**sklearn**
分类器型号如下所示,分支用蓝色突出显示,型号名称用橙色显示。
**sklearn**
回归器模型如下所示,分支用蓝色突出显示,模型名称用橙色显示。
评估模型性能通过以下形式的列车测试数据完成:
**sklearn**
下面列出了分类和回归的指标,最常用的指标用绿色标出。在某些情况下,许多灰色指标比绿色指标更合适。每一种都有自己的优点和缺点,平衡优先级比较、可解释性和其他因素。
使聚集
在聚类之前,需要对数据进行标准化(这方面的信息可以在数据转换一节中找到)。聚类是基于点距离创建聚类的过程。
来源。图片免费分享。
训练和创建 K-Means 聚类模型创建一个可以聚类和检索关于聚类数据的信息的模型。
from sklearn.cluster import KMeans
model = KMeans(n_clusters = number_of_clusters)
model.fit(X)
访问数据中每个数据点的标签可以通过:
model.labels_
类似地,每个数据点的标签可以存储在一列数据中,其中:
data['Label'] = model.labels_
访问新数据的簇标签可通过以下命令完成。new_data
可以是数组、列表或数据帧的形式。
data.predict(new_data)
访问每个聚类的聚类中心以二维数组的形式返回:
data.cluster_centers_
为了找到聚类的最佳数量,使用剪影得分,这是一个衡量特定数量的聚类与数据拟合程度的指标。对于预定义范围内的每个聚类数,训练 K-Means 聚类算法,并将其轮廓分数保存到列表中(scores
)。data
是模型被训练的x
。
from sklearn.metrics import silhouette_scorescores = []
for cluster_num in range(lower_bound, upper_bound):
model = KMeans(n_clusters=cluster_num)
model.fit(data)
score = silhouette_score(data, model.predict(data))
分数保存到列表scores
后,可以用图表显示或通过计算搜索找到最高的分数。
降维
降维是用减少的维数表达高维数据的过程,使得每个维数包含最多的信息。降维可用于高维数据的可视化,或通过移除低信息或相关特征来加速机器学习模型。
主成分分析或 PCA 是一种流行的方法,通过在特征空间中绘制几个正交(垂直)向量来表示减少的维数,从而减少数据的维数。变量number
表示缩减后的数据将具有的维数。例如,在可视化的情况下,它将是二维的。
PCA 工作原理的可视化演示。来源
拟合 PCA 模型:函数.fit_transform
自动将模型与数据拟合,并将其转换为减少的维数。
from sklearn.decomposition import PCAmodel = PCA(n_components=number)
data = model.fit_transform(data)
解释差异率:调用model.explained_variance_ratio_
会产生一个列表,列表中的每一项都对应该维度的“解释差异率”,本质上就是该维度所代表的原始数据中的信息百分比。解释的方差比之和是保留在降维数据中的信息的总百分比。
PCA 特征权重:在 PCA 中,每个新创建的特征都是以前数据特征的线性组合。这些线性权重可以通过model.components_
访问,并且是特征重要性的良好指示器(较高的线性权重表示该特征中表示的信息更多)。
线性判别分析 (LDA,不要和潜在的狄利克雷分配混淆)是另一种降维方法。LDA 和 PCA 的主要区别在于 LDA 是一种监督算法,这意味着它同时考虑了 x 和 y 。主成分分析只考虑 x ,因此是一种无监督算法。
PCA 试图完全基于点与点之间的距离来保持数据的结构(方差),而 LDA 优先考虑类的清晰分离。
from sklearn.decomposition import LatentDirichletAllocation
lda = LatentDirichletAllocation(n_components = number)
transformed = lda.fit_transform(X, y)
特征重要性
特征重要性是找到对目标最重要的特征的过程。通过主成分分析,可以找到包含最多信息的特征,但是特征重要性涉及特征对目标的影响。“重要”特征的变化会对 y 变量产生很大影响,而“不重要”特征的变化对 y 变量几乎没有影响。
排列重要性是评价一个特征有多重要的方法。训练了几个模型,每个模型都缺少一列。由于缺少数据而导致的模型准确性的相应降低表明了该列对模型预测能力的重要性。eli5
库用于排列重要性。
import eli5
from eli5.sklearn import PermutationImportance
model = PermutationImportance(model)
model.fit(X,y)
eli5.show_weights(model, feature_names = X.columns.tolist())
在这个排列重要性模型被训练的数据中,列lat
对目标变量(在这个例子中是房价)具有最大的影响。为了获得最佳预测性能,在决定移除模型中的哪些要素(实际上混淆模型的相关或冗余要素,由负的置换重要性值标记)时,置换重要性是最佳的使用要素。
SHAP 是另一种评估功能重要性的方法,借用 21 点中的博弈论原理来估算玩家能贡献多少价值。与排列重要性不同,SHapleyAd active ExPlanation 使用更公式化和基于计算的方法来评估特性重要性。SHAP 需要一个基于树的模型(决策树,随机森林),并适应回归和分类。
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
shap.summary_plot(shap_values, X, plot_type="bar")
PD§图或部分相关图是数据挖掘和分析中的主要内容,显示一个特征的某些值如何影响目标变量的变化。所需的导入包括依赖图的pdpbox
和显示图的matplotlib
。
from pdpbox import pdp, info_plots
import matplotlib.pyplot as plt
隔离的 PDP:下面的代码显示了部分依赖图,其中feat_name
是X
内将被隔离并与目标变量进行比较的特征。第二行代码保存数据,而第三行构建画布来显示绘图。
feat_name = 'sqft_living'
pdp_dist = pdp.pdp_isolate(model=model,
dataset=X,
model_features=X.columns,
feature=feat_name)
pdp.pdp_plot(pdp_dist, feat_name)
plt.show()
部分相关图显示了某些价值和居住空间平方英尺数的变化对房价的影响。阴影区域代表置信区间。
等高线 PDP:部分相关图也可以采用等高线图的形式,比较的不是一个孤立变量,而是两个孤立变量之间的关系。要比较的两个特征存储在变量compared_features
中。
compared_features = ['sqft_living', 'grade']inter = pdp.pdp_interact(model=model,
dataset=X,
model_features=X.columns,
features=compared_features)
pdp.pdp_interact_plot(pdp_interact_out=inter,
feature_names=compared_features),
plot_type='contour')
plt.show()
两个特性之间的关系显示了只考虑这两个特性时对应的价格。部分相关图充满了数据分析和发现,但是要注意大的置信区间。
数据转换
标准化或缩放是“重塑”数据的过程,使其包含相同的信息,但平均值为 0,方差为 1。通过缩放数据,算法的数学本质通常可以更好地处理数据。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(data)
transformed_data = scaler.transform(data)
transformed_data
是标准化的,可用于许多基于距离的算法,如支持向量机和 K-最近邻算法。使用标准化数据的算法的结果需要被“去标准化”,以便它们可以被正确地解释。.inverse_transform()
可用于执行与标准变换相反的操作。
data = scaler.inverse_transform(output_data)
标准化数据将数据放在 0 到 1 的范围内,类似于标准化数据,使数据在数学上更容易用于模型。
from sklearn.preprocessing import Normalizer
normalize = Normalizer()
transformed_data = normalize.fit_transform(data)
虽然规范化不会像标准化那样改变数据的形状,但它限制了数据的边界。是否规范化或标准化数据取决于算法和上下文。
Box-cox 变换涉及对数据进行各种幂次变换。Box-cox 变换可以规范化数据,使其更加线性,或者降低复杂性。这些转换不仅涉及到数据的幂,还涉及到分数幂(平方根)和对数。
例如,考虑沿着函数 g ( x )的数据点。通过应用对数 box-cox 变换,可以容易地用线性回归对数据建模。
和德斯莫斯一起创造的。
sklearn
自动确定应用于数据的最佳 box-cox 变换系列,使其更接近正态分布。
from sklearn.preprocessing import PowerTransformer
transformer = PowerTransformer(method='box-cox')
transformed_data = transformer.fit_transform(data)
由于 box-cox 变换平方根的性质,box-cox 变换的数据必须是严格正的(在 hand 可以处理这一点之前对数据进行归一化)。对于具有负数据点和正数据点的数据,通过类似的方法设置method = ‘yeo-johnson’
,使数据更接近钟形曲线。
感谢阅读!
如果你觉得有帮助的话,一定要把这一页加入书签以便参考。通常,数据挖掘和分析需要可视化——请随意查看另一个可视化备忘单。当您创建可视化和执行机器学习操作时,您可能想看看数据操作和清理备忘单。
机器学习指标、统计指标等
medium.com](https://medium.com/@andre_ye/your-ultimate-data-science-statistics-mathematics-cheat-sheet-d688a48ad3db) [## 您的最终 Python 可视化备忘单
这个备忘单包含了你最常需要的一个情节的要素,以一种清晰和有组织的方式,用…
medium.com](https://medium.com/analytics-vidhya/your-ultimate-python-visualization-cheat-sheet-663318470db) [## 您的终极数据操作和清理备忘单
解析日期、输入、异常检测等等
medium.com](https://medium.com/@andre_ye/your-ultimate-data-manipulation-cleaning-cheat-sheet-731f3b14a0be)
你的终极数据科学统计和数学小抄
皮沙贝
机器学习指标、统计指标等
除非另有说明,所有图片均由作者创作。
在数据科学中,对数据的统计学和数学有一个坚实的理解对于正确有效地应用和解释机器学习方法是至关重要的。
- **分类器指标。**混淆矩阵,灵敏度,召回率,特异性,精确度,F1 得分。它们是什么,何时使用,如何实现。
- 回归量指标。MAE,MSE,RMSE,MSLE,R .他们是什么,何时使用,如何实现。
- **统计指标。**相关系数,协方差,方差,标准差。如何使用和解释它们。
- **分布类型。**最常见的三种分布,如何识别。
分类器度量
分类器指标是用于评估机器学习分类器性能的指标,这些分类器是将每个训练样本归入几个离散类别之一的模型。
混淆矩阵是用于表示分类器对标签的预测的矩阵。它包含四个单元格,每个单元格对应于一个预测真或假和一个实际真或假的组合。许多分类器指标都是基于混淆矩阵的,所以在头脑中保存一个混淆矩阵的图像是有帮助的。
灵敏度/召回率是被准确预测的阳性数量。这被计算为TP/(TP+FN)
(注意,假阴性就是阳性)。在正确预测阳性很重要的情况下,如医疗诊断,灵敏度是一个很好的指标。在某些情况下,假阳性可能是危险的,但人们普遍认为假阴性(例如,对患有癌症的人诊断为“没有癌症”)更致命。通过让模型最大限度地提高灵敏度,可以确定正确分类的优先级。
特异性是准确预测的阴性数,计算为TN/(TN+FP)
(注意假阳性其实是阴性)。与敏感性一样,特异性在准确分类阴性比分类阳性更重要的情况下也是一个有用的指标。
精度可以被认为是敏感度或回忆的反义词,因为敏感度衡量的是预测为真的实际真实观察值的比例,而精度衡量的是预测真实观察值实际为真的比例。这被测量为TP/(TP+FP)
。精度和召回一起提供了模型性能的全面视图。
F1 得分通过调和平均值结合了精确度和召回率。它的确切公式是(2 × precision × recall) / (precision + recall)
**。**使用调和平均值是因为它惩罚更多的极值,与平均值相反,平均值是天真的,因为它对所有误差的加权都是一样的。
检测/准确率是正确分类的项目数量,计算方法为真阳性和真阴性的总和除以所有四个混淆矩阵象限的总和。这种准确率对积极因素和消极因素的权重是相等的,而不是优先考虑一个因素。
**使用 F1 得分与准确性:**当不犯错更重要时(假阳性和假阴性受到更重的惩罚),应该使用 F1 得分,而当模型的目标是优化性能时,应该使用准确性。这两个指标都是基于上下文使用的,并且根据数据表现不同。然而,一般来说,对于不平衡的类别(例如,癌症诊断,当阴性远远多于阳性时),F1 分数更好,而对于更平衡的类别,准确性更好。
实施指标遵循以下格式。
在sklearn
中讨论的指标名称有:
- 混乱矩阵:
confusion_matrix
- 灵敏度/召回:
recall_score
- 精度:
precision_score
- F1 得分:
f1_score
- 准确度:
accuracy_score
- 平衡精度(对于非均匀分布的类):
balanced_accuracy_score
回归指标
回归度量用于度量模型在连续规模上放置训练示例的效果,例如确定房屋的价格。
平均绝对误差(MAE) 也许是最常见和最易解释的回归指标。MAE 计算每个数据点的预测 y 值和实际 y 值之间的差值,然后对每个差值进行平均(差值计算为一个值减去另一个值的绝对值)。
中值绝对误差是评估平均误差的另一个指标。虽然它的好处是通过关注中间误差值来降低误差分布,但它也往往会忽略计入平均绝对误差的极高或极低误差。
均方差(MSE) 是另一种常用的回归指标,它更多地“惩罚”较高的误差。例如,误差(差值)2 将被加权为 4,而误差 5 将被加权为 25,这意味着 MSE 发现两个误差之间的差值为 21,而 MAE 将差值加权为其表面值-3。MSE 计算每个数据点的预测 y 值和实际 y 值的平方,然后平均这些平方。
均方根误差(RMSE) 用于给出均方差缺乏的可解释性水平。通过对 MSE 求平方根,我们获得了与 MAE 相似的度量,因为它处于相似的尺度,同时仍然在更高的水平上加权更高的误差。
均方对数误差(MSLE) 是平均绝对误差的另一种常见变化。由于误差的对数性质,MSLE 只关心百分比差异。这意味着 MSLE 将把小数值(例如,4 和 3)之间的小差异视为大范围内的大差异(例如,1200 和 900)。
R 是一个常用的指标(其中 r 被称为相关系数),用于衡量回归模型在多大程度上代表了因变量方差的比例,该方差可以由自变量来解释。简而言之,这是一个很好的数据拟合回归模型的指标。
实施指标遵循以下格式。
sklearn
中讨论的指标名称有:
- 平均绝对误差:
mean_absolute_error
- 中位数绝对误差:
median_absolute_error
- 均方差:
mean_squared_error
- 均方根误差:
root_mean_squared_error
- 均方对数误差:
mean_squared_log_error
- R :
r2_score
统计指标
4 .主要数据科学统计方法。
相关性是衡量两个变量共同波动程度的统计指标。正相关意味着两个变量一起波动(一个变量的正变化是另一个变量的正变化),而负相关意味着两个变量的变化相反(一个变量的正变化是另一个变量的负变化)。相关系数,从+1 到-1,也称为 R 。
相关系数可通过 Pandas 数据帧使用.corr()
功能访问。考虑以下两个序列:
seq1 = [0,0.5,0.74,1.5,2.9]
seq2 = [4,4.9,8.2,8.3,12.9]
使用构造函数table = pd.DataFrame({‘a’:seq1,’b’:seq2})
,创建一个包含两个序列的数据帧。调用table.corr()
会产生一个相关表。
例如,在相关表中,序列 A 和 B 具有 0.95 的相关性。当序列与其自身比较时,相关表是对称的并且等于 1。
协方差类似于相关性,是当变量被线性变换时函数保持其形式的性质的量度。然而,与相关性不同的是,协方差可以是任何数字,而相关性则局限在一个范围内。因此,相关性对于确定两个变量之间关系的强度更有用。因为协方差有单位(与相关性不同),并且受中心或比例变化的影响,所以它不太广泛地用作独立的统计数据。然而,协方差用于许多统计公式中,是一个需要了解的有用数字。
这可以用 Python 中的numpy.cov(a,b)[0][1]
来完成,其中a
和b
是要比较的序列。
方差是随机变量与其均值的方差的期望值的度量。它非正式地测量一组数字偏离均值的程度。可以用statistics.variance(list)
在统计库(import statistics
)中测量方差。
标准偏差是方差的平方根,是一个关于分布如何展开的更大规模的统计。可以用statistics.stdev(list)
在统计库中测量标准偏差。
分布类型
在处理数据分析和理解使用哪种统计和机器学习方法时,了解您的分布非常重要。
虽然有几种类型的数学专用分布,但其中大多数都适合这三种分布。
均匀分布是最简单的分布——它是完全平坦的,或者说是真正随机的。例如,对于 6000 次投掷中的每一次,记录的骰子落在多少个点上(从 1 到 6)将产生平坦分布,每个点数大约有 1000 次投掷。均匀分布具有有用的属性-例如,阅读盟军如何使用均匀分布的统计属性在第二次世界大战中挽救了无数生命。
用计算机模拟德国坦克问题
medium.com](https://medium.com/better-programming/how-data-science-gave-the-allied-forces-an-edge-in-world-war-ii-7fe92a74add5)
正态分布是一种非常常见的类似曲线的分布(该分布的一个名称是“钟形曲线”)。除了在数据科学中的常见用途,它也是宇宙中大多数事物可以用智商或工资来描述的地方。它具有以下特点:
- 68%的数据在平均值的一个标准偏差内。
- 95%的数据在平均值的两个标准偏差之内。
- 99.7%的数据在平均值的三个标准偏差之内。
许多机器学习算法要求数据呈正态分布。例如,逻辑回归要求残差服从正态分布。这可以通过residplot()
进行可视化和识别。关于该模型和其他统计模型用法的信息和示例可以在这里找到。
泊松分布可以认为是正态分布的推广;一种离散概率分布,表示在固定的时间或空间间隔内发生的给定数量的事件的概率,如果这些事件以已知的恒定平均速率发生,并且与上次事件后的时间无关。随着λ值的变化,泊松分布将均值向左或向右移动,从而能够创建左偏或右偏的数据。
感谢阅读!
如果你觉得这个备忘单很有帮助,请随意投票并为该页面添加书签以便参考。如果您喜欢这个备忘单,您可能会对在其他备忘单中应用您的统计知识感兴趣。如果你想在这个备忘单中看到更多的讨论话题,请在回复中告诉我!
这个备忘单包含了你最常需要的一个情节的要素,以一种清晰和有组织的方式,用…
medium.com](https://medium.com/analytics-vidhya/your-ultimate-python-visualization-cheat-sheet-663318470db) [## 您的终极数据操作和清理备忘单
解析日期、输入、异常检测等等
medium.com](https://medium.com/analytics-vidhya/your-ultimate-data-manipulation-cleaning-cheat-sheet-731f3b14a0be) [## 您的终极数据挖掘和机器学习备忘单
特性重要性、分解、转换等
medium.com](https://medium.com/analytics-vidhya/your-ultimate-data-mining-machine-learning-cheat-sheet-9fce3fa16)
您的最终 Python 可视化备忘单
来源:Pixabay 免费分享
轻松创建美丽的、可定制的情节
这个备忘单包含了你最常需要的一个情节的元素,以一种清晰和有组织的方式,带有代码和例子。在你创建任何情节之前,建议你浏览一下这个备忘单,以便清楚地知道你将如何构建可视化——毕竟,你的情节只有在你的脑海中,观众才会清楚。
除非另有明确说明,所有图片均由作者创作。
创建可视化的步骤
- 根据你的图有多少维来准备数据(分布图有一维,箱线图有二维,等等。).
- 启动图形世界(情节依赖的“世界”)美学,如风格或调色板。
- 创造情节。
- 使用标题、标签和附加功能自定义绘图。
进口
Python 绘图的两个最流行的库——matplotlib 和 seaborn——应该以它们的公共别名plt
和sns
加载,以便快速访问它们的函数和属性,而不需要键入它们的完整冗长的名称。
import matplotlib.pyplot as plt
import seaborn as sns
开创图形世界
创建图形是指定图形尺寸所必需的。
plt.figure(figsize=(horizontal_length,vertical_length))
Seaborn styles 可以给图形空间添加网格和样式。seaborn 有四种风格,可以用.set_style
加载。
sns.set_style(name_of_style)
Seaborn contexts 是内置的预先创建的包,它会影响标签的大小、线条和其他元素,但不会影响整体风格。
sns.set_context(name_of_context)
所有图都有白色网格样式。这是单独设置的。
Seaborn 调色板为图表提供了一组颜色,这可以给你的情节提供你希望你的观众感受到的感觉或背景。
Seaborn 有几十个策划调色板。它们装载着
sns.set_palette(name_of_palette)
kde 绘图中有四个调色板。
您可以通过故意设置不正确的调色板来访问 seaborn 的许多调色板的所有名称:
sns.set_palette('a string deliberately entered to get an error')
然后可以用 seaborn 的palpot
(调色板绘图)查看每个调色板。传递给 seaborn 的color_palette
构建器的第一项是调色板的名称,第二项是应该显示的颜色数量。在真实剧情中,seaborn 自动确定这个数字,但是你可以在palpot
中控制它。
sns.palplot(sns.color_palette('GnBu', 15))
Seaborn 调色板也可以通过传入十六进制代码来手动设置。
sns.set_palette(['#ffffff', ...])
创造情节
seaborn 中的所有绘图都是用sns.name_of_plot(x, y)
创建的,这取决于绘图的维数。像箱线图这样的一维图只需要一个x
,而散点图则需要一个x
和一个y
。
分布图
分布图通常是单变量数据——只有一个维度的数据,并显示数据点沿数字线的集中位置。Seaborn 对二维分布图进行了调整,可以同时显示两个分布图。
distplot
用直方图绘制一维kdeplot
。rugplot
用记号代替数据点来显示聚类。- 仅输入一维数据时的
kdeplot
绘制分布曲线。当给定二维数据时,它将绘制出等值线图。 jointplot
绘制一个散点图,每边都有直方图,以显示其各自的维度。- 通常用于探索性数据分析(EDA)的
pairplot
绘制数据的各个维度,当变量相对于自身绘制时,显示变量的直方图。该图接收一个pandas
数据帧。
定量和定性变量关系
这些图结合了两种类型的变量——定量变量(如 13、16.54、94.004、连续变量)和定性变量(如红色、蓝色、雄性、离散变量)。
stripplot
水平绘制垂直数据点,以便可以看到相同值的多个数据点。这需要一个定性的x
和一个定量的y
。swarmplot
与stripplot
相似,水平绘制垂直数据点,但更有条理。这以结构化的方式消除了重叠的数据点。violinplot
绘制了数量轴两侧的分布,被视为箱线图的有利替代方案。boxplot
绘制了数据的五个数字摘要——最小值、第一个四分位数(第 25 个百分位数)、中间值、第三个四分位数(第 75 个百分位数)和最大值。不幸的是,它确实有隐藏不规则分布的趋势。- 通过在箱线图顶部展开,
boxenplot
可以显示尾部和更准确的分布描述。 - 标准
barplot
显示高度与数值相对应的条。countplot
表示相同的可视化,但只接受一个变量,并显示每个不同值中的项目数。 pointplot
试图找到一个点(用适当的误差线)来恰当地表示那个数组。该图非常适合于比较数字定性变量。
数量关系
这些图显示了两个定量变量之间的关系。
scatterplot
描绘了两个相互对立的定量变量。lineplot
沿着时间变量绘制一个数量变量,时间变量可以是数量变量或日期变量。
统计模型
统计模型可视化利用统计模型来可视化数据的性质。在许多统计模型可视化中,有调整可视化性质的参数。
residplot
显示线性回归的残差(每个数据点偏离欧几里德距离的线性回归拟合有多远)。lmplot
在散点图上显示带有置信区间的线性回归拟合。该图有几个参数(可在长度中查看,此处为)可用于调整图的性质。例如,设置logistic=True
将假设 y 变量是二进制的,并将创建一个逻辑(sigmoid)回归模型。
自定义情节
创建地块后对其进行自定义涉及到在地块顶部添加特征以增加可读性或信息。
**x**
和 **y**
标签可以用plt.xlabel(‘X Label’)
和plt.ylabel(‘Y Label’)
两个命令添加。
标题标签可以通过plt.title(‘Title’)
命令添加。
刻度旋转可以加上plt.xticks(rotation=90)
(以及 y 轴刻度标签的 yticks),其中 90°可以替换为任何合适的旋转角度。
轴值范围可以用plt.xlim(lower_limit, upper_limit)
和plt.ylim(lower_limit, upper_limit)
指定。该尺寸显示的所有值都将在指定的限制范围内。这些也可用于为图形设置合适的 y 轴基线。
添加图例,如果默认没有,可以添加plt.legend()
。可以添加一个参数loc
来指示图例应该在哪里。默认情况下,matplotlib
会找到最佳位置,这样它就不会与数据点重叠。
显示图和plt.show()
一样简单。虽然不是完全必要,但它去掉了 matplotlib 和 seaborn 打印出来的一些文本,并最终确定了情节。
请务必将此页面加入书签,以便于参考!如果你喜欢,你可能还会喜欢终极数据挖掘和机器学习备忘单,在这个领域你可以很好地利用你的可视化技能,以及终极数据操作和清理备忘单-将数据转换为可视化形式所需的技能。
机器学习指标、统计指标等
medium.com](https://medium.com/@andre_ye/your-ultimate-data-science-statistics-mathematics-cheat-sheet-d688a48ad3db) [## 您的终极数据挖掘和机器学习备忘单
特性重要性、分解、转换等
medium.com](https://medium.com/@andre_ye/your-ultimate-data-mining-machine-learning-cheat-sheet-9fce3fa16) [## 您的终极数据操作和清理备忘单
解析日期、输入、异常检测等等
medium.com](https://medium.com/@andre_ye/your-ultimate-data-manipulation-cleaning-cheat-sheet-731f3b14a0be)
你在 WhatsApp 上的聊天记录可以透露很多关于你的信息
使用 Python 可视化 WhatsApp 聊天
威廉·艾文在 Unsplash 上的照片
最近,我在寻找一些小而令人兴奋的可视化项目来探索数据可视化领域。然后我在 WhatsApp 上发现了一个功能,可以将你的聊天记录导出到一个文本文件中,这个功能非常方便易用。Whatsapp 声称,2020 年,WhatsApp 每天发送近 650 亿条消息,即每分钟 2900 万条。
2016 年考上大学后开始频繁使用 WhatsApp,于是想到了收集并可视化自己最近四年的聊天记录。我从 WhatsApp 上获得了大约 50 个文本文件,包括与朋友和家人的个人对话,以及一些群聊。
对于对代码不感兴趣的人,您可以欣赏这些图片。对于其他人,我也上传了我的 GitHub 资源库中的全部代码。
我在这个项目中使用了 Google Colaboratory ,以防你使用这个或其他平台,然后相应地改变文件的路径。
更新—我在 Github 中添加了 WhatsApp 聊天的情感分析代码和话题建模代码。
加载消息
文本文件中的消息格式为—{日期}、{时间}—{作者}:{消息}
2017 年 9 月 12 日,晚上 10 点 20 分——表格:孙娜兄弟……
纯文本文件必须以有意义的方式进行转换,才能存储在 Pandas 数据框中。我使用这个函数来获取数据帧。
def read(file):
f = open('/content/drive/Drive/Whatsapp/{}'.format (file) , 'r')
m=re.findall('(\d+/\d+/\d+,\d+:\d+\d+[\w]+)-(.*?):(.*)',
f.read())
f.close()
h = pd.DataFrame(m,columns=['date','am-pm','name','msg'])
h['date']= pd.to_datetime(h['date'],format="%d/%m/%y, %I:%M%p")
h['msg_len'] = h['msg'].str.len()
h['date1'] = h['date'].apply(lambda x: x.date())
return h
我把我所有的对话都保存在一个数据文件夹中,这样我就可以列出、加载它们,并把它们合并到一个数据框架中。
files = os.listdir('/content/drive/My Drive/Whatsapp')
lst = []
for file in files:
history = read(file)
lst.append(history)
history = pd.concat(lst).reset_index()
现在我们的数据帧已经准备好了,看起来像这样。
数据帧的屏幕截图
一些统计数据
在过去的四年里,我发了多少条信息?在过去的四年里,我和多少不同的人交谈过?
history_clean[history_clean['name']=='sachin']['msg'].count()
history_clean['name'].nunique()
就我而言,我发送了超过 58k 条信息,和超过 350 个不同的人交谈。我也检查了我的 AM-PM 信息频率 PM-43820,AM-14185。
数据探索
这是本文最激动人心的部分—数据探索。让我们挖掘出这些数据试图告诉我们的所有迷人的故事。
# Create a subset of the dataframe with only messages i've sent
msg_sachin = (history_clean[history_clean['name']=='sachin'])
plt.figure(figsize=(25,8))
msg_sachin.groupby(['date1']).count()['msg'].plot()
这段代码将告诉我们这些年来发送的信息数量。
多年来发送的消息(由代码生成)
这个图非常令人印象深刻,因为它可以非常快速地识别出我是在家里度假还是在大学里。冠状病毒对我发短信模式的影响可以很快确定(我猜每个人都在经历同样的情况)。除此之外,几个月(5 月至 7 月和 12 月)的一些峰值可以通过我大学的暑假和寒假来证明。
我也觉得看到这些年来我的信息长度很有趣。
plt.figure(figsize=(25,8))
history.groupby(['date'])['msg_len'].mean().plot()
历年消息长度(由代码生成)
所以我试着找出那个异常值,我得到了这个-
数组([\ ’ Google drive movies https://drive.google.com/drive/u/ 0/mobile/folders/0 b 6 fjkm qkynziltlwzhl 4 ajuwcfu Google drive 上的编程语言收藏— https://drive.google.com/drive/folders/0ByWO0aO1eI_ Mn 1 bed 3 vnruzenku 书籍阅读—https://drive。google.com/drive/folders/0b 09 qtt 10 aqv 1 sgx rvxbwymnis2m 书籍(小说)—https://drive.google.com/drive/folders/0B1v9Iy1jH3FXdlND[Udemy]数字营销课程全集 https://drive.google.com/drive/ folders/0b x2 vez 2n 3 qd 7s GxkejRhQmdKQlk 书籍阅读用……]
在此之后,我绘制了几个月来我的信息频率。
每月消息频率(由代码生成)
看到这种分布,我很惊讶。我想这也暗示了我在夏天经常聊天😂。
每小时消息频率(由代码生成)
下一个情节很有趣,讲述了你睡觉的时间。这是一天中几个小时的消息频率图(0 表示午夜)。这表明我不是一个夜猫子,更喜欢在 11 点或午夜后睡觉。
此外,从早上到中午,消息的数量会增加。这与一个人应该在这些时间多工作或多学习的事实相反😜。
每日消息频率(由代码生成)
接下来,我还绘制了一周中每一天的消息频率。嗯,看起来不管是周日还是周一,我每天聊天的量都差不多。
现在来看这篇文章最有趣的情节。
让我们画出表情符号
表情符号的完整代码在我的 GitHub 里。我用 Python 的表情库来画这个。您可以使用以下代码行安装该库
pip 安装表情符号—升级
我在过去 4 年中使用的表情符号(由代码生成)
好吧,先说说我第二常用的表情符号💣。我通常在引用电影“Wasseypur 的帮派”中的一些对话时使用它,或者有时没有任何理由。但是我从来没有意识到我对这个表情符号如此着迷💣。
此外,我很高兴地看到,显然,我的生活充满了笑声,惊喜和炸弹!
作为本文的延伸,我在我的 Github 中添加了 WhatsApp 聊天的情感分析和话题建模。对 NLP 感兴趣的可以查一次。
结论
看起来,这种分析在回答一些问题的同时,也提出了许多可以进一步解决的新问题。
你觉得这些见解有用吗?或者你对我错过的一些有价值的见解有什么建议?请随意在下面添加您的评论。
您也可以在 Linkedln 上添加我
创建高效的数据管道
为什么您的数据管道可以快速发展
使用 TensorFlow 数据集和tf.data
轻松将原始数据放入模型
来自 Pexels 的【energepic.com】T2 的照片
让我们弄清楚,现有的数据集是不够的
虽然大多数机器学习程序员从 MNIST 或 CIFAR-10 等常见的开源数据集开始,这一切都很好,但要扩展你的视野,解决问题,你需要超越这些,获得自己的数据。虽然收集数据可能太难,也可能不太难,但大多数人发现很难将这些数据用于训练。这主要是因为有大量的中间步骤,如格式转换(通常用于计算机视觉)、标记化(用于 NLP)以及数据扩充、混洗等一般步骤。
为了使这一过程更容易,让我们首先了解准备数据集的过程。
数据管道中涉及的步骤
图片来自 Pixabay
- 选择要使用的数据集或原始数据后,从压缩格式中提取数据集。提取的数据的格式在下一步中起着重要的作用。
- 将您的数据转换为适合深度学习模型的格式,即转换为数字形式,并应用所需的预处理步骤,如数据扩充、洗牌和批处理。
- 只需将您的数据库加载到工作区,并在您的机器学习模型中用于训练和测试。
这种 ETL 方法对于所有数据管道都是通用的,ML 管道也不例外。
使用单独的框架完成这些步骤可能会很乏味,这正是 TensorFlow 数据集或 TFDS 和**tf.data**
模块适合的地方。让我们看看如何!
先决条件
知识前提
- 熟悉 TensorFlow 或 Keras 框架,
- Python 和安装库的知识。
所需的库
对于代码,你将需要下面的库~
tensorflow
tensorflow-datasets
如果你使用自定义数据集,你可能还需要pandas
和numpy
。
完整的数据管道
收集数据
所有数据管道的前一步是收集数据,这可能很难,取决于资源的可用性。幸运的是,TFDS 确实可以帮助我们轻松快速地完成这一步。只需从 TFDS 广泛的数据集集合中选择符合您要求的数据集。注意数据集的名称、版本和分割,因为稍后我们将在提取步骤中使用它们。如果您已经找到合适的数据集,请跳到提取步骤!
适用于音频、图像、对象检测、NLP 等广泛应用的大型数据集集合。
www.tensorflow.org](https://www.tensorflow.org/datasets/catalog/overview)
然而,如果你想使用自定义数据集(由于没有找到一个合适的在线或其他方式),不要担心!使用tf.data
导入数据集非常简单!
从 NumPy 数组
将您的数据放入两个数组,我将它们分别命名为features
和labels
,并使用tf.data.Dataset.from_tensor_slices
方法将它们转换成片。您也可以为两者制作单独的tf.data.Dataset
对象,并在model.fit
功能中分别输入。
从 CSV 文件
对于从 CSV 文件导入,只需提供文件路径和基本事实标签值所在列的名称。
从文本文件
使用tf.data.TextLineDataset
可以将任何文本文件转换成数据集,这为文本数据集提供了许多选项。
如果你有任何其他格式,检查下面的链接使用它们作为数据集。
[## tf.data:构建 TensorFlow 输入管道| TensorFlow 核心
通过此链接查找从输入数据创建数据集的多种方法。
www.tensorflow.org](https://www.tensorflow.org/guide/data?hl=en#reading_input_data)
ETC 时间!
合作笔记本
这里有一个 IPython 笔记本,在快速训练的合作实验室上,所有这些代码都在这里。这是一种我称之为*“动态笔记本”*的笔记本,因为它在执行大量数据集和用例方面具有多功能性。一定要去看看!
适用于任何计算机视觉数据集的动态笔记本,现在就来看看吧!
colab.research.google.com](https://colab.research.google.com/drive/14dJXqs3nWXdeUMIwN5xVxfqYKERObWgV?usp=sharing)
提取
对于那些已经从 TFDS 找到合适数据集的人来说,这一步相当简单,只需要几行代码。例如,我将使用加州理工学院 2010 年鸟类数据集对 200 个类别进行图像分类[2]。选择这个数据集是因为这个数据集中的图像大小不一致,而且我想进加州理工大学读本科😁
很简单,不是吗?
运行上述代码后,您将看到类似于上图的输出进度线…
现在,如果您转到输出中显示的目录,在我的例子/root/tensorflow_datasets/caltech_birds2010/0.1.1
中,您将能够看到 TFRecord 文件,这是一种适用于大型数据集的高效二进制文件格式。此外,如果数据集需要,您可能会看到多个碎片。
dataset_info.json
文件是一个有趣的文件,因为它包含了大量关于数据集的信息,如引用、描述、分割、URL 等。这对于写研究论文和阅读材料来说很方便。
features.json
是用张量流术语描述数据集模式的文件。这允许 tfds 对 TFRecord 文件进行编码。
改变
这一步通常需要大量的时间和代码。当使用我们已经导入数据集的tf.data.Dataset
类时就不是这样了!第一步是用Dataset.map
方法快速地将图像调整到合适的大小,之后是常规的转换,最后是将标签转换成类别。
助手功能
-
def resize(image, label)
将不一致的图像尺寸改变为共同的(224,224,3)
。 -
def one_hot(image, label)
将标签转换成分类形式。
转换
代码中完成的预处理步骤是~
- 使用
resize
辅助函数调整数据集的大小, - 通过除以 255 来归一化图像值,
- 打乱数据集,
- 批处理数据集,
- 最后,将标签转换成分类编码或一键编码。
创建模型
我创建了一个普通的深度 CNN,这里没有什么太花哨的…注意这里的input_shape
。我在编译亚当优化器和分类损失。
加载模型
我们可以简单地在数据集上运行model.fit
。注意我们没有为model.fit
方法的y
参数输入任何东西,因为y
已经在数据集中了。我已经在图表上绘制了纪元和精确度,并最终以 h5 格式保存了模型。
我们完成了,谢谢你!
您刚刚使用 TensorFlow 数据集和tf.data
训练了您自己的高效数据管道🎉
随着最先进的模型简化为几行代码,在使这些数据管道更好、更快和更通用方面还有改进的余地。随着我们的模型在速度和能力上的提高,我们需要我们的管道在这两方面都跟上。
尽管本文主要讨论了计算机视觉分类问题,但张量流数据集和 TFDS 的用途远远不止于此。
同样,您可以在 IPython 笔记本中轻松检查所有代码,我强烈建议您这样做。
非常感谢你阅读这篇文章!
参考
[1]金玛,迪耶德里克&巴,吉米。(2014).亚当:一种随机优化的方法。学习表征国际会议。
[2]韦林德 p,布兰森 s,塔米 t,华 c,施罗夫 f,贝隆吉 s,佩罗娜 p .加州理工 -UCSD Birds 200" 。加州理工学院。CNS-TR-2010–001。
你在策划错误的事情
更聪明的 EDA 的技巧
快,告诉我,X1 能很好地预测 Y 吗?
正确答案是“不知道。看情况。”如果你很肯定地回答了是/否,那么我很抱歉地说,你对统计学有一个致命的误解。X1 和 Y 之间的相关性没有告诉我们任何关于预测能力的信息。
除了检测数据质量问题之外,绘制变量之间的关系图没有什么价值。如果有什么不同的话,它会导致人们得出不必要的错误结论。然而,这是探索性数据分析中的一个常见步骤(为什么???).
本文将解释为什么应该跳过这一步,以及您可以做些什么。
因果机制
" X1 是预测 Y 的好方法吗?"含蓄地问“如果我们加上 X1,模型会试图适应随机噪声吗?”答案是否会随着其他变量的变化而变化还不太明显。Pairs plots 天真地看待两个变量,好像其他变量都不存在。
事实证明,答案取决于(通常未知的)数据生成过程,可以使用因果图来表示。下面是一个有三列的数据集的一些可能的因果图,其中 X → Y 表示“X 引起 Y”:
u 是未观察到的变量。还有许多其他可能的图表,但我们将用这四个作为例子。如果你想更多地了解这些图表是如何工作的,请跳到我上一篇关于因果关系的文章的后三分之一。
X1 作为的预测器只有在 X2 不在的时候 才有用
上面的两个因果图表明,当我们有 X2 时,X1 作为预测因子是没有用的。从 X1 到 Y 的唯一路径只有通过 X2;一旦我们知道了 X2,X1 就变成了纯噪声。然而,如果我们没有 X2,那么 X1 是一个很好的预测!
X1 作为预测值总是有用的
上面这两个因果图表明,不管 X2 如何,X1 总是一个有用的预测因子,因为从 X1 到 Y 的信息流不经过 X2。
在所有这些图的中,X1 与 Y 相关!这种相关性没有告诉我们 X1 作为预测因子的有用性。
多重共线性检查从因果角度看也很愚蠢;最后一张图使 X1 和 X2 相关,但两者都是有用的预测指标!
没有 X2,X1 是一个很好的预测因子,尽管没有因果关系
此外,请记住预测和因果推断是不同的任务。看这张图表。如果我们的目标是预测,那么在没有 X2 的情况下,X1 应该用来预测 Y。如果我们的目标是因果推理,那么 X1 应该而不是在没有 X2 的情况下使用。本文主要关注预测模型。
我使用上面的图表生成了数据。看看如果我回归 Y~X1 会发生什么:
这表明 X1 是一个很好的预测因子。但是请记住,数据生成过程表明,当我们有 X2 时,X1 是无用的。在控制 X2 之后,查看 X1 中包含多少信息:
我们通过回归 Y~X2 并绘制相对于 X1 的残差来得到这个图,通常称为“增加变量图”或“部分回归图”。几乎没有留下任何信息。X1 变成纯噪声。
然而,这并不而不是意味着 X1 对 y 没有影响。X1 确实有因果关系,但它完全由 X2 介导。
回归输出取决于很多因素。有可能 X1 最终成为重要的一个,或者两者都是。在这种情况下,如果我们观察 X2 的部分回归图(在控制 X1 之后):
我们应该看到信息的痕迹,表明 X2 属于这个模型。
除了最简单的问题,我们很少知道“真正的”因果图。与其猜测哪些变量应该或不应该出现在回归模型中,不如保留所有的预测值,并把它们扔进套索的嘴里?我们有通过正则化自动选择变量的算法。在本例中,LASSO 将系数 0 指定给 X1:
介绍性回归课程讲授使用 AIC/BIC/F/Adj. R 的前向/后向选择,以及基于 VIF 移除预测因子。好吧,当你走出考场的时候,把这些都忘掉吧,因为它们在实践中毫无用处。您无法在这些系数上计算有效的 p 值,并且系数的幅度会太大(过拟合)。相反,或者咨询领域专家来构建一个因果 DAG 或者使用交叉验证正则化。
掩饰
新数据集!现在告诉我,X1 能很好地预测 Y 吗?
如果你回答“我不知道”,很好!X1 和 Y 是不相关的,但是一旦我们控制了 X2,X1 就成为 Y 的一个很好的预测因子:
这一次,因果结构就是所谓的倒叉:
如果我们不知道 X2,X1 和 Y 确实是独立的:
但是一旦我们知道了 X2,X1 给了我们关于 Y 的信息:
再次请参考我之前的文章更详细的解释。这篇文章的目的只是为了表明,将变量彼此对立起来是荒谬的。
需要明确的是,X1 对 Y 没有任何因果关系。但是,它是 Y 的一个很好的预测因子,如果目标是纯预测能力,则应该包括在模型中。
虽然第一个例子相对来说是良性的,但是当分析师因为没有相关性而从不尝试将 X1 放入模型时,这个例子可能是灾难性的。或者,同样糟糕的是,他们做了相关性测试,得出 X1 和 Y 完全不相关的结论:
永远不要永远不要 使用相关性或曲线手动选择回归变量。要么咨询领域专家来绘制因果 DAG,要么让它正规化——LASSO 可以比你我做得更好。
转换
从这两个例子中,应该很清楚残差是信息的使者。
新数据集!X1 是 Y 的好预测吗?
正确的答案是,“我不知道。”
正如我们到目前为止所了解的,这种类型的视觉化几乎是没有意义的。那么我们应该用什么呢?当然是残差 vs 变量!这里我们回归 Y~X1+X2,并检查每个预测值的残差:
我们看到我们需要将 X1 特征工程到我们的回归模型中。这在变量与变量图中几乎看不到,但一旦我们检查残差,就会一目了然。
要获得关于 Y 的信息,您需要根据残差回归拟合值。在这种情况下,只能看到来自省略的 X1 的弱信号:
你从 pairs 图中看到的任何必要的变换也可以通过残差图看到,但是反过来就不正确了。你可以通过将所有变量放入一个回归中,并检查单个变量的残差来进行 EDA。
最后
希望你已经知道传统的对图/关联热图对于分析数据几乎没有意义。相反,依靠残差和拟合系数来查看因变量和自变量之间的关系。
有些人可能会反对“但是我们需要检查变量的分布!”实际上,不,除了检查数据质量问题,我们真的不关心,例如,丢失的数据是否编码为 9999?数据被正确审查了吗?是否存在数据泄露?(尽管最后一项出现在好得令人难以置信的评估指标中。)
回归对任何变量的分布绝对没有假设或限制。假设是在残差上,甚至常态部分往往都无关紧要。
我最讨厌的一件事是,人们抱怨他们的预测值不是正态分布的,log/Box-Cox 变换不能使预测值成为高斯分布。然后他们开始抱怨统计因为不切实际的假设而不切实际,而他们抱怨的假设根本不存在。绝对触发。
反正 EDA 对变量不好,EDA 对残差好。
用 P 值认识这些问题
以及为什么 P 值小于 0.05 并不重要
塞巴斯蒂安·赫尔曼在 Unsplash 上的照片
简介
p 值是频数统计中的一个重要概念,通常在统计学导论课程中讲授。
不幸的是,这些课程要么在解释 p 值可以(和不可以)做什么方面做得不好*,要么公然宣传与 p 值在因果推理中的作用有关的虚假宣传。*
这导致了很多本科生,甚至是应该更了解的学者,在研究中做出不正确的主张,都是因为发现 p 值小于 0.05。
本文的目标是澄清围绕 p 值的神话,并希望鼓励数据科学家在他们自己的项目中超越 p 值。
P 值是多少?
对 p 值的任何准确解释都必须首先讨论零假设显著性检验(NHST)。
NHST 是一个统计程序,研究者通过它陈述两个假设:一个零假设和一个替代假设。
零假设表明给定的处理对目标变量没有影响。另一个假设陈述了相反的情况;也就是说,给定的处理不会影响目标变量。
例如,假设我们想确定最低工资法是否会导致更高的失业率。
无效假设和替代假设可能如下:
**零假设:**最低工资法不影响失业率。
替代假设:最低工资法增加了失业率。
通常,研究人员想要拒绝零假设。(拒绝零假设会增加替代假设的可信度)。
然而,我们应该如何拒绝零假设呢?
这就是 p 值的来源。
p 值是一个介于 0 和 1 之间的数字,它告诉研究人员在假设零假设为真的情况下观察到某个值的概率。
假设我们想检验我们的最低工资假说。我们收集了美国城市的随机样本——有些城市有最低工资法,有些没有——发现有最低工资法的城市的失业率平均比没有最低工资法的城市高半个百分点。
这是自由市场资本主义的胜利吗?我们应该废除全世界的最低工资法吗?
不完全是。
在标准的学术研究中,大于 0.05 的 p 值通常不被认为是*统计显著的——*一个用来掩盖任意分界点的花哨短语。
假设我们得到 p 值为 0.78。也就是说,如果我们假设零假设是真的,那么有 78%的可能性,我们会看到有最低工资法的美国城市和没有最低工资法的美国城市之间有半个百分点的差异。
如果我们试图将这些结果提交给学术期刊,那么期刊的编辑可能会嘲笑我们回到 Medium(当然是开玩笑,因为阅读 Medium 的人比阅读美国政治科学杂志— 的人多,但我离题了)。
在标准的学术研究中,大于 0.05 的 p 值通常被认为不具有统计显著性*—*一个用来掩盖任意分界点的花哨短语。
所以,p 值是 0.78。太糟糕了。我们如此努力的研究被证明是毫无意义的。
马科斯·保罗·普拉多在 Unsplash 上拍摄的照片
但是,等等!
也许任意截止点的一个优点是它防止虚假研究进入著名的学术期刊。
是吗?我们会回来的。
P 值的(许多)问题
1) P 黑客
我们刚刚被我们最喜欢的学术期刊拒绝,因为我们的 p 值太高了。
然而,我们对我们的结果有把握。我们是在弗里德曼、格林斯潘和伯南克的教导下长大的。我们知道最低工资法会对劳动力市场造成巨大破坏。
所以,我们回到我们的研究,看看我们是否可以降低我们的 p 值。首先,我们将更多的城市纳入研究:来自加拿大、中国、巴西、欧洲和俄罗斯的城市。因为 p 值与样本量成负相关,所以增加样本量会降低我们的 p 值。
其次,我们决定改变我们的模式。我们控制了可能对城市失业率产生影响的特征——人口规模、地理位置、税率等。还有一些与失业率有着更难以解释的关系的特征,比如城市中星巴克的数量。一般来说,增加模型的复杂性可以降低 p 值,因为我们的模型可以解释样本中更多的随机性。
现在我们的 p 值是 0.1。好一点,但还是没出息。
最后,我们改变我们的测试统计。也许我们使用了学生的 t 检验,但现在我们决定使用卡方检验和…
p 值= 0.049。
完美的。我们的结果现在具有统计学意义。学术期刊决定发表我们的研究。
上述程序被统计学家亲切地称为“p hacking ”,是一种操纵数据分析过程的形式,其程度之深,掩盖了比它提供的更多的信息。
作为一名研究人员,您不能:
- 报告称,只有当您将非美国城市包括在内时,您的测试才变得“具有统计学意义”
- 探索您使用的其他模型(这些模型在统计上不显著)
- 报告你的结果只有卡方检验有统计学意义;学生的 t 检验产生了无统计学意义的结果
不幸的是,p hacking 在学术研究中普遍存在,它通常会导致难以重现的结论。(如果一篇研究文章报告 p 值为 0.049,你可以合理地确定该研究人员进行了一些 p 黑客攻击)。
2) P 值不能说明事实
反正你的 p 值现在是 0.049。
万岁!
如果零假设是真的,那么我们有 4.9%的机会观察到有最低工资法的城市和没有最低工资法的城市之间的失业率差异 0.5 个百分点。
据应用研究人员称,这意味着我们现在可以安全地 拒绝 的无效假设。也就是说,我们已经证明最低工资法对失业率没有影响。
这是许多应用研究人员出错的地方。
低 p 值本身并不能说明零假设(或替代假设)的真假。
不相信我?
以下是美国统计协会(ASA)对这个话题的看法:
p 值不衡量所研究的假设为真的概率,也不衡量数据仅由随机机会产生的概率。
如果零假设为真,观察结果将出现的 4.9%的概率不转化为零假设为真的 4.9%的概率。
根据 p 值的定义,这个结论应该是显而易见的:
p 值是一个介于 0 和 1 之间的数字,它告诉研究人员在假设零假设为真的情况下观察到某个值的概率。
我们测量的是观察某个值的概率,而不是假设为真的概率。
我们已经看到操纵 p 值是多么容易:
- 增加样本量
- 使我们的模型复杂化
- 使用不同的测试统计
然而,p 值作出了许多其他假设,这些假设可能不适用于当前的研究。
例如,p 值假设我们正在比较相似的组。也就是说,美国城市和中国城市相似。这是一个不太可能的假设,即使我们的模型过于复杂。首先,中国城市的政治体系与美国城市截然不同。我们的模型无法量化这种差异。
同样,p 值假设待遇(最低工资)是随机应用的。
当然,这不是真的。一个美国城市有最低工资而另一个没有,这一事实与随机性关系不大,更多的是与政治和经济差异有关。
3)低 p 值并不意味着强烈的影响
假设我们再次篡改了我们的模型。现在,我们得到 p 值为 0.004。如果我们假设零假设是真的,那么现在只有 0.4%的可能性,我们会观察到有最低工资法的城市和没有最低工资法的城市之间有 0.5 个百分点的差异。
暂时,让我们忽略 p 值的所有其他问题,让我们假设我们的结果代表地面真理。
谁在乎呢。
我们是否应该阻止数百万人获得生活工资,因为这可能会使失业率上升半个百分点?
通常,低 p 值掩盖了预测的因果影响微不足道的事实。美国广告标准局写道:
科学结论和商业或政策决策不应仅仅基于 p 值是否超过特定阈值
不幸的是,许多应用研究人员忽略了因果影响,并使用小 p 值来提出政策建议。
回到我们的最低工资的例子,仅仅考虑 p 值来决定一项政策是不正确的。我们必须采取更全面的方法。
所以,p 值很烂。我们做什么呢
我们已经展示了 p 值是如何误导人的。如果不是因为它几乎被普遍接受为因果关系的充分指标,这不会是一个大问题。毕竟,许多统计数据本身可能会产生误导。
因此,这就引出了一个问题:我们应该停止报告 p 值吗?
2015 年,基础和应用社会心理学【BASP】期刊禁止论文报道 p 值——在我看来,这是一个激烈的举措。
我认为解决办法是教育人们使用(和误用)p 值。
p 值从来没有打算成为统计研究的存在理由。相反,当罗纳德·费雪——频率主义统计学的教父——在 20 世纪 20 年代开发 p 值时,他打算把它作为因果分析中的一个步骤。
尽管许多人对它有误解,p 值仍然提供了一些有趣的信息。它必须与其他统计数据、领域知识和(一点)常识结合使用。
笔记
- 最低工资法例子的另一个假设也可以写成“最低工资法影响失业率”;然而,正如我在文章中所写的,劳动经济学家通常对另一种假设感兴趣。
文献学
[1]努佐·里贾纳(2014)《统计误差》 Nature Vol. 506。
[2] Head ML,Holman L,Lanfear R,Kahn AT,Jennions MD (2015)《科学中 P-Hacking 的程度和后果》。PLoS Biol 13(3): e1002106。【https://doi.org/10.1371/journal.pbio.1002106 号
[3] Cumming,Geof(2015)《p 黑客入门》。方法空间。https://www.methodspace.com/primer-p-hacking/
[4]罗纳德·l·瓦瑟斯坦和妮可·a·耶戈(2016)“美国统计学会关于 p 值的声明:背景、过程和目的”,《美国统计学家》,70:2,129–133,DOI:10.1080/00003035486
[5]卡尔彭,塞缪尔·C(2017)“P 值问题”,美国药学教育杂志, 81:9,93
你说的是实话,但你的想象不是
关于视觉完整性的一课
马库斯·温克勒在 Unsplash 上的照片
为什么要创造一个歪曲事实的形象呢?问得好。
虚假陈述可能有多种原因,但最主要的一个原因是:为了迫使观众做出某个特定的行为,在观众内部制造一种情绪反应。换句话说,可视化创建者对发布他们的议程比对精确描述数据更感兴趣。
现在,不要误解我,有很多时候事实数据支持一个人的潜在意图,但当它不支持时,一个人不应该在视觉上夸大它,使它确实如此。
综上所述,我们知道数字不会说谎,但是数字的呈现方式会极大地影响得出的结论。
在讲述一个当今的例子之前,我想先给你们介绍一下耶鲁大学的教授爱德华·塔夫特。早在 1983 年,他写了一本名为的书,定量信息的可视化显示,这本书对当今的统计界产生了深远的影响。《美国统计组织杂志》甚至称之为“迄今为止对图形研究的最重要贡献”
在这本书里,塔夫特介绍了一个寿命因子的概念。简而言之,这个因素的目的是计算可视化在表示其底层数据时的诚实程度。理想情况下,lie 因子应该是 1.0,因此任何其他值(除了较小的方差之外)都意味着可视化在表现底层数据方面存在一些不匹配。
寿命因数定义为:
接下来,数据中效应的大小定义为:
这还有点模糊吗?我的猜测是肯定的,因此当前的示例应该有助于您轻松理解这一重要指标。
在《华尔街日报》最近发表的一篇文章中,展示了一张图表,旨在说明 2020 年和之前年份之间各种原因导致的死亡的增加。在详细讨论图表之前,您认为其创建者的潜在意图是什么?
资料来源:国家卫生统计中心
我认为他们想让你认为 2020 年 4 月死亡人数会大幅增加。不仅仅是增加,而是显著的增加。此外,这张图出现在一篇关于新冠肺炎的文章中,这也可能是他们想让你认为这种病毒本身非常致命,尽管它实际上的死亡率在 0.2%到 0.4%之间。
现在,让我们通过计算它的谎言因子来研究这个图表,看看它在视觉上如何准确地表示基础数据。
为了计算图形中效果的大小,我们首先测量从 X 轴到蓝色和褐色线的像素距离。蓝色线条的高度为 352 像素,而棕色线条的高度为 92 像素。
图形中显示的效果大小
接下来,我们计算数据中影响的大小。在这里,我们观察到,在 4 月 11 日这一周,2020 年记录了 71,784 例全因死亡,而同一周 2017-2019 年的平均值为 55,647 例死亡。
数据中显示的效果大小
最后,我们计算谎言因子为:
呀!看来我们关于图表歪曲数据的预感是正确的。可悲的是,这种事情发生得太频繁了。在这种情况下,用来误导观众的技巧是从 50,000 而不是 0 开始绘制图形。
将来,当你看到各种各样的视觉化图像时,请记住谎言这个因素。此外,问自己这些问题:
- 轴线从哪里开始?它们是从 0 还是其他数字开始?
- 这个图表是三维的吗?(我们的大脑很难理解这些)
- 有不同大小的物体被比较吗?
这些问题,以及达雷尔·赫夫写的本书中概述的中的许多问题,在消化和创作图形时问自己是很重要的。
请记住,数字不会说谎——人会说谎,而且人们有各种各样的理由这样做。做一个能够正确描述你的数据的可视化的人,同时也要意识到其他人可能会试图用他们的数据误导你。
异常检测的 z 分数
内森·希维利在 Unsplash 上拍摄的照片
小块数据科学
大多数时候,我会写一些关于数据科学主题的较长的文章,但最近我一直在考虑围绕特定的概念、算法和应用程序写一些小文章。这是我在这个方向上的第一次尝试,希望人们会喜欢这些作品。
在今天的“小话题”中,我写的是在异常检测背景下的 Z 分数。
异常检测是一个识别需要检查的意外数据、事件或行为的过程。这是数据科学中一个成熟的领域,有大量算法可以根据数据类型和业务环境来检测数据集中的异常。Z-score 可能是最简单的算法,可以快速筛选候选人进行进一步检查,以确定他们是否可疑。
什么是 Z 分数
简单地说,Z 得分是一种统计度量,它告诉你一个数据点离数据集的其余部分有多远。用一个更专业的术语来说,Z-score 表示一个给定的观察值距离平均值有多少标准偏差。
例如,Z 值为 2.5 意味着数据点距离平均值有 2.5 个标准偏差。由于它远离中心,因此被标记为异常值/异常值。
它是如何工作的?
z 得分是一种参数测量方法,它采用两个参数—平均值和标准差。
一旦计算出这两个参数,就很容易找到数据点的 Z 值。
注意,平均值和标准偏差是针对整个数据集计算的,而 x 代表每一个数据点。这意味着,每个数据点都有自己的 z 值,而均值/标准差在任何地方都保持不变。
示例
下面是 Z-score 的 python 实现,带有几个样本数据点。我会在每一行代码中添加注释来解释发生了什么。
# import numpy
import numpy as np# random data points to calculate z-score
data = [5, 5, 5, -99, 5, 5, 5, 5, 5, 5, 88, 5, 5, 5]# calculate mean
mean = np.mean(data) # calculate standard deviation
sd = np.std(data)# determine a threhold
threshold = 2# create empty list to store outliers
outliers = []# detect outlier
for i in data:
z = (i-mean)/sd # calculate z-score
if abs(z) > threshold: # identify outliers
outliers.append(i) # add to the empty list# print outliers
print("The detected outliers are: ", outliers)
注意事项和结论
如果你研究这些数据,你会注意到一些事情:
- 有 14 个数据点,Z-score 正确检测到 2 个异常值[-99 和 88]。然而,如果您从列表中删除五个数据点,它只检测到一个异常值[-99]。这意味着您需要有一定数量的数据大小,Z-score 才能工作。
- 在大型生产数据集中,如果数据呈正态分布(也称为。高斯分布)。
- 我使用了一个任意的阈值 2,超过这个阈值,所有的数据点都被标记为异常值。经验法则是使用 2、2.5、3 或 3.5 作为阈值。
- 最后,Z-score 对极值很敏感,因为均值本身对极值很敏感。
希望这有用,请随时通过 Twitter 联系。
斑马探测器——您的第三个端到端 CNN
罗恩·多芬在 Unsplash 上的照片
第三 CNN?
这是我在自己动手 CNN 模型系列的第三篇文章。像往常一样,格式将保持不变。我给你一个 Colab 文件(非常好用),你必须在没有任何条件的情况下运行它,然后才能继续。原因是,一旦你自己运行它,你会变得更加重视这个问题,你会得到更深刻的见解。
你可以在这里查看我以前的文章:
所以,事不宜迟,让我把 Colab 文件交给你🚀。这不是我的作品,而是从各地抄袭来的。我在这里做的唯一一件事是确保它在 Colab 设置中运行良好(令人惊讶的是,这很难做到)。但是,尽管如此,它现在工作得很好,唷!
请随意上传您的图像并检测它们!现在,这个文件看起来可能有点吓人,但实际上并不是这样。像往常一样,我们先从理论开始,稍后将讨论实现细节。此外,根据我以前的文章,我会尽量保持简短和甜蜜。
分类 Vs 定位 Vs 检测
首先,我们所说的检测实际上指的是什么?
- 分类——在图像中找到主要项目并标记它。
- 定位——找到图像中的主要项目,标记它,并找到它的位置。
- 检测—检测图像中的所有项目,找到它们的位置,并标记它们。
目标检测
对象检测看起来很复杂,但实际上并不复杂。它只是建立在我们已经了解的 CNN 的基础上。因此,我们早期的细胞神经网络有一些缺点,由于它不适合对象检测。让我们试着找出这些问题,你自己会建议一些调整来克服它们。在这个过程中,我们将理解令人生畏的物体探测器背后的直觉。
请记住一件事——我们的目标不仅仅是对图像进行分类,还要找到它的位置。事实上,图像中的所有项目都应该被检测、标记和定位。
缺点 1 —输出层
一些快速的问题!
- 我们在 手写数字分类器 中有多少个输出节点?
- 我们应该如何在输出中输出被检测项目的位置?
想想吧!这不是火箭科学!!🤔
好了,回答时间!!
之前我们有 10 个输出节点。原因是,只有 10 个标签是可能的(0–9)。现在,如果我们除了标签还想要位置,我们应该怎么做?
想象一个假想的多边形(中心:(x,y),宽度:w,高度:h )可以包围那个数字。现在,我们只需要输出矩形和万岁的坐标,我们也将有本地化信息。仅此而已!因此,如果你会看到,我们刚刚在输出层添加了一些信息,以获得位置信息。
作者图片
上一次输出:【0,0,0,1,0,0,0,0,0】 新输出:【0,0,0,0,1,0,0, x,y,h,w
因此,这里前面的输出表示我们的输出数组的一位热编码,因此只有 3 是 1,其他的输出是 0。物体探测器会再增加 4 个坐标来让我们知道它的位置。瞧啊。所有其他反向传播将一如既往地工作(因为只多了 4 个输出)。
缺点 2-多重检测的输出层
现在,当一幅图像只有一次检测时,我们之前所做的工作是有效的。当一个图像可以有多个检测时,我们该怎么办?!
想想吧!?我们只需要一种方法来解决如何在输出中发送所有检测的多个坐标。
- 上一次输出:【0,0,0,1,0,0,0,0,0,0】**
- 你在上面看到了什么?一个有 10 个元素的数组?还是大小为 10 的[11]矩阵?你想想,个位数不过是个[11]矩阵,对吧?
- 我们能不能用这种新的可视化方式来添加我们的位置信息?
是的,你认为它是正确的,如果我们有一个[10 * 5]矩阵,我们可以很容易地使用它来容纳所有类别的位置信息。
有趣的事实!实际上是[510]矩阵还是[11510]矩阵?坚持这个想法。
作者图片
缺点# 3-多个相同检测的输出层
上面的方法可以,但是如果一个图像中有两个 3 呢?我们的输出层将再次失败。有人可能会说,我们把上面的矩阵更新为[910]吧,多容纳一个 3。但是,它没有尽头。一个图像可以有 100 个相同的标签。我们需要想点别的!*
如果找不到答案,那就改问题!
好吧,这个问题什么时候来?当你有一个巨大的图像,里面有很多物体,对吗?让我们把图像分成更小的块来彻底解决这个问题。
因此,对于每个图像块,将有一个[510]矩阵。比方说,我们创建了一幅图像的 N 个块,因此我们在输出中将有[ N 510]个矩阵。*
作者图片
有趣的事实——你刚刚学会了 YOLO(你只看一次)!!🚀
缺点 4——CNN 将如何处理这些信息?
仔细想想,这里没什么新鲜的。输入图像是一样的,检测数字的内核也是一样的。因此,一切都将以完全相同的方式工作。
*这里唯一不同的是输入图像的**大小。*比原来的层能处理的大一点。因此,由于尺寸较大,它将有大量的输出。
所以,早些时候 CNN 产生了 10 个输出。这一个将产生更多,因为我们有一个更大的图像,但卷积层的数量保持不变。这就是我们有意要做的。因为现在输出信息增加了(也包括仓位)。
缺点 5——一个项目分成多个块
新的解决方案会带来一系列新的问题。当我们将一幅图像分成多个更小的块时,一幅图像可能存在于多个块中。在这种情况下,一个项目可能会被检测两次。如何解决这个问题?
当有 100 个学生想成为班上的第一名时,你通常如何解决这个问题?你要求他们证明他们的可信度。哪个分数最高,谁就是冠军。一模一样。检测到最高概率和最佳定位位置的任何一个组块都应该得到该项目。简单!
是的,在检测之后,将会有一层来宣布该物品在战斗块中的获胜者。在 YOLO,有一个概念叫做并上交集,用于检测战斗块的可信度。如果你愿意,你可以在网上了解更多。
顺便说一句,你刚刚学习了非最大抑制🚀
缺点 6——一个块中有多个项目
如果一个 chunk 需要检测多个类怎么办?我们来了解一下什么时候能发生这种情况?理想情况下,由于块的尺寸较小,这种情况不应该发生。但是,如果我们在一个图像中有重叠的项目呢?这种情况很有可能发生,对吗?
但是,多田!我们已经在我们的缺点#3* 中解决了。我们的每个块已经能够检测所有的类。很酷很强大,对吧?!*
履行
Colab 文件应该运行得很好。这可能有点令人望而生畏,但是当您阅读代码时,您会意识到这只是:
- 创建一个巨大的多层 CNN
- 从预先训练好的模型中加载砝码
- 在样本图像上测试它(在我的例子中是斑马)
- 然后剩下的代码只是创建一个框来帮助你可视化本地化输出
我强烈建议上传不同的图片,然后玩玩。还有,所有的实现逻辑都是受这个和这个的启发。
这就是物体探测器的全部内容。我只是有意提到了 YOLO。其他技术将覆盖某一层。
更多推荐
所有评论(0)