Code
pip install mlxtendWilson Toussile1 2
ENSPY
1ENSPY, 2ESSFAR
L’algorithme Apriori est une méthode classique et influente utilisée en data mining pour découvrir des règles d’association intéressantes au sein de grands ensembles de données transactionnelles.
Au cœur de l’efficacité de l’algorithme Apriori se trouve une propriété mathématique simple mais puissante : la propriété d’anti-monotonie du support. Comprenons ce qu’elle signifie et pourquoi elle est si cruciale.
Le support d’un ensemble d’articles (itemset) est simplement sa fréquence d’apparition dans l’ensemble des transactions. Un itemset est dit “fréquent” si son support est supérieur ou égal à un seuil minimum défini par l’utilisateur (minsup).
La propriété d’anti-monotonie du support stipule deux choses interdépendantes :
{Pain, Lait, Beurre} est acheté 100 fois (et donc considéré comme fréquent avec un minsup de 50), alors l’itemset {Pain, Lait} doit avoir été acheté au moins 100 fois (il est impossible qu’il ait été acheté moins de fois, car chaque fois que {Pain, Lait, Beurre} est acheté, {Pain, Lait} l’est aussi). De même pour {Pain}, {Lait}, {Beurre}, {Pain, Beurre}, et {Lait, Beurre}.{Couches, Bière} est acheté seulement 5 fois (et donc considéré comme non fréquent avec un minsup de 50), il est inutile de vérifier la fréquence de {Couches, Bière, Chips}. En effet, {Couches, Bière, Chips} ne peut pas apparaître plus de 5 fois, et sera donc également non fréquent.L’exploration de toutes les combinaisons possibles d’articles dans un grand ensemble de données est une tâche exponentiellement complexe. La propriété d’anti-monotonie permet à l’algorithme Apriori de réduire considérablement l’espace de recherche.
Au lieu de calculer le support de chaque itemset possible, l’algorithme peut : - Commencer par les itemsets de petite taille. - Éliminer (ou “élaguer” / “pruner”) de manière proactive tous les itemsets plus grands qui contiennent un sous-ensemble déjà identifié comme non fréquent.
Cette stratégie d’élagage est ce qui rend Apriori réalisable pour des ensembles de données de taille raisonnable, bien qu’il ait ses limites avec des données extrêmement volumineuses ou des seuils de support très bas.
L’algorithme Apriori fonctionne principalement en deux phases :
L’objectif est d’identifier tous les ensembles d’articles (itemsets) dont la fréquence d’apparition dépasse un seuil minimum défini, appelé support minimum (minsup).
minsup forment le premier ensemble d’itemsets fréquents, \(L_1\).minsup forment l’ensemble des itemsets fréquents de taille k, \(L_k\).Une fois tous les itemsets fréquents identifiés :
confiance(X => Y) = support(X U Y) / support(X).minconf).Pour illustrer l’algorithme Apriori, considérons un petit ensemble de transactions d’un supermarché.
Données de Transactions :
Imaginons les 5 transactions suivantes :
| ID Transaction | Articles Achetés |
|---|---|
| T1 | {Pain, Lait, Oeufs} |
| T2 | {Pain, Beurre} |
| T3 | {Lait, Oeufs, Beurre} |
| T4 | {Pain, Lait, Beurre} |
| T5 | {Pain, Lait, Oeufs, Beurre} |
Paramètres :
minsup) = 3 (Un itemset doit apparaître dans au moins 3 transactions pour être considéré comme fréquent).minconf) = 0.7 (Une règle doit avoir une confiance d’au moins 70%).Étape 1 : Calculer le support des itemsets de taille 1 (\(L_1\))
On scanne les transactions pour compter la fréquence de chaque article :
Tous les articles ont un support \(\ge\) minsup (3). Donc, \(L_1\) est : \(L_1 = \{\{\text{Pain}\}(4), \{\text{Lait}\}(4), \{\text{Oeufs}\}(3), \{\text{Beurre}\}(4)\}\) (Le chiffre entre parenthèses indique le support)
Étape 2 : Générer les candidats de taille 2 (\(C_2\)) et calculer \(L_2\)
Donc, \(L_2\) est : \(L_2 = \{\{\text{Pain, Lait}\}(3), \{\text{Pain, Beurre}\}(3), \{\text{Lait, Oeufs}\}(3), \{\text{Lait, Beurre}\}(3)\}\)
Étape 3 : Générer les candidats de taille 3 (\(C_3\)) et calculer \(L_3\)
Donc, \(L_3 = \{\}\) (ensemble vide).
Comme \(L_3\) est vide, l’algorithme s’arrête pour la génération d’itemsets fréquents. Les itemsets fréquents sont ceux de \(L_1\) et \(L_2\).
Nous utilisons les itemsets fréquents de \(L_2\) pour générer des règles (ceux de \(L_1\) ne produisent pas de règles \(X \Rightarrow Y\) où \(X\) et \(Y\) sont non vides). Rappel : minconf = 0.7.
Résultat : Règles d’Association Fortes Découvertes
Avec minsup = 3 et minconf = 0.7, les règles suivantes sont identifiées :
Cet exemple montre comment Apriori, en utilisant la propriété d’anti-monotonie pour l’élagage, peut découvrir des relations intéressantes dans les données transactionnelles. Par exemple, la règle {Oeufs} \Rightarrow \{\text{Lait}\}$ avec une confiance de 1.0 indique que chaque fois que des oeufs sont achetés (dans notre petit jeu de données et avec notreminsup`), du lait est également acheté.
Pour implémenter l’algorithme Apriori en Python, la bibliothèque mlxtend (machine learning extensions) est une excellente option. Elle fournit des implémentations efficaces des algorithmes d’extraction de motifs fréquents et de génération de règles d’association.
Si vous ne l’avez pas encore installée, vous pouvez le faire avec pip :
Reprenons les données de notre exemple précédent :
# Données de transactions de l'exemple
dataset = [['Pain', 'Lait', 'Oeufs'],
['Pain', 'Beurre'],
['Lait', 'Oeufs', 'Beurre'],
['Pain', 'Lait', 'Beurre'],
['Pain', 'Lait', 'Oeufs', 'Beurre']]
# 1. Préparation des données
# mlxtend attend les données sous forme d'un DataFrame booléen où chaque colonne est un item
# et chaque ligne une transaction. Les valeurs sont True si l'item est dans la transaction, False sinon.
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df_transactions = pd.DataFrame(te_ary, columns=te.columns_)
print("--- DataFrame des Transactions Encodées ---")
print(df_transactions)# 2. Application de l'algorithme Apriori pour trouver les itemsets fréquents
# Nous utilisons le même min_support que dans l'exemple manuel (3 transactions sur 5 = 0.6)
# Cependant, l'algorithme Apriori de mlxtend attend un min_support relatif (entre 0 et 1).
# minsup_count = 3
# total_transactions = 5
# min_support_relative = minsup_count / total_transactions # 3/5 = 0.6
min_support_val = 0.6 # Correspond à 3 transactions
frequent_itemsets = apriori(df_transactions, min_support=min_support_val, use_colnames=True)
print("\n--- Itemsets Fréquents (minsup = 0.6) ---")
print(frequent_itemsets)
# 3. Génération des règles d'association
# Nous utilisons la même min_confidence que dans l'exemple manuel (0.7)
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)
print("\n--- Règles d'Association (minconf = 0.7) ---")
# Affichons les colonnes les plus pertinentes
print(rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
# Vous pouvez trier les règles par lift ou confiance pour voir les plus intéressantes
print("\n--- Règles triées par Lift ---")
print(rules.sort_values(by='lift', ascending=False)[['antecedents', 'consequents', 'support', 'confidence', 'lift']])Explication du code :
pandas pour la manipulation de données, TransactionEncoder pour transformer notre liste de listes en un format binaire adapté, et apriori et association_rules de mlxtend.dataset : Notre liste de transactions.TransactionEncoder() : Cet objet va transformer les données. fit() apprend tous les items uniques, et transform() crée un tableau NumPy booléen.pd.DataFrame(...) : Nous convertissons ce tableau en DataFrame pandas, ce qui est le format attendu par mlxtend. Les colonnes sont les items et les valeurs sont True ou False.apriori(df_transactions, min_support=0.6, use_colnames=True) :
min_support=0.6 : C’est notre seuil de support minimum. Dans notre exemple manuel, minsup était de 3 transactions. Comme il y a 5 transactions au total, le support relatif est \(3/5 = 0.6\).use_colnames=True : Permet d’avoir les noms des items dans le résultat plutôt que des indices de colonnes.frequent_itemsets est un DataFrame listant les itemsets fréquents et leur support.association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7) :
metric="confidence" : Spécifie que nous voulons filtrer les règles en fonction de la confiance.min_threshold=0.7 : C’est notre seuil de confiance minimum, correspondant au minconf de 0.7 de notre exemple.rules est un DataFrame contenant les règles générées avec plusieurs métriques utiles (support, confidence, lift, leverage, conviction).En exécutant ce code, vous devriez obtenir des résultats cohérents avec ceux que nous avons calculés manuellement dans la section “Exemple”, ce qui valide à la fois notre compréhension et l’implémentation.
Pour implémenter l’algorithme Apriori en R, nous utiliserons la bibliothèque arules, qui est l’une des bibliothèques les plus populaires et les plus complètes pour l’analyse des règles d’association.
Si vous ne l’avez pas encore installée, vous pouvez le faire avec :
Reprenons les données de notre exemple précédent :
# Données de transactions de l'exemple
transactions_list <- list(
c("Pain", "Lait", "Oeufs"),
c("Pain", "Beurre"),
c("Lait", "Oeufs", "Beurre"),
c("Pain", "Lait", "Beurre"),
c("Pain", "Lait", "Oeufs", "Beurre")
)
# 1. Préparation des données
# arules attend les données sous forme d'objet "transactions"
transactions <- as(transactions_list, "transactions")
print("--- Transactions ---")
inspect(transactions)# 2. Application de l'algorithme Apriori pour trouver les itemsets fréquents
# Nous utilisons le même min_support que dans l'exemple manuel (3 transactions sur 5 = 0.6)
min_support_val <- 0.6 # Correspond à 3 transactions
frequent_itemsets <- apriori(transactions, parameter = list(support = min_support_val, target = "frequent itemsets"))
print("\n--- Itemsets Fréquents (minsup = 0.6) ---")
inspect(frequent_itemsets)
# 3. Génération des règles d'association
# Nous utilisons la même min_confidence que dans l'exemple manuel (0.7)
rules <- association_rules <- apriori(transactions, parameter = list(support = min_support_val, confidence = 0.7, target = "rules"))
print("\n--- Règles d'Association (minconf = 0.7) ---")
inspect(rules)
# Vous pouvez trier les règles par lift ou confiance pour voir les plus intéressantes
print("\n--- Règles triées par Lift ---")
inspect(sort(rules, by = "lift", decreasing = TRUE))Exercise 1 (Application Manuelle d’Apriori) Considérez la base de données de transactions suivante :
| ID Transaction | Articles Achetés |
|---|---|
| T1 | {Pommes, Bananes, Lait} |
| T2 | {Bananes, Pain} |
| T3 | {Pommes, Lait, Pain} |
| T4 | {Pommes, Bananes, Pain} |
| T5 | {Bananes, Lait, Pain} |
| T6 | {Pommes, Lait} |
Tâches :
minsup) de 3 (ou 50% car il y a 6 transactions), appliquez manuellement l’algorithme Apriori pour trouver tous les itemsets fréquents. Montrez chaque étape :
minconf) est de 0.7 (ou 70%), quelles règles sont conservées ?Exercise 2 (Implémentation avec Python et mlxtend) Utilisez le même jeu de données de transactions que l’Exercice précédent.
Tâches :
TransactionEncoder de mlxtend pour transformer dataset_ex2 en un DataFrame booléen approprié.apriori de mlxtend avec :
min_support de 0.5 (ce qui correspond à 3 transactions sur 6).use_colnames=True.association_rules de mlxtend sur les itemsets fréquents trouvés à l’étape précédente avec :
confidence.min_threshold de 0.7.antecedents, consequents, support, confidence, et lift des règles générées.mlxtend correspondent-ils à vos résultats manuels de l’Exercice 1 ?Exercise 3 (Analyse et Interprétation des Règles) Considérez le jeu de données de transactions suivant, représentant les achats de cours en ligne :
# Données pour l'exercice 3
dataset_ex3 = [
{'Python', 'Data Science', 'Machine Learning'},
{'Python', 'Web Development'},
{'Data Science', 'Machine Learning', 'SQL'},
{'Python', 'Data Science'},
{'Web Development', 'JavaScript'},
{'Python', 'Machine Learning', 'SQL'},
{'Data Science', 'SQL'},
{'Python', 'Web Development', 'JavaScript'},
{'Python', 'Data Science', 'Machine Learning', 'SQL'},
{'Web Development', 'CSS'}
]# Données pour l'exercice 3
dataset_ex3 <- list(
c("Python", "Data Science", "Machine Learning"),
c("Python", "Web Development"),
c("Data Science", "Machine Learning", "SQL"),
c("Python", "Data Science"),
c("Web Development", "JavaScript"),
c("Python", "Machine Learning", "SQL"),
c("Data Science", "SQL"),
c("Python", "Web Development", "JavaScript"),
c("Python", "Data Science", "Machine Learning", "SQL"),
c("Web Development", "CSS")
)Tâches :
mlxtend :
min_support de 0.3 (30%).min_confidence de 0.6 (60%).min_support à 0.4. Combien de règles obtenez-vous ? Qu’est-ce que cela implique ?min_support initial de 0.3) mais en augmentant min_confidence à 0.8. Comment cela affecte-t-il le nombre et la nature des règles ?{Data Science} => {Machine Learning} a une confiance élevée. Est-ce suffisant pour conclure que la plupart des étudiants intéressés par la Data Science s’inscrivent aussi au Machine Learning, ou d’autres facteurs pourraient-ils jouer un rôle ?