Buckets:
| # Data analyst agent: get your data's insights in the blink of an eye ✨ | |
| _Authored by: [Aymeric Roucher](https://huggingface.co/m-ric)_ | |
| > This tutorial is advanced. You should have notions from [this other cookbook](agents) first! | |
| In this notebook we will make a **data analyst agent: a Code agent armed with data analysis libraries, that can load and transform dataframes to extract insights from your data, and even plots the results!** | |
| Let's say I want to analyze the data from the [Kaggle Titanic challenge](https://www.kaggle.com/competitions/titanic) in order to predict the survival of individual passengers. But before digging into this myself, I want an autonomous agent to prepare the analysis for me by extracting trends and plotting some figures to find insights. | |
| Let's set up this system. | |
| Run the line below to install required dependancies: | |
| ```python | |
| !pip install seaborn smolagents transformers -q -U | |
| ``` | |
| We first create the agent. We used a `CodeAgent` (read the [documentation](https://huggingface.co/docs/smolagents/tutorials/secure_code_execution) to learn more about types of agents), so we do not even need to give it any tools: it can directly run its code. | |
| We simply make sure to let it use data science-related libraries by passing these in `additional_authorized_imports`: `["numpy", "pandas", "matplotlib.pyplot", "seaborn"]`. | |
| In general when passing libraries in `additional_authorized_imports`, make sure they are installed on your local environment, since the python interpreter can only use libraries installed on your environment. | |
| ⚙ Our agent will be powered by [meta-llama/Llama-3.1-70B-Instruct](https://huggingface.co/meta-llama/Llama-3.1-70B-Instruct) using `HfApiModel` class that uses HF's Inference API: the Inference API allows to quickly and easily run any open model, for free! | |
| ```python | |
| from smolagents import InferenceClientModel, CodeAgent | |
| from huggingface_hub import login | |
| import os | |
| login(os.getenv("HUGGINGFACEHUB_API_TOKEN")) | |
| model = InferenceClientModel("meta-llama/Llama-3.1-70B-Instruct") | |
| agent = CodeAgent( | |
| tools=[], | |
| model=model, | |
| additional_authorized_imports=["numpy", "pandas", "matplotlib.pyplot", "seaborn"], | |
| max_iterations=10, | |
| ) | |
| ``` | |
| ## Data analysis 📊🤔 | |
| Upon running the agent, we provide it with additional notes directly taken from the competition, and give these as a kwarg to the `run` method: | |
| ```python | |
| import os | |
| os.mkdir("./figures") | |
| ``` | |
| ```python | |
| >>> additional_notes = """ | |
| ... ### Variable Notes | |
| ... pclass: A proxy for socio-economic status (SES) | |
| ... 1st = Upper | |
| ... 2nd = Middle | |
| ... 3rd = Lower | |
| ... age: Age is fractional if less than 1. If the age is estimated, is it in the form of xx.5 | |
| ... sibsp: The dataset defines family relations in this way... | |
| ... Sibling = brother, sister, stepbrother, stepsister | |
| ... Spouse = husband, wife (mistresses and fiancés were ignored) | |
| ... parch: The dataset defines family relations in this way... | |
| ... Parent = mother, father | |
| ... Child = daughter, son, stepdaughter, stepson | |
| ... Some children travelled only with a nanny, therefore parch=0 for them. | |
| ... """ | |
| >>> analysis = agent.run( | |
| ... """You are an expert data analyst. | |
| ... Please load the source file and analyze its content. | |
| ... According to the variables you have, begin by listing 3 interesting questions that could be asked on this data, for instance about specific correlations with survival rate. | |
| ... Then answer these questions one by one, by finding the relevant numbers. | |
| ... Meanwhile, plot some figures using matplotlib/seaborn and save them to the (already existing) folder './figures/': take care to clear each figure with plt.clf() before doing another plot. | |
| ... In your final answer: summarize these correlations and trends | |
| ... After each number derive real worlds insights, for instance: "Correlation between is_december and boredness is 1.3453, which suggest people are more bored in winter". | |
| ... Your final answer should have at least 3 numbered and detailed parts. | |
| ... """, | |
| ... additional_args=dict(additional_notes=additional_notes, source_file="titanic/train.csv"), | |
| ... ) | |
| ``` | |
| ```python | |
| >>> print(analysis) | |
| ``` | |
| The analysis of the Titanic data reveals that socio-economic status and sex are significant factors in determining survival rates. Passengers with lower socio-economic status and males are less likely to survive. The age of a passenger has a minimal impact on their survival rate. | |
| Impressive, isn't it? You could also provide your agent with a visualizer tool to let it reflect upon its own graphs! | |
| ## Data scientist agent: Run predictions 🛠️ | |
| 👉 Now let's dig further: **we will let our model perform predictions on the data.** | |
| To do so, we also let it use `sklearn` in the `additional_authorized_imports`. | |
| ```python | |
| agent = CodeAgent( | |
| tools=[], | |
| model=model, | |
| additional_authorized_imports=[ | |
| "numpy", | |
| "pandas", | |
| "matplotlib.pyplot", | |
| "seaborn", | |
| "sklearn", | |
| ], | |
| max_iterations=12, | |
| ) | |
| output = agent.run( | |
| """You are an expert machine learning engineer. | |
| Please train a ML model on "titanic/train.csv" to predict the survival for rows of "titanic/test.csv". | |
| Output the results under './output.csv'. | |
| Take care to import functions and modules before using them! | |
| """, | |
| additional_args=dict(additional_notes=additional_notes + "\n" + analysis), | |
| ) | |
| ``` | |
| Even though the agent got a few errors, it managed to correctly solve the problem in the end! | |
| The test predictions that the agent output above, once submitted to Kaggle, score **0.78229**, which is #2824 out of 17,360, and better than what I had painfully achieved when first trying the challenge years ago. | |
| Your result will vary, but anyway I find it very impressive to achieve this with an agent in a few seconds. | |
| 🚀 The above is just a naive attempt with agent data analyst: it can certainly be improved a lot to fit your use case better! | |
Xet Storage Details
- Size:
- 5.91 kB
- Xet hash:
- c8798e19d0503b07d152ab920fdb81fc9690b46b1972934af408c9ec564a7664
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.