Feature Store vs Data Warehouse : que choisir pour un projet IA ?
Feature store ou data warehouse ? Cette question revient systématiquement quand une équipe data commence à industrialiser ses modèles ML. La confusion est compréhensible : les deux stockent des données, les deux alimentent des modèles. Mais leurs objectifs et architectures sont fondamentalement différents.
Ce guide compare objectivement ces deux solutions pour vous aider à faire le bon choix selon votre contexte.
Tableau comparatif synthétique
| Critère | Data Warehouse | Feature Store |
|---|---|---|
| Objectif principal | Analyse et reporting | Servir des features ML |
| Utilisateurs cibles | Analystes, BI | Data scientists, ML engineers |
| Latence typique | Secondes à minutes | Millisecondes |
| Fraîcheur des données | Batch (heures/jours) | Temps réel possible |
| Optimisation | Requêtes analytiques (OLAP) | Lookup par entité |
| Schéma | Étoile/flocon (dimensionnel) | Feature views par entité |
| Historique | Snapshots périodiques | Point-in-time correctness |
| Coût typique | $1K-50K/mois | $500-5K/mois |
Comprendre les différences fondamentales
Data Warehouse : analyse du passé
Un data warehouse est conçu pour répondre à des questions business :
- Quel était le chiffre d'affaires du Q3 par région ?
- Quels produits ont le meilleur taux de conversion ?
- Comment évoluent les coûts d'acquisition client ?
-- Requête typique data warehouse
SELECT
region,
product_category,
SUM(revenue) as total_revenue,
COUNT(DISTINCT customer_id) as unique_customers
FROM fact_sales
JOIN dim_product ON fact_sales.product_id = dim_product.id
JOIN dim_date ON fact_sales.date_id = dim_date.id
WHERE dim_date.quarter = 'Q3-2025'
GROUP BY region, product_category
ORDER BY total_revenue DESC;Architecture typique :
Sources → ETL → Data Warehouse → BI Tools
↓
Marts analytiquesFeature Store : prédiction du futur
Un feature store est conçu pour alimenter des modèles ML en production :
- Quelles features donner au modèle pour prédire si ce client va churner ?
- Comment récupérer en 5ms les 50 features nécessaires à la détection de fraude ?
- Comment garantir que les features en production sont identiques à l'entraînement ?
features = feature_store.get_online_features(
entity_rows=[{"customer_id": "C12345"}],
features=[
"customer:avg_purchase_30d",
"customer:days_since_last_order",
"customer:lifetime_value",
"customer:support_tickets_90d"
]
)Architecture typique :
Sources → Feature Pipeline → Feature Store → ML Models
↓
Offline Store (training)
Online Store (inference)Cas d'usage : qui utilise quoi ?
Data Warehouse uniquement
Scénario : Équipe data classique sans ML en production
- Reporting et dashboards
- Analyses ad-hoc
- Data science exploratoire (notebooks)
- Modèles batch simples alimentés par requêtes SQL
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
query = """
SELECT customer_id, age, tenure, monthly_spend, is_churned
FROM analytics.customer_features
WHERE snapshot_date = CURRENT_DATE - 1
"""
df = pd.read_sql(query, dwh_connection)
X = df[["age", "tenure", "monthly_spend"]]
y = df["is_churned"]
model = RandomForestClassifier().fit(X, y)Feature Store uniquement
Scénario : Startup ML-first sans legacy BI
- Modèles temps réel uniquement
- Pas de besoins analytiques complexes
- Équipe ML sans analystes BI
- Sources de données directement dans le feature store
from feast import FeatureStore
fs = FeatureStore(repo_path=".")
@feature_view(entities=[customer], ttl=timedelta(days=1))
def customer_features(transactions: DataFrame):
return transactions.groupby("customer_id").agg(...)
training_df = fs.get_historical_features(
entity_df=entities,
features=["customer_features:avg_spend", "customer_features:frequency"]
).to_df()
online_features = fs.get_online_features(
entity_rows=[{"customer_id": "123"}],
features=["customer_features:avg_spend"]
)Les deux ensemble (architecture moderne)
Scénario : Entreprise mature avec BI et ML en production
┌─────────────────┐
│ Data Sources │
└────────┬────────┘
│
┌────────▼────────┐
│ Data Lake │
└────────┬────────┘
│
┌────────────────┼────────────────┐
│ │ │
┌────────▼────────┐ ┌─────▼─────┐ ┌────────▼────────┐
│ Data Warehouse │ │ Feature │ │ Operational │
│ (Snowflake, │ │ Store │ │ Database │
│ BigQuery) │ │ (Feast, │ │ (PostgreSQL) │
│ │ │ Tecton) │ │ │
└────────┬────────┘ └─────┬─────┘ └─────────────────┘
│ │
┌────────▼────────┐ ┌─────▼─────┐
│ BI & Reports │ │ ML Models │
│ (Tableau, │ │ (Training │
│ Looker) │ │ + Serving)│
└─────────────────┘ └───────────┘Flux de données :
- Le data lake centralise les données brutes
- Le data warehouse agrège pour l'analyse
- Le feature store transforme pour le ML
- Chaque outil sert son audience
Critères de choix détaillés
1. Latence requise
| Besoin | Solution |
|---|---|
| Rapports quotidiens | Data warehouse |
| Analyses interactives (secondes) | Data warehouse |
| API temps réel (<100ms) | Feature store |
| Inférence ultra-rapide (<10ms) | Feature store avec online store |
Exemple concret :
df = spark.sql("SELECT ... FROM sales_mart").toPandas() # 2-5 secondes OK
features = fs.get_online_features(...) # Doit être <10ms
prediction = model.predict(features) # Avant que la transaction timeout2. Type de requêtes
Data warehouse - Agrégations sur des ensembles :
-- "Quel est le panier moyen par segment ?"
SELECT segment, AVG(basket_value)
FROM orders
GROUP BY segment;Feature store - Lookup par entité :
features = fs.get_online_features(
entity_rows=[{"customer_id": "C789"}],
features=["customer:*"]
)3. Cohérence training/serving
Le data warehouse ne garantit pas la cohérence entre entraînement et production :
train_df = dwh.query("SELECT * FROM features WHERE date = '2025-01-01'")
model.fit(train_df)
prod_features = dwh.query("SELECT * FROM features WHERE date = CURRENT_DATE")Le feature store garantit la cohérence par design :
@feature_view
def customer_features(transactions):
return transactions.groupby("customer_id").agg(
avg_amount=("amount", "mean") # Définition unique
)
train_df = fs.get_historical_features(...)
prod_features = fs.get_online_features(...)4. Point-in-time correctness
Pour le ML, vous devez éviter le data leakage : utiliser des données du futur pour prédire le passé.
Data warehouse - Risque de leakage :
-- DANGER : cette requête utilise les données actuelles
-- pour des événements passés
SELECT
o.order_id,
o.order_date,
c.current_lifetime_value -- Valeur ACTUELLE, pas au moment de la commande
FROM orders o
JOIN customers c ON o.customer_id = c.id;Feature store - Point-in-time correct :
training_df = fs.get_historical_features(
entity_df=orders_df, # Contient order_id, customer_id, event_timestamp
features=["customer:lifetime_value"]
)5. Gouvernance et découverte
| Aspect | Data Warehouse | Feature Store |
|---|---|---|
| Catalogue | Tables, vues, marts | Features, feature views |
| Lineage | DBT, DataHub | Intégré (Feast, Tecton) |
| Versioning | Rare | Natif |
| Documentation | Externe | Métadonnées intégrées |
Patterns d'intégration
Pattern 1 : Feature Store alimenté par le Data Warehouse
Le data warehouse fait les transformations lourdes, le feature store sert le ML :
features_df = spark.sql("""
SELECT
customer_id,
AVG(amount) as avg_purchase_30d,
COUNT(*) as order_count_30d,
MAX(order_date) as last_order_date
FROM dwh.fact_orders
WHERE order_date >= CURRENT_DATE - 30
GROUP BY customer_id
""")
fs.materialize_incremental(
feature_views=["customer_features"],
end_date=datetime.now()
)Pattern 2 : Feature Store temps réel, DWH batch
Événements temps réel ──→ Feature Store (streaming)
│
▼
Modèles temps réel
Données historiques ──→ Data Warehouse ──→ Rapports BI
│
▼
Feature Store (batch sync)Pattern 3 : Synchronisation bidirectionnelle
spark.sql("SELECT ... FROM dwh.customer_agg").write.to_feature_store()
predictions_df = model.predict_batch(fs.get_historical_features(...))
predictions_df.write.to_dwh("ml.predictions")Matrice de décision
Choisissez un Data Warehouse seul si :
- Votre équipe fait principalement du reporting et de l'analyse
- Vos modèles ML tournent en batch (quotidien ou moins fréquent)
- Vous n'avez pas de contraintes de latence (<1 seconde)
- Votre feature engineering est simple (agrégations SQL)
- Vous avez 1-2 modèles en production maximum
Choisissez un Feature Store seul si :
- Vous êtes une startup ML-first sans legacy BI
- Tous vos modèles nécessitent du temps réel
- Vous n'avez pas de besoins analytiques business
- Votre équipe est 100% ML engineering
Utilisez les deux si :
- Vous avez des besoins BI ET des modèles ML temps réel
- Plusieurs équipes (analystes + ML engineers) travaillent sur les mêmes données
- Vous avez des contraintes de latence pour certains cas d'usage
- Vous voulez mutualiser le feature engineering
Coûts comparés
Data Warehouse (exemple Snowflake)
| Usage | Coût mensuel estimé |
|---|---|
| Stockage 1 TB | $23 |
| Compute léger (analyses) | $500-2K |
| Compute intensif (ETL, ML) | $5K-20K |
Feature Store (exemple Feast + Redis)
| Composant | Coût mensuel estimé |
|---|---|
| Offline store (S3/GCS) | $20-100 |
| Online store (Redis) | $200-1K |
| Compute (transformations) | $300-2K |
Feature Store managé (exemple Tecton)
| Tier | Coût mensuel |
|---|---|
| Startup | $2K-5K |
| Growth | $5K-15K |
| Enterprise | $15K+ |
Recommandations par maturité
| Stade | Recommandation |
|---|---|
| POC ML | Data warehouse uniquement |
| Premier modèle prod | Data warehouse + cache simple |
| 3-5 modèles prod | Évaluer feature store |
| ML à l'échelle | Data warehouse + feature store |
| ML-native startup | Feature store d'abord |
Conclusion
Data warehouse et feature store ne sont pas interchangeables :
- Le data warehouse excelle pour l'analyse, le reporting, et l'exploration des données
- Le feature store excelle pour servir des features ML en temps réel avec cohérence garantie
La plupart des organisations matures ont besoin des deux, chacun servant son audience et ses cas d'usage. L'erreur courante est de vouloir utiliser le data warehouse comme feature store (trop lent, pas de cohérence training/serving) ou inversement (le feature store n'est pas fait pour l'analyse).
Commencez par le data warehouse si vous débutez en ML. Ajoutez un feature store quand vous avez des contraintes de latence ou plusieurs modèles partageant des features.
Pour approfondir les cas d'usage du feature store, consultez notre article : Feature Store : quand est-ce vraiment indispensable en production IA ?
Pour une vue d'ensemble sur les feature stores : Feature Store en 2025 : est-ce encore utile en production IA ?