技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
ds-association-rules【数据与研究】"Provides Discovers association rules and frequent itemsets using Apriori Eclat, and market basket analysis for pattern mining"
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: ds-association-rules compatibility: opencode completeness: 95 content-types:
Comprehensive guide to association rules in machine learning and data science workflows.
Association Rules is a critical component of the machine learning workflow. This skill covers:
import pandas as pd
import numpy as np
from itertools import combinations
from typing import Dict, List, Set, Tuple
def find_frequent_itemsets(transactions: List[Set[str]], min_support: float = 0.5) -> Tuple[Dict[frozenset, float], Dict[frozenset, float]]:
"""Find frequent itemsets using a simplified Apriori approach."""
if not transactions:
raise ValueError("Transactions list cannot be empty")
all_items: Set[str] = set()
for txn in transactions:
all_items.update(txn)
# Calculate support for single items
itemset_support: Dict[frozenset, float] = {
frozenset({item}): sum(1 for txn in transactions if item in txn) / len(transactions)
for item in all_items
}
frequent_singletons: Dict[frozenset, float] = {k: v for k, v in itemset_support.items() if v >= min_support}
# Generate candidate pairs and calculate support
frequent_pairs: Dict[frozenset, float] = {}
items: List[frozenset] = list(frequent_singletons.keys())
for i in range(len(items)):
for j in range(i + 1, len(items)):
candidate: frozenset = items[i] | items[j]
support: float = sum(1 for txn in transactions if candidate.issubset(txn)) / len(transactions)
if support >= min_support:
frequent_pairs[candidate] = support
return frequent_singletons, frequent_pairs
import logging
import pandas as pd
import numpy as np
from typing import Any, Dict, List, Set, Tuple
from itertools import combinations
logger = logging.getLogger(__name__)
class AssociationRuleMiner:
"""Production-grade implementation of Association Rule Mining."""
def __init__(self, min_support: float = 0.1, min_confidence: float = 0.5):
self.min_support = min_support
self.min_confidence = min_confidence
self.frequent_itemsets: Dict[frozenset, float] = {}
self.rules: List[Dict[str, Any]] = []
def _count_support(self, transactions: List[Set[str]], itemset: frozenset) -> float:
count = sum(1 for txn in transactions if itemset.issubset(txn))
return count / len(transactions)
def fit(self, transactions: List[Set[str]]) -> 'AssociationRuleMiner':
"""Find frequent itemsets and generate association rules."""
if not transactions:
raise ValueError("Transactions list cannot be empty")
logger.info(f"Processing {len(transactions)} transactions...")
all_items = set().union(*transactions)
self.frequent_itemsets = {
frozenset({item}): self._count_support(transactions, frozenset({item}))
for item in all_items
}
# Generate rules from frequent pairs
for itemset, support in self.frequent_itemsets.items():
if len(itemset) == 2:
antecedent = itemset.copy()
consequent = itemset.copy()
consequent.discard(next(iter(antecedent)))
antecedent.discard(next(iter(consequent)))
antecedent = frozenset(antecedent)
consequent = frozenset(consequent)
confidence = support / self.frequent_itemsets[antecedent]
if confidence >= self.min_confidence:
lift = confidence / self.frequent_itemsets[consequent]
self.rules.append({
'antecedent': list(antecedent)
'consequent': list(consequent)
'support': support
'confidence': confidence
'lift': lift
})
logger.info(f"Generated {len(self.rules)} rules.")
return self
def get_rules(self) -> pd.DataFrame:
"""Return rules as a DataFrame."""
return pd.DataFrame(self.rules)
# BAD: Hardcoded thresholds, no validation, ignores lift metric, violates DRY principle
def bad_rule_mining(transactions):
rules = []
for t in transactions:
if 'Bread' in t and 'Butter' in t:
rules.append({'antecedent': 'Bread', 'consequent': 'Butter'})
return rules
# GOOD: Parameterized, validates input, computes support/confidence/lift, uses type hints
def good_rule_mining(transactions: List[Set[str]], min_support: float = 0.1, min_confidence: float = 0.5) -> pd.DataFrame:
if not transactions:
raise ValueError("Transactions cannot be empty")
total = len(transactions)
rules = []
for antecedent in transactions:
for consequent in transactions:
if antecedent == consequent: continue
support = sum(1 for t in transactions if antecedent.issubset(t) and consequent.issubset(t)) / total
conf = support / sum(1 for t in transactions if antecedent.issubset(t))
if support >= min_support and conf >= min_confidence:
lift = conf / sum(1 for t in transactions if consequent.issubset(t)) / total
rules.append({'antecedent': list(antecedent), 'consequent': list(consequent), 'support': support, 'confidence': conf, 'lift': lift})
return pd.DataFrame(rules)
| Pitfall | Problem | Solution | |
Authoritative documentation links for this skill's domain. The model follows markdown links at load time to resolve external references and inline content.