Un data scientist passe une heure à résoudre un problème de données avec Pandas. L'intelligence artificielle lui propose une solution en quelques secondes. Mais la première réponse n'est pas toujours la meilleure.

UNE TÂCHE QUOTIDIENNE QUI PREND UNE HEURE

Les data scientists passent énormément de temps sur la préparation des données avant de pouvoir travailler sur des tâches plus complexes. Que ce soit le nettoyage des données, la gestion des valeurs manquantes, l'ingénierie des caractéristiques ou le post-traitement, cette phase représente une part importante de leur travail quotidien.

Un data scientist s'est retrouvé confronté à une tâche de post-traitement : il devait créer une nouvelle colonne dans un tableau Pandas en extrayant des valeurs d'une colonne existante, en se basant sur les données de deux autres colonnes. Au lieu de demander directement à un grand modèle de langage de générer le code, il a décidé de le faire lui-même un matin où il se sentait en pleine forme pour résoudre des opérations de données complexes.

LE PROBLÈME À RÉSOUDRE : TROUVER LA BONNE PROBABILITÉ

Il disposait d'un tableau avec trois colonnes :

  • predicted_categories : une liste de cinq catégories au format « identifiant - description »
  • predcategoryid : l'identifiant de la catégorie prédit par un autre modèle
  • textpredictedprobs : les probabilités associées à ces cinq catégories, dans le même ordre

Par exemple :

['80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']

et

[0.943, 0.018, 0.008, 0.006, 0.004]

Son objectif ? Trouver la probabilité associée à l'identifiant contenu dans predcategoryid en utilisant l'ordre des catégories dans predicted_categories.

Pour visualiser cela, il fallait récupérer la probabilité de la catégorie 13003106, qui est le deuxième élément de la liste et dont la probabilité correspondante est 0.018.

LA SOLUTION NAÏVE : UNE HEURE DE CODAGE MANUEL

Il commence par lire le fichier CSV contenant les résultats de prédiction :

import pandas as pd

results = pd.readcsv("predictionresults.csv")

Les valeurs dans la colonne predicted_categories sont enregistrées sous forme de chaînes de caractères, alors qu'il s'agit en réalité de listes. Il doit donc les convertir en objets Python de type liste avec la fonction ast.literal_eval :

ast.literaleval(results.loc[0, "predictedcategories"])

Résultat :

['80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']

Ensuite, il extrait les identifiants numériques en séparant chaque chaîne au niveau du caractère « - » et en prenant la première partie :

[category.split("-")[0].strip() 
for category in ast.literaleval(results.loc[0, "predictedcategories"])]

Résultat :

['80814001', '13003106', '80805004', '13003144', '13003195']

Il applique cette opération à toute la colonne predicted_categories avec une compréhension de liste imbriquée :

results.loc[:, "predictedcategoryids"] = [
    [category.split("-")[0].strip() for category in ast.literaleval(predictedcategories)] 
    for predictedcategories in results["predictedcategories"]
]

Il obtient ainsi une nouvelle colonne predictedcategoryids contenant uniquement les identifiants numériques.

TROUVER LA POSITION D'UN IDENTIFIANT DANS UNE LISTE

Pour trouver la probabilité associée à un identifiant spécifique, il doit d'abord déterminer sa position dans la liste des identifiants. La méthode index de Python permet de trouver l'index d'un élément dans une liste :

results.loc[0, "predictedcategoryids"].index("13003106")

Résultat : 2, car 13003106 est le troisième élément de la liste (indexation à partir de 0).

Une fois l'index trouvé, il peut récupérer la probabilité correspondante dans la colonne textpredictedprobs :

for i, j, k in zip(results["predcategoryid"][:1], results["predictedcategoryids"][:1], results["textpredictedprobs"][:1]):
    print(j.index(str(i))) # get the index of predcategoryid in predictedcategoryids
    print(ast.literaleval(k)[j.index(str(i))]) # get the value at this index in textpredicted_probs

Résultat :

0 0.943

Ici, l'identifiant 80814001 correspond au premier élément (index 0) de la liste des identifiants, et la première valeur de probabilité est 0.943.

CRÉER UNE NOUVELLE COLONNE AVEC LES PROBABILITÉS CORRECTES

Les listes dans la colonne textpredictedprobs sont également enregistrées sous forme de chaînes de caractères. Il doit donc les convertir en objets liste avec ast.literal_eval avant d'extraire les probabilités :

results.loc[:, "predcategoryprob"] = [
    float(ast.literal_eval(k)[j.index(str(i))]) if str(i) in j else 0
    for i, j, k in zip(results["predcategoryid"], results["predictedcategoryids"], results["textpredictedprobs"])
]

Il convertit ainsi la boucle for précédente en une compréhension de liste. Il ajoute également une vérification : si l'identifiant n'est pas trouvé dans la liste, la probabilité est définie à 0 pour éviter les erreurs.

Après environ une heure de travail (y compris les pauses), il parvient enfin à résoudre le problème.

LA SOLUTION DE L'INTELLIGENCE ARTIFICIELLE : EN SECONDES

Il décide alors de tester une intelligence artificielle en lui demandant de résoudre la même tâche. Il rédige un prompt expliquant son objectif et inclut un petit échantillon des données.

L'IA lui propose immédiatement une solution fonctionnelle :

import pandas as pd

# 1. Create the sample DataFrame
data = {
    'predicted_categories': [
        ['80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']
    ],
    'predcategoryid': [80814001],
    'textpredictedprobs': [
        [0.943, 0.018, 0.008, 0.006, 0.004]
    ]
}

df = pd.DataFrame(data)

# 2. Define a function to extract the probability matching the category ID
def getmatchingprob(row):
    # Convert ID to string for matching
    targetidstr = str(row['predcategoryid'])
    
    # Iterate through the categories to find the matching index
    for index, category in enumerate(row['predicted_categories']):
        if category.startswith(targetidstr):
            # Return the corresponding probability from the same index
            return row['textpredictedprobs'][index]
            
    # Return None (or 0) if no match is found to prevent the code from crashing
    return None

# 3. Create the new column
df['predcategoryprob'] = df.apply(getmatchingprob, axis=1)

# Display the result
print(df[['predcategoryid', 'predcategoryprob']])

L'IA crée d'abord un tableau d'exemple à partir des données fournies dans le prompt. Ensuite, elle écrit une fonction qui effectue exactement ce que le data scientist avait décrit : elle parcourt chaque ligne, compare l'identifiant cible avec les catégories, et récupère la probabilité correspondante.

Alors qu'il a passé une heure à coder lui-même, l'IA a résolu la même tâche en quelques secondes à partir d'un prompt qu'il a rédigé en quelques minutes.

POURQUOI LA PREMIÈRE SOLUTION DE L'IA N'EST PAS OPTIMALE

Cependant, la solution proposée par l'IA n'est pas parfaite. Elle utilise la fonction apply, qui n'est pas vectorisée. Dans le cas de grands jeux de données, l'utilisation de apply (qui fonctionne comme une boucle for) peut considérablement augmenter le temps d'exécution.

Heureusement, il suffit de demander à l'IA de proposer une version vectorisée du code. Voici ce qu'elle propose :

import pandas as pd

# Sample DataFrame
data = {
    'predicted_categories': [
        ['80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri'],
        ['13003144 - Torna Makinesi', '13003195 - Kumpas']
    ],
    'predcategoryid': [80814001, 13003195],
    'textpredictedprobs': [
        [0.943, 0.018, 0.008],
        [0.6, 0.4]
    ]
}
df = pd.DataFrame(data)

# 1. Explode both list columns simultaneously to maintain alignment between category and probability
dfexploded = df.explode(['predictedcategories', 'textpredictedprobs'])

# 2. Extract the numeric ID from the category string using vectorized regex
dfexploded['extractedid'] = dfexploded['predictedcategories'].str.extract(r'^(\d+)').astype(float)

# 3. Filter for rows where the extracted ID matches the target 'predcategoryid'
matched = dfexploded[dfexploded['extractedid'] == dfexploded['predcategoryid']]

# 4. Dedup the index (safety net in case an ID appears twice within the same list)
matched = matched[~matched.index.duplicated(keep='first')]

# 5. Map the extracted probability column back to the original DataFrame using the index
df['predcategoryprob'] = matched['textpredictedprobs']
df

Cette deuxième solution est parfaitement fonctionnelle et semble même plus simple que le code qu'il avait écrit lui-même.

LE PIÈGE : ACCEPTER LA PREMIÈRE SOLUTION SANS VÉRIFIER

Il a donc passé une heure sur une tâche que l'IA aurait pu accomplir en moins de cinq minutes. Mais s'il n'avait pas connu les bases de Pandas, il aurait probablement accepté la première solution proposée par l'IA, qui n'était pas optimale.

Cette expérience illustre parfaitement comment les grands modèles de langage peuvent augmenter la productivité, mais seulement si l'on maîtrise les concepts fondamentaux. Sans cette connaissance, on risque de se contenter de solutions sous-optimales sans même s'en rendre compte.

LE VERDICT : LES FONDAMENTAUX RESTENT INDISPENSABLES

Les intelligences artificielles sont des Outils puissants qui peuvent automatiser de nombreuses tâches répétitives et chronophages. Cependant, elles ne remplacent pas la compréhension des concepts de base. Dans ce cas précis, la première solution proposée par l'IA fonctionnait, mais elle n'était pas optimale pour les grands jeux de données.

Sans une bonne maîtrise de Pandas et des bonnes pratiques en matière de traitement de données, il est facile de se laisser berner par une solution qui semble fonctionner, mais qui n'est pas la meilleure possible. L'IA peut accélérer le processus, mais elle ne dispense pas de la réflexion critique.

Les outils d'IA sont comme des couteaux suisses : ils peuvent tout faire, mais il faut savoir quand utiliser quel outil pour obtenir le meilleur résultat.

En résumé, les intelligences artificielles sont des assistants précieux, mais elles ne remplacent pas l'expertise humaine. Pour tirer le meilleur parti de ces outils, il est essentiel de bien comprendre les concepts fondamentaux du domaine dans lequel on travaille.

Sources :
  • Towards Data Science

L'indépendance de CLODCO est votre garantie.

Pour que l'actualité de l'IA reste sans filtre et sans concession, votre soutien est indispensable. Votre contribution est le seul moteur de notre liberté éditoriale.

Soutenir CLODCO