本章讨论生成式人工智能如何可以自动化数据科学。生成式人工智能,特别是语言模型(LLMs),有潜力在各个领域加速科学进展,尤其是通过提供对研究数据的高效分析和辅助文献综述过程。当前许多属于自动化机器学习(AutoML)领域的方法可以帮助数据科学家提高生产力,使数据科学过程更具可重复性。在本章中,我们首先讨论生成式人工智能对数据科学的影响,然后概述数据科学中的自动化。
接下来,我们将讨论如何使用代码生成和工具以多种方式回答与数据科学相关的问题。这可以通过进行模拟或用附加信息丰富我们的数据集的形式呈现。最后,我们将把重点转移到对结构化数据集的探索性分析上。我们可以设置代理来运行SQL或在pandas中处理表格数据。我们将看到如何询问有关数据集的问题,关于数据的统计问题,或者请求可视化。
在整个章节中,我们将尝试使用LLMs进行数据科学的不同方法,你可以在本书的GitHub存储库中的data_science目录中找到,网址为github.com/benman1/gen... 本章的主要部分包括:
- 生成模型对数据科学的影响
- 自动化数据科学
- 使用代理回答数据科学问题
- 利用LLMs进行数据探索
在深入讨论数据科学如何自动化之前,让我们首先讨论生成式人工智能将如何影响数据科学!
生成式模型对数据科学的影响
生成式人工智能(Generative AI)和诸如GPT-4之类的语言模型(LLMs)在数据科学和分析领域带来了重大变革。这些模型,特别是LLMs,可以以多种方式革新数据科学的所有步骤,为研究人员和分析师提供了令人兴奋的机会。生成式AI模型,如ChatGPT,能够理解并生成类似人类的响应,使其成为提高研究生产力的有价值工具。
生成式AI在分析和解释研究数据方面发挥着至关重要的作用。这些模型可以协助进行数据探索,揭示隐藏的模式或相关性,并提供通过传统方法可能无法察觉的见解。通过自动化数据分析的某些方面,生成式AI节省时间和资源,使研究人员能够集中精力处理更高层次的任务。
生成式AI可以帮助研究人员的另一个领域是进行文献综述和识别研究空白。ChatGPT和类似的模型可以总结大量学术论文或文章的信息,提供对现有知识的简明概述。这有助于研究人员更有效地确定文献中的空白,并引导他们更高效地进行研究。我们在第4章"构建功能强大的助手"中已经讨论了在这方面使用生成式AI模型的方面。
生成式AI在数据科学的其他用例包括:
- 自动生成合成数据: 生成式AI可以自动生成合成数据,用于训练机器学习模型。这对于那些无法获得大量真实世界数据的企业非常有帮助。
- 识别数据中的模式: 生成式AI可以用于识别人类分析师无法看到的数据中的模式。这对于企业希望从数据中获得新见解的情况非常有帮助。
- 从现有数据创建新特征: 生成式AI可以用于从现有数据创建新特征。这对于企业希望提高其机器学习模型准确性的情况非常有帮助。
根据麦肯锡(McKinsey)和毕马威(KPMG)等机构的最新报告,AI的影响涉及数据科学家将处理的任务、他们的工作方式以及可以执行数据科学任务的人员。主要影响领域包括:
- AI的民主化: 生成模型使更多的人能够利用AI,通过简单的提示生成文本、代码和数据。这将AI的使用扩展到数据科学家之外的更多人群。
- 提高生产力: 通过自动生成代码、数据和文本,生成式AI可以加速开发和分析工作流程。这使数据科学家和分析师能够专注于更高价值的任务。
- 数据科学的创新: 生成式AI正在带来以新的、更创新的方式探索数据,并生成以传统方法无法实现的新假设和见解的能力。
- 行业的颠覆: 生成式AI的新应用可能通过自动化任务或增强产品和服务来颠覆行业。数据团队需要识别高影响的应用场景。
- 仍存在的限制: 当前模型仍存在准确性限制、偏见问题和缺乏可控性。需要数据专家监督负责任的开发。
治理的重要性: 严格的治理对于生成式AI模型的开发和道德使用至关重要,以维护利益相关者的信任。
数据科学技能的变化: 需求可能从编码专业知识转向数据治理、伦理、翻译业务问题和监督AI系统的能力。
关于数据科学民主化和创新的问题,更具体地说,生成式AI还影响了数据可视化的方式。过去,数据可视化通常是静态的、二维的。然而,生成式AI可以用于创建交互式和三维的可视化,有助于使数据更加易于访问和理解。这使人们更容易理解和解释数据,从而带来更好的决策。
再次强调,生成式AI正在带来的最大变化之一是数据科学的民主化。过去,数据科学是一个非常专业化的领域,需要深入了解统计学和机器学习。然而,生成式AI使得技术专业知识较少的人能够创建和使用数据模型。这将数据科学的领域打开给更广泛的人群。
LLMs和生成式AI在自动化数据科学中发挥着至关重要的作用,提供了多种好处:
- 自然语言交互: LLMs允许自然语言交互,使用户可以使用普通英语或其他语言与模型进行沟通。这使非技术用户能够使用日常语言与数据进行交互和探索,无需专业的编码或数据分析知识。
- 代码生成: 生成式AI可以自动生成代码片段,执行探索性数据分析(EDA)期间的特定分析任务。例如,它可以生成SQL代码来检索数据、清理数据、处理缺失值或创建可视化。这个功能节省了时间并减少了手动编码的需求。
- 自动报告生成: LLMs可以生成自动报告,总结EDA的关键发现。这些报告提供有关数据集各个方面的见解,如统计摘要、相关性分析、特征重要性等,使用户更容易理解和展示他们的发现。
- 数据探索和可视化: 生成式AI算法可以全面探索大型数据集,并生成揭示数据中潜在模式、变量之间关系、异常或异常的可视化。这有助于用户在不手动创建每个可视化的情况下全面了解数据集。
此外,我们可以认为生成式AI算法应该能够从用户的交互中学习,并根据个体偏好或过去的行为调整其推荐。它通过持续的自适应学习和用户反馈改进,提供更个性化和有用的洞察力,在自动化EDA期间更加适应用户偏好。
最后,生成式AI模型可以通过从现有数据集中学习模式(智能错误识别)在EDA期间识别数据中的错误或异常。它可以快速而准确地检测不一致性并突出潜在问题。
总体而言,LLMs和生成式AI可以通过简化用户交互、生成代码片段、高效地识别错误/异常、自动报告生成、促进全面的数据探索和可视化创建,以及适应用户偏好来增强自动化EDA。然而,虽然这些模型为增强研究和协助文献综述过程提供了巨大的潜力,但它们不应被视为不可靠的信息源。正如我们前面所看到的,LLMs通过类比工作,对推理和数学有困难。它们的优势在于创造力,而不是准确性,因此,研究人员必须进行批判性思考,确保这些模型生成的结果准确、无偏和符合严格的科学标准。
一个显著的例子是微软的Fabric,它包含由生成式AI驱动的聊天界面。这使用户可以使用自然语言提出与数据相关的问题,无需等待数据请求队列,即可获得即时答案。通过利用类似OpenAI模型的LLMs,Fabric实现了对有价值洞察的实时访问。
在分析产品中,Fabric以其全面的方法脱颖而出。它解决了组织分析需求的各个方面,并为参与分析过程的不同团队提供了针对角色的体验,如数据工程师、仓储专业人员、科学家、分析师和业务用户。
通过在每一层次集成Azure OpenAI Service,Fabric利用生成式AI的力量来释放数据的全部潜力。Microsoft Fabric中的诸如Copilot等功能提供了会话语言体验,允许用户创建数据流、生成代码或整个函数、构建机器学习模型、可视化结果,甚至开发自定义的会话语言体验。
ChatGPT(以及扩展中的Fabric)在生成不正确的SQL查询时经常出现问题。当由分析师使用并检查输出的有效性时,这没有问题,但作为非技术业务用户的自助分析工具则可能是一场灾难。因此,组织在使用Fabric进行分析时必须确保建立可靠的数据流程并采用数据质量管理实践。
尽管生成式AI在数据分析中的可能性令人兴奋,但仍需谨慎。必须通过第一原理的推理和严格的分析来验证LLMs的可靠性和准确性。尽管这些模型在临时分析、研究中的思考和总结复杂分析方面展示了其潜力,但由于需要领域专家验证,它们并不总是适用于非技术用户的自助分析工具。
自动化数据科学
数据科学是一门将计算机科学、统计学和业务分析结合起来,从数据中提取知识和洞察力的领域。数据科学家使用各种工具和技术来收集、清理、分析和可视化数据。然后,他们利用这些信息帮助企业做出更好的决策。数据科学家的责任范围广泛,通常涉及多个步骤,具体角色和行业会有所不同。任务包括数据收集、清理、分析和可视化。数据科学家还负责构建预测模型,以帮助决策过程。所有提到的任务对数据科学至关重要,但可能耗时且复杂。
自动化数据科学工作流的各个方面的自动化使数据科学家能够更专注于创造性问题解决,同时提高工作效率。最近的工具通过在常见工作流中启用更快的迭代和减少手动编码来使流程的不同阶段更加高效。数据科学的一些任务与我们在第6章《使用生成式AI开发软件》中谈到的软件开发人员的任务有所重叠,即编写和部署软件,尽管焦点更为狭窄,主要集中在模型上。
像KNIME、H2O和RapidMiner这样的数据科学平台提供了统一的分析引擎,用于预处理数据、提取特征和构建模型。集成到这些平台的LLMs,如GitHub Copilot或Jupyter AI,可以根据自然语言提示生成用于数据处理、分析和可视化的代码。Jupyter AI允许与虚拟助手进行对话,解释代码、识别错误并创建笔记本。
文档中的截图显示了Jupyternaut聊天功能(Jupyter AI):
很明显,像那样在指尖上拥有这样的聊天功能,可以用来提问、创建简单函数或更改现有函数,对数据科学家来说是一个福音。
总体而言,自动化数据科学可以加速分析和机器学习应用程序的开发。它使数据科学家能够专注于流程的高价值和创造性方面。将数据科学民主化给业务分析师也是自动化这些工作流的关键动机。在接下来的部分中,我们将逐个调查不同的任务,并强调生成式AI如何有助于改进工作流程,并在数据收集、可视化和探索性数据分析、预处理和特征工程以及最终的AutoML等领域创造效率收益。让我们更详细地看看这些领域的每一个。
数据采集
自动化数据收集是在无需人工干预的情况下收集数据的过程。自动化数据收集可以成为企业的有力工具。它可以帮助企业更快速、高效地收集数据,并释放人力资源以便专注于其他任务。
在数据科学或分析的背景下,我们将ETL(抽取、转换和加载)称为不仅仅是从一个或多个源(数据收集)获取数据的过程,而且还准备数据以满足特定的用例。
有许多ETL工具,包括商业工具如AWS Glue、Google Dataflow、Amazon Simple Workflow Service(SWF)、dbt、Fivetran、Microsoft SSIS、IBM InfoSphere DataStage、Talend Open Studio,以及开源工具如Airflow、Kafka和Spark。在Python中,还有许多其他工具(无法列举全部),比如用于数据提取和处理的pandas,甚至celery和joblib,它们可以用作ETL编排工具。
在LangChain中,与Zapier集成,Zapier是一种自动化工具,可用于连接不同的应用程序和服务。这可以用于自动化从各种来源收集数据的过程。LLMs提供了一种加速的方式来收集和处理数据,特别擅长组织非结构化数据集。
最适合自动数据收集的工具将取决于业务的具体需求。企业应考虑他们需要收集的数据类型、需要收集的数据量以及他们可用的预算。
可视化与探索性数据分析(EDA)
探索性数据分析(EDA)涉及在执行机器学习任务之前手动探索和总结数据,以了解其各个方面。它有助于识别模式、检测不一致之处、测试假设并获得洞察力。然而,随着大型数据集的出现和对高效分析的需求,自动化的EDA变得重要起来。
自动化EDA和可视化是指使用软件工具和算法自动分析和可视化数据,减少人工干预。这些工具提供了多种好处。它们可以加速数据分析过程,减少在数据清理、处理缺失值、异常检测和特征工程等任务上所花费的时间。这些工具还通过生成交互式可视化,更有效地探索复杂数据集,提供对数据的全面概述。
在数据可视化中使用生成式AI为自动化EDA增添了新的维度,它根据用户提示生成新的可视化,使数据的可视化和解释变得更加易于理解。
预处理和特征提取
自动化数据预处理可以包括诸如数据清理、数据集成、数据转换和特征提取等任务。它与ETL中的转换步骤相关,因此在工具和技术上存在很多重叠。另一方面,自动化特征工程变得越来越重要,以充分发挥机器学习算法在复杂实际数据上的能力。这包括从数据中删除错误和不一致性,并将其转换为与将要使用的分析工具兼容的格式。
在预处理和特征工程过程中,LLMs自动化数据的清理、集成和转换。采用这些模型有望简化流程,从而通过在这些阶段最小化对敏感信息的人工处理来改善隐私管理。虽然在预处理任务中提高了灵活性和性能,但在确保自动创建的特征的安全性和可解释性方面仍然存在挑战,因为它们可能不像手动创建的特征那样透明。效率的提高不应损害通过自动化引入无意中的偏见或错误的检查需求。
AutoML
AutoML框架代表机器学习演进中的一个显着飞跃。通过简化完整的模型开发周期,包括数据清理、特征选择、模型训练和超参数调整等任务,AutoML框架在时间和精力方面显著节省了数据科学家通常花费的成本。这些框架不仅提高了速度,还有可能提高机器学习模型的质量。
AutoML的基本思想在mljar AutoML库的GitHub存储库中通过以下图表进行了说明(来源: github.com/mljar/mljar...%25EF%25BC%259A "https://github.com/mljar/mljar-supervised)%EF%BC%9A")
AutoML系统提供的价值关键在于它们对易用性和生产力增长的促进作用。在典型的开发环境中,这些系统使机器学习模型的快速识别和投产成为可能,简化了理解和部署过程。这些框架的起源可以追溯到像Auto-WEKA这样的创新。作为早期广泛框架尝试之一,它是在Waikato大学开发的,用Java编写,以自动化Weka机器学习套件中表格数据的过程。
自Auto-WEKA发布以来,这一领域已经在强大的框架方面得到了广泛的发展,如auto-sklearn、autokeras、NASLib、Auto-PyTorch、TPOT、Optuna、AutoGluon和Ray(tune)。这些框架跨越各种编程语言,适用于各种机器学习任务。更现代的AutoML进步已经利用了神经结构搜索技术,以涵盖ML管道的广泛部分,包括图像、视频和音频等非结构化数据类型。谷歌AutoML、Azure AutoML和H2O的产品是这场革命的前沿,提供了将机器学习可访问性扩展到超越专业数据科学家的个人的能力。
这些现代解决方案能够熟练处理表格和时间序列等结构化格式。通过进行精心设计的超参数搜索,它们的性能可以达到或甚至超过手动干预。像PyCaret这样的框架通过最小的代码同时训练多个模型,同时通过专门的项目(例如Nixtla的StatsForecast和MLForecast)专注于时间序列数据。
AutoML框架的特征是多方面的:它们提供部署能力,其中某些解决方案支持直接生产嵌入,尤其是基于云的解决方案;其他解决方案需要导出为与TensorFlow等平台兼容的格式。处理的数据类型的多样性是另一个方面,集中关注表格数据集以及服务于各种数据类型的深度学习框架。一些框架强调解释性作为一个重要功能,特别是在涉及到法规或可靠性的行业,如医疗保健和金融。在部署后进行监控是另一个操作功能,以确保随时间持续的模型性能。
尽管近年来取得了进展,用户仍然面临与这些自动化系统相关的典型缺点。"黑匣子"情景经常出现,难以理解内部工作原理,这可能阻碍对AutoML模型中问题的调试。此外,尽管它们通过节省时间和推动ML实践的民主化在没有广泛经验的人中使机器学习更易于访问,但由于任务的固有复杂性,它们在自动化ML任务方面的功效可能会受到限制。
随着LLMs的加入,AutoML焕发了新生,因为它们为诸如特征选择、模型训练和超参数调整等任务带来了自动化。对隐私的影响是可观的;使用生成模型的AutoML系统可以创建合成数据,减少对个人数据存储库的依赖。在安全性方面,自动系统必须设计具有故障安全机制,以防止错误在ML工作流的连续层之间传播。AutoML通过LLM集成提供的灵活性通过使非专业人士能够实现专业级别的模型调整,提高了竞争性能。
就易用性而言,尽管带有集成LLMs的AutoML为模型开发流程提供了简化的界面,但用户仍然需要面对有关模型选择和评估的复杂选择。
正如我们将在接下来的几节中看到的,LLMs和工具可以显著加速数据科学工作流程,减少手动工作量,并开拓新的分析机会。正如我们在Jupyter AI(Jupyternaut chat)中看到的 - 以及在第6章,使用生成AI开发软件中看到的 - 利用生成AI(代码LLMs)创建软件可以通过提高效率来取得良好的起点。这是我们研究在数据科学中使用生成AI的实际部分的好的起点。让我们开始使用代理运行代码或调用其他工具来回答问题!
使用代理回答数据科学问题
使用类似LLMMathChain的工具可以执行Python以回答计算查询。我们之前已经见过不同的代理和工具。
例如,通过连接LLMs和工具,可以轻松计算数学幂并获得结果:
ini
from langchain import OpenAI, LLMMathChain
llm = OpenAI(temperature=0)
llm_math = LLMMathChain.from_llm(llm, verbose=True)
llm_math.run("What is 2 raised to the 10th power?")
我们应该看到类似于以下的输出:
markdown
> Entering new LLMMathChain chain...
What is 2 raised to the 10th power?
2**10
numexpr.evaluate("2**10")
Answer: 1024
> Finished chain.
[2]:'Answer: 1024'
尽管这些功能擅长提供直接的数值答案,但将其整合到传统的EDA工作流程中并不那么直接。其他链,如CPAL(CPALChain)和PAL(PALChain),可以处理更复杂的推理挑战,减轻生成模型产生不切实际内容的风险;然而,在现实世界中的实际应用仍然难以找到。
使用PythonREPLTool,我们可以创建玩具数据的简单可视化或使用合成数据进行训练,这对于说明或启动项目可能很好。这是LangChain文档中的一个示例:
python
from langchain.agents.agent_toolkits import create_python_agent
from langchain.tools.python.tool import PythonREPLTool
from langchain.llms.openai import OpenAI
from langchain.agents.agent_types import AgentType
agent_executor = create_python_agent(
llm=OpenAI(temperature=0, max_tokens=1000),
tool=PythonREPLTool(),
verbose=True,
agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)
agent_executor.run(
"""Understand, write a single neuron neural network in PyTorch.
Take synthetic data for y=2x. Train for 1000 epochs and print every 100 epochs.
Return prediction for x = 5"""
)
这演示了使用PyTorch构建单神经元神经网络,使用合成数据进行训练并进行预测 - 这些都是直接在用户的计算机上执行的。然而,要小心执行没有保障的Python代码可能存在的安全风险。
我们得到了以下输出,其中包含一次预测:
ini
Entering new AgentExecutor chain...
I need to write a neural network in PyTorch and train it on the given data
Action: Python_REPL
Action Input:
import torch
model = torch.nn.Sequential(
torch.nn.Linear(1, 1)
)
loss_fn = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# Define the data
x_data = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y_data = torch.tensor([[2.0], [4.0], [6.0], [8.0]])
for epoch in range(1000): # Train the model
y_pred = model(x_data)
loss = loss_fn(y_pred, y_data)
if (epoch+1) % 100 == 0:
print(f'Epoch {epoch+1}: {loss.item():.4f}')
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Make a prediction
x_pred = torch.tensor([[5.0]])
y_pred = model(x_pred)
Observation: Epoch 100: 0.0043
Epoch 200: 0.0023
Epoch 300: 0.0013
Epoch 400: 0.0007
Epoch 500: 0.0004
Epoch 600: 0.0002
Epoch 700: 0.0001
Epoch 800: 0.0001
Epoch 900: 0.0000
Epoch 1000: 0.0000
Thought: I now know the final answer
Final Answer: The prediction for x = 5 is y = 10.00.
通过迭代训练显示在冗长的日志中,用户可以见证在时期内损失的逐渐减少,直到达到满意的预测为止。尽管这展示了神经网络如何随时间学习和预测,但在实践中扩展这种方法需要更复杂的工程工作。
LLMs和工具可以在我们想要使用类别或地理信息丰富数据时发挥作用。例如,如果我们的公司提供从东京飞往其他城市的航班,我们想要知道客户与东京的距离,我们可以使用WolframAlpha作为工具。这是一个简单的示例:
python
from langchain.agents import load_tools, initialize_agent
from langchain.llms import OpenAI
from langchain.chains.conversation.memory import ConversationBufferMemory
llm = OpenAI(temperature=0)
tools = load_tools(['wolfram-alpha'])
memory = ConversationBufferMemory(memory_key="chat_history")
agent = initialize_agent(tools, llm, agent="conversational-react-description", memory=memory, verbose=True)
agent.run(
"""How far are these cities to Tokyo?
* New York City
* Madrid, Spain
* Berlin
""")
请确保您已设置了OPENAI_API_KEY和WOLFRAM_ALPHA_APPID环境变量,如第3章"开始使用LangChain"中所讨论的。这是输出:
vbnet
> Entering new AgentExecutor chain...
AI: The distance from New York City to Tokyo is 6760 miles. The distance from Madrid, Spain to Tokyo is 8,845 miles. The distance from Berlin, Germany to Tokyo is 6,845 miles.
> Finished chain.
'
The distance from New York City to Tokyo is 6760 miles. The distance from
Madrid, Spain to Tokyo is 8,845 miles. The distance from Berlin, Germany to Tokyo is 6,845 miles.
通过将LLMs与WolframAlpha等外部工具结合使用,可以执行更具挑战性的数据丰富操作,例如计算城市之间的距离,比如从东京到纽约,马德里或柏林。这样的集成可以极大地提升用于各种业务应用中的数据集的实用性。然而,这些示例处理相对简单的查询;在较大规模上部署这样的实现需要更广泛的工程策略,超出了上述讨论的范围。
然而,我们可以向代理提供数据集,这就是当我们连接更多工具时可以变得非常强大的地方。让我们询问并回答有关结构化数据集的问题!
LLMs(大型语言模型)在数据探索中的应用
数据探索是数据分析中至关重要且基础的步骤,使研究人员能够全面了解其数据集并发现重要的见解。随着像ChatGPT这样的LLMs的出现,研究人员可以利用自然语言处理的能力来促进数据探索。
正如我们之前提到的,诸如ChatGPT之类的生成式AI模型具有理解和生成类似人类响应的能力,使它们成为增强研究生产力的有价值的工具。以自然语言提问并以易消化的方式获得回答,可以极大地推动分析工作。
LLMs可以帮助探索文本数据以及其他形式的数据,如数值数据集或多媒体内容。研究人员可以利用ChatGPT的功能提出关于数值数据集中统计趋势的问题,甚至可以查询用于图像分类任务的可视化效果。
让我们加载一个数据集并进行操作。我们可以从scikit-learn快速获取一个数据集:
css
pythonCopy code
from sklearn.datasets import load_iris
df = load_iris(as_frame=True)["data"]
鸢尾花数据集是众所周知的玩具数据集,但它将帮助我们说明使用生成式AI进行数据探索的能力。在以下示例中,我们将使用一个DataFrame。我们现在可以创建一个pandas DataFrame代理,看看用生成式AI执行简单任务有多容易!
swift
pythonCopy code
from langchain.agents import create_pandas_dataframe_agent
from langchain import PromptTemplate
from langchain.llms.openai import OpenAI
PROMPT = (
"If you do not know the answer, say you don't know.\n"
"Think step by step.\n"
"\n"
"Below is the query.\n"
"Query: {query}\n"
)
prompt = PromptTemplate(template=PROMPT, input_variables=["query"])
llm = OpenAI()
agent = create_pandas_dataframe_agent(llm, df, verbose=True)
我已经包含了一些指示模型表达不确定性并遵循逐步思考过程的指示,目的是减少虚构信息。现在我们可以针对DataFrame查询我们的代理:
ini
pythonCopy code
agent.run(prompt.format(query="What's this dataset about?"))
我们得到了回答"This dataset is about the measurements of some type of flower"(这个数据集是关于某种类型的花的测量),这是正确的。
让我们展示如何获得一个可视化图:
ini
pythonCopy code
agent.run(prompt.format(query="Plot each column as a barplot!"))
这是绘制的图表:
这个图表并不完美。输出可能会有些棘手,这取决于llm模型参数和指示。在这种情况下,我使用了df.plot.bar(rot=0, subplots=True)
。我们可能想要引入更多的调整,例如面板之间的间距、字体大小或图例的放置,以使其看起来更漂亮。
我们还可以要求以可视方式查看列的分布,这将为我们提供这个整洁的图表:
我们可以要求图表使用其他绘图后端,比如Seaborn;但是请注意,这些必须已安装。
我们还可以问关于数据集的更多问题,比如哪一行在花瓣长度和花瓣宽度之间的差异最大。我们得到了答案,中间步骤如下(缩短):
scss
df['difference'] = df['petal length (cm)'] - df['petal width (cm)']
df.loc[df['difference'].idxmax()]
观察:sepal length (cm) 7.7,sepal width (cm) 2.8,petal length (cm) 6.7,petal width (cm) 2.0,difference 4.7
思考:我现在知道最终答案
最终答案:第122行花瓣长度和花瓣宽度之间的差异最大。
我认为这值得称赞,LLM!
我们可以通过在提示中添加更多关于绘图的指示,比如绘图的大小,来扩展这个例子。
在Streamlit应用程序中实现相同的绘图逻辑有点困难,因为我们需要使用相应的Streamlit函数中的绘图功能,例如st.bar_chart()
。然而,这也是可行的。你可以在Streamlit博客(使用ChatGPT构建Streamlit和scikit-learn应用程序)中找到有关此内容的解释。
关于统计测试呢?
ini
agent.run(prompt.format(query="Validate the following hypothesis statistically: petal width and petal length come from the same distribution."))
我们得到这个回答:
yaml
Thought: 我应该使用统计测试来回答这个问题。
Action: python_repl_ast
Action Input: from scipy.stats import ks_2samp
Observation:
Thought: 我现在有回答这个问题所需的工具。
Action: python_repl_ast
Action Input: ks_2samp(df['petal width (cm)'], df['petal length (cm)'])
Observation: KstestResult(statistic=0.6666666666666666, pvalue=6.639808432803654e-32, statistic_location=2.5, statistic_sign=1)
Thought: 我现在知道最终答案
Final Answer: p值为6.639808432803654e-32表明这两个变量来自不同的分布。
这检查了统计测试!我们可以用简单的英语提示向数据集提出关于数据的复杂问题。
还有PandasAI库,它在幕后使用LangChain并提供类似的功能。这是文档中的一个例子,其中包含一个示例数据集:
python
import pandas as pd
from pandasai.llm import OpenAI
from pandasai.schemas.df_config import Config
from pandasai import SmartDataframe
df = pd.DataFrame({
"country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"],
"gdp": [19294482071552, 2891615567872, 2411255037952, 3435817336832, 1745433788416, 1181205135360, 1607402389504, 1490967855104, 4380756541440, 14631844184064],
"happiness_index": [6.94, 7.16, 6.66, 7.07, 6.38, 6.4, 7.23, 7.22, 5.87, 5.12]
})
smart_df = SmartDataframe(df, config=Config(llm=OpenAI()))
print(smart_df.chat("Which are the 5 happiest countries?"))
这将给我们提供类似于之前直接使用LangChain时所得到的结果。请注意,PandasAI不是本书的设置的一部分,因此如果想要使用它,您必须单独安装它。
对于SQL数据库中的数据,我们可以使用SQLDatabaseChain进行连接。LangChain文档显示了这个例子:
python
from langchain.llms import OpenAI
from langchain.utilities import SQLDatabase
from langchain_experimental.sql import SQLDatabaseChain
db = SQLDatabase.from_uri("sqlite:///../../../../notebooks/Chinook.db")
llm = OpenAI(temperature=0, verbose=True)
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
db_chain.run("How many employees are there?")
我们首先连接到数据库。然后,我们可以用自然语言问关于数据的问题。这在我们不了解数据库模式时特别有用。如果设置了use_query_checker选项,SQLDatabaseChain还可以检查查询并在SQL语句中发生语法错误时自动更正。
通过按照上述步骤,我们已经利用了LLMs在数据探索中令人印象深刻的自然语言处理能力。通过加载一个数据集,比如来自scikit-learn的Iris数据集,我们可以使用一个由LLM支持的代理来以易于理解的日常语言查询有关数据的详细信息。创建了一个pandas DataFrame代理,使得进行简单的分析任务和可视化请求变得容易,展示了AI生成图表和特定数据洞察的能力。
我们不仅可以口头询问数据集的性质,还可以命令代理生成可视化表示,如EDA的条形图和箱线图。尽管这些可视化可能需要额外的微调以进行美化,但它们为分析奠定了基础。当深入研究更微妙的请求,比如识别两个数据属性之间的差异时,代理巧妙地添加了新列,并找到了相关的数值差异,显示了其在得出可行性结论方面的实用性。
我们的努力不仅限于静态数据集,还扩展到动态的SQL数据库,LLM可以自动生成查询,甚至在对SQL语句的语法错误进行自动更正时提供帮助。在模式不熟悉的情况下,这种功能尤为出色。
总结
本章首先对AutoML框架进行了审视,突显了这些系统对整个数据科学流程的价值,从数据准备到模型部署的每个阶段都能提供便利。然后,我们考虑了LLMs集成如何进一步提高生产力,并使数据科学对技术和非技术干系人员更加易于接触。
深入研究代码生成,我们发现与软件开发存在相似之处,正如第6章"使用生成式AI开发软件"中所讨论的,观察LLMs生成的工具和函数如何响应查询或通过增强技术增强数据集。这包括利用像WolframAlpha这样的第三方工具,将外部数据点添加到现有数据集中。我们的探索然后转向了使用LLMs进行数据探索,建立在第4章"构建强大的助手"中详细介绍的摄取和分析大量文本数据的技术基础上,那一章关注于问答。在这里,我们的重点转向了结构化数据集,研究了如何通过LLM支持的探索性过程有效地分析SQL数据库或表格信息。
总结我们的探索,很明显,诸如ChatGPT插件和Microsoft Fabric等平台所展示的人工智能技术具有数据分析的变革潜力。然而,尽管通过这些人工智能工具使数据科学家的工作变得更加便捷和高效取得了显著进展,但当前的人工智能技术水平还未达到可以替代人类专家的程度,而是增强了他们的能力并拓宽了他们的分析工具集。
在下一章中,我们将专注于通过提示和微调来改善LLMs性能的条件技术。