被低估的统计分析指标
对鲜为人知但非常有用的数据分析指标的概述。
https://unsplash.com/photos/NDfqqq_7QWM
介绍
S 统计分析已经成为全球企业决策和分析处理的重要工具。近年来,科学在商业和技术领域的应用越来越有用。有很多不同的方法来统计分析数字。尽管如此,许多数据科学家和数据分析师倾向于避免探索统计的奇妙世界。
这方面最流行的测试是学生 T 测试。学生 T 检验是一种行业标准,用于获得具有统计显著性的概率值。通常在大学里,这是所学的统计学的第一个应用。这是有充分理由的,因为配对 T 检验和独立 T 检验都可以提供许多关于数据的非常有价值的信息,人们可能很容易处理这些数据。
尽管通常使用 T 检验来寻找统计意义,但统计世界还有更多需要经常使用的东西。根据所处理的数据,有许多不同的测试有自己的应用。今天,我想介绍一些我在分析经验中发现非常有用的指标。
标志测试
我想谈的第一个指标是符号测试。符号检验是一种统计检验,它使用二项分布来返回概率。这项测试是通过获得一些正值和负值,然后将它们通过二项式分布的程序密度函数(PDF)来完成的。
这是一个非常酷的测试,因为它可以用比大多数典型的统计测试少得多的数据提供准确的读数。另一件很棒的事情是,它背后的数学相对简单,通常可以手工完成,同时仍然保持推理和事实的性质。这个测试的唯一显著障碍是编程有多难。二项式分布非常注重阶乘的计算。这对现代计算来说是个问题,因为众所周知阶乘很难用计算机来计算。在大多数情况下,编程语言中的阶乘函数应用递归来一致地循环并添加计数。这意味着在更大的数据集上使用符号测试可能意味着多次巨大的阶乘计算。
虽然符号测试在性能方面有其不足之处,但它肯定是你的武器库中的一个伟大的测试。每当数据计数较小时,这甚至更加有效,因为有时在没有固定数量的样本的情况下,很难从其他测试中获得可靠的读数。如果你想了解更多关于符号测试本身的知识,我很久以前写过一篇关于它的文章,详细阐述了如何使用这个测试:
普通 PDF/CDF
如果你已经在统计领域工作了一天,很有可能你已经和正态分布有过接触。正态分布是一种 PDF 非常容易计算的分布。正态分布通常作为大多数统计数据的基础,并将数据转换为代表平均值标准偏差的值。
令人惊讶的是,这种分布作为分析知识的来源相对较少使用,但是您可以从这种分布中了解到许多关于您正在处理的数据的信息。首先,PDF 可以告诉你很多关于特定值的标准偏差。通常,当一个值具有统计显著性时,它最终会偏离平均值大约两个标准偏差或更多。实际测量值是 1.96,但一般来说,我说你应该寻找一个 2 左右的数字,一旦你达到它,它可能表明有统计学意义。这是一种相当容易的分析数据的方法,并且通常非常快,但是没有例子的描述通常是令人困惑的。
让我们考虑一个例子,我们有一个直接来自县区民主投票的法案。我们想知道一个县是否更有可能以这种或那种方式获得选票,所以首先我们通常分配该县所有投票的总体人口。之后,我们可以分离该县每个地区的样本,并比较这些值之间的平均值,平均值高于 2 或低于负 2 的样本最有可能具有统计显著性。为了验证一个潜在的假设,当然需要进一步的测试,但是使用这种分析知识肯定有助于首先形成假设——这有时可能是分析数据和发现见解最困难的部分。
除了 PDF 提供的分析能力,我们还有 z 检验。z 检验将使用正态分布的累积分布函数(CDF)。为了得到累积分布的概率,几乎总是使用这些函数。正态分布的 CDF,bnv 上 CDF(不确定是否正则化)对于提供丰富的见解非常有价值,因为它实际上比典型的学生 T 检验更难通过。
所有这一切意味着,z 分数验证的统计数据往往比那些由典型学生 T 检验的概率支持的统计数据更现实,甚至更有效。这是为什么呢?这是因为正态分布的尾部通常要小得多。这也是 T 检验更常用的部分原因。然而,一个有效的 z 得分概率通常比典型的 T 检验显示出更多的统计意义。
f 检验
尽管 T 检验更为常见,但许多科学家和统计学家都坚信 f 检验。正如您所想象的,这个测试使用了 f 分布。f 分布具有将统计意义的焦点放在数据可变性上的独特能力。如果差异足够显著,统计学家可以得出两个值的平均值不相等的结论,这可能表明连续的统计显著性。大多数 F 测试都是通过考虑一组数据的方差分解而产生的。
有很多很好的理由来利用 f 检验,并将其添加到您的统计测试团队中。f 检验通常被认为比学生 T 检验严格得多,也更有声望。更好的是,分布在回归中有应用,当然可以用来告诉更多的数据。此外,f 检验是 ANOVA 或方差分析背后的主要超能力。
威尔科克斯秩和
另一个被低估的统计检验是 Wilcox 秩和检验。检验是通过对样本和总体的等级求和来完成的。然后我们从两个群体中得到这些等级的总和,并对两者进行比较。不用说,这个测试背后的数学非常简单,并且不太适合方差很小的数据。
这意味着这些类型的测试肯定有它们的应用。我通常喜欢用正态分布来评估这个测试是否适用。我们可以计算离平均值几个标准差的值。这些值可能表明总体中的平均值和其余数据之间存在很大差异。当然,另一种我们可以完成的方法是方差分析,甚至是 ANOVA。
皮尔逊相关
我想谈及的最后一个指标是相关系数,在统计学中也普遍标有 r。这个值可能为许多机器学习工程师或数据科学家所熟悉,因为通常 r 是用于评估连续模型性能的度量。
相关系数能够以一种非常简单的方式说明两组不同的连续数据之间的相关性。平方它实际上可以返回一个百分比,这个百分比将表明这两个集合的相关程度。这也是我们评估模型的方式,因为这个百分比精度通常用作回归模型的基于百分比的精度数字的基础。
结论
统计的世界是广阔而迷人的,我认为探索它是一生的旅程。与数据科学工作的任何其他部分一样,总有一些新的和令人兴奋的东西需要学习——这是我如此热爱它的部分原因。人们很容易陷入大多数统计学家正在进行的普通测试的窠臼,但探索和利用数学所提供的一切并将其应用到您的工作中,正是这将使您与其他使用相同数据的科学家区分开来。感谢您的阅读!
了解主动学习:交互式可视化面板
一个聪明的工具来阐明主动学习是如何工作的,为什么它是好的(或坏的),并且可以做得更多
介绍
在这篇文章中,我们旨在介绍一种交互式可视化工具,帮助用户更好地理解传统主动学习的工作方式和原因。这项工作与我们最近在 NeurIPS 2021 以人为中心的人工智能研讨会上发表的一篇论文有关。
以人为中心的机器学习
在过去的几十年里,机器学习已经成为一个时髦词。最近的许多进展都集中在使模型更加精确和有效。与此同时,人类能够解释他们为什么工作至关重要,特别是在一些敏感领域,如自动驾驶、金融投资和医疗保健管理。如果我们不能说服自己为什么这些智能机器工作良好,领域专家将不会完全相信他们的预测。
不幸的是,仍然有许多机器学习应用程序,其中最先进的模型可以实现强大的预测能力,但准确性的提高是以透明度为代价的,并且所达成的决定缺乏可解释性。直到最近,我们才开始看到一种转变,即让高级算法变得具有交互性和可解释性。换句话说,我们希望放大和增强人类的能力,旨在保持人类的控制,并使机器学习更加高效、有趣和公平。这个想法得到了几个知名机构的支持,比如斯坦福以人为中心的人工智能研究所和谷歌人&人工智能研究。
主动学习
主动机器学习。鸣谢:受张懿主动学习幻灯片的启发。
如果你读过我之前在 R 发表的关于主动学习的帖子,你会知道我的研究热情是促进主动学习的可解释性。在这里,我想快速更新一下什么是主动学习:一种交互式方法,它查询 oracle(通常是人类注释者)来标记最“有价值”的数据,以便用最少的标记样本训练准确的机器学习模型。
主动学习的大部分理论工作都是在分类问题上进行的,发展了许多基本的和成功的算法,如不确定性抽样和委员会查询。为了评估主动学习,最常见的方法是通过查询的数量来绘制准确度,其中我们期望准确度随着更多样本被查询而提高。不限于分类,最近的研究也采用了一些类似的算法进行回归,标准的性能指标是均方误差 (MSE)。
问题:许多主动学习论文呈现了高度相似的准确度/均方误差曲线,然而却报道了几个相互矛盾的发现。从精度/MSE 图反映的信息既有限又可能对用户有偏见。
例子摘自最近的 CVPR 论文
例如,CVPR 最近的一篇论文中的 CIFAR10 实验(第一个图)显示了所有查询方法(除了“随机”)几乎相同的性能。一个合理的假设是,即使曲线是重叠的,这些主动学习方法也不会同样地改进分类模型。一个支持的证据是它们在其他实验中表现各异。但问题是:我们如何测试它,并实际观察不同的算法是否工作不同?
OOur 方法&实验
在我们在 NeurIPS 2021 以人为中心的人工智能研讨会上发表的论文中,我们提出了一种新颖的交互式可视化工具,让人们更好地理解主动学习为什么以及如何在某些分类和回归任务上工作。
在本节中,我们将通过一个生动的例子来简要分享这些见解是如何构建的(不要担心,不会有任何太专业或复杂的定义!).
测试数据集的主成分分析
在机器学习实验中,准确性或 MSE 是基于最初划分的测试集生成的。例如,“准确度=(准确预测的样本数/测试集中所有样本数)。”因此,第一个任务是布局所有测试样本,并创建一个用于可视化的二维特征嵌入。PCA 等降维技术会有所帮助。
实验设置
**数据集:**在我们的论文中,我们用真实世界的数据进行了主动学习回归问题: CASP 。它最初包含 45,730 个实例,我们在测试集中随机选择了 9,730 个(21%)。
机器学习模型:回归器是一个纯粹的随机树模型,具体来说,来自 NeurIPS 2019 年论文中的蒙德里安树。
主动学习过程:我们从一个空的训练集开始,每次迭代批量查询 500 个,15 批(共 7500 个)后停止。考虑了三种基本的查询策略:基于树的主动算法(al)、不确定抽样(uc)和随机抽样(rn)。
左:主动学习实验的 MSE 图。右侧:所有测试样本的 PC1 与 PC2
PCA 图显示了所有测试样本之间明显的聚类模式。更重要的是,用户可以用 PCA 图选择一部分(一组)感兴趣的测试数据点。
左侧的 MSE-Query 图显示了理想的下降趋势。主动采样策略是最好的,但不确定性采样似乎具有竞争力,有超过 3,500 个样本被标记。
交互式可视化面板
在我们的案例中,我们想回答这个问题:*主动抽样策略是否与不确定性抽样同样有效?*这个问题可以通过预测值在每次查询迭代中如何变化来直接解释,这促使我们构建一个交互式可视化工具。
我们将预测值排列成一个二维网格图: x 轴表示查询过程(单元可以是单个或批量查询); y 轴代表所选测试样本的指标;每个像素根据三个标准显示预测差异,这三个标准是:
1。当前模型与原始模型:如果模型不断改进,并从查询的实例中学习,我们预计预测值会逐渐变得越来越不同。这可以通过更加丰富多彩的网格图来体现。
2。当前模型与先前模型:对于某些策略,我们预计稍后查询的样本对改变模型的影响较小。这可以通过图上较浅的颜色反映出来。
3。当前模型与事实真相:随着查询更多样本,我们期望模型做出更好的预测,更接近事实真相。这也可以通过一个较轻的情节体现出来。
(这些标准有严格的定义。如果您有兴趣了解更多信息,请查看我们的论文!)
小数值例子上三种人工智能策略的预测变化图
假设我们从 PCA 图中选择一组小值点(用红点标记)。3 为每行中三种策略(“al”、“uc”和“rn”)的预测变化图提供了 3 个面板图。
观察
查看三种查询算法的 first 预测变化图,很明显它们在改变回归模型时表现不同,即使它们在之前的图中有相似的 MSE 曲线。“al”的表现比“uc”或“rn”更有规律,与初始模型相比,始终具有较大的值(20 个纯红色行中的 18 个)或较小的值(20 个纯蓝色行中的 1 个)。
在“uc”的第二预测-变化图中,我们首先看到暗像素,在 5 个查询批次后看到相当亮的接近白色的像素。这表明“uc”倾向于在第一阶段显著地改变模型,并且在后面的查询中影响较小。
第三个预测变化图始终显示红色像素,这直观上是有意义的,因为我们选择的暗点具有接近 0 的小真值。树形回归往往用比事实更大的预测来拟合结构。
然而,与低值组的不同性能不同,三种算法对大值组表现出几乎一致的性能。
大值点上三种人工智能策略的预测变化图(实际用户界面)
讨论
这只是我们在最初发布的论文中举例说明的一个玩具。我们展示了可视化面板工具是如何工作的,并基于 CASP 实验提供了一些有趣的见解。到目前为止,我们只进行了一些实证实验。事实上,该工具可以揭示更多信息,例如:
1.某些主动学习方法是否总是对某些数据子群有效?
2.对于拟合大值点(或者,来自稀疏区域的数据点),树模型从查询的样本中学习得好吗
……
虽然我们已经开始在其他不同的数据集上使用我们的工具,但还需要我们做更多的工作来严格回答这些问题。此外,还需要对不同的主动学习策略进行更深入的分析。它们与主动学习中几个相当重要的术语有关:信息量、代表性和多样性。未来,我们希望扩展这个项目,在一些主要会议上发表一些更有价值的作品。
限制
还有几个问题,既有内在的,也有评论者和用户指出的。我们注意到的主要一点是,可视化工具的性能依赖于 PCA 图上测试样本的一些清晰关联:如果显示了清晰的聚类,则更容易得出结论。如果测试样本在降维图中没有显示任何清晰的关联或聚类组,则由于没有清晰的决策边界,AL 任务将更加复杂,这进一步使我们的图更难区分。
摘要
尽管如此,我们高兴地看到,以人为中心的人工智能和机器学习正受到研究人员越来越多的关注。我们真的希望这个可视化工具可以接近、可用,并有助于用户测试传统的精度/MSE 图。它不仅定义简单明了,而且可以灵活地适用于几乎所有的分类和回归问题。
承认
我要感谢我的本科生荣誉导师马丁·埃斯特博士,感谢他指导我完成这个兼职项目。我也非常感谢陆家林和奥利弗·斯诺,感谢他们在过去的八个月里对我们的帮助。
来源
这个工具的 GitHub 演示可以在:https://GitHub . com/AndyWangSFU/Active _ Learning _ Visualization _ Demo获得。如果你喜欢这个帖子,请留下一颗星,非常感谢!
了解并比较云功能与云运行
您是否对哪些 GCP 组件更合适感到困惑?
克里斯蒂安·斯塔尔在 Unsplash 上拍摄的照片
介绍
作为一名数据科学家,您需要决定如何执行模型部署步骤,这可能涉及转换您的脚本并将它们作为微服务进行部署。就我而言,我不知道应该使用哪些 GCP 组件来部署微服务。我应该部署在云运行还是云功能上?两者都是 GCP 的无服务器产品,易于部署和处理 HTTP 请求/事件。因此,我决定进行一些研究,在云功能和云运行上部署相同的微服务,并观察差异。在本文中,我将分享云功能和云运行之间的区别以及部署这两个组件的方法。
在深入研究这两个组件之间的区别之前,让我们先了解一下这两个组件。
云函数
云功能第一次公测发布是在 2017 年 3 月。云功能是一个事件驱动的无服务器平台,是一个支持个性化服务的轻量级解决方案,可以通过 HTTP 请求调用,也可以基于后台事件触发。云功能只支持 JavaScript、Python、Go 等特定语言。代码需要打包成一个功能,云功能组件将处理代码的打包、部署和执行。由于对于每个实例,云功能一次只处理一个请求,因此只有在用例是单一目的工作负载时,它才是合适的。
云运行
Cloud Run 测试版的发布晚于 Cloud Function,后者于 2019 年 4 月首次推出,是对其他 GCP 无服务器产品的补充。Cloud Run 是一个完全托管的计算平台,适合部署容器化的应用程序。Cloud Run 允许用户根据自己喜欢的编程语言编写脚本,然后将其推送到 Cloud Build 并打包成一个容器。与一次仅支持一个请求的云功能相比,云运行能够被配置为在单个容器实例上支持多个并发请求,这允许节省时间和成本。
在云功能和云运行上部署简单的服务
让我们测试部署一个简单的服务,该服务可以通过 HTTP 端点触发,并基于两个平台上的用户输入返回一条消息——云功能和云运行。
预期的输出将根据用户输入返回一条消息:
创建的微服务的预期输出(图片由作者提供)
云功能部署步骤:
我们可以用接收用户请求的 python 脚本创建一个 HTTP 触发器,并在云函数上进行设置。
(1)创建一个函数并测试它*(我使用的环境是 GCP 的 Vertex AI Jupyternotebook)
创建 python 函数(作者图像)
(2)进入谷歌云控制台的云功能,选择创建功能、*(如果是第一次,请启用云功能 API 和云构建 API)
- 为您的云功能命名
- 选择一个区域
- 选择 HTTP 触发器
- 如果您想从浏览器*触发并调用服务,请允许未经验证的调用(不建议用于生产管道,但在开发时更容易看到输出)
云功能配置(作者图片)
(3)下一步,在代码部分-选择运行时到 Python 3.9 ,指向函数名 print_message ,并将您的 Python 函数添加到 main.py 文件中。
- 请注意,要在云函数中传递参数,您将需要使用 request.args.get() 更改函数以处理和检索参数
def print_message(request):
message = request.args.get('msg')
final_message = f"My Name is {message}, Nice meeting you! "
return final_message
更新云功能源代码(作者图片)
(4)代码更新后,通过选择底部的“部署”按钮来部署该函数——然后该函数将开始在您的 GCP 环境中部署。
部署云功能“云功能-演示”(作者图片)
(5)在浏览器中测试并调用新部署的功能
- 您可以在部署的云功能的触发选项卡下检索您的 HTTP URL。
检索已部署的云功能 HTTP URL(按作者列出的图像)
- 从您的浏览器调用端点,并通过 URL 传入您的输入。
测试部署的云功能(作者提供的图像)
恭喜,感谢您陪我完成了将微服务部署到云功能所需的步骤。现在,让我们看看在云运行时创建相同的微服务所需的步骤。
云运行时部署步骤:
在云运行时创建微服务的方法将需要准备几个文件,这些文件是:
- main.py
- 文件
(1)准备主副本文件和备审文件
main.py 文件由 web 框架(FastAPI)和接收用户输入并返回消息的 python 函数组成。
import uvicorn
from fastapi import FastAPI
import osapp = FastAPI()
[@app](http://twitter.com/app).get("/{msg}")
async def print_message(msg:str):
message = msg
final_message = f"My Name is {message}, Nice meeting you! "
return final_message
文件:
在部署和创建微服务的云运行中,需要将 python 脚本部署到 Docker Container 中。Dockerfile 指定在容器启动时如何创建容器并运行 web 服务。
# Use official lightweight Python image as base OS.
FROM python:3.7-slim# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./# Install production dependencies.
RUN pip install fastapi uvicorn[standard] gunicornENV PORT 8080#Run the web service on container startup using gunicorn webserver.
CMD exec gunicorn --bind :$PORT --workers 1 --worker-class uvicorn.workers.UvicornWorker --threads 8 main:app
(2)构建和部署码头工人形象
在 Google Cloud Console 上可以使用不同的方法来构建和部署云运行微服务。在我之前的文章中,我分享了通过云壳编辑器部署云运行微服务的方法。在本文中,我将从 Vertex AI Jupyternotebook 环境进行部署。
- 在您的笔记本中,创建一个特定的文件夹并上传文件——main . py & docker file
将所需文件上传到 Jupyternotebook(图片由作者提供)
- 在 Jupyternotebook 中启动/打开终端控制台
启动终端控制台(图片来自作者)
- 在终端中,导航到包含文件的文件夹
cd cloud-run-demo
导航到目标文件夹(按作者排序的图像)
- 配置和设置将部署微服务的区域。
gcloud config set run/region asia-southeast1
配置和设置区域(图片由作者提供)
- 运行命令在所选区域构建新的 docker 映像。这个过程需要几分钟。
gcloud builds submit --tag gcr.io/sue-gcp-learn/cloud-run-demo
构建 Docker 图像(由作者创建的图像)
- 部署新构建的映像,并提供云运行服务名称。
gcloud run deploy --image gcr.io/sue-gcp-learn/cloud-run-demo --platform managed
部署 Docker 图像并提供服务名(图像由作者提供)
(3)检查和测试部署的云运行服务
- 微服务 URL 将在完成部署后提供。该服务也可从云运行控制台获得。
云运行控制台上部署的服务(图片由作者提供)
- 从浏览器测试并调用云运行端点,并通过 URL 传入您的输入。
测试部署的云运行(图片由作者提供)
恭喜您,与我一起完成了将微服务部署到云运行所需的步骤。现在,您已经掌握了在两个不同的 GCP 组件上创建微服务的知识。
比较云函数和云运行
- 云功能允许用户基于支持的几种语言部署代码,而云运行没有这种限制,因为您将能够基于用户选择的语言构建和部署容器映像。
- 对于每个云功能实例,云功能一次仅支持一个请求,而云运行能够同时处理多个请求,并且能够根据需求进行扩展。
- 云功能能够处理特定的触发器,如 FireStore 事件和基于云存储上的更改的触发器,而 Cloud Run 不具备此附加功能。
我个人的结论/偏好
我有组件云功能和云运行的经验,我更喜欢云运行,因为它的灵活性和处理并发的能力。因为 cloud run 使用容器化,所以它被认为是可移植的,可以很容易地部署到另一个环境中,比如本地、另一个地区等。这减少了将来的返工。
尽管如此,我强烈建议您在这两个组件上测试创建您的微服务,如果您有额外的时间,并从您自己的角度比较它们。
感谢你阅读我的文章,如果你喜欢并愿意支持我:
参考文献&链接:
[1]https://cloud . Google . com/blog/topics/developers-从业者/cloud-run-story-server less-containers
[2]https://data tonic . com/insights/cloud-functions-cloud-run-model-serving/
理解中心极限定理
教育
简单的英语解释,以及确保您不会在数据科学面试中被难住的关键假设
鸟瞰本帖中的假设示例(图片由作者提供)
尽管是数据科学中少数几个基本概念之一,中心极限定理(CLT)仍然被误解。
围绕这些基本统计概念的问题确实会在数据科学访谈中出现。然而,你会惊讶地发现,有抱负的数据科学家经常将他们的学习时间投入到最新趋势和新算法上,但由于没有重温基本概念而错过了窍门,并在面试中被难住了。
这篇文章将帮助你在直观的层面上更好地理解 CLT 定理。它还会帮助你更好地理解它的重要性,以及使用它时的关键假设。
简单的英语解释
用一种有点正式的语言,
中心极限定理说明,任何分布的均值的抽样分布都将是正态的,前提是样本量足够大。
让我们用一个更具体的例子,用更简单的词语来解释上面的定义。
想象一个假设的国家,有 200 万个家庭,分成两个关键区域:汤姆和杰瑞。为简单起见,让我们假设 100 万个家庭住在汤姆地区,100 万个家庭住在杰里地区。
一家受欢迎的快餐连锁店已经聘请你来帮助他们决定是否应该在该国投资并开设分店。如果他们这样做,他们应该打开它在汤姆或杰里地区。
让我们假设评估每个地区人们现有饮食习惯的一个有用指标是每个家庭每周光顾快餐店的次数。你的任务是为汤姆、杰瑞和整个国家解决这些问题。
在我们假设的国家中,Tom 的平均每周家庭访问次数是 1.5 次,其分布如图 1 所示。
图 1:汤姆地区每周光顾快餐店的次数分布(图片由作者提供)
Jerry 的平均每周家访次数为 3.5 次,分布如图 2 所示。
图 2:杰里地区每周光顾快餐店的次数分布(图片由作者提供)
总体而言,每周平均访问次数的分布如图 3 所示,平均值为 2.5 次
图 3:全国(即汤姆和杰瑞地区)每周光顾快餐店的次数分布(图片由作者提供)
理论上,我们可以询问这个国家每个人的饮食习惯,然后计算平均每周访问率。然而,这在现实世界的项目中是不可行的。
相反,我们所做的是从总人口中“取样”。所谓“抽样”,我们的意思是我们可以从全部人口中只去问一小组人(通常是出于正当理由随机选择的)。
假设我们从汤姆地区随机抽取 100 个家庭,然后计算平均值。这是一个实验。
如果我们重复同样的实验,我们会得到不同的平均值。如果我们重复同样的实验 100 次,我们会得到 100 个不同的(样本)平均值。
如果我们绘制这些样本均值的分布图,它将看起来像一个正态分布。这个样本分布的平均值将非常接近真实的总体平均值。
图 4 显示了来自 Tom 区域的 10,000 个平均值的分布(在 R 中模拟)。每个平均值是通过 抽样 随机选择 100 户家庭计算出来的。
图 4:Tom 样本均值的分布,其中每个样本均值是通过从 Tom 地区随机抽样 100 户家庭计算的(图片由作者提供)
图 5 显示了杰里地区 10,000 个平均值的分布。同样,每个平均值是通过 抽样 100 个随机选择的家庭计算的。
图 5:Tom 样本均值的分布,其中每个样本均值是通过从 Tom 地区随机抽样 100 户家庭计算的(图片由作者提供)
图 4 和图 5 中的分布都是正态分布。此时,您可能会认为这些样本分布是正态的,因为总体分布(从中得出这些分布)是正态的。
然而,这对初学者来说可能是一个惊喜。
人口(原始)分布是什么并不重要。如果我们抽样,并且样本足够大,样本均值的最终分布将是正态分布。此外,该抽样分布的平均值将近似等于总体平均值。
你刚刚读到的是简单明了的 CLT 定理。
让我们用前面的例子来演示 CLT。让我们从由汤姆和杰里地区组成的整个国家中随机选择 100 个家庭并计算平均值,并将相同的实验重复 100,000 次。图 6 显示了这 10,000 个平均值的分布。
图 6:整个国家样本均值的分布(汤姆和杰里),其中每个样本均值是通过随机抽样 100 个家庭计算的(图片由作者提供)
显然,这个国家的人口分布是不正常的。即使这样,抽样分布也是正态的,平均值非常接近总体平均值。
这就是 CLT 的魅力。我们不需要知道随机变量的基本分布是什么。我们仍然可以通过抽样,并正确地假设抽样分布将是近似正态的,来找出总体的平均值。
是什么让 CLT 有用?
在大多数有用的、真实世界的项目中,由于时间和资源的限制,我们不能出去从整个人群中收集数据。然而,CLT 让我们能够自信地走出去,从人口的子集收集数据,然后使用统计数据得出关于人口的结论。
CLT 是假设检验的基础,假设检验是推断统计学的一个分支,它帮助我们仅从具有代表性的数据子集得出关于总体的结论。
最后的想法
在假设的例子中,Tom 和 Jerry 的人口分布是正态的,而整个国家的人口分布是不正态的(它有两个峰值)。然而,在这三种情况下,抽样分布都是正态的。这是中心极限定理的结果。不考虑总体分布, 均值 的抽样分布是正态分布,前提是样本足够大。在大多数实际应用中,大于 30 的样本量通常被认为是足够的。
只有当要建模的分布的均值和方差是有限的时,CLT 定理才有效。因此,这个定理不适用于柯西分布的情况。如果您想深入了解,请查看两个示例的模拟演练,一个示例适用于 CLT,另一个示例不适用。
这篇文章中的所有数字都是用 r 语言生成的。带有注释的代码可以在我的 GitHub 上找到。
快乐学习!
*https://ahmarshah.medium.com/membership *
理解决策树分类器
理解决策树分类器如何用简单的语言和最少的数学公式工作。从头开始弄清楚基尼不纯和信息增益是如何工作的。
我的儿子查尔斯·朱
与神经网络等机器学习模型相比,我认为决策树分类器应该是最简单的一种。但是我错了,这个模型比我想象的要复杂一点。该模型也为其他高级模型如 LightBGM 和随机森林决策树奠定了基础。所以,我花了一些时间学习它,并试图弄清楚决策树分类器是如何工作的。
决策树如何工作
该模型的工作方式非常类似于人类思维对现实世界中的物体进行分类的方式。
当你看到上面的水果时,你会立刻从苹果中辨别出柠檬水。但是,怎么做呢?通过遵循决策树模型,你的大脑会在一瞬间问两个问题。
- 这看起来像什么颜色?
- 这个水果有多大?
一种简化的水果标识符决策树
决策树已经很好地保存在你的记忆中,它将引导你找到正确的答案。
但是,当你试图教一个计算机模型做类似的事情时,如何建立一个这样的决策树呢?或者让我们在另外两个更具体的问题中问同样的问题。
- 先问哪个问题?(以哪个功能列为目标)
- 我应该问什么问题?(什么是数据分区规则)
决策树分类器的关键是构建如上所示的决策树。
一个有 3 个水果的盘子——样本数据
假设我们手头有一个训练数据集。这次,我们盘子里有三种水果:苹果、葡萄和柠檬。如下所示:
熊猫数据框中的 3 个水果,图片由安德鲁提供
解决问题:我如何知道先问哪个问题?还是先问颜色问题还是直径问题?并设置正确的数据分割点?
我们可能希望我们的第一个问题是划分数据集,以便更好地成形。如果你有清洁孩子玩具的经验,我们问的问题应该最好区分乐高和木块。或者用另一种说法,我们希望这个问题能引出下一个层次的多样性更少的数据。
维基百科会告诉你衡量多样性的公制叫做 基尼杂质 。
什么是基尼系数,为什么它会这样
例如,你面前有两个水果阵列。哪种水果阵列更多样?
水果阵列 A,图片来自 Unsplash
水果阵列 B,图片来自 Unsplash
很明显,我们的人脑会很快找到数组 b 的答案。但是,我们怎么能以数量的方式来衡量多样性呢?我建议你停下来,在继续前进之前,试着想出你的解决方案。
…
一个简洁的解决方案是计算每种水果的概率,然后计算概率的平方。求和数将有一个属性,数组的多样性越多,该数就越低。
例如,在水果数组 a 中。
然后将平方概率相加。
现在,在水果数组 b 中,使用相同的逻辑,您将得到平方概率之和为 0.5。
看到了吗?更多样的数组将产生更低的结果。吉尼杂质很简单:
现在,你可能会问,为什么要把概率平方?如果没有正方形,数组 A 和数组 B 将生成相同的结果。(你可以试一试)。
使用信息增益来确定要问的正确问题
让我们回到果盘,我们所能产生的基尼杂质在其初始状态下是 0.64。
接下来,假设我们有一个问题要问,这个问题会将数据集划分为两个子集。
在一个真实的程序中,我们可以使用 nest 2-for 循环来尝试所有的细胞并产生所有的基尼杂质#。
什么是信息增益?信息增益是一种度量,用于度量一个问题减少了多少不确定性。
在上面的示例中。通过“果实直径≥3?”问题获得的信息是:
假设我们有最好的问题要问,这个问题必须最大程度地降低基尼系数,或者换句话说,获得最多的信息。
递归构建决策树
现在您已经有了吉尼和信息增益解决方案,您可以递归地将该过程应用于您的数据集,直到该过程无法生成更多的信息增益。在上面的示例中,右边的子对象只包含葡萄。你不能再减少杂质(或获取信息),因为不需要问任何问题。
最终,您将拥有一个能够接受新数据并为您预测水果类型的功能决策树模型。
链接和代码
- 决策树学习:https://en.wikipedia.org/wiki/Decision_tree_learning
- 让我们从头开始写一个决策树分类器:https://www.youtube.com/watch?v=LDRbO9a6XPU&t = 306s
- 决策树分类器的 Python 实现:
了解差异化编程
一种编程范例,允许程序使用基于梯度的优化来重建自身的部分
图片来自 wikipedia.org
自 2014 年首次出现以来,可微分编程曾经是一个花哨的术语,在本文的中被描述为“可微分函数编程”。Yann Lecun 将其描述为“深度学习的推广”[1],许多知名的人工智能研究人员认为这种类型的编程是软件工程的未来,也称为软件 2.0。
在经典编程中,我们过去常常明确地列举 CPU 需要执行的指令集,以便创建我们的算法。这意味着,在运行时,程序有足够的知识来实现其预期目标。
对于可微分编程,我们希望使用加权参数网络构建一种新的程序,通过基于梯度的优化[2]的示例进行训练。这些程序能够以一种更优化的方式,沿着一个梯度重写它们自身的部分。
在引擎盖下,它们可以被视为处理输入和输出的连续可微函数的复杂组合。因为每个表达式都是可微分的,所以可以使用链规则传播模型中的优化。像在经典的监督学习中一样,可以通过关于每个加权参数的损失梯度的反向传播来训练模型。因此,每个表达式应该实现一个向前行为,这是解决问题所需的实际计算,以及一个向后行为,其目标是更新用于计算向前传递的权重。
实际上,当编写一个可微分程序时,你正在编写一个程序*,它在运行时构建另一个程序 B 。程序 A 基本上是一组定义可微分计算图的规则和函数。程序 B 然后计算这个图并自己更新所有的参数,所以它正在构建自己的最优架构来解决问题。*
作者图片
请记住,这些参数被视为可微分函数,而不是循环、条件、赋值等不被视为函数的常见操作。
计算梯度
图片由 researchgate.net 拍摄
为了优化我们的可微分程序,我们将计算损失函数的梯度,这是一个系数向量。每个值给我们两条信息:斜率的意义(值的符号)和为了优化程序我们需要增加/减少参数的量(实际值)。
为了计算梯度,存在不同的实现方式:
符号微分:f '(x)= 2x | f '(cos(x))=-sin(x)……
难以在实际项目中应用,因为依赖于已知的有限的导数集(实际项目可能使用复杂的函数,如泰勒级数展开)。更多信息。
数值微分:f '(x)= lim(f(x+h)-f(x))/h
计算梯度的最简单的方法之一,但是很慢(需要计算 2 次函数 f +离散化的风险+由于变量 h 可能产生的舍入误差)。更多信息。
自动微分:
考虑将程序区分为包含算术和基本运算(+、-、、log、sin、cos…)的代码块,并使用链式法则计算整体导数。工程上任意程序,运行速度快,结果是准确的。更多信息。*
在实践中,自动微分是最常用的微分算法,这得益于它的精度和效率。Tensorflow [3]和 PyTorch [4]等机器学习框架实现了这种技术来计算梯度。
可微分编程语言
尽管基于梯度的优化和自动微分已经使用了很多年,但是可微分编程还是最近的事情,即使它与这两种技术紧密相关。大多数流行的语言没有实现本机可微分函数,尽管有些框架存在:
- 张量流, PyTorch
- 用于 Swift 的Swift 4 传感器流量
- 【Swift 的差异化编程宣言
- 张量
- 【Scala 的灯笼
- 用于物理模拟的 DiffTaichi
什么是神经网络?
差异化编程应该被看作是每个软件工程师在编写代码时应该考虑的一个工具。当从示例中学习算法模式比枚举详尽的规则列表更容易时,应该使用这种范例,枚举规则列表对于某些任务来说可能极其复杂。这些任务中的大部分是试图使用机器学习(例如 NLP、计算机视觉等)来解决的经典问题,但可能与特定的用例有关。神经网络可以被视为使用权重和偏差层的差分编程技术的具体实现,但是我们可以想象使用差分的不同架构,而不是神经网络。
可区分编程也是软件工程和数据科学之间的前沿,在未来看到更多的团队合并这两个方面也就不足为奇了!
参考
[1] 乐存对甲方的回答 LikeLizLemon ,2018
[2] 可微规划张量网络,2019
[3] TensorFlow:大规模机器学习的系统,2016
[4] PyTorch:命令式风格,高性能深度学习库,2019
理解广义线性模型,以及它与线性、逻辑和泊松回归的关系
教育
永远不要再混淆线性回归和广义线性回归,带着清晰的思路离开。
亚历山大·杜默在 Unsplash 上拍摄的照片
2021 Kaggle 调查显示,与去年一样,数据科学界最常用的算法是线性或逻辑回归。我一点也不惊讶。不同特征的加权求和毕竟是最直观的做法。然而,对于大多数初学者来说,线性回归和其他类型的回归之间的区别变得不那么明显了。
当你读完这篇文章后,你会对线性回归与逻辑回归和泊松回归的区别有一个非常清晰的概念。此外,你也会清楚地理解当它用于分类任务时,我们仍然称之为逻辑“回归”的原因。
如果你以前曾经对这些不同类型的回归感到困惑,那么你来对地方了。然而,我请求你在接下来的几分钟内暂停你对这个主题的先验知识。如果你做到了,我保证你会带着水晶般的清澈离开。让我们开始吧。
什么是广义线性模型?
简而言之,广义线性模型(GLM)是一种数学模型,它将输出(响应变量的函数,稍后将详细介绍)与一个或多个输入变量(也称为探索变量)联系起来。下面的等式显示了输出如何与 n 预测变量的线性求和相关。有相应的 n+1 个系数项(每个系数项对应于 n 个预测变量,还有一个附加项帮助对任何偏移进行建模)
GLM 方程(图片由作者提供)
无论是进行线性回归、逻辑回归还是泊松回归,上述等式的右边(输入要素的加权组合)保持不变。
让我们来谈谈等式的左边,即输出。这是随机成分。它是响应变量期望值的函数。为简单起见,我们称期望值为 Y 。
GLM 方程中的输出部分(图片由作者提供)
函数, g(。),称为链接功能。正是这个链接功能使得 Y 的分布与右侧兼容(输入的线性组合)。
当函数 **g(.)**是一个恒等函数,那么 GLM 方程就简化为一个正规的线性回归方程。
当函数 g 是恒等式时,GLM 方程就相当于一个简单的线性回归
换句话说,当连接函数是恒等式时,常规线性回归是广义线性模型的特例。
常规线性回归和 GLM 的主要区别
正如我前面提到的,常规线性回归是 GLM 的特例。然而,在进一步讨论之前,让我们快速地解释一下这两者之间的一些关键区别。
常规线性回归的关键假设是输出 Y 的每个值都是独立的,输出是正态分布的,并且 Y 的平均值通过线性组合与预测变量相关。在 GLM 中,输出不局限于正态分布,而是可以属于指数族的任何成员。
要解决常规线性回归问题,您可以采用最小二乘法或最大似然估计。它们会给出相同的结果。然而,GLM 只能用最大似然估计法求解。
最后,正则线性回归模型有时也被称为标准最小二乘模型,是由高斯在 1809 年发明的,而 GLM 是由内尔德和威德伯恩在 1972 年发明的。
GLM 与线性回归、逻辑回归和泊松回归有什么关系?
既然你开始将线性回归视为 GLM 的一个特例,我们可以继续并确定 GLM 的其他情况。
当连接函数是 logit(比例的自然对数)时,我们最终得到一个逻辑回归方程。
逻辑回归方程,其中输出是“赔率”的自然对数(图片由作者提供)
当结果是二元的(例如,成功/失败,有疾病/没有疾病)时,逻辑回归是最合适的。在这样的应用中,比率(*Y/(1-Y)*类似于成功概率与失败概率的比率(也称为“赔率”)。
当关联函数是比率的自然对数时,我们最终得到一个泊松回归方程。
当结果是给定时间间隔内的计数或给定时间内发生的事件数时,泊松回归最适合。
链接函数与激活函数的关系
链接功能 g(。) 是一个可逆函数,它转换输出的期望值,使其与线性预测器部分(GLM 等式的右边)兼容。然而,在机器学习社区中,我们经常首先被介绍到链接函数的逆函数。这就是所谓的激活功能。
带有激活函数的 GLM 方程,它是链接函数的反函数(图片由作者提供)
链接功能的逆功能与激活功能相同。术语“链接函数”在统计学文献中很常见,而术语“激活函数”在机器学习文献中更常见。
例如,如果您对逻辑回归的 GLM 方程(如前所示)的两边取指数,并应用简单的代数运算,您将最终得到以下逻辑回归方程(在机器学习文献中更常见)。
逻辑回归方程,它在机器学习文献中的表达方式(图片由作者提供)
最后的想法
人们经常混淆和混淆这些概念。更糟糕的是,当用于分类时,人们经常称之为逻辑回归。这部分是因为我们,在机器学习社区,已经将监督学习分为分类(当输出是离散的)和回归(当输出是连续的)。
当然,逻辑回归用于分类,但它仍然是一种回归技术。只有当你理解了广义线性模型,一个更重要的概念,这才有意义。
最终,您将不同的输入变量组合成一个加权和,无论使用线性、逻辑还是泊松回归,都需要确定未知系数。
https://ahmarshah.medium.com/membership
理解并在 Python 中实现逻辑回归
Sigmoid 函数、线性回归和参数估计(对数似然和交叉熵损失)
梅格·波尔登在 Unsplash 上的照片
目标
这篇文章的主要目的是理解二元逻辑回归是如何工作的。
- 我将在高层次上回顾理解逻辑回归所涉及的基本数学概念和函数。
- 在此过程中,我将介绍两种众所周知的梯度方法(上升/下降),以使用对数似然和交叉熵损失函数来估计𝜃参数。
- 我将使用 Kaggle 的泰坦尼克号数据集从头创建一个逻辑回归模型来预测乘客存活率。train.csv 和 test.csv 文件可以在 Kaggle 的 Titanic 数据页面上找到。为了加快模型构建,我将只使用三个特征,年龄(连续)、p 类(第一类= 1,第二类= 2,第三类= 3),以及性别(女性= 1,男性= 0)。
图 0:图片由作者提供;数据来源: Kaggle 的泰坦尼克号数据
目录
- 算法概要
- 数学概念和函数
- 行动中的代码
- 最后的想法
算法概要
逻辑回归是一种分类算法,它输出一组给定实例的预测概率,这些实例的特征与优化的𝜃参数和偏差项配对。这些参数也称为权重或系数。概率被转换成预测例如成功(“1”)或失败(“0”)的目标类别(例如,0 或 1)。虽然我将仔细研究二元逻辑回归模型,但是逻辑回归也可以用于进行多类预测。
**我们如何获取线性组合的输入特征和参数,并进行二元预测?**答案是自然对数(以 e 为底的对数)。更确切地说,对数概率。对线性组合的输入要素和参数求和,以生成对数优势形式的值。然后,对数优势值被插入到 sigmoid 函数中,并生成一个概率。就其核心而言,像许多其他机器学习问题一样,这是一个优化问题。使用梯度上升(例如,最大化对数似然)或下降(例如,最小化交叉熵损失)来估计最佳参数,其中选择的目标(例如,成本、损失等。)功能决定梯度接近。
数学概念和函数
为了让一切变得更简单,我们必须深入数学。在逻辑回归中,sigmoid 函数起着关键作用,因为它输出一个介于 0 和 1 之间的值,非常适合概率。因此,这种表示通常被称为逻辑 sigmoid 函数。请记住,在自然环境中还有其他具有不同有界范围的 sigmoid 函数。并且因为响应是二元的(例如,真对假,是对否,幸存对未幸存),所以响应变量将具有伯努利分布。此外,每个响应结果由预测的成功概率决定,如图 5 所示。
**关于数学符号:*小写的“I”将表示数据集中的行位置,而小写的“j”*将表示数据集中的特征或列位置。你还会碰到小写粗体非斜体的“ x ”。这代表一个特征向量。更具体地说,当“I”伴随有“x”(xI)时,如图 5、6、7、9 所示,这代表一个向量(一个实例/单行)具有所有特征值。
当您在图 8 和图 10 中看到小写斜体“x”(Xi,j)的“I”和“j”时,该值是第 I 个(单个特征向量)实例中第 j 个特征的表示。数据集中要素(列)的数量将表示为“n ”,而实例(行)的数量将表示为“m”变量。
Sigmoid 函数
在图 1 中,第一个方程是 sigmoid 函数,它创建了我们经常在逻辑回归中看到的 S 曲线。给定 x ,输出等于条件概率 y = 1,由𝜃.参数化在这种情况下, x 是表示为特征向量的单个实例(训练集中的观察值)。
图 1: Sigmoid 函数[sigma(z)]和[1—sigma(z)];图片作者作者
向量中的每个特征将具有使用优化算法估计的相应𝜃参数。稍后我会在梯度上升/下降部分详细讨论这一点。还需要注意的是,通过求解 log(odds)= log(p/(1-p))中的 p ,我们得到了具有 z = log(odds)的 sigmoid 函数。
图 2:s 形曲线;图片作者作者
proba1, proba0 = [], []
feature_example = [i for i in range(-10, 11)]for instance in feature_example:
p1 = 1/(1 + np.exp(-instance)) # sigmoid function
p0 = 1 — p1
proba1.append(p1)
proba0.append(p0)plt.figure(figsize=(12,6))
plt.plot(feature_example, proba1, marker=’.’, label=’predict proba “1”’)
plt.plot(feature_example, proba0, marker=’.’, linestyle=’dashed’, label=’predict proba “0”’)
plt.title(‘Sigmoid Curve’)
plt.xlabel(‘feature_example (in log-odds)’)
plt.ylabel(‘probability’)
plt.legend(prop={‘size’: 12});
赔率和对数赔率
使用线性回归函数估计的 y 值(y-hat)代表对数优势。围绕比值或比值比包装对数的过程被称为 logit 变换。关键是对数几率是无限的(-无穷大到+无穷大)。但是,我们需要一个介于 0 和 1 之间的值来预测概率。所以,本质上,对数概率是弥合线性和概率形式之间差距的桥梁。
图 3:线性回归函数和 y 估计值的对数比;图片作者作者
什么是对数概率?我们首先要知道赔率的定义——成功的概率除以失败的概率,P(成功)/P(失败)。例如,对于一枚普通硬币,正面和反面的概率都是 0.5。因此,几率是 0.5/0.5,这意味着得到反面的几率是 1。如果我们使用一个偏向反面的硬币,其中反面的概率现在是 0.7,那么得到反面的几率是 2.33 (0.7/0.3)。如图 3 所示,赔率等于 p/(1-p)。下一步是将赔率转换成对数赔率。
将概率转换为比值以及将比值转换为对数比值的一个基本要点是,这些关系是单调的。当概率增加时,几率增加,反之亦然。当赔率增加时,对数赔率也增加,反之亦然。在图 4 中,我使用 Titanic 训练集和 Scikit-Learn 的逻辑回归函数创建了两个图来说明这一点。我们可以清楚地看到概率、赔率和对数赔率之间的单调关系。
为什么这很重要?log-odds 值越高,概率越高。在图 2 中,我们可以非常清楚地看到这一点。任何等于或大于 0 的对数优势值都有 0.5 或更高的概率。这是由于我们在图 4 中观察到的单调关系。当我们解释估计的参数时,这也会派上用场。
图 4:概率 vs .赔率&赔率 vs .对数赔率;图片由作者
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt
plt.style.use(‘ggplot’)
%matplotlib inlinelogreg = LogisticRegression(random_state=0)
model_pipe = make_pipeline(StandardScaler(), logreg)
X = train[[‘age’,’pclass’,’sex’]]
y = train[‘survived’]
model_pipe.fit(X, y)
model_pipe.predict_proba(X)y_pred_proba_1 = model_pipe.predict_proba(X)[:,1]
y_pred_proba_0 = model_pipe.predict_proba(X)[:,0]
odds = y_pred_proba_1 / y_neg_pred_proba_0
log_odds = np.log(odds)fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16,6))
ax1.set_title(‘Probability vs. Odds’)
ax1.set(xlabel=’Probability’, ylabel=’Odds’)
ax1.scatter(y_pos_pred_proba, odds)
ax2.set_title(‘Odds vs. Log Odds’)
ax2.set(xlabel=’Odds’, ylabel=’Log Odds’)
ax2.scatter(odds, log_odds);
Sigmoid 组合概率、似然和对数似然
我们覆盖了很多领域,现在我们处于理解高层次逻辑回归的最后一英里。图 5 中的概率函数 P(Y=yi|X=xi)捕捉到了 Y=1 和 Y=0 的形式。基于 Y (0 或 1),点积中的一项变为 1 并下降。这种组合形式对理解可能性至关重要。
图 5:概率函数作为 Y=0 和 Y=1 项的组合形式;图片由作者
让我们来看看我们是如何得到 可能性 、L(𝜃).的对于训练集中的每个实例,我们使用随机估计参数(𝜃’s) 计算对数优势,并使用对应于特定二元目标变量(0 或 1)的 sigmoid 函数预测概率。这些概率的乘积将给出所有实例的概率和可能性,如图 6 所示。重要的是要注意,可能性被表示为𝜃的可能性,而概率被指定为 y 的概率
图 6:似然函数;来源阅读:克里斯皮赫,CS109 @斯坦福大学;图片由作者
结果,通过最大化可能性,我们收敛到最优参数。换句话说,最大化似然估计最佳参数,我们直接最大化 y 的概率,这就是所谓的最大似然估计(MLE)。因此,当达到最大值时,初始参数值将逐渐收敛到最优值。收敛是由优化算法——梯度上升/下降驱动的。
对数似然法如何适应这种情况?取似然函数的对数,就变成了求和问题对乘法问题。我们知道 log(XY) = log(X) + log(Y)和 log(X^b) = b * log(X)。因此,我们可以轻松地将似然性(L(𝜃)转换为对数似然性(LL(𝜃),如图 7 所示。因为似然性到对数似然性是一种单调变换,最大化对数似然性也将产生最佳参数,这被称为最大对数似然性。请记住,这是我们正在优化的𝜃的对数似然。
图 7:对数似然函数;来源阅读:克里斯皮赫,CS109 @斯坦福大学;图片由作者
如何使用对数似然达到最大值?我们对每个𝜃参数取对数似然函数的偏导数。换句话说,你为每个参数取梯度,它有大小和方向。例如,在 Titanic 训练集中,我们有三个特征加上一个偏差项,所有实例的 x0 都等于 1。图 8 中的偏导数表示训练集中的单个实例( i) 和单个𝜃参数( j) 。 x (i,j) 表示实例中与其对应的𝜃 ( i,j )参数配对的单个特征。因此,对于单个实例,总共创建了四个偏导数——偏差项、pclass、性别和年龄。这些组成了梯度向量。
η是学习率,它决定了梯度上升算法每次迭代的步长。我们不希望学习率太低,需要很长时间才能收敛,也不希望学习率太高,会超调,会跳来跳去。学习率也是一个可以优化的超参数,但是我将在 Titanic 练习中使用固定的学习率 0.1。
一旦有了梯度向量和学习率,两个实体相乘并添加到当前要更新的参数中,如图 8 中的第二个等式所示。本质上,我们是在梯度方向上一小步一小步地缓慢而坚定地到达顶峰。这个更新步骤重复进行,直到参数收敛到它们的最优值——这是梯度上升算法在起作用。因为对数似然函数是凹的,最终,小的上坡步骤将达到全局最大值。
图 8:每个𝜃参数的偏导数和梯度上升算法;图片作者作者
**最小化成本函数怎么样?**我们经常听到我们需要最小化成本或损失函数。它也被称为目标函数,因为我们试图最大化或最小化某个数值。在成本或损失函数的上下文中,目标收敛到全局最小值。例如,通过在对数似然函数前面放置一个负号,如图 9 所示,它就变成了交叉熵损失函数。目标是使用 梯度下降算法 (图 10 中的第二个方程)最小化这个负函数。这个过程与最大化对数似然相同,只是我们通过下降到最小值来最小化它。
图 9:交叉熵损失函数或负对数似然(NLL)函数;来源阅读:机器学习:概率视角凯文·p·墨菲 —第 8 章;图片由作者
一旦每个𝜃参数的偏导数(图 10)被导出,形式与图 8 相同。最大的区别是减法项,它用 sigmoid 预测概率减去实际 y (0 或 1)重新排序。该项然后乘以 x (i,j) 特征。该过程与上面的梯度上升部分中描述的过程相同。因此,我们将得到训练集中每个实例的四个偏导数。并且使用梯度下降算法,我们更新参数直到它们收敛到它们的最优值。
图 10:每个θ参数的偏导数和梯度下降算法;来源阅读:丹·茹拉夫斯基、詹姆斯·h·马丁著《言语与语言过程》(第三版草稿) —第五章;图片由作者
幸运的是,交叉熵损失函数是凸的,自然有一个全局最小值。最终,在坡度方向(最陡的下坡方向)迈出足够小的步伐后,它将到达山脚。
行动中的代码
既然我们已经回顾了相关的数学知识,那么现在只需要用代码来展示逻辑回归和梯度算法的能力。先说我们的数据。我们有来自卡格尔的泰坦尼克号挑战的训练和测试设备。如前所述,我只使用三个特征——年龄、阶级和性别——来预测乘客存活率。
首先,我们需要扩展特性,这将有助于融合过程。我将使用标准化方法来缩放数字要素。在标准化中,我们取每个数字特征的平均值,并从每个值中减去平均值。然后将该项除以特征的标准偏差。接下来,我们将添加一个全 1 的列来表示 x0。这是偏向项。
特征标准化代码由作者
使用上面的代码,我们已经准备好了训练输入数据集。我们现在知道 log-odds 是线性回归函数的输出,这个输出是 sigmoid 函数的输入。唯一缺失的是𝜃参数。因为我们将使用梯度上升和下降来估计这些参数,我们选择四个任意值作为我们的起点。我将用四个零作为初始值。我们还需要在代码中定义 sigmoid 函数,因为这将生成我们的概率。
# sigmoid function where z = log-odds
def sigmoid(z):
predict_proba = 1 / (1 + np.exp(-z))
return predict_proba
我们已经准备好了所有的东西。**接下来,我们将把对数似然函数、交叉熵损失函数和梯度转换成代码。**我们还需要确定我们要对训练集进行多少次检查。我们需要定义历元的数量(在下面的代码中指定为 n_epoch,这是一个帮助学习过程的超参数)。**什么是纪元?**在梯度上升/下降算法的背景下,历元是单次迭代,其中它确定多少训练实例将通过梯度算法来更新𝜃参数(如图 8 和 10 所示)。
因此,我们通常会遇到三种梯度上升/下降算法:批量、随机和小批量。对于泰坦尼克号练习,我将使用批处理方法。这意味着,对于每个时期,整个训练集将通过梯度算法来更新𝜃参数。
梯度上升代码由作者
给你!通过利用梯度上升算法最大化对数似然,我们已经为泰坦尼克号训练集导出了预测乘客存活率的最佳𝜃参数。
- 𝜃0: -0.89362715(偏差项)
- 𝜃1: 1.41685703(pclass)
- 𝜃2: 1.24119596(性别)
- 𝜃3: -0.60707722(年龄)
让我们想象一下最大化的过程。在图 11 中,我们可以看到,在第一个时期后,我们达到了最大值,并继续保持在这个水平。
图 11:最大化每个历元迭代的对数似然函数;图片作者作者
x_axis = [i for i in range(1, 11)]
plt.figure(figsize=(14,6))
plt.title(‘Maximizing Log-Likelihood’)
plt.xticks(x_axis)
plt.xlabel(‘epoch iteration’)
plt.ylabel(‘log-likelihood’)
plt.plot(x_axis, log_likelihood_vals, marker=’o’)
plt.tight_layout()
我们还可以看到每次历元迭代的𝜃参数收敛。正如我们在图 11 中看到的,对数似然在第一个时期后达到最大值;我们应该看到同样的参数。在图 12 中,我们看到参数在第一个时期后收敛到它们的最佳水平,并且最佳水平随着代码在剩余时期的迭代而保持。迭代训练集一次就足以达到最佳𝜃参数。让我们检查一下在每个时期间隔期间发生了什么。
图 12 右侧的曲线显示了𝜃参数值快速向其最佳值移动。当它继续迭代通过每个时期中的训练实例时,参数值上下振荡(时期间隔用黑色垂直虚线表示)。在每个时期结束时,我们以最佳参数值结束,并且保持这些值。
图 12:每个时期(左)和每个实例(右)的𝜃参数收敛;图片由作者
图 12 —由作者编写的代码
是时候使用该模型进行预测,并生成准确度分数来衡量模型性能了。有几个衡量性能的指标,但现在我们将快速了解一下准确性。下面的代码产生了 79.8%的准确率。
from sklearn.metrics import accuracy_scoredef make_predictions(X, thetas):
X = X.copy()
predictions = []
for x_row in X:
log_odds = sum(thetas * x_row[:4])
pred_proba = sigmoid(log_odds)
# if probability >= 0.5, predicted class is 1
predictions.append(1 if pred_proba >= 0.5 else 0)
return predictionsy_train = X_train[:, -1]
y_predict = make_predictions(X_train[:, :4], thetas)
accuracy_score(y_train, y_predict)
**交叉熵损失函数呢?**最小化交叉熵损失函数的结果将与上面相同。只有几行代码更改,然后代码就可以运行了(参见下面代码中的’ # changed ')。这是代码。
梯度下降代码作者作者
让我们看看使用梯度下降最小化交叉熵损失函数。我们在第一个时期后达到最小值,正如我们观察到的最大对数似然。最大的不同是,我们正朝着最陡下降的方向前进。这就是我们经常读到和听到的——最小化成本函数来估计最佳参数。我们现在已经具备了从头构建二元逻辑回归模型的所有组件。我希望这篇文章能帮助你,就像我帮助我加深对逻辑回归和梯度算法的理解一样。
图 13:最小化交叉熵损失函数;图片由作者
x_axis = [i for i in range(1, 11)]
plt.figure(figsize=(14,6))
plt.title(‘Minimizing Cross-Entropy Loss’)
plt.xticks(x_axis)
plt.xlabel(‘epoch iteration’)
plt.ylabel(‘cross-entropy loss’)
plt.plot(x_axis, ce_loss_vals, marker=’o’)
plt.tight_layout()
最后的想法
在这篇文章中,我的目标是提供一个坚实的二元逻辑回归模型和估计最佳𝜃参数的两种方法的介绍性概述。正如我们在泰坦尼克号的例子中看到的,主要的障碍是估计最佳的𝜃参数来拟合模型,并使用这些估计来预测乘客的存活率。我们使用梯度上升算法检验了(最大)对数似然函数。我们还使用梯度下降算法检查了交叉熵损失函数。当然,您可以将其他成本函数应用到这个问题上,但是我们已经讨论了足够多的内容,以了解我们试图通过梯度上升/下降实现的目标。
我们将何去何从?在改进模型方面,我们可以探索几个领域。我们可以从学习率开始。学习率是一个超参数,可以调整。在许多情况下,随着梯度上升/下降算法向前发展,引入学习速率表来减小步长。
如果数据集很大,批处理方法可能并不理想。理解随机和小批量梯度下降算法的机制会更有帮助。然而,一旦理解了批量梯度下降,其他方法就相当简单了。除了我在本文中使用的标准化方法之外,还有不同的特性扩展技术。
如果你遇到任何问题或有反馈给我,请随时留下评论。感谢阅读!
了解逻辑回归
入门
一个基于案例研究的介绍,带你从直觉到实现
**Table of Contents**· [Purpose](#f825)
· [Why Should You Read On?](#1fb3)
· [Logistic Regression in the Big Picture](#7e95)
· [Why Logistic Regression?](#ee06)
· [The Case Study](#9db8)
· [Logistic Regression Under the Hood](#8237)
∘ [The Classification Task](#1204)
∘ [The Rationale for Using Multiple Features](#f3aa)
∘ [Data Visualization](#bf8a)
∘ [The Linear Equation](#c9f1)
∘ [The Logistic Function](#c902)
∘ [The Cost Function](#2423)
∘ [The Optimization](#6ccb)
∘ [The Prediction](#c7c5)
∘ [Implementation from Scratch](#aee7)
· [Summary](#a069)
目的
本文将通过一个受现实世界例子启发的案例研究,帮助您直观地理解逻辑回归。您还将能够从头开始实现您自己版本的逻辑回归(如果您愿意)。这篇文章假设没有机器学习的先验知识,将带你从基础(专注于直觉)开始,一路帮助你用自己选择的编程语言实现它。提供了相关的代码(在我的 GitHub 库),这样任何人,如果感兴趣,都可以下载代码并使用这个案例研究来学习如何实现逻辑回归,并真正理解幕后发生的事情。一旦你读完这篇文章,你将有望开始看到并想象使用逻辑回归进行分类任务背后的数学原理(如果它是为了帮助你分类,你为什么要称之为回归呢?继续读下去),并有足够的信心将其应用到自己的工作中。
你为什么要继续读下去?
如果你是一名有抱负的数据科学家,并认真学习这门手艺,你将需要投入一些时间,试图更好地理解直觉和一些算法的工作原理。将机器学习技术视为黑盒只能带你走这么远。你至少应该对基本原理有所了解,这样你就能在这个领域卓有成效地工作,并对使用什么技术、何时使用以及如何解释结果做出更好的决定。如果有一个算法你应该有一个清晰的理解,在引擎盖下,它是逻辑回归(如果你想知道为什么,在所有的技术中,它必须是逻辑回归)。
大背景下的逻辑回归
让我们从绝对的开始说起,数据科学的大图景。机器学习(ML)是数据科学的一个子集,位于计算机科学和数学的交叉点,该领域的核心和灵魂是从数据中学习。
要获得更有哲理、更详细的概述,请查看我的另一篇文章:
机器学习本身可以根据学习的类型分为三个子领域:监督学习、非监督学习和强化学习。这些学习类型中最广泛和公认的是监督学习。在监督学习中,解决的两种主要问题是分类和回归。在分类(这有助于将数据分为不同的类)中,您可以进一步将其分为生成模型和判别模型。在判别模型中,最常用的方法是逻辑回归。
展示逻辑回归在整个生态系统中的位置的数据科学景观(图片由作者提供)
为什么是逻辑回归?
正如我提到的,在 ML 中,最常见的学习类型是监督学习,该领域中解决的最常见和公认的问题是分类(猫对狗,垃圾邮件对火腿,疾病对健康等)。).你可能想知道,为什么在众多的技术中,你还要费心去学习逻辑回归。有两个主要原因可以解释为什么你应该在深入学习之前花时间学习逻辑回归。
首先,如果任何高级算法没有附加价值,那么尝试实现它是没有意义的(在建模任何东西时,永远记住奥卡姆剃刀)。需要有一个简单、可解释的算法,您可以轻松、快速地在您的数据集上实现,以作为您的基准。用于分类的逻辑回归是作为基准的理想算法。一旦有了基准,只有这样,您才能投入资源来改进您的基准解决方案(否则,当您不知道除了简单、可解释且易于实现的算法之外,实现更复杂的算法是否有任何价值时,这是对资源的不良利用)。
其次,如果你是该领域的新手,你可能会感到惊讶,在你的数据集上,支持向量机(SVM)等更高级的算法不一定总是比逻辑回归(LR)做得更好。事实上,在一些应用中,LR 做得相当好,并且当使用 SVM 或任何其他算法时,没有获得改进。底线是,在所有的可能性中,当你开始解决一个问题时,你应该使用 LR 作为你的分类算法,它对于分类的重要性不能被夸大。因此,绝大多数关于机器学习的课程在早期就教授 LR 也就不足为奇了。当你进一步阅读时,你会很快意识到 LR 非常直观并且易于实现。
案例研究
你可以在我们发表在《医学互联网研究杂志》(JMIR,医学信息学的知名研究期刊之一)上的论文中了解更多这方面的内容。
https://www.jmir.org/2017/3/e69/
简而言之,慢性阻塞性肺病(COPD)是一种长期疾病,患者的肺部受到不可逆的损害,以至于日常活动可能会使他们喘不过气来。这种疾病无法治愈,患有慢性阻塞性肺病的人将在余生中一直处于这种状态。然而,如果 COPD 患者能够通过监测他们的症状并在需要时及时服药来自我管理他们的病情,他们仍然可以生活得很好并获得高质量的生活。虽然 COPD 症状很常见,但是在事情恶化到患者最终住院的程度之前,需要及时处理症状的持续恶化。患者如何识别自己的病情是否正在恶化?一种方法是使用一个小的手指探针(称为脉搏血氧计),可以测量心率,血液中的含氧量(称为氧饱和度)和呼吸频率。我们的任务是在患者病情恶化时,仅使用脉搏血氧仪向患者提供早期预警。
问题的概念图(图片由作者提供)
**免责声明:**首先,数据集(您可以在 github 上找到)是模拟数据,而不是来自我们研究的实际数据。然而,它是使用论文中公布的类似平均值生成的(并可公开获得)。其次,在这篇文章中,我将挑战简化为只关注心率和呼吸率的二维问题,因为在二维空间中更容易可视化数据点。然而,一旦你理解了二维的概念,你就可以很容易地把它扩展到三维或更多维,并且基本原理不会改变。
幕后的逻辑回归
现在,你对大局有了很好的认识,逻辑回归在更大的事物计划中的位置,并且你对我们试图解决的问题有了理解,让我们进入一些细节。
分类任务
我们现在面临的挑战是,通过结合两种信息:心率和呼吸率,在患者病情恶化之前向他们提供早期预警。我们希望以最佳方式将这两种测量方法结合起来,以确定患者的病情是否在恶化。为简单起见,我们将这些情况称为“异常”。(在最初的论文中,他们被称为“前驱”)。当病人的情况稳定并且没有恶化的危险时,这一时期被称为正常时期。因此,我们现在的问题归结为基于两种测量来发现患者是正常还是异常:心率(HR)和呼吸率(BR)。
分类目标:使用患者的心率和呼吸率来识别患者是正常还是异常。
使用多种功能的基本原理
首先要问的问题是:为什么我们甚至需要两种不同的测量方法?难道我们不能用 BR 或 HR 来做决定吗?为什么使用多种测量方法会使我们的生活变得复杂?如果你有一种情况,单次测量导致正常和异常之间的完美分离,你不需要第二次测量。从图形上看,应该是这样的:
心率在两类中的分布,在一个假设的情况下,完美的分离是可能的,现实世界的例子不像这些(图片由作者提供)
事实上,为此你甚至不需要任何机器学习。您可以绘制数据,并直观地看到一个简单的规则可以将这两种情况分开。在单次测量的情况下,这个简单的规则在图形上是一条垂直线。在上图中,这相当于 HR 为 78。如果患者的心率高于 78,患者将被视为异常,如果患者的心率低于 78,患者将被视为正常。你在图中看到的这条垂直线被称为“决策边界”。对于这种情况,当你有一个单一的测量和如此明确的分离,任何垂直线都可以完美地分开两者(决策边界在 77,78 或 79 都同样完美)。然而,现实世界的问题是困难的(并且是问题),因为这种分离并不直接,并且有许多重叠。因为对于单个测量来说重叠是很多的,因此,我们对同一患者进行不同类型的测量,虽然有很多重叠,但是我们希望每个测量都有独立的信息,并且通过组合不同的测量,我们希望找到更好的决策边界,与仅使用单个测量相比,可以导致更少的误差。例如,检查案例研究中呼吸率、心率和氧饱和度的重叠(如果有人有兴趣使用,可以在我的 github 存储库中找到这些数据。它是使用本文前面引用的原始论文中可以看到的相同数据分布进行模拟的。
正常和异常(前驱)情况下心率(脉率)、呼吸率和血氧饱和度(SpO2)的概率分布(图片由作者提供)
为了简单起见,我们将使用另一个模拟数据集,该数据集受到相同问题的启发,但它显示了正常和异常之间更多的分离(如前所述,仅使用心率和呼吸率)。让我们从分别绘制两种情况下的心率和呼吸率分布开始。
正常和异常情况下的心率和呼吸率的概率分布,请注意正常和异常情况下的呼吸率和心率存在重叠(图片由作者提供)
数据可视化
如您所见,存在重叠,HR 或 BR 的单一阈值会导致相当大的误差。让我们在一个单独的图中绘制 HR 和 BR,以便您可以直观地看到问题。
在我们的案例研究中,心率与呼吸频率的散点图(图片由作者提供)
线性方程
如果我们将 HR 和 BR 结合起来帮助我们找到“最优”决策边界,我们能做的最简单的事情是什么?最简单的方法是将呼吸率和心率进行线性组合。从数学上讲,这相当于求一个加权和,如下式所示:
呼吸率和心率的加权和,其中 A 和 B 是未知参数(图片由作者提供)
从图形上看,这相当于在二维图上找到一条直线。因此,问题归结为找到正确的值 A 和 B 来拟合一条线(决策边界),这条线可以帮助我们区分正常和异常情况。
只是有一点需要注意:如果我们只需要将这个问题简化为寻找 A 和 B ,那么得到的直线将总是通过原点。为了消除这种限制,我们可以添加一个“偏差”项,因此,最终的等式变成如下:
为了确保“决策边界”不仅限于通过原点,我们添加了一个“偏差”项,这是一个需要在“学习”过程中确定的附加参数。在上面的等式中,“偏置”项是 c。
因此,分类问题在概念上可以被看作是寻找能够最好地分离正常和异常情况的直线方程的未知参数。
物流功能
我们仍然需要对一些事情进行排序,包括找出我们如何找到找到最佳线的方法(对于 2-D 情况,这在目前看起来可能是显而易见的,但请记住,这是一个有助于可视化的更简单的问题,一旦我们理解了这一点,相同的原则将适用于更高维度的问题,因此我们需要找到一种自动和有原则的方法来找到这一点)。
如你所知,心率和呼吸率的线性组合的输出没有限制。它可以取任何值,完全取决于 HR 和 BR 的值。
如果方程的输出可以转换成概率不是很方便吗?
事实证明,有一种方法可以迫使心率和呼吸率的线性组合的输出限制在 0 和 1 之间(这可以解释为一种概率)。为了实现这个目标,我们所要做的就是将线性组合的输出作为一个新函数的输入,该函数可以将从-无穷大到+无穷大之间的任何值作为输入,然后输出一个介于 0 和 1 之间的值。“逻辑”回归中使用的一个函数就是“逻辑”函数(该函数也称为 sigmoid 函数)。
逻辑函数及其与使用特征的线性组合的关系(图片由作者提供)
您可以将此过程视为制作一个要素线性组合包,然后将该包交给逻辑函数,该函数会将输出转换为 0 到 1 之间的变量。然而,这种转换不是随机的。如果你仔细观察逻辑函数,你会注意到它为任何正输入输出值 > 0.5 ,为任何负输入输出值 < 0.5 。因此,我们需要做的就是找到 A,B,C 的值(根据前面定义的等式),使得线性等式在真实值为 0 的情况下输出非常大的负值(按照惯例,我们将 0 分配给正常情况),当真实值为 1 时输出非常大的正值(1 对应于患者异常的情况)。或者用更简单的话来表述:我们需要找到 A,B,C 的值,使得逻辑函数的输出接近实际值。
成本函数
一种方法是定义一个“成本”函数。并且该成本函数需要确保当来自逻辑函数的输出与实际值非常不同时它输出大的值(假设实际值是 1 并且逻辑函数输出非常小的值,接近 0,或者如果实际值是 0 并且逻辑函数输出接近 1 的大值)。相反,这个成本函数需要输出一个非常小的值,当输出与实际值匹配时,理想情况下为 0。如果我们可以有这样一个成本函数,那么我们所要做的就是找到导致最小成本函数的参数 A、B、C 的值。
优化
寻找成本函数最小值的过程称为“最优化”。我们要怎么做?我们可以使用微积分(更具体地说,是一种梯度下降算法,可以帮助我们找到函数的最小值)。虽然在理论上,我们可以使用几个具有这种特性的数学函数(当差异高时,成本值高,当差异低时,成本值低),但我们还需要确保函数是“凸的”。这有助于我们使用微积分轻松找到成本最小的参数值。如果我们没有凸函数,那么我们不一定能找到全局最小值,它也不会是最优解。令人欣慰的是,逻辑回归的成本函数的要求已经被很好地研究和计算出来了,从图形上看,当实际输出为 1 时,它看起来像下面这样。为了强调这些概念,我给这幅图贴上了标签。成本函数取决于预测值,从图中我们可以看到,当实际产量和预测产量完全匹配时,成本为 0,随着预测值和实际值之间的差异增加,成本逐渐增加。
实际输出为 1 时使用的成本函数。请注意,当预测输出 y 为 1(实际值和预测值完全匹配)时,成本为 0。然而,随着预测产量接近 0(实际值和预测值完全不匹配),成本逐渐增加。(图片由作者提供)
如果您已经掌握了上面的成本函数图,那么下一个应该马上就清楚了(它是前面图的镜像,描绘了实际输出为 0 时的场景)。
实际输出为 0 时使用的成本函数。请注意,当预测输出 y 为 0(实际值和预测值完全匹配)时,成本为 0。然而,随着预测产量接近 1(实际值和预测值完全不匹配),成本逐渐增加。(图片由作者提供)
一旦你定义了成本函数,你现在需要做的就是运行一个优化算法,找到未知的值,可以帮助你得到最小值。为了开始优化过程,我们需要将未知数的值初始化为一些值。随后,我们可以运行该函数并获得未知参数的值,对于这些参数,成本函数是最小值。运行这个,在我们的问题中,我们得到下面的决策边界。
使用成本函数最小的 A、B 和 C 值得到的决策边界。(图片由作者提供)
预测
最后,如果我们需要对一个新的数据集进行预测,我们需要做的就是得到它们的 HR 和 BR,并使用学习时找到的参数值 (A,B,C) 找出预测输出, y 。从图形上看,这相当于确定新数据点位于决策边界的哪一侧。如果高于该线,则可认为患者正常。如果低于该线,则可认为患者异常。
从头开始实施
为了保持帖子简短,我将分享如何从头实现逻辑回归的要点。然而,你可以查看我的 github 库来访问产生这篇文章中的图片的代码(在 Matlab 中实现)。如果有兴趣的话,我随后也会在资源库中分享 Python 和 R 代码。关键的实施步骤是:
㈠以矩阵形式获取数据
(二)可视化数据(散点图以查看相关性,直方图或密度图以更好地了解数据的分布)
㈢增加截距(偏差)项
(iv)初始化未知参数(在这种情况下,任何随机数都可以)
(v)定义成本函数并运行优化例程(您会发现在您选择的任何编程语言中都有内置的例程来实现这一点)
㈥划定决策界限
㈦进行预测
这里的帖子中已经给出了需要实现的各种方程(见两个成本函数图)。结合代码阅读本文应该很简单,可以帮助您找出完整的管道并自己实现它。
摘要
本文假设没有机器学习的先验知识,并从数据科学的大背景出发介绍了逻辑回归。然后,它证明了为什么任何有抱负的数据科学家都应该投入时间来理解逻辑回归是如何工作的。然后,它继续解释逻辑回归的关键概念,并提供了数学方程和图形表示,以帮助理解。这些概念都解释了作者自己的研究工作启发的案例研究的帮助。
https://ahmarshah.medium.com/membership
直观地理解 MapReduce
了解处理大数据的商业秘密
介绍
大数据到底有多大?根据里奥纳尔迪·钱德拉塞塔的说法,他在处理大数据时的经验是128 Pb。这么大的数据量实在让人无法理解。如果您从未处理过这种规模的数据,我推荐您阅读他的文章,它也是这篇文章的灵感来源。
简单来说,逐行执行操作在万亿级别是不够的。当处理不可逾越的数据量时,需要某些技术来计算各种统计数据,以及强大的计算集群。有许多方法可以提高性能,但最常用的技术是 MapReduce。在了解其工作原理或为何如此有效之前,我们先来了解并行化。
简而言之,并行化
假设您有一个 Python 脚本要运行,但没有关于如何运行的具体指令,它会连续运行。串行计算意味着每个进程都按照指定的顺序运行。然而,我们可以看到,对于大量的数据,这可能是一个严重的问题。然而,并行化允许同时或并行处理批量数据。
机器上的大多数 CPU 都有多线程能力。这意味着一个 CPU 有许多线程或内核,允许更多数据流通过进行并行处理。事实上,我的笔记本电脑是 2015 年制造的,它有 8 个核心。
假设您在一台拥有 16 个 CPU 内核的计算机上工作。你的机器允许数据被分割成 16 个不同的线程进行处理。如果在使用 16 个内核后仍有更多数据,下一批将被分配给第一个分配的内核,之后的一批将被分配给第二个内核,并且该过程将继续,直到所有数据都被处理完。
这使得每个 CPU 核心成为一个工作节点。工作节点被分配了许多要提前执行的作业,并且所有节点同时完成它们的作业。如我们所见,这允许同时操作大量数据,从而实现更快的性能。但是这和 MapReduce 有什么关系呢?
MapReduce
Map 过程获取相关的数据集,并使用过滤或排序将其转换为另一个更小的数据集。每个数据点将被分配一个 ID,让计算机知道它将被分配到哪个工作节点。在 Reduce 步骤之前,有一个称为 Shuffle 过程的中间过程。这将获取经过排序/筛选的数据,并重新分配这些数据,以确保将它们分配给适当的工作人员。一旦完成,Reduce 过程可以是许多过程中的一个,但是顾名思义,就是将新的映射数据集简化为有问题的解决方案。
值得注意的是,您可以利用单核的 MapReduce 过程。然而,它并没有表现出比在没有 MapReduce 的情况下实现函数本身更快。简而言之,MapReduce 是一个在并行计算中发挥其最大潜力的过程。SunLab 的下图很好地展示了这一过程。
照片由太阳实验室提供
结论
随着 MapReduce 的直觉开始形成,很容易看到它在数据科学和机器机器学习中的效用。最简单的用例可能是找到某个汇总统计数据。这可能像均值一样简单,也可能像发现一首歌的可舞性一样复杂。
在数据科学中,特征提取是关键。当处理数 Pb 的数据时,以有效的方式找到必要的特征不仅会使您作为数据科学家的工作变得容易得多,而且还会让您找到以前从未梦想过的洞察力。
https://learningfrommachines.substack.com/welcome
使用简单的 python 理解 Q-Q 图
可视化数据的有效方法
作者图片
简介
工程师和科学家处理数据。没有数据,他们无法得出任何结论。现在是每天从我们生活的各个方面创造数据的时代。有些数据是随机的,有些是有偏差的。由于数据收集过程,有些人可能会有偏见。数据的一个非常重要的方面是分布概况。收集的数据可能呈正态分布,也可能远离正态分布。它也可以向一侧倾斜,或者可以遵循多模态模式。它可以是离散的,也可以是连续的。对于连续数据,正态分布相比于它的对应物有很多优势。各种推断统计过程都假设分布是正态的。钟形曲线很容易用均值和标准差来描述。
典型的正态分布数据(图片由作者提供)
为什么要阿 q 情节?
由于正态分布如此重要,我们需要检查收集的数据是否正态。在这里,我们将演示 Q-Q 图来检查数据偏态的正态性。Q 代表分位数,因此,Q-Q 图代表分位数-分位数图。为了确定正态性,也有一些统计检验,如科尔莫戈罗夫-斯米尔诺夫检验和夏皮罗-维尔克检验。本文范围仅为 Q-Q 剧情。
简要说明
我们现在知道 Q-Q 图是分位数-分位数图,但首先分位数是什么?当对整个数据进行排序时,第 50 个分位数意味着 50%的数据低于该点,50%的数据高于该点。这是中间点。当我们说第一分位数时,只有 1%的数据低于该点,99%的数据高于该点。第 25 和第 75 分位数点也称为四分位数。数据集有三个四分位数。
Q1 =第一个四分位数=第 25 个四分位数
Q2 =第二个四分位数=第 50 个四分位数=中位数
Q3 =第三个四分位数=第 75 个四分位数
分位数有时被称为百分位数。下面是一个典型的 Q-Q 图。让我们解释一下这个看起来几乎是一条直线的图。
Q-Q 图(图片由作者提供)
轴
Q-Q 图的 x 轴代表标准正态分布的分位数。假设我们有一个正常的数据,我们想标准化它。标准化意味着从每个数据点中减去平均值,然后除以标准差。结果也称为 z 分数。让我们对这些 z 值进行排序,然后再进行绘图。下图显示 x 轴现在以 0°为中心,并在每侧延伸至 3 个标准差。据统计,99.7%的数据都在这个范围之内。
标准化正态数据的分布(图片由作者提供)
找到 Q-Q 图的 x 轴值的第一步是确定该正态分布标准数据的分位数/百分位数。这样,我们就可以得到在所有 Q-Q 图中非常标准的分位数。当我们使用这些 z 分数时,x 轴将大致从-3 延伸到+3。
一旦我们获得了沿 x 轴绘制的值,我们就需要对感兴趣的数据应用相同的方法。因此,我们将绘制 out 数据的 z 得分与标准正态数据的 z 得分。如果我们的数据是正常的,绘图将是一条直线,因为我们正在绘制非常接近的值。如果数据不是正态分布的,线就会偏离直线轨道,发出不同情景的信号。
右侧数据失真(图片由作者提供)
例如,如果数据偏高(如上所示),我们将获得类似下图的 Q-Q 图。
偏斜数据的 Q-Q 图(图片由作者提供)
如果数据显示双峰,Q-Q 图也会显示这一点。
双峰数据(图片由作者提供)
双峰数据的 Q-Q 图(图片由作者提供)
本文的教程链接是这里的。
用 python 实现
Python 有 stastsmodels 库,里面有方便的 qqplot 模块可以使用。
Statsmodels 正常数据的 Q-Q 图(图片由作者提供)
为了更好地理解,我还将展示代码块的分解,以便简单地实现它。一旦我们有了数据框架中的数据,我们需要将其标准化。
接下来,我们需要找到分位数/百分位数。
最后,我们需要对输出和绘图进行排序。
就是这样。我们可以使用这个 Q-Q 图快速查看数据的正态性。
结论
Q-Q 图是一个非常有用的工具,可以确定数据的正态性或数据偏离正态性的程度。此图表示沿 x 轴的标准正态分布的 z 得分以及所获得数据的相应 z 得分。有时,也可以沿 y 轴绘制样本分位数,而不是 z 得分。
感谢阅读。
理解支持向量机
一个初学者友好的 SVM 方程推导与直观的解释
正交投影给出了我们从一个点到一个平面的最短距离,就像我们在日常生活中所习惯的一样(图片由作者提供)
“真正的知识来自对一个主题及其内部运作的深刻理解.”[人名]阿尔伯特·爱因斯坦(犹太裔理论物理学家)
为什么我要费心学习 SVM 背后的数学?
有许多可用的库可以帮助我使用 SVM,而不必担心底层的概念。
当然可以!你完全正确。你不需要理解 SVM 就能使用它。您甚至可以应用 SVM 来解决分类问题,而无需理解其背后的基本概念。有大量的工具随时可用。再也没有人在现实世界的项目中从头开始实现 SVM 了。
然而,如果你是一个有抱负的数据科学家,你应该花一些时间学习这些基本概念,以了解各种代数和几何参数如何最终成为一种算法。
学习或遵循每个算法的本质是不可能的,但有一些绝对基本的概念,任何认真的从业者都应该接触到。这样的曝光将新手和熟练者区分开来。
SVM 只是一个工具。就像锤子是木匠的工具一样。然而,拥有锤子并不会让每个人都成为有用的木匠。同样,把访问 SVM 作为一种工具并不一定会让你成为有用的数据科学家。
数据科学既是一门艺术,也是一门科学。作为一名数据科学家,如果你想精通你的技术,那么我建议你必须花一些时间去理解一些精选的、众所周知的算法的数学和几何论证。
这正是这篇文章的目的:使用高中数学和几何推导 SVM 方程,并使用直观和易于理解的论点!
SVM 是理解监督机器学习的几何观点和巩固向量代数在机器学习中的使用的理想算法。让我们开始吧!
如果你能仔细阅读这篇文章,那么你应该最终对 SVM 背后的数学有一个清晰的理解,并且(希望)认识到 SVM 数学只是看起来吓人,但实际上非常简单!
在以前的文章中,我已经给出了一个非常温和的介绍,仅提供几何直观。如果你不太熟悉 SVM 的基本概念(或者对 SVM 与逻辑回归的区别有点生疏),那么我建议你先读一读我以前关于这个主题的文章。
线性可分的两类
帮助解释 SVM 概念的最基本的场景是解决一个二元分类问题,其中两个类是线性可分的。相应的解决方案也称为“硬”SVM。这是因为一旦找到了“最优”决策边界,就不会有错误。所有训练点都在决策边界的正确一侧。这与“软余量”SVM 形成对比,当我们处理不是线性可分的分类任务并且允许一些错误时。
SVM 方程(从技术上讲,是一个方程和一个不等式)是:
硬边界支持向量机方程(图片由作者提供)
文章的其余部分将推导出上述内容。先来个数学鸟瞰!
注:知名的机器学习书籍中有很多关于这个话题的优秀资源。根据您查看的资源,您会发现在使用的符号方面有细微的变化。为了让这篇文章易于理解,我选择了“机器学习的数学”所采用的符号,可以在 GitHub 上免费获得。
分类的高级数学视图
您可以将分类任务视为一个映射,该映射接受一个 n 维输入(特征向量, x )并输出一个 1 维类标签, y (假设一个类为正,另一个类为负)。
实数的 n 维向量空间(输入)被映射到 1 维向量空间(输出)的函数;(图片由作者提供)
为了进一步挖掘,我们需要理解超平面的概念!
超平面
什么是超平面?在二维情况下,超平面是一条分隔线。在一个三维的 T21 案例中,它是一个平面。在 n 维的情况下,它是一个 (n-1) 维的向量空间(一个超平面)。
内积是表示超平面的一种方便的符号
我们需要在 x 中找到一些不同特征的线性组合,一个方便的向量符号是使用内积(在这种情况下,这也被称为标量或点积)。因此,我们对于分离超平面的表达式变成:
超平面的表达式;(图片由作者提供)
在上面的表达式中, w 是权重向量, x 是特征向量, b 是偏差项(进一步阅读可以理解这些术语的几何意义)。两个向量之间的内积是一种紧凑的表示,它将每个单独的对应分量相乘,然后将所有的乘积相加。例如,如果我们正在处理二维情况,我们可以将超平面表达式表示为:
二维超平面的表达(图片由作者提供)
本例中,w*=(w₀,w* ₁ ),以及x*=(x₀,x* ₁ )。 说白了, w 和 x 都是向量,各有两个分量。
超平面不等式和方程
我们对超平面表达式本身不感兴趣,而是使用它来帮助我们将 n 维空间划分成区域。我们可以通过指定带有不等式的条件来做到这一点。
在我们的具有 n 个特征的两类线性可分分类问题中,让我们假设这两个类被标记为+1 或-1(我们可以假设不同的数字来表示每个类,但是这种选择使得随后的数学变得简单)。我们想从超平面中得到的是保证任何属于一类的点(比如说+1)在超平面的一边(比如说正边),属于另一类的点(比如说当 yn=-1 时)在负边。
数学上,对于正类,超平面不等式变成:
类为+1 时的超平面不等式(图片由作者提供)
对于消极阶层来说,
类为-1 时的超平面不等式(图片由作者提供)
我们可以将上述两个不等式表示为一个不等式:
以上两个超平面不等式的紧凑表示,方程 A(图片由作者提供)
(如果你对你的高中数学有点生疏的话,紧凑表示法相当于上面的两个表达式,因为当我们将一个不等式乘以一个负数时,不等式的符号会改变)
简单地说,上述不等式说明了属于这两类的点位于超平面的相对两侧的条件。
满足上述约束的特定超平面将是超平面方程。
超平面方程(作者图片)
超平面的几何视图
任何超平面都可以用一个权重向量、 w、 和一个偏差项、 *b、*来表示,从图形上看,一个超平面在 3D 中看起来就像下图。权重向量 w 垂直于(成 90 度角)平面,偏移项 b 是平面到原点的距离(偏移),并且 x ₘ和 x ₙ是平面上的两个点(平面上的任意两个点!).
3D 中的分离超平面,改编自 Deisenroth,Marc Peter,A. Aldo Faisal 和 Cheng Soon Ong。机器学习的数学 。”(图片由作者提供)
如果你把上面的三维图形投影到一个平面上,这就变得很清楚了。你可以直观地认为投影是从边缘看同一个图形,这样平面看起来就像一条线。从那边看,连接ₘ和ₙ的线将会是一条线。
从侧面看的分离超平面(图片由作者提供)
此时,你可能会奇怪为什么重量向量, w, 垂直于平面。对此的一个简单证明就是,想象超平面上的任意两点,然后算出 w 与平面上两点连接形成的向量的内积为 0。换句话说, w 和在超平面上的任何一个向量的点积将会是 0。当两个向量的内积为零时,那么这两个向量总是正交的。下图以较慢的速度提供了相同的证明。
为什么超平面方程中的 w 与平面正交的证明(图片作者提供)
要记住的底线是这样的:
超平面方程由一个矢量和一个偏差项表示。等式中的向量与超平面正交,偏差项表示从原点的偏移量。
点到超平面的距离
我们现在几乎完成了。记住 SVM 的目的:找到导致最大利润的超平面。边缘只不过是最近的类数据点和超平面之间的距离。这正是我们现在要做的:找出点到超平面的距离。
让我们考虑一个点, xₐ ,属于其中一类。当我们说从一个点到一个平面的距离时,我们指的不是任何距离,而是最短的距离。
想象一下把你的手机放在桌子上方。当我们说手机到桌子的距离时,我们指的是最短的距离, 的直线距离,而不是 的任何其他距离。
正交投影给出了点到平面的最短距离(图片由作者提供)
同样的概念也适用于此。我们感兴趣的是这个点到超平面的最短距离(这也叫点在平面上的正交投影)。在下图中,让我们将此标记为 x’ₐ 。
点(xₐ)和平面之间距离的概念,说明了正交投影的概念,改编自" Deisenroth、Marc Peter、A. Aldo Faisal 和 Cheng Soon Ong。机器学习的数学 (图片由作者提供)
x’ₐ 和 xₐ 之间的矢量可以看作是由 r(边距)缩放的单位正交矢量(从 w 导出)。使用简单的向量加法和减法,我们得到:
等式 1(图片由作者提供)
在哪里
作者图片
是单位缩放矢量。如果你对向量加减法有点生疏,那么可以把等式(1)看作是从原点到达 x’ₐ的两种等价方式。基于等式(1)的左手边,你可以直接沿着矢量 x’ₐ.走基于等式(1)的右手边,你可以沿着 xₐ走,然后沿着-r*(w/| | w | |)。在这两种情况下,你都将从原点出发,最终到达同一点,x’ₐ.*
SVM 方程,最后
我们现在几乎完成了。想想下面显示的场景:
帮助推导利润公式的插图,改编自" Deisenroth、Marc Peter、A. Aldo Faisal 和 Cheng Soon Ong。机器学习的数学 (图片由作者提供)
让我们假设 xₐ是离超平面最近的点,离正类的距离为 1。给定为 x’ₐ的 xₐ的投影位于超平面上,因此:
等式 2(图片由作者提供)
将等式(1)代入等式(2):
等式 3(图片由作者提供)
展开等式(3)中的各项并重新排列,我们得到:
等式 4(图片由作者提供)
使用非常简单的简化方法(如下所示),
方程式 4 的简化(图片由作者提供)
我们得到:
用垂直于超平面的向量表示的边距,等式 B(图片由作者提供)
因此,SVM 要求是最大化余量(等式 B)并确保点位于正确的一侧,如前面的不等式所示(等式 A)。
为了数学上的方便,我们没有最大化等式 B,而是最小化它的倒数(和平方)并添加 1/2 项(这不会改变优化函数,但在计算梯度时只会导致更整洁的解)。因此,目标是:
硬边界 SVM 方程(图片由作者提供)
好了,这些是 SVM 方程,你可以在几本机器学习的书中找到。它包括服从约束的最小化(即找到导致最大余量的 w 的值)。该约束表示在不等式中,该不等式确保来自正类和负类的数据点都在超平面的正确侧。这是一个约束优化问题,可以用语言乘数法来解决!
“任何领域的专家都曾是初学者”海伦·海丝
祝贺你,你向成为数据科学专家又迈进了一步!
*https://ahmarshah.medium.com/membership *
理解支持向量机
系列的第 1 部分,提供全面介绍的简短文章;不假设任何先验知识
SVM 试图找到最大边界(图片由作者提供)
概观
这是 5 篇短文的第 1 部分,全面介绍了支持向量机(SVM)。该系列的目的是帮助你彻底了解 SVM,并能够自信地在你自己的项目中使用它。该序列假设没有机器学习(ML)的先验知识,并且熟悉高中数学足以跟随和理解。
大局
如果你是数据科学的绝对初学者,并且还不理解监督学习和非监督学习之间的区别,那么我建议你阅读我之前的文章,该文章假设完全没有先验知识,并使用一个故事来帮助你理解这些术语。
在数据科学的生态系统中,SVM 是一种非常受欢迎的算法,可以帮助你解决监督学习中的两种类型的机器学习问题:分类和回归。在分类中,我们希望开发一种算法,可以帮助我们预测一个“类”(从一组离散的可能性中做出的特定预测)。分类的一些例子是垃圾邮件与非垃圾邮件,从图像中识别 0-9 位数字中的任何一个,有病与没病(希望你明白)。在回归分析中,我们预测的是一个“连续的”输出(例如,房子的价格,或者从大脑信号预测的力量)。
从概念上讲,回归和分类是相似的。在这两种情况下,我们都有一组数据点或属性(通常称为特征),然后使用它们来预测输出。如果输出是离散的,我们称之为分类。如果输出是连续的,我们称之为回归。
SVM 可以帮助我们解决分类和回归问题。然而,SVM 背后的数学初看起来可能很可怕,但它有非常清晰的几何直觉(希望一旦你看完这个系列文章,SVM 背后的数学就不会看起来那么可怕)。
SVM 是生成性的还是歧视性的?
概括地说,有两种分类方法。我们可以学习每一类数据的统计属性,然后使用该知识来识别特定数据点属于哪一类。这被称为生成方法,因为我们试图学习每个类的底层概率模型(如果我们有每个类的概率模型,那么我们可以使用该模型来“生成”新的数据点,因此得名生成模型)。
或者,我们可以尝试直接学习可以帮助我们确定特定数据点属于哪个类的决策边界。这是解决分类问题的“判别”分析方法。这相当于将数据点的“空间”划分为不同的区域,其中每个区域属于一个特定的类。
等等,我说的“空间”是什么意思?…
空间只是一个帮助我们表示数据点的概念构造。例如,考虑一个由两个元素组成的数据点:心率和呼吸率。我们可以在二维空间上表示这个数据点,其中一维是心率,另一维是呼吸率。
一个二维空间,其中每个数据点由一对值表示(图片由作者提供)
不一定是心率和呼吸频率。它可以是任何东西,取决于手头的问题。例如,考虑一个使用建筑面积和卧室数量的房价预测问题。在这种情况下,两个维度将是地板面积,并且卧室的数量和 2 维空间中的每个数据点将对应于唯一的数据点。此外,我们并不局限于二维空间,同样的概念可以扩展到更多的维度。
需要注意的关键点是:对于一个具有 n 个特征的问题,每个数据点在概念上都可以用一个 n 维空间来表示。
一个判别模型,如 SVM,试图找到一个边界来帮助我们划分这个 n 维空间(其中空间中的每个区域将属于一个特定的类别)。数学上,这个决策边界是一个 n -1 子空间,它被称为超平面(例如,如果我们有一个 2 维空间,那么决策边界的超平面将是 1 维空间,一条线;如果我们有一个三维空间,那么决策边界的超平面将是一个二维平面)。
我们如何确定决策边界?
问题归结为在一个 n 维空间中找到一个决策边界。从概念上讲,我们通过尝试识别不同的可能决策界限,然后选择最合适的一个来实现这一点。从数学上来说,这相当于找到一个“成本”函数的最小值,当预测很差时,该函数具有高值,而当预测很好时,该函数具有低值。(我之前关于 logistic 回归的文章已经更详细的介绍了成本函数的概念)。因此,所有的神奇之处就在于我们如何定义“成本”函数。
这也是 SVM 不同于另一个著名的分类技术,逻辑回归的地方。在逻辑回归中,数学公式是这样的,我们取所有的数据点来寻找能给我们最小成本的决策边界。然而,在 SVM,我们试图找到导致判定边界(超平面)和两个类的最近(到超平面)数据点之间的最大距离(称为余量)的判定边界。(这些最接近的数据点“支撑”着超平面,就像一根柱子支撑着一座建筑)。
SVM 背后的数学概述
如果 SVM 的数学令人不快,这里是 SVM 文字背后的数学鸟瞰图(我们将在本系列的后续文章中推导相关方程)。如前所述,将 SVM 与其他算法(如逻辑回归)区分开来的真正魔力在于“成本”函数。对于逻辑回归,我们定义一个“凸”的成本函数(这意味着它有一个 U 形和一个单一的最小点;这样的问题很好解决)。对于 SVM,我们有两个要求:
(I):我们希望最大化利润(优化)
(ii):我们希望确保这些点位于决策边界的正确一侧(一个约束)
因此,SVM 问题是一个“约束”优化问题,我们希望最大限度地提高利润(I),但也确保满足约束(ii)。语言乘数法为我们提供了一种解决约束优化问题的方法(通过将其转化为无约束问题,然后我们可以用微积分来解决;我们将在本系列的后续文章中推导相关方程)。
支持向量机可以公式化为一个约束优化问题,目标是最大限度地增加利润,同时确保点位于超平面的正确一侧(图片由作者提供)
总之,SVM 是一个最大边际分类器。本文提供了一个简单的介绍,并使用一个简单的线性可分案例来说明基本概念。本系列的后续文章将向您展示 SVM 背后的数学是如何从几何直觉中推导出来的,并涵盖数据点不是线性可分的情况。敬请期待!
如果你喜欢读这篇文章,那么你可以考虑阅读下一篇文章,在这篇文章中,SVM 方程是用几何直觉推导出来的。
https://ahmarshah.medium.com/membership
通过克罗内克乘积和线性方程理解李亚普诺夫方程
李雅普诺夫方程是一类矩阵方程,它在控制理论的许多分支中非常著名,如稳定性分析和最优控制。李亚普诺夫方程的术语来源于俄罗斯数学家亚历山大·李亚普诺夫的名字。他因发展和成就了动力系统的稳定性理论,以及对数学物理和概率论的许多贡献而闻名于世[1]。
亚历山大·李亚普诺夫(1857-1918)。俄罗斯数学家、机械学家和物理学家。
在这篇文章中,我们计划重温李亚普诺夫方程。具体来说,我们将
- 从线性代数角度引入李雅普诺夫方程,
- 利用 Kronecker 积和矩阵向量化建立李雅普诺夫方程和最简单线性方程之间的联系。
矩阵计算中的 Kronecker 积
Kronecker 积是矩阵计算中一个著名的运算[2]。虽然 Kronecker 积的概念在线性代数中并不广为人知,但该运算常用于矩阵计算。克罗内克积的基本思想很容易理解。例如,如果我们有两个矩阵 A 和 B ,它们的大小分别为 2 乘 2 和 2 乘 3,就像这两个矩阵:
然后根据克罗内克积的定义,我们可以计算克罗内克积如下:
在这个操作中,遵循克罗内克积的思想并不困难。我们可以用矩阵 A 中的每个元素乘以矩阵 B 。以这种方式,得到的矩阵的数据大小是 4 乘 6。
在 Python 中,我们可以使用 Numpy 来计算两个矩阵之间的 Kronecker 积,让我们来试试:
import numpy as npA = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6, 7], [8, 9, 10]])
print(np.kron(A, B))
输出将是:
[[ 5 6 7 10 12 14]
[ 8 9 10 16 18 20]
[15 18 21 20 24 28]
[24 27 30 32 36 40]]
结果和上面的例子完全一样。
重温李亚普诺夫方程
如上所述,李雅普诺夫方程是一种特定类型的矩阵方程。形式上,我们可以把它写成
其中 A 和 W 都是已知矩阵,它们是 n -by- n 。 n -by- n 矩阵 X 未知。这里的问题是,如果W都已知,如何获得 X 的解。
一种简单的方法是使用克罗内克乘积和矩阵向量化。矩阵向量化用于将给定的矩阵转换成向量。让我们看一个关于矩阵矢量化的简单示例:
这是一个列向量化。
事实上,有一个方程可以建立矩阵方程和向量形式方程之间的联系:
这里,方程包括克罗内克乘积和矩阵向量化。
因此,我们可以将李亚普诺夫方程改写为
和
其中 I 表示单位矩阵。
我们知道,这确实是一个线性方程问题,其解由下式给出
李亚普诺夫方程的一个玩具例子
我们可以用 Kronecker 积和矩阵向量化写出李雅普诺夫方程问题的封闭解。在某些情况下,如果我们想把某个方程理解清楚,可以试着解一些简单的例子。这里,第一个冲动是考虑一个简单的例子来说明:
在这个例子中,根据克罗内克积的定义(请自行尝试:),我们有
根据矩阵向量化的原理,我们有
因此, X 的解为
以矩阵的形式,它是
如果想用 Python 重现,可以阅读并尝试以下代码:
*import numpy as np
A = np.array([[-4, -1, -1, 0], [1, -2, 0, -1],
[1, 0, -2, -1], [0, 1, 1, 0]])
b = np.array([-1, 0, 0, -1])
x = np.linalg.inv(A) @ b*
请自己尝试一下,这样你会更熟悉李亚普诺夫方程。
简短的讨论
李亚普诺夫是许多科学和工程领域中重要的矩阵方程之一。还有一些其他类型的矩阵方程,如西尔维斯特方程。使用李雅普诺夫方程的上述解不能产生有效的计算,因为克罗内克乘积和矩阵向量化会产生大的矩阵。上述解决方案的复杂性是 O(n⁶).在实践中,我们可以使用 Bartels-Stewart 算法来求解李雅普诺夫方程,因为该算法的复杂度为 O(n)。
这篇博文将是从克罗内克乘积和线性方程的角度理解李雅普诺夫方程的一个良好开端。如果您有任何问题,请随时给我反馈。感谢您的阅读!
参考
[1]维基百科上的亚历山大·李亚普诺夫:https://en.wikipedia.org/wiki/Aleksandr_Lyapunov
[2]维基百科上的克罗内克积:https://en.wikipedia.org/wiki/Kronecker_product
只需点击几下鼠标,就能了解是什么推动了您的客户行为
使用 PowerBI 进行关键驱动因素分析
弗兰基·查马基在 Unsplash 上拍摄的照片
如果您是产品经理或营销专业人士,想要了解是什么驱动了特定的客户行为,您只需点击几下鼠标就能找到答案。
是什么驱使你的客户流失?是什么导致了令人惊叹的体验?是什么让他们购买你的产品?简而言之,理解驱动您感兴趣的指标的因素。Power BI 很好地利用了机器学习和人工智能的能力来分析你的数据,对重要的因素进行排序,并将它们显示为关键影响因素。它还根据各种因素的组合对客户进行智能细分。
好的一面是——你不需要有数据科学方面的专业知识。你所需要做的就是上传或连接你的原始数据,然后点击几下。让我们以 ka ggle-https://www.kaggle.com/blastchar/telco-customer-churn上的电信客户流失数据集为例。目标变量是流失率,即上个月内离开的客户。数据集包括以下信息:
- 上个月内离开的客户—这一列称为流失
- 每位客户已注册的服务—电话、多条线路、互联网、在线安全、在线备份、设备保护、技术支持以及流媒体电视和电影
- 客户账户信息——他们成为客户的时间、合同、支付方式、无纸化账单、每月费用和总费用
- 客户的人口统计信息—性别、年龄范围,以及他们是否有伴侣和家属
让我们试着了解是什么因素导致了客户流失。
步骤 1:在 PowerBI 中加载数据
文件->获取数据->文本/CSV
有 7043 行和 19 列具有客户属性,我们将使用它们作为输入因子,最后一列“客户流失”作为输出变量。
第二步:拖动&放下
点击插入部分下的关键影响者。将目标变量(此处为变动)拖到“分析”下,将您想要保留的所有因素拖到“解释者”下。在下图中,我将所有 19 个变量作为因子进行了拖动。
步骤 3:读取结果
3.1 了解关键影响者
您会发现,当您在列表中添加或删除变量时,结果会自动更新。让我们来看看关键的影响者。正如我们在图中看到的,逐月合同是导致客户流失的首要因素。准确地说,与其他合同类型(一年期、两年期)相比,逐月合同的客户 6.32 更有可能流失。
第二个最重要的因素是在线安全性,其次是技术支持,其中 3.63 和 3.51 分别是流失率的提升。
到目前为止,您已经看到了不同的分类变量。“合同”是一个分类变量,有三个标签:逐月、一年和两年。Power BI 在右窗格中显示了所选变量的更多详细信息,您可以在这里看到每个标签对客户流失可能性的比较效果。虚线表示平均值。除所选关键因素之外的所有值的变动百分比(合同是逐月的)。
让我们看看变量连续时的细节——例如总费用。第四个最重要的因素是“总费用为 68.45–96.45”。请注意,PowerBI 已经自动将装入连续变量。右窗格中的分布显示总费用和流失之间的关系不是线性的。我发现这个最佳宁滨非常有用。作为保留经理,您可以特别关注总费用为 68.45-96.45 英镑的客户群。
到目前为止,我们探索了“关键影响因素”选项卡,以单独评估每个因素并对其进行排名。但实际上,影响指标的是个因素的组合。让我们来探索 PowerBI 的这一强大功能,它通过对关键影响者进行分组来进行细分。
3.2 提取用户细分
单击 Top segments 选项卡,查看各种因素的组合如何影响客户流失。根据满足条件的记录的百分比对这些段进行分级。每个区段气泡的大小表示区段中有多少记录(人口计数)。
在我们的例子中,发现了 5 个段。这些细分市场按照细分市场中“流失”的百分比进行排名。例如,细分市场 1 中有 75.9%的客户都曾抱怨过。泡沫越高,低收视率比例越高。选择一个气泡会显示该段的详细信息。让我们理解第一部分。
正如我们所看到的,第 1 部分用户是“按月”订购的用户,拥有光纤,并且是新用户(租期不超过 4 个月)。在这一细分市场中,75.9%的客户发生了流失,比平均水平高出 49 个百分点。段 1 也包含大约 7.2%的数据,因此它代表了人口中可寻址的部分。
您可以点击“了解有关该细分市场的更多信息”,进一步深入了解该细分市场,并查看影响该细分市场的其他因素。同样,我们可以理解创建的其他 4 个细分市场。
思绪
我发现这个 PowerBI 工具非常方便快捷。它是完全交互式的,这意味着您可以使用滤镜、切片器和其他视觉效果上的选择来影响结果。毫无疑问,让产品和营销策略师能够在没有技术诀窍的情况下利用 ML/AI 。在我的组织中,我用 A/B 测试实验数据制作了一个自动化的 PowerBI 仪表板。关键驱动因素分析是其中的重要部分。它有助于产品和营销经理理解是什么驱动他们的实验成功或失败,也有助于优化未来的实验。
不用说——作为一名数据科学家,我仍然喜欢用不同的方法处理原始数据——决策树、分类算法等等。关键驱动因素分析不仅仅是一种技术。如果你有兴趣知道 PowerBI 是如何做到这一点的,这里是我找到的链接-
https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet/customers/power-bi
使用 Grad-CAM 了解您的算法
当它是一个黑匣子时,我们为什么要足够信任 AI 来驾驶汽车,检测疾病,识别嫌疑人?
Grad-CAM 解读猫狗(图片由作者提供)
介绍
人工智能仅仅是一个黑匣子,我们开始信任它足以驾驶汽车,检测疾病,识别嫌疑人,只是因为大肆宣传吗?
你可能听说过网飞的纪录片, 编码偏差 (这里可以看电影)。这部电影批评了深度学习算法固有的偏见;特别是他们没有发现深色皮肤和女性的脸。这部电影表明解决问题的办法在政府。“推动美国有史以来第一部针对影响我们所有人的算法偏见的立法。”是深度学习算法本身存在固有的偏见,还是训练数据中的偏见问题?虽然对人工智能监管的需求存在,但解决方案的很大一部分取决于机器学习工程师。我们需要让我们的深度学习算法更具可解释性,找到弱点和偏见的领域,并改进我们的算法。
如何才能理解我们的卷积神经网络(黑盒)在做决策时看到和理解的东西?
这篇博客文章完全是关于制作视觉解释热图,这将帮助我们理解深度学习算法如何做出决策。在专注于建筑安全和安保的建筑技术初创公司 Forsight ,我们的计算机视觉团队使用视觉解释来改进我们的数据集和模型。点击阅读更多关于我们工作的信息。现在,我们要探讨的是视觉解释算法: Grad-CAM 。
在本文中,我们将向您展示如何使用 Grad-CAM 解读一组猫狗图像。您可以轻松地扩展这个示例,并使用它来调试您自己的模型。我们将向您展示如何通过查看模型中早期图层的 Grad-CAM 热图来提高现有文献的准确性和精确度。最后,我们将研究模型的错误,看看 Grad-CAM 如何帮助我们改进模型。让我们跳进来。
补充Google Colab笔记本会帮你重现这里制作的热图。请随意复制代码并将其用于您自己的项目!
数据集和模型
在将 Grad-CAM 解释应用于复杂的数据集和任务之前,让我们用一个经典的图像分类问题来简化它。我们将使用来自 kaggle 的高质量数据集对猫&狗进行分类。这里我们有一个包含 37,500 张图像的大型数据集(25,000 次训练& 12,500 次测试)。数据包含两类:猫&狗。这些数据包含了各种背景下的猫和狗,不同的亮度水平,以及参与不同的活动,这将考验我们的视觉解释!
在 Google Colab 笔记本上,你将加载一个预先训练好的模型,它已经可以对猫&狗进行分类。对于那些对模型架构感兴趣的人来说:它由标准化的重新缩放层组成,随后是先前在 COCO 数据集上训练的 MobileNetV2 层。在基本模型之后,我们包括了一个全局平均池层、一个 10%漏失的漏失层和一个密集预测层。在下图中,您可以看到培训后的所有评估集指标。提醒误报表明猫被错误地归类为狗。同样,假阴性表示狗被错误地归类为猫。一个经过训练的模型已经准备好了,我们可以开始研究这个问题:它是如何做出决策的?
模型指标(作者图片)
摄像机
Grad-CAM 由 Ramprasaath R. Selvaraju 等人对 arxiv.org 进行概述
警告,Grad-CAM 可能很难把你的头缠在上。
梯度加权类激活映射(Grad-CAM)使用流入最终卷积层的任何目标概念(比如分类网络中的“狗”或字幕网络中的单词序列)的梯度来产生粗略的定位图,该定位图突出显示图像中的重要区域以预测概念。
该技术在通用性和准确性方面比以前的方法有所改进。这很复杂,但幸运的是,输出很直观。从高层次来看,我们将一幅图像作为输入,并创建一个模型,该模型在我们想要创建 Grad-CAM 热图的层被切断。我们附加完全连接的层用于预测。然后,我们通过模型运行输入,获取图层输出和损失。接下来,我们找到我们期望的模型层的输出相对于模型损耗的梯度。从那里,我们采取有助于预测的梯度部分,减少,调整大小,并重新缩放,以便热图可以与原始图像重叠。你可以遵循下面代码中的具体步骤,并在这里查看概述完整数学的学术论文。
gradModel = Model(inputs=[model.inputs],outputs=[model.get_layer(layer_name).output,model.output])with tf.GradientTape() as tape: # cast the image tensor to a float-32 data type, pass the # forward propagate the image through the gradient model, and grab the loss # associated with the specific class index inputs = tf.cast(img_array, tf.float32) (convOutputs, predictions) = gradModel(inputs) loss = predictions[:, 0]# use automatic differentiation to compute the gradientsgrads = tape.gradient(loss, convOutputs)# compute the guided gradientscastConvOutputs = tf.cast(convOutputs > 0, "float32")castGrads = tf.cast(grads > 0, "float32")guidedGrads = castConvOutputs * castGrads * grads# the convolution and guided gradients have a batch dimension# (which we don't need) so let's grab the volume itself and# discard the batchconvOutputs = convOutputs[0]guidedGrads = guidedGrads[0]# compute the average of the gradient values, and using them# as weights, compute the ponderation of the filters with# respect to the weightsweights = tf.reduce_mean(guidedGrads, axis=(0, 1))cam = tf.reduce_sum(tf.multiply(weights, convOutputs), axis=-1)# grab the spatial dimensions of the input image and resize# the output class activation map to match the input image# dimensions(w, h) = (img_array.shape[2], img_array.shape[1])heatmap = cv2.resize(cam.numpy(), (w, h))# normalize the heatmap such that all values lie in the range# [0, 1], scale the resulting values to the range [0, 255],# and then convert to an unsigned 8-bit integernumer = heatmap - np.min(heatmap)denom = (heatmap.max() - heatmap.min()) + epsheatmap = numer / denom
配备了 Grad-CAM 生成代码,我们带着预先训练好的模型和验证集去看看我们的模型对猫&狗了解多少。
我们开始为模型中的最后一个卷积层 conv 1 创建 Grad-CAM 热图。理论上,该层的热图应该显示被模型分类的对象的最准确的视觉解释。
grad-CAM conv 1 层热图(图片由作者提供)
在梯度数学中,我们捕捉所有通向最后一个卷积层的连续特征图的重要性。我们注意到,虽然热图强调了分类对象,在本例中是一只猫,但它并不十分精确。被强调的区域(红色)包围了猫的区域,但是不太精确地适合猫。该区域包括人的衬衫、人的手和背景的部分。我们知道模型看到了一只猫,但是我们不太确定是这只猫的什么让模型相信这确实是一只猫。我们怎样才能使 Grad-CAM 热图更精确?
你会注意到上面的代码已经被包装在 Google Colab 笔记本的一个函数中,以允许 Grad-CAM 在不同的模型层中重现。让我们使用这个函数来探索早期的模型层。
所有模型层的 Grad-CAM 热图的 GIF(GIF 由作者提供)
这里有很多东西需要消化。当我们研究热图时,模型学习的逻辑开始出现。前 10 层(块 1 到块 3)检测图像中的轮廓和边界。深度方向层不强调对象,而投影和扩展层不强调轮廓。接下来的大约 20 层(块 4 到 11)是检测图像中的概念。Block 4 expand relu 就是一个很好的例子。
block_4_expand_relu 图层的 Grad-CAM 热图(图片由作者提供)
在模型架构的这一点上,定义猫的特征的形状开始从图像中的一般轮廓中脱颖而出。你可以看到猫的胡须、耳朵和眼睛是如何用红色和黄色的阴影强调的,而图像的其余部分是蓝色和绿色的。当我们深入模型的各层时,你可以看到模型是如何推理猫的定义特征如何区分这张图像的。最后的~16 层(块 12 到 16)尝试使用来自最早层的空间信息和最近开发的概念来识别图像中的对象。模型中的最后一层,Conv_1,确实正确地识别了物体的大致区域,但是它没有拾取存在于早期 Grad-CAM 热图中的物体的细微差别。我们用人类的直觉代替 Grad-CAM 的数学,它改进了 Grad-CAM 的结果。
为了合并早期的图层,我们将来自所有模型图层的 Grad-CAM 热图平均在一起。你可以在下面看到结果。
Grad-CAM 热图改进(图片由作者提供)
Grad-CAM 热图现在强调猫的脸、眼睛和爪子,不强调人的手臂。总的来说,我们有一个更精确的重点区域来定位猫。我们知道,该模型根据其内在特征将该图像分类为猫,而不是图像中的一般区域。
模型给人印象特别深刻,因为这是一个很难的图像!这个人穿着一件黑白相间的衬衫,和猫的颜色一样。然而,该模型可以区分黑猫脸和黑色人类衬衫。通过全层 Grad-CAM,我们了解了模型的优势。我们如何使用 Grad-CAM 来了解我们模型的弱点?
让我们仔细看看下面 7 张被错误归类为狗的猫的图片。
模型误报(图片由作者提供)
我们可以使用 Grad-CAM 热图来为我们提供线索,了解为什么模型在进行正确分类时遇到了困难。当一只猫坐在笼子后面时,这个模型似乎在区分它时遇到了一些困难。我们可以从 Grad-CAM 中看到,模型强调笼子的栅栏,很难找到猫的特征。在 5 和 6 中,猫尾巴是图像中的显著特征。但是从 Grad-CAM 中,我们可以看到模型很难识别这个特征,因为它带有绿色和蓝色的阴影。Grad-CAM 热图所能提供的最明显的例子在# 1 中。模特被猫玩的玩具弄糊涂了。从热图中我们可以看到,模型认为玩具是猫的一部分。这种混乱造成了模型的错误分类。使用这些知识,我们可以找到更多的猫玩玩具的例子,并将其包含在我们的数据集中,这将有助于我们的模型学习和改进。
改进模型
注意到我们的模型在笼子方面有问题,我们从 google images 中拿出了一些更具体的例子;特别是运输板条箱。
这个模型在运输工具上有问题(图片由作者提供)
从 grad-CAM 热图上的红色区域可以看出,模型关注的是猫周围的运输箱,而不是猫本身,这导致了错误的分类。当猫在运输板条箱中时,我们如何帮助模型区分它们?
我们从谷歌图片中创建了一个补充数据集,包括运输板条箱中的猫和狗。使用相册 *,*我们用额外的图像增强来增强数据集。有了我们需要的数据,我们开始实验。我们用原始数据集创建了一系列模型,并添加了 25%、50%、75%和 100%的补充运输板条箱数据集。在我们实验的每一次迭代中,我们都回到 Grad-CAM,看看模型是否在原始图像上调整了它的重点区域。
为了查看模型真正锁定的位置,我们创建了一个遮罩,使用阈值来捕捉 Grad-CAM 中最强烈的(红色)区域。然后,我们使用蒙版分割出原始图像中最重要的像素。
随着我们从扩充的集合中添加数据,模型得到了改进
正如您从上面的过滤图像中看到的,随着我们从补充数据集向训练数据集添加更多图像,模型的焦点从板条箱转移到猫的面部和特征。而且不需要很长时间,模型就开始得到正确的分类!当模型在原始数据集加上仅 25%的补充运输器板条箱数据集上训练时,模型指定上面的图像是猫的概率为 90%。
使用同样的实验,我们观察了笼子里的猫的其他图像,看看我们是否可以在模型焦点中找到相同的进展。下面是一些突出的例子。
作者 GIF
作者 GIF
结论
在这篇博客文章中,我们希望使用 Grad-CAM 为卷积神经网络可视化解释提供一些有用的见解和工具。在猫和狗的帮助下,我们探索了一个模型如何区分类别。通过考虑模型所有层的热图,我们改进了最终卷积层的 Grad-CAM 结果。我们用 Grad-CAM 瞄准了模型中的偏差和弱点。最重要的是,我们使用 Grad-CAM 来改进我们的算法。机器学习是一个迭代过程,我们的模型永远不够好。我们希望这里介绍的技术将有助于在整个改进过程中提供更多的透明度,并在模型中建立更多的信任。在 Forsight,我们使用 Grad-CAM 热图来识别模型中的错误重点区域。
为了帮助 ML/AI 爱好者,以及任何有兴趣帮助解决这个问题的人,我们创建并分享了一个 Google Colab 笔记本,它让你能够摆弄和制作我们在这篇博客中展示的 Grad-CAM 热图。
如果你对这个话题感兴趣,并且你愿意致力于深度学习算法的解释,请 联系我们 。
参考
- Ramprasaath R. Selvaraju 等人,2019 年,“Grad-CAM:通过基于梯度的定位从深度网络进行视觉解释”,https://arxiv.org/pdf/1610.02391.pdf
- 狗对猫,https://www.kaggle.com/c/dogs-vs-cats/data
- 马克·桑德勒等人,2019,“MobileNetV2:反向残差和线性瓶颈”,https://arxiv.org/abs/1801.04381
- 编码偏差,2020,https://www.codedbias.com/
了解 CSV 文件从您的终端与 XSV
用一行代码通过你的终端快速理解你的 CSV 文件
由作者创建
动机
你是否曾经试图通过盯着 CSV 文件来对其有一个大致的了解,但最终却没有理解你的文件?您可以打开一个 Jupyter 笔记本来分析您的 CSV 文件,但是仅仅为了理解一个 CSV 文件而打开笔记本是非常耗时的,尤其是当您主要使用 Python 脚本和终端时。
有没有一种方法可以让你在终端上用一行代码快速分析你的 CSV 文件?
$ xsv stats bestsellers.csv | xsv table
这就是 xsv 派上用场的时候了。
xsv 是什么?
xsv 是一个命令行程序,用于索引、切片、分析、分割和连接 CSV 文件。我喜欢 xsv,因为它使处理 CSV 文件变得非常快捷和容易。
在这里找到安装 xsv 的说明。在本教程中,我将以 Kaggle 的亚马逊 2009-2019 年 50 大畅销书为例,向您展示如何操作和分析您的数据。
下载并解压缩 CSV 文件。将文件名改为bestsellers.csv
,这样我们更容易操作。
现在,我们的任务是尝试理解我们的 CSV 文件
键入xsv -h
获取命令。您应该会看到类似这样的内容
Commands:
cat Concatenate by row or column
count Count records
fixlengths Makes all records have same length
flatten Show one field per line
fmt Format CSV output (change field delimiter)
frequency Show frequency tables
headers Show header names
help Show this usage message.
index Create CSV index for faster access
input Read CSV data with special quoting rules
join Join CSV files
sample Randomly sample CSV data
search Search CSV data with regexes
select Select columns from CSV
slice Slice records from CSV
sort Sort CSV data
split Split CSV data into many files
stats Compute basic statistics
table Align CSV data into columns
快速浏览一下你的数据
要获得 10 条数据记录的随机样本,请使用
$ xsv sample 10 bestsellers.csv
输出:
输出难以阅读。让我们通过添加xsv table
来美化输出
$ xsv sample 10 bestsellers.csv | xsv table
现在输出看起来更容易阅读了!
我们可能只是想看看书名、作者、用户评分和价格来决定我们应该买哪本书。要选择特定的列,使用xsv select col1,col2
$ xsv sample 10 bestsellers.csv | xsv select Name,Author,'User Rating',Price | xsv table
如果您喜欢每行查看一个字段,请使用xsv flatten
而不是xsv table
$ xsv sample 2 bestsellers.csv | xsv flatten
查看统计数据
我们总共有多少记录?让我们用xsv count
算出来
$ xsv count bestsellers.csv
550
我们总共有 550 行数据。我们还想获得数据的统计(例如,平均用户评级是多少)。我们怎么才能找到呢?
我们可以使用xsv stats
来查看统计数据,比如总和、最小值、最大值、平均值和标准偏差
$ xsv stats bestsellers.csv | xsv table
酷!我们在 0.010 秒内创建了一个汇总表!但是,如果我们只关心用户评级的统计数据呢?我们可以使用xsv search
选择相关的行
$ xsv stats bestsellers.csv | xsv search "User Rating" | xsv table
如果我们只想提取用户评分的平均值,我们可以使用xsv select
$ xsv stats bestsellers.csv | xsv search "User Rating" | xsv select mean | xsv table
注意xsv search
用于选择行,而xsv select
用于选择列。
查找频率
看起来有些书被提到不止一次。让我们找出每本书的频率。使用--limit number
指定输出数量。
$ xsv frequency bestsellers.csv --limit 20| xsv search Name | xsv table
我们的数据中有 10 个美国心理协会出版手册,第 6 版!怎么会这样
过滤数据
xsv 的美妙之处在于我们可以重用同一个命令来执行不同的功能。我们将使用xsv search -s column string_to_search
在一列中搜索与搜索字符串“美国心理学协会出版手册,第 6 版”匹配的行。
$ xsv search -s Name "Publication Manual of the American Psychological Association, 6th Edition" bestsellers.csv | xsv table
酷!原来美国心理协会出版手册,第 6 版出版于 10 个不同的年份。作者和收视率还是一样的。
获取指定范围内的行
您可能不希望获得数据的随机样本,而是希望获得前 10 行。要获得特定范围内的行,使用xsv slice
。下面是用法
$ xsv slice --help
如果没有指定范围的开始,那么切片从 CSV 数据中的第一个
记录开始。要获取前 10 行,请使用
$ xsv slice -e 10 bestsellers.csv | xsv table
要获取从第 2 行到第 10 行的数据,请使用
$ xsv slice -s 2 -e 10 bestsellers.csv | xsv table
注意-s
代表start
,而-e
代表end
。
排序数据
您还可以基于一列或多列对数据进行排序。要根据列User Rating
对数据进行逆序排序,请使用
$ xsv sort -s 'User Rating' -R bestsellers.csv | xsv slice -e 10 | xsv table
注意-s
代表select
而-R
代表reverse
。
正如标题中所承诺的,我们在一行代码中得到我们想要的东西!
结论
恭喜你!您刚刚学习了如何使用 xsv 操作和分析您的 CSV 文件。如果您不记得上面显示的命令,只需使用xsv --help
或xsv <command> --help
,如xsv search --help
。
即使 xsv 不能取代其他复杂的特性工程方法,如果您只想从终端快速分析您的 CSV 文件,xsv 是一个不错的选择!
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 T2 Twitter 上与我联系。
星这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如:
💔-python-tricks-to-read-create-and-run-multiple-files-automatically-5221ebaad2ba>
理解 A*路径算法并使用 Python 实现
a算法是最有效的路径查找算法之一,用于查找两点之间的最短路径。它由彼得·哈特、尼尔斯·尼尔森和伯特伦·拉斐尔于 1968 年首次出版。虽然它最初可以被看作是 T2·迪杰斯特拉算法的扩展,但它已经成为今天最常用的寻路算法之一。*
Via Pixabay
A*算法基本上通过计算起始节点和结束节点之间所有其他节点的位置来达到最优结果。此外,由于启发式函数[2],它比 Dijkstra 的算法更快。
f(n) = g(n) + h(n)
f(n):计算出的路径总开销
g(n):第一个节点和当前节点之间的路径成本
h(n):启发式函数
如果我们想使用上面的函数找到图 2 中的最短路径;
图二。样本路线
假设我们试图从点 X 到达点 y,由于点 X 没有被移动到不同的节点,g(n)成本没有发生,其值为 0。这个点的启发值是写在红色节点上的值 5。在这样的问题中,启发值通常是当前节点和期望节点之间的空中距离。从 x 点到 A 点有两个点
在去 A 点的情况下,g(n) = 5(路径代价),因为它移动到了一个新的节点。试探被设置为 h(n) = 1。发现 A 点的 f(n)值为 5+1 = 6。如果我们想用这种方法找到所有点的 f(n)值,
X— A => g(A) + f(A) = 5 + 1 = 6,
A — Y=> g(Y) + f(Y) = 6+ 0= 6,
X— B => g(B) + f(B) = 1+ 4= 5,
B — C => g© + f© = 3+ 2= 5,
C — Y=> g(Y) + f(Y) = 5 + 0= 5,
如上面简单的例子所示,最短路径是 X-B-C-Y 路线。这条路的成本是 5 个单位,而备选的 X-A-Y 路线的成本是 6 个单位。一旦我们完全理解了如何使用上述等式,就可以更详细地研究图 3 中的例子。
图 3。示例路线 v2
假设我们想从节点 j 到达节点 A。有 2 个点(B 和 F),可以从点 A 到达。计算间接费用,我们得到 f(B) = 8 + 6 = 14,f(F) = 3+6 =9。因为最小成本在 F 点,A算法从这里继续。f 点有 2 条路径,f(G) = 4 +5 = 9,f(H) = 10 + 3 = 13。因为最小成本在 g 点,我们可以从那点开始。然后,沿着 I 和 J 节点,我们得到 f(I) = 7 + 1 = 8,f(J) = 10。由于转到 F 节点后得到的所有值都小于 f(B)节点,所以没有返回到 B 节点。但是在不同的场景下,我们假设在节点 F 和 G 之后 f(I)大于 F(B)(F(I)> 14)。在这种情况下,根据 A算法,该过程在这里被中断,并且路径继续到 B 节点。这里,一旦 f© > f(I),路径确定过程再次从 I 节点继续。
用 Python 实现
以下所有代码均可从https://github . com/ademakdogan/Implementation-of-A-Algorithm-Visualization-via-Pyp5js-获得
首先,创建网格结构。这里的一些节点被标记为障碍。然后确定开始和结束节点,并使用 A*算法[3]找到这两点之间的最短路径。该算法的工作逻辑基本上基于两个名为 open_set 和 closed_set 的列表。虽然存在可以在 open_set 中处理的节点,但是存在在 closed_set 中处理的节点路径,因此不应该重复(在一些方法中,障碍也被直接扔进 closed_set 列表中,而在一些方法中,它可以被添加为作为对象产生的每个节点的合格属性之一。).作为各种过程的结果,这些列表被填充和清空,并到达最终结果。
所有阶段的伪代码都可以在维基百科上查看。
图 4。A*算法示例- 链接
开源代码库
图 4 显示了 A算法的 python 实现。Pyp5js 库被用来可视化这项工作。此外,A算法可以根据要具体给出的障碍列表、起始和结束节点的坐标以及网格结构的大小来工作。因此,这个项目也可以用来对抗特定的问题。
python AStar.py -c 25 -r 25 -s 1 -q 3 -e 23 -t 21 -l True
因此,
The way found!!!
23 20
23 19
23 18
23 17
23 16
23 15
23 14
23 13
23 12
23 11
23 10
23 9
23 8
23 7
23 6
23 5
23 4
23 3
22 3
21 3
20 3
19 3
18 3
17 3
16 3
15 3
14 3
13 3
12 3
11 3
10 3
9 3
8 3
7 3
6 3
5 3
4 3
3 3
2 3
1 3
Pyp5js
Pyp5js 是一个在浏览器上可视化 python 代码的框架。它支持通过 Python 的 Transcrypt 使用 p5.js javascript 库。完成必要的安装后,只需使用以下命令运行即可。
$ SKETCHBOOK_DIR**=**'~/my-custom-sketchbook' pyp5js serve
之后,通过 http://localhost:5000/ 访问接口部分进行必要的配置设置。在指定的文件夹(SKETCHBOOK_DIR)中,根据与项目名称同名的 python 文件中的代码执行操作。如果想详细考察这个项目,可以去 https://berinhard.github.io/pyp5js/的看看。
因此,A算法是最常用的路径查找算法之一。本文讨论了该算法的工作原理及其 python 编码。所有代码都可以在 github 找到。pyp5js 库用于可视化算法。在接下来的文章中,将讨论不同路径确定算法与 A算法的比较。
Github:https://github.com/ademakdogan
领英:https://www.linkedin.com/in/adem-akdo%C4%9Fan-948334177/
参考
[1]哈特,体育;新泽西州尼尔森;拉斐尔,B. (1968)。“启发式确定最小成本路径的形式基础”。IEEE 系统科学与控制论汇刊。4(2):100–107。
[2]曾,w;丘奇,R. L. (2009 年)。“在真实道路网络上寻找最短路径:A*的情况”。国际地理信息科学杂志。23(4):531–543。
[3]赫特兰德,马格努斯·列(2010), Python 算法:掌握 Python 语言中的基本算法 ,Apress,第 214 页,ISBN9781430232377。
理解准确性、回忆性、精确性、F1 分数和混淆矩阵
这篇文章还包括显示你的困惑矩阵的方法
艾米丽·莫特在 Unsplash 上的照片
介绍
准确度、召回率、精确度和 F1 分数是用于评估模型性能的指标。尽管这些术语听起来很复杂,但它们的基本概念非常简单。它们基于简单的公式,很容易计算。
本文将对以下每个术语进行讨论
- 说明
- 为什么相关
- 公式
- 不用 sklearn 计算
- 使用 sklearn 来计算它
在教程的最后,我们将讨论混淆矩阵以及如何呈现它们。我在文章末尾提供了 google colab 的链接。
数据📈
让我们假设我们正在分类一封电子邮件是否是垃圾邮件
我们将有两个数组,第一个数组将存储实际值,而第二个数组将存储预测值。这些预测值是从分类器模型中获得的。模型的类型并不重要,我们感兴趣的是模型做出的预测。
# Actual Value
labels = [1, 0, 0, 1, 1, 1, 0, 1, 1, 1]# Predicted Value
predictions = [0, 1, 1, 1, 1, 0, 1, 0, 1, 0]
0 -电子邮件不是垃圾邮件(负面)
1 -电子邮件是垃圾邮件(阳性)
关键术语🔑
真正积极的➕ ➕
当标签为正时,我们的预测值也为正时,就会出现这种情况。在我们的场景中,当电子邮件是垃圾邮件并且我们的模型也将其分类为垃圾邮件时。
真正的条件
TP = 0
for i in range(0,len(labels)):
if labels[i] == predictions[i] and labels[i] == 1:
TP+=1
print("True Positive: ", TP) # 3
假阳性➖ ➕
当标签为负,但我们的模型预测为正时,就会出现这种情况。在我们的场景中,当电子邮件不是垃圾邮件,但我们的模型将其归类为垃圾邮件时。
假阳性的条件
FP = 0
for i in range(0,len(labels)):
if labels[i] == 0 and predictions[i] == 1:
FP+=1
print("False Positive: ", FP) # 3
真阴性➖ ➖
这类似于真正,唯一的区别是标签和预测值都是负的。在我们的场景中,当电子邮件不是垃圾邮件并且我们的模型也将其分类为非垃圾邮件时。
真阴性的条件
TN = 0
for i in range(0,len(labels)):
if labels[i] == predictions[i] and labels[i] == 0:
TN+=1
print("True Negative: ", TN) # 0
假阴性➕ ➖
当标注为正时,但预测值为负时,会出现这种情况。在某种程度上,与假阳性相反。在我们的场景中,当电子邮件是垃圾邮件,但我们的模型将其分类为非垃圾邮件。
假阴性的条件
FN = 0
for i in range(0,len(labels)):
if labels[i] == 1 and predictions[i] == 0:
FN+=1
print("False Negative: ", FN) # 4
正确的预测💯
这种情况的唯一条件是标签和预测值相同。在我们的例子中,当模型将垃圾邮件分类为垃圾邮件,将非垃圾邮件分类为非垃圾邮件时。
正确预测的条件
正确的预测也可以计算为真阳性和真阴性的总和
计算正确的预测
CP = 0
for i in range(0,len(labels)):
if labels[i] == predictions[i]:
CP+=1
print("Correct Prediction: ", CP) # 3
print(CP == TP + TN) # True
不正确的预测❎
这种情况的条件是标签和预测值必须不相等。在我们的场景中,错误的预测是当我们的模型将垃圾邮件分类为非垃圾邮件,将非垃圾邮件分类为垃圾邮件。
不正确预测的条件
不正确的预测也可以计算为假阳性和假阴性的总和
计算不正确的预测
ICP = 0
for i in range(0,len(labels)):
if labels[i] != predictions[i]:
ICP+=1
print("Incorrect Prediction: ", ICP)# 7
print(ICP == FP + FN) # True
准确(性)🎯
准确度是正确预测与预测总数的比率。这是模型最简单的度量之一。我们必须以模型的高精度为目标。如果一个模型有很高的准确性,我们可以推断该模型在大多数情况下做出了正确的预测。
精确度公式
精确度公式
没有 Sklearn
accuracy = (TP + TN)/(TP + FP + TN + FN)
print(accuracy*100)
使用 Sklearn
from sklearn.metrics import accuracy_score
print(accuracy_score(labels , predictions)*100)
回忆📲
准确性可能会产生误导的情况
高精度有时会产生误导。考虑下面的场景
labels = [0,0,0,0,1,0,0,1,0,0]
predictions = [0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0]
print(accuracy_score(labels , predictions)*100) # 80
与非垃圾邮件相比,垃圾邮件很少出现。因此,label = 0 的出现次数高于 label = 1 的出现次数。在上面的代码中,我们的标签数组包含 8 封非垃圾邮件和 2 封垃圾邮件。如果我们的模型总是将电子邮件分类为非垃圾邮件,它将达到 80%的准确率。这是非常误导的,因为我们的模型基本上无法检测垃圾邮件。
计算回忆分数
Recall 计算预测阳性与阳性标签总数的比率。
召回公式
召回公式
在上面的例子中,我们的模型将有 0 个召回,因为它有 0 个真阳性。这告诉我们,我们的模型在垃圾邮件上表现不佳,我们需要改进它。
没有 Sklearn
recall = (TP)/(TP+FN)
print(recall*100)
使用 Sklearn
from sklearn.metrics import recall_score
print(recall_score(labels,predictions))
精确🐾
回忆分数可能具有误导性的情况
高召回率也可能是高度误导性的。考虑一下我们的模型被调整为总是返回正值预测的情况。它本质上将所有的电子邮件分类为垃圾邮件
labels = [0,0,0,0,1,0,0,1,0,0]
predictions = [1,1,1,1,1,1,1,1,1,1]
print(accuracy_score(labels , predictions)*100)
print(recall_score(labels , predictions)*100)
尽管上述案例的准确率较低(20%),但召回率较高(100%)。
计算精度
精度是正确的正面预测与正面预测总数的比率
精度公式
精度公式
在上面的例子中,精度会很低(20%),因为模型总共预测了 10 个阳性,其中只有 2 个是正确的。这告诉我们,尽管我们的召回率很高,并且我们的模型在正面案例(即垃圾邮件)上表现很好,但在非垃圾邮件上表现很差。
我们的准确度和精确度相等的原因是因为模型预测的都是阳性。在现实世界中,模型可以正确预测一些负面情况,从而提高准确性。然而,精度将仍然保持不变,因为它仅取决于正确的肯定预测和总的肯定预测
没有 Sklearn
precision = TP/(TP+FP)
print(precision)
使用 Sklearn
from sklearn.metrics import precision_score
print(precision_score(labels,predictions)*100)
F1 分数🚗
F1 分数取决于召回率和精确度,它是这两个值的调和平均值。
F1 分数公式
我们考虑调和平均值而不是算术平均值,因为我们希望较低的召回率或精确度产生较低的 F1 分数。在我们之前的例子中,我们的召回率是 100%,准确率是 20%,算术平均值是 60%,而调和平均值是 33.33%。调和平均值更低,更有意义,因为我们知道模型很糟糕。
AM = (1 + 0.2)/2
HM = 2*(1*0.2)/(1+0.2)
print(AM)# 0.6
print(HM)# 0.333
没有 Sklearn
f1 = 2*(precision * recall)/(precision + recall)
print(f1)
使用 Sklearn
from sklearn.metrics import f1_score
print(f1_score(labels, predictions))
混淆矩阵❓
https://towards data science . com/understanding-mission-matrix-a9ad 42 dcfd 62
混淆矩阵是表示真阳性、假阳性、真阴性和假阴性数量的矩阵
假设我们正在处理以下数据
# Actual Value
labels = [1, 0, 0, 1, 1, 1, 0, 1, 1, 1]# Predicted Value
predictions = [0, 0, 1, 1, 1, 0, 1, 0, 1, 0]
混淆矩阵示例
使用 sklearn 计算混淆矩阵
from sklearn.metrics import confusion_matrix
confusion = confusion_matrix(labels, predictions)
FN = confusion[1][0]
TN = confusion[0][0]
TP = confusion[1][1]
FP = confusion[0][1]
你也可以传递一个参数 normalize 来归一化计算出来的数据。
将混淆矩阵显示为条形图
plt.bar(['False Negative' , 'True Negative' , 'True Positive' , 'False Positive'],[FN,TN,TP,FP])
plt.show()
条形图形式的混淆矩阵
将混淆矩阵显示为热图
import seaborn as sns
sns.heatmap(confusion , annot=True , xticklabels=['Negative' , 'Positive'] , yticklabels=['Negative' , 'Positive'])
plt.ylabel("Label")
plt.xlabel("Predicted")
plt.show()
混乱矩阵作为热图
使用熊猫显示混淆矩阵
import pandas as pd
data = {'Labels' : labels, 'Predictions': predictions}
df = pd.DataFrame(data, columns=['Labels','Predictions'])
confusion_matrix = pd.crosstab(df['Labels'], df['Predictions'], rownames=['Labels'], colnames=['Predictions'])
print (confusion_matrix)
使用熊猫的混淆矩阵
使用 Sklearn 生成分类报告👔
from sklearn.metrics import classification_report
print(classification_report(labels,predictions))
下面是输出
代码输出
结论
准确性本身并不能决定一个模型是好是坏,但是准确性与精确度、召回率和 F1 分数的结合可以给出一个关于模型性能的好主意。
链接到 Google Colab
我最近用 WordPress 创建了一个博客,如果你能看看的话,我会很高兴的😃
查看我的关于偏差、方差以及它们如何与欠拟合、过拟合相关的教程
在 LinkedIn 上与我联系
https://www.linkedin.com/in/rahulbanerjee2699/
原载于 2021 年 1 月 2 日 https://realpythonproject.comhttps://realpythonproject.com/understanding-accuracy-recall-precision-f1-scores-and-confusion-matrices/。