本节将介绍Code Interpreter插件的工作原理和功能,并通过具体案例详细阐述如何运用这个强大的工具。
在3.1.2节介绍ChatGPT插件的开启方式时,我们提到过当我们切换到GPT-4后,可以在其弹出的页面中选择Code Interpreter模式,当我们进入该模式后,我们可以显而易见地发现文本框的左侧多了一个加号按钮,单击它可以上传文件,之后就可以直接操作这个文件了,文件类型可以是各种格式的,包括但不限于.csv、.txt、.png/jpg、.zip、.pdf等,待上传成功后,文本框上侧会显示文件的名称,如图3.6所示。
图3.6 上传文件按钮
在该模式下,我们可用且仅可使用Code Interpreter插件,但是千万不要因此就认为这个模式不堪大用,恰恰相反,这个模式对于我们的数据分析工作大有裨益,对于我们数据分析工作的效率会起到质的提高。
OpenAI官网对于Code Interpreter的介绍是:“我们在一个沙盒式、防火墙执行环境中提供了一个可用的python解释器,以及一些临时的磁盘空间。我们的解释器插件运行的代码在一个持久化的会话中进行评估,该会话在聊天会话期间一直存在(有一个上限超时时间),随后的调用可以在其上构建。我们支持将文件上传到当前的聊天工作区,并下载您的工作结果。”
从中可以看出,Code Interpreter的核心是给ChatGPT提供了一个封装的python运行环境,并且是一个预装了300多个库和软件包的沙盒防火墙环境,这样ChatGPT可以像程序员一样在这个环境中编写和执行代码。简单地说,它可以根据你的需求,自动写python代码,执行程序并输出结果的插件。有了这个插件,就算你自己不会写代码,也可以完成很复杂的数据分析工作。其工作流程如图3.7所示。
图3.7 Code Interpreter工作流程
具体来说,它的工作流程有以下几个。
(1)用户要给ChatGPT一个包含需求描述的提示,例如“读取这个CSV数据文件,生成条形图”。
(2)ChatGPT会调用Code Interpreter的python环境,并在这个环境中编写代码来实现该需求。
(3)代码自动编写完成后,Code Interpreter会自动对ChatGPT编写的python代码进行编译,并会在自己的python环境中运行这段代码。
(4)代码执行的过程中,如果有错误或异常,Code Interpreter会自动进行捕捉并给出提示。
(5)当代码成功执行完毕后,Code Interpreter会将结果返回给ChatGPT(对于生成图像等任务,Code Interpreter可以直接显示或提供文件),ChatGPT最后将结果通过对话的形式返回给用户。
在这个过程中,Code Interpreter为ChatGPT提供了一个安全可控的编程“沙盒”,并自动完成了编译、运行、调试等程序员的工作,Code Interpreter智能地扮演了“程序员”这个角色,让ChatGPT把更多注意力放在需求分析和代码设计上,从而大大提高了它的编程能力。我们先了解Code Interpreter在数据分析中的应用有哪些,在3.2.2节,我们将会围绕它在数据分析中的作用详细说明使用方法。
1.上传文件
(1)多格式支持。除了前文提到的.csv、.txt、.png/jpg、.zip、.pdf等格式,Code Interpreter还支持.JSON、.XML、.SQL等多种数据格式的文件上传,假如用户上传一个JSON格式的数据文件,Code Interpreter能够无缝地读取和解析。
(2)自动识别。Code Interpreter能够自动识别文件的编码格式、分隔符等属性,简化上传流程,假如我们上传一个以逗号分隔的CSV文件,Code Interpreter能够自动识别并正确读取数据。
(3)数据理解。上传文件后,Code Interpreter可以提供数据的简要概览,让用户对数据有一个初步的了解,比如我们上传一个CSV文件后,Code Interpreter展示前10行数据,让用户初步了解数据结构。
2.编写代码
(1)代码提示。在编写代码时,Code Interpreter可以提供代码提示和自动补全功能,帮助用户更快速地完成编写。比如我们输入“mean(”,Code Interpreter会自动提示“mean(column_name)”。
(2)错误提示。如果用户编写的代码存在错误,Code Interpreter会提供错误提示和建议的修正方法。
(3)模板代码。此为常见的数据处理任务,如数据清洗、统计分析等,Code Interpreter可以提供模板代码,用户只需进行简单的修改即可。比如我们想要进行数据清洗,Code Interpreter可以提供一个去除空值的模板代码供我们使用。
User:
假如你是一位数据科学家,请提供我一个在电商数据分析中去除空值的模板代码。
ChatGPT:
当然可以。在电商数据分析中,数据清洗是一个非常重要的步骤,去除空值是其中的一个常见操作。
以下是使用python的pandas库进行数据清洗的模板代码:
注意:
请将your_e-commerce_data_file.csv替换为您的电商数据文件名。
根据您的需求,您可以选择直接删除含有空值的行,或者使用某种策略(如中位数、平均数、众数等)填充空值。
保存清洗后的数据时,可以选择不同的文件名以避免覆盖原始数据。
这只是一个基础的模板,实际的数据清洗可能需要更复杂的操作,取决于数据的具体情况和分析需求。
3.数据分析交互
(1)智能问答。用户可以向Code Interpreter提问,它会根据数据内容给出相应的答案或代码建议,比如我们询问“销售额的总和是多少?”,Code Interpreter会返回相应的代码和结果。
(2)实时反馈。在数据分析过程中,Code Interpreter可以实时展示中间结果,帮助用户更好地理解数据。
(3)历史记录。Code Interpreter会保存用户的查询和代码历史,方便用户回溯和复用。
4.生成图表
(1)自定义样式。用户可以自定义图表的颜色、大小、标题等属性,使图表更符合自己的需求。比如我们对Code Interpreter输出的柱状图颜色不满意,想要将柱状图的颜色更改为蓝色,Code Interpreter会按照我们的指令调整图表颜色。
(2)交互式图表。生成的图表不仅仅是静态的,用户可以通过交互式的方式,如缩放、拖动等,更深入地探索数据。
(3)图表导出。用户可以将生成的图表导出为图片或其他格式,方便分享和报告。
5.文件编辑
(1)批量操作。Code Interpreter支持对数据进行批量操作,如批量替换、批量删除等。比如我们想要将所有“未知”值替换为“N/A”,Code Interpreter可以执行批量替换操作。
(2)数据转换。用户可以使用Code Interpreter将数据从一种格式转换为另一种格式,如从CSV转为Excel。假如我们上传了一个Excel文件,并希望将其转换为CSV格式,Code Interpreter完成转换并提供下载链接。
(3)版本控制。Code Interpreter提供文件的版本控制功能,用户可以随时回退到之前的版本,确保数据的安全性。万一我们不小心删除了某列数据,通过Code Interpreter的版本控制功能,能够恢复到删除前的版本。
由此可见,Code Interpreter显著拓展了ChatGPT的应用场景,使其成为一个超强的数据分析好帮手,甚至将推动人机协作方式的革新。
在3.2.1节,我们对Code Interpreter功能进行了深入的探索,了解了它的基本特点和功能。它不仅仅是一个简单的代码执行工具,更是一个能够与我们互动、协助我们解决问题的智能助手。但是,只了解理论是远远不够的,真正的掌握和理解往往来自实践。
现在,我们即将进入一个更加激动人心的部分——Code Interpreter插件实战。在这一节中,我们将使用实际案例探讨如何在实际场景中使用这个插件,如何与它互动,并解决一系列实际问题。
这里我们需要先介绍一下使用到的数据集和相关平台。Kaggle是全球最大的为数据科学家和机器学习工程师提供竞赛、数据集和教程的平台,我们接下来要使用的数据集就是Kaggle平台的泰坦尼克数据集,它来自一个叫作“Titanic-Machine Learning from Disaster”的竞赛(中文名:泰坦尼克号-灾难中的机器学习,数据集下载链接:https://www.kaggle.com/competitions/titanic/data),该数据集同时也是数据科学和机器学习社区中最为人所熟知的入门级数据集之一。数据集包含了泰坦尼克号上乘客的信息,如年龄、性别、舱位等,以及他们是否在事故中生还,而数据集的主要目标是根据乘客的个人信息预测他们是否能够在泰坦尼克号的沉船事故中生还。Kaggle的Titanic-Machine Learning from Disaster竞赛首页如图3.8所示。
为了下载该数据集,我们可以单击“Data”栏,跳转到数据集页面,然后在“Data Explorer”下分别选择三个数据集,单击
进行下载;也可以直接单击右下角的“Download All”按钮下载该比赛所有数据集,如图3.9所示。
图3.8 Titanic-Machine Learning from Disaster竞赛首页
图3.9 数据集下载
现在让我们使用这个数据集来实践学习Code Interpreter的强大功能。
1.上传数据
单击文本框的左侧的加号按钮上传我们前面下载好的数据文件,待上传成功后,文本框上侧会显示文件的名称,如图3.10所示。
图3.10 数据上传
2.查看数据概览
在3.2.1节,我们提到过Code Interpreter可以为我们解读数据,从而让我们对数据内容有一个初步的了解。
User:
假设你是一位数据科学家,请提供这三个数据文件的内容概览。
ChatGPT很快给出了回答。
ChatGPT:
好的,首先让我查看这三个文件的内容,以便了解它们包含的数据。我会从“train.csv”开始,然后检查“test.csv”和“gender_submission.csv”。
这些数据看起来与泰坦尼克号的乘客有关。以下是各个文件的初步概览
1.train.csv
·PassengerId:乘客的唯一标识符。
·survived:乘客是否存活(0表示未存活,1表示存活)。
·Pclass:乘客的舱位等级(1是一等舱,2是二等舱,3是三等舱)
·Name:乘客的姓名。
·sex:乘客的性别。
·Age:乘客的年龄。
·sibsp:在船上的兄弟姐妹或配偶的数量。
·Parch:在船上的父母或子女的数量。
·Ticket:船票编号。
·Fare:船票价格。
·Cabin:船舱号。
·Embarked:乘客上船的港口(C=Cherbourg;Q=Queenstown;S=Southampton)
2.test.csv
·这个文件包含与“train.csv”相同的字段,但不包含“Survived”字段。它是用来预测哪些乘客在泰坦尼克号事故中存活的。
3.gender_submission.csv
·PassengerId:乘客的唯一标识符。
·Survived:乘客是否存活(0表示未存活,1表示存活)。
·这个文件看起来像是一个提交样本或基准解决方案,它可能是基于性别预测的存活率。
接下来,我会为这些数据提供一些基本统计信息。
以下是这些数据集的基本统计信息:
1.train.csv:
·共有891名乘客的信息。
·平均存活率为38.38%。
·大约74%的乘客年龄信息是可用的,平均年龄为29.7岁,年龄范围从0.42岁到80岁。
·大多数乘客(超过75%)没有与父母或子女同行。
·票价范围从0到512.33,平均票价为32.20。
·大部分乘客从Southampton(S)登船
2.test.csv:
·共有418名乘客的信息。
·平均年龄为30.3岁。
·票价范围从0到512.33,平均票价为35.63.
·与训练数据集相似,大多数乘客从Southampton(S)登船
3.gender_submission.csv:
·这是一个预测结果的示例数据,包含418名乘客的信息。
·预测的平均存活率为36.36%。
这些信息为我们提供了一个关于数据的初步概览。接下来,我们可以进一步探索数据、进行数据清理、特征工程以及建模等步骤。您希望如何进行下一步操作?
可以看到,在Code Interpreter的加持下,ChatGPT不仅给出了各个数据文件的字段,判断出了各个字段的含义,还根据字段信息推断出了3个数据文件分别的作用,最后甚至推断出了该数据集和泰坦尼克号有关。
同时,Code Interpreter还给出了我们3张数据表中的基本统计信息,这使我们从整体上对这些数据的量级、意义上有了更直观的感受。
最终,Code Interpreter给出了我们一些进一步分析的建议,比如它提出可以进一步探索数据、进行数据清理、特征工程以及建模等步骤。
3.数据清洗
在Code Interpreter的应用中,我们提到它在数据分析中可以应用于代码编写和数据分析交互,这也就意味着,从数据清洗、探索数据到特征工程和建模,我们都可以通过Code Interpreter去完成并直接得到结果。
我们先来看数据清洗。
User:
请继续保持数据科学家的身份,针对上述数据先进行数据清洗。
我们分析的过程不会那么一帆风顺,有时可能会产生如下问题。
ChatGPT:
好的,数据清理是数据预处理的一个重要部分。常见的数据清理任务包括:
1.处理缺失值
2.处理异常值
3.转换数据类型(如果必要)
4.处理重复值
我将从上述步骤开始,首先检查数据中的缺失值。
很抱歉,似乎我们的代码执行环境遇到了问题。我将重新加载数据并检查缺失值。
很抱歉,我遗漏了导入必要的库。我将重新导入它们并继续检查缺失值。
很抱歉,由于之前的环境问题,您需要重新上传那三个数据文件。如果您提供,我将继续从数据清理开始。
ChatGPT此时仿佛在自言自语一样来回地修改代码,虽然没能给出结果,但是好在它通过自动地测试找出了问题所在,那么我们按照它找出的原因进行解决。
ChatGPT:
谢谢您的耐心。我会重新加载这些文件并开始数据清理的步骤,首先检查缺失值。
以下是训练和测试数据中的缺失值:
1.train.csv:
·Age:177个缺失值
·Cabin:687个缺失值
·Embarked:2个缺失值
2.test.csv:
·Age:86个缺失值
·Fare:1个缺失值
·cabin:327个缺失值
接下来,我会采取以下措施来处理这些缺失值!
1.Age:使用中位数填充缺失值,因为年龄数据可能会有偏态。
2.Cabin:由于缺失值过多,我们可以将其转化为一个二元变量,表示是否有船舱信息。
3.Embarked:使用训练数据中的众数填充缺失值,因为它只有少量的缺失值。
4.Fare:使用中位数填充缺失值,因为票价数据可能会有偏态。
开始进行上述数据清理操作。
数据清理完毕,现在训练和测试数据中已经没有缺失值了。
具体操作如下:
1.Age:使用中位数填充缺失值。
2.Cabin:已转化为一个二元变量,表示是否有船舱信息。
3.Embarked:使用众数填充缺失值。
4.Fare:使用中位数填充缺失值。
接下来,我们可以进入数据探索、特征工程或建模阶段。您希望怎么做?
可以看到,当我们重新上传数据后,ChatGPT不仅找出了各个字段中的缺失值数量,还智能地分析了各个字段的缺失值应当使用何种方法进行填充。
4.探索数据
User:
请继续保持数据科学家的身份,针对上述数据进行数据探索。
当我们给出这个指令后,ChatGPT输出了极长的内容。
ChatGPT:
好的,数据探索是一个关键步骤,可以帮助我们更好地理解数据并为建模做准备。
在这个阶段,我将:
1.可视化存活率与各个特征之间的关系,以获取直观的洞察。
2.查看数值特征的分布情况。
3.分析分类特征的分布情况及其与存活率的关系。
首先,我们来看一下存活率与性别之间的关系。
存活率与性别之间关系的可视化结果如图3.11所示。
图3.11 存活率与性别之间关系的可视化结果
ChatGPT:
从图3.11中,我们可以观察到以下两点:
1.女性的存活率明显高于男性。尽管男性乘客的数量比女性多,但更多的女性乘客在泰坦尼克号沉船事故中存活下来。
2.这与“女士优先”(即在紧急情况下优先疏散女性和儿童)的原则相一致。
接下来,我们将探讨舱位等级(Pelass)与存活率之间的关系。
舱位等级与存活率之间的关系如图3.12所示。
ChatGPT:
从图3.12中,我们可以观察到以下几点:
图3.12 舱位等级与存活率之间的关系
1.头等舱的乘客存活率最高。他们的存活人数明显超过了未存活人数。
2.三等舱的乘客存活率最低,且大部分三等舱乘客在事故中未能存活。
3.二等舱的乘客存活率介于一等舱和三等舱之间。
这可能是因为一等舱和二等舱的乘客有更容易到达甲板和救生艇的位置,而三等舱的乘客则可能面临更多的障碍。
接下来,我们将查看年龄(Age)分布及其与存活率的关系
该部分输出的可视化结果如图3.13所示。
图3.13 年龄分布与存活率关系示意图
ChatGPT:
从图3.13中,我们可以观察到以下两点:
1.儿童(特别是年龄在0~10岁之间的乘客)的存活率较高,这与紧急疏散时通常优先考虑儿童的原则相一致。
2.年轻成年人(特别是20~30岁)的死亡率较高,这可能是因为他们在尝试帮助他人或寻找救生艇时遇到了困难。
除了儿童外,年龄与存活率之间没有明显的趋势。
接下来,我们可以查看票价(Fare)分布及其与存活率的关系。
该部分输出的可视化结果如图3.14所示。
图3.14 票价分布与存活率关系示意图
从图3.14中,我们可以观察到以下两点:
1.低票价的乘客有更高的死亡率,尤其是那些票价在0~20范围内的乘客
2.高票价的乘客存活率相对较高,特别是那些票价在20~60范围内的乘客
这可能是因为票价更高的乘客可能预订了更好的舱位,这使得他们在紧急疏散时更容易到达甲板和救生艇。
在整个数据探索部分中,Code Interpreter给出了可视化存活率与各个特征之间的关系、数值特征的分布情况并分析分类特征的分布情况及其与存活率的关系。可以看到,Code Interpreter的数据探索做得非常完善,如果我们刚拿到数据还没有得到分析思路,Code Interpreter可以为我们开路,给我们各种线索以形成我们自己的分析思路。
比如当我们看到Code Interpreter返回的结果中,在性别中,“女性”存活率较高;在舱位等级中,高等级船舱存活率较高,那么我们是否可以做交叉分析呢?我们可以向ChatGPT提问。
User:
根据数据探索的结果,进一步探索性别和舱位等级交叉后的存活率情况。
ChatGPT绘制的交叉分析结果如图3.15所示。
图3.15 性别和舱位等级交叉后存活率分析
ChatGPT:
从图3.15中,我们可以观察到以下两点:
1.女性乘客:
·一等舱和二等舱的女性乘客有非常高的存活率。只有少数一等舱和二等舱的女性乘客在事故中未能存活。
三等舱的女性乘客存活率较低,但相比同为三等舱的男性,她们的存活率仍然较高。
2.男性乘客:
一等舱的男性乘客存活率相对较高,但仍然低于未存活的男性乘客数量。
·二等舱和三等舱的男性乘客存活率非常低,特别是三等舱。
总体上,无论是哪个性别,一等舱的乘客存活率都明显高于二等舱和三等舱。而且,不同舱位等级中的女性乘客的存活率都高于男性。
这进一步强调了性别和舱位等级在存活率上的重要性。这两个特征很可能在后续的建模中非常有用。
5.特征工程和建模
同样地,在特征工程和建模阶段我们依然先让ChatGPT自行发挥:
User:
请继续保持数据科学家的身份,针对上述数据进行特征工程和建模。
ChatGPT给出的特征工程和建模过程如下:
ChatGPT:
好的,接下来的步骤是特征工程和建模。特征工程可以提高模型的性能,使模型更好地理解数据。
特征工程
我计划进行以下特征工程:
1.家庭大小:结合SibSp(兄弟姐妹/配偶数)和Parch(父母/子女数)创建一个新的特征,表示家庭的大小。
2.是否独自一人:基于家庭大小创建一个新的二元特征,表示乘客是否独自一人。
3.姓名的称谓:从Name特征中提取称谓(如Mr、Mrs、Miss等),这可能与存活率有关。
4.对分类变量(如Sex, Embarked, Title)进行独热编码。
5.删除不需要的特征。
建模
一旦特征工程完成,我将使用以下步骤进行建模:
1.将数据分为训练集和验证集。
2.使用随机森林分类器作为初始模型(因为它通常在此类问题上表现良好)。
3.评估模型的性能。
4.根据需要进行调优。
首先,我们开始进行 特征工程 。
特征工程已完成,以下是我们所做的更改:
1.添加了一个FamilySize特征,表示家庭的大小。
2.添加了一个IsAlone二元特征,表示乘客是否独自一人。
3.从Name特征中提取了Title并进行了清洗和整理。例如,我们将少见的称谓合并为“Rare”类别。
4.对Sex, Embarked和Title进行了独热编码。
5.删除了不再需要的特征,如PassengerId, Name, Ticket, SibSp和Parch。
现在,我们可以进行 建模 。
首先,我将数据分为训练集和验证集,然后使用随机森林分类器作为初始模型。
模型的表现如下:
训练集准确率:98.46%
验证集准确率:84.36%
可以看到,模型在训练集上的表现非常好,但在验证集上的表现较差。这可能是因为模型过拟合了训练数据。
为了解决这个问题,我们可以:
1.调整模型的参数以防止过拟合。
2.使用交叉验证来更好地评估模型的性能。
3.尝试其他机器学习模型。
您希望如何进行下一步操作?
可以看到,ChatGPT不仅给出了特征工程处理方法,还给出了使用随机森林的建模方法。
根据ChatGPT输出的结果,我们可以看到模型在训练集上的准确率为98.46%,也就是说模型在已知数据上的预测准确性是较好的;但是在验证集上的准确率为84.36%,验证集是从原始数据集中分离出来的,模型在训练期间并没有“看到”它,在验证集上的准确率表现较差,因此我们需要提出一些优化建议。
User:
请你调整模型的参数以防止过拟合、使用交叉验证来更好地评估模型的性能和将其他机器学习模型的方法都尝试一遍,得出最优方案。
在我们的建议下,ChatGPT进行了以下一番优化。
ChatGPT:
当然,我将采用以下几个步骤来找到最佳模型:
1.调整随机森林参数:使用交叉验证和网格搜索来找到最佳参数。
2.尝试其他模型:比如逻辑回归、支持向量机和梯度提升机等。
3.比较模型:基于交叉验证的准确率来比较这些模型,选择最佳的一个。
首先,我们从调整随机森林的参数开始。
随机森林的最佳参数如下:
1.max_depth:None(不限制树的最大深度)
2.min_samples_leaf:2(叶节点的最小样本数)
3.min_samples_split:5(拆分内部节点所需的最小样本数)
4.n_estimators:150(决策树的数量)
使用这些参数,随机森林的交叉验证准确率为83.84%。
接下来,我们将尝试其他机器学习模型,并使用交叉验证来评估它们的性能。我们将尝试以下模型:
1.逻辑回归
2.支持向量机
3.梯度提升机
让我们开始。
以下是我们尝试的不同模型的交叉验证准确率:
1.逻辑回归:81.93%
2.支持向量机:83.05%
3.梯度提升机:83.05%
4.随机森林(经过调优):83.84%
从上述结果中,我们可以看到调整后的随机森林模型在交叉验证中的表现是最好的,准确率达到了83.84%。
因此,最优方案是使用调整后的随机森林模型。
如果您有任何其他要求或问题,请随时提出!!
在这一轮的改进中,ChatGPT使用了随机森林的最佳参数并尝试其他机器学习模型,使用交叉验证来评估它们的性能,最终得出结论:调整后的随机森林模型在交叉验证中的表现是最好的,准确率达到了83.84%。
值得注意的是,尽管调优后的模型在交叉验证中的性能略有下降,但这不意味着模型的质量较差。交叉验证提供了更稳健、更一般的性能估计,而单次分割(训练/验证)可能会受到特定数据分布的影响。所以选择模型时,我们通常会根据交叉验证的结果,因为它提供了模型在不同数据子集上的一般性能。
经过以上案例的实践,我们可以感受到Code Interpreter在数据分析领域的强大功能。或许在将来某一天,“人人都是数据分析师”的场面会到来,大家都可以通过AI工具提升我们的工作效率和产出。