自动化 SageMaker Studio 自定义图像的设置
在工作室域中连续交付自定义图像的分步指南
Amazon SageMaker Studio 是一个完全集成的 IDE,它统一了管理您的 ML 项目和与您的团队成员协作所需的工具。
除了为运行您的笔记本提供预建图像,SageMaker Studio 还允许您创建包含您最喜欢的库的容器,并将它们作为自定义图像附加到您的域中。
在大多数大型企业中,ML 平台管理员将管理这些自定义图像,以确保工作室用户仅使用经批准的库。如果手动完成,这可能会给管理员带来运营开销。
在这篇文章中,我将展示如何通过为您的自定义图像实现简单的连续交付来实现 Studio 域设置的自动化。
我们将基于 Tensorflow 2.5.0 创建一个自定义图像,并将其附加到工作室域。我们将使用 CodeCommit、CodeBuild 和 CodePipeline 来连续交付定制图像。在您的环境中随意使用您选择的任何 CI/CD 工具。该堆栈打包在一个 CloudFormation 模板中,因此您可以按需重复设置。
访问将您自己的定制容器图像带到 Amazon SageMaker Studio 笔记本、 SageMaker Studio 定制图像示例和代码管道教程可能是一个好的开始,如果这些东西对您来说听起来很新的话。
演练概述
我们将分三步解决这个问题:
- 我们将首先启动一个堆栈来创建一个 CodeCommit repo、一个 CodeBuild 项目和一个 CodePipeline 管道。
- 然后,我们将把定制图像 Dockerfile、configs 和 buildspec.yaml 推入代码报告中。这将触发管道。
- 一旦映像被附加到域,我们将在 Studio 中推出一个带有自定义内核的笔记本。
先决条件
要浏览此示例,请确保您具备以下条件:
- 这是建立在 SageMaker Studio 的自定义图像功能之上的。在开始之前,确保你熟悉这个博客和那些代码样本。
- 访问亚马逊 SageMaker 工作室环境,熟悉工作室用户界面。
- 拥有自定义图像的 IAM 角色。当您运行映像时,会将权限授予该映像。例如,您可以使用您的 Studio 用户配置文件角色 arn。
- 这个 GitHub 库克隆到您的环境中
步骤 1:启动云形成堆栈
架构概述
首先,我们需要基于模板创建一个 CloudFormation 堆栈。
下面是设置的架构概述:
堆栈将创建一个 CodeCommit repo,我们将在其中推送 Dockerfile、configs 和 buildspec.yaml 。它还将创建一个 CodePipeline 管道和一个 CodeBuild 项目。CodeBuild 项目将负责执行 buildspec.yaml 文件来构建容器映像并将其推送到 ECR,并将其附加到 Studio 域。该模板还将创建基本的 SageMaker 映像和其他有用的资源,如 IAM 角色。
在您的帐户中创建堆栈
要创建堆栈,请执行以下步骤:
- 导航到 AWS CloudFormation 控制台页面。确保您是从与 SageMaker Studio 域相同的 AWS 区域执行此操作的
- 选择上传模板文件用模板创建堆栈
作者图片
- 选择下一个
作者图片
在这里,您需要为图像输入一个堆栈名称、SageMaker 工作室域 ID 和角色 ARN 。您可以让 ImageName 保持原样。
作者图片:你可以在 SageMaker Studio 控制台页面找到你的工作室 ID
- 选择下一步
- 将所有选项保留为默认,直到您到达最后一个屏幕
- 选择我承认 AWS CloudFormation 可能会创建 IAM 资源。
作者图片
- 选择创建
这需要几分钟才能完成。
Image by author:完成后,您可以将创建的 CodeCommit repo 克隆到您的环境中
步骤 2:用您的映像更新代码报告
接下来,您需要将 tf25 文件夹中的内容推送到 CodeCommit repo 中。
作者图片:这里我将代码推送到回购的主分支
以下 buildspec.yaml 将由 CodeBuild 执行:
它将运行 build_and_push.sh 根据这个 Dockerfile 将容器映像推送到 ECR,并运行 attach_image.sh 将 ECR 映像附加到 Studio。
在将映像推送到 ECR 之前,您还可以在这里运行进一步的林挺和测试。您还可以在 ECR 存储库上启用图像扫描来识别常见的漏洞。
一旦代码被推送到 repo 的主分支,您就可以导航到 CodePipeline 并看到您的管道正在运行。
几分钟后,您应该会看到您的 Studio 域更新了最新版本的自定义图像。
作者图片
从现在开始,每次你提交,Studio 都会自动获得你自定义图像的新版本。
如果您有多个自定义图像
update-domain-input . JSON是用于使用自定义映像及其配置更新您的域的配置。
在这个例子中,我运行了 attach_image.sh 中的 sagemaker update-domain 命令。如果您有多个自定义映像,您可以将域配置文件保持为全局的,并独立于各个映像管道运行更新命令。
步骤 3:在 Studio 中使用自定义图像
你会看到它出现在工作室启动器中,并可以用它运行你的笔记本。
我们现在可以在 SageMaker Studio 中使用 Tensorflow 2.5.0 了!
作者图片
结论
通过自定义图像,您可以在 Studio 中运行带有您最喜欢的库的笔记本。在这篇文章中,我们自动化了图像设置,这样 ML 平台管理员就可以自动创建、版本化和附加它们到一个 Studio 域。
为了进一步自动化设置,您还可以使用本博客中使用的 CloudFormation 模板创建一个服务目录产品。您还可以尝试 Lijo 的这个示例自定义图像。它允许 Studio 用户在他们的笔记本上本地运行 PySpark。
为您的 Python 项目自动化版本标签和变更日志
基于项目的提交历史,使用 commitizen 实现版本标签和变更日志自动化的实践指南
厌倦了跟踪您的代码变更是否保证次要或主要版本增量?太忙而不能保持一个整洁的日志?尝试使用 commitizen ,这是一个命令行实用程序,它“强迫”您按照常规提交标准(或不同的用户定义格式)编写提交消息。配置完成后,commitizen 将根据您的提交自动调整代码的语义版本,并更新您的 changelog。
配置
Commitizen 通过五个简单的步骤进行配置。首先,您需要安装 commitizen:
pip install commitizen
第二,将代码当前版本号的引用添加到您的__init__.py
文件中,或者添加一个单独的__version__.py
文件,如下所示:
第三,更新你的.pre-commit-config.yaml
以包含一个用于提交的预提交钩子(如果你不熟悉预提交钩子,查看我之前的关于使用预提交钩子改进代码风格的博文):
第四,更新您的pyproject.toml
文件以包含 commitizen,它引用您代码的当前版本以及代码中需要在提交时更新版本的其他位置(例如您的setup.py
文件):
最后,运行pre-commit install --hook-type commit-msg
来设置提交预提交挂钩。
在 git 工作流中使用 commitizen
现在我们已经安装并配置了 commitizen,让我们看看它在 git 工作流中的使用。
让我们假设您已经签出了一个新的(特性)分支,并且您已经做了一些您想要提交的更改。在添加(卸载)被跟踪的文件后,我们不使用传统的git commit '<commit-message>'
命令,而是使用commitizen commit
命令(简称为cz c
)。使用该命令将提示一系列选项:
使用“cz c”提交时的不同提交选项(图片由作者提供)
使用选择菜单对您所做的更改进行分类(例如,错误修复或新功能),并在提示时添加提交消息。这将为提交消息添加所选代码更改分类的前缀(如feat
或fix
)。例如,如果您添加了一个新特性,commitizen 生成的提交消息可能如下所示:
doc: update README
在您提交并推送您的分支、注册一个 PR 并合并到主分支(或“main”)之后,检查主分支并运行:
cz bump --check-consistency --changelog
这将检查您的 commitizen 配置(和代码)中版本的一致性,并生成或更新一个变更日志(见这里是一个基于 commitizen 的变更日志的例子)。随后,运行以下命令来更新分支上的 changelog 和版本引用,并推送新的版本标记:
git push
git push --tags
就这样——现在,您已经为基于提交历史的 Python 项目的自动化版本和变更日志设置好了。感谢阅读!
另外,如果这一切进行得有点太快,看看 这个回购 我为一个 不同的博客帖子 设置的,在那里我使用 commitizen 进行版本控制。
https://medium.com/@ndgoet/membership
如果你喜欢这篇文章,这里还有一些你可能喜欢的文章:
在依赖 中的任何内容之前,请仔细阅读 本免责声明 我关于 Medium.com 的文章 。
使用 Python 自动化您的数字早晨程序
照片由努贝尔森·费尔南德斯在 Unsplash 拍摄
一个简单的 python 脚本开始您的一天
当你早上第一次使用笔记本电脑/台式机时,你可能会打开很多应用程序。每天都这样做可能会令人厌倦,所以我写了一个脚本来自动化在我的桌面上开始一天的过程,在这个教程中我将向你展示它是如何工作的。
【2021 年 11 月 22 日更新】
我制作了这篇文章的视频版本,你可以在 Youtube 上查看:
简单地说,这个剧本
这个脚本简化了我早上启动电脑后的日常工作,处理了我在开始工作前必须完成的大量基本手动任务。
这个例程包括类似 的过程,打开特定的浏览器标签,显示例程提醒,启动跟踪脚本等等。
让我们一行一行地过一遍:
1。导入依赖关系
import webbrowser
import time
import os
import subprocess
from datetime import datetime
2。写一个通知函数
def sendNotificationOnLinux(message):
subprocess.Popen(["notify-send", message])
return
这里我使用内置库subprocess
调用我的 Linux 机器上的通知系统并发送一个简单的消息。这是一个让一整天都自动和自己对话的好方法。
这样我就不用为我每天做的任务设置每日自定义闹钟了。下面我也提供了一个类似的 Windows 选项:
def sendNotificationOnWindows(msg="", delay=2):
t = 0
notify = ToastNotifier()
while t < delay:
notify.show_toast("Notification",msg)
time.sleep(1)
t+=1
3。写一个延续日函数
def continueDay():
cont = input("Press to continue")
这里我只是包装了 python 内置的 input()函数给它一个更合适的名字,我用它来做逐行控制脚本的执行。
4。当我打开和关闭电脑时记录日志
os.system("bash /home/lucassoares/Desktop/projects/self_track/scripts/logSystemOnOff.sh")0
在这里,我运行一个 bash 脚本来记录我的计算机最后一次打开和关闭的时间,以跟踪我何时开始工作,何时停止工作。这个 bash 脚本如下所示:
# logSystemOnOff.sh
echo "$(who -b)" >> path/to/file/systemOnOff.txt
5。打印关于我正在运行的跟踪器的提醒
现在我给自己留一个提醒,我正在为我的键盘和应用程序窗口运行跟踪脚本。
print("Running keyfrequency and active window loggers with sudo")Run keyfrequency and active window loggers with sudo
这些与使用 python 的multiprocessing
包的脚本并行运行:
# call_Start_and_Logs.py
import os
from multiprocessing import Pool
processes = ('/home/lucassoares/Desktop/automated/logWin.py',
'/home/lucassoares/Desktop/automated/logKeys.py',
'/home/lucassoares/Desktop/automated/startday.py')
def run_process(process):
os.system('python {}'.format(process))
pool = Pool(processes=3)
pool.map(run_process, processes)
在这里,我运行一个 python 脚本来记录我在键盘上输入的所有键(因为我在我的 linux 机器上做了一点自我跟踪,这是另一篇文章的主题)以及我使用的应用程序。上面提到的startday.py
剧本就是我们现在正在讨论的。
6。打印开始跟踪焦点的提醒
sendNotificationOnLinux("Turn on Focus")
continueDay()
这里有一个提醒我打开 focus 的提示,这是另一个跟踪我聚焦时间的脚本。现在我正在使用一个名为logFocus.sh
的定制 bash 脚本在终端上做这件事。如果您对以下 bash 脚本感到好奇:
logfile="/path/to/text/file/focus.txt"
start="$(date +%s)"
echo "Started logging focus"
read stop
echo "Stopped recording focus"
echo "Calculating focus time"
end="$(date +%s)"
echo "$start $end" >> $logfile/path/to/python/executable/python
/path/to/python/script/to/calculate/focused/time/calculateTodaysFocusTime.py
我最近发现这个名为 timetrap 的终端工具在这方面做得更好,所以我可能会在不久的将来改变它。
计算和存储聚焦时间的 python 脚本如下:
from utils import loadFocus
import pandas as pd
from datetime import datetimetoday = datetime.strftime(datetime.today(),format="%Y-%m-%d")
timeStartsStamp,dateStartsStamp,durations = loadFocus()
df = pd.DataFrame(dict(dates=dateStartsStamp, durations=durations))
todayFocus = df[df["dates"]==today]["durations"].sum()
print(todayFocus)
7。Spotify 提醒
sendNotificationOnLinux("Turn on white noise")
continueDay()
这里是另一个提醒,启动 Spotify 并打开白噪音(是的,我一天的大部分时间都在听白噪音)。
8。打开谷歌日历
# Google calendar events
sendNotificationOnLinux("Check your calendar")
webbrowser.open("https://calendar.google.com/calendar/u/0/r/day")
这个很简单,我只需使用 python 的 webbrowser 模块在浏览器上打开谷歌日历。
# Touch typing practice
print("TYPE")
os.system('"mlt random "0)-_=+[{]};:\'\|//?"') #pinky finger
os.system("mlt random 123456!@#$%^qwertasdfgzxcvbZXCVBASDFGQWERT~") #left hand
os.system("python /home/lucassoares/Desktop/automated/logTyping.py") #general practice
continueDay()
这部分是我每天的触摸打字练习套路。我使用 mltype ,一个很棒的命令行工具,来改进命令行输入!我用这个工具写了三种不同的练习:
logtyping.py
:标准实践,从我保存的数据集中抽取几行 python 脚本,其中包含我感兴趣的模块和脚本- 一个是专注于练习我的左手(所以只有键盘上的左手键)
- 另一个是给我右手小指的,我发现这是我打字速度的瓶颈
我在日常实践中调用的 python 脚本是这样的:
# logTyping.py
import os
import pathlib
import random
import pandas as pd
from datetime import datetime
import sysdef updateTypingPerformance(df,datedPerformance):
if "Unnamed: 0" in df.columns:
df.drop("Unnamed: 0", axis=1, inplace=True)
df.loc[len(df)] = datedPerformance
return dfdef typePractice(typingDataset):
files = list(typingDataset.iterdir())
file = random.choice(files)
f = open(file, "r")
numberOfLines = len(f.readlines())
print(file)
print(numberOfLines)
if numberOfLines>10:
numberOfLines=10 os.system(f"mlt file --n-lines {numberOfLines} {file}")typingDatasetFolder = "path/to/folder/typingDataset"typingDataset = pathlib.Path(typingDatasetFolder)typingPerformance = "path/to/typing/performance/file/typingPerformance.csv"df = pd.read_csv(typingPerformance)
typePractice(typingDataset)performance = []date = str(datetime.now())wpm = input("What was the wpm?")
acc = input("Waht was the accuracy?")
cont = input("Continue typing?")
performance.append(date)
performance.append(wpm)
performance.append(acc)updateTypingPerformance(df,performance)
while cont=="y":
performance = []
typePractice(typingDataset)
date = str(datetime.now())
wpm = input("What was the wpm?")acc = input("Waht was the accuracy?")performance.append(date)
performance.append(wpm)
performance.append(acc)updateTypingPerformance(df,performance)
cont = input("Continue typing?")if len(sys.argv)>1:
if sys.argv[1]=="plot":
df["wpm"].plot()
plt.show()
它基本上是用 mlt 命令行工具设置培训,并更新一个. csv 文件,我用我的触摸输入性能保存它。
9。学习普通话提醒
print("MANDARIN")
webbrowser.open("www.duolingo.com")
continueDay()
这是另一个不言而喻的例子:我每天练习普通话,所以我会自动在浏览器上打开它,进行每天 10 分钟的练习。
10。在浏览器上打开项目 euler 进行晨间编码例程
print("CODE")
webbrowser.open("https://projecteuler.net/archives")
# start Anki
在练习了普通话之后,我练习了一些解决问题的方法,所以我打开 project euler 作为我的日常编码练习。我喜欢每天只做一项运动来暖脑。
我更喜欢在终端上有一些提醒,在系统的通知弹出窗口上有一些提醒,但这只是个人喜好,根据你的喜好调整它。
11。检查通信信道
做完一天的热身活动后,我喜欢先检查我使用的基本沟通渠道,即:
- 松弛(网络)
- 团队(工作)
- 电子邮件(工作)
- Whatsapp(社交)
# teams, mail, slack, whatsapp
sendNotificationOnLinux("Open Mail, Teams, Slack and Whatsapp")
os.system("teams")
os.system("mailspring")
os.system("slack")
webbrowser.open("https://web.whatsapp.com/")
一旦我完成了检查(我一天做三次,早上一次,下午一次,晚上一次),我就检查我的中等状态,以了解我在平台上做得如何。
# medium
webbrowser.open("https://medium.com/me/partner/dashboard")
print("Check your stats on Medium")
continueDay()
12。最终提醒和结束
sendNotificationOnLinux(message="Leave an Ipython window Open")
这是为了让我记住总是打开一个 ipython 窗口,这样我就可以在需要快速编写脚本时随时使用它。
sendNotificationOnLinux(“Be grateful, no negative self-narratives and have a great day!”)
这里有一个很好的日常小提醒,让我专注于重要的事情,永远心存感激,避免消极的适得其反的自我叙述,这样我就不会分心。
这个项目的源代码可以在这里找到。
关于桌面日常自动化的思考
我喜欢这种自动化脚本,因为它们允许我通过简化所有的手动过程来更快地执行我的例程,即使是像打开标签页这样简单的事情。
这篇文章的重点是 展示 python 和 bash 脚本结合的威力,通过自动化我们每天必须完成的烦人的手动任务来提高您的生产力 。
我试着用一个原则来写这些:如果事情可以自动化,就不要重复做。
如果您有兴趣学习 bash 脚本来优化您的开发工作流,请查看 Udemy 的这些课程:
这些是附属链接,如果你使用它们,我会得到一小笔佣金,干杯!😃
如果你喜欢这篇文章,请在 Twitter 、 LinkedIn 上联系我,并在 Medium 上关注我。谢谢,下次再见!😃
商业自动化:为什么它很重要,为什么你的组织需要它
由 Tomasz Frankowski 在 Unsplash 上拍摄的图片
直到最近,世界级的创新和技术进步才阐明了业务流程自动化的真正潜在影响。
“世界上最大的空间就是改进的空间。”
海尔马特·斯克米特
“我不了解商业自动化。我不需要在我的业务中引入自动化。
…不是一个聪明的、着眼于未来的组织会说的话。
然而,许多公司仍然认为自动化不是他们当前想要或需要的东西。也许他们太专注于扑灭短期火灾,因此没有时间考虑自动化。或者他们只是看不到它的价值。不管原因是什么,这种想法可能是错误的,甚至在一个快速走向数字化和自动化的世界中是危险的短视。
业务流程自动化的快速发展
过去几年,业务流程自动化(BPA)和机器人流程自动化(RPA)解决方案发展迅速。全球数字过程自动化的未来也是光明的,市场将从 2018 年的 67.7 亿美元增长到 2023 年的 126.1 亿美元。
对于现代资本主义经济中的组织来说,业务流程管理(BPM)一直很重要。BPM 使公司能够了解他们的“当前状态”,确定需要改进的领域,并设计行动计划来提高有效性、效率和盈利能力。BPM 也是将信息技术和运营技术投资与业务战略结合起来的关键。
几十年前,有远见的商业领袖就认识到了业务流程自动化的价值。但是直到最近,世界级的创新和技术进步才阐明了 BPA 真正的潜在影响。此外,不断下降的成本和更少的采用壁垒使得 BPA 的竞争环境更加公平。因此,无论大小组织,现在都有可能成功地实现关键业务领域的自动化,并从中获利。
为什么要实现业务流程自动化
BPA 涉及使用技术、数字工具和软件来实现业务流程和工作流的自动化。
如果处理得当,BPA 可以为各行各业的组织带来众多长期的好处:
- 更高效、更快速的流程
- 降低成本
- 可靠、一致和透明的运营
- 精确输出
随着时间的推移,业务中的自动化可以在流程、工作流和员工层面提高生产力。BPA 使员工从单调重复的任务中解脱出来,将他们的精力集中在高价值的活动上,在这些活动中他们的才能和技能可以得到充分发挥。这对激励和参与会产生巨大的影响,从而为组织创造高生产率、增强盈利能力和竞争优势的良性循环。
商业自动化:展望未来
根据 MuleSoft 连接基准报告,在不久的将来将塑造数字化转型的主要趋势是:
- 数字化文化的发展
- 创新将被大众化
- 企业将变得更加灵活,执行速度更快
- API 安全性将变得更加重要
- 微服务将被用来支持更大的创新
- 解锁和利用数据的能力将决定组织的成长和寿命
最后但同样重要的是,自动化将改善业务流程,提高运营效率,并实现业务相关性。另一方面,自动化的缺乏将导致或加剧流程效率低下,甚至可能导致业务过时。
所有这些因素都在推动 BPA 的快速采用,这就是为什么:
这些当前的现实为未来提出了重要的问题:
在近期内,有多少对 BPA 可行的流程仍将由人工完成?
组织还会继续浪费时间和金钱、消耗员工精力的手动流程多久?
什么时候是开始业务自动化的合适时机
最佳答案— 昨天。
可行答案— 尽快。
BPA 和 RPA 已经以许多积极的方式影响着工作场所。例如,借助工作流自动化平台,组织可以自动执行重复性任务,从而节省时间并实现规模经济。工具也可用于自动化许多类型的流程,包括文件传输、订单输入、报告生成、电子邮件营销、事件日志监控和批处理。甚至客户支持流程也正在通过对话式人工智能聊天机器人、语音机器人和语音助手实现自动化。
目前的 BPA 市场已经相当广阔,而且在未来几年内只会越来越大。现在认识到这一点的组织将处于有利地位,在未来的获得商业自动化的所有好处。
**您的组织会加入这个成功俱乐部吗?
简单的事实是,当涉及到过程自动化时,您不能浪费时间。如果您的企业继续使用手动流程并且继续容忍由此产生的低效率,甚至持续 2-3 年,您将会落后。然而,你的竞争对手认识到了 BPA 的价值,并制定了正确的 BPA 实施策略和路线图,他们很快就会超过你。这就是为什么你需要尽快更新你的业务计划。此外,计划必须围绕 BPA 制定,而不是相反。
结论
这里有一些好消息:如果你有一个 BPA 计划,你的组织可以确保未来的业务连续性、竞争力和增长。即使您现有的手动流程效率低下,这也是可能的。
然而,如果 BPA 还没有出现在你的视野中——在可预见的将来也可能不会——那么你已经在竞争格局中打了一场败仗。最坏的情况是,这种缺乏远见的行为可能会导致商业失败。为了避免这种命运,不要犯这种错误(或者任何自动化错误)。尽早开始考虑 BPA。你的组织的未来可能取决于它。
机器学习工程中的自动化
机器学习自动化的原因、内容和时间
这篇博文关注的是机器学习工程中的自动化。尽管自动化源于软件开发,但这个概念变得越来越适用于机器学习。我分享了一些建议,关于你可以自动化哪些内容,以及你应该在什么时候自动化 T2。在其他博客中,我将向展示如何做到这一点。但是首先,让我们看看为什么你应该自动化。希望你能在这篇博客中找到一些灵感,开始让你作为机器学习工程师的生活变得轻松一些。
为什么是自动化?
作为数据科学家或者机器学习工程师,解决问题是你的任务。您通常通过开发一段符合特定标准、可读且不包含任何错误的代码来实现这一目标。您运行该代码和其他程序来获得结果。通常,您的最终产品会在其他地方运行。也许你只运行一次,但通常,这是一个重复的过程。然而,你应该记住,编写和运行代码或程序本身并不是目标——它只是实现你的目标的一种方式。
专注于你擅长的事情 在这个解决问题的过程中,你与计算机一起工作,在那里你编写代码、进行分析、进行计算并运行程序。充分利用这种合作是有意义的。为此,让我们来看看人类和计算机的长处。人类和计算机都有许多不同的风格,但一般来说,它们可以这样描述:
人类对计算机。图片作者。
那么这告诉我们什么呢?人类和计算机擅长不同的任务。由于人类在做重复性工作时会犯错误并感到无聊,我们应该使用计算机来做这件事。另一方面,人类应该尽可能地将时间花在解决问题上,并使用计算机来完成代码重构等详细任务。因此,我们应该自动化。
这就是软件开发和机器学习自动化的全部内容:使用计算机执行重复的任务。
提高质量
自动化的另一个好处是你的工作质量会提高。我们将研究增强代码的自动化代码重构。此外,通过自动化,您可以在开发过程的几个阶段强制运行测试。这样,您可以在早期发现错误。
其次,通过自动化任务,你不太可能不小心跳过任何任务。任务执行也很容易被记录。通过记录这些步骤,您可以验证所有必需的任务都已运行,并向其他人证明这一点。最后,您可以在开发过程的几个阶段强制运行测试。这样,您可以在早期发现错误。
节省时间
尽管您需要在项目开始时投资实现自动化,但最终,您将从中受益。增强你的代码会更快;随着质量的提高,花费在调试上的时间会减少,解决方案的部署会更快。
自动化什么?
你可以自动化机器学习中的许多事情,但一般来说,这都归结于机器学习自动化的这个金字塔:
机器学习自动化的金字塔。图片作者。
尽管并不相互排斥——有些任务可以被分配到多个类别中——但我确实认为这是引入自动化概念的好方法。让我们从基础做起,从我们自己做起,直到顶峰。
1。重构代码
对于代码的重构,我的意思是坚持代码符合某些标准,而不改变代码中的逻辑。这是一个由计算机(部分)接管的完美任务,因此作为开发人员,您可以专注于构建逻辑。让我们看看林挺、格式化和检测质量和安全问题。
Linters
通过这样做,你可以很容易地发现任何错误。棉绒的例子有皮林特和薄片 8 。SonarQube 还提供一种叫做 SonarLint 的棉绒。
格式化 尽管 linters 只指出问题而不改变代码,格式化程序格式化代码,使其遵循一定的准则。它使您的代码对其他人来说可读性更好,因此更容易理解代码并为其做出贡献。此外,代码审查可以关注逻辑本身,而不是布局。文本文件,如 YAML 文件,也可以格式化。流行的 Python 格式化程序的例子有 Black 和 autopep8 。
检测质量和安全问题 在人类和计算机的对比中我们已经看到,你会写 bug。您可以通过在每次提交时运行测试函数,或者当您合并到主代码分支时发现它们。使用 Pytest 你可以自己设置,或者你可以使用像 Jenkins 这样的工具。
您编写的一些代码可能会导致安全问题。例如不正确的异常处理、硬编码的密码或误用正在运行的子流程。像 Bandit 和 SonarQube 这样的软件可以帮助你发现这些问题。
您很可能会使用 Python 包来解决您的问题。尽管您可能认为这些包使用起来是安全的,但是可能有一些包本身并不安全。快速浏览一下 Github 页面可以给出一个很好的提示;比如维护人员的数量,更新频率。接下来,T4 安全系统会根据允许清单检查你所有的进口商品。
Linters、formatters 以及 Pytest 和 Safety 之类的包可以手动运行,但是当然,自动化的思想就是使之自动化。使用 git 挂钩,您可以在提交之前运行格式化程序和包,或者您可以将它们添加到管道中,如下所述。Linters 和 formatters 也可以直接安装在您的 IDE 中。因此,当您自动化这些任务时,您的持续集成(CI)过程会得到改进,因为您在主代码分支上实施了代码质量。
2.部署
现在我们已经爬上了金字塔的地基,让我们把重点放在中间层。
一些机器学习问题通过对数据进行分析来解决,这可能是在您的机器上本地完成的事情。但是,您通常希望将代码发布到不同的环境中,例如其他数据可用的环境,或者更适合计算密集型运行的环境。另一个原因可能是您正在为用户构建一个应用程序。
将您的代码部署到该环境中称为部署。您需要采取多个步骤。您可以随心所欲地添加安全性检查,在开发环境中运行单元测试,或者在测试环境中运行集成测试,等等。基本步骤包括:
- 定义上下文(比如应用程序的名称,或者目标环境)
- 打包代码,例如通过压缩或创建工件
- 发布代码
- 在目标环境上构建应用程序,比如解压缩它,或者通过在 Kubernetes 上从源代码构建一个容器
当然,运行这些任务可以是手动工作。然而,自动化这些重复的任务是有意义的。通过自动化部署,您能够连续部署(CD)您的应用程序。您可以在 shell(如 Bash 或 Powershell)中通过命令行界面(CLI)使用脚本来自动化部署。另一种方法是使用管道。
脚本
使用命令行界面你可以给程序下命令。通过编写一个捕获这些命令的脚本,您可以一次性完成一系列任务。这里的好处是您也可以对脚本进行版本控制。此外,可以将日志打印到屏幕或日志文件中,以实现可追溯性。Bash 和 Powershell 可以用来创建目录、移动文件、读写纯文本文件等等。要与程序交互,您需要使用相应的程序 CLI。您也可以用这样的方式编写 Python 函数,即您可以使用 argparse 通过输入参数调用它们。多个脚本可以组合在一个 Makefile 中。
下面是一个小例子,演示了如何通过弹性 Beanstalk 客户端和 Bash 将 Docker 容器部署到 AWS Cloud。通过 AWS 控制台得到同样的结果需要我 3 分钟的点击和输入时间。
部署到 AWS Elastic Beanstalk 的示例
管道 管道建立在脚本之上。它们为这些脚本添加了额外的功能,从而增强了部署过程。所有这些功能当然都是有代价的。如果您需要管道,或者脚本就足够了,这取决于实际的用例。管道工具的例子有 Azure 管道、 AWS CodeBuild 和 Buildkite 。这些功能的非详尽概述如下:
- 它们提供了一个图形界面。这样更容易看到流动的样子;如果生成或部署成功;以及每个处理步骤的输出是什么;
- 管道可以自动触发。虽然这也可以用脚本实现,但是管道往往是在有人合并开发或者主分支的时候触发的;
- 所有的构建都有日志记录,所以很容易看到谁在什么时候触发了什么;
- 用户管理已经就绪,因此您可以将部署限制在某些用户的生产环境中;
- 以前的部署被保存,因此如果出现问题,您可以轻松地返回到以前的部署。
通常,代码的来源是一个 Git 库。管道的定义也存储在那里,或者如果您有多个管道,它可能存储在一个中央代码存储库中。这样,您可以防止管道定义随着时间的推移而发生分歧。
大多数情况下,YAML 被用作建立管道结构的语法,而任务是用 Bash 之类的语言编写的。此外,通常预定义的任务也是可用的。所有这些任务都需要一些计算实例来运行。这通常由提供商来管理。然而,您也可以自己托管管道,这样您的代码就不会被转移到您的组织之外。
3.机器学习过程
是时候移动到我们机器学习自动化金字塔的顶端了。现在,它变得非常有趣:除了重构代码和部署,您还可以自动化机器学习过程。我指的是如下所示的简化过程。
机器学习过程。图片作者。
在左侧,我们看到了模型实验的过程,在这里您可以对不同的模型进行特征工程和一些超参数调整。从这里,您选择最有希望的模型,该模型是图中间所示的模型训练过程的输入,在该过程中,您优化并验证最终的模型。在右边,我们看到服务于模型或推理过程的模型。
实验通常是用生产数据的子集“离线”完成的。在实验阶段投资自动化几个步骤可能是值得的,例如使用下面讨论的 AutoML。另一方面,实验特征可能使整个过程难以自动化。
部署模型训练和服务的应用 模型训练和模型服务通常不是在本地完成的,而是在单独的环境中完成的。出现这种情况的原因是您的机器在存储和计算方面的限制,或者因为不允许您在本地存储生产数据。在服务的情况下,速度(延迟)也是一个问题。
可以构建一个用于模型训练的微服务或应用程序,而不是像前面讨论的那样进行部署。这同样适用于用于模型服务的服务。
自动训练 该图显示了一般的训练过程,实际上还包括许多步骤。所有这些步骤可以紧密结合在一起。这可以像一个脚本一样简单,例如通过使用 sklearn 管道。如果运行这样的管道,数据作为输入被加载,并且在模型注册中心注册的经验证的模型是输出。
另一种方法是将流程分成不同的服务。对于每个服务,您可以优化主机。对于预处理,存储可能很重要,而对于训练,计算可能是决定性因素。AWS 正在使用这种方法,提供亚马逊 SageMaker 管道。
Auto ML 特别是有了监督学习,就有可能实现特征工程和超参数调整过程的自动化。通过强力结合巧妙的算法,该模型针对成功指标进行了优化。为此需要多次运行,因此专用的训练环境在这里可能会很有用。帮助你的工具有 TPOT 、特征工具和自动 sklearn 。云提供商也在这里提供工具,比如亚马逊 SageMaker Autopilot。
自动再训练 当数据静止时,这些过程是一次性的。然而,最有可能的情况是数据会随着时间的推移而改变(称为数据漂移),这意味着模型性能也可能会随着时间的推移而降低。模型再培训是必要的,这是自动化的东西。这也称为持续培训(CT),指的是 CI/CD。自动再训练中通常只涉及超参数调整,因为特征工程不太容易自动化,需要手工操作。再培训可以按时触发,比如每个周日晚上,或者由性能监控步骤触发。
所有主要的云提供商都提供自动化、管道和自动再培训的框架和工具:
- Google 在这篇博文中分享了他们对 MLOps 和自动化管道的观点
- AWS 在本博客中介绍了金融服务的最佳实践,但它也适用于其他行业
- Azure 在这个博客中讨论了他们的模型再训练方法
何时实现自动化?
我们处于金字塔的顶端,我们已经涵盖了许多需要自动化的任务。然而,这需要花费时间和精力来设置我们到目前为止介绍的所有内容。因此,跳过自动化部分,专注于功能性需求可能很有诱惑力。此外,您的经理可能希望您关注新功能,而不是这些非功能性的自动化需求。尽管如此,现在应该很清楚自动化有很大的价值。
我列出了一系列标准来检查您是否应该将您正在处理的任务自动化:
- 任务的复杂程度 如果是一个简单的任务,在执行的时候出错的机会就少,所以对自动化的需求就少。另一方面,当任务复杂时,执行它可能需要花费大量的时间和精力。
- 任务发生的频率 如果你知道一个任务只运行一次,那么跳过自动化部分是有意义的。然而,根据我自己作为开发人员的经验,典型的任务很少是一次性的。
- 自动化任务所需的时间和精力
这更像是一种成本效益的权衡。设置自动化的成本与收益相比如何,比如以后提高质量和节省时间?
鉴于这些标准,在我看来,总是实现某种程度的自动化是有意义的。自动化的好处是您可以重用以前项目的一些工作,比如管道模板或预提交钩子定义。我经常使用的一种方法是,首先手动执行一项任务,比如运行测试功能,或者使用鼠标和键盘通过控制台界面进行部署。在我知道需要做什么之后,我会自动执行这些步骤。对于机器学习过程的自动化,如果需要自动(再)训练,则取决于项目要求。
结论
在这篇博文中,我解释了为什么你应该在你的机器学习项目中使用自动化。这是你作为机器学习工程师工作的一个重要部分。接下来,我们研究了通过探索机器学习自动化的金字塔你可以自动化什么:代码重构、部署和机器学习过程。最后,我简要地提到了一些需要记住的标准,以决定何时应该自动化。
在接下来的文章中,我将更深入地讨论如何自动化这些任务。
我要感谢我的同事塞巴斯蒂安·坎德尔、约斯特·德·泰耶和朱莉娅·苏博特尼亚亚的反馈和启发。
SMAC:Python 中快速超参数调优的 AutoML
在高维空间中寻找出路
为给定的数据科学问题生成第一个模型可能非常简单。建立一个高效的模型,提供高水平的精确度,要困难得多。数据科学家必须清理数据,提炼特征,找到正确的指标,找到正确的验证策略,正确地构建测试和训练集,并微调所选模型的参数。
这些步骤大多受益于数据科学家的经验,很难自动化。幸运的是,超参数调优不是这样的,可以使用自动机器学习:AutoML。
在本帖中,我们将从数学上解释为什么超参数调整是一项复杂的任务,并展示 SMAC 如何帮助建立更好的模型。
超参数?你在说什么?
当尝试为给定数据集拟合模型时,必须定义两种参数:
- 用于配置模型的参数:决策树的深度、SVM 模型的内核、多项式的次数、神经网络的层数等等
- 模型本身的参数:决策树叶子的权重,SVM 核的参数,多项式的系数,每个神经元的权重,…
第一类参数被称为模型超参数,因为它们定义了模型的结构,而后者被附加到模型本身。
为什么需要 AutoML 进行超参数调整?
请记住,超参数调整,有时也称为超参数优化(HPO),是一个通过根据您选择的指标确定模型的最佳配置来尝试充分利用模型的过程。
使用 AutoML 主要有两个原因:
- 手动寻找最佳参数是一项非常繁琐的任务。配置空间的组合学可能相当大。对于随机森林,需要考虑的参数不少于 10 个。每个参数可以有 10 个不同的值。因此,探索配置空间需要评估 10 种⁰配置!
- 绝对不能保证针对给定数据集优化的配置在另一个数据集上也同样有效。每次将模型应用到新的数据集时,优化超参数至关重要。
使用 AutoML 技术允许通过自动化配置空间探索来解决这两个限制。
用 AutoML 调整超参数:一项艰巨的任务
在进一步向您展示如何高效地自动调优超参数之前,让我们解释一下为什么这是一项复杂的任务。
让我们用一些数学来形式化什么是超参数优化。
从数学上来说,HPO 试图最小化一个或多个测试集上的评估指标,通常使用交叉验证来生成。这可以形式化为:
HPO 的数学公式。作者的公式。
其中 M 是我们希望使用给定的训练和测试集来优化模型 f_hat 的度量的评估。θ是用于配置模型的一组参数。数值取自配置空间θ。
通常,当面对这样的优化问题时,使用基于数值微分的方法。基本上,要优化的函数,即 M 与 f_hat 的组合,相对于参数θ是微分的。然后,使用牛顿-拉夫森法、梯度下降法或任何类似的方法迭代收敛到最优值。
然而,在超参数调谐的情况下,通常不可能计算这些梯度:
- 度量可以是非平滑的,例如 MAE。参见我关于这个主题的另一篇论文。因此,微分是不可能的。
- 模型本身可能很难区分,不仅在符号上,在数字上也是如此。想想所有基于树的方法,它们是分段常数的。
- 梯度可以消失。这是神经网络的情况,也是基于树的方法:随机森林,XGBoost,CatBoost,LightGBM,…
- 数值评估梯度是非常耗时的,因为对于每个参数方向上的每个变化,我们需要训练一个完整的模型。
- 模型超参数可能不连续。想想 XGBoost 的 nb_estimators 参数:它是一个整数值。分类参数也是如此。
请注意,自动微分在某些情况下会有所帮助,但在大多数情况下,您无法使用梯度导向方法进行优化。
正如您所看到的,在超参数调优的情况下,许多原因禁止使用标准优化方法。我们被迫仅仅依靠我们作为数据科学家的经验来选择最佳参数吗?
为什么不用网格搜索?
一种选择是使用暴力。毕竟,为 XGBoost、Random Forest 或任何其他模型寻找最佳超参数只需要评估每个可能配置的指标。
但是如上所述,配置空间可能是巨大的,即使计算机越来越强大,探索 10 ⁰配置仍然(远远)超出他们的能力范围。
所以这只能是你配置空间非常有限的时候的一个选项。
那么随机搜索呢
这是一种选择。但是有随机性在里面;)我们将在下面看到它是可行的,但是不能保证收敛到最佳配置,至少在给定的时间内。
使用 SMAC
库 SMAC 提出了蛮力和随机探索的替代方案:基于序列模型的算法配置。
这个库背后的想法是建立一个模型(因此 SMAC 的缩写是基于模型的),试图为一组给定的超参数估计度量值。使用这个内部模型,您可以随机生成配置,并使用这个估计器来猜测什么是最好的配置。
参见这篇非常好的开创性的论文了解更多关于这个主题的细节。我还写了一篇关于如何使用模型创建自己的 HPO 引擎的完整文章:
[## 用 XGBoost 调优 XGBoost:编写自己的 Hyper Parameters 优化引擎
towardsdatascience.com](/tuning-xgboost-with-xgboost-writing-your-own-hyper-parameters-optimization-engine-a593498b5fba)
SMAC 使用随机森林模型来捕捉算法/模型的行为,以根据指标进行优化。
整个算法非常简单。运行第一次训练并计算指标。用这个第一输出训练随机森林模型。
然后生成随机配置,具有最佳估计分数的配置用于下一次训练。然后用这个新的结果重新训练模型,这个过程再次开始。
内部性能模型指导配置空间探索。如代码所示,受 SMAC 示例的启发,SMAC 从之前的运行中学习,并在每一步中提高自己的知识:
使用随机搜索和 SMAC 调整随机森林模型。
上面的代码使用 SMAC 和 RandomizedSearchCV 来调整 Hyper 参数。请注意,SMAC 支持连续实参数以及分类参数。支持分类参数是使用随机森林作为指导探索的内部模型的一个原因。
这段代码演示了如何使用 SMAC 和 Random Forest 作为模型进行微调,但是我一直将它用于 XGBoost 以及 SVM 或萨里玛模型,它非常有效。
下图比较了两种情况下的配置空间探索,即使用 SMAC 和随机搜索。他们根据超参数调整迭代次数绘制分数:
随机搜索(左)与 SMAC(右)超级参数探索。作者的图表。
在左侧,我们看到随机搜索不规则地探索配置空间。优化没有受益于以前的培训。另一方面,在右边的图中,可以清楚地看到 SMAC 从以前的试验中吸取了经验,并尝试了一些适合改进的构型。
结果是 SMAC 更快地收敛到更好的解。
结论
为一个模型寻找最佳的超参数是一项乏味但至关重要的任务。SMAC 是一个非常有效的库,它带来了自动 ML 并真正加速了精确模型的构建。任何类型的模型都可以从这种微调中受益:XGBoost,Random Forest,SVM,SARIMA,…
非常有趣的是,基于 ML 的方法可以用来帮助更好地训练 ML 模型。然而,这提出了一个问题:SMAC 内部随机森林模型的超参数是如何优化的?
你会在 SMAC 代码或者学术论文中找到答案:它们是硬编码的;)
用于物体检测的 AutoML:如何训练模型以识别坑洞
如何使用新的 Azure 机器学习功能进行对象检测
来自我们训练的模型的坑洞预测和置信度得分-图片由作者提供
初始算法选择和超参数优化是我个人不喜欢做的活动。如果你像我一样,那么也许你会喜欢https://docs.microsoft.com/en-us/azure/machine-learning/concept-automated-ml自动化机器学习,这是一种让脚本为我们完成这些耗时的 ML 任务的技术。
Azure Machine Learning (AML) 是一种云服务,它的一些功能使得准备和创建数据集、训练模型以及将它们部署为 web 服务变得更加容易。最近,反洗钱团队发布了 AutoML for Images 功能供公众预览。今天,我们将使用该功能训练一个对象检测模型来识别道路上的坑洞。
在本文中,我将简要回顾一些 AML 和对象检测概念,因此您不需要完全熟悉它们就能理解。这个教程很大程度上基于 Azure 的这个例子,你可以在这里查看我编写的 Jupyter 笔记本。
酷,我们开始吧!
我们要做什么?
对象检测数据集很有趣,因为它们由表格数据(边界框的注释)和图像数据组成。png,。jpeg 等)。 COCO 格式是对象检测数据集的流行格式,我们将下载坑洞数据集 ( 坑洞数据集)。分享者。阿提库尔·拉赫曼奇托利安。2020 年 11 月。执照。ODbL v1.0)使用这种格式。Azure 机器学习使用 TabularDataset 格式,所以我们需要做的第一件事是从 COCO 转换到 TabularDataset。****
转换后,我们将选择一个对象检测算法,最后训练模型。
1-准备数据集
我从 Roboflow 得到了数据集。它有 665 张道路图片,上面标注了坑洞,是由阿蒂库尔·拉赫曼·奇托里安创作并分享的,作为他本科论文的一部分。Roboflow 团队将这些图片重组为 70/20/10 的训练有效测试分割。
每次拆分都有两个主要部分:
_annotations.coco.json
,一个 JSON 文件,带有images
、categories
和annotations
元数据- 图像本身(。jpg 文件)
这是 COCO 注释键的样子:
images
:有关于数据集图像的信息(id,文件名,大小等。)categories
:边框类别的名称和 idannotations
:包含关于对象的信息,包括边界框坐标(在这个数据集中是绝对坐标)、对象的 image_id 和 category_id
现在是时候开始与 AML 合作了。你要做的第一件事就是创建一个 Azure 机器学习工作区。你可以使用 https://portal.azure.com 的网络界面来完成。
我们需要一个计算实例来运行笔记本,然后运行 train 实验,所以请在您的工作区内创建一个。图像任务的 AutoML 模型需要 GPU 计算实例。您也可以使用 web 界面创建一个计算实例。
在哪里创建计算实例—按作者分类的图像
我已经下载并提取了。/potholeObjects 文件夹。每个分割都有它的文件夹,里面有图像和 JSON 文件。
的内容。/火车坑洞图片—作者图片
您需要将图像和 JSON 文件上传到数据库,以便 AML 可以访问它们。数据存储是云数据源的抽象。创建 AML 工作区时,会创建一个azureblobdastore并将其设置为默认值。我们将使用这个默认的数据存储并将图像上传到那里。****
注释是 COCO 格式(JSON ),但是 TabularDataset 要求它在 JSON 行中。TabularDataset 具有相同的元数据,但是以不同的键组织。这是用于对象检测的 tabular 数据集的样子:
***{
**"image_url"**:"AmlDatastore://data_directory/../Image_name.image_format",
**"image_details"**:{
"format":"image_format",
"width":"image_width",
"height":"image_height"
},
**"label"**:[
{
"label":"class_name_1",
"topX":"xmin/width",
"topY":"ymin/height",
"bottomX":"xmax/width",
"bottomY":"ymax/height",
"isCrowd":"isCrowd"
},
{
"label":"class_name_2",
"topX":"xmin/width",
"topY":"ymin/height",
"bottomX":"xmax/width",
"bottomY":"ymax/height",
"isCrowd":"isCrowd"
},
"..."
]
}***
幸运的是,微软工程师编写了一个从 COCO 转换的脚本:https://github . com/Azure/Azure ml-examples/blob/1a 41978d 7 DDC 1 D1 f 831236 ff 0 C5 c 970 b 86727 b 44/python-SDK/tutorials/automl-with-Azure ml/image-object-detection/COCO 2 jsonl . py
这个文件的 image_url 键需要指向我们正在使用的数据存储中的图像文件(默认的)。我们使用 coco2jsonl.py 脚本的 base_url 参数来指定。
***# Generate training jsonl file from coco file
!python coco2jsonl.py \
--input_coco_file_path "./potholeObjects/train/_annotations.coco.json" \
--output_dir "./potholeObjects/train" --output_file_name "train_pothole_from_coco.jsonl" \
--task_type "ObjectDetection" \
--base_url "AmlDatastore://**{datastore_name}**/potholeObjects/train/"***
我们将对验证集运行相同的命令。现在,下一步是将文件上传到数据存储,并在 AML 中创建 数据集 。不要混淆数据集和数据存储库*。数据集是版本化的打包数据对象,通常基于数据存储中的文件创建。我们将从 JSON 行文件中创建数据集。*****
对于培训和验证拆分,您也将这样做。如果一切顺利,你可以在 AML 中看到图片预览。
AML 工作区内的数据集预览—按作者分类的图像
2 —运行实验
在 AML 内部,你所做的一切都被称为实验。要使用 AutoML 训练模型,您将创建一个实验,指向它应该运行的计算目标,并提供 AutoML 参数的配置。****
让我们首先创建实验,并从工作区获得计算机实例:
在这里,我将使用 yolov5 默认参数运行实验。您需要提供超参数、计算目标、训练数据和验证数据(正如示例所说,验证数据集是可选的)。
现在我们终于可以提交实验了:
***automl_image_run = experiment.submit(automl_config_yolov5)***
您可以使用 Workspace web 界面监控实验:
使用工作区用户界面监控实验——作者图片
在这里,我只使用一个单一模型的字典,并使用默认参数,但你可以探索参数和调谐设置。这里有一个来自微软教程的例子:
3 —可视化预测
这个 yolov5 模型是使用 Pytorch 训练的,所以我们可以下载这个模型并使用 Jupyter 笔记本来检查预测。我的花了 56 分钟训练。要获得模型,您需要做的第一件事是在工作空间中注册最佳运行,这样您就可以通过它来访问模型。
现在我们可以下载 model.pt 文件并运行推理。为此,我们将使用来自azure ml-contrib-automl-dnn-vision包的代码:
我使用了微软教程中的代码来可视化边界框。以下是测试图像的结果:
来自我们训练的模型的坑洞预测和置信度得分-图片由作者提供
酷吧?
最后的想法
Azure 机器学习是一个让你开始机器学习(嗯,在我们的情况下是深度学习)的好工具,因为它隐藏了很多复杂性。现在有了 AutoML 功能,你甚至不必考虑在不同的时刻训练不同的模型,因为调谐设置可以为我们做到这一点。
你可以在这里查看 Jupyter 笔记本的所有代码。
管道中的下一步是将模型部署为 web 服务。如果你很好奇,你也可以使用微软教程来查看如何做到这一点。
感谢阅读!😄
参考
- 坑爹数据集 。分享者。阿提库尔·拉赫曼奇托利安。2020 年 11 月。执照。ODbL v1.0 版**
时间序列的 AutoML:使用 FEDOT 框架的高级方法
思想和理论
使用 FEDOT 和其他 AutoML 库处理具有间隙和非平稳性的真实世界数据的示例
用于时间序列预测的 AutoML 框架 FEDOT(图片由作者提供)
正如我们在之前的帖子中已经注意到的,大多数现代开源 AutoML 框架并没有广泛覆盖时间序列预测任务。在那篇文章中,我们已经初步演示了 AutoML 方法可以产生什么样的预测。
然而,我们可以更深入地研究一个 AutoML 框架 FEDOT ,它可以自动进行时间序列预测的机器学习管道设计。因此,我们将通过时间序列预测的实际任务详细解释 FEDOT 核心中正在发生的事情。
FEDOT 框架和时间序列预测
之前我们已经讨论过机器学习问题的流水线。管道是一个无环的有向图。用 FEDOT 的术语来说,这个图叫做链,或者复合模型,或者管道。
FEDOT 操作的基本抽象是:
- 操作是对数据执行的动作:它可以是对数据进行预处理(规范化、标准化、填补空白)的动作,也可以是给出预测的机器学习模型;
- 节点是放置操作的容器。一个节点中只能有一个操作。主节点只接受原始数据,次节点使用前一级节点的输出作为预测值;
- 链或管道是由节点组成的无环有向图。FEDOT 中的机器学习流水线是通过 Chain 类实现的。
给定的抽象可以在下图中看到:
FEDOT 框架中的操作、节点和链(管道)
机器学习模型和经典模型,如时间序列的自回归(AR ),都可以插入到这种管道的结构中。
我们知道如何解决分类或回归问题。我们甚至知道如何在 FEDOT 制作一系列模型。但是我们如何进行时间序列预测呢?例如,我们如何使用决策树?特色在哪里?
特色就在这里!要构建具有特征的表,只需要用滑动窗口遍历时间序列,并准备一个轨迹矩阵。
值得一提的是,这不是我们的发明:你可以阅读使用这种转换的 SSA 方法。这种方法也在 H2O 图书馆的一个版本中使用。几乎所有时间序列的机器学习模型的应用都是构造这样的矩阵。
让我们更详细地分析一下级数变换的这种方法。时间序列是一系列值,其中后续值通常依赖于之前的值。因此,我们可以使用时间序列的当前和先前元素来进行预测。假设我们希望使用当前值和一个先前值来预测前面一个元素的序列:
制作时间序列预测特征表示例(作者图片)
我们称这样的转换为时间序列的“滞后转换”。在 FEDOT 中,我们将它放在一个单独的操作“滞后”中。重要的超参数是滑动窗口的大小,它决定了我们将使用多少以前的值作为预测值。
下面是一个动画,展示了多步预测提前一个元素的示例。然而,可以一次对前面的几个元素执行一步预测。在这种情况下,解决了多目标回归问题。你可以看到从形成轨迹矩阵(或滞后表)到做出预测的整个预测过程:
动画。用滞后时间序列变换提前预测 3 个元素(作者制作的动画)
任何机器学习模型都可以用作预测模型。但是我们也在 FEDOT 中实现了几个具体的时间序列预测模型(比如 AR 和 ARIMA)。此外,时间序列特定的预处理方法,如移动平均平滑或高斯平滑被添加。
这里还没有自动机器学习。当框架的智能部分 composer 启动时,它就“活了起来”。Composer 是制作管道的界面。在其中,它使用了一种优化方法,实现了 AutoML 的“自动”部分。默认情况下,该框架使用基于遗传编程原则的进化方法。但是,如果有必要,任何搜索算法都可以添加到合成器中,从随机搜索到贝叶斯优化。
AutoML 分两个阶段工作:
- 组合就是寻找管道结构的过程。默认情况下,进化算法用于该目的。在这个阶段,节点中的操作被改变,子树从一些解决方案中被删除,并“生长”到其他解决方案。节点中操作的超参数在这里也发生了变异;
- 超参数调优是管道结构不变,但节点中超参数在变化的过程。这个阶段在作曲完成后开始。
下面是在合成阶段对管道执行的突变转换的示例:
动画。合成期间管道中的变化过程。显示了改变节点中超参数、替换操作、添加节点的各种变异操作符。交叉运算符未显示(由作者制作动画)。
在进化过程中,选择最精确的模型。因此,在合成结束时,将有一个具有固定结构的管道,我们只需要在节点中配置超参数。
使用来自hyperpt库的优化方法,在管道的所有节点中同时调整超参数:
动画。复合模型节点中参数调整的过程(作者制作的动画)
完成所有阶段后,我们将获得最终的管道。
数据我们有
在机器学习(非科学)文章中,普遍使用相对简单的时间序列来证明算法的有效性。其中最受欢迎的是“美国航空公司乘客”,下面是剧情,展示了它的样子:
美国航空公司乘客数据集(图片作者
在这样的时间序列上展示图书馆的能力是非常诱人的——然而,大多数有点复杂的模型将能够提供足够的预测。我们决定从现实世界中获取一个数据集,以展示 AutoML 算法的所有功能。我们希望,这个例子对于演示来说足够好。
有两个时间序列:第一个是风电场的平均日发电量。第二个是柴油发电机的平均日发电量。这两个参数都以千瓦时为单位进行测量。
柴油和风力发电机发电(图片由作者提供)
风力发电机的发电量高度依赖于风速。如果风速降低,柴油发电机就会启动,以维持足够的发电量。因此,当风力涡轮机的功率输出下降时,柴油发电机的功率输出就会上升,反之亦然。同样值得注意的是,时间序列有缺口。
编程代码不会在这篇文章下面列出。不过为了更好的感知,我们准备了大量的可视化。编程代码的完整版本位于 jupyter 笔记本中,所有技术方面都有更详细的描述。
任务
任务是建立一个预测未来 14 天柴油发电量的模型。
补缺
出现的第一个问题是原始时间序列中存在间隙。在 FEDOT 中,有三组方法可用于时间序列间隙填充:
- 线性插值等简单方法;
- 使用单一时间序列预测模型的迭代预测方法:
- 填补空白的高级预测方案。
第一组方法工作速度快,但精度低。第二组的方法不考虑问题的细节,相当于简单地预测一个时间序列。最后一组方法考虑到了前面方法的缺点。所以我们将进一步应用第三组的方法。复合模型使用双向时间序列预测来填补空白。
组合预测的示例,其中使用了两个模型,并且使用加权平均值将它们的预测结果组合在一起(图片由作者提供)
为了填补时间序列中的空白,我们创建了一个简单的高斯平滑、滞后变换和岭回归的管道。然后我们训练这条管道来预测“未来”。
所获得的用于修复时间序列中的间隙的管道的结构(图片由作者提供)
然后反方向重复这个动作——训练管道预测“过去”。之后,我们可以使用平均法合并两个预测。
这种方法中的操作顺序可以描述如下。首先,使用位于间隙左侧的时间序列部分。在这一部分上训练一个复合模型,以给出对间隙中存在的前方元素数量的预测。之后,对右侧部分重复该程序。为此,反转时间序列的已知部分,训练模型,进行预测,并反转结果预测。使用加权平均值进行预测组合。因此,向量的值越接近作出预测的时间序列的已知部分,其权重就越大。也就是说,在平均时,红色预测(图中)将在通道的左侧部分具有更大的权重,绿色预测将在右侧部分具有更大的权重。
在应用间隙填充算法后,我们得到这样的结果:
柴油发电机发电量时间序列的填补空白(作者图片)
很好,不是吗?但是第二个时间序列在它的中心部分仍然有一个缺口。我们也可以将前面的方法应用于这个缺口,但是存在另一种方法。我们使用成对回归来匹配两个时间序列的值,并使用具有柴油发电机的序列作为单一预测器来恢复风力涡轮机发电量(目标)的值。我们还将使用 FEDOT 框架解决这个回归问题。
在所有这些间隙填充过程之后,我们得到了以下结果:
还原的时间序列(可以看出它们走的是反相的——填充的通行证并不违反这个原则)——(作者图片)
现在,两个时间序列都没有间隙,可以进一步使用了。
预报
让我们使用上面描述的所有 FEDOT 特性,并对我们的数据运行 AutoML 算法。我们已经使用 API 中的 fit 和 predict 方法启动了带有默认配置的 FEDOT 来进行时间序列预测。现在让我们来看看结果预测,并计算指标:平均绝对误差(MAE)和均方误差的根(RMSE):MAE-100.52,RMSE-120.42。
时序预测示例(作者图片)
如果我们看图表和度量值,问题就来了:这个模型好不好?
回答:很难搞清楚。最好不要在一个小样本上验证模型——那里只有 14 个值。最好至少计算几次指标。例如,三乘以 14(即 42)。为此,您应该使用样本内预测。
高级验证
下面的动画应该有助于您理解样本外预测和样本内预测的区别:
动画。样本内和样本外预测流程(作者制作动画)
因此,我们的模型可以预测未来的 14 个值。但是我们希望提前获得 28 个值的预测—在这种情况下,我们可以迭代两次预测 14 个元素。在这种情况下,第一次迭代中预测的值(样本外)将作为第二次预测的预测值。
如果我们想验证模型,我们将使用样本内预测。通过这种方法,我们预测了时间序列中已知的部分(测试样本)。然而,在迭代预测中,已知值用于形成下一步的预测值,而不是前一步的预测值。
在 FEDOT 中,也实现了这种方法,所以现在我们将在三个各有 14 个值的块上测试该算法。为此,我们将划分样本并再次运行 composer。预测结果如下图所示。重要的是澄清进化算法是随机的,因此 AutoML 模型的输出可能不同。
在三个包含 14 个元素的区块上验证时间序列的复合模型。右侧显示的是原始时间序列(图片由作者提供)
第一个验证块上的预测完美地重复了时间序列的实际值。这似乎很奇怪,但只要我们看看获得的管道的结构,一切都变得清楚了。
合成过程中获得的管道实例(进化过程)。考虑了具有特定于时间序列的预处理操作的管道和表示线性关系的简单管道(图片由作者提供)
从图中可以看出,更复杂的流水线并不总是提供最低的误差度量。因此,最佳发现的管道结果是短的,但是验证的误差值很小。基于此,我们得出结论,对于这个时间序列来说,这已经足够了。
由于最终模型是 K-最近邻算法,管道能够很好地重复来自训练样本的时间序列模式。这种模型可能会出现问题,例如,根据趋势,时间序列不是稳定的。在这种情况下,K-最近邻模型将不能从训练样本中充分推断依赖性。这个时间序列还有一个特点——方差非平稳。
但是,它的结构包含相对同质的部分,与执行验证的时间序列部分没有太大不同。
时间序列中与验证部分“相似”的同质部分以橙色突出显示(图片由作者提供)
在这些部分,有重复的模式,时间序列是趋势稳定的-值围绕平均值波动,然后上升到 1000 千瓦时以上的值,然后下降到 0。因此,为构建的管道复制这些模式的能力非常重要。但是没有必要去猜测时间序列的低频波动(例如趋势或季节性)。KNN 模式适合这些任务。链合成后获得的预测质量度量是 MAE-88.19 和 RMSE-177.31。
需要注意的是,我们已经在自动模式下准备了一个解决方案,并且没有向搜索算法添加任何额外的专家知识。这个任务在笔记本电脑上运行的框架只用了 5 分钟就解决了。毫无疑问,对于大型数据集,构建一个好的管道需要更多的时间。
与竞争对手的比较
D isclaimer:本节中的比较远非详尽无遗。为了证明一个框架比另一个框架更好或更差,您需要进行更多的实验。建议使用一个以上的数据源,应用交叉验证,对相同的数据和相同的参数运行算法几次(对指标进行平均)。在这里,我们有一个介绍性的比较:我们展示了如何替代解决方案可以应付这项任务。如果你对 FEDOT 与其他框架相比如何处理时间序列感兴趣,请关注 ResearchGate 的新闻。一篇科学论文中的全面比较将很快问世!
让我们试着比较一下 FEDOT 和其他开源的时间序列预测框架——AutoTS和 pmdarima 。Jupyter 笔记本的代码,以及情节,可通过链接获得。因为不是所有的库都在多个块上实现验证功能,所以决定只在时间序列的一个片段上进行这个小的比较。每个算法运行 3 次,并对误差指标进行平均。包含指标的表格如下所示(单元格显示 std —标准偏差):
该图还显示了其中一个实验的预测:
通过竞争算法获得的预测示例(图片由作者提供)
从图中可以看出,用 FEDOT 得到的预测更“接近实际数据”。
结论
所以,今天我们看到了像 AutoML 这样一个越来越受欢迎的机器学习领域。在本帖中,我们回顾了自动生成 ML 管道的现有解决方案,并指出它们如何用于时间序列预测任务。
我们还在使用 FEDOT 框架预测发电量序列的例子上尝试了 AutoML:我们恢复了丢失的值,使用进化算法构建了管道,并验证了解决方案。最后,演示了 FEDOT 与其他框架在这一任务上的简单比较。
这篇文章中的例子(代码和图表)可以通过链接在 github 库中找到。
对于那些决定深入研究的人,有几个额外的链接:
用 AutoML,试试 FEDOT!
米哈伊尔·萨拉法诺夫、帕维尔·维楚查宁和尼古拉·尼基丁参与了这篇文章的工作。
时间序列的 AutoML:绝对是个好主意
利用 AutoML 进行时间序列预测的方法及自动预测的实例
用于时间序列预测的 AutoML(图片由作者提供)
目前,数据科学已经成为 IT 行业的重要组成部分,并为业务提供了有用的功能。数据科学家收集和过滤数据。他们训练大量的 ML 模型,执行验证并选择最好的一个。而做这一切活动的主要原因是为了做一个面向商业的产品,这将是最有效的(带来更多的钱)。这些活动可以表示为机器学习工作流。
同时,一些阶段逐年深入自动化。首先,这种自动化触及工作流程中最枯燥的部分。因此,它允许数据科学家将节省下来的时间用于更令人兴奋的任务。
让我们假设我们有一个任务:建立一个机器学习模型,然后将其部署到一个 web 应用程序中。例如,这个模型必须预测顾客今天将在网上商店支付多少钱(或其他任何东西)。但是在我们开始训练我们模型之前,有必要克服几个步骤:
- 从各种来源收集数据;
- 执行预处理操作,如标准化、编码等。;
- 功能工程、移除功能或辛迪思新功能;
- 进行过滤,例如去除异常值;
机器学习流水线 这样的多步序列被称为“流水线”。由于管道的复杂结构,使用管道比使用单个机器学习模型更难。此外,对于这种多步结构,故障的概率变得更高。为了控制和管理包含多个 ML 操作的复杂系统,构建了特定的仪器— MLFlow 、 Apache AirFlow 。它们类似于数据科学和机器学习领域的工作流管理系统(WMS)。您使用它们的原因是为了简化 ML 管道的管理。
自动生成管道可能是一项更加雄心勃勃的任务。有几个框架可以做到这一点。开源库有 TPOT 、自动克隆、 MLJAR ,或者 H2O 。这些框架正在尝试 toя解决的任务“生成管道,这将在最终预测上给出最低的误差”。在绝大多数情况下,管道的结构是固定的,只有超参数在变化。但是有几个框架能够自己找到管道结构。这种优化任务(寻找具有可变结构的流水线)通常使用进化算法来解决,例如,TPOT 和 FEDOT 框架。也有专有的 SaaS 产品,如 DataRobot 、 GoogleAutoTables 和 Amazon SageMaker 。
通常,AutoML 库和服务只有效地解决广泛的任务:对表格数据的分类和回归。不太常见的是,AutoML 支持文本和图像处理、时间序列预测任务。在本文中,我们将不考虑 AutoML 库的优缺点,但是我们将分析它们在时间序列预测中的能力。
时间序列的自动机器学习
尽管事实上时间序列预测任务在科学和商业中是一个相当受欢迎的任务,但是大多数开源 AutoML 库并没有提供为时间序列处理生成流水线的工具。这可能有几个原因,其中之一是在不重构用于其他任务(分类和回归)的工具的情况下,很难使当前的库功能适应预测序列。
关键是时间序列数据的处理不同于解决回归问题时通常的一系列操作。差异从原始样本的划分开始:例如,以随机顺序混合数据来验证时间序列模型是没有意义的。对于时间序列,特征的形成是不同的:通常,机器学习模型不会在原始序列上训练,因为需要将其转换为另一种表示。在已经存在的具有自身特性的 AutoML 项目中实现这样的构造可能会有问题。最有可能的是,这就是为什么开发人员经常拒绝从时间序列(以便“不要一石二鸟”)和集中处理特定的数据类型:只有表格,或只有文本。
一些决定支持时间序列预测的研究人员受限于这种类型的数据。一个很好的开源例子是 AutoTS 框架。这类图书馆通常使用“经典”统计模型进行预测,例如 AR 或 ARIMA。在框架的“内部”,这些模型被调整,然后选择最好的一个(通过验证样本的误差度量),但是这里没有生成新的模型。此外,pmdarima 库基于相同的逻辑。
另一种方法是将现成的 AutoML 工具用于预测。回归模型非常适合这种情况。例如,这种逻辑被用于 H2O,在那里,在其商业版本的产品开发商提供了这样一种可能性。然而,从一些使用开源版本的例子来看,用户将不得不手动预处理原始系列。这样一个精简的工具包可能不足以完成整个工作。
我们希望 AutoML-toolkit 具有哪些功能?
虽然预测一维数组行为的任务看起来很琐碎,但工程师在处理时间序列时希望拥有各种工具。例如:
- 能够构建可解释的模型集合(例如,使得第一个模型再现时间序列的高频分量,第二个模型能够模拟低频分量,第三个模型组合它们的预测);
- 能够调整时间序列管道中的超参数;
- 使用外生(辅助)时间序列;
- 应用特定的预处理方法(从移动平均平滑到 Box-Cox 变换);
- 应用样本内和样本外预测;
- 如果时间序列包含间隙,如何修复它们?
在一个框架中考虑所有列出的可能性,而不仅仅局限于时间序列,这是一项相当困难的任务。
对 AutoML 的这些要求并不是偶然出现的。我们在自然系统模拟 (NSS 实验室)工作,在过去的几年里,我们参与了几十个机器学习、数据驱动建模和优化方面的各种研究和商业项目。在实践中,我们经常要解决类似的问题,包括时空数据预测。
我们是谁 我们为什么担心 AutoML
不久前,我们对 AutoML 研究产生了兴趣,团队也有了新的实验想法。最终,这些想法形成了一个成熟的开源 AutoML 框架,由我们在实验室中开发和维护。
我们还希望在单个管道中自动解决一个以上的问题,即回归问题和时间序列预测问题,或者同时解决回归和分类问题。例如,在信用评分任务中,即潜在借款人的二元分类中,您不仅可以使用问卷特征,还可以使用即将到来的现金流值,这些值可以作为时间序列进行预测。在我们看来,自动获得这些任务的基线是非常有希望的。
我们还对研究识别可变结构管道的方法感兴趣,并使用多标准优化来优化建模误差和找到的解决方案的复杂性(例如,可以通过管道中的总块数来估计)。
我们在其中一些问题上获得了有趣的结果,如果感兴趣,可以在这里和这里找到关于它们的科学论文。下面,我们将重点讨论预测时间序列的问题,并讨论如何在此类任务中使用 AutoML,尤其是 FEDOT。
利用 FEDOT 框架进行时间序列预测
FEDOT 可以解决的任务(图片由作者提供)
正如你从我们之前的帖子中所知,FEDOT framework 可以使用进化算法为各种任务自动生成 ML 管道。下面,我们以 FEDOT(版本 0.3.0)为例,演示如何使用 AutoML 工具预测交通量的时间序列。这个版本可以很容易地通过命令安装
pip install fedot==0.3.0
Jupyter 笔记本,通过链接提供代码和图表。
我们有交通量的时间序列,它以客车为单位显示明尼苏达州明尼阿波利斯和圣保罗之间 94 号州际公路沿线的交通量。该数据包含每小时交通量值,每天有两个高峰:早上和晚上。此外,对于该数据,周末的流量通常会减少。
假设我们必须预测 144 个流量元素(我们随机选择了这个值,我们不希望预测范围太大或太短)。意思是需要搞清楚未来六天这条路上会有多少乘客经过。
进口
*# FEDOT api* **from** **fedot.api.main** **import** Fedot*# Tasks to solve* **from** **fedot.core.repository.tasks** **import** Task, TaskTypesEnum, TsForecastingParams*# Input data for fit and predict* **from** **fedot.core.data.data** **import** InputData*# Train and test split* **from** **fedot.core.data.data** **import** train_test_data_setup
首先,我们需要定义任务和预测范围
forecast_length = 144
task = Task(TaskTypesEnum.ts_forecasting,
TsForecastingParams(forecast_length=forecast_length))
为模型准备输入数据
*# Load data from csv file and wrap it into InputData structure* input_data = InputData.from_csv_time_series(task, 'ts_traffic.csv', target_column='value')*# Divide into train and test* train_data, test_data = train_test_data_setup(input_data)
发布模型:拟合并做出预测
*# Init model for the time series forecasting* model = Fedot(problem='ts_forecasting',task_params=task.task_params)*# Run AutoML model design* chain = model.fit(features=train_data)*# Use model to obtain forecast* forecast = model.predict(features=test_data)
获得的预测可以在下图中看到:
AutoML FEDOT 模型预测(图片由作者提供)
从图中可以清楚地看出,获得的模型善于猜测数据中的模式,并且可以近似一天内的波动(早晚高峰时间)和周末交通流量的减少。而且只需要两分钟的计算就能得到这样的结果!
让我们来看看生产出来的管道:
机器学习管道,由 AutoML 框架 FEDOT 获得(图片由作者提供)
从图中可以看出,结果链由两个操作组成。“滞后”操作提供了时间序列的滞后(令人惊讶的)转换。我们将在下一篇文章中讨论这个问题。
结论
今天,我们已经讨论了几种自动机器学习技术。我们讨论了如何在自动模式下预测时间序列和识别预测模型。我们已经使用一个简单的例子检查了 AutoML 解决方案的功能。
在接下来的文章中,我们将仔细研究使用 AutoML 预测时间序列的所有困难。我们将详细分析 FEDOT 框架在真实世界数据上的能力。
一些有用的链接:
米哈伊尔·萨拉法诺夫、帕维尔·维楚查宁和尼古拉·尼基丁参与了这篇文章的写作。
Python 中的 AutoML:Hyperopt sk learn 和 TPOT 的比较
数据分析
两种流行的 Python AutoML 库的优缺点
图片来自 Pixabay
自动化机器学习 ( AutoML )涉及将机器学习应用于现实世界问题的任务的自动化。AutoML 涵盖了从原始数据集到可部署的机器学习模型的完整管道。
Python 提供了一些提供 AutoML 的库。在本教程中,我比较了两个流行的库:Hyperopt Sklearn 和 TPOT。存在另一个库,名为 AutoSklearn ,本文没有对其进行测试,因为它与一些操作系统不兼容。
这两个被分析的库都与 scikit-learn 兼容,后者是著名的用于机器学习的 Python 库。
本教程的完整代码可以从我的 Github 库下载。
作为本教程的用例,我利用了由 Kaggle 库提供的heart.csv
数据集。数据集关注心脏病发作,包含 14 个输入特征,并提供二元分类作为输出(心脏病发作是或否)。
1.远视 Sklearn
这个库很容易安装,如文档中所解释的,并且使用起来非常简单。文档简单明了。它支持许多scikit-learn
分类器、回归器和预处理模型。为了建立一个 AutoML 模型,创建一个HyperoptEstimator()
的实例,配置一些参数(如估计类型),然后拟合模型就足够了。HyperoptEstimator
的bestmodel()
返回一个包含完整scikit-learn
管道的对象。
让我们假设X
和y
分别包含输入特征和目标。我们可以通过scikit-learn
函数train_test_split()
将它们分成训练集和测试集:
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
现在我们可以训练HyperoptEstimator
搜索最佳分类器:
from hpsklearn import HyperoptEstimatorestim = HyperoptEstimator()
estim.fit( X_train, y_train )
我们可以得到最好的模型:
best_model = estim.best_model()
它给出了以下输出:
{'learner': ExtraTreesClassifier(criterion='entropy', max_features='sqrt', n_estimators=13,
n_jobs=1, random_state=4, verbose=False),
'preprocs': (),
'ex_preprocs': ()}
键/值对learner
包含最佳模型,第二个模型(preproc
)包含应用的预处理技术。在这种情况下,它是空的。
Hyperopt Sklearn 库反映了机器学习的随机性质:事实上,如果我们试图在相同的训练集上再次运行分类器,我们会获得另一个结果。
使用相同的训练集运行相同的代码(不执行再次训练/测试分割),我们获得以下最佳模型:
{'learner': GradientBoostingClassifier(learning_rate=0.00813591154617836, max_depth=None, max_features=0.6562885234780235, min_samples_leaf=11, n_estimators=63, random_state=0, subsample=0.68797222866341),
'preprocs': (MinMaxScaler(feature_range=(-1.0, 1.0)),),
'ex_preprocs': ()}
反正我们可以计算模型的性能。我们可以利用内置函数score()
或者定义我们的性能指标。在最后一种情况下,首先,我们必须将获得的预处理(如果有的话)应用于测试集,并将预测结果与实际值进行比较:
X_test_norm = X_test
if len(best_model['preprocs']) > 0:
preprocs = best_model['preprocs'][0]
X_test_norm = preprocs.transform(X_test)
Hyperopt Sklearn 库不提供predict_proba()
函数,因此我们必须手动计算:
model = best_model['learner']
y_score_hp = model.predict_proba(X_test_norm)
然后,我们可以绘制由scikitplot
库提供的 ROC 曲线和精确召回曲线,如下所示:
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve
from scikitplot.metrics import plot_roc,auc
from scikitplot.metrics import plot_precision_recall# Plot metrics
plot_roc(y_test, y_score_hp)
plt.show()
plot_precision_recall(y_test, y_score_hp)
plt.show()
作者图片
作者图片
我们还可以计算精确度、召回率和准确度:
y_test_pred = model.predict(X_test_norm)
accuracy = accuracy_score(y_test, y_test_pred)
precision = precision_score(y_test, y_test_pred)
recall = recall_score(y_test, y_test_pred)print('accuracy: %s ' %(round(accuracy, 2)))
print('precision: %s ' %(round(precision, 2)))
print('recall: %s ' %(round(recall, 2)))
它给出了以下输出:
accuracy: 0.85
precision: 0.85
recall: 0.9
在我的 Github 存储库中可用的完整代码中,我还通过 10 重验证计算了所获得模型的精度、召回率和准确度。下图显示了折叠次数的精度趋势:
作者图片
我注意到模型没有过度拟合。
2.TPOT
TPOT 是 AutoML 的另一个 Python 库。它的文档做得很好。然而,安装它并不简单,因为它是建立在其他库的基础上的,因此你必须先安装它们才能让 TPOT 工作和运行。个人觉得在正确安装之前遇到了很多问题。
一旦安装完毕,我们就可以创建一个评估器,或者是一个TPOTClassifier()
或者是一个TPOTRegressor()
。在我们的例子中,我们构建了一个 TPOT 分类器:
from tpot import TPOTClassifiertpot = TPOTClassifier(generations=5, population_size=50, random_state=42)
tpot.fit(X_train, y_train)
这个过程非常缓慢,需要一段时间才能完成。我们可以计算模型的精度、召回率和准确度:
y_test_pred = tpot.predict(X_test)
accuracy = accuracy_score(y_test, y_test_pred)
precision = precision_score(y_test, y_test_pred)
recall = recall_score(y_test, y_test_pred)
print('accuracy: %s ' %(round(accuracy, 2)))
print('precision: %s ' %(round(precision, 2)))
print('recall: %s ' %(round(recall, 2)))
它给出了以下输出:
accuracy: 0.8
precision: 0.84
recall: 0.81
关于通过 Hyperopt Sklearn 获得的最佳模型,TPOT 表现较差。
TPOT 也提供了predict_proba()
方法,可以用来计算 ROC 曲线和精确召回曲线。
作者图片
作者图片
我们可以通过scikit-learn
管道访问最佳模型:
tpot.fitted_pipeline_
它给出了以下输出:
Pipeline(steps=[('logisticregression',
LogisticRegression(C=20.0, random_state=42))])
虽然在文档中提到模型可能在相同的数据集上产生不同的最佳模型,但是在我们的例子中,在相同的数据集上运行更多次相同的代码会返回相同的模型。
现在,我可以通过 10 重交叉验证来计算精确度、召回率和准确度。TPOT 本身提供了交叉验证。然而,在这种情况下,我们手动计算它,因为我们想要绘制度量相对于每个折叠的趋势。
下图显示了精度趋势。对于其他情节(回忆和准确性),请检查我的 Github 库:
作者图片
关于 Hyperopt Sklearn 库,TPOT 似乎更稳定,有不同的数据集。
摘要
在本文中,我们比较了两个流行的用于 AutoML 的 Python 库:Hyperopt Sklearn 和 TPOT。
远视 Sklearn
优点
- 易于安装
- 快的
- 最佳模型达到高性能
缺点
- 相同(简单)数据集的不同最佳模型
- 简单和糟糕的文档
TPOT
优点
- 对于相同(简单)的数据集,总是相同的最佳模型
- 写得好的文件
- 最佳模型达到良好的性能
缺点
- 非常慢
- 难以安装
如果你想了解我的研究和其他活动的最新情况,你可以在 Twitter 、 Youtube 和 Github 上关注我。
相关文章
[## 如何使用 scikit-learn 检查分类模型是否过度拟合
towardsdatascience.com](/how-to-check-if-a-classification-model-is-overfitted-using-scikit-learn-148b6b19af8b)
汽车 vs HPO vs 现金:有什么区别?
AutoML 将逐渐取代人类专家分析师提供的功能,但不仅仅是提供预测模型
照片通过 Shutterstock
自动化机器学习,或简称为 AutoML 正在兴起。越来越多的商业产品出现在市场、学术工具和公共的开源 AutoML 库中。正如每一种新的、不清楚的、定义模糊的新技术一样,AutoML 被误解了。一方面,有浮夸的说法称它将把数据分析师送回家,另一方面,有极端的说法称它只自动化了分析的琐碎部分。这是因为不同的人对 AutoML 给出了不同的定义。让我们检查一下。
(预测性)AutoML 的愿景:AutoML 到底是什么?维基百科将其定义为端到端的机器学习过程的自动化。但是机器学习不是已经自动化了吗?我有一个数据集,我用默认的超参数值运行一个学习算法(例如,随机森林,SVM ),然后,我有了一个模型实例。那是自动的,不是吗?那么,有什么大惊小怪的?
AutoML 的目标是逐渐取代越来越多由人类专家分析师提供的功能。这些不仅仅是交付预测模型。优秀的数据科学家会为您提供图表、视觉效果、解释、见解和建议。他们不仅会确定要尝试的适当分类算法,还会对数据类型进行专门的预处理,尝试数据或 ML 任务的各种表示,并应用特征提取方法。而且不止于此。模型投入生产后,数据分析师需要持续监控预测的健全性,以防数据统计分布漂移。如果是这种情况,则需要标记一个警报,并且需要对模型进行重新训练。最重要的是,一个好的分析师将帮助你基于你的模型做出最优决策,比如当你应用模型时,最优的分类阈值是什么,以及哪些因素(特征、变量)可能会影响你的订户的行为。这就是 AutoML 应该做的。AutoML 是最终目标,但我们还没有完全实现。
超参数优化(HPO):AutoML 平台的一个子问题是在其处理的所有可用算法中提供最好的可能模型实例。这些算法中的每一个都可以使用超参数进行“调整”。超参数是修改其行为的算法的输入。使用不同的超参数值运行相同的算法可能会导致完全不同的预测模型实例。因此,出现的问题是如何调整它们的值并获得可能的最佳模型实例。超参数的解释通常与它们对检测模式和拟合数据的敏感性有关。例如, K- 最近邻中的 K 越低,或者岭逻辑回归中的权重惩罚λ*越低,模型将越复杂,模型将越好地拟合训练数据,并且过度拟合模型的概率越高。一些算法接受不止一个超参数,例如,XGBoost 算法接受大约 12 个与调整学习性能相关的超参数!**调整算法的超参数可以大大提高预测性能!*以我们的个人经验来看,调优“几个好的算法”可以说比使用大量默认设置的算法更重要。超参数优化(HPO)是自动调整给定算法的超参数的问题。几个基本的和先进的算法已经出现在 HPO 的文献中。HPO 算法尤其具有挑战性,因为它需要调整许多超参数。
组合算法和超参数选择(CASH): HPO 通常用于优化单个算法的超参数。然而,预测建模算法的选择(例如,SVM 对随机森林)也可以被编码为数字超参数:1 表示 SVM,2 表示 RFs,等等。此外,可以在建模之前应用一系列分析步骤,例如预处理、缺失值插补和特征选择。因此,分析的每一步都需要考虑算法选择和超参数调整。当除了超参数值之外还进行算法选择时,使用的更具体的术语是组合算法和超参数选择算法,或现金*。*
汽车、现金和 HPO 的区别。几个非常流行、特别有用、非常成功的免费软件库,像 auto sklearn 、 TPOT 和Gamma*在我们看来更好的描述是 CASH 或 HPO 库,而不是 AutoML 。所以,这就是不同之处:*
现金 自动搜索最优预测模型。
让我们用一个例子来说明不同之处。我们考虑了[1]测量 48 名阿尔茨海默病患者(病例)和 22 名年龄匹配的健康受试者(对照组)血液中 503 种 miRNA 表达的数据。任务是学习阿尔茨海默病状态的分类模型(二元分类)并估计其样本外预测性能。此外,还需要确定最佳预测所需的特征(在这种情况下是血液生物标志物),并了解它们的作用和重要性。我们在这个问题上应用了我们的 AutoML 平台,叫做 JADBio 。可以在这里访问实际成绩(https://app . jad bio . com/share/f 0 DCE 75d-612 c-4160-9256-55 b5 af 98 D2 d 2)。
首先, JADBio 解决了一个 CASH 问题,为预处理、特征选择和建模步骤选择算法,以及它们对应的超参数值,从而得到一个最佳预测模型。有 3017 种不同的算法和超参数值的组合被尝试(称为配置)来识别胜出者。每种配置都经过交叉验证,以评估性能和最终赢家,从而产生 90510 个经过训练的模型实例。获胜配置和分析报告如下图所示:
********
图 1: JADBio 对 lei dinger et al . 2013[1]48 名阿尔茨海默病患者和 22 名对照受试者的 miRNA 数据的分析报告。分析步骤的第一行显示了产生最佳模型实例的成功的 ML 管道(配置)。90510 个模型实例在 34 '内的 3017 个配置中被训练(适合)。
到目前为止,你可以从任何其他的 CASH 算法,比如 auto sklearn,得到相似类型的输出。这就是差异开始的地方。下图显示了模型的样本外(即新的、未见过的样本)性能的估计值。相比之下,像 auto sklearn 这样的现金库不会为您自动进行性能评估。作者建议您省去一个保留集来评估性能。JADBio 强调精确的性能评估,即使是小样本。它在内部自动执行所有必要的交叉验证;它还调整了“赢家的诅咒”的性能估计,即,为了选择最佳配置,已经尝试了许多配置。“未经调整的估计值”是没有经过这种调整的交叉验证的估计值,是一种高估(参见[2]了解更多信息)。 JADBio 也输出 ROC 曲线。曲线上的圆圈表示不同概率分类阈值的模型的不同操作点。绿色圆圈对应于阈值 0.46。将具有高于 0.46 的模型概率的受试者分类为患有阿尔茨海默氏病使得该模型在 ROC 上的该点上运行,其中它实现了 0.15 的假阳性率和 0.93 的真阳性率。用户可以点击任何圆圈,并获得模型的假阳性率和真阳性率之间的相应权衡。这是支持在模型操作环境中使用的分类阈值优化的一种方式。
图 2: JADBio 报告样本外接收操作特性(ROC)。它通过为阈值的不同选择提供估计来促进最佳分类阈值的优化。曲线上的每个圆圈对应于不同的阈值(底部 x 轴)以及假阳性率(x 轴)和真阳性率(y 轴)之间的不同权衡。例如,将任何概率高于 0.46(右侧摩天大楼点)的新样本分类为患有阿尔茨海默氏病,会导致选择 FPR 为 0.15、TPR 为 0.93 的绿色圆圈。每个轴上的置信区间显示为绿色十字。
JADBio 的配置还包括特性选择。因此,用户被告知测量和获得最佳性能所需的最小特征集。下图(子图(A))显示了 503 个特征中的 3 个特征被选择用于模型包含。大多数 CASH 库现在不同时执行特征选择和建模,尽管这可能会改变。无论如何, JADBio 的目标不仅仅是选择特性,还包括自动解释它们的作用和重要性。ICE 曲线[3]显示了每个特征,试图解释它们在预测中的作用。ICE 曲线显示,平均而言,作为特征值的函数,模型预测的成为阿尔茨海默病受试者的概率。在本例中,我们放大了第一个特征的 ICE 图(面板 B)。我们推断这一特征是疾病的风险因素:其值越高,平均而言,阿尔茨海默氏症模型的概率输出越高。请注意,准确的预测取决于所有 3 个选定的特征,并且根据其他两个特征的值而变化。这种差异在 ICE 图中用灰色区域表示。为了便于解释重要性,它们的附加值显示在特征重要性面板中。它显示了当从模型中删除一个功能,并且只删除该功能时,预期的性能下降。总的来说,AutoML 为从业者提供了一套功能来决定测量哪些特性以及如何解释它们的作用。**
图 3: A)最终模型的特征(所选特征), B)特征 hsa-miR-30d-5p 的 ICE 图,以及 C)如果特征被排除在特征之外,基于相对性能下降的特征重要性。
还有其他的视觉和输出来促进解释和决策。这些包括自动识别可能错误标记的样本和“难以预测”的样本(当前可用)、可能损坏的样本(“脏数据”)、对单个预测的解释(尚不可用)等等。AutoML 正面处理问题的解释和说明。视角发生了转变:当生产出一个模型实例时,HPO 和卡什就停止了。对于 AutoML 来说,这只是一个起点。
由 Ioannis Tsamardinos(克里特岛和亚德比奥大学)、Zacharias Papadovasilakis(亚德比奥大学)、Giorgos Papoutsoglou(克里特岛大学)和 Vassilis Christophides(法国恩塞阿)研究和撰写
参考
**[1] P. Leidinger,C. Backes 和 S. Deutcer,“阿尔茨海默病患者的基于血液的 12-miRNA 标记。、“基因组生物学,第 14 卷第 7 期,R78 页,2013 年。
**[2] I. Tsamardinos,E. Greasidou 和 G. Borboudakis,“引导样本外预测实现高效准确的交叉验证”,机器学习,第 107 卷第 12 期,第 1895–1922 页,2018 年。
[3] C. Molnar,“5.2 个人条件期望(ICE)”,载于可解释机器学习。使黑盒模型变得可解释的指南。,2021 年。**
AutoML 不会取代你的数据科学职业
让我们通过机器学习过程的步骤来找出“为什么?”
许多已经是数据科学家或数据科学领域新手的人正在寻找问题***“AutoML(自动机器学习)会取代数据科学家吗?”*** 问这样一个问题是非常合理的,因为自动化已经被引入到机器学习中,并且它在现代世界中发挥着关键作用。除此之外,想要成为数据科学家的人正在思考如何在就业市场中长期获得一席之地。
AutoML 会而不是取代你的数据科学职业。它只是为了让你的事情变得更简单,比如协助你完成枯燥的重复性任务,节省你的宝贵时间,协助你进行代码维护和一致性等!
让我们通过机器学习过程的步骤来找出“为什么 AutoML 不会取代你的数据科学专业?”。我们还将讨论一些可以应用于机器学习过程的流行自动化选项。在这篇文章的结尾,你会意识到 AutoML 将而不是取代你的数据科学职业。
让我们介绍一些关键的定义
基本上, 机器学习 就是在没有明确编程的情况下,计算机从数据中学习的能力。它与传统编程有所不同。 自动化 是一个需要最少人工投入的过程。存在各种类型的自动化。只有 AI 自动化 使用机器学习。它是自动化和机器学习相结合的东西。人工智能自动化系统可以根据数据进行学习和决策。将自动化应用于机器学习意味着我们使用自动化选项,以最少的人力来实现机器学习过程中的一些重复任务。
机器学习过程的步骤
下图显示了机器学习过程的步骤,分为三个主要类别——通常为*,自动化适用*,半自动适用和通常为,自动化不适用。
(图片由作者提供)
让我们详细讨论每个步骤。
问题定式化
这才是真正需要数据科学家的地方。因为每个问题都是不同的,所以问题的表述不能自动化。它需要大量的领域知识。解决问题没有单一的方法。数据科学家应该根据给定的场景使用不同的策略。这是 AutoML 无法处理的事情。在这一步,AutoML 无法取代数据科学家。
收集数据
数据科学家或数据工程师应该决定需要收集的数据类型和数量。这取决于他们想要解决的问题。这些事情不能自动化。但是,他们可以使用相关的自动化选项进行数据挖掘,以避免重复的任务。因此,数据收集可以是半自动的!这一步仍然需要数据科学家,AutoML 不能完全取代数据科学家。
数据清理
数据科学家和数据工程师将 60–70%的时间花在数据清理上。这是因为每个数据集都是不同的,它需要特定领域的知识。这是机器学习过程中最重要的一步。数据清理包括处理缺失值、异常值检测、分类变量编码等。处理缺失值是数据科学家最耗时的部分。离群点检测涉及到很多领域知识。如果我们检测到一个异常值,我们下一步应该做什么?我们应该移除它吗?我们应该保留它吗?或者我们应该用一个相关的值来代替它?这取决于特定分析问题的领域知识。一个离群值背后可能有一个有趣的故事。这些事情是自动化系统无法完成的。所以,这里需要数据科学专业人才。
型号选择
(图片由作者提供)
模型选择是指选择一个合适的机器学习算法来解决你的问题。数据科学家或机器学习工程师应该做出多项决策,以选择最佳算法。这个要看你手里的问题类型和收集的数据量和类型。如果您的数据有标注(基础真值),您可以选择像回归或分类(监督方法)这样的算法。如果标注是类值,则可以选择分类算法。如果标签是连续值,您可以选择回归算法。如果您有非线性数据,您可以选择非线性分类器或回归器(例如随机森林、决策树、XGboost)。如果您有线性数据,您可以使用线性回归器进行回归任务,使用具有线性核的支持向量机进行分类任务。如果您的数据不包含任何标签(基础真值),您可以选择像降维或聚类(非监督方法)这样的算法。如果您仍然希望找到未标记数据背后的隐藏模式,可以在已知聚类数的情况下使用 KMeans 算法。如果聚类数未知,可以尝试 MeanShift 算法。如果你想降低数据的维数,你可以对线性数据使用 PCA 或 LDA 算法,对非线性数据使用核 PCA,t-SNE 算法。算法的选择也取决于你拥有的数据量。一般来说,算法的选择取决于各种标准。数据科学专家应该想出一个办法来自动化这些事情。现在也有一些 Python 框架可用。但是,他们不能完全自动化这一过程。
特征选择
所选择的算法应该能够通过考虑特征的重要性来选择特征。向后消除、向前选择和随机森林方法可用于特征选择。这些算法可以自动选择最佳特征,但数据科学家仍应在使用这些方法之前手动设置参数值。这意味着这里也需要数据科学家。
超参数调谐
模型参数在训练过程中从输入数据中学习它们的值。相反,模型超参数在训练过程中不学习它们的值。因此,数据科学专业人员应该在训练过程之前指定模型超参数的值。机器学习模型通常会包含许多超参数。数据科学家的任务是为每个超参数尝试不同的值,并找到超参数值的最佳组合。如果他们一个接一个地手工操作,将需要很长的时间。自动化选项,如网格搜索或随机搜索可用于此。大多数时候,超参数调整过程包含数百甚至数千次迭代,数据科学家无法手动处理。一些超参数包含从 0 到正无穷大的值。数据科学家的任务是使用领域知识缩小超参数值的范围,然后应用网格搜索或随机搜索来实现最佳调整过程!
模型评估
模型评估过程确保模型很好地符合训练数据,并且也可推广到新的未见过的数据。对于监督学习,模型评估过程很容易,因为标签(基础真值)是可用的。相比之下,在标签(基础真值)不可用的无监督学习中,模型评估具有挑战性。在无监督学习中,很难找到任何用于模型评估的自动化选项。
数据科学家的主要职责
现在,我们可以弄清楚数据科学家在机器学习过程中的一些关键职责。
- 数据科学家应该把问题公式化。
- 数据科学家应该指导算法如何从数据中学习。
- 他们应该确定特征(变量)之间的真实关系。
- 他们应该为算法提供准备充分的足够数量的数据。
- 在大多数情况下,他们应该能够解释模型及其最终输出。
当承担这些责任时,数据科学家可以对机器学习过程的某些部分使用自动化选项。但是,AutoML 不能完全取代数据科学家的这些职责。
可用于机器学习任务的自动化选项
在本节中,我们将介绍一些可以应用于机器学习过程步骤的自动化选项。一些方法还包含 Python 代码。
使用 cross_val_score() 进行交叉验证
我们可以通过交叉验证使用 sci kit-learn**cross _ val _ score()**函数进行模型评估。以下 Python 代码对基于“房价数据集”构建的回归模型执行交叉验证。
通过交叉验证进行模型评估的 Python 代码(等到加载!)
(图片由作者提供)
这里,我们用不同的数据折叠对模型进行了几次训练,然后得到了平均 RMSE 值。但是我们没有手动完成这个过程,而是使用 sci kit-learncross _ val _ score函数自动完成了这个过程。因此,自动化可以用来处理模型评估中的重复性任务。
超参数调谐用 g rid 搜索
我们可以使用 Scikit-learn**GridSearchCV()**函数进行超参数调整。以下 Python 代码为基于“房价数据集”构建的回归模型执行超参数调整。
超参数调优的 Python 代码(等到加载!)
(图片由作者提供)
这里,我们在RandomForestRegressor中调 3 个超参数**【max _ depth】**【min _ samples _ leaf】和【max _ features】。因此,超参数空间是三维的,所以每个组合包含 3 个值。组合数为 192 (8 x 8 x 3)。这是因为 max_depth 包含 8 值,min _ samples _ leaf包含 8 值, max_features 包含 3 值。这意味着我们训练 192 个不同的模型!在 5 重交叉验证过程中,每个组合重复 5 次。因此,总迭代次数为 960 (192 x 5)。但是还要注意,每个 RandomForestRegressor 有 100 个决策树。所以,总计算量是 96000(960 x 100)!自动化流程让数据科学家的工作变得更加轻松。
使用 Pipeline() 训练多个模型
通过使用 Scikit-learnPipeline(),我们可以自动化多个复杂模型的训练过程。下图显示了构建多项式回归模型的一般工作流程。应该按照给定的顺序应用这些步骤。
多项式回归模型的一般工作流程(图片由作者提供)
流水线通过顺序地应用一系列转换器和最终预测器来自动化训练过程。在我们的工作流程中,
- StandardScaler() 是变压器。
- PCA() 是变压器。
- ***多项式特性()*是变压器。
- LinearRegression() 是预测器。
以下 Python 代码将自动执行上述工作流。
多项式回归模型的一般工作流程的 Python 代码(等到加载!)
*现在,您可以通过一个**来训练所有的估计器。*调用 fit()。
*ploy_reg_model.fit(X,y)*
其他自动化选项
下面是本文中不会详细讨论的其他流行自动化选项的列表。
- PyCaret —这是 r 中可用的 Caret 包的 Python 版本,PyCaret 中的大多数机器学习任务就像函数调用一样简单。你可以用几行代码训练和可视化多个机器学习模型。
- 微软 Azure AutoML——这将自动化应用于具有速度和规模的机器学习模型。如果将此与 Microsoft Power BI 相结合,您可以从数据中获取最大价值。
- TPOT —这是一个 Python 库,通过应用自动化来处理机器学习任务。
- Google Cloud AutoML —你可以用最少的努力训练出高质量的定制机器学习模型。
关键要点
现在,你对 AutoML 以及它如何应用于机器学习任务有了清晰的理解。我们已经走过了机器学习过程的步骤,并找到了“AutoML 不会取代你的数据科学专业”的原因。我们还讨论了目前可用的一些自动化观点。你可以试试它们!在以后的文章中,我也会谈到其中的一些。
有两件明显的事情无法完全自动化机器学习过程:
- 对领域知识的需求
- 未标记数据的存在(在无监督学习中)
因为这些东西,AutoML 无法取代数据科学家。
除此之外,我想给你以下两条关于使用 AutoML 的建议:
- 如果你是数据科学或机器学习领域的新手,不要从像微软 Azure AutoML 或谷歌云 AutoML 这样易于使用的框架开始你的机器学习过程。与其这样,不如学习 Python(或者 R)及其相关包。在你对机器学习理论和那些包有了扎实的基础知识之后,你可以试试微软 Azure AutoML 或者谷歌云 AutoML 。这样做将为成为该领域的大师创造一条漫长而清晰的道路。
- 当你学习数据科学和机器学习时,更多地关注数据清理任务,如处理缺失值、离群点检测、特征编码和无监督学习方法。除此之外,更多地关注获取特定问题的领域知识,并用简单的英语解释你的结果,这样即使是非技术人员也能理解你的发现。这些都是自动化无法取代的。
最后,确实需要数据科学家!自动化让他们的事情变得更容易。
感谢阅读!
本教程由 鲁克山·普拉莫迪塔数据科学 365 博客作者设计创作。**
在 https://rukshanpramoditha.medium.com阅读我的其他文章
2021–05–11
AutoNLP:基于 SOTA 模型的自动文本分类
从头开始理解和使用 AutoNLP 的分步指南
图一。AutoNLP |作者图片|取自 freepick 的图标
开发一个端到端的自然语言处理模型并不是一件容易的事情。这是因为必须考虑几个因素,例如模型选择、数据预处理、训练、优化、模型服务的基础设施以及其他因素。出于这个原因,今天出现了一些有趣的替代方法来简化和自动化这些任务。这就是 AutoNLP 的情况,这是一个允许我们自动化 NLP 模型的端到端生命周期的工具。
在这篇博客中,我们将了解什么是 AutoNLP,以及如何在安装过程、项目创建、培训、指标、成本估算和模型服务中很好地使用它。因此,本博客将涵盖以下几个部分:
- 什么是 AutoNLP?
- 实践中的 AutoNLP
什么是 AutoNLP?
AutoNLP [ 1 ]是一个自动创建端到端 NLP 模型的工具。AutoNLP 是由拥抱脸 [ 2 团队开发的工具,于 2021 年 3 月推出测试阶段。AutoNLP 旨在自动完成构成 NLP 模型生命周期的每个阶段,从训练和优化模型到部署模型。
“AutoNLP 是一种自动训练和部署最先进的 NLP 模型的方法,与拥抱脸生态系统无缝集成。”— AutoNLP 团队
AutoNLP 的一大优点是,它为二进制分类、多级分类和实体识别的任务实现了最先进的模型,支持 8 种语言,即:英语、德语、法语、西班牙语、芬兰语、瑞典语、同样,AutoNLP 负责模型的优化和微调。在安全和隐私部分,AutoNLP 实现了受 SSL 保护的数据传输,数据也是每个用户帐户的私有数据。
正如我们所看到的,AutoNLP 是作为一种工具出现的,它简化并加速了创建 NLP 模型的过程。在下一节中,将会看到使用 AutoNLP 创建文本分类模型时从头到尾的体验。
实践中的 AutoNLP
对于这个例子,我们将处理一个二元分类问题。该数据集来自 SEPLN (塔斯社)[ 3 ]研讨会的语义分析,由西班牙语的推文组成,标记为 3 类负面*、正面和中性。出于这个例子的目的,我们将从中性类中移除样本,以得到一个适合二进制分类问题的数据集。你可以点击下载数据集。在图 X 中,我们可以观察到训练和验证数据集的特征。*
图二。训练和验证数据集|按作者分类的图像
现在,我们不必对数据集做任何其他事情。接下来就是开始使用 AutoNLP 了,那就加油吧!
安装 AutoNLP
为了通过 AutoNLP 工具使用 Hugging Face 基础设施,我们需要注册并创建一个帐户,其中将包含我们的模型和数据集。此帐户将提供一个令牌,用于在 AutoNLP CLI 和 Hugging Face 基础架构之间建立通信。
可以通过pip
从命令行直接安装 AutoNLP,如下所示:
图 3。按作者安装 autonlp |图像
我们还将要求安装 Git 大文件存储 (Git LFS)。在我的例子中,由于我在 macOS 操作系统上工作,我是这样做的:
图 4。作者安装 git-lfs |图像
然后,为了设置git-lfs
,您需要键入:
图 5。按作者设置 git-lfs |图像
一旦autonlp
被安装,它的要求,我们继续创建一个项目,上传数据和训练我们的模型,让我们去做吧。
创建 AutoNLP 项目
创建项目的第一步是进行身份验证,为此,我们只需要您帐户设置中的令牌,使用autonlp
CLI 键入:
图 6。记录|按作者分类的图像
一旦通过认证,我们就开始创建我们的项目。对于这个例子,我们的项目将被称为polarity_detection
,它将用spanish
语言处理数据,任务将是binary_classification
,我们想要训练的模型的最大数量是5
。然后,该命令如下图所示:
图 7。按作者创建项目|图像
当创建我们的项目时,终端将向我们显示关于我们创建的项目的信息。我们的示例项目的信息如图 8 所示。
图 8。项目描述|作者图片
正如我们所看到的,这些信息向我们展示了一些细节,比如我们项目的标识符(在这个例子中是128
),属性比如name
、owner
等等。但是,还显示了一条非常重要的信息,即成本。在这个阶段,成本仍然显示USD 0.00
,因为我们还没有训练任何模型,因此,只有当我们的模型训练结束时,这个值才会改变,这一点我们将在后面详细介绍。
上传您的数据
一旦我们的项目被创建,我们将继续上传我们的数据集。建议分别上传训练数据集和验证数据集。要上传数据集,只需指定项目的名称(在我们的例子中是polarity_detection
)、分割的类型(即train
或valid
)、列名的映射(在我们的例子中是tweet
和polarity
,它们分别映射到text
和target
以及数据集文件。下图显示了这些命令的外观:
图 9。上传数据集|按作者上传图像
与项目的创建一样,在终端上传数据集时,我们将看到与我们的流程相关的信息,在这种情况下,我们的数据集信息如下图所示:
图 10。数据集信息|作者提供的图像
一旦数据集上传完毕,我们就可以开始训练了。然而,要考虑的一个重要方面是成本。AutoNLP 为我们提供了一个命令,根据训练数据集中的样本数量来估计项目的成本。为了获得估计值,我们使用下图所示的命令:
图 11。成本估算|作者图片
我们可以看到,成本是在一个范围内提供的,对于这个例子,成本估计为7.5
到12.5 USD
。培训结束后会提供最终费用,我们将在下面看到。
培养
从模型的训练开始,我们只需要使用train
参数和项目名称,如下图所示:
图 12。培训|作者图片
培训开始后,我们将会看到一个问题,询问我们是否同意估计的成本(即我们在上一节中看到的成本范围),在接受估计的成本时,我们将观察每个模型的状态,如下图所示:
图 13。培训状态|作者图片
根据我们推出的模型数量以及数据集的特征,训练时间会有所不同。但是,我们可以使用project_info
参数来监控模型的状态,如下图所示:
图 14。项目信息|作者图片
从上图可以看出,每一款推出的车型都有令人满意的结局(记住我们只推出了 5 款)。还显示了更新后的最终成本,即11.70 USD
。
在每个模型的训练过程中,我们可以监控一些指标,出于本例的实际目的,我们只显示在所有模型的训练结束时获得的指标。因此,为了形象化度量,我们使用了metrics
参数和项目名称,如下所示:
图 15。指标|作者图片
对于每个训练模型,报告的度量是loss
、accuracy
、precision
、recall
、AUC
和f1-score
。在我们的例子中,我们看到平均来说accuracy
是0.85
,考虑到数据集的特征,这可能是一个可接受的值。我们还可以看到,它再次显示了我们培训的总成本。
推断
一旦我们的模型经过训练,它们就可以做预测了。为了进行预测,我们将使用predict
参数以及模型标识符、项目名称和要预测的短语,如下图所示:
图 16。预测|作者图片
正如我们在前面的图中看到的,这个句子假装是肯定的,实际上,这个模型为肯定的类产生了一个得分0.99
。在第二个例子中,句子假装是否定的,实际上,该模型为否定类产生了得分0.99
。
同样,AutoNLP 允许通过 cURL 请求和 Python API 进行预测,分别如图 17 和 18 所示。
图 17。按请求预测|按作者分类的图片
图 18。通过 Python API 预测|作者图片
结论
在这篇教程博客中,我们看到了什么是 AutoNLP,它的组件,以及它是如何工作的。
值得一提的是,一旦我们通过 AutoNLP 使用了 Hugging Face 基础设施,我们将会收到一张发票,上面的金额显示在命令行上。
我测试 AutoNLP 的经历很愉快。我第一次训练时遇到了一些问题,但是他们提供的支持是有效的。
参考
[1] AutoNLP
[2] 抱紧脸
[3]SEPLN 语义分析
自动缩放 SageMaker 实时端点
将您的 ML 工作负载投入生产
让一个端点启动并运行以进行推断是一回事。确保端点能够处理您预期的流量是另一回事。有了 SageMaker 实时端点,在生产中推出模型时需要考虑许多因素。您用于端点的实例类型是什么?对于这个用例来说,更重要的是,您有多少实例支持端点?
在本帖中,我们将研究自动缩放 SageMaker 端点来处理流量。最简单的形式是,您可以拥有一个由一个实例支持的 SageMaker 实时端点。有时,该实例可能会超负荷工作,这可能会导致您的端点出现故障和推断错误。为了解决这个问题,您可以创建一个自动扩展策略,帮助您的实例根据 CloudWatch 指标展开,比如每个实例的调用次数或 CPU 利用率。
对于今天文章中的例子,我们将从一个 Amazon XGBoost 部署的端点构建一个自动伸缩策略。要获得部署 Amazon XGBoost 算法的演练,请先阅读本文和。
注意 : 对于那些刚接触 AWS 的人来说,如果你想继续下去,请确保在下面的 链接 中进行登记。本文假设读者对 AWS 和 SageMaker 具有中级知识水平。
目录
- 自动缩放选项
- 部署 XGBoost 端点
- 自动缩放端点
- 其他资源和结论
1.自动缩放选项
有几种不同的方法可以扩展您的端点;不同的自动缩放策略选项定义如下。
目标跟踪缩放 :通过目标跟踪,您可以指定要监控的指标。对于 SageMaker,请查看受支持的 CloudWatch 指标,您可以从中选择一个并监控它。您可以为此指标设置阈值,如果达到阈值,它可以按照您的定义进行扩展。请注意,您还可以使用 SageMaker 定义定制指标。
计划缩放 :通过计划缩放,您可以设置自己的缩放计划。例如,如果您知道一周中某一天的流量会比较高,那么您可以构建自己的策略,在这一天扩大流量。
步进缩放 :步进缩放变得更加具体,您可以定义触发策略的具体阈值。步进缩放的强大之处在于,它根据警报破坏的程度进行缩放。如果在更大程度上违反了阈值,将应用更大的缩放。
对于我们的具体例子,我们将与目标跟踪缩放工作。要了解所有其他可用的缩放选项,请查看文档。
2.部署 XGBoost 端点
让我们快速演练部署 Amazon 提供的算法之一:XGBoost。我们将把它用于带有鲍鱼数据集的回归用例。要更深入地了解每个步骤,请查看我的上一篇文章,这篇文章更深入地介绍了如何使用算法进行训练和部署。在本节中,我们将快速浏览一下模型部署,跳过培训过程。
我们将使用 Boto3 Python SDK 与 SageMaker 客户机一起进行模型部署。第一步是获取我们的模型数据并创建我们的 SageMaker 模型。
SageMaker 模型创建
接下来,我们可以使用 SageMaker 模型来定义我们的端点配置。
端点配置创建
我们指定只从一个实例开始支持我们的端点。然后,我们可以使用此端点配置来创建端点,这需要几分钟时间。
端点已创建
现在我们已经创建了端点,我们可以输入一个样本数据点来测试调用模型进行推理。
调用端点
样本结果(作者截图)
3.自动缩放端点
我们现在可以专注于定义一个扩展策略来处理流量。我们将使用目标跟踪策略,我们关注的指标将是 InvocationsPerInstance。我们可以为每个实例设置 10 次调用的阈值。我们可以使用 Boto3 Python SDK 和自动缩放客户端来定义这个策略。
自动缩放策略
注意,我们将的最大容量定义为的 4 个实例,在我们的端点之后至少有 1 个实例。现在,我们可以定义阈值、目标指标,以及在和横向扩展时间内的规模。这两个时间将是我们的实例向外扩展,然后在每个实例的调用没有达到阈值的情况下再向内扩展所需的时间。
目标跟踪缩放
现在我们可以用一些压力测试来测试这个策略。我们将使用 invoke 端点 Boto3 调用,并在一定时间内发送请求。请记住,我们的横向扩展期需要 60 秒。
测试终点
端点应该被调用 250 秒,我们可以在 SageMaker 控制台上通过特定端点的 CloudWatch 调用度量来监控这一点。
SageMaker 的 CloudWatch 指标(作者截图)
实例最小值-最大值设置为 1-4(作者截图)
现在,我们可以监控 CloudWatch 图表,因为我们的端点在这 250 秒内受到了压力。
调用指标(作者截图)
我们可以放大到特定的区间来观察我们的终点变得越来越紧张。
调用指标(作者截图)
在我们的端点受到压力之后,我们可以使用 Boto3 来监控我们的端点描述更新,以反映我们的实例向外扩展。
监控端点实例
端点更新(作者截图)
过一会儿,您应该会看到端点已经更新为有四个实例。
更新的端点(作者截图)
4.其他资源和结论
SageMaker AutoScaling 帮助您以多种方式将模型投入生产。通过大量的扩展选项,以及详细的 CloudWatch 监控,您可以根据您对流量的预期来定义您的策略。
另一个值得一试的功能是 SageMaker 推理推荐器,这个新功能有助于负载测试并为您的端点选择最佳实例类型。如果对更多 SageMaker 相关内容感兴趣,我在下面附加了一些资源。
如果你喜欢这篇文章,请在LinkedIn上与我联系,并订阅我的媒体 简讯 。如果你是新手,使用我的 会员推荐 报名。
使用 Kubeflow 和羽衣甘蓝进行大规模 AutoSklearn
如何使用 Kale 和 AutoSklearn 在 Kubeflow 上运行 AutoML 实验
照片由 Goh Rhy Yan 在 Unsplash 上拍摄
给定一个任务、一个度量、一个训练数据集以及一个资源预算,AutoML 系统可以自动地在一个测试数据集上产生一组预测。预算可能涉及计算资源,例如 CPU 和/或挂钟时间和内存使用。
上一段是对 AutoML 的定义。简单地说,当您启动 AutoML 实验时,您提供了训练数据集和您期望的最终目标。用简单的英语来说,最终目标可能是这样的:给我找一个模型,当你将它用于这个训练数据集时,它可以在那个测试数据集上产生最佳的分类精度性能。此外,在半小时内完成。
你会如何解决这个问题?最简单的方法是获取适用于该任务的每个 Scikit 学习预测器(例如,每个分类器),对其进行拟合,并在半小时内返回产生最佳结果的预测器。
然而,这种简单的方法是不够的。每个分类器都接受几个超参数,这些超参数可能会使其性能变好或变坏。此外,在拟合可能显著改变预测器性能的模型之前,您可以使用数十个数据处理函数。测试每一种可能的组合是不可能的。
但是有一个更好的方法,包括元学习,我们最喜欢的 Scikit Learn 机器学习(ML)框架和 Kubernetes。让我们把大枪拿出来!
Learning Rate 是一份时事通讯,面向那些对 AI 和 MLOps 世界感到好奇的人。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。订阅这里!
元学习
在深入研究代码之前,让我们先停止使用第一个术语。什么是元学习?我可以解释为学会学习,但对我来说听起来更困惑。所以,让我们再试一次:
元学习方法将数据集和任务(例如,分类或回归)作为输入,并返回应用于该数据集的一组算法,其超参数是预先填充的。
现在,我认为这个高层次的解释做得更好。但是元学习是如何做到的呢?第一步,生成输入数据集的描述性模型。我说的模型,不是指 ML 模型。它只是一组数字,以某种方式捕捉数据集的各种核心特征。这也称为元特征向量。
这些元特征可以是数据集代表值,例如维度、基数、维度之间的相关性、熵、互信息和稀疏性相关统计。
这个向量旨在提供足够的信息,以便元学习系统可以计算数据集之间的相似性。这意味着,你可以将两个数据集转换成这些向量,比较这些向量,并找出数据集在某种意义上是否相似。
在第二步中,元学习系统接收生成的数据集模型,并试图发现过去已经处理过的类似数据集。关于过去的数据集、对这些数据集执行的算法以及评估结果的信息存储在存储库中。
最后,通过计算手边的数据集和储存库中的其他数据集之间的相似性,系统可以检索一组算法及其超参数,这些算法在过去表现最好。
简单的例子
既然我们已经解决了各种流行词汇,您将从您的 Jupyter 笔记本开始创建一个 AutoML 工作流。此外,您将在 Kubeflow 上这样做,以便可以利用 Kubernetes 集群的强大功能。
你需要什么
首先,您需要一个正在运行的 Kubeflow 实例和一个 Jupyter 笔记本服务器。不要担心,我们将使用 MiniKF,我们将立即拥有所有这些。要设置 Kubeflow 并启动笔记本服务器,请遵循以下指南:
如果您更喜欢使用 AWS,我们将为您提供:
在文章中,您将看到要创建一个笔记本服务器,您需要选择jupyter-kale:v0.5.0–47-g2427cc9
Kale 图像(注意图像标签可能不同)。然而,在我们的例子中,让我们选择gcr.io/arrikto/jupyter-kale-py36:kubecon21eu-automl-nightly
图像,因为这个特性仍然处于早期阶段。
我们准备好了。让我们建立我们的第一个例子!
卡格尔推土机比赛
推土机蓝皮书是 8 年前举办的一场 Kaggle 竞赛。在这次比赛中,参与者被要求预测在拍卖会上出售的推土机的销售价格。
我们将使用这个数据集,因为同一个数据集用于测试流行的 ML 框架的性能,例如fastai
。fastai
有一个很棒的tabular
模块,专门解决结构化数据集(如 CSV 文件)的挑战。
他们在课程和书本上都使用推土机数据集来测试这个模块。他们实现了实际拍卖价格和预测拍卖价格之间的 RMSLE(均方根对数误差)为 0.226。这是使用神经网络实现的。
为了将我们的方法与fastai
的方法进行比较,我们需要使用相同的输入。因此,我们使用预处理管道fastai
来扩充数据集并转换分类值。
具体来说,我们使用add_datepart
方法来扩展数据集的saledate
字段。这意味着我们使用该字段中给出的信息创建新字段(例如,“今天是星期几?”,“是周末吗?”,“放假了吗?”等。).
最后,我们使用TabularPandas
类将分类值转换成数字。在我们的例子中,我们没有在预处理管道中使用FillMissing
方法,因为我们期望我们的系统建议一个相关的估算器。
要获得示例,克隆 Kale repo 并检查相关分支:
git clone https://github.com/kubeflow-kale/kale -b kubecon21eu
克隆的存储库包含一系列带有数据和注释笔记本的精选示例。在侧边栏中,导航到文件夹kale/examples/bulldozers-kaggle-competition/
并打开笔记本[blue-book-bulldozers.ipynb](https://github.com/kubeflow-kale/kale/blob/kubecon21eu/examples/bulldozers-kaggle-competition/blue-book-bulldozers.ipynb)
。
进行实验
跟着笔记本的单元格跑实验。神奇的事情发生在下面的命令中:
automl = kale_ml.run_automl(dataset,
kale_ml.Task.REGRESSION,
metric=metrics.mean_squared_log_error,
number_of_configurations=4,
max_parallel_configurations=1,
tuner=tuner)
您可以看到,我们调用了 Kale 提供的run_automl
函数,给出了一个数据集、一个任务和一个指标。number_of_configurations
参数指示系统将尝试多少 ML 管道配置。
让我们在这里暂停一下。我们之前说过,元学习返回一组应用于该数据集的算法,并填充了它们的超参数。然而,在我们的例子中,我们得到的不仅仅是一组算法。Kale 在底层使用了 AutoSklearn ,所以我们得到了一组完整的 ML 管道配置,数据和特征处理功能以及 ML 模型在顶层。这就更厉害了!
接下来,max_parallel_configurations
参数定义了并行运行的管道数量。最后但同样重要的是,调优器将在性能最佳的配置上运行超参数调优实验。
您可以通过观察协调一切的管道来监控实验的进度:
AutoML 编排管道—按作者分类的图像
或者,您可以在笔记本上完成:
自动监控—图片由作者提供
仅仅经过四次尝试,并且没有对我们的选项做太多改动,我们得到了大约 0.26 的分数。几乎什么都不做也不错。我们至少可以用这个结果作为我们的基准!
结论
在这个故事中,您创建了一个从原始数据开始自动发现和训练完整 ML 管道的机制。
您了解了什么是 AutoML 和元学习,然后,从数据集开始,您使用 Kale API 实例化了一个流程,该流程将为输入数据搜索最合适的模型。然后,您使用最佳配置中的模型自动启动了超参数优化实验。
有关您需要的所有步骤的更详细的指南,请在此处进入代码实验室:
https://codelabs.arrikto.com/codelabs/minikf-kale-automl/index.html?index=..%2F..index#0
关于作者
我的名字是迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的帖子,请关注我的 Medium 、 LinkedIn 或 Twitter 上的 @james2pl 。
所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。
AutoVideo:一个自动视频动作识别系统
利用神经网络和自动化机器学习识别人类行为,如刷牙、坐着和跑步
视频动作识别管道可以使用 AutoVideo 预测的一些常用动作来源: HMDB (CC BY 4.0)
在这篇文章中,我将介绍我们如何建立一个神经网络来自动识别人类的行为。虽然这对于人类来说似乎是一项简单而琐碎的任务,但对于人工系统来说却很难做到。基于视频的动作识别旨在通过从视频片段中识别不同的动作来解决这个问题。这是视频理解的一项重要任务,在各个领域都有广泛的应用,如安全(孟、Pears 和 Bailey 2007) 、医疗(高等 2018) 、行为分析 (Poppe 2010)。视频动作识别的实际应用包括老年人行为监控以增强辅助生活、自动视频监控系统等等。
https://github.com/datamllab/autovideo。图片作者。
本文的目的是为我们的开源项目 AutoVideo ( GitHub )提供一个教程,这是一个全面且易于使用的视频动作识别工具包。在本教程中,您将学习:
(1)如何训练一个可以预测人类动作的神经网络;
(2)如何使用自动调优工具节省你调优超参数的努力;
(3)如何在你定制的数据集上训练模型。
你将能够使用你训练过的模型来识别任何新的视频剪辑,就像下面检测刷毛的演示一样。
预测演示视频上的动作(刷牙)。图片作者。
概观
AutoVideo 是一个高度模块化和可扩展的系统,它用标准管道语言包装了数据加载、数据处理和最先进的动作识别模型。因此,从业者可以很容易地添加新的动作识别模块或其他模块,如其他视频理解任务。AutoVideo 还引入了数据驱动的搜索器来自动调整不同的模型和超参数,以减少人工工作量。
图一。系统概述。AutoVideo 中的每个模块都被包装成一个带有一些超参数的原语。流水线由从预处理到动作识别的一系列原语组成。AutoVideo 配备了调谐器来搜索模型和超参数。图片作者。
入门指南
让我们从教程开始吧,它将帮助您熟悉这个包,并在自定义/基准数据集上执行动作识别。
安装:
要安装该软件包,请确保您的 Linux/MacOS 系统上安装了 Python 3.6 和 pip。首先安装以下软件包:
pip3 install torch
pip3 install torchvision
然后,只需使用以下命令即可安装 AutoVideo 软件包:
pip3 install autovideo
准备数据集:
数据集必须遵循 D3M 格式,由一个 csv 文件和一个媒体文件夹组成。csv 文件应包含三列,用于指定实例索引、视频文件名和标签。下面是一个示例 csv 文件:
**d3mIndex,video,label**
0,Brushing_my_waist_lenth_hair_brush_hair_u_nm_np1_ba_goo_0.avi,0
1,brushing_raychel_s_hair_brush_hair_u_cm_np2_ri_goo_2.avi,0
2,Haarek_mmen_brush_hair_h_cm_np1_fr_goo_0.avi,0
3,Haarek_mmen_brush_hair_h_cm_np1_fr_goo_1.avi,0
4,Prelinger_HabitPat1954_brush_hair_h_nm_np1_fr_med_26.avi,0
5,brushing_hair_2_brush_hair_h_nm_np1_ba_med_2.avi,0
媒体文件夹应该包含视频文件。你可以参考我们在 Google Drive 中的例子 hmdb6 数据集。我们还在 Google Drive 中准备了 hmdb51 和 ucf101 进行基准测试。要试用这个教程,你可以从这里下载 hmdb6 数据集。然后,您可以解压缩一个数据集,并将其放入数据集。
进行实验:
这个界面基于 Axolotl,我们对 D3M 的高级抽象。下面给出了使用预训练权重(在子采样 hmdb6 数据集上训练)在样本视频上运行动作识别任务的最小示例。我们开始吧!
加载数据集:
如上所述,以 D3M 格式准备数据集,并将其放在数据集文件夹中。在这个例子中,我们使用了 hmdb-6 ( Google-Drive )(来自 HMDB-51 的子样本,仅包含 6 个类)。我们使用实用函数 set_log_path() 为实验设置日志记录系统。train _ table _ path是带有视频文件名和标签信息的训练 csv 文件的路径。train _ media _ dir表示包含视频文件的媒体文件夹,而 target_index 指定包含输出标签信息的列的索引
预处理:
在读取火车 csv 文件后,接下来我们通过从 火车 _ 媒体 _ 目录 中的视频中提取帧并将它们存储在文件夹目录 帧中来预处理数据集。 为了实现这一点,我们从 autovideo 包中使用extract _ frames实用函数如下:
构建模型:
我们的软件包支持 7 种动作识别模式。在这个例子中,我们使用 TSN 作为视频识别模型。***build _ pipeline()***函数返回由端到端可训练模型组成的 管道 。下面是一个构建管道的示例。
调整超参数:
在上面的函数中,用户可以在***build _ pipeline()***函数中自定义配置字典 (config) ,用不同的超参数训练不同的算法。我们已经指定了一些超参数值(如学习率、时期数。等等)来演示用法。支持的超参数的完整列表可在这里找到。AutoVideo 中的每个模型都被包装成一个图元,其中包含一些超参数。TSN 的一个例子是这里的。所有的超参数都可以在构建管道时指定,方法是在上面的config
字典中传递它们。
火车:
可以使用上面指定的配置对模型进行端到端训练。这里我们使用 拟合 函数,该函数将训练模型并返回拟合的管道/模型。这可以保存下来供将来使用。下面是一个适合管道的示例:
上述函数在训练集上进行训练,并在验证集上进行验证,以将最佳执行模型保存在验证集上用于推理阶段。fit 函数的输出如下所示:
**Confidence Scores:**
[[0.0692555 0.06158188 0.02618745 0.05211503 0.10426781 0.68659234]...[0.00917702 0.01555088 0.00744944 0.00688883 0.02226333 0.9386706 ]]
上面的输出是在上面已经在训练集上训练之后的验证集中的视频的置信度分数。
最后,你可以在 examples/fit.py 找到上述代码片段的完整示例代码。要使用 fit()函数训练模型,只需运行:
python3 examples/fit.py
推论:
我们可以加载使用 fit() 函数获得的训练模型权重,以检测样本视频上的动作或计算测试集上的准确度。可点击此处下载一段演示视频和预训练的重量。在演示视频中检测动作的示例如下:
下面是演示视频输出的 GIF 图:
图片作者。
或者,我们可以使用经过训练的模型来计算测试集的准确性。这里我们使用 autovideo 的 produce() 函数从测试集中获得 预测 ,然后使用***compute _ accuracy _ with _ preds()***实用函数计算准确度。
这里test _ table _ path表示包含视频文件路径及其标签信息的测试 csv 文件,而test _ media _ dir表示包含视频文件的媒体目录。
在测试集上计算精确度的完整代码可以在 examples/produce.py 中找到。您可以使用以下命令运行此示例:
python3 examples/produce.py
搜索器模块:
除了用指定的配置拟合模型之外,用户还可以使用调谐器以数据驱动的方式自动搜索管道(即,模型和超参数)。我们当前的系统支持两种类型的调谐器,包括随机搜索和 Hyperopt。要使用自动搜索,您需要安装 ray-tune 和 hyperopt 以及:
pip3 install 'ray[tune]' hyperopt
运行搜索器模块的示例界面如下。
加载数据:
让我们通过在 train_table_path 和 valid_table_path 中指定 csv 文件路径来加载训练和验证数据集。 搜索器使用 train_dataset 使用搜索器在每个样本中绘制的一组超参数来训练模型。搜索结束时超参数的最佳配置是在valid _ dataset上具有最佳准确度的那些。
初始化搜索器模块:
在这里,用户可以使用 RaySearcher 为上面指定的数据集初始化搜索器模块。除了指定搜索算法(随机 v/s 超点)之外,用户还可以定义搜索空间(支持连续和离散空间)。在下面的例子中,我们使用了远视搜索。
搜索:
然后,调谐器将在搜索空间中搜索最佳超参数组合,以提高性能。下面是一个使用指定配置进行搜索并返回最佳超参数集的示例:
搜索器的完整代码可以在 examples/search.py 中找到,可以使用以下命令运行:
python3 examples/search.py
总结:
要了解这个项目的更多信息,请点击查看。该团队正在积极开发项目的更多功能,包括带有可视化工具的图形用户界面,并添加更多的视频理解任务。我们的目标是让视频识别对每个人来说都更容易使用。我希望你喜欢阅读这篇文章。
Autoviz:自动可视化任何数据集
只需一行代码即可可视化任意大小的数据集
来源:作者
可视化是一种使用不同的图形和绘图来可视化数据的技术。在数据科学中,我们通常使用数据可视化技术来理解数据集和发现数据之间的关系。可视化还有助于发现数据集中的模式,用于进一步分析。
python 中有不同的技术/库用于数据可视化,如 Matplotlib、Seaborn、Plotly 等。但是在使用所有这些库的时候,我们需要定义我们想要可视化的图形类型和我们需要可视化的参数。
在本文中,我们将了解一个 python 库 AutoViz ,它可以在一行代码中自动化整个数据可视化过程。
AutoViz 只需一行代码就可以对任何数据集进行自动可视化。AutoViz 可以找到最重要的功能,并只使用那些自动选择的功能来绘制有影响力的可视化效果。此外,AutoViz 非常快,可以在几秒钟内创建可视化效果。
让我们借助一些数据集开始探索 AutoViz。在使用 AutoViz 之前,我们需要安装它。
此外,请查看我的 Youtube 频道,了解更多关于数据科学的有趣内容。
安装 AutoViz
像任何其他 python 库一样,我们可以使用下面给出的 pip install 命令来安装 AutoViz。
pip install autoviz
加载数据集并进行分析
在这里,我将使用不同的数据集来可视化/探索 AutoViz 可以生成的不同类型的图表/绘图。你可以从 Github 库查看并下载所有的数据集。
- 汽车设计数据集
这个数据集包含不同汽车制造商的不同属性。让我们用 AutoViz 可视化这个数据集。
AutoViz 可以通过下面给出的 3 个简单步骤来实现。
#importing Autoviz class
from autoviz.AutoViz_Class import AutoViz_Class#Instantiate the AutoViz class
AV = AutoViz_Class()
这些步骤将导入 AutoViz 类并实例化它。最后一步是创建可视化。仅仅这一行代码就将创建所有的可视化效果,包括计数中的所有属性。
df = AV.AutoViz('car_design.csv')
a.所有连续变量的直方图(KDE 图)
来源:作者
b.连续变量的小提琴图
来源:作者
c.连续变量的热图
来源:作者
正如您在上面看到的,这些是使用 AutoViz 在一行代码中生成的不同图表。
让我们再分析一个数据集,在这个数据中,有 4 个属性描述了公司的广告支出和销售额。我们将通过创建上面使用的步骤来分析这一点,只是改变数据集。
2。广告数据集
在这里,我们将传递另一个参数 depVar,它是因变量,以便 AutoViz 相应地创建可视化。在这个数据集中,我们知道“销售额”是因变量。
df = AV.AutoViz('Advrtising.csv', depVar='Sales')
a.变量与销售额的散点图
来源:作者
来源:作者
“销售”取决于
同样,您将看到它将创建直方图、violin 图、热图等。将“销售额”作为因变量。
在调用 AutoViz 时,我们可以传递的其他一些参数有:
- sep,是分隔数据的分隔符,默认为’,'。
- target,它是数据集中的目标变量。
- chart_format 是显示的图表的格式。
- max_row_analyzed 用于定义要分析的行数
- max_cols_analyzed 用于定义要分析的列数。
在本文中,我们看到我们可以用一行代码可视化数据集,并且我们可以相应地找到数据集中的模式。
AutoViz 能够适应任何数量的不同数据环境,例如回归、分类甚至时间序列数据。继续使用不同的数据集探索这个库,并在回复部分分享您的经验。
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。 您也可以在我的*Github 中查看我在这里使用的代码和数据。*