如何用 spaCy 3 微调 BERT 变压器
如何为 NER 微调 BERT 的分步指南
照片由 https://unsplash.com/@jasonrosewell 阿丽娜·格鲁布尼亚在 Unsplash 上拍摄
自从 Vaswani 等人的开创性论文“注意力是你所需要的全部”以来,变压器模型已经成为 NLP 技术中最先进的技术。应用范围从 NER,文本分类,问答或聊天机器人,这项惊人的技术的应用是无限的。
更具体地说,BERT——代表转换器的双向编码器表示——以一种新颖的方式利用转换器架构。例如,BERT 用一个随机屏蔽的单词分析句子的两边来进行预测。除了预测掩码标记之外,BERT 还通过在第一个句子的开头添加分类标记[CLS]来预测句子的顺序,并通过在两个句子之间添加分隔标记[SEP]来尝试预测第二个句子是否跟随第一个句子。
伯特建筑
在本教程中,我将向您展示如何微调 BERT 模型来预测软件职位描述中的技能、文凭、文凭专业和经验等实体。如果你有兴趣更进一步,提取实体之间的关系,请阅读我们的文章关于如何使用 transformers 执行联合实体和关系提取。
微调变压器需要强大的并行处理 GPU。为此,我们使用 Google Colab,因为它提供免费的带有 GPU 的服务器。
对于本教程,我们将使用新发布的 spaCy 3 库来微调我们的转换器。下面是如何在 spaCy 3 上微调 BERT 模型的分步指南(视频教程此处)。代码和必要的文件可以在 G ithub repo 中找到。
数据标签:
为了使用 spaCy 3 对 BERT 进行微调,我们需要提供 spaCy 3 JSON 格式的训练和开发数据(参见这里的),然后这些数据将被转换成一个. spaCy 二进制文件。我们将提供 TSV 文件中包含的 IOB 格式的数据,然后转换为 spaCy JSON 格式。
对于培训数据集,我只标记了 120 个职位描述和大约 70 个职位描述,这些职位描述带有实体,如技能、文凭、文凭专业、和经验。
在本教程中,我使用了 UBIAI 注释工具,因为它具有广泛的特性,例如:
- ML 自动注释
- 字典、正则表达式和基于规则的自动注释
- 团队协作以共享注释任务
- 直接将注释导出为 IOB 格式
使用 UBIAI 中的正则表达式特性,我已经按照“\d.+模式对所有提到的体验进行了预注释。”如“5 年以上 C++经验”。然后,我上传了一个包含所有软件语言的 csv 字典,并分配了实体技能。预先注释可以节省大量时间,并帮助您最大限度地减少手动注释。
UBIAI 注释接口
关于 UBIAI 注释工具的更多信息,请访问文档页面和我之前的文章。
导出的注释将如下所示:
MS B-DIPLOMA
in O
electrical B-DIPLOMA_MAJOR
engineering I-DIPLOMA_MAJOR
or O
computer B-DIPLOMA_MAJOR
engineering I-DIPLOMA_MAJOR
. O
5+ B-EXPERIENCE
years I-EXPERIENCE
of I-EXPERIENCE
industry I-EXPERIENCE
experience I-EXPERIENCE
. I-EXPERIENCE
Familiar O
with O
storage B-SKILLS
server I-SKILLS
architectures I-SKILLS
with O
HDD B-SKILLS
为了从 IOB 转换到 JSON(参见文档这里,我们使用 spaCy 3 命令:
!python -m spacy convert drive/MyDrive/train_set_bert.tsv ./ -t json -n 1 -c iob
!python -m spacy convert drive/MyDrive/dev_set_bert.tsv ./ -t json -n 1 -c iob
在转换成 spaCy 3 JSON 之后,我们需要将 training 和 dev JSON 文件都转换成。spacy 二进制文件使用此命令(用您自己的命令更新文件路径):
!python -m spacy convert drive/MyDrive/train_set_bert.json ./ -t spacy!python -m spacy convert drive/MyDrive/dev_set_bert.json ./ -t spacy
模型培训:
- 打开一个新的 Google Colab 项目,确保在笔记本设置中选择 GPU 作为硬件加速器。
- 为了加速训练过程,我们需要在我们的 GPU 上运行并行处理。为此,我们安装了 NVIDIA 9.2 cuda 库:
!wget [https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64](https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64) -O cuda-repo-ubuntu1604–9–2-local_9.2.88–1_amd64.deb!dpkg -i cuda-repo-ubuntu1604–9–2-local_9.2.88–1_amd64.deb!apt-key add /var/cuda-repo-9–2-local/7fa2af80.pub!apt-get update!apt-get install cuda-9.2
要检查是否安装了正确的 cuda 编译器,运行:!nvcc -版本
- 安装空间库和空间转换器管道:
pip install -U spacy
!python -m spacy download en_core_web_trf
- 接下来,我们安装为 cuda 9.2 配置的 pytorch 机器学习库:
pip install torch==1.7.1+cu92 torchvision==0.8.2+cu92 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
- pytorch 安装后,我们需要安装为 cuda 9.2 调整的 spacy transformers,并更改 CUDA_PATH 和 LD_LIBRARY_PATH,如下所示。最后,安装 cupy 库,它相当于 numpy 库,但用于 GPU:
!pip install -U spacy[cuda92,transformers]
!export CUDA_PATH=”/usr/local/cuda-9.2"
!export LD_LIBRARY_PATH=$CUDA_PATH/lib64:$LD_LIBRARY_PATH
!pip install cupy
- SpaCy 3 使用包含所有模型训练组件的配置文件 config.cfg 来训练模型。在 spaCy training 页面中,您可以选择模型的语言(本教程中为英语)、要使用的组件(NER)和硬件(GPU)并下载配置文件模板。
用于培训的 Spacy 3 配置文件。来源
我们唯一需要做的就是为火车和 dev 填充路径。垃圾文件。完成后,我们将文件上传到 Google Colab。
- 现在我们需要用 BERT 模型需要的其余参数自动填充配置文件;您只需运行以下命令:
!python -m spacy init fill-config drive/MyDrive/config.cfg drive/MyDrive/config_spacy.cfg
我建议调试您的配置文件,以防出现错误:
!python -m spacy debug data drive/MyDrive/config.cfg
- 我们终于准备好训练 BERT 模型了!只需运行这个命令,培训就应该开始了:
!python -m spacy train -g 0 drive/MyDrive/config.cfg — output ./
页(page 的缩写)如果你得到错误 cupy _ back ends . CUDA . API . driver . CUDA driver ERROR:CUDA _ ERROR _ INVALID _ PTX:一个 PTX JIT 编译失败,只需卸载 cupy 并重新安装它,它应该可以修复这个问题。
如果一切正常,您应该开始看到模型得分和损失正在更新:
在 google colab 上进行 BERT 培训
培训结束时,模型将保存在文件夹“模型-最佳”下。模型分数位于 model-best 文件夹内的 meta.json 文件中:
“performance”:{“ents_per_type”:{“DIPLOMA”:{“p”:0.5584415584,“r”:0.6417910448,“f”:0.5972222222},“SKILLS”:{“p”:0.6796805679,“r”:0.6742957746,“f”:0.6769774635},“DIPLOMA_MAJOR”:{“p”:0.8666666667,“r”:0.7844827586,“f”:0.8235294118},“EXPERIENCE”:{“p”:0.4831460674,“r”:0.3233082707,“f”:0.3873873874}},“ents_f”:0.661754386,“ents_p”:0.6745350501,“ents_r”:0.6494490358,“transformer_loss”:1408.9692438675,“ner_loss”:1269.1254348834}
由于训练数据集有限,分数肯定远低于生产模型水平,但值得在示例工作描述中检查其性能。
用变压器提取实体
为了在示例文本上测试模型,我们需要加载模型并在我们的文本上运行它:
nlp = spacy.load(“./model-best”)
text = ['''Qualifications- A thorough understanding of C# and .NET Core- Knowledge of good database design and usage- An understanding of NoSQL principles- Excellent problem solving and critical thinking skills- Curious about new technologies- Experience building cloud hosted, scalable web services- Azure experience is a plusRequirements- Bachelor's degree in Computer Science or related field(Equivalent experience can substitute for earned educational qualifications)- Minimum 4 years experience with C# and .NET- Minimum 4 years overall experience in developing commercial software''']for doc in nlp.pipe(text, disable=["tagger", "parser"]): print([(ent.text, ent.label_) for ent in doc.ents])
以下是从我们的示例工作描述中提取的实体:
[("C", "SKILLS"),("#", "SKILLS"),(".NET Core", "SKILLS"),("database design", "SKILLS"),("usage", "SKILLS"),("NoSQL", "SKILLS"),("problem solving", "SKILLS"),("critical thinking", "SKILLS"),("Azure", "SKILLS"),("Bachelor", "DIPLOMA"),("'s", "DIPLOMA"),("Computer Science", "DIPLOMA_MAJOR"),("4 years experience with C# and .NET\n-", "EXPERIENCE"),("4 years overall experience in developing commercial software\n\n", "EXPERIENCE")]
仅使用 120 个培训文档就已经相当不错了!我们能够正确地提取大部分技能、文凭、文凭专业和经验。
有了更多的训练数据,该模型肯定会进一步改进,并产生更高的分数。
结论:
由于惊人的 spaCy 3 库,仅用几行代码,我们就成功地训练了一个功能性的 NER 变换器模型。请继续在您的用例上进行尝试,并分享您的结果。注意,您可以使用 UBIAI 标注工具来标注您的数据,我们提供 14 天免费试用。
一如既往,如果您有任何意见,请在下方留言或发送电子邮件至 admin@ubiai.tools!
在 Twitter 上关注我们
参考
- https://www.youtube.com/watch?v=Y_N_AO39rRg&t = 1s
如何用 NSP 微调伯特
使用变压器和 PyTorch 轻松微调
硬拉,伯特的最爱——作者图片
下一句预测(NSP)是 BERT 模型(另一个是掩蔽语言建模——MLM)后面的训练过程的一半。
尽管 NSP(和 MLM)被用来预先训练 BERT 模型,我们可以使用这些精确的方法来微调我们的模型,以更好地理解我们自己的用例中特定的语言风格。
因此,在本文中,我们将详细介绍如何获取非结构化的文本,并使用 NSP 对 BERT 模型进行微调。
培养
那么,我们如何使用 NSP 对模型进行微调呢?
首先,我们需要数据。因为我们本质上只是在连续句和随机句之间切换——我们可以使用几乎任何文本。我们不需要有标签的或特殊的数据。
这里,我们将使用马库斯·奥勒留的冥想,来源于这里并稍加预处理(干净版)。
首先,我们将导入/初始化并加载我们的文本数据。
我们需要在标记化之前对数据进行预处理,这样我们就可以得到一组随机和非随机的句子对。
NSP 预处理
首先,我们将创建一个随机句子的bag
——我们将根据句点字符对其进行拆分。
这就给我们留下了 1372 个句子样本。从这里开始,我们需要创建句子对,并标记它们是连续的句子对,还是随机的句子对。
我们可以在最后一个细胞的输出中看到我们创建的两对细胞。第一个标记为 1 并显示一个NotNextSentence
对,第二个标记为 0 并显示一个IsNextSentence
对。
标记化
我们的数据现在可以进行标记化了,这次我们将每个序列截断/填充到 512 个标记的相同长度。
在 token_type_ids 张量中,我们可以看到同样的 0 后面跟着 1 记号(分别是句子 A 和 B),后面跟着更多的 0 记号。这些用于指示填充标记。
我们还需要一个标签张量,它将对应于包含在label
变量中的值。我们的标签张量——和以前一样——必须是一个torch.LongTensor
。
输入管道
现在我们的输入张量已经准备好了,我们可以开始为训练构建模型输入管道。我们首先从数据中创建 PyTorch 数据集。
并初始化数据加载器,这是我们在训练中将用来将数据加载到模型中的。
培训设置
现在,在开始训练之前,我们设置最后几件事情。我们将模型移动到 GPU(如果可用),激活训练模式,并初始化我们的优化器。
我们使用 Adam with weighted decay 作为我们的优化器,这是训练变压器模型的常见选择,因为它减少了过度拟合的可能性(由于大多数变压器的巨大尺寸,这是一个常见的问题)。
训练循环
最后,我们可以进入训练循环。我们将训练几个时期来展示损失随时间的变化。
就这样,我们用 NSP 微调了我们的伯特模型!
这就是这篇关于用 NSP 微调伯特的文章。
NSP 有很多,但是概念和实现并不太复杂——但是功能非常强大。
使用我们在这里学到的知识,我们可以采用 NLP 中最好的模型,并对它们进行微调以适应我们更特定于领域的语言用例——只需要未标记的文本——通常是很容易找到的数据源。
我希望你喜欢这篇文章!如果你有任何问题,请通过 Twitter 或在下面的评论中告诉我。如果你想要更多这样的内容,我也会在 YouTube 上发布。
感谢阅读!
参考
[1] J .德夫林等人。艾尔。, BERT:语言理解深度双向转换器预训练 (2019),NAACL
如果你有兴趣了解更多关于 NSP 到底是如何运作的——看看这篇文章:
*所有图片均由作者提供,除非另有说明
如何为文本生成微调 GPT-2
使用 GPT-2 生成高质量的歌词
来源:https://unsplash.com/photos/gUK3lA3K7Yo
自然语言生成(NLG)在最近几年取得了令人难以置信的进步。2019 年初,OpenAI 发布了 GPT-2,这是一个巨大的预训练模型(1.5B 参数),能够生成类似人类质量的文本。
顾名思义,创成式预训练变形金刚 2 (GPT-2)基于变形金刚。因此,它使用注意力机制,这意味着它学会关注与上下文最相关的前几个单词,以便预测下一个单词(更多信息,请访问这里)。
本文的目标是向您展示如何根据您提供给它的数据,对 GPT-2 进行微调,以生成上下文相关的文本。
作为一个例子,我将生成歌词。这个想法是使用已经训练好的模型,根据我们的具体数据进行微调,然后根据模型观察到的情况,生成任何给定歌曲中应该遵循的内容。
准备数据
GPT-2 本身可以生成质量不错的文本。但是,如果您希望它在特定的上下文中做得更好,您需要根据您的特定数据对它进行微调。在我的例子中,因为我想生成歌词,所以我将使用下面的 Kaggle 数据集,它包含总共 12,500 首流行摇滚歌曲的歌词,都是英文的。
让我们从导入必要的库和准备数据开始。我推荐在这个项目中使用 Google Colab,因为使用 GPU 会让事情变得更快。
从第 26 行和第 34–35 行可以看出,我创建了一个小型测试集,删除了每首歌的最后 20 个单词。这将允许我将生成的文本与实际文本进行比较,以查看模型的执行情况。
创建数据集
为了在我们的数据上使用 GPT-2,我们还需要做一些事情。我们需要对数据进行记号化,这是将一系列字符转换成记号的过程,即把一个句子分割成单词。
我们还需要确保每首歌曲最多支持 1024 个令牌。
在训练过程中,SongLyrics
类将为我们做这些,为我们原始数据帧中的每一首歌。
模型的训练
我们现在可以导入预训练的 GPT-2 模型,以及令牌化器。另外,就像我之前提到的,GPT 2 号是巨大的。如果你试图在你的电脑上使用它,你很可能会得到一堆CUDA Out of Memory
错误。
可以使用的另一种方法是累加梯度。
这个想法很简单,在调用优化来执行梯度下降步骤之前,它将对几个操作的梯度求和。然后,将该总数除以累计步数,以获得训练样本的平均损失。这意味着更少的计算。
现在,最后,我们可以创建训练函数,它将使用我们所有的歌词来微调 GPT-2,以便它可以预测未来的优质诗句。
随意使用各种超参数(批量大小、学习率、时期、优化器)。
然后,最后,我们可以训练模型。
model = train(dataset, model, tokenizer)
使用torch.save
和torch.load
,你也可以保存你训练好的模型以备将来使用。
歌词生成
是时候使用我们全新的微调模型来生成歌词了。通过使用以下两个函数,我们可以为测试数据集中的所有歌曲生成歌词。请记住,我已经删除了每首歌的最后 20 个词。对于给定的歌曲,我们的模型现在将查看他的歌词,并得出歌曲的结尾。
对于整个测试数据帧,generate
函数准备生成,而text_generation
实际上完成生成。
在第 6 行,我们指定了一代的最大长度。我将其保留为 30,但这是因为标点符号很重要,稍后我将删除最后几个单词,以确保生成在句子的末尾结束。
另外两个超参数值得一提:
- 温度(第 8 行)。它用于衡量给定单词生成的概率。因此,高温迫使模型做出更多的原创预测,而低温则防止模型偏离主题。
- 顶 p 过滤(第 7 行)。该模型将按降序对单词概率进行排序。然后,它会将这些概率相加,直到 p,同时丢弃其他单词。这意味着该模型只保留最相关的单词概率,而不是只保留最好的一个,因为对于给定的序列,不止一个单词是合适的。
在下面的代码中,我简单地清理了生成的文本,确保它在句子的末尾(而不是中间)结束,并将其存储在测试数据集中的一个新列中。
性能赋值
有许多方法可以评估生成文本的质量。最受欢迎的指标叫做 BLEU。该算法根据生成的文本与现实的相似程度,输出一个介于 0 和 1 之间的分数。分数为 1 表示生成的每个单词都存在于真实文本中。
下面是为生成的歌词评估 BLEU 分数的代码。
我们获得了 0.685 的平均 BLEU 分数,相当不错。相比之下,没有任何微调的 GPT-2 模型的 BLEU 得分为 0.288。
然而,BLEU 也有其局限性。它最初是为机器翻译而创建的,只查看用于确定生成文本质量的词汇。这对我们来说是个问题。事实上,有可能产生高质量的诗句,使用与现实完全不同的词语。
这就是为什么我会对模型的性能做一个主观的评价。为此,我创建了一个小的 web 界面(使用 Dash)。代码可以在我的 Github 库中找到。
界面的工作方式是你给 app 提供一些输入单词。然后,该模型将使用它来预测下一对诗句应该是什么。以下是一些结果示例。
红色的是 GPT-2 模型预测的,给定黑色的输入序列。你看到它已经成功地产生了有意义的诗句,并且尊重了之前发生的事情的背景!此外,它会生成长度相似的句子,这对于保持歌曲的节奏非常重要。在这方面,当生成歌词时,输入文本中的标点符号是绝对必要的。
结论
正如本文所示,通过对特定数据进行 GPT-2 微调,可以相当容易地生成上下文相关的文本。
对于歌词生成,该模型可以生成尊重上下文和句子的期望长度的歌词。当然,可以对模型进行改进。例如,我们可以强迫它生成押韵的诗句,这是写歌词时经常需要的。
非常感谢你的阅读,我希望我能有所帮助!
包含所有代码和模型的库可以在这里找到:https://github . com/francoistamant/lyrics-generation-with-gp T2
对 Flask-vue.js 应用程序中的 CloudFlare 网关超时错误 524 进行故障排除
CloudFlare 如何通过 CloudFlare 网站工作
当我和曼努埃尔·古兹曼 (MSW R & D director)在测试一个 ML 应用程序时,出现了 524 网关超时错误,这个应用程序需要几分钟时间来生成结果,然后再将结果发送给用户。
我们发现应该增加 CloudFlare 中的超时限制来消除错误。
根据我们在谷歌搜索这个错误时发现的一些答案,它是不可能修复的(查看这个 StackOverflow 答案)。
经过一次头脑风暴,我们按照曼纽尔的想法解决了这个问题。
在本文中,我将与您分享我们为解决 Cloudflare 中的 524 网关超时错误而采取的所有步骤。
我将介绍如何解决这种类型的错误,更重要的是我们使用的代码片段。
什么是 524 网关超时错误?
524 网关超时错误是特定于 Cloudflare 的 HTTP 状态代码,表示与服务器的连接因超时而关闭。
下面是在 Cloudflare 支持网站中的定义
错误 524 表示 Cloudflare 成功连接到源 web 服务器,但在默认的 100 秒连接超时之前,源没有提供 HTTP 响应。企业客户可以将 524 超时增加到 600 秒。
在可操作的情况下,浏览器向应用程序所在的 web 服务器发送请求,然后将包含状态代码(即 200)和结果(ML 应用程序的预测)的回答发送回用户。如果与服务器的连接超过 100 秒而没有发回响应,用户将收到状态代码 524 和空内容。
CloudFlare 仅在企业计划上提供超时的定制。
GIF via GIPHY
解决方案
以下步骤描述了该解决方案
- 浏览器发送带有参数的第一个请求来启动后端进程(在我们的例子中,它是一个 ML 应用程序后端)。
2.应用程序后端为这个请求生成一个 ID
3.应用程序后端使用给定的参数启动(预测)过程
4.应用后端立即将响应发送回浏览器(无需等待预测过程完成),该响应包括请求 ID 和指示该过程当前正在工作的状态 202
5.浏览器收到答案,等待 10 秒钟(这取决于您的预测过程生成最终结果所需的时间),然后用相同的 ID 发出另一个请求,以检查预测过程是否完成(状态 200)
5.如果预测过程尚未完成,则重复步骤 4 和 5
就是这样!
您的浏览器将等待预测结果,并在准备就绪时获得后端答案。
GIF via GIPHY
摘要
与其他类型的应用程序相比,机器学习应用程序的响应时间通常较长。每当应答时间超过服务器连接超时限制时,就可以应用这种解决方案。
如果你有问题,欢迎在下面评论或通过邮箱或 Linkedin 提问。我会回答的。
如何修复特征偏差
公平和偏见
选择策略需要测试和权衡
特征偏差反映了人类判断中的测量误差或偏差,会对机器学习模型的公平性产生负面影响。这篇文章讨论了减轻这种偏见的五个潜在策略。最好的方法是上下文相关的。可解释性技术对于确保解决方案解决偏见并且不引入额外的不公平是必不可少的。这篇博客是我上一篇文章[1]的后续,那篇文章讨论了一种缓解方法的缺点。
当一个特征在不同的群体中有不同的含义时(如种族或性别类别),就会出现特征偏差。这可能反映了测量误差、自我报告的差异或有偏见的人类判断。以下是说明该问题的一些示例场景:
- 男性比女性更不可能报告癌症家族史,即使它确实存在[2];这种差异可能导致低估男性的风险。
- 在刑事累犯模型中使用以前的逮捕受到了批评,因为逮捕不能以统一的方式反映潜在的犯罪。例如,当发现犯罪或使用逮捕与警告存在种族差异时,模型可能高估某些群体的风险[3,4,5]。
- 低收入人群可能难以准确报告就业和收入,部分原因是当“收入”随时间变化或涉及多个来源时,很难简明地描述“收入”[6]。对于这个群体来说,这样的调查问题可能更模糊,因此更容易出错。
了解您的数据源至关重要。例如,如果收入特征直接取自工资单或纳税申报表数据,则特征偏差的风险可能较低,但如果是自我报告,则风险非常高。各组间缺失值或缺省值比率的差异也是危险信号。可解释性技术可以帮助识别潜在的风险特征[1,7]。
如果某个特性可能会有偏差,该如何处理?这篇文章包含了我对五种可能的缓解方法的想法。没有适合每种情况的完美技巧。减轻特征偏差可能需要尝试几种策略并彻底测试结果。
修改您的数据
减轻特征偏差的一个显而易见的策略是修复数据。在许多情况下,这可能很难或者不可能,但是值得考虑。与其他策略相比,数据修改降低了意外后果的风险。如果您不知道所有情况下的组成员,这也是唯一有效的技术。例如,在我处理过的数据中,通常只有一部分人的性别或种族/民族信息;可以使用这些案例来评估公平性,但是我们希望在缺少这些信息的情况下进行预测。
可以有许多方法来调整数据。有可能丢弃有偏见的特征或者用来自更可靠来源的信息来代替。如果您能够控制该功能,您也许能够实现直接修复。例如,如果偏见是由您管理的调查中的措辞引起的,那么更改调查并重新收集数据可能是最好的选择。如果特征偏差影响特征的极端值(例如,最高或最低收入的个人),阈值或分桶可能是有用的。
如果特征偏差与组成员关系密切,也有可能重新调整值,例如在组内使用四分位数。在最近的一篇论文[5]中测试了一种重新标度方法。发现表现不佳。
在模型中包含敏感特性(概述)
我在之前的博文[1]中详细讨论了这个策略。简而言之,一些人认为,在非线性模型中包含一个敏感特征会导致模型自动调整不同组之间特征贡献的相对强度[3]。然而,我的文章认为,这种交互效应并不能保证会被纳入模型,当敏感特征对预测做出“类似主效应”的贡献时,可能会出现意想不到的后果。
当群体成员与模型中的其他预测因素相关,或与结果有因果关系的未测量特征相关时,纳入敏感特征尤其危险。这使得它特别有可能作为一个主要的影响,或作为一个与意想不到的功能互动。
有可能使用各种可解释性技术来确定敏感特性包含具有预期的效果[1]。对于一些数据集来说,这种方法的优势可能超过其风险。
使用不同的模型类型
对于敏感特征包含技术,不同的模型类型可以更好地捕捉成对的交互。在我之前的文章[1]中,我尝试了两种方法:随机森林和 XGBoost,但是报告了随机森林的结果,因为它们更容易解释。在这里,我将讨论 XGBoost。虽然这两种模型类型都显示了风险,但是对于我的测试场景,XGBoost 通常比 random forest 更好地减轻了特性偏差。
简而言之,我的方法包括在公共贷款数据集中随机分配男性或女性“性别”,然后只减少女性收入特征的值。虽然“性别”对实际违约率没有影响,但收入预测中的特征偏差导致了对女性贷款违约的过度预测。然后,我的帖子测试了将女性身份添加到特征中会纠正偏见的假设。详见上一篇帖子[1];代码在 GitHub [8]上。
我检验了女性特征的加入是否使人口水平的模型结果更像实际违约率。对于随机森林,这种修正是微弱的[1]。对于 XGBoost,我看到了更大的共识:
实际违约率与随机森林(RF)和 XGBoost (XGB)模型(包括女性指标特征)的预测相比。
群体水平的差异在聚集 Shapley 值图中也很明显。这样的图可以识别出驱动组间差异的特征[7,9];在这里,我展示了女性与男性违约率的差异有多大是由每个特征造成的。我使用这些图来比较具有和不具有敏感特征的模型:
随机 forest(左)和 XGBoost(右)模型中,女性的聚合 Shapley 值与男性参考值的比较(不含和含女性指标特征)。图片作者。
首先关注灰色条,很明显,如预期的那样,特征偏差通过收入特征影响模型预测。这两种模型类型受到的影响相似。
当女性指标被引入模型时,差异是明显的(图中的橙色柱)。这个特性对 XGBoost 的补偿效果比随机森林模型大得多。这与 XGBoost 更好的群体水平偏倚校正是一致的。
仅对于 XGBoost,包括女性身份在内的模型的收入栏变化显著,表明这一特性的影响更大。这在全球重要性方面也很明显;在没有女性特征的情况下,收入是排列重要性第三重要的特征,但当包括女性地位时,它成为最重要的特征。考虑到特征偏差降低了收入和违约状态之间的相关性,这种增加是可以预期的。具有偏差特征的模型可能低估了收入的影响。
我不是这些算法的专家,但是我认为不同之处在于 XGBoost 提供了定向搜索,而随机森林模型覆盖了更多的解决方案。如果我们有一个与另一个要素相关的强预测器,随机森林将对涉及强预测器的一些解决方案和使用弱预测器的一些解决方案进行采样。但是,如果已经找到涉及较强预测器的解决方案,XGBoost 将不会包含较弱的预测器,假设较弱的预测器没有独立的影响。因此,XGBoost 模型倾向于依赖一小组更强的特性。XGBoost 模型中的收入特征较少被相关信息稀释,我们看到了更强的影响。
所有这些都表明,与随机森林相比,当模型中包含敏感特征时,XGBoost 可以更好地调整特征偏差。然而,群体水平的反应并不能保证个案的公平性。我们可能正在以一种非特定的方式调整偏见,例如通过统一降低所有女性的风险,而不仅仅是那些有偏见的收入使她们处于风险之中。
在示例场景中,女性地位应该只通过与收入的互动来发挥作用。任何“主效应类似”的行为本质上都是用刻板印象抵消特征偏差,而不是纠正偏差。我们可以使用累积局部效应(ALE)图来评估“主效应样”和二阶效应的程度[10]。对于随机森林模型,ALE 图显示了可比较的主效应和二阶效应,表明正在发生某种程度的 s 非特异性调整[1]。
对于 XGBoost,ALE 图显示了比随机森林[1]更强的对收入和女性地位的整体影响。然而,单向和双向幅度也是可比较的,表明“主要效应相似”和交互作用贡献是相似的:
左图:XGBoost 模型中女性特征的单向 ALE 图。右图:模型的收入和女性地位的双向 ALE 图。作者图片
通过检查 XGBoost 模型中的树,我确认存在涉及女性特征但不涉及收入特征的决策路径。因此,陈规定型风险依然存在。
与随机森林模型不同,我看到了 XGBoost 模型包含虚假交互的证据。当弗里德曼的 H 统计[11]被用于筛选互动时,我发现女性地位与贷款金额之间有一个相对较大的值。ALE 图也表明发生了这种相互作用(未显示)。贷款金额与收入相关(收入无偏时 Spearman 系数为 0.44,收入有偏时为 0.36)。通过引入这种相互作用,XGBoost 模型可能会对女性的相关特征进行加权,以补偿不可靠的收入。但是,这是对特征偏差的间接校正,在某些情况下可能不准确。
当敏感特征被合并到 XGBoost 模型中时,诸如误报率和漏报率的公平性度量得到改善。例如,对于不包括女性状态的模型,女性的假阳性率比男性高近 31%,当加入该特征时,假阳性率下降到约-2%。对于有和没有敏感特征的模型,假阳性的原始比率是相似的。相反,对于随机森林测试,敏感特征的添加显著增加了总体假阳性率;尽管男性和女性之间的差距有所缩小,但两种性别的错误率都有所上升。
根据修正不足的程度以及对公平性和性能指标的适度或不存在的改进,我已经得出结论,对于我的随机森林示例来说,增加一个敏感特性可能并不比没有好[1]。然而,XGBoost 模型的总体水平度量的巨大改进可能证明这个解决方案是正确的,至少对于我的场景是这样。
总之,对于我的简单示例,与随机森林模型相比,使用 XGBoost 模型提高了敏感特征包含技术的有效性。然而,刻板印象的风险仍然存在,我看到了意想不到的互动。对于这个项目,我只测试了两种模型类型。可能其他类型会更好地结合成对的相互作用。
创建一个明确的交互术语
对数据集的一个可能的修改是创建一个由收入和女性地位产生的特征;对于所有男性,特征值为 0,对于女性,与年收入相同。我们希望用显式交互建模能够降低类似主效应贡献的风险。然而,在一个基于树的模型中,当分割点接近零时,交互特性可以很容易地作为一个指标,所以不清楚这种好处是否会出现。
当我在随机森林模型中测试交互功能时,与使用功能指示器相比,人口统计奇偶校验略有改善。预测违约的男女差距从 1.1%降至 0.8%;预测仍然是不准确的。在我看来,与使用雌性指标的模型相比,具有显式交互特征的随机森林模型的公平度量的行为稍好一些。假阳性率提高,男女差距缩小。假阴性总体上升,但变得更加平等。
对于 XGBoost,当使用交互项而不是女性指标时,在人口统计均等或公平指标方面没有有意义的改善。
在这种情况下,识别女性地位的潜在主要影响是困难的,因为我们没有一个方便的 ale 图来描述相互作用的“性别部分”。对树的检查提供了一些信息,因为决策路径不包含收入,但是在具有非常低的阈值的收入相互作用上的分裂很可能反映类似主效应的贡献或虚假的相互作用。
对于随机森林,不涉及收入但包含阈值小于 5000 美元的交互特征的决策路径在平均树中出现约 11 次。这是路径的 1.6%,或略低于使用女性指标的模型中出现的 2.4%[1]。模型的 XGBoost 版本也显示了这样的决策路径。
总的来说,收入-女性互动特征的纳入产生了一个在很大程度上类似于涉及女性地位指标的模型。对于随机森林的情况,交互解决方案的性能稍好,但是仍然存在严重的修正不足和意外后果的风险。此外,交互特征解决方案更难解释。
为每个组建立一个单独的模型
另一个建议的特征偏差解决方案是按组创建单独的模型[3]。我没有测试这个选项,但是我希望它能够很好地修复我的场景中的特性偏差。然而,这个修复在很大程度上取决于我如何设置我的例子。
首先,我在男性和女性群体中都有合理的计数。在真实数据中,一些组可能被严重低估,在这种情况下,对于低容量组,模型可能非常不同,或者表现不佳。数据中的表示级别对于其他解决方案也很重要,但是单独的模型特别容易受到影响。
像敏感特性合并技术一样,在比我的测试更复杂的场景中,单独的模型变得很危险。在我的例子中,女性地位仅通过收入特征起作用,因此我可以合理地预期,如果我构建两个模型,除了该特征之外,它们将非常相似。然而,如果女性地位与其他特征相关,或者与数据中不存在的因果关系相关,我们可能会得出不同群体的非常不同的模型,这可能很难证明。
最后的想法
我已经简要地讨论了减轻特征偏差的五种策略。我希望并想象还有其他我没有考虑到的技术(请在评论中分享)。
正如我在以前的文章[1]中所写的,对于功能偏见,没有“免费的午餐”。某些解决方案在某些环境下可能不可行,数据集特征和模型类型强烈影响有效性。对于一个测试场景,我展示了在 XGBoost 中包含敏感特性比在随机森林模型中更好的缓解。此外,我发现对于随机森林来说,引入交互项比敏感特性包含稍微好一点,但是对于 XGBoost 来说,这两种方法是等效的。机器学习算法的细节可能有助于提出解决方案,但在这一点上,我可能会依靠试验、错误和测试来选择技术。
令人欣慰的是,可解释性技术和公平性度量可以帮助回答如下问题:解决方案在多大程度上纠正了特征偏差?谁可能受益或面临风险?哪些功能会受到我们的更改的影响?这种技术比什么都不做好吗?这样,即使没有完美的解决方案,我们也可以做出明智的决定并预测负面后果。
参考
[1] V. Carey,特征偏见没有免费的午餐 (2021),走向数据科学
[2] M. Sieverding、A.L .阿波加斯特、S. Zintel 和 C. von Wagner,《自我报告的癌症家族史中的性别差异:综述和二次数据分析》 (2020),癌症医学,9:7772–7780。
[3] S. Corbett-Davies 和 S. Goel,《公平的度量和误度量:对公平机器学习的批判性评论》 (2018),工作论文(arXiv.org)。
[4] Will Douglas Heaven,预测性警务算法是种族主义者。它们需要被拆除 (2020),麻省理工学院技术评论
[5]Jennifer L . Skeem 和 Christopher Lowenkamp,使用算法解决预测累犯中固有的权衡问题 (2020),行为科学&法律,即将出版
[6] Nancy A. Mathiowetz、Charlie Brown 和 John Bound,第 6 章:低收入人口调查中的测量误差 (2002 年),福利人口:数据收集和研究问题,由 Michele Ver Ploeg、Robert A. Moffitt 和 Constance F. Citro 编辑
[7]斯科特·伦德伯格(Scott Lundberg),解释对数据科学公平的衡量 (2020)。
[8]诉凯里。GitHub 库,【https://github.com/vla6/Stereotyping_ROCDS】T2。
[9] V. Carey,公平指标不会把你从刻板印象中拯救出来 (2020),走向数据科学。
[10] C. Molnar, 5.3 累积局部效应(ALE)图 (2018),可解释的机器学习:使黑盒模型可解释的指南。
[11] C. Molnar, 5.4 特征交互 (2018),可解释的机器学习:使黑盒模型可解释的指南。
如何挫败欺诈者破坏您的欺诈模型
作者图片
监控、减轻和预防欺诈的洗钱可观察性最佳实践
每年,欺诈给全球经济带来超过 5 万亿美元的损失。除了对个人受害者造成严重的个人损失之外,欺诈还会以收入和生产力损失以及声誉和客户关系受损的形式影响企业。人工智能从业者站在这场战斗的前线,构建和部署复杂的人工智能模型来检测欺诈行为,这些欺诈行为每年为组织节省了数十亿美元。
当然,这是一项具有挑战性的任务。从金融服务到医疗保健、保险、技术和旅游,欺诈的形式和攻击媒介多种多样。事实上,在当今世界,随着数据泄露在大型企业中变得越来越常见,被盗的凭据在暗网上出售,黑客利用勒索软件攻击从关键基础设施到本地连锁医院的所有目标。
为什么在欺诈检测中使用 ML 监控和可观察性?
欺诈持续存在的部分原因是在现实世界中识别欺诈的复杂性。不断演变的滥用模式和不平衡的数据集很容易挫败僵化的基于规则的系统。由于这种脆弱性,企业和政府很久以前就在异常检测、欺诈预防和其他反滥用投资领域采用了 ML 技术。然而,在不受监控的情况下,欺诈者甚至能够在几周内使幼稚的 ML 模型失效。
随着犯罪分子继续重新发明 对抗性 技术来利用生产中的模型,对异常情况的监控变得对业务和时间都很重要。通过检测基线和生产分布之间的偏差,并检查特征和群组表现,团队可以主动识别问题并重新训练模型,以最大限度地减少损失。
例如,一家信用卡公司在检查推断分布的差异时,可能会发现欺诈模型在生产中的假阳性远远多于验证基线,导致数百万次合法购买在销售点被拒绝,并使客户转而使用其他卡。或者,一个研究总体准确性下降的 ML 团队可能会发现,相对于在训练数据中占主导地位的大额购买,欺诈模型在预测小额交易方面不太好。不管是什么问题,监控可以帮助 ML 团队防止损失,维护来之不易的品牌忠诚度和市场份额。
监控和可观察性之所以重要,还有另一个原因:在金融和医疗保健等受到严格监管的行业,法律要求自动系统提出的任何索赔都要有 ML 模型的透明度。除了遵从性,组织还需要可解释性来反思和理解为什么一个模型做出了一个特定的预测,以确保更广泛的治理、公平和减少偏差。
欺诈特有的挑战
在深入研究解决生产中欺诈模型问题的最佳实践之前,了解处理欺诈数据的一些常见挑战以及可能出现的问题会有所帮助。
即使你觉得你已经很好地处理了数据本身,许多问题经常困扰着反滥用 ML 团队。以下是一些常见的挑战:
- **不平衡的数据集。**一般来说,欺诈只占现实世界交易的一小部分。例如,在医疗保健行业,欺诈估计占总交易的 3%。由于在训练和验证阶段可获得的关于实际活动或感兴趣的观察(即医疗保健中的向上编码或伪造处方)的数据较少,如果没有适当的对策(如数据向上采样),模型在现实世界中的表现可能会很差。
- 误导传统评估指标。如果他们的模型达到 99%的准确率,人们可能会认为它表现得非常好。但是,如果您的模型发现不到 1%的欺诈交易,这种误导性的指标实际上可能会掩盖您的模型仍然(在最坏的情况下)遗漏每个可能的欺诈交易的事实。由于大多数最大似然算法都是为了最大化精度和减少误差而优化的,所以当类间样本平衡且相等时,它们往往工作得最好。欺诈很少(如果有的话)出现这种情况,例如,欺诈性信用卡交易可能占所有交易的 0.5%,但每月仍会超过 1 亿美元。
- **功能受限/敏感。**交易数据也可以被限制。在医疗保健或金融服务等行业,法规和合规性措施会导致敏感或个人身份信息(PII)从数据源中被篡改,以将用户从交易中抽象出来。例如,信用卡交易可能限于其最基本的细节(即交易 ID、日期/时间、终端、交易金额、位置等)。
- 并非所有的推论都同等重要。错误分类的欺诈交易(假阴性——对确实是欺诈的交易预测“不是欺诈”)通常比错误分类的合法交易(假阳性——对不是欺诈的交易预测欺诈)成本更高。在信用卡欺诈中,后者对客户来说是一种轻微的不便——他们通常可以通过短信确认信用卡收费是否合法——而前者是一种直接的经济损失。
作者图片(阿里泽·艾)
欺诈模型可观察性的最佳实践
一旦您设置了基准和监视器,手头的任务就变成了识别问题的根本原因,并随着威胁的实时发展而快速响应。虽然每个行业和组织的模型和指标都略有不同,但在确定哪些方面不如预期以及如何应对方面有一些共性。
重要指标
如上所述,在评估您的欺诈模型的性能时,准确性可能会产生误导。一些重要的观察指标包括:
- 回忆 。您的模型检测到多少欺诈可能具有指导意义,提供了一个窗口来了解您的模型对现实世界威胁的影响。或者,您可以监控您的模型的假阴性率(召回的倒数)。
- https://arize.com/glossary/false-negative/假阴性率。假阴性率衡量模型未能准确预测的欺诈(归类为非欺诈)。这是一个关键的性能指标,因为就直接财务损失而言,它对组织来说是最昂贵的,会导致退款和其他被盗资金。T4 估计,金融服务行业每年因欺诈造成的损失高达 1.5 万亿美元。
- 假阳性率 。假阳性率——或模型预测实际上并不欺诈的交易欺诈的比率——也很重要,因为给客户带来不便有其间接成本,无论是在医疗保健领域,患者的索赔被拒绝,还是在信用卡领域,客户延迟购买食品杂货。根据 Forrester 和 Adobe 的一项研究,重视客户体验的企业创造的客户终身价值是其他公司的 1.6 倍。
性能下降
识别导致性能下降的切片(或特性和值的组合)至关重要。通过过滤各种低性能特征/价值片段来深入分析您的模型的性能,有助于发现欺诈模式、欺诈者来源和隐藏的模型漏洞。
回到之前的信用卡欺诈的例子,业绩突然下降背后的切片可能是小额欺诈费用的激增(
In each case, having an ML observability platform that not only monitors your performance metrics but also proactively surfaces feature performance heatmaps can be the difference between patching costly model exploits in hours versus several days.
漂移的重要性
作为一名 ML 从业者,随着时间的推移,你可能会遇到漂移或分布变化。监测和排除漂移是每个从业者工具箱的重要组成部分(作为参考,这里有一个关于如何排除模型漂移的深度探讨,由达美航空的艾华撰写)。
特别是在欺诈中,策略总是在不断变化,因此考虑偏差以确保您的模型保持相关性非常重要。识别各种模型环境和版本之间的特征、模型和实际偏差有助于识别欺诈模式、数据质量问题和异常分布行为。
为了具体说明这一点,让我们回到信用卡的例子,在这个例子中,一家公司发现当地零售商的小额欺诈交易突然激增。通过检测数据形状的变化(在这种情况下,是交易规模的变化),从业者可以积极主动,在新策略造成大范围损失之前将其消灭。这在像身份盗窃这样的金融欺诈中尤其重要,因为受害者甚至可能在几个月后才意识到并报告这一活动。
继续以信用卡欺诈为例,下面是一些异常分布变化可能意味着什么的指南,具体取决于它们在哪里发生以及现实世界的场景:
救命!我们看到…
预测漂移
**可能的漂移相关性:欺诈预测的涌入和激增可能意味着您的模型受到攻击!你分类的欺诈比你预期在生产中看到的要多得多,但是(到目前为止)你的模型在捕捉这一点上做得很好。让我们希望它保持这种方式。
**现实世界的场景:一个健康服务提供商的黑客攻击导致身份盗窃和信用卡号在黑暗网络上出售的激增。幸运的是,犯罪分子在他们的利用中不够新颖,以避免被现有的欺诈模型抓住。
实际漂移(无预测漂移)
**可能的漂移相关性:欺诈实际值的大量涌入,而预测值的分布没有发生变化,这意味着欺诈者在你的模型中发现了漏洞,而且他们正在逍遥法外。尽快排除故障并修复您的模型,以避免任何更昂贵的退款。
**真实世界场景:一个全球犯罪团伙利用的新战术预付借记卡将失业欺诈推至历史新高,导致根据 COVID 之前或更传统的信用卡数据训练的欺诈模型性能下降。
特征漂移
**可能的漂移相关性:新的和/或现有特征值的涌入可能是季节变化(税收或假日季节)的指示,或者在最坏的情况下与欺诈利用相关;使用“随时间推移的漂移”堆叠在“随时间推移的性能指标”图表的顶部,验证是否存在任何相关性。
**现实世界的情景:一个比往常更早的假日购物季开始了,购票量比往年更多。这可能是创纪录的零售需求和不断变化的消费者行为的迹象,也可能是一种新型欺诈利用(或两者兼有)。
结论
随着欺诈不断演变,甚至在当今时代以新的形式出现,损失的可能性很高,数据科学和 ML 团队制定一个可观察性战略来捕捉、监控和排查生产中的欺诈模型问题至关重要。通过采用一种既能被动监控关键指标又能主动测量偏差的方法,反滥用反洗钱团队可以提前发现潜在问题,腾出时间专注于最复杂的威胁。作为补充参考,这里的是ML 可观察性平台如何帮助客户处理欺诈监控。
联系我们
如果这个博客引起了你的注意,并且你渴望了解更多关于机器学习可观察性和模型监控,请查看我们其他的博客和 ML 监控上的资源!如果您有兴趣加入一个有趣的 rockstar 工程团队,帮助模型成功生产,请随时联系我们,并在此处找到我们的空缺职位!
如何使用开源软件预测 Shopify 商店的采购订单
使用 MindsDB 中的开源集成机器学习和开源数据集成平台Airbyte预测 Shopify 店铺指标。
作者图片
随着数据量呈指数级增长,对于专注于电子商务的企业来说,尽可能快速高效地利用这些数据至关重要。机器学习代表着一种颠覆,它可以提高预测能力,增强人类对价格、分类和供应链优化、库存管理、交付管理和客户支持等用例的决策能力。在这个“如何做”指南中,我们将提供一步步的说明,向您展示如何使用开源数据集成平台 Airbyte 和运行在任何数据库之上的开源 AutoML 框架 MindsDB 简单而廉价地将机器学习集成到现有的 Shopify 帐户中。
我们的指南将由两部分组成:
- 使用 Airbyte 提取您的 Shopify 数据并将其加载到数据库中。在我们的例子中,我们将使用开源的 DB PostgreSQL,但是它也可以是您选择的不同的数据库。
- 使用 MindsDB 自动构建和训练用于预测采购订单的机器学习模型。
我们开始吧!
我们将假设您已经通过 Docker 设置了 Airbyte。如果没有,这里有一个链接,链接到一篇介绍如何做的文章。
步骤 1:用 Airbyte 将数据从 Shopify 复制到 PostgreSQL
a.设置 Airbyte Shopify 连接器
Airbyte 的 Shopify 连接器将允许我们获取你的 Shopify 数据,并将其存储在数据库或数据仓库中。对于本文,我们将把通过 Shopify 连接器获得的数据存储到 PostgreSQL 数据库中。
Airbyte Shopify connector 能够将放弃的结账、收藏、自定义收藏、客户、元字段、订单、产品和交易同步到您选择的目的地。
让我们从启动 Airbyte web 应用程序开始。首先,进入您克隆 Airbyte 库的目录,然后在您的 terminal:中运行以下代码
docker-排版
然后,在浏览器中访问 http://localhost:8000 以查看 Airbyte 仪表盘。
在源部分,点击仪表板右上角的 +新源按钮,添加一个新源。
在新屏幕中,输入信号源的名称——我们称之为shopify——source,,但你可以随意命名。然后,在源类型下拉列表中,选择 Shopify。
作者图片
选择 Shopify 连接器会提示 Airbyte 加载 Airbyte Shopify 连接器需要的配置参数。如果是第一次选择 Shopify 连接器,这可能需要一段时间。Airbyte 将在幕后从 Docker Hub 中提取 Shopify 连接器图像。
当它完成提取图像时,您将看到以下内容:
作者图片
让我们来看看 Shopify 连接器需要的参数:
- 商店:这将是您想要从中复制数据的 Shopify 上的商店名称。因此,如果你的店铺的网址是https://airbyte.myshopify.com,你的店铺名称将是 airbyte 。
- start_date :这将是您希望 Airbyte 开始复制的日期,格式为 YYYY-MM-DD。
- api_password :这将是你在 Shopify 仪表盘上创建的私人应用的密码。
商店名称和开始日期可以很容易地填写,但 api_password 要求你在 Shopify 上创建一个新的私人应用程序,以防你还没有。让我们在 Shopify 上创建一个私人应用程序,并获取设置 Airbyte Shopify 连接器所需的密码。
b.创建 Shopify 私人应用程序
要创建一个 Shopify 私人应用程序,请登录您的 Shopify 仪表盘,点击侧边栏菜单中的应用程序。
作者图片
然后,点击页面底部的管理私人应用链接。如果您之前没有启用私人应用程序,您将看到一个屏幕来启用它。点击启用私人应用开发按钮。
作者图片
您将被带到一个屏幕,接受 Shopify 关于私人应用程序开发使用的条款。如果您同意,请勾选复选框,然后再次点击启用私人应用程序开发。
启用私人应用程序开发后,您将被重定向到一个屏幕,在此您可以创建私人应用程序。
点击创建私人应用按钮开始。
在 App 详情部分,填写私人 App 名称和紧急开发者邮箱。
作者图片
转到管理 API 部分,并执行以下操作:
- 点击显示非活动管理 API 权限下拉菜单,并在列表中找到订单 API 。然后,从选择框中授予读取权限。
- 找到 Shopify 支付争议和 **Shopify 支付支出,**并批准这些支出。
- 最后,点击保存按钮保存您的新私人应用。
您将看到一个确认模式,只需点击创建应用按钮,确认创建私人应用。就是这样!现在我们只需要获取私有 app API 密码。
在同一页面上,向下滚动到管理 API 部分,复制您的私有应用 API 密码。
然后,转到 Airbyte web UI 仪表板,提供带有您刚才复制的密码的 Shopify 连接器配置表单。
在你停止设置 Shopify 的 Airbyte UI 中,粘贴你从 Shopify 复制的密码,然后点击设置源。
c.设置目的地
一旦您成功设置了源,Airbyte 将导航到目的屏幕。点击右上角的添加目的地按钮。在下拉列表中,点击 +添加新目的地。
Airbyte 将验证源,然后显示一个表单来输入目的地名称和类型。输入 shopify-destination 作为名称,选择 Postgres 作为目的地类型。为了设置我们的 Postgres 目的地,我们将通过 Docker 旋转一个 Postgres 容器。因此,在您的终端中运行以下命令:
docker run-RM-name shopify-d b-e POSTGRES _ PASSWORD = PASSWORD-v $ HOME/docker/volumes/POSTGRES:/var/lib/PostgreSQL/data-p 2000:5432-d POSTGRES
请注意,上面代码片段中的**-v $ HOME/Docker/volumes/Postgres:/var/lib/PostgreSQL/data**位对于持久存储数据非常重要,因为默认情况下,Postgres Docker 容器中的数据是短暂的,当容器被销毁时会丢失。您可以在本地机器上创建目录(因为我们假设它不存在)。在剥离 Docker 容器的命令之前,运行以下命令来创建它:
mkdir-p $ HOME/docker/volumes/postgres
验证容器正在运行。然后在 Airbyte 仪表板中填写登录凭证。
作者图片
在 Airbyte 成功设置目标之后,您将看到要复制到目标上的数据的模式,以及指定与源同步频率的下拉列表。在本教程中,我们选择了手动,因为我们想直接控制同步发生的时间**。**
然后点击设置连接按钮。
Airbyte 会将您导航到目标页面,您可以点击 Launch 按钮开始复制。要监控同步,您可以单击目的地名称来查看同步过程和状态。
作者图片
一旦 Airbyte 将数据复制到 Postgres 数据库,同步的状态将变为成功。要确认同步成功,您可以运行以下命令:
docker exec shopify-source psql-U postgres-c " SELECT COUNT(*)FROM public . transactions;"
上面应该返回事务表上所有记录的计数。
步骤 2:使用 MindsDB 预测采购订单
下一步是对我们导入数据库的商店数据进行预测分析。在此之前,我们需要首先安装 MindsDB。有几种安装方法,如文档中所述。我们的建议是始终使用 Docker ,因为它封装了运行 MindsDB 的所有依赖项。要下载最新的生产映像,请运行以下命令:
码头工人拉动 mindsdb/mindsdb
或者,如果您的机器上预装了 Python,您可以使用 pip 来安装最新的 MindsDB 版本。为此,创建一个新的虚拟环境并运行:
pip 安装 mindsdb
然后,启动服务器运行:
docker run-p 47334:47334 minds db/minds db
或者,如果您已经安装了 pip run:
python3 -m mindsdb
最后,MindsDB Studio 应该会在您的默认浏览器上自动启动http://127 . 0 . 0 . 1:47334/。
a.连接 MindsDB 和 PostgreSQL
有三种方法可以使用 MindsDB。第一种是通过名为 MindsDB Studio 的图形用户界面。第二种方法是使用 REST APIs。为了简化集成,您可以使用我们的 Python 或 JavaScript SDKs。第三种方法是通过执行 SQL 语句在数据库内部直接完成。
在本教程中,我们将通过 MindsDB Studio 解释一切,以便您可以直观地跟随。我们还将共享 SQL 查询,以防您想直接在数据库内部进行测试。
要从左侧导航菜单连接 MindsDB 和 PostgreSQL,请转到 integrations 并单击添加数据库按钮**。**在这里,您需要填写连接到 PostgreSQL 数据库的所有参数。
作者图片
连接到 PostgreSQL 所需的参数是:
- 支持的数据库:从下拉列表中选择 PostgreSQL。
- 集成名称:姑且称之为 ShopifyData。
- 数据库:保存 shopify 数据的数据库名称。
- 主机:PostgreSQL 主机名或 IP 地址。
- 端口:PostgreSQL 端口(默认为 5432)。
- 用户名:有权访问数据库的用户。
- 密码:上述用户的密码。
填写表格后,点击连接。您现在已经成功连接到 PostgreSQL。下一步是从您希望用于模型训练的数据中创建一个数据源。
b.订单数据
让我们来概括一下这些数据。在我们将数据导入 PostgreSQL 之后,Airbyte 在公共模式中创建了不同的表。如果您列出这些表,您将会注意到,在导入数据之前,Airbyte 已经创建了用于订单、**订单 _ 退款、产品、交易、已放弃 _ 结账、**和其他一些表。
作者图片
预测未来订单数量的重要数据在订单表中。让我们 从命令中选择吧;* 这样我们就可以看到订单列表。表格中有 30 多列,但我们将只关注:
- processed_at:订单处理的时间。
- 供应商:例如,如果你卖鞋,供应商可能是耐克、阿迪达斯、万斯、匡威等。
- 财务 _ 状态:我们将只选择等待或已经支付的订单。
除了 Shopify 数据,您还可以使用许多其他选项来进行预测分析。为了保持展示简单,我们将重点关注上述 3 个参数,并训练一个模型来估计商店在下一阶段将收到的订单数量。
转到数据库集成仪表板,点击新建数据集。在弹出窗口中,您将能够选择数据来训练模型:。
作者图片
让我们概述一下我们的选择查询:
SELECT processed _ at::date AS order _ day,COUNT(*) AS orders,(unnest(ARRAY(SELECT jsonb _ ARRAY _ elements(line _ items)-> > ’ vendor ‘))FROM orders WHERE financial _ status IN(’ pending ‘,’ payed ')GROUP BY vendor,order _ day;
该查询将选择处理订单的时间,并将其转换为 YY:MM:DD 格式(不包括当天的时间,因为我们将按每天的频率进行预测)。然后,从包含 JSON 格式的产品信息的 line_items 列中选择供应商。
最后,合计每个供应商每天的订单数量。
点击 CREATE ,MindsDB 将创建一个名为 ShopifyOrders 的新数据源。
作者图片
如果预览数据,您将看到按供应商分组的每日订单数。上面的例子显示了鞋子和玩具商店的订单。它将过去 5 年不同供应商的每日订单分组,如耐克、VANS、阿迪达斯、乐高、美泰等。
我们现在有连接到 MindsDB 的数据。接下来的步骤是:
- 执行数据分析
- 训练一个 ML 模型
- 通过查询模型来预测未来订单的数量
c.数据分析
在数据集仪表板中,点击质量按钮,以便 MindsDB 可以开始其自动化数据分析程序。在后台,它将迭代每个数据记录,如果数据中有潜在的偏差或异常值,将显示警告。如果您单击某些列,它将显示特定列的附加信息,如数据类型、是否有任何缺失值、不同值的数量,如果有潜在偏差,它将显示更多信息。
作者图片
通过执行数据分析,您将获得有关数据的更多信息,并决定是否信任 MindsDB 显示的警告以对其采取行动(请记住,好的数据集对于好的 ML 模型至关重要),或者您可以忽略它们并继续进行模型训练。
d.模特培训
要训练新模型,点击左侧导航栏中的预测器选项卡,然后点击训练新模型按钮**。**在 pup 表单中,您需要输入所有必需的信息,以便 MindsDB 可以开始训练时间序列预测模型:
- FROM: 从中选择数据的数据源。在这个例子中,ShopifyOrders。
- **预测器名称:**新模型的名称,例如 shopify_orders。
- **只选择要预测的列:**我们要预测的目标变量。在本例中,订单数量被计算。
- **选择要为训练移除的列:**我们要从模型训练中排除的列。您可以将此字段留空,因为我们训练的模型只有 3 列。
- **样本误差范围:**计算[0.0–1.0]范围内的误差范围。将其留空,因此将使用默认值 0.01。
- **停止训练后:**用于测试目的,加速模型训练。除非您有时间限制,否则请留空。
- 使用 GPU: 在 GPU 或 CPU 上训练模型。如果您有 GPU,请选择此复选框以获得训练和查询阶段的加速。
- 这是一个时间序列预测问题吗?:在复选框中选择是。
- Order by: 数据排序所基于的列。选择已处理 _at。
- **分组依据:**对数据中的实体进行分组所依据的列。我们将按供应商分组,有效地分析每一个不同的玩具和鞋子供应商,以产生准确的预测。根据维度数据的分组方式,这可能会产生从几个到几百个(或者更多!)MindsDB 预测器将学习预测的时间序列。
- **未来预测数:**使用默认值 1。这意味着我们的模型将被训练来预测第二天应该到来的订单量。
- **使用先前目标:**使用目标列的先前值作为模型的时序特定部分的附加信息。保持选中状态。
- **回顾窗口:**进行预测时要回顾的行数。将其设置为 10,以便在预测时考虑最近 10 天的订单量。
作者图片
要开始培训,点击培训。
或者,您可以通过运行以下查询,直接在数据库中自动训练模型:
将值(’ shopify_orders ‘,’ orders ‘,’ SELECT processed _ at::date AS order _ day,COUNT(*) AS orders,(unnest(ARRAY(SELECT jsonb _ ARRAY _ elements(line _ items)-> > " vendor)))作为订单的供应商,其中 financial_status in ("pending “,” payed ")group by vendor,order _ day;');
要获得更多关于插入查询的信息,请访问 MindsDBs PostgreSQL docs 。
MindsDB 将立即启动自动化机器学习管道,推断每一列的数据类型,为每一列实例化一个编码器,以获得数据的信息性中间表示,然后使用它来训练一个基于递归神经网络和梯度助推器混合的预测模型。最后,它将执行模型分析,以提供关于您可以预期预测有多好的见解。
当该程序完成时,状态将变为完成。接下来,单击预览按钮。模型预览面板提供了与已训练模型相关的细节。第一部分展示了模型的准确性以及 MindsDB 如何进行数据集分割。
作者图片
您可以看到,shopify_orders 模型的预测准确率约为 74%,这意味着在 74%的情况下,订单的真实数量落在保留验证数据集的预测范围内。
下一节显示了列的重要性,MindsDB 从 0 到 10 对这些列进行评级,0 表示最不重要,10 表示最重要,以便做出正确的预测。给定我们使用的设置,我们的时间序列预测器需要所有三列来训练,因此这部分分析不适用于该预测器。
最后一部分显示了一个混淆矩阵,如果您将鼠标悬停在该矩阵上,您将看到模型正确预测订单数量的时间百分比,或者模型错误分类订单数量的时间百分比。一个完美的预测者会显示一条又细又直的对角线。在这种情况下,对角线仍然是结构良好的,这加强了报告的 74%的准确性。
作者图片
e.预测订单数量
模型训练成功。怎么用它来预测订单数量呢?从左侧导航选项卡中点击查询选项,然后点击新建查询按钮**。**
假设我们要预测" 商店下周五将获得多少个逆向订单? 。”
在下拉列表中,选择供应商(例如 Converse)和日期(例如 2021 年 6 月 18 日),我们希望预测该日期的订单数量。
作者图片
然后,点击运行查询,不到一秒钟 MindsDB 就会返回预测值。
作者图片
如果您想直接从数据库运行中获得预测:
SELECT orders AS predicted,orders_confidence AS confidence,orders _ explain AS info FROM mindsdb . shopify _ orders where " vendor " = ’ Converse ’ AND " order _ day " = ’ 2021–06–18 ';
在这个例子中,对于 2002 年 6 月 18 日星期五的 Converse 产品,MindsDB 认为商店将获得大约 57 个订单,最小订单为 32 个,最大订单为 78 个。此外,MindsDB 有 74%的把握这将是正确的订单数量。用户可以以修改置信度为代价进一步调整预测区域的宽度:一对更紧密的边界意味着预测的置信度更低,反之亦然。
另一件要注意的事情是,当您提供更多的历史背景时,查询会更准确。
包扎
我们已经展示了使用 Airbyte 在数据库中提取和加载数据是多么容易,然后利用 MindsDB 执行预测分析以推动更好的基于业务的决策。如需更多信息和示例,请查看关于 Airbyte 、 MindsDB 的文档,并在http://cloud.mindsdb.com 注册一个免费的 MindsDB 云帐户。
最初发布于https://airbyte . io。
如何使用 BigQuery ML 预测旅行持续时间
谷歌云平台
使用 GCP 进行 ML 回归项目
本教程将通过 Google Cloud 中的挑战实验室 Qwiklab: 用 BigQuery ML: Challenge Lab 创建 ML 模型。
我们将使用谷歌云公共数据集上共享的真实数据集: austin_bikeshare 来帮助公共自行车共享系统选择新的自行车型号。本实验旨在预测不同自行车方案的平均出行持续时间。使用所选特征的不同假设提供了两种方案。你会比较哪一个性能更好。
第一步:创建一个数据集来存储你的机器学习模型
使用分配的凭证登录 Google Cloud Platform 后,打开 BigQuery 并在您的项目中创建一个数据集。
在 BigQuery 中创建数据集(图片由作者提供)
步骤 2:创建预测 BigQuery 机器学习模型
我们将在第一个模型中纳入起始站名称、旅行开始的时间、旅行的工作日和起始站的地址,并仅使用 2018 年的数据来训练第一个模型。
模型 1 培训:
# Create a Linear regression modelCREATE or REPLACE MODEL austin_bikeshare.bikeshare_modelOPTIONS(model_type='linear_reg', labels=['duration_minutes']) AS# Data preprocessing and feature selectionSELECTstart_station_name,EXTRACT(HOUR FROM start_time) AS hourofstart,EXTRACT(DAYOFWEEK FROM start_time) AS day_of_week,address AS location,duration_minutesFROM`bigquery-public-data.austin_bikeshare.bikeshare_trips` AS trips# Join to get the address of the start stationJOIN`bigquery-public-data.austin_bikeshare.bikeshare_stations` AS stationsONtrips.start_station_name=stations.nameWHEREEXTRACT(YEAR FROM start_time) = 2018AND duration_minutes > 0
第三步:创建第二个机器学习模型
第二种型号的功能相对简单。我们将在第二个模型中纳入起始站名称、旅行开始的时间和自行车共享订户类型,并仅使用 2018 年的数据来训练该模型。
模式 2 培训:
# Create a Linear regression modelCREATE or REPLACE MODEL austin_bikeshare.bikeshare_model2OPTIONS(model_type='linear_reg', labels=['duration_minutes']) AS# Data preprocessing and feature selectionSELECTstart_station_name,subscriber_type,EXTRACT(HOUR FROM start_time) AS hourofstart,duration_minutesFROM`bigquery-public-data.austin_bikeshare.bikeshare_trips`WHEREEXTRACT(YEAR FROM start_time) = 2018AND duration_minutes > 0
步骤 4:评估两个机器学习模型
平均绝对误差和均方根误差都用于评估。
模型 1 评估:
# Choose evaluation metricsSELECTSQRT(mean_squared_error) AS rmse,mean_absolute_error AS maeFROMML.EVALUATE(MODEL austin_bikeshare.bikeshare_model,(# Prepare the testing dataset with the same features as the training set using for 2019SELECTstart_station_name,EXTRACT(HOUR FROM start_time) AS hourofstart,EXTRACT(DAYOFWEEK FROM start_time) AS day_of_week,address AS location,duration_minutesFROM`bigquery-public-data.austin_bikeshare.bikeshare_trips` AS tripsJOIN`bigquery-public-data.austin_bikeshare.bikeshare_stations` AS stationsONtrips.start_station_name=stations.nameWHEREEXTRACT(YEAR FROM start_time) = 2019))
对第一个模型的评估(图片由作者提供)
模型 2 评估:
# Choose evaluation metricsSELECTSQRT(mean_squared_error) AS rmse,mean_absolute_error AS maeFROMML.EVALUATE(MODEL austin_bikeshare.bikeshare_model2,(# Prepare the testing dataset with the same features as the training set using for 2019SELECTstart_station_name,subscriber_type,EXTRACT(HOUR FROM start_time) AS hourofstart,duration_minutes# No need to join anther table since all the features needed are in one tableFROM`bigquery-public-data.austin_bikeshare.bikeshare_trips`WHEREEXTRACT(YEAR FROM start_time) = 2019))
对第二个模型的评估(图片由作者提供)
通过比较,我们可以发现第一种模型更准确。
第五步:使用第二个模型预测平均出行持续时间
我们将使用第二个模型来预测 2019 年从最繁忙的自行车共享站出发的平均行程长度,其中订户类型为Single Trip
。
#Create a table containing predicted trip duration for single trip subscribers at the busiet bike sharing station in 2019WITH predicted AS (SELECT*FROMml.PREDICT(MODEL `austin_bikeshare.bikeshare_model2`,(# Find the busiest bike sharing station in 2019WITH params AS (SELECTCOUNT(*) AS counts,start_station_name AS start,FROM`bigquery-public-data.austin_bikeshare.bikeshare_trips`WHEREEXTRACT(YEAR FROM start_time) = 2019GROUP BY start_station_nameORDER BY counts DESCLIMIT 1)# Prepare the features for the modelSELECTstart_station_name,subscriber_type,EXTRACT(HOUR FROM start_time) AS hourofstart,duration_minutesFROM`bigquery-public-data.austin_bikeshare.bikeshare_trips`, paramsWHEREstart_station_name = params.startAND subscriber_type = 'Single Trip')))# Get the average of the predicted duration.SELECT AVG(predicted_duration_minutes) AS predicted_average_trip_duration, start_station_name, subscriber_typeFROM predictedGROUP BY start_station_name, subscriber_type
预测脚本(图片由作者提供)
预计平均出行时长(图片由作者提供)
如果上面的脚本没有通过评分系统,您可以将它分成两部分:一部分查找最繁忙的自行车共享站,另一部分使用站名进行预测,如下所示:
# Find the busiest station
SELECTCOUNT(*) AS counts,start_station_name,FROM`bigquery-public-data.austin_bikeshare.bikeshare_trips`WHEREEXTRACT(YEAR FROM start_time) = 2019GROUP BY start_station_nameORDER BY counts DESC
# Predict
SELECT AVG(predicted_duration_minutes) AS predicted_average_trip_durationFROM ML.predict(MODEL `austin_bikeshare.bikeshare_model2`, (SELECTstart_station_name,EXTRACT(HOUR FROM start_time) AS hourofstart,subscriber_type,duration_minutesFROM`bigquery-public-data.austin_bikeshare.bikeshare_trips`WHEREEXTRACT(YEAR FROM start_time) = 2019AND subscriber_type = 'Single Trip'AND start_station_name = '21st & Speedway @PCL'))
祝贺!
如果您完成了之前的实验,您将通过挑战实验室,并获得来自 Google Cloud 的Create ML Models with big query ML徽章,这些实验有一步一步的说明。
我希望你喜欢这次旅行。欢迎在 Linkedin 上发表评论和我联系。
如何将产品目标框定为机器学习问题
降低处理机器学习项目的风险
有些事情最好通过经验来教。机器学习中的许多任务就是如此。机器学习允许我们从大量数据中学习,并使用数学公式通过优化给定目标来解决问题。相比之下,传统编程期望程序员编写一步一步的指令来描述如何解决问题。
“ML 对于构建我们无法定义启发式解决方案的系统特别有用”
— Emmanuel Ameisen,构建机器学习驱动的应用。第三页。
尽管它很强大,但机器学习的一个主要警告是它引入了一定程度的不确定性,这在基于规则的系统中是预料不到的。这是因为机器学习是基于模式识别的。因此,重要的是要认识到产品的哪些方面可以从 ML 中获益,然后考虑如何制定一个学习目标来降低用户体验不佳的风险。
确定产品的可行性
机器学习能够解决一系列问题,但区分哪些问题是可解决的是极其困难的。由于我们无法预先确定一个 ML 项目是否会成功,我们最好的办法是降低处理这样一个项目的风险,最重要的是,从产品目标开始。
一旦我们有了产品目标,下一个目标就是决定解决它的最佳方式。我以前出错的地方是,我会立即下定决心使用机器学习,因为我想建立有趣的方法。更好的方法是考虑解决问题的所有可用选项,不管是否需要 ML。
机器学习并不总是需要的!
如果我们决定使用 ML 方法,我们必须决定它们是否适合产品。《T4 构建机器学习驱动的应用》一书提出了两个步骤:
- (1) 以 ML 范式构建产品目标——对于一个目标,可能有多种表述。
- (2) 评估 ML 可行性——考虑所有潜在的框架,从最简单的开始。
这个过程要求我们检查问题的数据和模型方面。
设计产品框架
在这个场景中,我将假设我们想要构建一个写作助手。我们的写作助手要能接受作家写的中等文章,并加以改进,使之写得更好。考虑到这个公式,我们必须首先解决“更好”这个词的含义。我们可以通过问更多的问题来做到这一点,直到我们对我们的写作助手的产品目标有一个清晰的定义。
这里有一个更清晰的公式的例子:
Medium 是一个社交媒体平台,供作家分享见解,读者向作家学习见解。然而,一些作家因为他们写的文章而疯狂传播,即使没有大量的追随者,其中一个原因是基于文章写得有多好。这对于那些有着非常有用的见解但不擅长通过写作表达自己的作家来说是不幸的。因此,我们的目标是建立一个写作助手,帮助作者写出更好的文章。
成为算法
在我们实现机器学习算法之前,尝试手动解决问题没有坏处。这样,我们可以了解你的学习算法必须成功解决什么样的问题。在我们的场景中,我们必须考虑如何提高文章的可读性,以及传播的几率。
一种方法可能涉及研究,以确定一些属性,可以用来帮助媒体博客写得更清楚。这些特征的例子有:
- 散文的简单性:散文意味着语言遵循日常语言的自然模式。因此,任何遵循基本语法结构的作品都被称为散文。我们可以利用这个特性来建立一个关于适当的句子和单词长度的标准,使我们能够在需要的地方提出修改建议。
- 语气:语气是指作者对读者的态度和信息的主题。通过评估语言,我们可以衡量文章的极性,并确定一篇文章是否触及读者的情感纽带,因为这些文章往往在某些上下文中表现良好。
- 结构特征:结构描述了文本在页面上是如何排列的,以及所有部分是如何组合在一起形成文章的。作家通常喜欢有意识地组织他们的文章,因为这对读者有影响。
注意:我们也想和病毒媒体的作者谈谈,了解一些他们用来让他们的作品病毒式传播的写作技巧。
通过识别和生成有用的特性,我们能够构建一个简单的解决方案,依靠这些特性向我们的读者提供推荐。报道这个过程可能会很无聊,因为它不涉及机器学习,但它对于提出一个快速基线来衡量其他实验是至关重要的。
基于我们所学到的
有了我们的初步特征,我们可以利用它们从一篇文章中学习一种风格模式。为了执行这一步,我们需要建立一个数据集,提取我们描述的特征,然后训练一个分类器来区分好的和坏的例子。
在建立分类器来分离文本之后,我们想要分析高度可预测的特征,因为这些是我们将用作对我们的系统的推荐改变的特征。
最后的想法
机器学习并不总是所有产品都需要的。在转向 ML 解决方案之前,建立简单的解决方案来测试产品的可行性并评估是否需要机器学习是很重要的。如果确实需要 ML,从一个简单的解决方案开始是一个好主意,可以为您提供一个基线和反馈,以便进一步发展。
感谢阅读!
如果你喜欢这篇文章,请通过订阅我的**每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。**
相关文章
** **
如何在 GPU 上生成随机数向量
蒂莫西·戴克斯在 Unsplash 拍摄的照片
解决老问题的现代硬件
随机数是数据科学家生活中必不可少的一部分。例如,如果你需要初始化神经网络的矩阵,使用零模型执行数据分析,或者甚至在运行蒙特卡罗模拟时,你必须生成它们。
想象一下,你必须生成许多独立的随机数序列,比方说,一组蒙特卡罗马尔可夫链 (MCMC)。在这类问题中,给定一个起点和一个规则来产生状态 n+1 给定状态 n 就有可能对给定分布的许多状态进行采样。也可以使用 MCMC 来执行自然语言处理【1】。
在多个独立对象上执行相同任务的理想硬件是图形处理单元。事实上,GPU 可以被编程为运行多个独立的线程,这些线程同时执行相同的操作。
在这里,我将描述一个简单的例子,如何使用苹果金属框架生成随机数序列,以在快速 GPU 硬件上运行操作。
随机数的向量
这里的思路是生成一个独立 随机数字均匀 分布的向量。举例来说,每个数字可以代表马尔可夫链末端的一个状态。
该代码由三部分组成:
- 准备好初始状态(种子)的向量
- 这个向量被传递给 GPU 和每个线程运行一个链并输出一个单一的数字(状态)
- 状态从 GPU复制到 CPU,然后再复制到磁盘上的文件中,以便稍后进行分析。
在 GPU 上运行
我选择利用 Apple Metal Framework 来执行上述操作,并在 GPU 上执行操作。整个代码可以很容易地翻译成其他语言,如 OpenCL 或 CUDA 。
**https://developer.apple.com/metal/
为了对 Metal 上的数据执行流水线,我们需要创建一个命令缓冲区,将命令写入其中,并将缓冲区提交给命令队列。Metal 将发送命令给 GPU 执行。
在本例中,我们将使用 ComputeCommandBuffer ,因为我们的任务是计算任务,而不是图形任务。
我们用 C++编写的包装了金属代码的程序将在 Mac 内置的 GPU 上高效运行。
计算期间的 GPU 使用统计。图片作者。
算法
(伪)随机数的生成从一个名为种子的整数值开始。然后,有种不同的方法产生后续随机数;Mersenne Twister 和 xorshift 就是两个例子。
梅森扭结算法
梅森扭结器是一个伪随机数发生器,也是目前使用最广泛的通用型。它是由松本诚和西村拓治在 1997 年开发的,它是专门为纠正老式发电机的大部分缺陷而设计的。
最常用的梅森扭转算法是基于梅森素数 2 ⁹⁹ ⁷-1.它的标准实现, MT19937 ,使用 32 位字长。
在这个例子中,我将使用 Mersenne Twister 的金属实现。
马萨格里亚的 xorshift
另一个容易实现的生成随机数的算法是 xorshift [3]。这是一种非常快速的发电机。它的创造者还建议对 xorwow 生成器进行改进,其中 xorshift 生成器的输出添加了一个 Weyl 序列。xorwow 生成器是 nVidia CUDA 图形处理单元应用编程接口的 CURAND 库中的默认生成器。
xorshift 的 GPU 实现如下。
uint rand_xorshift(uint rng_state){
rng_state ^= (rng_state << 13);
rng_state ^= (rng_state >> 17);
rng_state ^= (rng_state << 5);
return rng_state;
}
这可以方便地移植到其他 GPU 编程语言,如 OpenCL 。
示例和运行
在示例中,我将描述线程应该生成从边界为 0 和 1000 的均匀分布中抽取的随机数。
下面显示的 Metal 代码显示了在每个 GPU 线程上生成 100 个随机数并将最后一个存储到一个数组(vOut)的过程示例,该数组稍后将由 CPU 代码访问。
每个线程都有一个由主 CPU 线程通过 vIn 数组传递的种子。然后每个线程创建自己的生成器
#include <metal_stdlib>#include “mersenne.metal”
using namespace metal;
kernel void storyMersenne(
const device uint *vIn [[ buffer(0) ]],
device int *vOut [[ buffer(1) ]],
uint id[[ thread_position_in_grid ]]){mt19937 generator;generator(vIn[id]);uint r;
for (uint l = 0; l < 100; l++) r = generator.rand();vOut[id] = r;}
当 GPU 的每个线程都生成了随机数时,就可以查看它们的分布,并验证它们是否如预期的那样均匀分布。
图中显示是的,它们分布均匀。
如果有多次运行呢
可以用来评估随机数生成器的另一个标准是,生成的随机数序列很有可能互不相同。
我测试了这个事实,生成了多个随机数序列,并研究了它们之间的相关性。该图显示不同运行中产生的点实际上不相关。
不同运行的相关性。图片作者。
结论
在许多应用中,拥有一个好的随机数来源是必要的。快速生成它们将是一个优势。
当您必须进行涉及随机数序列的计算或马尔可夫链蒙特卡罗时,只要它们是独立的,并且知道 GPU 硬件已经过优化可以并行执行许多操作,那么使用 Metal 或 OpenCL 中实现的算法来生成它们可能是一个不错的选择。
一个简单的例子表明,利用 MacBook GPU 可以轻松生成均匀分布且不相关的随机数。
参考
[1] Gerlach,m .,Pexioto T.P .,Altmann E.G. 主题模型的网络方法。 (2018)
[2]杰森·r·布莱文斯 C++梅森扭扭器包装器类 (2006)。
[3]乔治·马萨利亚。随机数发生器。(2003)现代应用统计方法杂志。**
如何用 Python 生成自动化的 PDF 文档
利用自动化轻松创建令人眼花缭乱的 PDF 文档
在 Unsplash 上由 Austin Distel 拍摄的照片
你上一次处理 PDF 文档是什么时候?你可能不需要回顾太久就能找到这个问题的答案。我们每天都要处理大量的文档,其中绝大多数都是 PDF 文档。公平地说,这些文件中有很多都是重复的,而且编写起来非常痛苦。是时候考虑利用 Python 的自动化功能来机械化繁琐的工作了,这样我们就可以将宝贵的时间重新分配给生活中更紧迫的任务。
请注意,完全没有必要精通技术,我们在这里要做的事情应该是足够琐碎的,我们内心不喜欢的门外汉可以在短时间内解决。阅读完本教程后,你将学习如何自动生成 PDF 文档,将你自己的数据、图表和图像打包在一起,呈现出令人眼花缭乱的外观和结构。
具体来说,在本教程中,我们将自动执行以下操作:
- 创建 PDF 文档
- 插入图像
- 插入文本和数字
- 可视化数据
创建 PDF 文档
在本教程中,我们将使用 FPDF ,它是 Python 中用来生成 PDF 的最通用、最直观的包之一。在我们继续下一步之前,启动 Anaconda 提示符或您选择的任何其他 Python IDE,并安装 FPDF:
pip install FPDF
然后导入我们将用来呈现文档的库栈:
import numpy as np
import pandas as pd
from fpdf import FPDF
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
随后,继续创建 PDF 文档的第一页,并设置字体的大小和颜色:
pdf = FPDF(orientation = 'P', unit = 'mm', format = 'A4')
pdf.add_page()
pdf.set_font('helvetica', 'bold', 10)
pdf.set_text_color(255, 255, 255)
然而,如果你需要不同的字体,你可以随时改变字体。
插入图像
下一个合乎逻辑的步骤是给我们的文档一个背景图像,为页面的其余部分设置结构。对于本教程,我使用 Microsoft PowerPoint 来呈现我的背景图像的格式。我只是使用文本框和其他视觉效果来创建所需的格式,完成后,我通过选择所有元素并按 Ctrl-G 将所有内容分组在一起。最后,我通过右键单击它们并选择“另存为图片”将分组的元素保存为 PNG 图像。
背景图像。图片作者。
正如您在上面看到的,背景图像为我们的页面设置了结构,并为稍后将生成的图表、图形、文本和数字留出了空间。用于生成该图像的特定 PowerPoint 文件可以从这里下载。
随后将背景图像插入到您的 PDF 文档中,并使用以下内容配置其位置:
pdf.image('C:/Users/.../image.png', x = 0, y = 0, w = 210, h = 297)
请注意,您可以通过扩展上面显示的方法插入任意数量的图像。
插入文本和数字
添加文本和数字有两种方法。我们可以指定要放置文本的确切位置:
pdf.text(x, y, txt)
或者,我们可以创建一个单元格,然后将文本放入其中。这种方法更适合于对齐或居中可变或动态文本:
pdf.set_xy(x, y)
pdf.cell(w, h, txt, border, align, fill)
请注意,在上述方法中:
- “x”和“y”是指我们页面上的指定位置
- “w”和“h”指的是我们细胞的大小
- “txt”是要显示的字符串或数字
- “边框”表示是否必须在单元格周围画一条线(0:否,1:是或 L:左,T:上,R:右,B:下)
- “对齐”表示文本的对齐方式(左:左,中:右)
- “填充”指示单元格背景是否应该填充(真,假)。
可视化数据
在这一部分中,我们将创建一个条形图,显示我们的贷方、借方和余额值随时间变化的时间序列数据集。为此,我们将使用 Matplotlib 来呈现我们的图形,如下所示:
在上面的代码片段中,credit、debit 和 balance 是二维列表,分别包含日期和交易金额的值。一旦生成并保存了图表,就可以使用前面几节中介绍的方法将它插入到我们的 PDF 文档中。
类似地,我们可以用下面的代码片段生成圆环图:
完成后,您可以通过生成自动化的 PDF 文档来完成它:
pdf.output('Automated PDF Report.pdf')
结论
这就是你自己的自动生成的 PDF 报告!现在,您已经学会了如何创建 PDF 文档,将文本和图像插入其中,还学会了如何生成和嵌入图表和图形。但是您决不仅限于此,事实上,您还可以扩展这些技术,使之包括多页文档的其他视觉效果。天空才是真正的极限。
图片作者。
如果您想了解更多关于数据可视化和 Python 的知识,请随时查看以下(附属链接)课程:
使用 Streamlit 开发 Web 应用程序:
使用 Python 实现数据可视化:
面向所有人的 Python 专业化:
新到中?您可以在此订阅和解锁无限文章。
人工智能的源代码数据集——为什么和如何
要避免的陷阱
丹尼尔·怀尔德曼的照片来自自由影像
为什么编码数据集
代码 AI 最近成为一个普遍的话题;无论是对一个代码主题进行分类,发现其中的漏洞,对其进行总结甚至是根据前面的令牌猜测下一个令牌。使它成为可能的是最近 NLP 的进步和丰富多样的源代码数据集的可用性提升。拥有像 Github、Gitlab 和 Bitbucket 这样的服务,生成源代码数据集可能被视为一项微不足道的任务——“抓取 Github 并开始训练模型”。事实上,这种简单性涵盖了一个相当复杂的领域,需要避免许多陷阱。下面详细解释。
案例研究——话题预测
让我们假设我们的任务是建立一个模型来预测一个源代码是否与服务器相关。有许多方法可以处理它,从手动收集特性(比如文件类型,它是测试代码吗,它的导入是什么,等等…)到深度神经网络,它将自动生成一组特征来查看。无论我们走哪条路,第一步都是收集相关的数据集。一个普通(幼稚!!)建议的计划将是使用一些相关的搜索标准(如 Node.js repositories)从公共代码托管服务(如 Github)中随机抽取存储库,并根据相关术语的存在对其进行标记(“服务器相关”与“不相关”)。沿着这条路走下去,我们很可能会发现我们的模型过度适应数据集的浅层特征。什么会出错?
为什么随机抽样代码不是微不足道的
我们最初计划的主要问题是源代码数据集固有的隐含偏差,这会影响不同语言和代码类型的模型泛化。Github 是最常见的代码托管服务之一,据报道它遭遇了语言的长尾;很少是超级常见的(像 Javascript 和 Java),而大多数(像 C)是非常罕见的。重新审视我们的计划,随机抽样 Github 最终会得到他们长尾分布的代理。由于一些话题与语言有关,情况会变得更糟;例如,Java 比 Clojure 与服务器应用程序更相关。鉴于 Java 在我们的数据集中也更常见,可能会导致模型得出 Clojure 与服务器完全无关的结论(在我们的模型预测中总是负面的,这是不正确的)。解决方案应该是确保我们的数据集更均匀地分布在不同的语言和类中。
为什么分层抽样代码不简单
常见的实现均匀分布的方法是分层抽样。在代码数据集上,通常在回购级别应用采样,以确保生成的训练-测试-验证分割是互斥的(以避免相同回购文件过度匹配的风险)。试图在回购级别上对语言进行抽样可能很困难,因为一些语言如 Json 和 Yaml 通常是通用的;无论实施什么样的抽样政策,它们都可能在我们的数据集中(过于)常见。另一个问题是如何针对相关文件;为了确保数据集有足够多的服务器相关示例,我们建议使用服务器相关的术语搜索 Github(如 Java 上的“tomcat”、Python 上的“flask”和 Javascript 上的“express ”),但问题是这种搜索太过特定于技术(可能会导致过度拟合),通常很难确保每种语言都有相同数量的示例。依赖于标准化的搜索词(比如“服务器”这个词本身)会忽略许多潜在的相关例子。如何确保我们的数据集均匀分布,同时保持其丰富多样?
分阶段采样以调整分布
根据上面提到的代码数据集特征,我们的数据集可能会有偏差。分层抽样只能部分地解决这个问题,因为它隐含着阶级与语言的关系。解决方案应该是分阶段采样**;在正类(通常更少)上,欠采样会浪费昂贵的样本,而过采样能够记住不太常见的样本。在负类(通常更容易得到)上,分层抽样可能隐藏了类的多样性。我们的解决方案将是从对阳性类中过于常见的语言进行欠采样开始,并继续对长尾语言进行过采样。最后,我们将对负类进行欠采样,以匹配刚刚生成的正语言分布。这将产生一个数据样本,其中我们保留尽可能多的正面例子,同时确保总体人口几乎均匀分布。重要的一点是,无论我们选择应用什么样的采样策略,我们都应该始终监控;确保观看一般和每种语言的表演。了解潜在的隐藏偏见。**
主动学习填补空白
在我们建议的解决方案中,一些例子将被忽略(对太常见的正样本和通常的负样本进行采样),而一些例子将被重复(对正长尾进行过采样)。为了使采样比简单的随机采样更智能,我们可以使用弱模型来识别哪些负面例子要优先考虑(由弱模型正确识别的那些不太重要),并且用主动瞄准感兴趣的地层来替换过采样重复。专注于数据集的“薄弱”领域将使我们能够更好地将我们的工作力量用于改进模型。
谨慎建造
尽管看起来很简单,但生成可靠的代码数据集可能是一项艰巨的任务,有时甚至比训练模型本身还要困难。一开始就注意训练人群特征,可以防止很多后来的头疼。
如何在 Python 中生成虚拟数据
为找不到合适的数据集而沮丧?—为什么不自己创造呢?
乔尔·菲利普在 Unsplash 上的照片
每个数据科学项目都始于一组数据。
不管你是一名资深的数据科学家还是一名有抱负的数据爱好者,你都可能在某个时候寻找数据集来启动数据科学或机器学习项目。但通常情况下,寻找一组合适的数据可能是一个非常乏味的过程。虽然许多著名的数据存储库已经使成千上万的数据集易于访问,但它们大多是通用的,实际上需要一些调整和准备,以适应我们正在进行的数据项目。
这让我想到——如果找到一个样本数据集如此复杂,为什么不生成我自己的虚拟数据呢?这个疯狂的想法一开始让我有些反感,因为我认为编写自己的数据实际上也同样耗时。但是在我开始在几个项目中创建自己的数据之后,我发现了一个强大的 Python 库,它可以以直观的方式完成所有这些工作。
历史数据&常见的数据格式类型
照片由 Pietro Jeng 在 Unsplash 上拍摄
人类储存和分析数据的最早记录可以追溯到公元前 18,000 年左右,那时人们使用计数棒。【1】快进到 21 世纪,大多数现代数据都是以数字方式收集的,并且可以像滚雪球一样变成大量数据,称为大数据。在信息系统中,数据以字节为单位存储,例如千字节、兆字节等。据估计,2020 年全球创建、捕获和消费的数据总量为 59ZB (zettabyte ),预计到 2025 年将达到令人难以置信的 175ZB。【2】
Metrix 前缀表显示了 IT 系统中常用的乘法前缀。作者自我图解。
存储在计算机化系统中的数据,即存储在您的计算机或其他电子设备(如智能手机)中的数据,必须指定不同的数据类型。数据格式化的基本思想可以分为数字、字母或字母数字。根据讲授计算机科学,下表中可以看到一些常见的数据类型。
IT 系统中常用的数据类型和格式。作者自我图解。
在 Python 中生成假数据
当然,要生成假数据,这个库必须被称为 Faker 。在本文中,我将带您浏览一些生成通用营销数据的片段,这些数据将包括一些常见的列(数据格式),如:
- 交易日期(时间戳)
- 客户名称(字符串)
- 性别(布尔型)
- 电子邮件(字符串)
- 城市(字符串)
- 购买的产品 ID —条形码(字符串)
- 支出金额(浮动)
为了使 Python 代码可移植,笔记本是使用 Google Colab 构建的,完整的代码可以在 GitHub 上找到。由于 Faker 不是一个标准库,您很可能必须首先安装它。在 Google Colab 中,这可以通过下面的两行代码来完成。
每一列的 Python 代码片段
代码的逐行解释:
- 第 1–5 行:导入所需的库。
Faker
是本教程中用来生成大部分伪数据的主库。 - 第 7 行:定义客户的数量。要生成的行数。
- 第 11 行:声明一个空列表,用于传递生成的假数据。
- 第 13 行:为生成的假数据的每次迭代定义一个
for
循环。 - 第 15–18 行:为交易日期创建虚假数据—开始和结束日期被定义为日期的中间范围。
- 第 20–21 行:使用
faker
库创建假名字。名称也可以定制为只生成名或姓。更多细节可以在这里找到。 - 第 23–24 行:在“M”和“F”之间使用
random
库创建假性别。该列表还可以添加更多不同的性别选择选项。 - 第 25–27 行:使用 faker 库创建假的(ASCII 格式)电子邮件。其他格式的邮件可以在这里找到。
- 第 29–30 行:使用 faker 库创建假城市。其他形式的称呼请参考这里的。
- 第 32–33 行:创建 8 位条形码格式的假产品 id。其他格式可以在这里找到。
- 第 35–36 行:伪造客户的消费金额。参数被设置为只有两位小数,并且数量将始终为 1-100 之间的正数。
- 第 38 行——一个
for
循环的结束。该循环将继续 1000 次(在第 7 行中定义),以生成 1000 行假数据。 - 第 40 行:将生成的转换成熊猫数据帧。
- 第 42 行:显示笔记本中所有列的参数。
- 第 43 行:打印并显示数据帧。
生成的输出。作者自我图解。
奖励—导出为 CSV
您可能希望导出或下载生成的假数据,以便在其他地方用于您的数据科学或机器学习项目。在 Google Colab 中,只用三行代码就可以轻松实现。导出的数据将是标准的 CSV 文件。
结论
万岁,你已经走了这么远,现在你已经成功地生成了一个数据集,最适合你的数据处理需求。示例代码片段相当简单,但是已经涵盖了最常见的数据类型,如整数、浮点、字符串和日期。非常欢迎您使用和编辑代码的任何部分来生成您想要的数据集。
完整的笔记本可以在 Github 上的这里找到。
喜欢我的文章吗?在媒体上关注我,以便在我发布新文章时接收通知。😊
参考文献:
[2] 世界数据解释,对话
感谢阅读这篇文章。如果你喜欢我的工作,请考虑加入 Medium 来支持我。谢谢大家!😊
https://jackyeetan.medium.com/membership
如何为你的作品集项目产生机器学习用例想法
三种创意技巧
马克·弗莱彻·布朗在 Unsplash 上的照片
你的作品集项目可能决定你找到工作的机会,也可能毁掉它。随着越来越多的人渴望从事机器学习方面的职业,你能够将自己与其他候选人区分开来是很重要的。有鉴于此,许多人利用他们的投资组合项目来脱颖而出,吸引招聘经理的注意。
你可以为你的项目参加 Kaggle 的竞赛。但是,实现一个 ML 工程师的全部经验来自于完成整个机器学习工作流程,这最好是在处理自己独特的项目时完成——ka ggle 跳过了机器学习工作流程的早期阶段。尽管并非不可能,但生成潜在用例可能会很困难。
下面是三种技术,可以帮助你为下一个项目生成潜在的用例。
使用神奇的岛屿
机器学习是一个高度技术性的领域。当你试图想出一个有趣的用例时,考虑所有的技术细节是一个很大的灾难。我们最终会想到一个高度复杂的用例,可能需要六个人的团队花 12 个月来开发——这是我们在找工作时没有的宝贵时间。
相反,简单的解决方法是使用卡西·科兹尔科夫的魔法岛。对于那些不熟悉它的人来说,凯西提出了一个位于海洋中央的岛屿,她的许多朋友都在那里工作。他们的工作是走到一起,假装自己是人工智能——而你将获得他们聪明(或愚蠢)的所有荣誉。
为了让这个神奇的岛屿工作,你必须给他们发送一个输入。工人们会做他们想做的任何事情,然后给你回复一个决定。然而,你不允许给他们任何规则,他们必须通过例子来学习。你的工作是给他们工作做。为他们找到工作最简单的方法是摆脱重复性的任务。
你会卸下哪些重复性的苦差事?
这个问题的答案离找到一个合理的用例又近了一步。尽可能多地列出:
- 输入:房产信息,输出 : 建议价格
- 输入:电影信息,输出 : 我会喜欢吗?
- 输入:服务请求,输出 : 等待时间量
- 输入:动物园的照片,输出 : 图中是什么动物?
- 输入:股票信息,输出 : 股票明天的价格
在你完全投入其中一个想法之前,想想这对你的员工成功完成任务意味着什么——毕竟,他们可能会喝得酩酊大醉。不能盲目相信他们!
“企业犯的一个常见错误是假设机器学习是神奇的,因此可以跳过对做好任务意味着什么的思考。”— Cassie Kozyrkov,寻找 AI 用例的建议。
阅读其他用例
向他人学习会帮助你建立你的直觉。当我踢足球的时候,我会研究梅西。我会分析他如何带球越过对手,他如何在有球和无球的情况下为自己创造空间,并想象自己在他打球时的样子。
当然,我没有成为梅西,但这有帮助。
每当我发现自己在球场上遇到类似的情况时,我会不假思索地本能地做出动作,这经常会有回报。
同样,阅读大量的机器学习用例可以培养你的直觉。最终,您发现机器学习用例的能力将显著提高,您处理部署过程中出现的各种问题的能力也将提高。
“要学习设计机器学习系统,阅读案例研究以了解实际团队如何处理不同的部署要求和约束是有帮助的。”— Chip Huyen,机器学习系统设计
许多公司分享他们的机器学习用例。这里有一些你可以用来发展你的直觉:
- 使用机器学习来预测 Airbnb 上房屋的价值 ( Robert Chang ,Airbnb Engineering&Data Science,2017)
- 空间、时间和杂货 ( 杰里米·史丹利,Instacart 的技术人员,2017 年)
- 欺诈中由浅入深的学习 ( 易浩·昂,Lyft 工程,2018)
增强你的思想力量
也许你的想法力量很弱。虽然上述两种技巧都有助于你产生想法,但有意识地强化你的想法肌肉是有益的。
就像你的二头肌和四头肌一样,你的想法发生器需要被训练来有规律地产生想法。
“每天锻炼 10 次你的理想肌肉”的主题已经在 Medium 流传了一段时间——ayo deji awo sika 和 James Altucher 是该方法的流行倡导者。
作家们使用这种技术为潜在的博客文章不断产生独特的想法,但它可以用来为任何事情产生想法。
只需要一支笔,一张纸,和一天开始时的几分钟——或者你可以把它分开。但是你必须在一天结束前写下 10 个。
在你的情况下,你不会写博客的想法。你的任务是每天写十个机器学习用例。最酷的是…
没人会看到。
如果你想出的主意被证明是垃圾,那又怎样?没人会看到的。你所要做的就是通过一些阻力训练来锻炼你的意念肌肉。
随着时间的推移,你的想法肌肉将会发展,使你成为一台机器学习用例生成机器。
最后的想法
拥有一个独特的项目是让你与众不同的好方法。许多人在思考他们可以实现的事情时,常常很难产生想法。一些帮助产生想法的技巧包括参观凯西岛,阅读其他人的用例,以及增强你的想法肌肉。
感谢阅读!
如果你喜欢这篇文章,请通过订阅我的**每周简讯与我联系。千万不要错过我写的关于人工智能、机器学习和自由职业的帖子。**
相关文章
**https://medium.com/geekculture/5-factors-that-contribute-to-successful-machine-learning-projects-340904446eff https://medium.com/geekculture/3-signs-you-dont-need-machine-learning-958199b30c34 https://medium.com/geekculture/how-to-design-a-machine-learning-system-89d806ff3d3b **
如何在几分钟内从 Docstrings 生成专业的 API 文档
在一个小 Python 包的帮助下,生成高质量的文档变得简单而直观。包括降价和乳胶。
图片来源 : Pixabay (免费使用)
文档很重要
当我们使用一个新的库(或者第一百万次重用我们最喜欢的库)时,我们都喜欢好的和全面的文档,不是吗?
想象一下,如果他们从 Scikit-learn 或 TensorFlow 网站上拿走所有的文档,你会有什么感觉。你会感到很无力,不是吗?
文档很重要。高质量的文档(特别是对于一个开源项目)证明,
- 关心这个项目
- 关心最终用户或客户( 你的代码被阅读的次数比它被编写的次数多得多 )
- 富有成效的思维,这样开发人员可以更有效地利用代码库进行调试和参考,否则用户很容易产生错误/问题( 什么是富有成效的数据科学 )
- 倾向于将技术项目进行逻辑总结,即,不要将个人爱好项目停留在 Jupyter 笔记本级别,而是使其可重用并值得为更大的用户群分发( 这样你就可以将自己与其他数据科学家区分开来 )
这里有一篇文章,里面有一些优秀的例子…
https://nordicapis.com/5-examples-of-excellent-api-documentation/
但是,编写文档经常感觉像是一件苦差事。这是每个开发人员在大规模项目中经历的认知负荷之上的额外负担。
如果我们有一个工具可以生成专业外观的文档,也就是说,可以直接从我们编写的原始 Python 函数推送到 docs 服务器或网站供公众使用,那会怎么样?
在本文中,我们介绍了这样一个漂亮的小工具,并展示了一些基本的例子。
pdoc3
—一个直观但功能强大的编写 Python 文档的工具
我们都为我们的数据科学项目和开源包编写了大量的 Python 函数并创建了大量的 Python 类,不是吗?其实即使是因果分析和爱好项目,我们也应该 把这种面向对象编程风格的习惯 构建到我们的代码库中。
如果能够直接从这些函数和类定义中生成好看的 API 文档,而无需编写一行额外的 HTML/CSS 代码,那就太好了。
图片来源:作者创作
安装和基本使用
只要 pip 安装软件包,
pip install pdoc3
注:有一个比较老的包叫 **pdoc**
。你也可以用它来建立文档,这是这个项目的一个分支。但是这里我们使用的是更新的框架。
从一个简单的加法函数开始。假设它包含在本地工作区中名为math-func.py
的文件中。
def addition(num1, num2=0):
"""
Adds two numbers
Args:
num1: The first number
num2: The second number, default 0
Returns:
The result of the addition process
"""
return (num1+num2)
因此,实际的代码只是一个返回语句,但是 docstring 很长。
这就是关键。文档字符串。
docstring 是 pdoc 工作方式的核心。从他们的网站来看,它是“命令行应用程序,可用于将项目文档呈现为静态 HTML 文件。它还包括一个实时重新加载的 web 服务器来预览更改。
所以,上面的流程变成了,
图片来源:作者创作
那么,如何生成 web 预览呢?只需一个 CLI 命令。
pdoc --http localhost:8080 math-func.py
它在localhost:8080
端口启动一个活动的 web 服务器。当您在浏览器中打开该页面时,
Starting pdoc server on localhost:8080
pdoc server ready at [http://localhost:8080](http://localhost:8080)
您的浏览器显示如下页面。首先,你会看到有两个链接的页面,当你点击math-func
链接时,你会看到 API。
图片来源:作者创作
很酷,不是吗?但是看起来很基础。让我们看看我们是否能给它添加一些小铃铛和哨子。
降价——美化和可用性的关键
我是编写文档的 markdown 格式的忠实粉丝。你不是经常在 Github Readme 文档中使用它吗?pdoc 的伟大之处在于它允许在 docstring 中无缝集成 markdown 文本。
假设,我们将第二个函数mult
添加到我们的math-func.py
模块中,
def mult(num1, num2=1):
"""
Multiplies two numbers
Args:
`num1`: The first number
`num2`: The second number, default `1`
Returns:
The result of the **multiplication** process
"""
return (num1*num2)
请注意对 docstring 的细微更改,其中有一些标记符号,如粗体的反勾号…
和** … **
。
现在,如果您只是保存这个文件,网页会自动重新载入您的更改。
图片来源:作者创作
请注意参数num1
和num2
是如何作为内联代码块呈现的,以及单词乘法是如何在 API 文档中以粗体显示的。这就是 markdown magic,就在你的 docstring 里面。
您甚至可以在 docstring 中显示带有三个反勾号的代码块。最终的 API(用于我们的下一个divide
函数),
图片来源:作者创作
我们所要做的就是把这个放到 docstring 中,
"""...Handles exception by a check,
```python
if num2 != 0:
return (num1/num2)
else:
raise ValueError('The second argument cannot be zero')
```
"""
请注意,在三个反勾号之后使用了标识符 **python**
,以便在 API 文档中以格式良好的方式呈现代码块。
LaTeX math
您可以在 docstring 中包含基本的 LaTeX 数学表达式,并在 API doc 上漂亮地呈现它们。例如,我们用下面的 docstring 编写一个毕达哥拉斯距离计算函数,
def pythagorus(num1, num2=0): """
### Description:
Calculates the root-sum-of-square of two numbers
### Args:
`num1`: The first number
`num2`: The second number, default `0`
### Returns:
The result of the **pythagorus** formula
$$dist = \\sqrt { a^2+b^2 }$$
"""
我们需要做以下两件事,
- 使用
$$ … $$
包装一个 LaTeX 表达式 - 使用两个反斜杠字符来表示 LaTeX 表达式中常见的反斜杠。这是为了处理反斜杠作为 Python docstring 中的转义字符的常见角色。
结果是,
图片来源:作者创作
建立函数索引
还要注意我们在页面左侧构建的函数索引。这就像一个目录,当你点击那些链接到相应的功能时,它会把你带到文档中的任何地方。这是一个模块一个模块构建的。这里我们的主模块当然是math-func.py
文件。
您可能已经注意到,索引是按字母顺序排序的(根据函数名)。虽然在我们的源代码中,我们在mult
函数之后添加了divide
函数,但是它被索引在第二位。
图片来源:作者创作
其他选项和实用程序
我们在上一节中介绍了基本用法和选项。在这里,我们想要展示更多的全局选项和实用程序,它们可以用于更多的控制和可用性。
输出选项
你可以生成,
- HTML 页面:带
pdoc --html <filename.py>
。这会将模块 HTML 文件放在工作目录下的./html 文件夹中。您可以使用一个可选的目录标志将 HTML 文件放入其中。 - 服务器:带
pdoc --http HOST:PORT <filename.py>
在网页上显示 API 文档的实时预览,带自定义HOST
和PORT
。
对于类对象
你可以像函数一样用标准类对象构建文档。例如,我们将整个math-func
代码转换成一个类,并在我们的模块中添加第二个Dataframe
类。当我们为此生成文档时,它看起来像是,
图片来源:作者创作
一起
如果你把你的类和函数放在一个单独的 Python 脚本(模块)中,那么它会像这样显示,
图片来源:作者创作
程序化生成
从根本上说,pdoc3
是一个 Python 包,因此您可以在 Python 代码中使用它以编程的方式生成文档。这是一个样板代码示例,
import pdocmodules = ['a', 'b'] # Public submodules are auto-imported
context = pdoc.Context()modules = [pdoc.Module(mod, context=context)
for mod in modules]
pdoc.link_inheritance(context)def recursive_htmls(mod):
yield mod.name, mod.html()
for submod in mod.submodules():
yield from recursive_htmls(submod)for mod in modules:
for module_name, html in recursive_htmls(mod):
... # Process
注意mod.html()
本质上是一个在处理模块的文档字符串后返回原始 HTML 字符串的函数。这是使用pdoc --html <filename.py>
命令渲染的内容。在上面的代码中,您直接使用您的代码检索它,并可以进一步操作它。
构建完整的模块
您可以使用 pdoc3 一次性构建一个完整的模块。为此,您只需将必要的文件放在通常的模块/子模块层次结构中,就像标准的 Python 包一样。
例如,我们可能有这样一个简单的目录结构(注意 Python 名称空间要求的__init__.py
)目录math-mod
,在这个目录中,我们将这些文件放在子目录中。
图片来源:作者创作
我们可以运行一行命令,
pdoc --http localhost:8080 -c latex_math=True math-mod
我们将得到下面的结构,
图片来源:作者创作
摘要
构建高质量的文档感觉起来像是软件项目中编程和技术问题解决部分的额外负担。数据科学也不例外。然而,伟大的数据科学和机器学习项目和框架是真正伟大的,因为它们因其广泛的 API 文档而易于任何人使用。
在本文中,我们展示了如何使用一个漂亮的小 Python 包来创建漂亮的 API 文档(包括 markdown 语法和 LaTeX math 渲染),就在舒适的 docstrings 函数中。
希望这能打破为您正在从事的下一个开源项目制作良好文档的障碍。
喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果您使用下面的链接, ,我将收取您的一部分会员费,而不会对您产生额外费用 。
https://medium.com/@tirthajyoti/membership
如何用 Python 生成罗马风格的马赛克
实践教程
使用提供的代码制作自己的马赛克,并理解其背后的基本原理
作者基于以下输入图像制作的图像:scikit-image 测试图像“咖啡”、维梅尔的戴珍珠耳环的女孩和 Python 徽标
古代的马赛克是由小块硬质材料如大理石、玻璃或石灰石组装而成的。这种材料的选择产生了极其持久的艺术作品,让我们深入了解几千年前的生活方式。但是马赛克也代表了现代概念。首先,它们是可持续的,因为它们是天然的、可重复使用的建筑材料。它们拥有高度的抽象性,这让它们看起来很有趣。这种效果会自动出现,因为马赛克中的元素数量受到严格限制。尽管有这种限制,对象应该是清晰可辨的。这是创建新马赛克的挑战,需要在放置瓷砖时遵守规则。
可用算法
当我搜索从输入图像中生成马赛克的工具时,我没有找到一个让我信服的工具。因此,我开始尝试神经风格转移,这产生了令人惊叹的马赛克,但仔细观察发现了许多不切实际的瓷砖。后来,我发现有几篇关于镶嵌计算的科学论文,并注意到一篇由迪·布拉希等人写的旧论文(2005 年的)。我决定修改已发布的方法,并用 Python 实现它。事实证明这比预期的要难,因为这项任务异常复杂。此外,我不得不即兴发挥了很多,因为算法的最后步骤没有详细解释。现在我想和所有对此感兴趣的人分享这个剧本。几行相关的代码就贴在这里,完整的代码可以在 GitHub 上找到。
让我们开始
最初,我们加载一个源图像:
图像如下图所示。现在我们可以开始实现算法了。
边缘检测
最广为人知的马赛克( opus 蠕虫状马赛克)的基本设计原则是沿着视觉上重要的物体边缘放置瓷砖链。因此,我们的首要任务是从源图像中提取这些边缘特征。在该论文中指出,传统的边缘检测算法不能很好地工作,必须开发基于亮度水平的定制技术。这是 2005 年写的。如今,我们可以受益于深度学习领域的进步。整体嵌套边缘检测 (HED)是在迪·布拉希的工作十年后发表的,可以使用 openCV 轻松实现。事实证明,在大多数情况下,HED 在检测相关轮廓方面表现得甚至更好。你可以在下面的比较中看到这一点,HED 产生的背景特征明显较少,但更好地保留了杯子的边缘。
源图像是 scikit-image 的测试图像“咖啡”(Rachel Michetti)。作者的边缘检测图像。
指导方针
现在我们有了边缘,可以开始放瓷砖了。但是之后去哪里呢?让我们准备用瓷砖填充整个图像的说明。因此,我们构建了一套完整的平行于检测到的边缘的指导方针。为此,我们首先必须计算每个像素到最近边缘的距离。幸运的是, SciPy 有正确的功能:
在 img_edges 中,已经检测到的边缘被编码为“1”并通过设置 img_edges==0 转换为“假”。您可以在下图中看到生成的图像。这里,像素越亮,它离边缘越远。
现在,我们可以使用我们关于边缘距离的新知识:我们移动 half_tile (即,一半的瓦片大小;由用户选择)远离边缘,并且逐行绘制指引线,同时总是精确地留出一串瓷砖将需要的空间:
结果如下所示。最终,瓷砖将沿着这些线居中放置。之后,我们再次使用距离矩阵来计算每个像素的梯度。我们稍后将需要这些数据来以正确的方向放置瓷砖。
作者提供的图片(基于 scikit-image 测试图片“coffee”)
为了使指导方针对下面的步骤有用,我们必须将它们转换成有序的坐标列表。这不是一项容易的任务,但谢天谢地,SciPy 在这里又帮了大忙:
瓷砖放置
现在,我们可以通过沿着指引线绘制多边形来实际放置瓷砖。随着 Shapely 的出现,有了一个用于创建和操作几何图形的令人敬畏的 python 库。
标准图块的放置如下完成:
- 创建第 1 条边作为长度为 2⋅ 半瓷砖的线;以指引线为中心(下图中的虚线)
- 按照预先计算的渐变矩阵中的角度旋转侧边 1
- 在 2⋅ half_tile 像素的指导线上向前移动
- 以与第 1 面相同的方式创建第 2 面
- 通过取四个角点的凸包创建一个多边形(即两边的两个端点)
- 如果新牌与附近链的牌重叠,则只保留差异
作者图片
如果沿着弯曲的指引线放置瓷砖,则选择较小的宽度,以便最终马赛克中的圆形对象看起来更好。如上图所示,一旦超过临界角,就绘制边 2。最后,指引线链的最后一个单幅图块(通常是一条闭合的线)被放入剩余的空间,因此可能也具有较小的宽度。
所有这些都是在一个循环中完成的,需要相当多的代码行。为了演示 Shapely 背后的简单原理,让我们画一个多边形:
作者图片
在本例中, line0 创建在左侧,而 line1 创建在右侧。两条线都旋转指定的角度。最后提取两条直线的角点并合并成一个凸多边形。
现在让我们继续放置循环。在下图(左侧)中,您可以看到第一个链完成后的结果。标记的链也用彩色线标出。在右图中,所有链都填充了瓷砖。但我们还没有完成,因为我们有很多瓷砖之间的差距。
作者提供的图片(基于 scikit-image 测试图片“coffee”)
平铺到缝隙中
为了填补空白,我们使用了另一个伟大的 Python 库 scikit-image 。为了找出差距,我们从绘制所有现有的图块开始:
这里, x 和 y 是多边形的角坐标。“Draw”将它们转换成多边形内所有像素的坐标 rr , cc 。你可以在下面的左图中看到结果。从那里,我们再次计算到现有瓷砖的距离。然后,我们使用这些信息来定义差距内的第二套准则(右图)。
作者提供的图片(基于 scikit-image 测试图片“coffee”)
沿着新的指引线放置额外的图块后,所有必要的多边形都已创建。另一个任务是切掉突出图像边界的瓷砖。然后,我们来看看结果。在下图中,您可以看到整个区域都覆盖着瓷砖:
作者提供的图片(基于 scikit-image 测试图片“coffee”)
处理凹面瓷砖
不仔细看几乎看不出来,但是瓷砖的形状有一点不令人满意:有很多凹多边形!如果一个多边形的两个角点之间的一条线可以超出该多边形,则该多边形是凹的。它可以在放置后当它与附近多边形的重叠被移除时形成。这些形状不是很自然,因为实际上石头通常不是凹的,而是凸的。这就是为什么代码提供了将形状转换为凸形的选项。它实施两种策略(见下面的草图):
- 移除尖状物:如果多边形的面积没有显著变化,则多边形的尖状物部分被简单地移除。去除尖峰后,面积必须比以前小。否则,存在与其他区块新重叠的风险。
- 右图就是这种情况。如果删除标记的角,生成的多边形将比以前更大。相反,它被分成两个凸多边形。
方便的是,这两种策略都可以使用 shapely 例程来实现。
作者图片
着色
最后,所有的瓷砖都在适当的位置,并有一个凸起的形状。只是颜色不见了!我们只是从输入图像中复制它。最简单的方法是选择多边形中心的颜色值。由于在某些情况下可能会收集到奇怪的像素颜色,因此也可以对位于图块内部的所有像素的颜色进行平均。你得到的结果显示在右边。
一个缺点是,由此产生的马赛克看起来有点人工,因为不是现代照片中出现的所有颜色都可以用天然材料复制。因此,可以在真正的历史镶嵌画中找到的颜色的集合是预先收集的。您可以选择将所有颜色值更改为该源中最接近的对应值。在下面的例子(右侧)中,选择了来自 Ravenna 的源马赛克,由于使用了玻璃片,它仍然包含许多颜色。
作者提供的图片(基于 scikit-image 测试图片“coffee”)
完了!
让我们再看几个生成的马赛克。
例如,我们可以尝试不同瓷砖尺寸的效果。在左图中,它设置为 15px,在右图中设置为 5px。较粗糙的图像需要 1107 个图块,较精细的图像需要 7069 个图块。
作者提供的图片(基于 scikit-image 测试图片“coffee”)
当然,我们可以选择任何类型的输入图像:
作者的图片基于:维米尔的戴珍珠耳环的女孩,塞巴斯蒂安·比茨的教堂照片,作者的花和狗的照片
如果你想自己尝试一下,从这里获取代码。只需更改输入图像的路径并运行脚本。
最后,感谢 Marat Kopytjuk 审阅本文。
如何使用 CTGANs 生成表格数据
实践教程,实用机器学习
对 CTGANs 如何工作的深入解释
作者图片
这篇文章的目的是填补互联网上的空白,很好地解释条件表格式 gan 是如何工作的。表格数据生成是一个不断发展的研究领域;CTGANs 的论文已经成为许多其他机器学习架构的基础,这些架构今天构成了该研究领域的艺术状态。
为什么要生成表格数据?
在我之前的两篇文章中,我探讨了如何使用生成式对抗网络(GANs)生成图像数据。在某种程度上,这些都是本文的基础。尽管图像数据非常直观,但实际上,工业和文学中最常用的数据是表格数据。表格数据是结构化的,在训练机器学习模型时通常更容易处理。然而,在生成表格数据时,要制作一个性能良好的模型,实际上会使事情变得复杂很多。
本文的目标是介绍 CTGANs 是如何工作的。为此,我将首先对 GANs 和表格数据做一个简单的解释。然后,我将介绍 CTGANs 最初论文中描述的体系结构。最后,我将介绍一个使用 Python 的示例实现。
重温甘斯
作者图片
gan 属于深度学习生成器网络的分支。这是一个监督学习问题,我们有一组真实的数据,我们想通过使用生成器来扩充这个数据集。GANs 学习生成样本,这与学习分布有着本质的不同(查看我关于 可微分生成网络 的文章了解更多细节)。
GANs 包括两个神经网络,生成器和鉴别器。生成器生成新数据,同时鉴别器尝试正确分类真实和虚假数据。
这两个网络在培训方面有对立的目标。鉴别器试图最大化其分类准确性(正确识别哪些图像来自生成器),而生成器的目标是欺骗鉴别器。在学习结束时,生成器应该能够生成看起来非常像真实数据集的图像,以至于它们可以欺骗人类,让他们认为它们是真实的。
表列数据
正如我前面提到的,表格数据是结构化的。对于机器学习模型来说,非结构化数据(如文本或图像)更难学习。在大多数情况下,处理图像数据要复杂得多。但是,在生成表格数据时,您会发现算法会很快变得非常复杂。
表格数据的种类
表格数据可以是数字的,也可以是类别的。
作者图片
数字数据可以是连续的,也可以是离散的。连续数据在分辨率上没有限制。重量可以用吨、千克、克、毫克等来衡量。离散变量有唯一的数值。一个例子是你家孩子的数量。至于分类数据,有顺序数据(有顺序的分类数据,如星期几)和名义数据(没有顺序的分类数据)。
在文献中,离散数据、序数数据和名义数据都被归为一类,称为离散数据。这是因为当训练一个神经网络时,你不会将一周中的每一天作为一个向量{“星期一”、“星期二”…}。相反,你可以给它一个向量{0,1 …}。所以这意味着我们可以把离散数据和分类数据同等对待。
问题设置
一个表格数据集 T 可以说包含了 Nd 离散列和 Nc 连续列。表格数据生成的目标是训练生成器 G 学习从 T. 生成合成数据集 Tsynth
在文献中有两篇探索表格数据生成的关键基础论文,它们是徐磊等人的tgan 和徐磊等人的和ctg an。在本文中,我将重点介绍 ctg an,这是一种已经在行业中起步的架构,在表格数据生成研究领域的发展中起到了关键作用。
**ctg an—**提议的适应措施
为了完成表格数据生成的任务,可以训练一个普通的 GAN,但是,CTGANs 提出了两个修改,试图解决 GAN 在应用于表格数据时的两个问题。
连续数据的典型归一化
CTGANs 试图解决的第一个问题是标准化连续数据。
让我们先来看看离散数据是如何表示的。
离散数据很容易表示,因为它可以一次性编码。一键编码就是将离散变量中的每个类别归类到其自己的维度中的过程。在前面给出的工作日示例中,在一键编码后,我们有 5 列,每一列代表一周中的每一天,并带有类成员的二进制指示,而不是包含工作周中的某一天的向量。
作者图片
上面,第一个向量{1,0,0,0,0}表示星期一。第二个向量{0,1,0,0,0}代表星期二,依此类推。一种热编码为我们提供了一种规范化的方法来很好地表示离散变量。
然而,当涉及到连续数据时,很难表达连续变量所携带的所有信息。让我们看一个例子:
作者图片
假设我们有一个像上面这样的连续变量(蓝色分布),我们想代表我们的样本(红色)。正如你所看到的,分布是相当复杂的,它有多种模式。因此,通过简单地给模型连续变量的值,我们可能会丢失一些信息,例如样本属于什么模式,以及它在该模式中的重要性。
作者提出了一个解决方案,他们称之为特定于模式的规范化,它将连续变量转换为包含我们上面描述的信息的向量。
特定于模式的归一化首先将 VGM(变分高斯混合模型)拟合到每个连续变量。高斯混合模型只是试图通过期望最大化来找到最佳的 k 高斯分布来表示数据。VGMs 可以通过一个权重阈值来决定适合数据的最佳高斯数(k)。
图片由【徐磊】等人使用条件 GAN【1】对表格数据建模
一旦我们找到了 k 高斯分布,最好地模拟了我们的连续变量,我们可以评估样本在每个高斯分布。从那里我们可以决定样本属于什么分布(这个用β表示。最后,我们可以使用α项来表示样本在其分布中的值(样本在其高斯分布中有多重要)。
在论文的例子中,VGM 找到了 3 个高斯函数来表示连续变量(k=3)的分布。样本 c(红色)使用上述等式编码为β矢量{0,0,1}和α矢量。
就是这样,解决归一化问题,不是给模型连续变量,我们给它α和β。
离散数据的公平抽样
作者试图解决的关于 GANs 和表格数据的第二个问题与随机抽样和离散数据有关。
训练 GAN 发生器时,输入噪声来自先验分布(通常是多变量高斯分布)。以这种方式对离散变量进行采样可能会丢失有关其分布的信息。对于模型来说,以某种方式包括来自离散变量的信息作为输入,并且学习将该输入相应地映射到期望的输出,这将是有用的。本文提出的解决方案包括三个关键要素:c 条件向量、发电机损耗、采样训练。
为了迫使生成器生成离散变量分布与训练数据相似的样本,除了随机噪声之外,输入中还必须包含一些关于所需离散变量的信息。所以他们选择包含一个条件向量。
条件向量允许我们强制生成器从选择的类别中生成一个样本。条件向量包含所有的离散列,one-hot 编码,其中除了一个离散列中的一个类别(我们希望生成的样本满足的条件)之外,所有的值都被设置为零。通过抽样训练选择条件。
CTGANs 采样训练允许我们对条件进行采样,以生成条件向量,使得生成器生成的分布与训练数据中离散变量的分布相匹配。通过采样进行的训练如下:
- 首先,选择一个随机的离散列
- 从该离散列中,基于概率质量函数选择类别,该概率质量函数由该离散列中每个类别的出现频率构建。
- 条件被转换成条件向量,并用作生成器的输入
最终适应**发电机损耗。**发生器损耗适用于强制发生器在这种情况下生成样本。他们通过将条件向量和生成的样本之间的交叉熵添加到损失项来实现这一点。这迫使产生的样本遵守该条件。
应用示例
对于这个例子,我使用了 Titanic 数据集【2】。目标是生成看起来尽可能真实的数据。
作者图片
在上图中,左边是数据集中泰坦尼克号上死亡和幸存乘客的真实分布。右边是生成的分布。如您所见,CTGAN 学习生成类似于训练数据中的分布。
ctg an 的问题
虽然 CTGANs 可以学习训练数据的分布,但有时他们可能会错过这些和其他重要方面之间的相关性。
作者图片
左边的所有图像对应于真实数据的分布,右边的图像对应于虚假数据的分布。您可以看到生成器遗漏了训练数据中的关键关系。例如,在真实的数据中,你可以看到如果你是女性,你在泰坦尼克号中幸存的可能性会大得多。合成数据生成器不会捕获此信息。生成器的另一个大问题是它正在生成年龄为负的样本!
尽管有各种各样的理论,CTGANs 本身绝对不是完美的。尽管他们很好地捕捉到了每个变量分布的总体形状,但他们未能捕捉到它们之间共享的大量信息。
结论
在本文中,我解释了一种生成表格数据的关键方法。条件表格式可能很难理解,但它为表格数据生成中的一些最大问题提供了一个非常漂亮的解决方案。
在文章的最后,我快速展示了将 vanilla CTGANs 算法应用于一个示例数据集的结果。CTGANs 并不完美,但可以通过多种方式进行改进。在以后的文章中,我将讨论源自 CTGANs 的其他架构,以及这些架构如何克服我们在本文中发现的一些缺陷。
支持我
希望这对你有所帮助,如果你喜欢,你可以 关注我!
你也可以成为 中级会员 使用我的推荐链接,获得我所有的文章和更多:https://diegounzuetaruedas.medium.com/membership
你可能喜欢的其他文章
参考
[1]徐,l .和 Veeramachaneni,k .,2018。利用生成式对抗网络合成表格数据。康奈尔大学。
[2]数据集:《泰坦尼克号》——作者华金·范肖伦,作者:小弗兰克·e·哈勒尔,托马斯·卡森——https://www.openml.org/d/40945
如何更快更好地生成训练数据
作为机器学习工程师,提高工作效率的最佳实践
当你在现实世界中创建机器学习模型时,与在线课程或 Kaggle 风格的比赛相反,你需要自己生成训练数据。
这是任何 ML 项目的第一步。尽管这很重要,但却是我们最容易忽视的一点。
作为一名自由 ML 工程师,我经常接受新的项目,并且一次又一次地面临同样的问题:我如何更快更好地生成训练数据?
在本文中,我想分享我在这个过程中发现的一些最佳实践,并帮助您提高工作效率。
你可以在这个 资源库 中找到所有的代码。
问题
开发机器学习模型的第一步是获取训练数据。
在现实世界的 ML 项目中,通常情况下,您不会 获得 数据。你 生成 它。除非你在非常精通 ML 的公司工作,这些公司拥有先进的数据工程基础设施(例如谷歌、脸书、亚马逊等等),否则这一步绝不是无足轻重的。作为初创公司的人工智能/人工智能顾问,我需要生成自己的培训数据。每次都是。
在大多数情况下,这些数据是表格形式的,即有行(样本/观测值)和列(特征和目标)的数据。这些数据存储在数据库中,如 Redshift 或 BigQuery 集群,甚至是 SQL server 或 Postgress。您可以使用 SQL 查询这些数据。
理想情况下,您应该编写一个 SQL 查询,如下所示:
然后运行一次,导出一个包含训练数据的 CSV 文件,进入数据探索和模型构建阶段。
然而,在现实中,事情要复杂一点,因为:
1.那个奇妙的桌子不存在
相反,您最终会编写一个更复杂的 SQL 查询,从不同的表中获取、聚合和连接数据。
大概是这样的:
当你写长 SQL 时,你一定会犯错误。要么是语法错误(很容易修复),要么是根本错误(很难修复),这些错误来自于对数据库中每个表和字段所代表的含义的误解。
您可能需要花几天时间,与负责数据库的人员(数据库管理员或理想情况下的数据工程师)来回通话,以了解在哪里可以找到您需要输入到模型中的每一位数据,编写查询,运行它,并祈祷能够获得您开始 ML 工作所需的黄金数据集。
因为第二个问题,这不是大多数情况下会发生的。
2.我的 SQL 查询不执行
您完成了长 SQL 查询的编写,并将其发送执行。
等待…等待…0%进度…仍在等待中…
是的,在你意识到它不会执行之后。
我去过那里无数次。试图得到该死的数据。
凯拉·伯顿从派克斯拍摄的照片
问题是你试图一次获取太多的数据。
一种快速解决方法是只查询一小部分数据。你可以在项目的最开始这样做,来排除障碍,并获得问题的基线表现。但是,当您想要改进模型时,您可能会意识到有一些有用的特性没有包含在查询中。这就把你带到了第三个问题。
3.我的 SQL 查询需要调整(通常需要很多次)
你可以用自己的方式获得一个初始数据集。然而,这种方法从长远来看是行不通的,这就是为什么:
- 在构建机器学习模型的原型时,您需要在数据库中的训练数据中添加额外的功能。因此,您需要编辑并重新运行该查询。又来了。
- 当您将您的模型转移到生产(顺便说一下,这是您工作的最终目标)时,您将需要实现一个再培训管道,以避免模型漂移。您需要每天、每周或每月重新生成一次培训数据。
生成训练数据是您需要迭代的关键步骤。像我描述的手动方法(遗憾的是,这是 ML 工程师和数据科学家在实践中最常用的方法)并不是最佳的。
有没有更好的方法解决问题 1,2,3,更好更快的生成训练数据?
没错。
解决方案
我想到的解决方案是基于划分 ( 自动化的原理🤖)和征服。
步骤 1:将 SQL 查询拆分成更小的查询
试图通过一次查询执行获取所有训练数据的问题有两个方面:
- 这个查询很可能不起作用,因为您想要一次获得的数据量太大,DB 无法处理。
- 即使查询今天运行,也不能保证它明天(当您重新训练模型时)也能运行,因为数据大小会更大。或者后天。或者另一个。最终,这将打破。
我们的朋友,数据工程师,经常使用的一个技巧是聪明地查询数据。我们运行 N 个查询来提取 N 个块中的数据,而不是一个查询提取所有数据。
例如,一个电子商务站点的数据库至少有一个包含所有历史订单的表,以及一些参数,如购买的商品 id、支付的金额等。以及购买的时间。不是一次获取所有数据:
您可以通过一系列查询在 N 个步骤中获取相同的数据:
运行 N 个较小的查询是可伸缩的,并且消除了数据库中的容量瓶颈。但是,如何自动执行 N 个查询呢?我猜您不希望将 N 个查询复制并粘贴到您的 DB IDE 或 CLI 来获取数据,对吗?
这将我们带到解决方案的第 2 步。
步骤 2:用 python 自动执行查询
Python 是你可能在你的机器学习项目中使用的语言。它也是一种很好的语言,可以快速地自动完成一些枯燥的事情,比如将数据从数据库中提取到 CSV 文件中。
Python 还有一个丰富的 DB 客户端库生态系统,允许您从 Python 脚本对 DB 运行查询。我过去广泛使用的一些是用于 MySQL 服务器的py odbc或用于 postr press/Redshift 的psycopg 2。
话虽如此,自动执行 N 个查询的一个简单方法是将一个查询字符串模板和一个简单的 for 循环放在一个data.py
脚本中:
这个解决方案是可行的。但是,它也重复了很多不必要的工作人员。以前下载并存储在 CSV 文件中的数据不应重新下载,除非 SQL 查询中有错误或更改。
让我们在最后一步处理这些细节。
第三步:包起来
为了避免重新处理日期,我们可以添加一个overwrite
参数。
有时您想要强制覆盖。例如,您在 SQL 查询中发现了一个错误,想要重新生成所有文件。在这种情况下,你设置overwrite=True
。
有时,您只想下载缺失日期的文件,以扩展您的培训数据。例如,当您在生产中重新训练模型时,您不需要重新下载所有日期的数据,而只需要重新下载您训练模型时的前一个日期的数据。在这种情况下overwrite=False
。
代码如下:
最后,我是tqdm
图书馆的忠实粉丝。它可以让您打印出令人惊叹的进度条,为您提供关于迭代速度和预计完成时间的反馈。
再加一个吧😊
你可以在这个 库中找到所有的代码 🎁
结论
所以,这是我作为 ML 工程师提高生产力的策略之一。
使用这个漂亮的data.py
脚本,您将能够:
- 更快地将新功能添加到您的训练集中。
- 更快地调试和重新生成数据集。
- 并最终更快更好的训练 ML 模型,创造产品。
我希望这有所帮助,乡亲们。如果有任何问题,请随时联系。
如果你想了解更多真实世界的 ML 技巧和提示,并成为一名更好的机器学习开发者,请订阅我的简讯。
我很乐意帮助你成为一名更好的机器学习开发者。
祝你愉快
如何获得数据科学工作:终极指南
在这里,我们提供了一个非常具体和实用的指南,告诉你如何在数据科学领域找到理想的工作
图片来自 Canva
每个行业的数据需求都使数据科学成为发展最快的领域之一,任何数据科学职位都有可能成为高增长职业。与此同时,数据科学仍然是一个相对较新的领域,任何特定角色的职责、结构和需求在不同的行业和公司都可能有很大的不同。近年来,人们对获得数据科学领域的工作很感兴趣。那么你是怎么做到的呢?
如何获得数据科学工作?
闯入数据科学
对于那些希望在数据科学领域开始职业生涯的人来说,无论是刚刚开始职业生涯的人还是处于职业转变过程中的人,都需要考虑入门级数据科学角色需要什么样的基准。尽职调查你自己的技能和经验:你需要在哪些方面有所提高?数据科学非常强调计算、数学、统计和编程,虽然不是绝对必要的,但大学学位或高等学位对进入数据科学非常有帮助。
另一个重要的步骤是反思你的个人兴趣所在,以及这与你过去的经历有何不同。对于那些以前在其他领域有工作经验的人来说,哪些技能有可能延续下去?几乎每个行业都有广泛的数据需求和数据科学工作。这意味着,即使你过去没有明确的数据工作经验:你的专业知识仍然可以发挥作用,特别是如果你希望留在同一个行业,并且能够利用以前的经验。
虽然科技和信息行业中的数据科学最为人所知,但金融和医疗保健行业仍有许多数据需求,这两个行业本身就是主要行业。教育、酒店、娱乐甚至公共部门对数据科学工作的需求也越来越大,这意味着任何过去的经验都可能有助于你进入数据科学领域。医疗工作的经历意味着你可以为医疗保健数据方面的任何角色带来独特的视角。营销历史意味着你了解商业世界,可能特别适合商业分析师的职位,或者至少比一般的数据科学专业更适合,尽管他们有正式的数据科学背景。
请记住,数据科学是一个快速发展的行业,许多公司甚至在内部招聘他们的数据角色,其思维过程是,例如,在技术数据分析方面培训业务人员比教授数据科学家抽象业务概念更容易。
查看我们在 上的博文如何从零开始学习数据科学 !
建筑地基
回到检查你的技能和经验,花点时间了解你自己的优势在哪里。数据科学涵盖一系列广泛的技能,对您可能缺乏的任何领域进行分类和研究非常重要。
网上有各种资源和教育平台,包括一些来自知名大学的资源和教育平台,涵盖了数据科学领域的各种概念,如 Coursera 、麻省理工学院开放式课件、 DataCamp 等。不同的教育平台有不同的专业:大学附属课程通常涵盖数据科学的广泛介绍,像 DataCamp 这样的在线课程允许你深入了解个别概念并按照自己的速度学习,像 StrataScratch 这样的在线课程专注于如何回答从真实的数据科学工作面试中提取的特定技术面试问题。
查看我们关于 如何用 Python 学习数据科学的指南 。在之前的一篇博客文章中,我们还介绍了 25 个数据科学训练营和课程来促进您的职业发展 。
虽然一些数据科学技术技能和要求,特别是对于更高级和更高级的数据科学角色,只有在多年的工作经验中才能获得,但大多数入门级数据科学角色仍然需要一些通用技能,任何有抱负的数据科学家都应该确保他们熟悉这些技能,如 Microsoft Excel、Python 和 SQL 等编码语言以及统计分析。
温习一下基础知识,确保你还记得来龙去脉,或者深入一些你不太熟悉或者有兴趣建立专业知识的特定领域。专业化很重要!请记住,数据科学是一个非常广阔的领域,光有一般知识是不够的。随着你职业生涯的进一步深入,目标是找到数据科学生产线的特定部分,并成为该领域的专家。
尽管主要是一个技术领域,数据科学领域仍然需要你能够推销自己,尤其是在招聘过程中。换句话说,确保你已经在网上建立了自己的形象。虽然 LinkedIn 是每个在职专业人士的基准标准,但数据科学的有志之士也应该立足于许多其他途径。在 GitHub 上发布项目或建立自己的网站作为数据科学博客或作品集。这有助于展示您在数据科学特定领域的兴趣和技能,或者只是展示您知道如何讲述故事以及传达您的想法和思维过程。
还有,查看数据科学组合创意 这里 。
让你自己和你的工作在网上可见对你的数据科学求职大有裨益。除了作为您可以在申请中提交的技能的额外见解来源,它还可以成为招聘人员根据可用信息联系您的机会,发送符合您技能组合的工作邀请,并节省您搜索合适的数据科学职位发布的时间和精力。除了潜在的全职工作,还可能出现其他咨询或兼职的机会。甚至在更远的将来,保持这种在线状态可以帮助你找到潜在的机会,即使你并没有主动寻找它们,招聘人员会主动联系你。
但回到最重要的部分:在网上展示意味着更多关于你自己的信息,以证明你的技能和经验,以及更多关于你的思维过程和工作风格的潜在见解,供公司在你更深入地寻找数据科学工作时查看。让我们更深入地了解这份关于如何获得数据科学工作的终极指南,并立即检查工作申请流程。
数据科学工作面试流程
大多数数据科学公司将他们的申请流程分为三个部分:最初的申请提交,与招聘经理的通话,然后是与团队成员的最后一轮,整个过程持续几周。该流程因公司而异,每个数据科学面试的总次数或长或短都不相同。你申请数据科学工作的环境也会影响你的申请过程,例如,你是否被招聘人员看中,是否在内部申请,或者是否通过推荐被介绍到该职位。
请注意,在《疫情》的拍摄过程中,任何采访都会有进一步的中断,很可能是虚拟场景。
作者创造的形象
申请提交
显然,数据科学工作申请流程的第一步是提交申请。当搜索职位发布时,确保通读每一个职位描述,并确保你符合该职位的基本资格。确定公司正在寻找的品质,以及公司的产品和使命,并决定你的技能和经验是否符合该职位的要求。一个好的做法是,在阅读数据科学职位描述后,从头开始完全重写你的简历,使用公告的准确措辞来描述你的工作经历和过去的成就。
许多公司还要求在他们的数据科学职位发布中附上一封求职信,尽管这通常是一个好主意,你可以在提交的任何申请中附上一封求职信,以获得额外的机会来展示你的能力,更不用说只是表明你愿意付出努力并采取额外的步骤。使用求职信简要介绍你自己和你的背景,以及你的技能和成就如何与这个角色和公司相匹配。回到你对公司产品和使命的研究,描述你为什么想在那里工作,或者这个职位的哪些方面让你感兴趣。
最后,为了得到一份数据科学的工作,在你的申请中加入任何你的在线状态的链接,例如你的 LinkedIn、Github、portfolio、portfolio 等,引起人们对你过去项目中与你申请的职位职责相似的任何特定元素的注意。
HR 的第二轮眼球
如果你在简历和求职信中有正确的技能和经验,符合数据科学职位发布的职责,你就可以进入流程的下一步,与真正的人交谈!这通常是以与招聘人员或招聘经理进行初步筛选电话的形式出现的,在这种情况下,你会就该职位和你的背景进行更深入的交谈。可能还有一个带回家作业的中间步骤,通常以编码评估的形式来测试你的数据分析和编码能力。
除了一些行为和技术问题之外,这个电话会给你一个机会去了解你正在面试的角色,比如它在组织中的相对位置和你将要工作的团队。你也可以借此机会询问面试过程的其余部分会是什么样子,甚至可能询问接下来会遇到什么样的数据科学家面试问题。
最后一轮
数据科学面试的最后阶段通常以与团队成员和其他同事的一系列面试和对话而告终。一些公司甚至要求你去他们的办公室,进行现场面试。在那里,你将有一个更深入的对话,探索你是如何工作的,你的特殊技能和背景。如果在面试过程的早期有一个编码评估,你也可能有机会在面试中回顾你的工作,解释你的思维过程和解决给定问题的方法。
期待更具体的行为问题,以及更长更复杂的技术问题,因为你将与你的面试官面对面(或虚拟地)见面。这意味着你有更多的机会通过问题和你的思考过程来交流和讨论。与未来潜在同事的面试过程中,这一阶段也是你深入了解工作和角色的机会。借此机会了解关于角色或责任的任何细节,以及更广泛的团队和公司文化。
如何准备数据科学工作面试
面试是一种独特的社交场合,许多人可能会觉得处理起来压力很大。做好面试的关键是保持冷静,并提前做好适当的准备。
为后勤工作做一个计划:带上多份最新的简历,提前 10 到 15 分钟到达,在前一天晚上计划好去面试地点的交通路线。在面试中,记住你的回答要集中和切题,直接回答被问到的问题。虽然背景当然很重要,但你在谈话中创造良好第一印象的时间也是有限的。注意不要离题。
对公司本身进行研究,尽最大努力了解他们的目标、文化和产品。能够用自己的话准确描述公司的工作。了解公司文化是帮助你决定面试时合适着装的关键,无论是正式的还是办公室便装。此外,像 Glassdoor 这样的资源可以让你深入了解数据科学面试的结构,甚至确切地知道会问什么问题。
我们在这里 谈谈准备数据科学面试的最佳资源 。
作者创造的形象
要准备的问题类型
数据科学面试问题通常分为三类:业务或产品意识、行为和技术。
商业或产品意识问题涵盖了你对所申请公司的了解和兴趣。对这家公司进行调查很重要,这样你就能了解他们在做什么,并能够谈论它,甚至为你可能看到的潜在问题提供解决方案。这类问题包括最基本的“你为什么想在这里工作?”与公司产品相关的特定场景。
行为问题有助于面试官更好地了解你如何在团队环境中工作、沟通和处理冲突。最典型的问题包括一般性的自我介绍,或者浏览你提交的简历。“告诉我一次……在哪里?”的变体也很常见。这些通常是你应该提前准备好的问题。
技术题涵盖统计分析和编码密集题,一般是最难准备的题型。查看在线资源,如 Glassdoor,查找该公司在该职位或类似职位的其他面试中提出的问题,以了解最近可能会提出的技术问题。更广泛地说,招聘启事,甚至是公司本身的公开信息,都可以给你关于面试官想要测试的特定技能的信息。
请记住,不同的公司对一个角色的实际要求有不同的标准,有些公司可能需要更专注于代码,而其他公司则需要广泛的统计能力或机器学习。
看看以上所有内容,你最需要复习的是哪些方面?
需要温习的技能
首先,重要的是建立(或重新建立)你对面试的总体感觉。特别是对于那些最近可能没有参加面试的人,无论是因为最近刚离开学校还是在以前的职位上花了相当多的时间,确保让自己熟悉工作面试的社交环境。我们已经讨论了需要准备的问题类型,您可以使用这些信息来准备对常见问题的回答。在模拟面试中找一个朋友来回答这些问题并给你反馈也是有帮助的。
接下来,花点时间想一想你对哪些数据科学概念和想法最有经验,谈论起来最舒服。另一方面,上一节中的哪些技术概念甚至是招聘启事本身让你有点不舒服,或者你回答起来没有那么自信?
即使对于那些没有那么多关于面试过程的公开数据的小公司,你仍然可以通过大量的在线教育资源进行具体数据科学概念的一般实践。在我们关于 18 个最值得推荐的学习 Python 和 SQL 的数据科学平台的博客文章中,我们比较了不同的教育平台。当你思考你在哪些方面最需要支持时,用它。
面试时要问的问题
请记住,面试过程的一部分就是你依次面试这家公司,以决定你是否觉得这家公司和这个职位非常适合你。相应地准备一些关于你想从工作场所得到什么的问题,比如公司的期望、结构、管理和文化。在面试过程的早期,你甚至可以选择询问面试过程其余部分的结构,包括接下来你要和谁谈话,甚至可能会问什么类型的问题。
当然,针对面试官给你的任何信息提出一些问题也很重要。你可以跟进面试官对你其他问题的任何回答,要求澄清公司结构或团队环境,并跟进他们提到的任何项目。
最后,记住你不需要把你的问题留到最后。面试应该是一种对话。特别是对于他们问你的任何技术问题,有时甚至是行为或产品问题,在回答之前要澄清你的任何不确定性。提出问题并澄清任何潜在的错误假设可能是给出一个好的、全面的答案并获得一份数据科学工作的关键。
后续行动
花点时间发一封跟进邮件,感谢每一位面试官的宝贵时间。除了礼貌之外,这也是一个让你的面试更令人难忘的机会,你可以在写作中提出具体的时刻,帮助你的面试官在以后的工作中记忆。这也是你加入任何额外想法的机会,比如你在谈话中没有提到的你的历史,或者任何比你最初所说的更完美的答案的额外想法。
摘要
数据科学是一个快速发展的职业,在每个行业都有机会,不仅仅是在技术领域。如果你想进入数据科学领域,任何以前的经验都可以继续。查看在线资源和教育平台,弥补你的知识缺口,特别是使用 Microsoft Excel、Python 和 SQL 的数据科学基础知识,以及统计学。当你进入面试过程时,记得做你的调查,彻底适应面试的社会环境。祝你好运!
最初发表于【https://www.stratascratch.com】。
如何获得机器学习模型的免费服务器
关于如何在世界任何地方启动和配置免费服务器的 10 步教程
保罗·花冈在 Unsplash 上的照片
拥有一台永远在线的服务器是向你未来的雇主展示你的参考资料或者在现实世界中测试你的机器学习模型的一个很好的方式。
在我们开始之前,我想披露我与亚马逊没有任何关系。你在本文中学到的方法应该也适用于其他云提供商(比如微软 Azure,谷歌云平台)。
我写这篇文章是因为我觉得你拥有这些知识很重要。我希望在我有太多时间和金钱的大学时代有人能教我这些。
通过阅读本文,您将了解到:
- 什么是 AWS?
- 如何创建 AWS 帐户?
- 如何在世界任何地方启动免费服务器?
- 如何配置服务器?
- 如何连接服务器?
- 关于如何编写服务器代码的一些提示。
什么是 AWS?
丹尼尔·埃勒杜特在 Unsplash 上的照片
亚马逊网络服务(AWS)是亚马逊的一家子公司,以按需付费的方式向个人、公司和政府提供按需云计算平台和 API。
这些云计算 web 服务提供了各种基本的抽象技术基础设施和分布式计算构件和工具。AWS 在全球范围内提供可靠、可扩展且廉价的云计算服务。
AWS 为新用户提供特别优惠。您可以免费运行一个小型服务器实例一年。
1.创建 AWS 帐户
首先创建一个亚马逊网络服务账户。你需要一张信用卡来注册。可能需要一些时间来验证。
2.登录 AWS
- 登录您的 AWS 帐户。
- 在 AWS 管理控制台中选择 EC2。
AWS 管理控制台(图片由作者提供)。
3.设置实例
- 单击启动实例按钮。
- 选择一个亚马逊机器镜像(AMI):
选择亚马逊 Linux 2 AMI (HVM),SSD 卷类型 - 选择实例类型:
通用 t2.micro 自由层合格 - 单击查看并启动。
- 复查实例启动:
单击启动 - 选择现有的密钥对或创建新的密钥对:
在选择现有的密钥对选择框中选择:创建新的密钥对。
在密钥对名称类型中:my-model。
点击下载密钥对并启动实例。
选择密钥对对话框(图片由作者提供)。
4.连接到实例
- 单击查看实例按钮。
- 在您的个人计算机上打开终端(如果您使用的是 Windows,请打开命令提示符)并找到您之前下载的密钥(下载文件夹)。要在终端运行中移动到下载文件夹:
cd Downloads
带 cd 命令的终端(图片由作者提供)。
3.为您的密钥设置权限(如果您使用的是 Windows,请跳过此步骤):
chmod 400 my-model.pem
4.等待您的实例进入运行状态:
等待您的实例进入运行状态(图片由作者提供)。
5.连接到服务器
1.选择实例并单击 Connect 按钮(记住实例 IP,因为您稍后将需要它)。
连接到你的实例(图片作者)。
2.在个人机器的终端窗口上;从 AWS 上的示例(当您点击连接按钮时会看到此示例)中复制连接命令;并将其粘贴到您个人机器的终端上;以连接到 AWS 实例;它看起来应该如下所示:
ssh -i "my-model.pem" ec2-user@XX-XX-XXX-XX.compute.amazonaws.com
如果询问:您确定要继续连接吗(是/否),请键入 yes?
当成功连接到 AWS 实例时,您应该看到以下 ASCII 图片:
连接 AWS 服务器(图片由作者提供),
7.更新服务器
- 必要时更新实例:
sudo yum update -y
。
8.开放端口
如果计划在实例上运行 web 服务器,请确保打开入站端口,以便能够从 web 浏览器访问它。在下面的例子中,我打开了用于 Flask Web 框架的端口 5000。
- 单击 Services,选择 EC2,选择 Running instances 并向右滚动,然后单击您的实例的 Security Groups 链接:
编辑入站规则,如下图所示,然后单击保存(图片由作者提供)。
9.部署分析 Web 服务器
空服务器并不比没有服务器好多少。
要部署基于 pandas 的数据分析服务器,请参见:
10.将机器学习模型部署到服务器
你在云端的第一个机器学习模型(图片作者提供)。
生产中的真实项目比在线课程的证书更有价值。这就是为什么我写了你的第一个云端机器学习模型。
云中的第一个机器学习模型将教你如何开发机器学习模型并将其部署到云中的服务器上。
在你走之前
- [How To Create Date Series in SQL](https://dataanalysis.substack.com/p/how-to-create-date-series-in-sql) [Article]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)- [Advance your Career in Cybersecurity (60% off) [Course]](https://imp.i115008.net/c/2402645/1024607/11298)- [Become a Cloud Developer using Microsoft Azure [Course]](https://imp.i115008.net/c/2402645/895504/11298)- [Master SQL, the core language for Big Data analysis [Course]](https://imp.i115008.net/c/2402645/828410/11298)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
在推特上关注我,在那里我定期发关于数据科学和机器学习的推特。
照片由Courtney hedge在 Unsplash 上拍摄