décembre 21, 2025
15 min de lecture

Questions d'entretien pour Data Scientist Senior : Guide complet

interview
career-advice
job-search
Questions d'entretien pour Data Scientist Senior : Guide complet
MB

Milad Bonakdar

Auteur

Maîtrisez les concepts avancés de la science des données grâce à des questions d'entretien essentielles couvrant les algorithmes ML avancés, le deep learning, le déploiement de modèles, l'ingénierie des caractéristiques, les tests A/B et le big data pour les data scientists seniors.


Introduction

On attend des data scientists expérimentés qu'ils conçoivent des solutions de machine learning de bout en bout, qu'ils optimisent la performance des modèles, qu'ils déploient des modèles en production et qu'ils communiquent des informations aux parties prenantes. Ce rôle exige une expertise approfondie des algorithmes avancés, de l'ingénierie des caractéristiques, du déploiement des modèles et de la capacité à résoudre des problèmes commerciaux complexes grâce aux données.

Ce guide complet couvre les questions d'entretien essentielles pour les data scientists expérimentés, englobant le machine learning avancé, le deep learning, l'ingénierie des caractéristiques, le déploiement des modèles, les tests A/B et les technologies de big data. Chaque question comprend des réponses détaillées, une évaluation de la rareté et des niveaux de difficulté.


Machine Learning Avancé (6 Questions)

1. Expliquez le compromis biais-variance.

Réponse: Le compromis biais-variance décrit la relation entre la complexité du modèle et l'erreur de prédiction.

  • Biais: Erreur due à des hypothèses simplificatrices (sous-apprentissage)
  • Variance: Erreur due à la sensibilité aux fluctuations des données d'entraînement (surapprentissage)
  • Compromis: Diminuer le biais augmente la variance et vice versa
  • Objectif: Trouver l'équilibre optimal qui minimise l'erreur totale
Loading diagram...
import numpy as np
from sklearn.model_selection import learning_curve
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

# Générer des données
X = np.random.rand(100, 1) * 10
y = 2 * X + 3 + np.random.randn(100, 1) * 2

# Modèle à biais élevé (max_depth=1)
high_bias = DecisionTreeRegressor(max_depth=1)

# Modèle à variance élevée (max_depth=20)
high_variance = DecisionTreeRegressor(max_depth=20)

# Modèle optimal (max_depth=3)
optimal = DecisionTreeRegressor(max_depth=3)

# Les courbes d'apprentissage montrent le compromis biais-variance
train_sizes, train_scores, val_scores = learning_curve(
    optimal, X, y.ravel(), cv=5, train_sizes=np.linspace(0.1, 1.0, 10)
)

print(f"Score d'entraînement : {train_scores.mean():.2f}")
print(f"Score de validation : {val_scores.mean():.2f}")

Rareté: Très Courante Difficulté: Difficile


2. Qu'est-ce que la régularisation et expliquez la régularisation L1 vs L2.

Réponse: La régularisation ajoute un terme de pénalité à la fonction de perte pour empêcher le surapprentissage.

  • L1 (Lasso):
    • Pénalité: Somme des valeurs absolues des coefficients
    • Effet: Modèles clairsemés (certains coefficients deviennent exactement 0)
    • Utilisation: Sélection de caractéristiques
  • L2 (Ridge):
    • Pénalité: Somme des coefficients au carré
    • Effet: Réduit les coefficients vers 0 (mais pas exactement 0)
    • Utilisation: Lorsque toutes les caractéristiques sont potentiellement pertinentes
  • Elastic Net: Combine L1 et L2
from sklearn.linear_model import Lasso, Ridge, ElasticNet
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
import numpy as np

# Générer des données avec de nombreuses caractéristiques
X, y = make_regression(n_samples=100, n_features=20, n_informative=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# Régularisation L1 (Lasso)
lasso = Lasso(alpha=1.0)
lasso.fit(X_train, y_train)
print(f"Coefficients Lasso : {np.sum(lasso.coef_ != 0)} non nuls sur {len(lasso.coef_)}")

# Régularisation L2 (Ridge)
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
print(f"Coefficients Ridge : {np.sum(ridge.coef_ != 0)} non nuls sur {len(ridge.coef_)}")

# Elastic Net (L1 + L2)
elastic = ElasticNet(alpha=1.0, l1_ratio=0.5)
elastic.fit(X_train, y_train)

print(f"\nScore Lasso : {lasso.score(X_test, y_test):.3f}")
print(f"Score Ridge : {ridge.score(X_test, y_test):.3f}")
print(f"Score Elastic Net : {elastic.score(X_test, y_test):.3f}")

Rareté: Très Courante Difficulté: Moyenne


3. Expliquez les méthodes d'ensemble : Bagging vs Boosting.

Réponse: Les méthodes d'ensemble combinent plusieurs modèles pour améliorer les performances.

  • Bagging (Bootstrap Aggregating):
    • Entraîner des modèles en parallèle sur des sous-ensembles aléatoires
    • Réduit la variance
    • Exemple: Random Forest
  • Boosting:
    • Entraîner des modèles séquentiellement, chacun corrigeant les erreurs précédentes
    • Réduit le biais
    • Exemples: AdaBoost, Gradient Boosting, XGBoost
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, cross_val_score

# Charger les données
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# Bagging - Random Forest
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
rf_score = rf.score(X_test, y_test)

# Boosting - Gradient Boosting
gb = GradientBoostingClassifier(n_estimators=100, random_state=42)
gb.fit(X_train, y_train)
gb_score = gb.score(X_test, y_test)

print(f"Précision de Random Forest (Bagging) : {rf_score:.3f}")
print(f"Précision de Gradient Boosting : {gb_score:.3f}")

# Validation croisée
rf_cv = cross_val_score(rf, data.data, data.target, cv=5)
gb_cv = cross_val_score(gb, data.data, data.target, cv=5)

print(f"\nScores CV RF : {rf_cv.mean():.3f} (+/- {rf_cv.std():.3f})")
print(f"Scores CV GB : {gb_cv.mean():.3f} (+/- {gb_cv.std():.3f})")

Rareté: Très Courante Difficulté: Difficile


4. Qu'est-ce que la validation croisée et pourquoi la validation k-fold est-elle meilleure qu'une division train-test ?

Réponse: La validation croisée évalue les performances du modèle de manière plus robuste qu'une simple division train-test.

  • CV K-Fold:
    • Divise les données en k plis
    • Entraîne k fois, en utilisant à chaque fois un pli différent comme validation
    • Moyenne les résultats
  • Avantages:
    • Estimation des performances plus fiable
    • Utilise toutes les données pour l'entraînement et la validation
    • Réduit la variance dans l'estimation des performances
  • Variations: K-Fold Stratifié, Leave-One-Out, Time Series Split
from sklearn.model_selection import cross_val_score, KFold, StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

data = load_iris()
X, y = data.data, data.target

model = LogisticRegression(max_iter=200)

# K-Fold standard
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kfold)
print(f"Scores CV K-Fold : {scores}")
print(f"Moyenne : {scores.mean():.3f} (+/- {scores.std():.3f})")

# K-Fold Stratifié (préserve la distribution des classes)
stratified_kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
stratified_scores = cross_val_score(model, X, y, cv=stratified_kfold)
print(f"\nScores CV K-Fold Stratifié : {stratified_scores}")
print(f"Moyenne : {stratified_scores.mean():.3f} (+/- {stratified_scores.std():.3f})")

# Validation croisée personnalisée
from sklearn.model_selection import cross_validate

cv_results = cross_validate(
    model, X, y, cv=5,
    scoring=['accuracy', 'precision_macro', 'recall_macro'],
    return_train_score=True
)

print(f"\nPrécision du test : {cv_results['test_accuracy'].mean():.3f}")
print(f"Précision du test : {cv_results['test_precision_macro'].mean():.3f}")
print(f"Rappel du test : {cv_results['test_recall_macro'].mean():.3f}")

Rareté: Très Courante Difficulté: Moyenne


5. Expliquez les techniques de réduction de dimensionnalité (PCA, t-SNE).

Réponse: La réduction de dimensionnalité réduit le nombre de caractéristiques tout en préservant l'information.

  • PCA (Principal Component Analysis):
    • Transformation linéaire
    • Trouve les directions de variance maximale
    • Préserve la structure globale
    • Rapide, interprétable
  • t-SNE (t-Distributed Stochastic Neighbor Embedding):
    • Transformation non linéaire
    • Préserve la structure locale
    • Bon pour la visualisation
    • Plus lent, pas pour l'extraction de caractéristiques
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

# Charger des données de haute dimension
digits = load_digits()
X, y = digits.data, digits.target

print(f"Forme originale : {X.shape}")

# PCA - réduire à 2 dimensions
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
print(f"Forme PCA : {X_pca.shape}")
print(f"Ratio de variance expliquée : {pca.explained_variance_ratio_}")
print(f"Variance totale expliquée : {pca.explained_variance_ratio_.sum():.3f}")

# t-SNE - réduire à 2 dimensions
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)
print(f"Forme t-SNE : {X_tsne.shape}")

# PCA pour l'extraction de caractéristiques (conserver 95% de la variance)
pca_95 = PCA(n_components=0.95)
X_reduced = pca_95.fit_transform(X)
print(f"\nComposantes pour 95% de la variance : {pca_95.n_components_}")
print(f"Forme réduite : {X_reduced.shape}")

Rareté: Courante Difficulté: Difficile


6. Qu'est-ce que la courbe ROC et l'AUC ? Quand l'utiliseriez-vous ?

Réponse: La courbe ROC (Receiver Operating Characteristic) trace le taux de vrais positifs en fonction du taux de faux positifs à différents seuils.

  • AUC (Area Under Curve): Métrique unique résumant la ROC
    • AUC = 1.0: Classificateur parfait
    • AUC = 0.5: Classificateur aléatoire
    • AUC < 0.5: Pire qu'aléatoire
  • Cas d'utilisation:
    • Comparaison de modèles
    • Ensembles de données déséquilibrés
    • Lorsque vous devez choisir un seuil
from sklearn.metrics import roc_curve, roc_auc_score, auc
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt

# Charger les données
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# Entraîner le modèle
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)

# Obtenir les prédictions de probabilité
y_pred_proba = model.predict_proba(X_test)[:, 1]

# Calculer la courbe ROC
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)

print(f"AUC : {roc_auc:.3f}")

# Alternative: calcul direct de l'AUC
auc_score = roc_auc_score(y_test, y_pred_proba)
print(f"AUC (direct) : {auc_score:.3f}")

# Trouver le seuil optimal (statistique J de Youden)
optimal_idx = np.argmax(tpr - fpr)
optimal_threshold = thresholds[optimal_idx]
print(f"Seuil optimal : {optimal_threshold:.3f}")

Rareté: Très Courante Difficulté: Moyenne


Ingénierie des Caractéristiques (4 Questions)

7. Quelles techniques utilisez-vous pour l'ingénierie des caractéristiques ?

Réponse: L'ingénierie des caractéristiques crée de nouvelles caractéristiques à partir des données existantes pour améliorer les performances du modèle.

  • Techniques:
    • Encodage: One-hot, label, target encoding
    • Mise à l'échelle: StandardScaler, MinMaxScaler
    • Binning: Discrétiser les variables continues
    • Caractéristiques polynomiales: Termes d'interaction
    • Spécifique au domaine: Caractéristiques de date, caractéristiques de texte
    • Agrégations: Statistiques de groupe
from sklearn.preprocessing import StandardScaler, OneHotEncoder, PolynomialFeatures
import pandas as pd
import numpy as np

# Exemple de données
df = pd.DataFrame({
    'age': [25, 30, 35, 40, 45],
    'salary': [50000, 60000, 75000, 80000, 90000],
    'department': ['IT', 'HR', 'IT', 'Finance', 'HR'],
    'date': pd.date_range('2023-01-01', periods=5)
})

# Encodage one-hot
df_encoded = pd.get_dummies(df, columns=['department'], prefix='dept')

# Mise à l'échelle
scaler = StandardScaler()
df_encoded[['age_scaled', 'salary_scaled']] = scaler.fit_transform(
    df_encoded[['age', 'salary']]
)

# Binning
df_encoded['age_group'] = pd.cut(df['age'], bins=[0, 30, 40, 100], labels=['young', 'mid', 'senior'])

# Caractéristiques de date
df_encoded['year'] = df['date'].dt.year
df_encoded['month'] = df['date'].dt.month
df_encoded['day_of_week'] = df['date'].dt.dayofweek

# Caractéristiques polynomiales
poly = PolynomialFeatures(degree=2, include_bias=False)
poly_features = poly.fit_transform(df[['age', 'salary']])

# Caractéristiques d'interaction
df_encoded['age_salary_interaction'] = df['age'] * df['salary']

print(df_encoded.head())

Rareté: Très Courante Difficulté: Moyenne


8. Comment gérez-vous les ensembles de données déséquilibrés ?

Réponse: Les ensembles de données déséquilibrés ont des distributions de classes inégales, ce qui peut biaiser les modèles.

  • Techniques:
    • Rééchantillonnage:
      • Suréchantillonnage de la classe minoritaire (SMOTE)
      • Sous-échantillonnage de la classe majoritaire
    • Poids des classes: Pénaliser la mauvaise classification de la classe minoritaire
    • Méthodes d'ensemble: Random Forest équilibré
    • Évaluation: Utiliser la précision, le rappel, le F1, pas seulement la précision
    • Détection d'anomalies: Traiter la minorité comme une anomalie
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler

# Créer un ensemble de données déséquilibré
X, y = make_classification(
    n_samples=1000, n_features=20, n_informative=15,
    n_classes=2, weights=[0.9, 0.1], random_state=42
)

print(f"Distribution des classes : {np.bincount(y)}")

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 1. Sans gérer le déséquilibre
model_baseline = LogisticRegression()
model_baseline.fit(X_train, y_train)
y_pred_baseline = model_baseline.predict(X_test)
print("\nBaseline (pas de gestion) :")
print(classification_report(y_test, y_pred_baseline))

# 2. SMOTE (Synthetic Minority Over-sampling)
smote = SMOTE(random_state=42)
X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)
print(f"\nAprès SMOTE : {np.bincount(y_train_smote)}")

model_smote = LogisticRegression()
model_smote.fit(X_train_smote, y_train_smote)
y_pred_smote = model_smote.predict(X_test)
print("\nAvec SMOTE :")
print(classification_report(y_test, y_pred_smote))

# 3. Poids des classes
model_weighted = LogisticRegression(class_weight='balanced')
model_weighted.fit(X_train, y_train)
y_pred_weighted = model_weighted.predict(X_test)
print("\nAvec les poids des classes :")
print(classification_report(y_test, y_pred_weighted))

Rareté: Très Courante Difficulté: Moyenne


9. Expliquez les techniques de sélection de caractéristiques.

Réponse: La sélection de caractéristiques identifie les caractéristiques les plus pertinentes pour la modélisation.

  • Méthodes:
    • Méthodes de filtre: Tests statistiques (corrélation, chi-carré)
    • Méthodes d'encapsulation: Recursive Feature Elimination (RFE)
    • Méthodes intégrées: Lasso, importance des caractéristiques basée sur les arbres
    • Réduction de dimensionnalité: PCA (différent de la sélection)
from sklearn.feature_selection import SelectKBest, chi2, RFE, SelectFromModel
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import MinMaxScaler

# Charger les données
data = load_breast_cancer()
X, y = data.data, data.target

# 1. Méthode de filtre - SelectKBest avec chi-carré
X_scaled = MinMaxScaler().fit_transform(X)
selector_chi2 = SelectKBest(chi2, k=10)
X_chi2 = selector_chi2.fit_transform(X_scaled, y)
print(f"Caractéristiques originales : {X.shape[1]}")
print(f"Caractéristiques sélectionnées (chi2) : {X_chi2.shape[1]}")

# 2. Méthode d'encapsulation - Recursive Feature Elimination
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rfe = RFE(estimator=rf, n_features_to_select=10)
X_rfe = rfe.fit_transform(X, y)
print(f"Caractéristiques sélectionnées (RFE) : {X_rfe.shape[1]}")
print(f"Classement des caractéristiques : {rfe.ranking_}")

# 3. Méthode intégrée - Importance des caractéristiques basée sur les arbres
rf.fit(X, y)
importances = rf.feature_importances_
indices = np.argsort(importances)[::-1]

print("\nTop 10 des caractéristiques par importance :")
for i in range(10):
    print(f"{i+1}. {data.feature_names[indices[i]]}: {importances[indices[i]]:.4f}")

# SelectFromModel
selector_model = SelectFromModel(rf, threshold='median', prefit=True)
X_selected = selector_model.transform(X)
print(f"\nCaractéristiques sélectionnées (importance) : {X_selected.shape[1]}")

Rareté: Courante Difficulté: Moyenne


10. Comment gérez-vous les variables catégorielles à cardinalité élevée ?

Réponse: Les variables catégorielles à cardinalité élevée ont de nombreuses valeurs uniques.

  • Techniques:
    • Target Encoding: Remplacer par la moyenne cible
    • Frequency Encoding: Remplacer par la fréquence
    • Embedding: Apprendre des représentations denses (réseaux neuronaux)
    • Regroupement: Combiner les catégories rares en "Autre"
    • Hashing: Hacher en un nombre fixe de buckets
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# Exemple de données à cardinalité élevée
df = pd.DataFrame({
    'city': np.random.choice([f'City_{i}' for i in range(100)], 1000),
    'target': np.random.randint(0, 2, 1000)
})

print(f"Villes uniques : {df['city'].nunique()}")

# 1. Target Encoding
target_means = df.groupby('city')['target'].mean()
df['city_target_encoded'] = df['city'].map(target_means)

# 2. Frequency Encoding
freq = df['city'].value_counts()
df['city_frequency'] = df['city'].map(freq)

# 3. Regroupement des catégories rares
freq_threshold = 10
rare_cities = freq[freq < freq_threshold].index
df['city_grouped'] = df['city'].apply(lambda x: 'Other' if x in rare_cities else x)

print(f"\nAprès regroupement : {df['city_grouped'].nunique()} valeurs uniques")

# 4. Hash encoding (en utilisant la bibliothèque category_encoders)
# from category_encoders import HashingEncoder
# encoder = HashingEncoder(cols=['city'], n_components=10)
# df_hashed = encoder.fit_transform(df)

print(df[['city', 'city_target_encoded', 'city_frequency', 'city_grouped']].head())

Rareté: Courante Difficulté: Difficile


Déploiement et Production de Modèles (4 Questions)

11. Comment déployez-vous un modèle de machine learning en production ?

Réponse: Le déploiement de modèle rend les modèles disponibles pour une utilisation réelle.

  • Étapes:
    1. Sérialisation du modèle: Enregistrer le modèle (pickle, joblib, ONNX)
    2. Développement d'API: Créer une API REST (Flask, FastAPI)
    3. Conteneurisation: Docker pour la cohérence
    4. Déploiement: Plateformes cloud (AWS, GCP, Azure)
    5. Surveillance: Suivre les performances, la dérive
    6. CI/CD: Tests et déploiement automatisés
# 1. Entraîner et enregistrer le modèle
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import joblib

# Entraîner le modèle
data = load_iris()
model = RandomForestClassifier()
model.fit(data.data, data.target)

# Enregistrer le modèle
joblib.dump(model, 'model.joblib')

# 2. Créer une API avec FastAPI
from fastapi import FastAPI
import numpy as np

app = FastAPI()

# Charger le modèle
model = joblib.load('model.joblib')

@app.post("/predict")
def predict(features: list):
    # Convertir en tableau numpy
    X = np.array(features).reshape(1, -1)
    prediction = model.predict(X)
    probability = model.predict_proba(X)
    
    return {
        "prediction": int(prediction[0]),
        "probability": probability[0].tolist()
    }

# 3. Dockerfile
"""
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
"""

# 4. Utilisation
# curl -X POST "http://localhost:8000/predict" \
#      -H "Content-Type: application/json" \
#      -d '{"features": [5.1, 3.5, 1.4, 0.2]}'

Rareté: Très Courante Difficulté: Difficile


12. Qu'est-ce que la surveillance de modèle et pourquoi est-ce important ?

Réponse: La surveillance de modèle suit les performances du modèle en production.

  • Ce qu'il faut surveiller:
    • Mesures de performance: Précision, précision, rappel
    • Dérive des données: Changements de la distribution des entrées
    • Dérive du concept: Changements de la relation cible
    • Mesures du système: Latence, débit, erreurs
  • Actions:
    • Alertes lorsque les performances se dégradent
    • Réentraîner avec de nouvelles données
    • Tests A/B de nouveaux modèles
import numpy as np
from scipy import stats

# Simuler des données de production
training_data = np.random.normal(0, 1, 1000)
production_data = np.random.normal(0.5, 1.2, 1000)  # Dérive

# Détecter la dérive des données en utilisant le test de Kolmogorov-Smirnov
statistic, p_value = stats.ks_2samp(training_data, production_data)

print(f"Statistique KS : {statistic:.4f}")
print(f"P-value : {p_value:.4f}")

if p_value < 0.05:
    print("Dérive des données détectée ! Envisager de réentraîner le modèle.")
else:
    print("Aucune dérive significative détectée.")

# Surveiller les performances du modèle
class ModelMonitor:
    def __init__(self, model):
        self.model = model
        self.predictions = []
        self.actuals = []
        
    def log_prediction(self, X, y_pred, y_true=None):
        self.predictions.append(y_pred)
        if y_true is not None:
            self.actuals.append(y_true)
    
    def get_accuracy(self):
        if len(self.actuals) == 0:
            return None
        return np.mean(np.array(self.predictions) == np.array(self.actuals))
    
    def check_drift(self, new_data, reference_data):
        statistic, p_value = stats.ks_2samp(new_data, reference_data)
        return p_value < 0.05

# Utilisation
monitor = ModelMonitor(model)
# monitor.log_prediction(X, y_pred, y_true)
# accuracy = monitor.get_accuracy()

Rareté: Courante Difficulté: Moyenne


13. Expliquez les tests A/B dans le contexte du machine learning.

Réponse: Les tests A/B comparent deux versions (contrôle vs traitement) pour déterminer laquelle est la plus performante.

  • Processus:
    1. Diviser le trafic de manière aléatoire
    2. Servir différents modèles à chaque groupe
    3. Collecter les métriques
    4. Test statistique pour déterminer le gagnant
  • Métriques: Taux de conversion, revenus, engagement
  • Tests statistiques: t-test, chi-carré, méthodes bayésiennes
import numpy as np
from scipy import stats

# Simuler les résultats des tests A/B
# Groupe de contrôle (Modèle A)
control_conversions = 520
control_visitors = 10000

# Groupe de traitement (Modèle B)
treatment_conversions = 580
treatment_visitors = 10000

# Calculer les taux de conversion
control_rate = control_conversions / control_visitors
treatment_rate = treatment_conversions / treatment_visitors

print(f"Taux de conversion du contrôle : {control_rate:.4f}")
print(f"Taux de conversion du traitement : {treatment_rate:.4f}")
print(f"Augmentation : {((treatment_rate - control_rate) / control_rate * 100):.2f}%")

# Test de signification statistique (test z à deux proportions)
pooled_rate = (control_conversions + treatment_conversions) / (control_visitors + treatment_visitors)
se = np.sqrt(pooled_rate * (1 - pooled_rate) * (1/control_visitors + 1/treatment_visitors))
z_score = (treatment_rate - control_rate) / se
p_value = 2 * (1 - stats.norm.cdf(abs(z_score)))

print(f"\nScore Z : {z_score:.4f}")
print(f"P-value : {p_value:.4f}")

if p_value < 0.05:
    print("Le résultat est statistiquement significatif !")
    if treatment_rate > control_rate:
        print("Le traitement (Modèle B) est meilleur.")
    else:
        print("Le contrôle (Modèle A) est meilleur.")
else:
    print("Aucune différence statistiquement significative.")

# Calcul de la taille de l'échantillon
from statsmodels.stats.power import zt_ind_solve_power

required_sample = zt_ind_solve_power(
    effect_size=0.02,  # Effet minimal détectable
    alpha=0.05,
    power=0.8,
    alternative='two-sided'
)
print(f"\nTaille de l'échantillon requise par groupe : {int(required_sample)}")

Rareté: Courante Difficulté: Difficile


14. Qu'est-ce que MLOps et pourquoi est-ce important ?

Réponse: MLOps (Machine Learning Operations) applique les principes de DevOps aux systèmes de ML.

  • Composantes:
    • Contrôle de version: Code, données, modèles
    • Tests automatisés: Tests unitaires, d'intégration, de modèle
    • Pipelines CI/CD: Déploiement automatisé
    • Surveillance: Performances, détection de dérive
    • Reproductibilité: Suivi des expériences
  • Outils: MLflow, Kubeflow, DVC, Weights & Biases
# Exemple : MLflow pour le suivi des expériences
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Charger les données
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# Démarrer l'exécution MLflow
with mlflow.start_run():
    # Enregistrer les paramètres
    n_estimators = 100
    max_depth = 5
    mlflow.log_param("n_estimators", n_estimators)
    mlflow.log_param("max_depth", max_depth)
    
    # Entraîner le modèle
    model = RandomForestClassifier(
        n_estimators=n_estimators,
        max_depth=max_depth,
        random_state=42
    )
    model.fit(X_train, y
Newsletter subscription

Conseils de carrière hebdomadaires qui fonctionnent vraiment

Recevez les dernières idées directement dans votre boîte de réception

Decorative doodle

Arrêtez de Postuler. Commencez à Être Embauché.

Transformez votre CV en un aimant à entretiens avec l'optimisation alimentée par l'IA en laquelle les chercheurs d'emploi du monde entier font confiance.

Commencer gratuitement

Partager cet article

Battez le Taux de Rejet ATS de 75%

3 CV sur 4 n'atteignent jamais un œil humain. Notre optimisation des mots-clés augmente votre taux de réussite jusqu'à 80%, garantissant que les recruteurs voient réellement votre potentiel.