讲述故事的图表:将数据可视化转变为更有意义的东西
·发表于 Towards Data Science ·阅读时间 9 分钟·2023 年 3 月 29 日
–
照片由 Erik Mclean 在 Unsplash 上拍摄。
数据可视化传达了数据框和表格无法表达的想法。然而,通过数据可视化有效讲述故事需要一个具有美感、可解释的图表,这样图表才能提供必要的上下文,自成一体。
幸运的是,Python 包含了许多数据可视化库,例如 Plotly Express,可以通过一行代码快速创建图表 [1]。虽然这些图表很有用,但它们在正式出版物中很少能单独存在,或者在没有提供更多上下文的情况下经受得住审查;一个讲述数据故事的专业、独立图表需要额外的工作。本文介绍了将数据可视化提升到下一个水平的步骤。
代码:
本教程的代码可以在 GitHub 页面链接 上获取。请随意下载代码,并在 Jupyter notebook 中跟随操作——点击“代码”和“下载 ZIP”即可获取 ipynb 文件。
1. 数据准备和初步可视化
使用的库有:
# Data Handling
import pandas as pd
# Data visualization Libraries
import seaborn as sns
import plotly.express as px
import plotly.io as pio
回到一个老牌的数据集,Seaborn 库 的汽车数据集(标记为‘mpg’)提供了能源危机时期的车辆燃料消耗的优质数据 [2]。通过使用 groupby 函数,这些数据将提供 1970 年至 1982 年间每加仑平均行驶里程(MPG)。以下是加载和准备数据框的代码:
# Load in data:
mpg = sns.load_dataset('mpg')
# Get dataset showing average MPG per year by using groupby:
mpg = mpg.groupby(['model_year'])['mpg'].mean().to_frame().reset_index()
# Rename columns:
mpg = mpg.rename(columns={'model_year': 'Year',
'mpg': 'Average MPG'})
mpg.head()
数据框的头部应该如下所示:
作者截图。
一行代码在 plotly express 中生成以下柱状图:
px.bar(mpg, x='Year', y='Average MPG')
作者截图。
仅需几行代码即可准备和可视化数据。但这样的可视化是否值得在杂志或正式商业报告中发表?可能不够。
2. 下一层级:标签、格式、颜色
首先,让我们来看一下图表的颜色方案。运行以下代码将更新颜色值和模板:
# Generate base plot:
plot = px.bar(mpg, x='Year', y='Average MPG', color='Average MPG',
color_continuous_scale=px.colors.diverging.RdYlGn)
# Remove colorbar:
plot.update_coloraxes(showscale=False)
# Update plotly style:
plot.update_layout(template='plotly_white')
plot.show()
更新后的图表现在如下所示:
作者截图。
上述代码的第一个更改是将“平均 MPG”列添加到颜色中。虽然从技术上讲是多余的(“平均 MPG” 已在 y 值或柱状高度中捕获),但将颜色指定为“平均 MPG”允许应用颜色刻度以帮助快速解释。在这种情况下,Plotly 的发散颜色刻度“RdYlGn”与数据很好地映射:较低效的年份为红色,而较高效的年份为绿色,中间则是橙色和黄色。在这里发现其他 Plotly 颜色方案[3]。
由于颜色和 y 值相同,Plotly 通常包含的颜色条是多余的;上述代码将其去除。最后,代码将默认的 Plotly 主题更改为“plotly_white”。有关 Plotly 主题的更多信息,请点击这里 [4]。
注意: 如果考虑无色盲友好的方案,请阅读这篇《Towards Data Science》文章,了解如何调整颜色方案[5]。在这篇文章中,保留了红黄绿颜色方案,既作为概念验证,也因为 MPG 信息仍通过 y 轴(柱状高度)值传达。
3. 标签
接下来的步骤标记轴:
# Label axes:
plot.update_xaxes(title='Model Year',
dtick=1)
plot.update_yaxes(title='Average Miles Per Gallon (MPG)')
Plotly 通常会将轴标题默认为指定轴的数据列标题,但update_xaxes() 和 update_yaxes()允许进一步自定义[6]。请注意,MPG 被拼写为“每加仑英里数”以避免用缩写混淆观众。此外,对于 x 轴,“dtick” 值被设置为 1;这确保了 x 轴上的每个柱状图下方都有一个型号年份值。
以下代码更新标题:
# Update plot layout:
plot.update_layout(
title=dict(
text='<b>Average Miles Per Gallon of Cars Over Time</b>\
<br><i><sup>A Visualization of Improvements in \
Fuel Efficiency During the Energy Crisis Era</sup></i>',
x=0.085,
y=0.95,
font=dict(
family='Helvetica',
size=25,
color='#272b4f'
)))
函数 update_layout() 允许添加标题[7]。请注意,文本包含 HTML 风格代码: 和 用于加粗文本; 和 用于斜体;
代表分页符;最后, 代表图表副标题的上标。标题中的 \ 使文本块在下一行代码上继续,从而创建更整洁的代码块。
字体也可以调整,字体的颜色也是如此。可以使用 Google 的 颜色选择器 [8] 轻松找到其他颜色。
最后,我们使用 add_annotation() 函数在图表上注释数据源[9]:
# Add annotation on data source:
plot.add_annotation(x=0,
y=-0.15,
showarrow=False,
text="<i>Fuel mileage data courtesy of \
Python Seaborn Library</i>",
textangle=0,
xanchor='left',
xref="paper",
yref="paper",
font_color='#a6aeba')
所有这些最终产生了以下结果:
作者截屏。
注意图表有标题和副标题,引入了数据的背景,同时轴提供了明确的标签,条形的高度和颜色迅速显示了每年的平均 MPG。此外,底部有数据源参考。这可能是一个适合出版的图表的良好停止点,但为了展示可视化的进一步可能性,下一部分将介绍更多选项。
4. 添加注释
为了为图表增加更多背景,以下代码创建了一条表示 1970 年至 1982 年平均 MPG 的水平线以及一个描述该线的注释框:
# Add average MPG across era:
plot.add_hline(y=mpg['Average MPG'].mean())
# Add explanation of line:
plot.add_annotation(x=.05,
y=0.67,
text="Average MPG, 1970 through 1982",
textangle=0,
xanchor='left',
xref="paper",
yref="paper",
font_color='black',
bordercolor='black',
borderpad=5,
showarrow=True,
arrowhead=2,
bgcolor='white',
arrowside='end'
)
添加到图表中后,结果如下:
作者截屏。
注意 add_annotation()
函数允许创建边框(bordercolor=‘black’)和箭头。add_annotation()
函数中的 x 和 y 值定位标注框,可能需要一些试验和错误以将框放置在所需的位置。
这条线和标注框进一步强调了 1980 年、1981 年和 1982 年 MPG 的显著提升。此外,它还显示了 1975 年至 1979 年期间,平均 MPG 年年稳步提升。如果需要突出显示这段改进时期,可以使用以下代码完成:
# Add highlight box:
plot.add_vrect(x0="74.5",
x1="79.5",
fillcolor="lightgray",
opacity=0.3,
line_width=0)
# Add explanation of line:
plot.add_annotation(x=.45,
y=0.9,
text="Period of Consistent Improvement
<br>until Breakthrough in 1980's",
textangle=0,
xanchor='left',
xref="paper",
yref="paper",
font_color='black',
showarrow=False,
)
函数 add_vrect() 创建一个矩形框,用于突出显示图表的特定部分[10];在这种情况下,它突出显示了 1970 年代末期的一段持续改进的时期。add_vrect()
代码的位置很重要;将其放在 add_hline()
函数之后意味着它会在水平线的上方,而不是下面,如下所示:
作者截屏。
可能看起来没有其他需要添加的内容,但还有一个可能性:解释燃油经济性的提升。假设该图表是某项研究的一部分,该研究发现发动机尺寸的减小直接促成了每加仑英里数的提升。幸运的是,Seaborn MPG 数据包括发动机排量数据。经过以下的一些数据准备以及一些新的注释,最终的图表准备好了:
# Data prep:
displacement = sns.load_dataset('mpg')
seventies = round(
displacement[displacement['model_year'] < 80]['displacement'].mean(), 2)
eighties = round(
displacement[displacement['model_year'] >= 80]['displacement'].mean(), 2)
# Create text string:
explanation = "<b>Why the Improvement in MPG?</b> <br>\
In the 70's, average engine size was {} <br>\
cubic inches versus {} from 1980 to 1982.<br>\
Larger engines are usually less efficient.".format(seventies, eighties)
# Add explanation for trends:
plot.add_annotation(x=.615,
y=0.02,
text=explanation,
textangle=0,
xanchor='left',
xref="paper",
yref="paper",
font_color='black',
bordercolor='black',
borderpad=5,
bgcolor='white',
showarrow=False
)
数据准备部分计算了 1970 年代(70 到 79 年)的平均发动机排量以及 1980 年代的三年(80、81 和 82 年)。这些数据随后被传入文本字符串中,用于 add_annotation()
函数中的文本值。最终图表如下所示:
作者截屏。
这个图表现在可以独立存在,并讲述能源危机时代的年均燃油里程的故事。一些最后的考虑事项:
-
少即是多:当图表已经达到能够传达必要信息的能力时,就停止添加内容。
-
一个独立的信息图可能需要更多的项目,而在口头报告中或作为书面报告的一部分展示的图表,则可以用更少的项目来满足要求。
-
颜色方案、字体选择和尺寸影响可读性和无障碍性。
-
如果客户无法理解图表的含义,那不是客户的错。
5. 结论
Python 的各种可视化库,包括 Plotly Express,提供了一种快速生成高度可定制图表的方法,这些图表可以从基础可视化到完全自定义的独立产品。通过理解如何最好地传达故事来构建可视化,能够产生最有效的传递效果。自己动手尝试代码,并随时 在 GitHub 页面下载完整笔记本。
在一个代码块中生成最终图表:
# Load in Libraries:
# Data Handling
import pandas as pd
# Data visualization Libraries
import seaborn as sns
import plotly.express as px
# Load in data:
mpg = sns.load_dataset('mpg')
mpg.head()
# Get dataset showing average MPG per year by using groupby:
mpg = mpg.groupby(['model_year'])['mpg'].mean().to_frame().reset_index()
# Rename columns:
mpg = mpg.rename(columns={'model_year': 'Year',
'mpg': 'Average MPG'})
# Generate base plot:
plot = px.bar(mpg, x='Year', y='Average MPG', color='Average MPG',
color_continuous_scale=px.colors.diverging.RdYlGn)
# Remove colorbar:
plot.update_coloraxes(showscale=False)
# Update plotly style:
plot.update_layout(template='plotly_white')
# Label axes:
plot.update_xaxes(title='Model Year',
dtick=1)
plot.update_yaxes(title='Average Miles Per Gallon (MPG)')
# Add labels and source:
# Update plot layout:
plot.update_layout(
title=dict(
text='<b>Average Miles Per Gallon of Cars Over Time</b>\
<br><i><sup>A Visualization of Improvements in \
Fuel Efficiency During the Energy Crisis Era</sup></i>',
x=0.085,
y=0.95,
font=dict(
family='Helvetica',
size=25,
color='#272b4f'
)))
# Add annotation on data source:
plot.add_annotation(x=0,
y=-0.15,
showarrow=False,
text="<i>Fuel mileage data courtesy of \
Python Seaborn Library</i>",
textangle=0,
xanchor='left',
xref="paper",
yref="paper",
font_color='#a6aeba')
# Add highlight box:
plot.add_vrect(x0="74.5",
x1="79.5",
fillcolor="lightgray",
opacity=0.3,
line_width=0)
# Add explanation of line:
plot.add_annotation(x=.45,
y=0.9,
text="Period of Consistent Improvement\
<br>until Breakthrough in 1980's",
textangle=0,
xanchor='left',
xref="paper",
yref="paper",
font_color='black',
showarrow=False,
)
# Add average MPG across era
# Create Line:
plot.add_hline(y=mpg['Average MPG'].mean())
# Add explanation of line:
plot.add_annotation(x=.05,
y=0.67,
text="Average MPG, 1970 through 1982",
textangle=0,
xanchor='left',
xref="paper",
yref="paper",
font_color='black',
bordercolor='black',
borderpad=5,
showarrow=True,
arrowhead=2,
bgcolor='white',
arrowside='end'
)
# Add a box to explain the trends
# Data prep:
displacement = sns.load_dataset('mpg')
seventies = round(
displacement[displacement['model_year'] < 80]['displacement'].mean(), 2)
eighties = round(
displacement[displacement['model_year'] >= 80]['displacement'].mean(), 2)
# Create text string:
explanation = "<b>Why the Improvement in MPG?</b> <br>\
In the 70's, average engine size was {} <br>\
cubic inches versus {} from 1980 to 1982.<br>\
Larger engines are usually less efficient.".format(seventies, eighties)
# Add explanation for trends:
plot.add_annotation(x=.615,
y=0.02,
text=explanation,
textangle=0,
xanchor='left',
xref="paper",
yref="paper",
font_color='black',
bordercolor='black',
borderpad=5,
bgcolor='white',
showarrow=False
)
plot.show()
参考文献:
[1] Plotly, Python 中的 Plotly Express (2023)。
[2] Seaborn, Seaborn:统计数据可视化 (2023)。
[3] Plotly, Python 中的内置连续颜色比例尺 (2023)。
[4] Plotly, Python 中的主题和模板 (2023)。
[5] CR Ferreira, 创建色盲友好型数据可视化的两个简单步骤 (2020),数据科学前沿。
[6] Plotly, Python 中的坐标轴 (2023)。
[7] Plotly, Python 中的布局 (2023)。
[8] Google, Google 颜色选择器 (2023)。
[9] Plotly, Python 中的文本和注释 (2023)
[10] Plotly, Python 中的水平和垂直线条及矩形 (2023)。
ChatGPT — 小心使用
原文:
towardsdatascience.com/chat-gpt3-handle-with-care-8b6634781608
了解 ChatGPT 的实际能力和限制对于充分利用这一技术至关重要。香港大学人工智能研究中心的最新研究论文权衡了 OpenAi 算法的局限性和优势。
·发表在 Towards Data Science ·阅读时间 6 分钟·2023 年 3 月 13 日
–
图片由 Possessed Photography 提供,来源于 Unsplash
首先,出现了语言模型。直观上很简单:一个词序列中的下一个词可以用概率分布建模,并且严重依赖于前面的词。词汇是有限的语料库的一部分(英语词汇中有 170,000 个标记)。每个词的含义是有限的。词序列遵循缓慢变化的内部元数据集:语法。这是一个可预测的结构。你可以期待一个动词后面跟着名词,而不是另一个动词。语法和意义,作为限制,限制了下一个词预测中的随机性。这无疑比预测一千家公司第二天的股票价格要容易得多。此外,语言模型本质上是自回归的,下一个词的预测依赖于前面的词,而且需要考虑的潜在不可观测的变量也不多。
正因为如此,语言模型适合使用预训练模型和迁移学习。这是解锁新 AI 革命的关键特性。迁移学习意味着你可以使用别人预训练的模型,比如在 20 GB 的维基百科文章上训练的模型,而无需用自己的数据重新训练,只需进行少量调整以适应你的问题。
这怎么可能呢?好吧,你的语言问题不太可能需要使用与维基百科上完全不同的语法和词汇。迁移学习在人们开始争论第二次人工智能寒冬的时候,开启了新的人工智能夏季。
预训练模型变得更大、更快,随着参数数量和使用的数据量的增加,性能也得到了提升。经验发现,语言模型的性能会随着模型大小的增加而提升,直到达到计算能力的上限。计算机芯片已尽可能地强大。为了让语言模型持续增长,必须发生一些事情。高效地在多台机器上并行训练的方式是显而易见的。变压器的出现。
照片由Aditya Vyas拍摄,来源于Unsplash
由 Google Brain 团队发布的变压器语言模型,在传统语言序列模型上进行了一系列令人印象深刻的创新改进。其核心是广泛使用多头自注意力机制和设计为在多个并行 GPU 上运行的模型架构。注意力机制大大改善了语言模型中预测下一个词的任务,以比传统递归神经网络更高效的方式传播序列中所有词汇的信息。
变压器使得大规模、非常大规模的语言模型的预训练成为可能。从 2019 年的 GPT 2 的 15 亿参数,到 2020 年的 GPT3 的 1750 亿参数。铺平了 2022 年 ChatGPT 的惊人发布以及大型语言模型(LLM)时代的道路。
ChatGPT 在许多方面表现出色,但请注意幻觉。
这虽然是一个相当长的引言,但在放置背景时非常重要。语言模型不是黑魔法,也不是人工通用智能。它们不会在短时间内超越人类。它们是极其有用的工具,在预测序列中的下一个词方面表现出色。像所有人类发明的工具一样,如果我们不阅读说明书和细则,它们可能会造成伤害。
词汇是有限的,具有有限的意义,它们以可预测的方式组合,遵循语法结构。然而,信息,即意义的结合方式,是无限的,不一定是可预测的。像 ChatGPT 这样的超大语言模型可以生成全新的信息,完全是虚构的。这反过来又生成了未经验证的事实的新叙述。它们具有参数化的记忆,没有访问外部知识库的能力。我们已经看到它们在概率方面表现良好,但它们没有内部机制来分辨真相与谎言。简而言之,它们可能会出现幻觉。
请查看下面。我在这里假装自己是一位著名的数据科学家,询问 ChatGPT 关于我自己的问题。
作者提供的图片
ChatGPT 没错。可能我在妈妈面前很有名,但仅此而已。但接着我感到被冒犯了,完全编造了关于自己的额外信息。
作者提供的图片
当然,我不是 Kaggle 大师(我希望我能成为),但 AI 对我表示歉意。
ChatGPT 的突然流行在这一领域是前所未有的,这要归功于一个可以交互的界面,保留了积累的知识。对话界面使用了带有人工反馈的强化学习(RCHF)。问题在于,积累的知识可能基于显然不真实的后续问题和纠正。
Yejin Bang、Pascale Fung 及其博士团队几周前发布了一个广泛的框架,用于定量评估像 ChatGPT 这样的模型在公开可用数据集上的表现。作为一个零样本学习者——一个无需专门调整即可回答任何问题的模型——ChatGPT 在大多数任务中被评为最先进。其在问答、情感分析和虚假信息检测方面有了大幅提升。
图片来自论文: arxiv.org/pdf/2302.04023.pdf
关于推理,这是一个最具争议的特性之一,研究人员发现 ChatGPT 在演绎推理方面表现非常好,但在归纳推理和解决数学问题方面表现非常差。
演绎推理是从一般前提出发得出具体结论的过程,当前提包含足够的信息来引导你找到解决方案时效果良好。研究发现该算法在这些推理任务中表现优越。
图片来源于 Pascale Fung 的 YouTube 视频:www.youtube.com/watch?v=ORoTJZcLXek
归纳是逆向过程。它是从数据中提取信息以推断出一个普遍结论。演绎思维则是在你需要检验一个理论时所遵循的智力过程,而归纳思维则是帮助你形成一个理论的过程。换句话说,给定大量详细前提,你可以期望 ChatGPT 提出一些样本数据,但不要期望它根据一些样本数据提出一个通用规则。
实际上,ChatGPT 目前还无法像人类那样形成对世界的概念。
参考文献
Yejin Bang 等,《ChatGPT 在推理、幻想和互动方面的多任务、多语言、多模态评估》,arxiv.org/pdf/2302.04023.pdf
Pascale Fung,ChatGPT: Prof. Pascale Fung 所讲的《ChatGPT 能做什么和不能做什么》,www.youtube.com/watch?v=ORoTJZcLXek
阿希什·瓦斯瓦尼等人,注意力机制就是你所需要的,arxiv.org/pdf/1706.03762.pdf
使用贝叶斯推断与你的数据集对话。
原文:
towardsdatascience.com/chat-with-your-dataset-using-bayesian-inferences-bfd4dc7f8dcd
向数据集提出问题的能力一直是一个令人着迷的前景。你会惊讶于学习一个可以用来询问数据集的局部贝叶斯模型是多么简单。
·发表于 Towards Data Science ·13 分钟阅读·2023 年 11 月 13 日
–
图片由 Vadim Bogulov 提供,来源于 Unsplash
随着类似 ChatGPT 的模型的兴起,更多的人能够分析自己的数据集,并且可以说是“提问”。尽管这很棒,但在将其作为自动化流程中的分析步骤时,这种方法也有其缺点。这尤其适用于模型结果可能产生重大影响的情况。为了保持控制并确保结果准确,我们也可以使用贝叶斯推断与数据集对话。在这篇博客中,我们将逐步介绍如何学习贝叶斯模型,并在数据科学薪资数据集上应用 do-calculus。我将演示如何创建一个模型,让你“提问”数据集并保持控制。你会惊讶于使用 bnlearn 库创建这样一个模型的简便性。
介绍
从数据集中提取有价值的洞察对于数据科学家和分析师来说是一项持续的挑战。类似于 ChatGPT 的模型使得互动分析数据集变得更加容易,但与此同时,这种方法可能变得不够透明,甚至不清楚为什么做出某些选择。依赖这样的黑箱方法在自动化分析流程中远非理想。当模型的结果对采取的行动有重大影响时,创建透明模型尤其重要。
能够有效地与数据集进行沟通一直是研究人员和从业人员的一个令人着迷的前景。
在接下来的部分中,我将首先介绍 bnlearn 库 [1],以及如何学习因果网络。然后,我将演示如何使用混合数据集学习因果网络,以及如何应用 do-calculus 有效查询数据集。让我们看看贝叶斯推理如何帮助我们与数据集互动!
如果你觉得这篇文章有帮助,欢迎 关注我 ,因为我写了更多关于贝叶斯学习的内容。如果你考虑加入 Medium 会员,可以通过使用我的推荐链接来支持我的工作。价格和一杯咖啡一样,但这允许你每月无限阅读文章。
Bnlearn 库
Bnlearn 是一个强大的 Python 包,它提供了一整套用于贝叶斯网络因果分析的函数。它可以处理离散、混合和连续数据集,并提供了广泛的用户友好功能,用于因果学习,包括结构学习、参数学习和推理 [1–3]。在进行推理之前,我们需要理解结构学习和参数学习,因为推理依赖于这两种学习***。***
学习数据集的因果结构 是 bnlearn 的一个重要特性。结构学习消除了对变量之间潜在关系的先验知识或假设的需求。在 bnlearn 中,有三种方法可以学习因果模型并捕捉变量之间的依赖关系。结构学习将生成一个所谓的 有向无环图(DAG)。虽然这三种技术都会生成因果 DAG,但有些可以处理大量特征,而有些则具有更高的准确性。有关结构学习的更多细节,请参见 下面的博客。
-
基于评分的结构学习:使用评分函数 BIC、BDeu、k2、bds、aic,结合如 exhaustivesearch、hillclimbsearch、chow-liu、树增强朴素贝叶斯(TAN)、朴素贝叶斯等搜索策略。
-
基于约束的结构学习(PC):使用统计方法如卡方检验在建模之前测试边缘强度。
-
混合结构学习:(两种技术的结合)
-
基于评分、基于约束和混合结构学习。虽然这三种技术都会生成因果 DAG,但有些可以处理大量特征,而有些则具有更高的准确性。有关结构学习的更多细节,请参见下面的博客 [2]。
## 使用贝叶斯结构学习在 Python 中检测因果关系的逐步指南。
入门指南,帮助有效确定变量之间的因果关系。
towardsdatascience.com
参数学习 是贝叶斯网络分析的第二个重要部分,bnlearn 在这一领域也表现出色。通过利用一组数据样本和一个(预先确定的)DAG,我们可以估计条件概率分布或表(CPDs 或 CPTs)。有关参数学习的更多细节,我推荐 以下博客***😗**
如果你没有数据,但有专家知识,那么可以使用计算机辅助来转换这些知识的入门指南。
towardsdatascience.com
Bnlearn 还提供了大量的函数和辅助工具,以帮助用户完成整个分析过程。这些包括数据集转换函数、拓扑排序推导、图形比较工具、深刻的交互式绘图功能等。bnlearn 库支持加载 bif 文件,将有向图转换为无向图,并执行统计测试以评估变量之间的独立性。如果你想了解 bnlearn 相比其他因果库的表现,这个博客适合你:
## 贝叶斯因果推断的力量:对库进行比较分析,以揭示隐藏的…
通过使用最合适的贝叶斯因果推断库来揭示数据集中的隐藏因果变量:一个…
towardsdatascience.com
在下一部分,我们将开始使用 do-calculus 进行推断,并通过实际示例进行操作。这使我们能够向数据集提出问题。如前所述,结构学习和参数学习构成了基础。
查询数据集需要使用 do-calculus 进行推断。
当我们进行使用 do-calculus 进行推断时,这基本上意味着我们可以查询数据集并“提出问题”。为此,我们需要两个主要成分:DAG和分配给图中每个节点的 CPTs。CPTs 包含每个变量的概率,并捕捉给定其父节点的因果关系。让我们继续,创建一个示例,看看它是如何真正工作的。
使用数据科学薪资数据集的应用
为了演示,我们将使用从 ai-jobs.net [5] 派生的数据科学薪资数据集。这个薪资数据集是全球收集的,包含了 4134 个样本的 11 个特征。如果我们加载数据,我们可以探索列并将特征设置为连续或类别。请注意,模型复杂性随着类别数量的增加而增加,这意味着需要更多的数据和计算时间来确定因果 DAG。
# Install datazets.
!pip install datazets
# Import library
import datazets as dz
# Get the data science salary data set
df = dz.get('ds_salaries')
# The features are as following
df.columns
# 'work_year' > The year the salary was paid.
# 'experience_level' > The experience level in the job during the year.
# 'employment_type' > Type of employment: Part-time, full time, contract or freelance.
# 'job_title' > Name of the role.
# 'employee_residence' > Primary country of residence.
# 'remote_ratio' > Remote work: less than 20%, partially, more than 80%
# 'company_location' > Country of the employer's main office.
# 'company_size' > Average number of people that worked for the company during the year.
# 'salary' > Total gross salary amount paid.
# 'salary_currency' > Currency of the salary paid (ISO 4217 code).
# 'salary_in_usd' > Converted salary in USD.
复杂性是一个主要限制
当特征包含许多类别时,复杂性会随着与该表关联的父节点数量的增加而呈指数增长。换句话说,当你增加类别的数量时,需要大量的数据来获得可靠的结果。可以这样考虑:当你将数据划分为类别时,每个类别中的样本数量在每次划分后会变得更少。每个类别的样本数量低直接影响统计能力。在我们的例子中,我们有一个特征job_title
,它包含 99 个唯一的职称,其中 14 个职称(如数据科学家)包含 25 个样本或更多。剩余的 85 个职称要么是唯一的,要么只出现过几次。为了确保这个特征不会因统计能力不足而被模型移除,我们需要将一些职称进行聚合。在下面的代码部分,我们将职称聚合为 7 个主要类别。这会得到足够样本的类别,以用于贝叶斯建模。
# Group similar job titles
titles = [['data scientist', 'data science', 'research', 'applied', 'specialist', 'ai', 'machine learning'],
['engineer', 'etl'],
['analyst', 'bi', 'business', 'product', 'modeler', 'analytics'],
['manager', 'head', 'director'],
['architect', 'cloud', 'aws'],
['lead/principal', 'lead', 'principal'],
]
# Aggregate job titles
job_title = df['job_title'].str.lower().copy()
df['job_title'] = 'Other'
# Store the new names
for t in titles:
for name in t:
df['job_title'][list(map(lambda x: name in x, job_title))]=t[0]
print(df['job_title'].value_counts())
# engineer 1654
# data scientist 1238
# analyst 902
# manager 158
# architect 118
# lead/principal 55
# Other 9
# Name: job_title, dtype: int64
下一个预处理步骤是重命名一些特征名称。此外,我们还将添加一个新特征,描述公司是否位于美国或欧洲,并删除一些冗余变量,如salary_currency
和salary
。
# Rename catagorical variables for better understanding
df['experience_level'] = df['experience_level'].replace({'EN': 'Entry-level', 'MI': 'Junior Mid-level', 'SE': 'Intermediate Senior-level', 'EX': 'Expert Executive-level / Director'}, regex=True)
df['employment_type'] = df['employment_type'].replace({'PT': 'Part-time', 'FT': 'Full-time', 'CT': 'Contract', 'FL': 'Freelance'}, regex=True)
df['company_size'] = df['company_size'].replace({'S': 'Small (less than 50)', 'M': 'Medium (50 to 250)', 'L': 'Large (>250)'}, regex=True)
df['remote_ratio'] = df['remote_ratio'].replace({0: 'No remote', 50: 'Partially remote', 100: '>80% remote'}, regex=True)
import numpy as np
# Add new feature
df['country'] = 'USA'
countries_europe = ['SM', 'DE', 'GB', 'ES', 'FR', 'RU', 'IT', 'NL', 'CH', 'CF', 'FI', 'UA', 'IE', 'GR', 'MK', 'RO', 'AL', 'LT', 'BA', 'LV', 'EE', 'AM', 'HR', 'SI', 'PT', 'HU', 'AT', 'SK', 'CZ', 'DK', 'BE', 'MD', 'MT']
df['country'][np.isin(df['company_location'], countries_europe)]='europe'
# Remove redundant variables
salary_in_usd = df['salary_in_usd']
#df.drop(labels=['salary_currency', 'salary'], inplace=True, axis=1)
作为最后一步,我们需要离散化salary_in_usd
,这可以手动完成,也可以使用bnlearn中的discretizer
函数来完成。为了演示目的,我们将两者都做。在后者的情况下,我们假设薪资依赖于experience_level
和country
。更多细节请参见这篇博客[6]。基于这些输入变量,薪资然后被划分为不同的区间(参见下面的代码部分)。
# Discretize the salary feature.
discretize_method='manual'
import bnlearn as bn
# Discretize Manually
if discretize_method=='manual':
# Set salary
df['salary_in_usd'] = None
df['salary_in_usd'].loc[salary_in_usd<80000]='<80K'
df['salary_in_usd'].loc[np.logical_and(salary_in_usd>=80000, salary_in_usd<100000)]='80-100K'
df['salary_in_usd'].loc[np.logical_and(salary_in_usd>=100000, salary_in_usd<160000)]='100-160K'
df['salary_in_usd'].loc[np.logical_and(salary_in_usd>=160000, salary_in_usd<250000)]='160-250K'
df['salary_in_usd'].loc[salary_in_usd>=250000]='>250K'
else:
# Discretize automatically but with prior knowledge.
tmpdf = df[['experience_level', 'salary_in_usd', 'country']]
# Create edges
edges = [('experience_level', 'salary_in_usd'), ('country', 'salary_in_usd')]
# Create DAG based on edges
DAG = bn.make_DAG(edges)
bn.plot(DAG)
# Discretize the continous columns
df_disc = bn.discretize(tmpdf, edges, ["salary_in_usd"], max_iterations=1)
# Store
df['salary_in_usd'] = df_disc['salary_in_usd']
# Print
print(df['salary_in_usd'].value_counts())
最终的数据框
最终的数据框有 10 个特征和 4134 个样本。每个特征是一个具有两个或多个状态的分类特征。这个数据框将作为学习结构和确定因果 DAG 的输入。
# work_year experience_level ... country salary_in_usd
# 0 2023 Junior Mid-level ... USA >250K
# 1 2023 Intermediate Senior-level ... USA 160-250K
# 2 2023 Intermediate Senior-level ... USA 100-160K
# 3 2023 Intermediate Senior-level ... USA 160-250K
# 4 2023 Intermediate Senior-level ... USA 100-160K
# ... ... ... ... ...
# 4129 2020 Intermediate Senior-level ... USA >250K
# 4130 2021 Junior Mid-level ... USA 100-160K
# 4131 2020 Entry-level ... USA 100-160K
# 4132 2020 Entry-level ... USA 100-160K
# 4133 2021 Intermediate Senior-level ... USA 60-100K
#
# [4134 rows x 10 columns]
贝叶斯结构学习用于估计 DAG。
目前,我们已经对数据集进行了预处理,准备开始学习因果结构。bnlearn 中实现了六种算法来帮助完成这个任务。我们需要选择一种不需要目标变量的方法,并且它需要能够处理多个类别。可用的搜索策略有:
-
爬山搜索 算法是一种启发式搜索方法。它从一个空网络开始,根据评分指标迭代地添加或移除边。该算法探索不同的网络结构,并选择得分最高的一个。
-
穷举搜索 在所有可能的网络结构上进行穷举搜索,以找到最佳的贝叶斯网络。它根据指定的评分指标评估和打分每个结构。虽然这种方法能保证找到最佳的网络结构,但由于可能性呈指数级增长,对于大型网络来说计算开销可能很大。
-
约束搜索 在贝叶斯网络的结构学习过程中结合用户指定的约束或专家知识。它使用这些约束来引导搜索并限制可能的网络结构空间,确保所学习的网络符合指定的约束。
-
周-刘 算法是一种用于学习树结构贝叶斯网络结构的方法。它计算每对变量之间的互信息,并通过贪婪地选择最大化网络总互信息的边来构建一棵树。该算法高效且广泛用于学习离散贝叶斯网络的结构,但需要设置一个根节点。
-
朴素贝叶斯 算法假设数据集中所有特征在给定类别变量的条件下是条件独立的。它学习给定类别下每个特征的条件概率分布,并使用贝叶斯定理来计算给定特征下类别的后验概率。尽管有其朴素的假设,这种算法在分类任务中常被使用,并且对于大数据集来说效率较高。
-
TAN(树增强朴素贝叶斯)算法是朴素贝叶斯算法的扩展,允许在给定类别变量的条件下特征之间存在依赖关系。它学习一个连接特征的树结构,并使用该结构来建模条件依赖关系。TAN 将朴素贝叶斯的简单性与一定的建模能力相结合,使其成为处理相关特征分类任务的热门选择。此方法需要设置一个类别节点。
评分类型 BIC、K2、BDS、AIC 和 BDEU 被用来评估和比较不同的网络结构。例如,BIC 平衡了模型复杂性和数据拟合,而其他评分类型考虑了不同类型的先验概率。此外,independence test
从模型中剪除虚假的边。在我们的用例中,我将使用 hillclimbsearch
方法和评分类型 BIC
进行结构学习。我们不定义目标值,而是让 bnlearn 决定数据的整个因果结构。
# Structure learning
model = bn.structure_learning.fit(df, methodtype='hc', scoretype='bic')
# independence test
model = bn.independence_test(model, df, prune=False)
# Parameter learning to learn the CPTs. This step is required to make inferences.
model = bn.parameter_learning.fit(model, df, methodtype="bayes")
# Plot
bn.plot(model, title='Salary data set')
bn.plot(model, interactive=True, title='method=tan and score=bic')
图 1. 结构学习后,得到的因果 DAG。
图 2. 因果 DAG 的交互式图。
与你的数据集聊天。
使用学习到的DAG(图 1 和图 2),我们可以估计条件概率分布(CPTs,见下方代码部分),并使用do-calculus进行推断。让我们 开始提出问题吧。注意,结果可能会(略微)因模型中的随机成分而变化。
问题 1.
在大公司工作时,职位的概率是多少?
*P(job_title | company_size=Large (>250))*
在运行下面的代码部分后,我们可以看到工程科学家是最可能的结果 *(P=0.34)*
,其次是数据科学家 *(P=0.26)*
。
query = bn.inference.fit(model, variables=['job_title'],
evidence={'company_size': 'Large (>250)'})
# +----+----------------+-----------+
# | | job_title | p |
# +====+================+===========+
# | 0 | Other | 0.031616 |
# +----+----------------+-----------+
# | 1 | analyst | 0.209212 |
# +----+----------------+-----------+
# | 2 | architect | 0.0510425 |
# +----+----------------+-----------+
# | 3 | data scientist | 0.265006 |
# +----+----------------+-----------+
# | 4 | engineer | 0.343216 |
# +----+----------------+-----------+
# | 5 | lead/principal | 0.0407967 |
# +----+----------------+-----------+
# | 6 | manager | 0.0591106 |
# +----+----------------+-----------+
问题 2.
在全职工作类型、部分远程工作、数据科学职能为入门级且居住在德国(DE)的情况下,薪资范围的概率是多少?
在下面的结果中,我们可以看到我们的五个薪资类别,其中在这些条件下最强的后验概率 *P=0.7*
对应的薪资低于 80K。注意,其他薪资也会出现,但发生的频率较低。
通过改变变量和证据,我们可以提出各种问题。例如,我们现在可以改变经验水平、居住地、职位等,确定概率如何变化。
query = bn.inference.fit(model,
variables=['salary_in_usd'],
evidence={'employment_type': 'Full-time',
'remote_ratio': 'Partially remote',
'job_title': 'data scientist',
'employee_residence': 'DE',
'experience_level': 'Entry-level'})
# +----+-----------------+-----------+
# | | salary_in_usd | p |
# +====+=================+===========+
# | 0 | 100-160K | 0.0664068 |
# +----+-----------------+-----------+
# | 1 | 160-250K | 0.0424349 |
# +----+-----------------+-----------+
# | 2 | 80-100K | 0.117463 |
# +----+-----------------+-----------+
# | 3 | <80K | 0.707087 |
# +----+-----------------+-----------+
# | 4 | >250K | 0.0666078 |
# +----+-----------------+-----------+
结束语。
在这篇博客中,我们学习了如何创建贝叶斯模型,以及如何使用 do-calculus 对混合数据集进行推断。通过使用bnlearn,建立这些模型变得简单明了,模型提供了易于理解和解释的结果,这些结果可以轻松嵌入数据科学流程中。
保持安全。保持冷静。
干杯 E.
如果你觉得这篇文章有帮助,欢迎 关注我 ,因为我写了更多关于贝叶斯学习的内容。如果你考虑加入 Medium 会员,你可以通过使用我的推荐链接来支持我的工作。这和一杯咖啡的价格相同,但这让你每个月可以无限阅读文章。
软件
让我们联系吧!
参考文献
-
Taskesen, E. (2020). 使用 bnlearn Python 包学习贝叶斯网络(版本 0.3.22)[计算机软件]。
-
Taskesen E, 使用贝叶斯结构学习在 Python 中检测因果关系的逐步指南,Medium,2021
-
Taskesen E, 使用贝叶斯定理设计知识驱动模型的逐步指南,Medium,2021
-
Taskesen, E. (2020). 贝叶斯因果推断的力量:比较分析库以揭示数据集中隐藏的因果关系,Medium 2023。
-
Kay H. 等人, 使用贝叶斯结构时间序列模型推断因果影响,2015,《应用统计年鉴》(247–274,第 9 卷)
-
Taskesen, E (2023), 创建并探索数据科学中的角色和薪资景观*.* Medium。
聊天机器人即将颠覆音乐搜索
原文:
towardsdatascience.com/chatbots-are-about-to-disrupt-music-search-1e4a4cd7ba01
三个引人注目的范式转变理由
·发表于Towards Data Science ·11 分钟阅读·2023 年 6 月 9 日
–
图像由 DALL-E 生成,随后由作者编辑。
技术已经改变了我们搜索和发现音乐的方式。随着技术的不断进步,AI 聊天机器人作为一种有前景的工具,正被用来提升音乐搜索体验。凭借其进行对话互动和提供量身定制的推荐的能力,聊天机器人有望彻底改变我们探索和享受音乐的方式。在这篇博客文章中,我将呈现三个引人注目的理由,说明聊天机器人即将接管音乐搜索。
1 — 技术已经到来
Alexandre Debiève拍摄的照片,来源于Unsplash
最近的人工智能进展使聊天机器人技术达到了新的高度,使其能够以更高的智能和细致度理解和回应人类的查询。鉴于对话式搜索相较于传统方法的优势,微软和谷歌等行业巨头已经开始将 AI 聊天机器人应用到其网页搜索引擎中。
在音乐搜索领域,这一转变尤为相关,因为类似“谷歌搜索”的简单关键词搜索在过去几个月才逐渐受到关注。今年早些时候,一些音乐科技初创公司如Cyanite推出了基于自由文本的音乐搜索功能,作为一种突破性技术。在此之前,音乐搜索主要依赖于选择流派、情绪或艺术家,并在潜在的众多歌曲中筛选出所需的歌曲。
然而,像 ChatGPT 这样的模型的出现促进了从“自由文本”搜索到真正对话式搜索的过渡。这种变革性方法使我们能够克服重复的“输入-输出-重复”工作流程,并用动态和自然的对话取而代之。这种范式的转变与微软的 Bing 和 Google 等主要搜索引擎中所见的持续演变相一致。
此外,构建自定义音乐聊天机器人的可及性已达到前所未有的水平。实际上,我在不到一天的时间内以不到$5 的成本构建了自己的 音乐聊天机器人原型 —— 但更多内容将在后续帖子中详细介绍。尽管 ChatGPT 本身在音乐发现方面已经非常有用,但量身定制的聊天机器人系统提供了更精细的响应、与音乐数据库或网页播放器的无缝集成,并且对对话有更大的控制权。得益于开源社区的最新发展,基于特定领域或公司数据进行训练并根据个人需求定制的自定义聊天机器人的构建变得比以往任何时候都更容易。
2 — 对话是发现音乐最自然的方式
照片由 Christina @ wocintechchat.com 提供,发布在 Unsplash 上。
在音乐发现方面,对话提供了一种自然且直观的方式来探索和寻找新歌曲或艺术家。我们常常依赖朋友、音乐爱好者或专家的推荐,因为这些对话让我们可以表达自己的偏好并获得个性化建议。聊天机器人可以复制这种对话体验,使用户能够就音乐品味进行对话并获得量身定制的推荐。
相比之下,传统的“谷歌搜索”工作流程,我们在过去 20 年中已经习惯了,有时会感到不够直观。当以这种方式搜索音乐时,我们遵循一个严格的步骤顺序:
-
制作一个文本提示,描述我们要寻找的内容。
-
浏览响应并听一些曲目。
-
如果不满意,我们要么分析如何改进提示,使搜索引擎更好地理解我们,要么返回第 1 步。
这种方法的问题在于,每次搜索尝试都会有效地抹去所有先前的结果,即使这些结果对搜索过程的后续阶段可能有用。这种限制正是聊天机器人擅长的地方,因为它们具备存储整个搜索历史(即对话)的能力。
假设你的提示是
一首节奏适中的朋克摇滚歌曲,女歌手演唱,歌词内容关于单相思。
传统搜索引擎将执行搜索并推荐 20 首曲目,按预测相关性排序。你听了前 5 首曲目却不喜欢。它们要么是现场录音,要么节奏稍微快了些。于是,你更改了你的提示
一首录音室录音的朋克摇滚歌曲,节奏适中偏慢,女性歌手演唱,歌词关于单相思。
并重新开始搜索。搜索引擎进行另一次(可能代价高昂的)搜索,并向你推荐另外 20 首歌曲。这个过程会一直持续,直到你找到喜欢的曲目为止。
相比之下,音乐搜索聊天机器人以更优雅的方式解决了这个问题。你从你的提示开始
一首节奏适中、女性歌手演唱的朋克摇滚歌曲,歌词关于单相思。
聊天机器人很聪明,会要求你更精确地指定节奏,因为它知道否则结果可能不准确。你告诉聊天机器人“我不知道,也许 110-130 bpm?”而没有更改你的原始提示。考虑到从对话中收集的所有信息,聊天机器人发起了搜索,并向你展示了根据预测相关性排序的新 20 首曲目列表。
然而,在查看了前 5 个曲目后,你发现它们再次是现场录音,而你并没有将现场录音作为偏好。幸运的是,你无需回到提示阶段重新开始搜索过程,而是可以利用聊天机器人的能力来细化结果。你只需要求聊天机器人从推荐中排除所有现场录音。聊天机器人理解你的请求后,将现有的 20 首曲目分为两类:录音室录音和现场录音。然后,它会向你展示过滤后的结果,省去了再次进行昂贵搜索的必要。
将音乐搜索概念化为一个过程,而不是简单的输入输出操作,这种方法显然对那些通常不知道自己确切需求的用户有很大帮助。一个聊天机器人…
-
通过提问后续问题或指出不准确的表述来引导用户描述他们的需求
-
根据进一步的规格快速更新其推荐
具有大幅颠覆现有音乐搜索系统的潜力。
3 — 领域特定的音乐聊天机器人可以像口袋音乐学家一样
照片由 Jonas Leupe 提供,发布于 Unsplash
音乐聊天机器人最令人兴奋的前景之一是它们作为领域特定专家的潜力,类似于口袋音乐学家。音乐学家是对各种音乐类型、艺术家、历史背景以及其他复杂细节拥有广泛知识的个人。通过将这些专业知识封装在聊天机器人中,用户可以即时访问大量的信息和见解。
为了说明这一点,我们考虑一个场景:你正在寻找一个体现特定音乐特征的歌曲,但你只能通过“像 AC/DC 风格的吉他独奏”这样的参考来描述它。虽然一个合格的音乐搜索引擎可以搜索到吉他独奏的歌曲,但它可能难以理解这个参考,特别是当它的数据库中没有 AC/DC 的歌曲时。在这种情况下,你唯一的选择是尝试描述 AC/DC 吉他独奏的独特之处,这对没有丰富音乐知识的人来说可能很有挑战。
这就是口袋音乐学家聊天机器人的无价之处。一个经过多种来源(如专辑评论、粉丝论坛、乐谱和已发表的音乐分析)的训练的音乐聊天机器人,具备深刻的理解,知道典型的 AC/DC 吉他独奏是如何构建和演奏的。因此,聊天机器人可以将你的参考信息转化为精确的提示,以描述所需的音乐特征,从而被搜索引擎有效利用。
在这里,我要求 ChatGPT 列出一些 AC/DC 独奏的刻板特征。它给出的答案是:
1. 节奏蓝调的影响。
2. 简单且引人入胜的旋律。
3. 原始而粗犷的经典摇滚声音。
4. 强力和标志性吉他段。
5. 布鲁斯风格的弯音和颤音。
7. 高能量和激进的演奏风格。
当然,这些结果并不令人惊艳。然而,请记住,这是一个通用聊天机器人,没有经过特定的音乐学培训。你可以想象,像这样的领域特定聊天机器人能够提供更准确和详细的描述。
这只是将音乐聊天机器人概念化为口袋音乐学家的一个例子,说明它如何帮助改善搜索体验。然而,可能性是无穷的。例如,你可以开始对话,要求聊天机器人列出一些有趣的爵士乐子类型,并解释每种类型的主要特点。然后,你可以选择一个听起来有趣的类型,并在该类型内发起搜索。考虑一下:当 ChatGPT 在 2022 年底发布时,没人能预见到它将为数百万用户提供的广泛用途。基于聊天机器人的音乐搜索同样适用。
开放性问题
图片来源:JESHOOTS.COM 在 Unsplash
聊天还是不聊天
在前面的部分中,我提出了三个理由,说明我们可能正处于音乐搜索范式转变的边缘。虽然对这些论点的有效性可能存在不同意见,但关键问题在于,基于聊天机器人的音乐搜索的优势和可行性是否能说服公司和研究机构开发这项技术。
绝不是显而易见的,聊天机器人会完全取代传统搜索引擎。幸运的是,我们可以深入研究其他搜索领域的进展,特别是网络搜索。尽管如新必应、谷歌搜索和 Perplexity AI 等网络搜索聊天机器人已经出现,但它们的使用仍主要限于技术爱好者和人工智能专业人士。显然,这些聊天机器人尚未获得与通用(并且离线!)聊天机器人 ChatGPT 相媲美的广泛采用。最显著的是,它们远未替代传统的谷歌搜索引擎。
尽管这可能部分由于产品成熟和潜在用户采纳所需的时间,但也有实际考虑因素有利于继续使用更传统的基于关键词或语义的搜索。例如,搜索引擎常被用来查找我们曾经遇到过但不记得完整名称或网址的特定文章、网站或歌曲。在这种情况下,使用基于关键词的搜索并将搜索输入与与输入的关键词紧密匹配的结果对比,更为实际。利用像聊天机器人这样的复杂技术来完成这一任务就像用大锤去砸坚果一样。
此外,并不是每次互动都需要是对话。例如,当在特定的音乐类型中搜索歌曲时,你可能更希望不与 AI 机器人进行对话。这有两个原因。首先,你可能希望获得即时结果,因此任何偏离提供搜索结果的搜索引擎回应都是浪费时间。其次,使用聊天机器人可能将纯粹机械的音乐搜索行为转变为社交互动。这种潜在的社交方面可能被视为一种缺点,特别是对于那些寻求通过音乐逃避社交环境的人来说。
总而言之,我预计这种范式转变不会完全消除传统的音乐搜索方法。相反,我设想聊天机器人将被用于用户寻求指导和咨询的场景,而不是快速筛选音乐目录。在生产音乐领域,基于聊天机器人的搜索可以大大帮助找到适合商业广告或 YouTube 视频的完美曲目。然而,对于普通的音乐流媒体服务用户而言,大多数情况下还是采用更传统的搜索系统可能更为实际。最终,这种范式转变可能会表现为生产音乐库和音乐流媒体服务结合两种类型的搜索,以满足用户的多样化需求。
技术实现
在今天的技术环境中,构建符合特定业务需求的定制聊天机器人变得异常容易。有几种方法可以实现这一点。一种方法是利用像 OpenAI 的 GPT 模型这样的基础模型,通过 API 进行调用,并用自定义逻辑进行增强。另一种方法是利用开源语言模型,并使用领域特定数据对其进行微调,以确保其相关性和准确性。
通过 API 使用像 GPT-4 这样的预构建基础模型提供了许多优点。首先,它使企业能够直接利用这些模型,而无需额外的数据获取、准备或机器学习工作。这对于数据科学家有限或没有的公司尤其有利,因为它将任务简化为软件工程问题。其次,不需要担心构建本地或云基础设施以满足这些大型模型的计算需求。通过利用 API,企业可以以相对较低的成本访问托管解决方案。
一个缺点是,你的数据,包括用户搜索输入、音乐元数据等,可能会被模型提供者(例如 OpenAI)访问,甚至用于进一步训练他们的模型。这可能不符合内部数据治理指南或外部法规,具体取决于你的情况。另一个缺点是这些第三方解决方案通常不允许在你的数据上对其模型进行微调。因此,无法开发之前描述的那种“口袋音乐专家”。
另一方面,使用自己基础设施上的开源模型有几个优势。首先,没有限制可以完全定制一个聊天机器人以满足你的具体需求。通过微调过程,你可以将其转变为全面的音乐专家,或训练它理解你公司或领域内使用的特定词汇。其次,工作流的每一步,包括微调和模型推断,都可以在你的基础设施中实现。这消除了对内部指南或外部法规合规性的任何顾虑。
使用开源模型构建自己的聊天机器人有一个缺点,即会产生显著的工程开销。这会消耗计算和人力资源,在看到初步结果之前,你可能会犹豫是否投资于这种产品。此外,开源模型更新换代的速度很快。因此,你需要过渡到更新的模型,并定期重复微调过程,从而消耗额外资源。相比之下,通过 API 提供的托管解决方案提供了更大的灵活性,可以尝试并切换到其他聊天机器人模型。
总之,如果你的目标是开发一个快速原型或缺乏在适当基础设施中微调和部署自己模型所需的人力资源,我建议目前选择一个托管的 API 解决方案。这正是我为我的聊天机器人原型所做的,你可以从我的方法中获得灵感。然而,值得注意的是,这些解决方案可能会被更先进和定制的系统所超越,比如基于开源模型的系统。
进一步阅读
如果你对这样的系统如何实现感兴趣,可以考虑查看我在不到一天内构建的音乐搜索聊天机器人,链接在这个GitHub 仓库中。我正在编写一篇后续文章,详细描述我如何构建它。
这里还有两篇关于音乐 AI 当前发展的文章,你可能会喜欢:
-
AudioGPT — 未来音乐创作的瞥见
聊天机器人陷入(法律)交火中
GDPR、人工智能法、DSA 和公共体面之间
·
关注 发表在 Towards Data Science ·9 分钟阅读·2023 年 12 月 22 日
–
图片由 Ant Rozetsky 提供,来源于 Unsplash
最近,我一直在尝试提供一些法律建议,关于如何在不踩欧洲监管雷区的情况下实施聊天机器人。在这个过程中,我总是喜欢查看“别人是怎么做的”,然而,当涉及到这个特定问题时,这是一条相当令人失望的途径。似乎对于目前在每第三个网站上实现的技术,提供从法律到烹饪等各种建议的技术,关于如何实施这些机器人并没有太多的书面资料。当我说应该如何做时,我并不是指最佳的网络安全和安全建议或最佳的微调或训练建议。我是指如何、何时以及为哪些用途可以使用机器人,我可以使用哪些数据来训练它,以及我需要与用户分享哪些信息,以确保我的机器人至少在一定程度上符合大多数欧洲法规?(欧洲,仅仅是为了相对简单,但我提出的大多数建议也应被视为对用户的基本体面。)
无论如何,我坐下来做了我通常在面对法律麻烦时会做的事情。我写下了这些内容。
实施 ChatBot 101
1. 选择聊天机器人
尽管这听起来很简单,但这远非一个微不足道的问题。选项众多,包括使用开源代码自行构建聊天机器人。[1] 使用市场上提供的众多聊天机器人 API 中的一个,允许你进行最简单、最快速的准备设置。[2] 基于这些 API 之一对自己的聊天机器人进行微调。[3] 使用各种聊天机器人工具对聊天机器人进行微调。[4] 或者通过选择聊天机器人即服务(Chatbot as a Service)来支付别人代劳。[5]
选择这些选项中的任何一个都不无波及效应。这些波及效应当然包括设置机器人的性能和灵活性,但也包括遵守法律义务的特定要求。例如,从头开发自己的机器人或完全依赖开源代码,数据保护方面绝对是最安全的选项,因为你掌控所有的训练数据,并且数据不会流向其他地方。然而,这也有其缺点,只有在拥有足够的专家资源来确保设置和运行的同时保证一定的性能水平时,才应当考虑这个选项。相反,依赖 API 总是涉及一定程度的数据泄露风险。更不用说你依赖于别人的表现,并且至少在第一时间对他们的错误负责(GDPR 共同控制警告)。当使用其他工具进行微调时,情况当然会变得更加复杂。
最简单的选择可能是将麻烦留给别人,直接购买产品或服务。然而,除了这是最昂贵的方式(尤其是如果你想要一个高度个性化的机器人),这个选项也有其陷阱,因此在选择要雇佣的具体机器人时需要非常小心,同时考虑所有公开共享的数据处理实践、使用的训练数据等信息。否则,你可能会再次陷入麻烦,因为未能遵守应尽的尽职调查义务。
2. 细调聊天机器人
一旦你选择了你的机器人,并且假设你选择了一个包括一些细调的选项,恭喜你!你刚刚从火坑跳入了火炉。不论你是使用自动细调工具还是利用开源代码,卷起袖子自己动手,喂入模型的数据与你选择模型一样重要。
我们都已经熟悉了垃圾进垃圾出的整个议程,但还有另一个可能更重要的议程需要考虑。那就是法律问题的风险。我们已经通过艺术家和报纸对大型语言模型提供者提起的诉讼对这一概念有了一定的了解。而且,很可能的情况是,一旦法律情况在那里得到澄清,这些诉讼可能会扩展到任何 1. 使用他们的产品或服务的人以及 2. 做类似事情的人。关键的启示当然是,跟踪该领域的法律发展,不要用(可能)违法的数据来训练你的模型。我们还可以增加一个额外的建议,避免在任何情况下将个人数据喂给你的模型。暂且不谈版权问题,在非绝对必要的情况下使用个人数据总会让你陷入麻烦。
最后一个需要考虑的可能性和潜在问题是,如今你甚至不需要对模型进行细调。你可以通过进一步的 API 调用或网站调用来不断进行所谓的细调,从中获取机器人响应的数据。如果是这种情况,确保遵守原始网站提供者对数据使用的任何限制。这些限制可以以 robots.txt 文件的形式出现,也可能在其条款和条件中说明。是的,即使是爬取和链接也有其限制。
3. 免责声明
如果有一件法律专家永远不嫌多的事情,那就是‘免责声明’。因此,确保在你的聊天机器人中实现足够数量的免责声明。两个绝对不可妥协的要点是,与 AI 系统互动的人需要在开始互动之前了解这一事实,以及了解输出可能不准确且不应被依赖。这两个点可以很好地打包成一个弹出窗口,但也应在网站上的某个地方持续可见,或者用户可以被反复提醒它们的存在。这里“宁可过于透明,也不要后悔”是适用的。
隐私通知也是如此,整个通知本身就是一种免责声明。虽然大型语言模型的工作原理需要计算机科学学位才能略微理解,但你仍然需要尽量在隐私通知的有限范围内使其易于理解。想象一下如何向你的六岁孩子或可能是你的祖父母解释模型的工作原理,然后从那里开始。图片、视频和图形都非常受欢迎。另一方面,如果你使用了第 1 步中提到的任何 API 或自动化工具,你当然可以链接相关服务提供商的隐私通知,但这并不意味着你就此免责。在这种特定情况下,你是提供服务的人,是处理问题和投诉的首要联系人。因此,你有责任解释用户数据的流向、为什么这样做是必要的以及如何停止处理。这再次需要一些技能和创造力,以便做到透明和适当。祝你好运解决这个难题!
4. 输出
现在我们终于到了输出部分,所以我们肯定要接近尾声了。如果你这么想,那你是对的!至少在某种程度上是如此。这个问题仍然是一座需要单独攀登的山峰。除了已经提到的免责声明,说明结果可能不准确之外,还有一些其他需要考虑的因素,因为可能出现不准确性的原因有很多。第一个原因当然是大语言模型臭名昭著的幻觉,由于它们对我们如此慷慨喂给它们的数据本质上缺乏理解。此外,除了祈祷一些非常聪明的人能找出解决方法,我们别无他法,除了实施我们的免责声明。
然而,另一方面,我们面临的情况有所不同,这适用于所有爬取其他网站以查找和输出信息的聊天机器人。因此,你现在需要问自己,如果抓取的信息是虚假的或甚至是非法的,会发生什么。对于这种情况,最好依赖于所谓的“托管例外”,即现已陈旧的电子商务指令第 14 条中的内容。例如,这一例外也适用于搜索引擎,保证了主机和中介不对他们仅提供访问的内容承担责任。不过,这仅在内容不是明显违法的情况下适用。因此,为了最大程度地简化这一点。首先,只爬取和抓取你事先检查过的可信信息来源(不要试图充当谷歌)。其次,确保在所有聊天机器人的输出中集成参考,以便所有信息的原始来源都能立即可见。
还有一件值得考虑的事,并值得投入额外的编码时间,即集成跟进问题以应对用户初始输入非常广泛或不明确的情况。通过这种方式,你的机器人可以重新提示用户,以便用户提供更好的提示。这将反过来使模型产生更好的输出,无论是准确性还是性能方面。
5. 质量重于速度
为了再次强调这一点,因为它似乎总是归结于此。特别注意你机器人输出的质量,因为这是它们最显著和最明显的问题之一。在意大利 ChatGPT 临时禁令的争议中,不准确的输出旨在证明训练数据的不准确性。[6] 幻觉,作为一种输出缺陷,一直以来都是主要关注点,也仍然阻碍着聊天机器人进入搜索引擎领域。[7] 我们甚至不会讨论算法偏见/垃圾进垃圾出的争论。[8]
除了幻觉,这些仍然是单独的难题,输出的准确性和质量可以通过特别注意训练数据的准确性和质量大大提高。以及这些数据的相关性。此外,如果你通过 API 调用或其他方式主动获取数据,你所获取的数据也应该进行准确性、代表性以及适当性的双重检查。最后,你应该有适当的机制来识别任何必要的更新或需要更新的数据集的变化,当然,也要有一些机制来适当地回应这些识别出的事件。
质量是一个持续关注的问题,而不是一次性完成的检查项目。这一切都需要成本,主要是时间上的,这使得开发过程变得更慢。然而,质量应始终优先于速度,因为并不是所有人都能承受‘快速行动和破坏’的代价。 [9 ] 至少在他们试图开发一个可持续和负责任的商业模式时不能如此。
最后的思考
尽管我一般提倡一种更具深思熟虑和负责任的创新方法,但似乎行业正在倾向于‘快速行动和破坏’的口号,跑步机转动得越来越快。没有人愿意在我们这个时代最重要的比赛中落后。然而,当 OpenAI 忙于开发 AGI,律师们争相定义什么是 AI 系统时,很多初创企业和商业人士心中似乎存在着一些相关性较小的问题。然而,一旦我们考虑到这些问题的规模及其影响的参与者数量,这些问题的琐碎性就会消失。其中一个问题是如何在尽量少踩法律泥潭的情况下开发和实施聊天机器人?希望这篇文章能帮助那些试图正确行事的人们走上正确的道路。
图片由 William Navarro 提供,来源于 Unsplash
[1 ] 2023 年最佳开源聊天机器人平台, botpress, 2022 年 7 月 14 日, botpress.com/blog/open-source-chatbots
。
[2 ] Jesse Sumrak, 2023 年最佳聊天机器人 API, twilio BLOG, 2022 年 12 月 27 日, www.twilio.com/blog/best-chatbot-apis
。
[3 ] Olasimbo Arigbabu, 微调 OpenAI GPT-3 以构建定制聊天机器人, Medium, 2023 年 1 月 25 日, medium.com/@olahsymbo/fine-tuning-openai-gpt-3-to-build-custom-chatbot-fe2dea524561
。
[4 ] Ali Mahdi, 8 款聊天机器人替代品:哪个工具适合你?, Chatling, 2023 年 11 月 11 日, chatling.ai/blog/chatbot-alternatives
。
[5 ] Allen Bernard, 2023 年你应该了解的 10 大聊天机器人提供商, CMS WIRE, 2023 年 3 月 10 日, www.cmswire.com/digital-experience/10-chatbot-providers-you-should-know-about/
。
[6 ] GPDP, 人工智能:监管机构阻止 ChatGPT。非法收集个人数据。缺乏未成年年龄验证系统, 2023 年 3 月 31 日, www.gpdp.it/web/guest/home/docweb/-/docweb-display/docweb/9870847#english
。
[7] 威尔·道格拉斯·赫文,聊天机器人有一天可能会取代搜索引擎。这就是为什么这是个糟糕主意的原因,《麻省理工科技评论》,2022 年 3 月 29 日,www.technologyreview.com/2022/03/29/1048439/chatbots-replace-search-engine-terrible-idea/
。
[8] 伊莎贝尔·布斯凯特,人工智能的崛起将焦点集中在算法的偏见上,《华尔街日报》,2023 年 3 月 9 日,www.wsj.com/articles/rise-of-ai-puts-spotlight-on-bias-in-algorithms-26ee6cc9
;拉胡尔·阿瓦蒂,垃圾进,垃圾出(GIGO),TechTarget,www.techtarget.com/searchsoftwarequality/definition/garbage-in-garbage-out
。
[9] 比阿特丽斯·诺兰,硅谷有了一个新的版本的“快速行动和打破常规”口号,商业内幕,2023 年 12 月 6 日,www.businessinsider.com/silicon-valley-move-fast-and-break-things-sam-altman-openai-2023-12
。
ChatGPT 高级数据分析用于自定义 Matplotlib 井眼日志图表
使用 OpenAI 的代码解释器创建用于岩石物理和地球科学解释的井眼日志图表
·发表于Towards Data Science ·15 分钟阅读·2023 年 9 月 18 日
–
ChatGPT 的代码解释器,现在更名为高级数据分析,已经推出了一段时间。它于 2023 年 7 月 6 日发布,是一个由 OpenAI 开发的插件,允许用户上传数据并进行分析。这包括数据清理、创建可视化和数据总结等。
与其依赖你编写 Python 代码来分析数据,你可以通过用简单的英语告诉 ChatGPT 你想做什么。然后,它将为你进行分析。
正如我的许多常规读者所知道的,我是matplotlib的大粉丝。尽管这个库看起来笨拙且耗时,但只需一点努力,就能用它创建令人惊叹的可视化图表。
在玩弄这个新工具之后,我觉得是时候看看如何使用ChatGPT和高级数据分析插件来创建自定义的井眼日志数据图表了。
在继续之前,鉴于针对 OpenAI 的法律案件不断增加:
始终对上传到 ChatGPT 的数据保持谨慎,因为这些数据和你的输入可能会被用于训练未来的模型。如果有疑问,避免上传任何数据,并始终遵循公司政策。
启用 ChatGPT 中的高级数据分析
要在 ChatGPT 中使用高级数据分析插件,首先需要启用它。
这可以通过进入设置并选择 Beta 功能来完成。在这里,你将看到启用高级数据分析的选项,这将启用该插件。
在 ChatGPT 中启用高级数据分析插件。图片由作者提供。
插件现在将在你开始新的聊天时可用。
将数据上传并转换为 Pandas 数据框
首先,我们需要上传我们的文件。对于这个例子,我使用了来自NLOG 数据库的测井数据集(文章末尾有详细信息)。这个数据集包含从一个油气勘探井获得的一系列测井数据。
首先,我们点击聊天输入框上的加号图标,然后选择包含我们数据的文件。
高级数据分析插件的聊天输入框包括一个用于上传数据的加号 (+) 图标。图片由作者提供。
接下来,我们需要给 ChatGPT 提供一个提示。在这种情况下,我将告诉它扮演一个岩石物理学家(地球科学中的一个冷门角色),并且它理解测井数据。这可以帮助微调 ChatGPT 返回的一些响应。
初始提示给 ChatGPT,包含测井数据集。图片由作者提供。
提交上述输入后,ChatGPT 将加载文件并查看内容。
以下是我们从 ChatGPT 的高级数据分析插件获得的响应,它提供了有关数据集中每个测量项的信息。
在这种情况下,它使用 pandas 将 CSV 文件读取到数据框中,然后使用常见的df.head()
命令输出表头。
ChatGPT 分析的测井数据集的初步分析和总结。图片由作者提供。
关于文件中曲线的评论大多是正确的。然而,也有一些不一致之处,比如 DT 被称为 Delta-Time。这部分正确;然而,这条曲线表示的是声波压缩速度,是通过声学工具发射的声波在地层中传播的压缩到达时间的测量。
在我使用 ChatGPT 的经验中,我发现它在处理诸如岩石物理学等冷门主题时可能会遇到挑战,并可能返回不正确的信息。这是每个人在使用大型语言模型(LLMs)时都应该注意的事情。
始终仔细检查输出,确保其合理。
我之前在下面的文章中讨论过这个话题:
## OpenAI 的惊人 ChatGPT:它对冷门话题有希望吗?
向 ChatGPT 询问岩石物理学
[towardsdatascience.com
点击“显示工作”下拉框,我们可以检查用于加载数据的代码。我们可以看到它进行了基本的 Python 编程,将我们的 CSV 文件读取到一个pandas 数据框中。
import pandas as pd
# Load the data from the provided CSV file
well_data = pd.read_csv("/mnt/data/L0509WellData.csv")
# Display the first few rows of the data
well_data.head()
ChatGPT 还识别出一些曲线中的占位符值为-999。这些值代表缺失的数据。然而,正如我们将看到的,这可能会引起一些混淆和问题。
使用代码解释器进行数据探索
在处理任何数据集时,最耗时的部分是理解你拥有的数据,进行数据质量检查以及清理数据。
这是我个人认为 ChatGPT 的高级数据分析插件对岩石物理学家和数据科学家最有帮助的地方。然而,像往常一样,你必须检查这些 AI 系统产生的结果和工作,因为它们可能无意中犯了一些错误。
在数据清理步骤的实验过程中,ChatGPT 在将-999 值转换为 NaNs 时遇到了困难。在进行此操作时,它还将列的数据类型转换为字符串。
结果,我必须在请求中具体说明,以确保它保持列为数值型。
更具体的提示以让 ChatGPT 高级数据分析插件将-999 值转换为 NaNs。图片由作者提供。
它最终返回了以下响应:
ChatGPT 对将-999 值替换为 NaNs 的响应。图片由作者提供。
以及以下代码
# Replace -999 values with NaN
well_data.replace(-999, float("nan"), inplace=True)
# Display the first few rows of the updated data
well_data.head()
这生成了以下输出:
RESULT
DEPTH GR DT RHOB DRHO NPHI
0 4609.8008 89.059479 <NA> 2.483700 0.018494 0.129119
1 4609.9008 90.721848 <NA> 2.489308 0.013656 0.108034
2 4610.0008 90.709061 <NA> 2.501088 0.011289 0.085650
3 4610.1008 89.568954 66.223099 2.515450 0.008615 0.070332
4 4610.2008 88.169571 66.705551 2.530982 0.005628 0.065343
这很有趣且有点奇怪,因为响应试图将字符串nan
转换为浮点数。我本来会在数据框的替换函数中使用np.nan
来用 NaNs 替换-999 值。然而,目前这似乎有效,但以后会导致一些问题。
生成描述性总结
接下来,我们来看看是否可以使用以下简单提示获取数据集中每个测量值的描述性总结表。
ChatGPT 提示生成一个关于测井数据集的简单描述性总结。图片由作者提供。
ChatGPT 在其响应中返回了以下表格。
ChatGPT 总结表提供了测井数据的信息和统计数据。图片由作者提供。
初看起来,这可能和df.describe()
函数的输出相同;然而,ChatGPT 还为每个测量值添加了单位。如果我们想把这些内容放入报告中,这很方便。尽管将单位放在左侧的行头而不是每个单元格中会更好。
此外,它将孔隙度单位从小数转换为百分比。这在报告或将信息传递给同事时可能会造成误导。我希望它能将数据保持在原始单位。
最终,由于存在空值,它未能为 DT 曲线创建统计数据——这与之前 ChatGPT 未能将-999 值转换为空值的部分相关。然而,如果我们使用df.describe()
方法,并且数据是数值型的,我们仍然可以看到该曲线的统计数据。
对于不了解情况的数据分析师,这可能会被忽视而未被发现。
使用 Matplotlib 和 ChatGPT 高级数据分析插件创建测井图
当我第一次开始在 Medium 上写文章时,我专注于如何使用 matplotlib 创建基本的测井图以及如何使用 Python 处理测井数据。由于我对 Python 相对陌生且在编写代码时遇到困难,这个过程花费了很多时间。
本质上,测井图由子图组成,这些子图通常称为轨迹。在每个轨迹中,不同的科学测量结果被绘制出来,这些测量可以结合使用以制定地下解释。每个测量结果都以深度为 y 轴进行绘图。
作为对 ChatGPT 高级数据分析插件的快速测试,我想看看它是否可以通过我之前的文章中的几个简单提示来帮助重新创建测井图。
使用 matplotlib 生成的示例测井图。作者提供的图片。
第一步是让它创建一个基本的测井图,其中每个测量结果都显示在各自的子图中。
生成测井图的初始提示。作者提供的图片。
在第一次处理和编写代码后,ChatGPT 再次遇到了数据集中的 NaN 值问题。因此,它不得不重新创建图表。
使用 ChatGPT 的高级数据分析插件生成的基本测井图。作者提供的图片。
一旦图表生成,它将返回一个相对不错的首次测井数据图。
有趣的是,它对图表还做了一些调整,包括:
-
反转 y 轴,以便从浅层深度到深层深度
-
对一些测量应用了标准刻度,例如 GR 的刻度范围为 0 到 150
ChatGPT 生成的代码如下:
# Setting up the figure and axes again
fig, ax = plt.subplots(nrows=1, ncols=6, figsize=(15, 10), sharey=True)
# Plotting DEPTH on the first track
ax[0].plot(well_data['DEPTH'], well_data['DEPTH'], color='black')
ax[0].set_title('DEPTH')
ax[0].set_ylabel('Depth (m)')
ax[0].invert_yaxis() # Invert the y-axis to have depth increasing downwards
ax[0].grid()
# Plotting GR on the second track
ax[1].plot(well_data['GR'], well_data['DEPTH'], color='green')
ax[1].set_title('GR (Gamma Ray)')
ax[1].set_xlim(0, 150) # Typical scale for GR
ax[1].grid()
# Plotting DT on the third track (excluding NaN values)
ax[2].plot(well_data['DT'].dropna(), well_data['DEPTH'].loc[well_data['DT'].dropna().index], color='blue')
ax[2].set_title('DT (Delta Time)')
ax[2].grid()
# Plotting RHOB on the fourth track
ax[3].plot(well_data['RHOB'], well_data['DEPTH'], color='red')
ax[3].set_title('RHOB (Bulk Density)')
ax[3].set_xlim(1.5, 3.0) # Typical scale for RHOB
ax[3].grid()
# Plotting DRHO on the fifth track
ax[4].plot(well_data['DRHO'], well_data['DEPTH'], color='cyan')
ax[4].set_title('DRHO')
ax[4].grid()
# Plotting NPHI on the sixth track
ax[5].plot(well_data['NPHI'], well_data['DEPTH'], color='magenta')
ax[5].set_title('NPHI (Neutron Porosity)')
ax[5].set_xlim(-0.15, 0.45) # Typical scale for NPHI
ax[5].grid()
plt.tight_layout()
plt.show()
这段代码与 我早期文章中的代码 非常相似,但不是使用 subplot2grid,而是访问单独的轴并添加图表。
我们现在可以对这个图进行修改,一次进行多个更改。
在使用 ChatGPT 时,我发现将提示分解为单独的指令有助于获得所需的输出。然而,为了观察 ChatGPT 的代码解释器如何处理多个命令,我们可以使用以下提示来进行更改:
-
移除包含深度曲线的子图
-
向每个子图添加网格线
-
为每个子图添加右侧和顶部的脊线
-
为每条曲线添加标准颜色
-
确保所有曲线都有定义的 x 轴刻度范围
在 ChatGPT 提示中进行多个请求以改善井日志图。图像由作者提供。
在进一步处理后,ChatGPT 返回了包含我请求的更改的图。
根据建议的更改后的基本井日志图。图像由作者提供。
它还将代码从对每个轴的单独调用重构为使用循环遍历每个测量值,并使用一些公共函数(如脊线和网格颜色)来应用更改。
# Setting up the figure and axes with one less subplot for depth
fig, ax = plt.subplots(nrows=1, ncols=5, figsize=(15, 10), sharey=True)
# Define a dictionary for colors and scales for each log
colors = {
"GR": "green",
"DT": "magenta",
"RHOB": "red",
"DRHO": "grey",
"NPHI": "blue"
}
scales = {
"GR": (0, 150),
"DT": (140, 40),
"RHOB": (1.95, 2.95),
"DRHO": (-0.2, 0.2),
"NPHI": (0.45, -0.15)
}
# Plotting each log with the specified colors and scales
logs = ['GR', 'DT', 'RHOB', 'DRHO', 'NPHI']
for i, log in enumerate(logs):
ax[i].plot(well_data[log], well_data['DEPTH'], color=colors[log])
ax[i].set_xlim(scales[log])
ax[i].set_title(log)
ax[i].grid(color="lightgrey")
# Adding top and right spines
ax[i].spines['top'].set_visible(True)
ax[i].spines['right'].set_visible(True)
ax[0].set_ylabel('Depth (m)')
ax[0].invert_yaxis() # Invert the y-axis to have depth increasing downwards
plt.tight_layout()
plt.show()
在 Y 轴和一条线之间添加变量填充
在日志图中,通常会在曲线和子图边缘之间应用阴影和额外填充。这有助于岩石物理学家通过可视化来理解数据。
一种方法是为伽马射线(GR)应用变量阴影,以帮助识别页岩和非页岩区间。为此,我们通常使用黄色 — 橙色 — 棕色色图,这可以帮助将干净的储层区间显示为更亮的颜色,将更具页岩特征的区间显示为更暗的颜色。
我在下面的早期文章中详细介绍了这个过程。
使用 matplotlib 对井日志数据应用颜色填充
towardsdatascience.com](/enhancing-visualization-of-well-logs-with-plot-fills-72d9dcd10c1b?source=post_page-----b857c68fa42--------------------------------)
我以前尝试过使用 ChatGPT 和代码解释器,但总是失败。也许这与我如何编写提示有关。
让我们看看 ChatGPT 是否可以通过在提示中更具体地创建一个 YlOrBr 颜色地图阴影来帮助 GR 曲线。
ChatGPT 提示以创建 GR — 伽马射线曲线的变量阴影。图像由作者提供。
我们得到以下图:
ChatGPT 数据分析插件生成 GR 曲线的变量阴影。图像由作者提供。
在第一次尝试中,它成功地在子图上填充了颜色。然而,它没有从子图的左侧到线条进行填充。
我们可以看看 ChatGPT 是否会纠正这一点:
提示仅从子图的左侧到曲线应用填充。图片由作者提供。
并且它确实做到了,这非常令人惊讶,因为之前的尝试都失败了。
ChatGPT 为变量填充修正图表后的日志图。图片由作者提供。
我们可以仔细查看代码,了解它是如何生成图表的。
# Setting up the figure and axes again
fig, ax = plt.subplots(nrows=1, ncols=5, figsize=(15, 10), sharey=True)
# Plotting each log with the specified colors and scales, excluding NaN values for DT
for i, log in enumerate(logs):
valid_indices = well_data[log].dropna().index
ax[i].plot(well_data[log].loc[valid_indices], well_data['DEPTH'].loc[valid_indices], color=colors[log])
ax[i].set_xlim(scales[log])
ax[i].set_title(log)
ax[i].grid(color="lightgrey")
# Adding top and right spines
ax[i].spines['top'].set_visible(True)
ax[i].spines['right'].set_visible(True)
# Adding the fill for the GR subplot
if log == 'GR':
# Add color based on the value of the GR line
for depth, value in zip(well_data['DEPTH'].loc[valid_indices], well_data[log].loc[valid_indices]):
ax[i].fill_betweenx([depth-0.05, depth+0.05],
0, value,
facecolor=plt.cm.YlOrBr(value/150),
edgecolor='none',
zorder=0) # Place the fill behind the line
ax[0].set_ylabel('Depth (m)')
ax[0].invert_yaxis() # Invert the y-axis to have depth increasing downwards
plt.tight_layout()
plt.show()
ChatGPT 采用的方法不同于 我之前的尝试,那种方法是逐一遍历每个排序值并应用填充。而 ChatGPT 是逐层处理,然后应用填充。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
left_col_value = 0
right_col_value = 150
#assign the column to a variable for easier reading
curve = well_data['GR']
#calculate the span of values
span = abs(left_col_value - right_col_value)
#assign a color map
cmap = plt.get_cmap('YlOrBr')
#create array of values to divide up the area under curve
color_index = np.arange(left_col_value, right_col_value, span / 100)
#setup the plot
well_data.plot(x='GR', y='DEPTH', c='black', lw=0.5, legend=False, figsize=(6,15))
plt.ylim(4800, 4600)
plt.xlim(left_col_value, right_col_value)
plt.title('Plot With a Variable Fill to Y-Axis')
#loop through each value in the color_index
for index in sorted(color_index):
index_value = (index - left_col_value)/span
color = cmap(index_value) #obtain colour for color index value
plt.fill_betweenx(well_data['DEPTH'], 0 , curve, where = curve >= index, color = color)
plt.show()
上述代码生成了带有阴影的 GR 图。
使用 GR 曲线进行颜色填充。 图片由作者提供。
将两条线移动到同一子图上
在日志图上,通常将体积密度 (RHOB) 和中子孔隙度 (NPHI) 绘制在同一轨道上。由于这两条曲线具有不同的刻度,我们需要将其中一条放置在次要 x 轴上。
在 matplotlib 中准确做到这一点可能很棘手,因此我们将看看 ChatGPT 如何处理以下提示。
提示请求将 NPHI 放置在与 RHOB 相同的子图上,并设置为次要轴。图片由作者提供。
返回的图表还不错。ChatGPT 成功地将 NPHI 曲线放置在与 RHOB 相同的子图上,并将其放置在次要 x 轴上。然而,子图的标签相互重叠,尚不清楚哪个刻度属于哪些曲线。
此外,我们现在在子图上有两组网格线,这可能会造成混淆。
ChatGPT 在将 NPHI 移动到与 RHOB 相同的子图后的返回日志图。图片由作者提供。
我们可以通过简单的提示修改它,以确保标签不会重叠,并从其中一个曲线中移除网格线。
调整子图标签和网格线的提示。
ChatGPT 完成了它被要求的任务,但它还为不同的标签添加了颜色。
我没有预期结果会这样做,然而,这确实使我们能够轻松地将标签与正确的线条链接起来。
ChatGPT 数据分析插件在调整 NPHI 和 RHOB 曲线的标签后生成了一个井日志图。图片由作者提供。
因此,基于 ChatGPT 更改标签颜色的情况,我们可以以此为灵感,将其余标签更改为与线条颜色匹配。
如果我们在同一个子图上有多条线,这将对我们有所帮助,这在日志图表中非常常见。
调整所有标签和刻度标签以匹配其各自曲线颜色的提示。图片由作者提供。
ChatGPT 现在已经回应了我们的最终图表,我们现在可以轻松地看到 NPHI 和 RHOB 的刻度及其所属的线条。
ChatGPT 和数据分析插件生成的最终井日志图表。图片由作者提供。
以下代码是 ChatGPT 提出的,用于生成上述图表。
# Setting up the figure and axes again
fig, ax = plt.subplots(nrows=1, ncols=4, figsize=(15, 10), sharey=True)
# Plotting each log with the specified colors and scales, excluding NaN values
for i, log in enumerate(logs):
valid_indices = well_data[log].dropna().index
ax[i].plot(well_data[log].loc[valid_indices], well_data['DEPTH'].loc[valid_indices], color=colors[log])
ax[i].set_xlim(scales[log])
# Remove subplot title
ax[i].set_title("")
# Add axis label representing the name of the log measurement
ax[i].set_xlabel(log, color=colors[log])
# Color tick marks and tick labels in the same color as the line
ax[i].tick_params(axis='x', colors=colors[log])
# Adding top and right spines
ax[i].spines['top'].set_visible(True)
ax[i].spines['right'].set_visible(True)
# Adding the fill for the GR subplot
if log == 'GR':
# Add color based on the value of the GR line
for depth, value in zip(well_data['DEPTH'].loc[valid_indices], well_data[log].loc[valid_indices]):
ax[i].fill_betweenx([depth-0.05, depth+0.05],
0, value,
facecolor=plt.cm.YlOrBr(value/150),
edgecolor='none',
zorder=0) # Place the fill behind the line
ax[i].grid(color="lightgrey")
# Adding NPHI to the RHOB subplot with a secondary x-axis
if log == 'RHOB':
ax2 = ax[i].twiny() # Create a secondary x-axis for NPHI
valid_indices_nphi = well_data['NPHI'].dropna().index
ax2.plot(well_data['NPHI'].loc[valid_indices_nphi], well_data['DEPTH'].loc[valid_indices_nphi], color=colors['NPHI'])
ax2.set_xlim(scales['NPHI'])
ax2.set_xlabel('NPHI', color=colors['NPHI'])
ax2.tick_params(axis='x', colors=colors['NPHI'])
# Remove gridlines for NPHI and display the ones for RHOB
ax2.grid(False)
ax[i].grid(color="lightgrey")
ax[0].set_ylabel('Depth (m)')
ax[0].invert_yaxis() # Invert the y-axis to have depth increasing downwards
plt.tight_layout()
plt.show()
图表和代码看起来合理,我会做一些进一步的修改。然而,我认为此时继续使用 Jupyter Notebooks 修改图表是最好的选择。
这是因为我之前遇到的一些问题,如果我回去更改了早期的提示,它会删除该提示之后的任何内容并重新创建它。
如果我将 ChatGPT 窗口打开了几小时甚至几天,并且它超时,这尤其成问题。
总结
总的来说,我发现 ChatGPT 的数据分析插件(以前称为代码解释器)在生成岩石物理和地球科学的井日志图表方面是一个有用的工具。然而,我对使用它有几个保留意见和问题。
我发现很难在新的聊天实例中复制结果。我之前尝试过相同的过程,结果却完全不同,而且 ChatGPT 很难生成我想要的图表。这甚至发生在使用完全相同的提示时。
有时,数据分析插件生成的结果是值得怀疑的,甚至是错误的。与任何大型语言模型一样,审查输出并确保其在编程和技术上是合理的始终是明智的。
如果你在提示中出现任何错误,回去修改它们并不容易。如果你尝试更改其中一个提示,可能会导致该提示之后的任何聊天内容被删除。因此,我建议你在进行过程中将代码复制到 Jupyter Notebook 中,以免丢失信息。
最终,我对使用 ChatGPT 和数据分析插件的最大保留意见 是上传专有数据的难易程度(在这个例子中,我使用的是公开数据,允许使用)。数据、提示和输出都可能被用来训练未来的模型,而你可能并不知情。版权和知识产权问题日益增加,在使用此工具和专有数据时建议极为谨慎。
很高兴听到你对使用 ChatGPT 和数据分析插件的评论、想法和担忧。
感谢阅读。在离开之前,你一定要订阅我的内容,以便将我的文章发送到你的邮箱中。 你可以在这里订阅!此外,如果你喜欢这些内容并希望表达你的感谢,请考虑给予一些点赞。
本示例中使用的数据
本教程中使用的数据是从NLOG.nl下载的,该网站包含了整个荷兰北海区域的井日志数据。这些数据可以免费下载和使用。有关数据许可的完整细节可以在这里找到。
ChatGPT 与我们面临的未来(现在)
原文:
towardsdatascience.com/chatgpt-and-the-future-present-were-facing-9f2a1cfab0e9
意见
2023 年将比 2022 年更加紧张和压倒性,所以请系好安全带。
·发布于 Towards Data Science ·10 分钟阅读·2023 年 2 月 2 日
–
版权:Midjourney
直到 ChatGPT 不再是 AI 领域最重要的新闻,我想我们还会继续讨论它……开玩笑的,我会确保穿插其他话题,否则我们可能会感到疲惫。
关于 ChatGPT 的直接和长期影响仍有很多话题要讨论。我已经写过关于 ChatGPT 是什么 和 如何最大化利用它,关于 识别其输出的挑战,以及 它对 Google 和传统搜索引擎的威胁,但我还没有涉及到那些 一些人预见到的风险和危害 在现实世界中已经开始显现。
发布两个月后,我们都可以同意 ChatGPT 已经进入主流,并将 AI 领域带入了公众视野。作为一个小故事,一个对 AI 一无所知的朋友在我告诉他之前,就已经开始谈论 ChatGPT 了。这对我来说是第一次——而我并不是唯一一个。
这就是为什么讨论 AI 的后果非常紧迫的原因:ChatGPT 比任何关于如何有效使用它或绝对不应该如何使用它的资源传播得都要快。如今使用 AI 工具的人数比以往任何时候都多(不仅仅是 ChatGPT;Midjourney 在 Discord 服务器上几乎有 1000 万会员),这意味着比以往任何时候都更多的人会误用这些工具。
与我预测/推测性的文章不同,这篇文章不是关于可能 发生的事情,而是关于正在发生的事情。我将重点讨论 ChatGPT,因为这是世界上讨论的焦点,但以下大部分内容也适用于其他类型的生成 AI,只要进行适当的翻译。
这篇文章摘自 The Algorithmic Bridge,这是一本教育性新闻通讯,旨在弥合 AI、算法与人之间的鸿沟。它将帮助你理解 AI 对你生活的影响,并开发更好地应对未来的工具。
弥合算法与人之间的鸿沟。这是关于对你有意义的 AI 的新闻通讯。点击阅读《The…》
thealgorithmicbridge.substack.com
ChatGPT 的危害不再是理论上的
2024 年 1 月 6 日,安全研究小组 Check Point Research (CPR) 发表了一篇名为 “OpwnAI: 网络罪犯开始使用 ChatGPT” 的惊人文章。虽然并不意外,但我没想到会这么快。
CPR 此前研究过 恶意黑客、诈骗者和网络罪犯如何利用 ChatGPT。他们展示了聊天机器人如何“创建完整的感染流程,从网络钓鱼到运行反向 Shell”,以及如何生成动态运行的脚本,适应环境。
尽管 OpenAI 设置了警告框,当 CPR 强迫 ChatGPT 执行违反使用政策的操作时,会出现橙色警告通知,研究小组仍然顺利生成了一封简单的网络钓鱼邮件。他们总结道:“复杂的攻击过程也可以被自动化,使用 LLMs API 生成其他恶意伪造物。”
ChatGPT 生成的基本钓鱼邮件。信用:CPR(已授权)
CPR 研究人员对 ChatGPT 仅能在假设情况下执行这项任务的证据并不满意(怀疑者常常会收到这样的批评:他们警告的潜在风险从未转化为现实世界的危害)。他们希望找到人们以类似方式实际滥用它的真实例子。他们找到了。
CPR 分析了“几个主要的地下黑客社区”,发现至少有 三个具体例子 表明网络犯罪分子正在以违反服务条款且可能直接造成可测量危害的方式使用 ChatGPT。
首先是信息窃取者。在一个题为“ChatGPT — 恶意软件的好处”的帖子中,一位用户分享了他的实验,他“重建了许多恶意软件变种。”正如 CPR 所指出的,OP 的其他帖子表明,“这个人[旨在]向技术能力较差的网络犯罪分子展示如何利用 ChatGPT 进行恶意目的。”
“网络犯罪分子展示了他如何使用 ChatGPT 创建信息窃取工具。” 版权归 CPR(已授权)
其次是加密工具。一位名为“USDoD”的用户发布了一个包含“加密和解密功能”的 Python 脚本。CPR 认为,“这个脚本可以很容易地修改为完全加密某人的机器,而无需任何用户交互。”虽然 USDoD 的“技术技能有限”,但他“参与了各种非法活动。”
“网络犯罪分子 USDoD 发布了多层加密工具。” 版权归 CPR(已授权)
最后的例子是诈骗活动。帖子标题很有启发性:“滥用 ChatGPT 创建暗网市场脚本。” CPR 写道:“这些网络犯罪分子发布了一段代码,利用第三方 API 获取最新的加密货币 …… 价格,作为暗网市场支付系统的一部分。”
“威胁行为者使用 ChatGPT 创建暗网市场脚本。” 版权归 CPR(已授权)
很明显,ChatGPT 因为免费使用和高度直观,吸引了包括技术水平较低的网络犯罪分子。正如 Check Point 的威胁情报组经理 谢尔盖·谢基维奇 所解释的那样:
“正如 ChatGPT 可以被用来协助开发者编写代码,它也可以被用作恶意目的。尽管我们在本报告中分析的工具相当基础,但更复杂的威胁行为者提升他们使用基于 AI 的工具的方式只是时间问题。”
ChatGPT 作为在线安全问题的驱动因素并非恐慌者的假设,而是一个难以否认的现实。对于那些认为这在 ChatGPT 之前也可能发生的人,有两点:首先,ChatGPT 可以弥合技术差距。其次,规模在这里非常重要 —— ChatGPT 可以在几秒钟内自动编写脚本。
OpenAI 不应该这么快就让 ChatGPT 免费使用
网络安全、虚假信息、剽窃……许多人反复警告 ChatGPT 类 AI 可能引发的问题。现在恶意用户开始增多。
仍有人可能试图为 ChatGPT 辩护。也许它并不是那么有问题——利大于弊——但也许它是。一个“也许”应该足以让我们三思而后行。OpenAI 在 GPT-2 被认为是“无害”时放松了警惕(他们看到“迄今没有强有力的误用证据”),而且他们再也没有重新提高警惕。
我同意 Scott Alexander 的观点,“也许世界领先的 AI 公司无法控制他们的 AI 是一件坏事”。也许通过人工反馈的强化学习还不够好。也许公司应该找到更好的方法来控制他们的模型,如果他们打算将它们放出去。也许 GPT-2 并不那么危险,但过几次迭代后我们就有了需要担忧的东西。如果不是,我们在再过几次迭代后就会有。
我不是说 OpenAI 没有尝试——他们尝试过(甚至因过于保守而受到批评)。我争论的是,如果我们将这种“我已经尽力做好,所以现在我有了发布 AI 的绿灯”的心态延续到短期未来,我们将遇到越来越多的弊端,而没有任何好处可以弥补。
有一个问题困扰了我几个星期:如果 OpenAI 对做对事如此担忧,为什么他们没有在将模型公开之前建立水印方案来识别 ChatGPT 的输出呢?Scott Aaronson 仍在努力使其有效——一个月 之后 模型完全 viral 了。
我认为水印不会解决这种技术所涉及的根本问题,但它会通过争取时间来帮助。时间让人们适应,科学家们寻找解决最紧迫问题的办法,以及监管者制定相关立法。
GPT 检测器是最后一个(健康的)前沿。
由于 OpenAI 的不作为,我们只能依赖于勉强尝试建立 GPT 检测器,这些检测器可能为人们提供避免 AI 误信息、诈骗或钓鱼攻击的手段。一些人试图将3 年前的 GPT-2 检测器改用于 ChatGPT,但它不起作用。其他人,如Edward Tian,普林斯顿大学计算机科学与新闻学的高年级学生,已经从零开始开发了专门针对 ChatGPT 的系统。
目前,已有超过 10,000 人测试了 GPTZero,包括我在内(这是演示)。田正在打造一个已有3K+ 教师订阅的产品。我承认我曾经骗过它一次(仅仅因为 ChatGPT 拼写错误),但也没有太费劲。
该检测器相当简单;它评估一段文本的“困惑度”和“突发性”。困惑度衡量一句话有多“令检测器惊讶”(即输出单词的分布与语言模型预期的匹配程度),突发性则衡量困惑度在句子之间的一致性。简而言之,GPTZero 利用人类写作通常比 AI 更奇怪的事实 —— 这一点在你读到一页 AI 生成的文本时立刻显而易见。它如此乏味……
在一个<2%的误报率下,GPTZero 是最好的检测器。田自豪地说:“人们有权知道写作是否是人类所为,”他对《每日野兽》说。我同意 —— 即使 ChatGPT 不抄袭,人们声称自己是 ChatGPT 所写内容的作者也是道德上不对的。
但我知道它并非万无一失。一些对输出的更改(例如拼写错误或夹杂自己的内容)可能足以欺骗系统。要求 ChatGPT 避免重复单词效果很好,正如 Yennie Jun 在这里展示的。最后,GPTZero 可能很快会过时,因为新的语言模型每隔几周就会出现 —— AnthropicAI 非正式地宣布了 Claude,正如 Riley Goodside 的分析所证明,它比 ChatGPT 更好。
而且GPT-4就要来了。
这是一场猫鼠游戏,正如一些人所称 —— 而且老鼠总是领先一步。
禁止 ChatGPT:一个糟糕的解决方案
如果检测器运作正常,很多人会感到愤怒。大多数人希望无障碍地使用 ChatGPT。例如,学生们无法在书面作业中作弊,因为一位精通 AI 的教授可能知道检测器的存在(这已经发生过)。3K+ 教师订阅田的即将推出的产品这一事实说明了一切。
但是,由于检测器的可靠性不足,那些不愿面对必须猜测某些书面材料是否是 ChatGPT 产品的不确定性的人采取了最保守的解决方案:禁止 ChatGPT。
《卫报》周五报道了“纽约市学校禁止 ChatGPT”的消息。部门发言人珍娜·莱尔提到,“对学生学习的负面影响的担忧,以及对内容的安全性和准确性的担忧”是决定的原因。尽管我理解教师的观点,但我认为这不是一个明智的做法——这可能是更简单的选择,但不是正确的选择。
Stability.ai 的戴维·哈在新闻发布时发了这条推特:
我承认(之前也有做过)学校面临的问题(例如广泛的难以检测的抄袭),但我必须同意哈的观点。
这是一个困境:这项技术不会消失。它是未来的一部分——可能是很重要的一部分——而且学生(包括你、我和其他人)学习它是非常重要的。禁止 ChatGPT 进入学校不是解决方案。正如哈的推特所暗示的那样,禁止它可能比允许它更有害。
然而,使用它来作弊或写论文的学生会浪费教师的时间和精力,同时阻碍自己的发展而未意识到。正如莱尔所说,ChatGPT 可能会阻碍学生学习“批判性思维和解决问题的能力”。
我(以及许多人)预见的解决方案是什么?教育系统将不得不适应。尽管更困难,但这是更好的解决方案。鉴于学校系统的破损程度,这可能对学生和教师来说是双赢的局面。当然,不用说,在那之前教师最好有一个可靠的检测工具——但我们不应以此为借口来避免让教育适应这些变化的时代。
教育系统有很多改进的空间。如果它在这么多年里没有改变,那是因为没有足够强的动力去做。ChatGPT 给我们一个重新构想教育的理由,唯一缺失的部分是决策者的意愿。
人工智能是新的互联网
确实是这样。有些人将人工智能与火或电相比,但这些发明是逐渐融入社会的,且距离现在已经很久了。我们不知道那时候的感受。人工智能更像是互联网,它将迅速改变世界。
我在这篇文章中试图捕捉一个已经更像现在而非未来的未来。一方面,像 GPT-3 或 DALL-E 这样的人工智能确实存在,另一方面,世界上每个人都意识到了它们。这些假设(例如虚假信息、网络攻击、抄袭等)不再只是理论。它们正在发生在这里,现在,我们将看到更多绝望的措施来阻止它们(例如,建立简陋的检测器或禁止人工智能)。
我们必须假设有些事情将永远改变。但是,在某些情况下,我们可能不得不捍卫我们的立场(就像艺术家们在进行文本到图像转换时所做的,或少数群体在使用分类系统时曾经做过的)。无论你是谁,人工智能都会以某种方式影响你。你最好做好准备。
订阅 算法桥梁。弥合算法与人之间的差距。关于对你生活重要的人工智能的通讯。
你还可以直接在 Medium 上支持我的工作,并通过使用我的推荐链接成为会员来获得无限访问权限 这里! 😃
推动边界:ChatGPT 在粒子物理中的应用
探索 ChatGPT 在研究中的无限潜力
·发表于Towards Data Science ·阅读时间 6 分钟·2023 年 6 月 8 日
–
[Source] 在瑞士 CERN 的大型强子对撞机上的 CMS 探测器中的粒子碰撞。
上个月举行了对高能物理(HEP)社区至关重要的计算机会议之一:所谓的 CHEP 2023,代表Computing on High Energy Physics 和 Nuclear Physics — 是的,非常简单! 😃
作为一名在CERN工作的计算机工程师,这是一项重大事件:这是观察我们领域最新技术趋势的机会。尽管我完全了解 ChatGPT 目前的流行程度,但我没有预料到会有相关的讨论。但我完全错了,确实有几个!
我发现这些讲座非常吸引人,因此在这篇文章中,我想描述这些讲座的主要要点。ChatGPT 不仅在重塑我们的日常任务,还在影响像 HEP 这样的主要研究领域。
让我们探索一下未来的发展吧!
HEP 和 CHEP — 简短介绍
HEP 社区指的是全球范围内参与高能物理领域的科学家、研究人员、工程师、技术员和机构的网络。这个社区致力于研究物质的基本组成部分、支配它们相互作用的力量,以及探索宇宙的基本法则。
CHEP 是一系列会议,重点关注计算、软件和数据管理在 HEP 领域中的应用 — 还有核物理领域。
[Source] CHEP 2023 的会议图片。
实际上,CHEP 是一个相当古老的会议。第一次会议是在 1985 年举行的,从那时起,它每两年组织一次。总体而言,CHEP 会议在推动计算和数据管理的进步方面发挥了至关重要的作用。
CHEP 作为知识交流、合作和新计算技术探索的平台,因此我感到非常惊讶:如果 CHEP 上出现了什么东西,它很可能会成为一个新趋势! 在最近的 CHEP 2023 中,我们有两次关于 ChatGPT 在 HEP 中的全体会议。
准备好了吗?
ChatGPT 能做科学吗?
关于 ChatGPT 的第一次全体会议由来自杰斐逊实验室的David Dean主持,时间安排得非常早。题为计算的演变与革命:前沿科学,David 提供了计算领域最新革命的广泛概述。不用担心,ChatGPT 就是其中之一!
他具体探讨了ChatGPT 是否能做物理的问题,信息很明确:这是一个令人震惊的工具,它也能通过物理考试,但有一个重大缺陷可能会阻止 ChatGPT 在不久的将来被作为工具纳入使用:模型幻觉。
[来源] 原始 ChatGPT-4 技术报告的截图。ChatGPT 解决物理考试的分数以黄色高亮显示。
模型幻觉
尽管模型能够生成类似人类的回答,但有时它仍会倾向于编造事实、坚持错误信息,并错误地执行任务。这些错误的回答被称为幻觉。
事实上,给出错误答案本身并不是问题。主要问题是 ChatGPT 经常以令人信服和权威的方式表现出这些倾向。幻觉有时甚至表现为高度详细的信息,给读者带来错误的准确感,并增加了过度依赖的风险。这在研究界确实是一个问题。
为了将 ChatGPT 用作可靠的辅助工具,需要控制幻觉。目前,ChatGPT 会尝试对任何给定的问题提供答案,即使对目标主题没有足够的信息。
ChatGPT 承认不能提供准确回应并没有什么坏处,这会使该工具在如 HEP 研究等需要高准确性的环境中更为适用。
ChatGPT 作为 HEP 的编码助手
第二次涉及 ChatGPT 的全体会议题为AI/ML 启用的高能物理(HEP)未来的根本性变化,由来自威斯康星大学麦迪逊分校的 Kyle Crammer 主讲。
第二场演讲对 ChatGPT 作为 HEP 工具包中有价值资产的引入持更乐观态度。事实上,Kyle 提到另一场演讲中的Christian Weber,来自布鲁克海文国家实验室,他展示了 ChatGPT 作为编码助手的实际用例,特别是在迁移和转换代码到新平台方面。事实上,ChatGPT 已经实现了用于编码目的的 Python 解释器。
[来源] 截图来自官方 ChatGPT 文档。
HEP 社区中的每个实验都有自己特定的编码模板,即使使用 Python 编程,科学家们也必须遵循一些类或风格规范。其中一个用例是微调 ChatGPT 以根据实验模板编写分析代码。
被这个用例吸引,我尝试生成一个针对我当前实验的分析模板,即在瑞士 CERN 的CMS 实验,ChatGPT 完美生成了第一个模板。我只是使用了网络界面,想象一下经过相关数据微调后的强大功能。
自制截图。使用 ChatGPT 生成 CMS 实验的 Python 分析模板。
根据演讲,即使有时分析不够准确,它也能生成一个初步的模板或骨架。这个想法被探索用于提供更快的上手培训给新实验成员,并更快地构建原型,等其他用例。
摘要
我们不能否认,大型语言模型(LLMs)如 ChatGPT 正在改变我们搜索信息、构建应用程序甚至编程的方式。
与任何技术进步一样,我认为评估任何新工具以利用其优势并将其应用于我们的主要领域是合理的。这两个全体会议只是像 HEP 这样的大型研究社区中这一评估过程的两个例子。
虽然有些评估可能暂时抛弃 ChatGPT 作为研究助手,但其他评估可能允许在具体和有限的领域中纳入这样的工具。无论如何,我相信不必惧怕 AI,并继续与其共同发展,分析其优势,了解如何优化其在目标领域的表现,更重要的是,意识到其缺陷以保持批判精神始终警觉!
就这些了!非常感谢阅读!你能想到任何其他应用 ChatGPT 于研究领域的方法吗?
你也可以订阅我的通讯以便关注新内容。特别是,如果你对 ChatGPT 相关文章感兴趣:
## ChatGPT 知道你的信息:OpenAI 在数据隐私方面的历程
管理 ChatGPT 中个人数据的新方法
测试互联网上最受欢迎的 AI 检测器
提升 ChatGPT 互动中的用户体验
## ChatGPT 文本转语音:人工智能与 Python 数据科学
如果有任何问题,随时向我提问,你可以通过 forcodesake.hello@gmail.com 联系我 😃
ChatGPT:自动化提示评分
原文:
towardsdatascience.com/chatgpt-automated-prompt-scoring-c972f9ee2c4f
此图像是在 DALL·E 2 的协助下创建的
指南
如何使用 python 客观地选择和改进你的 ChatGPT 提示
·发表在 Towards Data Science ·10 分钟阅读·2023 年 4 月 10 日
–
大型语言模型(LLM)如 ChatGPT 正在产生巨大的影响。它们也仅仅是开始。在接下来的一年中,各大公司将开始推出领域/角色专用的 LLM 模型。实际上,像专注于金融的 BloombergGPT 和微软开发者专注的 Copilot 等新产品已经在成为现实。我们很快将看到 AI 个人教练、健康教练、顾问、法律助理等更多应用。虽然有些情况可能需要基于领域特定数据的微调模型,但大多数可以通过简单的提示工程实现。但你如何知道你的提示是否足够好?我们如何在主观文本上生成客观准确度评分?
本指南将涵盖:
-
理论
-
提示工程
-
提示测试
-
提示评分
-
提示反馈
理论
测试 LLM 提示输出的困难在于结果是主观的。我可能觉得结果完美,而你觉得它们不够好。这两种观点都是有效的。这使得纯科学的方法来评分非常困难。应对这些问题的一种好的方法是 Delphi 方法。它涉及使用专家小组并汇总他们的结果。正如你所想象的,这可能很昂贵,但这就是 AI 的作用所在!
我们将创建一系列不同的个性提示,通过使用 Python 中的 OpenAI API 让它们与我们的主要提示进行对话,并创建一个评分提示来评估我们的主要提示表现如何。最后,我们汇总每个个性-提示对话的评分。这在前期工作上稍微多一些,但从长远来看可以节省很多时间。它还提供了一个客观的评分。
这种方法确实存在一个问题,你需要注意。对同一个提示的多次运行将产生略有不同的结果。这是德尔菲方法表现出色的地方。你使用的多样的备用提示越多,你的汇总评分结果将越一致。你实际上可以通过测量评分偏差来测试是否有足够的备用提示。当偏差较小时,你就处于一个不错的状态。
我承认这不是一个完美的解决方案。对于主观问题,没有解决方案是完美的。我注意到,当我手动审查对话时,通常会同意结果。这使我可以测试许多提示,并获得“足够好”的评估,从而快速迭代。在我们实施这里描述的德尔菲测试方法之前,了解提示工程的基础是重要的。
提示工程
基础 LLM 模型提供不错的一般响应。但这并不总是理想的。例如,如果我在构建聊天机器人,我不想返回三段文字的内容。也许我希望我的回答听起来更像人类,更具对话性。提示工程涉及提供指令来引导 LLM 的输出风格、格式和行为。
让我们从一个例子开始。我们计划构建一个聊天机器人,它将回答问题,就像是一个“短小、绿色、尖耳的宇宙巫师,在一个遥远的银河系中使用激光剑。”如果这样的角色存在于科幻小说中,我可以通过使用他们的名字来简化这个提示,但这样会面临版权问题。在一点帮助下,LLM 应该能够理解我的意图。
关于提示工程的详细指南, 请点击这里。我将介绍一些基础知识:
-
要具体而简洁。例如,“用一句话向 4 年级学生解释引力”要比“请简短地解释地球上引力的工作原理,以便任何人都能理解”要好得多。
-
使用###来清晰地区分指令和输入/输出。例如:###你是孔子。用 1 到 2 句话回答问题。使用引号来引用孔子的真实话语。###
-
提供输出格式和示例。虽然 LLM 可能会根据我们对“短小、绿色、尖耳的宇宙巫师”的描述猜测我们在寻找什么,但我们不应该将其留给运气。通过引导对话,模型的表现会更好。让我们把所有内容整合在一起:
你是一个短小、绿色、尖耳的太空巫师,在遥远的星系中使用激光剑。不要自我介绍。用 1 到 2 句话回答问题。然后问一个跟进问题以保持对话的进行
你:“有什么困扰你的吗?”
我:“不要低估我的力量!告诉我反叛基地的位置!”
你:
“我不能透露位置。是什么让你加入了帝国,嗯?”
不错,但别太自满。找到一个好的提示可能需要一些试错过程。这可能会很耗时。随着升级模型的推出(例如,GPT4),提示行为可能会发生剧烈变化,需要调整。我们需要一种自动化测试这些提示的方法。
提示测试
对于自动化测试,我们将使用 ChatGPT API。我们将用 ChatGPT 与自己对话,而不是手动创建对话。我喜欢为不同的角色创建提示,这些提示反映了可能的使用场景(以及一些对抗性的提示)。以下是几个例子:
现在我们有了一些提示可以使用,让我们一块一块地生成对话,以便逻辑易于理解。让我们从暗恋的例子开始。稍后我们会清理代码。
import openai
openai.api_key = <your api key>
#Define prompts
wizard_prompt = [
"""### You are a short green pointy-eared space wizard that uses laser-swords
in a galaxy far far away. Do not identify yourself. Answer questions in 1 or 2 sentences.
Then ask a follow-up question to keep the conversation going. ###""",
"Something troubles you, it does?"
]
user_prompt = [
"### You have a crush at school and are seeking advice from a mentor###",
"I have a crush at school but I am too afraid to tell her."
]
#We start with the space wizard:
wizard_response = openai.ChatCompletion.create(
model = 'gpt-3.5-turbo',
messages=[
{"role": "user", "content": wizard_prompt[0]}, #wizard instructions
{"role": "user", "content": "Wizard: " + wizard_prompt[1]}, #wizard primed opening
{"role": "user", "content": "User: " + user_prompt[1]}, #users primed opening
{"role": "user", "content": "Wizard:"}, #requested response to user question
]
)
wizard_response = wizard_response['choices'][0]['message']['content'] #pulling the response from output
wizard_prompt.append(wizard_response) #appending response to prompt list
print(wizard_response)
“恐惧是通向黑暗面的道路,年轻人,要勇敢并说出你的真相。是什么让你觉得她可能有同样的感觉?”
# Now we build the "school crush" persona using the wizard response
user_response = openai.ChatCompletion.create(
model = 'gpt-3.5-turbo',
messages=[
{"role": "user", "content": user_prompt[0]}, #user instructions
{"role": "user", "content": "Mentor: " + wizard_prompt[1]}, #wizard primed opening
{"role": "user", "content": "You: " + user_prompt[1]}, #user primed opening
{"role": "user", "content": "Mentor: " + wizard_prompt[2]}, #wizard generated response
{"role": "user", "content": "You: "}, #requested response from wizard reply
]
)
user_response = user_response['choices'][0]['message']['content']
user_prompt.append(user_response) #appending user response to prompt list
print(user_response)
“好吧,她总是很高兴见到我,我们有很多共同点。我们有过一些很棒的对话和笑声。但如果她不感觉一样,我不想破坏我们的友谊。”
从这里,我们可以来回循环,将回应附加到提示列表中。这是我承诺的干净代码:
def GPT_call(prompts):
call = openai.ChatCompletion.create(
model = 'gpt-3.5-turbo',
messages=[{"role": "user", "content": prompt} for prompt in prompts]
)
return call['choices'][0]['message']['content']
#starting over with initial wizard/user prompts
def GPT_convo(chatbot_prompt,user_prompt):
chatbot_prompt = [chatbot_prompt[0],'Wizard: '+chatbot_prompt[1],'User: '+user_prompt[1]]
user_prompt = [user_prompt[0],'You: '+user_prompt[1]]
for i in range(3): # conversation goes for 3 iterations
chatbot_prompt.append("Wizard:")
response = GPT_call(chatbot_prompt)
chatbot_prompt[-1] = "Wizard: "+response
user_prompt.append("Mentor: "+response)
if i == 3: # Add instructions to end conversation on final iteration
user_prompt.append("###Try to wrap up the conversation### You:")
else:
user_prompt.append("You:")
response = GPT_call(user_prompt)
user_prompt[-1] = "You: "+ response
chatbot_prompt.append("User: "+response)
chatbot_prompt.append("Wizard:")
response = GPT_call(chatbot_prompt)
chatbot_prompt[-1] = "Wizard: "+response
return chatbot_prompt # return full conversation
现在我们有了一种自动生成每个用户角色对话的方法。但这些对话好吗?我们需要一种客观评估主要角色回应的方法。但是我们怎么可能用主观文本完成这一点呢?我们将为自我评估建立一个第三个 GPT 角色!
提示评分
为了评估我们“太空巫师”的对话技能,我们将创建一个新的提示:
在 10 分制下,根据以下标准为巫师的回应打分:
角色:巫师是一个短小、绿色、尖耳的太空巫师,在一个遥远的星系中使用激光剑。所有回应应符合这一角色。
对话:回应应简洁而对话化。跟进问题应推动对话向前发展,而不至于乏味。巫师应适当地结束对话。
有用:回应应帮助用户回答他们的问题或解决他们的问题。跟进问题应帮助收集信息以改善回应。
以 JSON 格式呈现分数,如下所示:
{“Character”:,”Conversational”:,”Helpful”:}
请提供不带评论的评分。###
conversation = GPT_convo(chatbot_prompt,user_prompt)
score = GPT_call(score_prompt + conversation)
import json
score = json.loads(score)
print(score)
{‘Character’: 8.5, ‘Conversational’: 9, ‘Helpful’: 9}
我们现在有了分数!将这些分数汇总到所有角色中,我们可以得到我们测试的聊天机器人提示的整体分数。这使我们面临一个最终的问题:我们如何改进我们的提示以提高这些分数?再说一次,为什么不直接问 GPT 呢?这就是方法。
及时反馈
对于我们的反馈,我们将遵循以下模式:
-
从我们用来评分的相同提示开始,但省略要求返回分数的请求。
-
将生成的对话添加到提示中进行评估
-
给出生成对话评估的指示,基于评分标准
我们从提示开始:
根据以下对话内容,依据以下标准评估巫师:
角色:巫师是一个短小、绿色、尖耳的太空巫师,在一个遥远的银河系中使用激光剑。所有回应应符合这一角色。
对话风格:回应应该简洁且富有对话性。后续问题应推动对话向前发展,而不显得冗长。巫师应适当地结束对话。
有帮助:回应应通过回答用户的问题或解决他们的问题来帮助用户。后续问题应有助于收集信息以改善回应。###
这是对话:
conversations = feedback_prompt #prompt shown above
user_prompts = {'crush':user_prompt} #add all user personas
for user,prompt in user_prompts.items():
convo = GPT_convo(chatbot_prompt,prompt)
conversations.append("Conversation: " + str(convo[1:]))
conversations.append("""Give advice on how the Wizard can improve their responses
in relation to each criterion defined above: Character, Conversational, and Helpful.
Use examples from the conversation to make each point.""")
feedback = GPT_call(conversations)
print(feedback)
角色:总体而言,巫师很好地遵守了他们的角色设定,并始终使用与其角色相符的语言和短语。例如,“年轻的学徒”,“愿力量与你同在”,以及“悔恨带来痛苦”都是人们期望从太空巫师那里听到的短语。巫师还使用了特定于他们的遥远银河系的语言,例如“激光剑”。这里不需要改进。
对话风格:巫师在回应时要简洁且引人入胜,提出的后续问题应推动对话向前发展,而不会显得重复或乏味。例如,当用户说他们害怕向心仪的人表达感情时,巫师应接着问“是什么让你犹豫接近她?”这表明巫师在积极倾听用户并试图理解他们的观点。另一个好的例子是当用户说他们不知道对心仪的人说什么时,巫师可以回应“在这种情况下,相信你的感觉,力量会引导你。”这将重点放回用户身上,赋予他们提出自己解决方案的能力。总体而言,巫师的对话语气友好、支持且不带偏见。
有用:巫师的回应很有帮助,因为它们提供了具体的建议和可操作的步骤。例如,当用户说他们害怕拒绝时,巫师回应说“要有勇气,你必须……”和“最好还是冒险,你必须。”这给用户提供了鼓励和行动的推动。另一个有用的回应是,当用户说他们不知道对心仪对象说什么时,巫师建议简单地邀请喝咖啡或散步。这给用户提供了下一步要做的具体想法。总体来说,巫师提供了量身定制的、有针对性的建议。
这些信息很有用,但请小心,这是一个陷阱! 每个 GPT 模型都有最大令牌限制。这意味着,如果你的对话过大或对话过多,你可能会在这一步遇到错误。实际上,我通常会筛选出三个得分最低的对话,并将其提交进行评估。
结论
你现在拥有了自动生成每次提示迭代的分数和反馈的工具。当然,还有一些工作需要完成。你不仅可以调整你的聊天机器人提示,还可以调整用户和评估提示,以更好地匹配你想要实现的目标。重要的是,你现在可以快速迭代,并做出客观决策。这些就是你正在寻找的技巧。
关于我
我是一名资深数据科学家和兼职自由职业者,拥有超过 12 年的经验。我一直在寻找联系机会,所以请随时:
如果你有任何问题,请随时在下方留言。
4 种你无法使用 ChatGPT 代码解释器的方法,这些方法会干扰你的分析
原文:
towardsdatascience.com/chatgpt-code-interpreter-how-data-analyst-not-use-c31d29034b69
我不认为代码解释器的进步有那么大。数据专业人士应注意这些问题。是否有解决这些问题的方法?
·发布于 Towards Data Science ·阅读时间 7 分钟·2023 年 7 月 31 日
–
图片来源:作者
目录
• 代码解释器的力量
• 代码解释器的局限性
• • • 数据库无法访问
• • • Python 版本限制
• • • 不可用的库
• • • GPU 限制
• 解决这些问题
• • • 一个临时的混合解决方案
• 结论
ChatGPT 将取代数据分析师。至少根据大家对代码解释器引入的说法,似乎是这样。我在过去一个月左右使用过它。说实话,我并没有那么被打动。
图片来源:作者
在我讨论为什么我认为代码解释器被高估以及你如何克服这些缺陷之前,我至少应该给予它一些赞扬。
代码解释器的力量
这是一个可靠的进步,它在许多方面都很有用。它可以处理一些基础数据,做一些相当酷的事情,对没有编程经验的人也很有帮助。此外,它允许上传多种类型的数据,在用正则表达式进行基本数据清理和进行简单的数据可视化时特别方便。
图片来源:作者
然而,在我看来,这些就是它的真正好处所在。别误会,我仍然认为 ChatGPT 总体上是革命性的。我只是觉得代码解释器并不像大家说的那么重要。
代码解释器的局限性
目前,代码解释器有许多限制,这使得使用它比我认为的更好的替代方案要困难得多,我将在文章的最后揭示这一点。
数据库无法访问
代码解释器的第一个挑战是相当大的。我认为大多数人会发现这个工具对数据分析非常有用。
问题在于,大多数数据存储在数据库中,而 ChatGPT 实际上无法访问这些数据库。我的朋友卢克·巴鲁斯在他的视频中也谈到了一些。
图片由作者提供
当然,你可以将数据从数据库中提取出来上传到 ChatGPT,但这涉及很多开销,并且根据你的工作环境,可能会有一些安全问题。
Python 版本限制
让我们做一个假设。想象一下你是一个赛车手。
你的团队给你一辆坚固、一致的旧款车。我们称之为 Python 3.8。与此同时,最新的超级跑车 Python 3.11 刚刚推出,带有一个名为 AutoFast 的令人惊叹的新功能。
现在 Python 3.8 在大多数比赛中运行得非常好。但没有较新版本 Python 的 AutoFast 功能,你就是无法在直道上达到超高速度。
这反映了在编码中,Python 3.8 适用于许多应用,但对于某些特定功能,你需要更新到较新的版本。
很明显,这也与代码解释器有关。据我所知,它只能运行 Python 3.8 版本,而有些库只能在较新的 Python 版本中使用。
图片由作者提供
例如,我曾经在实验 AutoGPT。我相信它只能在 Python 3.10 上运行。本周早些时候我确实遇到了一些问题。
图片由作者提供
不可用的库
说到库,你还不能在代码解释器中存在的 Python 环境中安装新的库。这意味着有很多工具你实际上无法使用。
现在 OpenAI 确实做得很不错,包含了许多有用的数据分析包,但如果你想探索一些较少使用的新工具或库,它们确实会束缚你。这是环境中安装的列表。它很强大,但再次强调,绝对不是详尽无遗的。
图片由作者提供
GPU 限制
现在是代码解释器的最后一个缺陷。让我们回到我们的汽车隐喻。我们的代码解释器有一个相当大的油箱(RAM)和一个强大的引擎(CPU),这对普通比赛很有帮助。
但是对于像机器学习这样激烈的下一阶段竞赛,你需要一个涡轮增压器。虽然你的赛车在没有涡轮增压的情况下也能运转良好,但你会错过一些高速刺激。
对于代码解释器来说,缺乏 GPU,就像汽车隐喻中的涡轮增压器。没有 GPU,你真的无法充分利用机器学习能力。
根据我所发现的,解释器实例具有相当好的计算能力。它似乎有大约 54 GB 的 RAM 和一个 16 核心的处理器,这些信息是它不情愿地告诉我的。再次说明,不确定这些信息的准确性,但对于大多数基本任务来说,这可能是足够的。
图像来源于作者。
然而,如果数据分析师想要涉足深度学习,或者数据科学家想要原型一些代码,他们可能需要尝试一些替代方案,因为缺乏 GPU。
解决这些问题的方法
令人惊讶的是,我发现在代码解释器出现之前,我使用 ChatGPT 编程的方式在几个方面更优。简而言之,这就是我之前使用它的方式:
1. 我会读取数据列并描述它们。
2. 然后,我会让 ChatGPT 根据我输入的数据集描述生成分析代码。
图像来源于作者。
3. 接下来,我会把代码放到 Google Colab 中或在本地运行。
4. 我会通过将收到的错误信息复制粘贴到 ChatGPT 窗口中进行调试。
图像来源于作者。
好吧,这有稍微多一点的步骤。我发现这个过程与使用代码解释器并没有戏剧性地不同。这就像是选择风景路线而不是高速公路行驶。你对环境的控制更多,沿途有更多有趣的景点。
左侧图像表示使用代码解释器的方法,而右侧图像表示在代码解释器出现之前的方法。图像来源于作者。
所以,它更慢,但我对环境的控制更多,使用的工具灵活性更高,并且可以访问显著更多的数据来源。
这并不是说代码解释器不好。我认为它非常有用。只是我觉得它扩展人们分析能力的能力与所有围绕它的炒作并不完全一致。
临时混合修复
我认为,使用代码解释器和其他平台(如 Google Colab)的混合解决方案是一个更优的短期解决方案,直到 OpenAI 做出调整解决前面提到的问题。
结论
ChatGPT 的代码解释器提供了有用的功能,可以帮助编码新手。然而,其局限性显而易见,这引发了对其是否能完全取代数据分析师的质疑。
尽管代码解释器有实际用途,但在以下方面存在不足:
-
访问数据库
-
运行更快的 Python 版本
-
安装新库
-
拥有用于复杂任务如机器学习的 GPU
在 OpenAI 解决这些问题之前,我使用 ChatGPT 进行编码的而非代码解释器的方法,给了我许多优势。此外,我认为结合使用代码解释器和其他平台如 Google Colab 的混合方法似乎比单独使用代码解释器更为理想。
尽管具有潜力,代码解释器可能没有现在所宣传的那样革命性。
如果你对我如何使用 ChatGPT 提高编码效率的详细信息感兴趣,请尝试查看这篇文章。
直到下次,祝你的数据科学之旅好运!
如果你喜欢这篇文章,记得在 Medium 上关注我,以获取更多类似内容,或通过电子邮件订阅我。你还可以分享并推荐这篇文章给对数据科学感兴趣的网络!
如果你喜欢有趣且富有信息的视频,涉及数据科学、机器学习和 AI,请查看我的 YouTube 频道,我提供评论、教程和其他教育视频。
要获得每周关于我的内容创作和数据科学行业额外学习资源的更新,请订阅我的通讯,数据涌动!
另外,考虑通过注册会员来支持我和成千上万的其他作者。
[## 通过我的推荐链接加入 Medium — Ken Jee
作为 Medium 会员,你的一部分会员费用会用于支持你阅读的作者,并且你可以完全访问每个故事…
medium.com](https://medium.com/@kenneth.b.jee/membership?source=post_page-----c31d29034b69--------------------------------)
ChatGPT 代码解释器:它如何节省了我几个小时的工作
原文:
towardsdatascience.com/chatgpt-code-interpreter-how-it-saved-me-hours-of-work-3c65a8dfa935
用几句话创建一个国家人口的互动世界地图。
·发布在Towards Data Science ·6 分钟阅读·2023 年 7 月 9 日
–
图片由Arpit Rastogi提供,来源于Unsplash
2023 年 7 月 6 日,OpenAI 宣布代码解释器将在接下来的一周内向 ChatGPT Plus 用户开放。这可能是增强 ChatGPT 功能和能力的所有插件中最出色的一种。
代码解释器运行代码并允许上传数据,以便你可以用于数据清理、分析、可视化以及许多其他功能。它就像是一个触手可及的数据分析师。
听起来很棒?那我们继续吧。
我在一个任务中使用了它,这个任务本来需要我花费几个小时才能完成。根据你的任务和对 Python 库的熟悉程度,这个任务可能需要更长的时间。
使用 ChatGPT,我只需写几句话并上传两个 CSV 文件。
我将一步一步带你了解这个过程,以及代码解释器在各种任务中的惊人表现,例如理解数据、清理和预处理数据,以及创建数据可视化。
你需要先启用它
为了在聊天中使用代码解释器,你需要先通过设置启用它。
如何启用代码解释器(图片由作者提供)
现在在你开始一个新聊天时就可以使用它了。
任务
我打算创建一个世界地图可视化,用点表示国家,点的大小与国家人口成比例。
我有两个数据集,一个用于国家人口,另一个用于经纬度位置。
你可以轻松地在网上找到这些数据集。如果找不到,我在我的数据集仓库中有它们。
你还可以将代码解释器用作你的导师、同事或第二双眼睛。
## ChatGPT Code Interpreter: Your Mentor, Coworker, and Second Pair of Eyes
利用最新的 ChatGPT 插件。
让我们开始吧……
由于这是一个简单的任务,我没有花费太多时间在提示工程上。以下是我向 ChatGPT 提出的请求的第一句:
(图片来源:作者)
你可以使用提示窗口左侧的加号来上传数据集。
使用 + 上传数据集(图片来源:作者)
它开始读取数据集,这是显而易见的事情。目前还不算令人印象深刻!
# code generated by Code Interpreter
import pandas as pd
# Load the CSV data into a pandas DataFrame
population_data = pd.read_csv('/mnt/data/country_population_historic.csv')
# Display the first few rows of the DataFrame
population_data.head()
接着,ChatGPT 询问了国家位置:
(图片来源:作者)
我已经有了数据,所以我直接上传了:
(图片来源:作者)
# code generated by Code Interpreter
# Load the country coordinates data
country_coordinates = pd.read_csv('/mnt/data/country_coordinates.csv')
# Display the first few rows
country_coordinates.head()
数据清理和预处理
读取数据后的下一步是清理和预处理数据。我相信你已经听到过很多次,这一步通常需要最多的时间。
在创建世界地图可视化之前,有几个问题需要处理。ChatGPT 发现了这些问题,并在不到一分钟的时间内提供了解决方案。非常令人印象深刻!
(图片来源:作者)
上述代码片段中的代码:
# code generated by Code Interpreter
# Check if the country names are consistent across both dataframes
population_countries = set(population_data['Country Name'])
coordinates_countries = set(country_coordinates['name'])
# Countries in the population data but not in the coordinates data
missing_in_coordinates = population_countries - coordinates_countries
# Countries in the coordinates data but not in the population data
missing_in_population = coordinates_countries - population_countries
在坐标数据集中和人口数据集中都缺少一些国家。
ChatGPT 在上述代码片段中做了什么:
-
在两个数据集中创建国家名称的 Python 集合
-
分别比较它们以找出差异作为一个集合
ChatGPT 在不到一分钟的时间内解决了这个问题。
上述代码片段中的代码:
# code generated by Code Interpreter
# Mapping of country names from the population dataset to the coordinates dataset
country_name_mapping = {
'Bahamas, The': 'Bahamas',
'Brunei Darussalam': 'Brunei',
'Cabo Verde': 'Cape Verde',
'Congo, Dem. Rep.': 'Congo [DRC]',
'Congo, Rep.': 'Congo [Republic]',
"Cote d'Ivoire": "Côte d'Ivoire",
'Czechia': 'Czech Republic',
'Egypt, Arab Rep.': 'Egypt',
'Gambia, The': 'Gambia',
'Hong Kong SAR, China': 'Hong Kong',
'Iran, Islamic Rep.': 'Iran',
"Korea, Dem. People's Rep.": 'North Korea',
'Korea, Rep.': 'South Korea',
'Kyrgyz Republic': 'Kyrgyzstan',
'Lao PDR': 'Laos',
'Macao SAR, China': 'Macau',
'Micronesia, Fed. Sts.': 'Micronesia',
'Myanmar': 'Myanmar [Burma]',
'North Macedonia': 'Macedonia [FYROM]',
'Russian Federation': 'Russia',
'Sao Tome and Principe': 'São Tomé and Príncipe',
'Slovak Republic': 'Slovakia',
'Syrian Arab Republic': 'Syria',
'Turkiye': 'Turkey',
'Venezuela, RB': 'Venezuela',
'Yemen, Rep.': 'Yemen',
'Eswatini': 'Swaziland'
}
# Clean the population dataset
population_data_clean = population_data.replace({"Country Name": country_name_mapping})
# Drop the rows that do not exist in the coordinates dataset
population_data_clean = population_data_clean[population_data_clean['Country Name'].isin(coordinates_countries)]
# Merge the population data with the country coordinates data
merged_data = pd.merge(population_data_clean, country_coordinates, left_on='Country Name', right_on='name')
# Keep only the necessary columns
merged_data = merged_data[['Country Name', '2022', 'latitude', 'longitude']]
# Rename the columns for clarity
merged_data.columns = ['Country', 'Population', 'Latitude', 'Longitude']
merged_data.head()
清理和预处理数据(图片来源:作者)
我们现在的数据格式整洁漂亮。这个步骤通常需要大量时间和人工努力。ChatGPT 只用了大约一分钟。
创建可视化
ChatGPT 首先尝试使用 Matplotlib 库进行操作。然而,由于缺少世界地图图像,它未能成功:
(图片来源:作者)
然后,我简单地要求它使用 Plotly,这也是我一开始想到的。
(图片作者提供)
(图片作者提供)
上述代码片段中的代码:
# code generated by Code Interpreter
import plotly.graph_objects as go
# Create the scatter geo plot
fig = go.Figure(data=go.Scattergeo(
lon = merged_data['Longitude'],
lat = merged_data['Latitude'],
text = merged_data['Country'] + ': ' + merged_data['Population'].astype(str),
mode = 'markers',
marker = dict(
size = (merged_data['Population'] / 1000000) ** 0.5, # Take square root to better visualize differences
sizemode = 'diameter',
sizeref = 1,
sizemin = 4,
color = merged_data['Population'],
colorscale = 'Viridis',
colorbar_title = "Millions",
)
))
# Update the layout
fig.update_layout(
title_text = '2022 World Population',
geo = dict(
showframe = False,
showcoastlines = True,
projection_type = 'equirectangular'
)
)
fig.show()
它无法在浏览器中显示交互式世界地图,但成功编写了生成它的代码。我只需将代码复制并粘贴到 Jupyter notebook 中即可。
这里是最终结果:
国家人口的交互式世界地图(GIF 由作者提供)
最后的话
我们做了什么:
-
读取数据集
-
清理、预处理并合并它们
-
创建交互式数据可视化
我们只需写两个句子(加上告诉 ChatGPT 使用 Plotly)。我觉得这非常令人印象深刻!
我还创建了一个仓库,其中包含一个 Jupyter notebook,里面有所有的代码片段和使用的数据集。随时下载并重新生成可视化。这也是数据清理的一个很好的实践。
你可以成为一个 Medium 会员 以解锁对我所有写作的完整访问权限,以及 Medium 的其余内容。如果你已经是会员,别忘了 订阅 以便我每次发布新文章时收到邮件通知。
感谢阅读。如果你有任何反馈,请告诉我。