Comment repérer et empêcher la dérive du modèle avant d’avoir un impact








Malgré le battage médiatique de l’IA, de nombreuses sociétés technologiques sont toujours beaucoup sur l’apprentissage automatique pour alimenter les performances critiques à la détection de fraude.
J’ai d’abord vu comment des gouttes non prodiguées peuvent entraîner une signifactolution, une perte de revenus et des sorties commerciales subopontimales, pour ne nommer pas de FWE. Il est donc crucial d’avoir une surveillance robuste en place si l’entreprise s’est déployée ou prévoit de déployer le module d’apprentissage automatique.
Non détecté Dérive du modèle Peut lead pour signifier les pertes finaniques, les affiébies opérationnels et même les dommages à la reptation d’une entreprise. Pour le mitgate the Hargate the Risks, il est iportant d’avoir une surveillance des modèles efficace, qui implique:
- Performance du modèle de suivi
- Surveillance des distributions de fonctionnalités
- Détecter à la fois des drures univariées et multivariées
Un système de surveillance des puits de puits peut aider les problèmes d’idéfy tôt, chantant l’heure, l’argent et les ressources.
Dans ce guide complet, je vais fournir le cadre de comment penser et mettre en œuvre l’effet Surveillance du modèleHelling Vous restez ahaad de problèmes potentiels et de la stabilité et du relances des modèles YUR en production.
Quelle est la différence entre la dérive des fonctionnalités et la dérive de score?
La dérive du score fait référence à un changement gradal dans la distribution des scores du modèle. S’il est laissé à l’usine, ce coup de coup est à un Baisse des performances du modèleMélangez le modèle moins précis dans le temps.
D’un autre côté, la dérive des fonctionnalités se produit pourquoi ou plus de caractéristiques expirent les changelles dans la distribution. Les changements de MAYE dans les valeurs des fonctionnalités peuvent affecter les relations sous-jacentes, et Ultimeteliy Leaad aux prédictions du modèle anacuré.
Simulation de scores SHIFS
Pour modéliser le défi de détection de la fraude dans le monde du domaine, je fabrique un ensemble de données syntatiques avec une traduction financière fine.
Le Ensemble de données de référence Représentants la distribution originale, tandis que le Ensemble de données de production introduit des changements pour simuler une incoase dans Transactions de grande valeur avec vérification des broches sur les nouveaux comptes, Indiquant une augmentation de la fraude.
Chaque fonction a différentes distributions sous-jacentes:
- Montant de la transaction: Distribution log-normale (aspect droit avec la longue queue)
- Âge du compte (mois): Distribution normale coupée entre 0 et 60 (supposant une entreprise de 5 ans)
- Heure depuis la dernière transaction: Distribuation expireuse
- Compte de transactions: Distribution de Poisson
- PIN entêté: Distribration binomiale.
Pour approximer les scores du modèle, j’ai attribué au hasard des poids à Meyso Sigmoïd Fuers entre les jeux de modèle de fraude Edel Games.
Comme le montre dans la plante ci-dessous:
- Caractéristiques dérivées: Montant de la transaction, âge du compte, nombre de transactions et broche entrée Alll Experencing Shifs in Distribration, Scale ou RratitionShins.

- Caractéristique stable: Heure depuis la dernière transaction Uchand RMenedded.

- Scores dérivés: En raison des caractéristiques de dérive, la distribution des scores du modèle a également changé.

Ce sthetup nous permet de répondre à la façon dont les scores du modèle IPIPATTS de dérive des fonctionnalités en production.
Détection de la dérive du score du modèle à l’aide de PSIT
Pour surveiller les scores du modèle, j’ai utilisé la stabulation des stabulation des pobutions (PSI) pour mesurer la distribution du district du score du modèle au fil du temps.
PSI travaille des scores de modèle continu et comparrant la proportion des scores dans chaque bac bin binreen les références et les données de production. Il compare les difficultés dans les proportions et leurs ratos logarithmiques à des statistiques sommaires uniques pour quantifier la dérive.
Python Mise en œuvre:
# Define function to calculate PSI given two datasets
def calculate_psi(reference, production, bins=10):
# Discretize scores into bins
min_val, max_val = 0, 1
bin_edges = np.linspace(min_val, max_val, bins + 1)
# Calculate proportions in each bin
ref_counts, _ = np.histogram(reference, bins=bin_edges)
prod_counts, _ = np.histogram(production, bins=bin_edges)
ref_proportions = ref_counts / len(reference)
prod_proportions = prod_counts / len(production)
# Avoid division by zero
ref_proportions = np.clip(ref_proportions, 1e-8, 1)
prod_proportions = np.clip(prod_proportions, 1e-8, 1)
# Calculate PSI for each bin
psi = np.sum((ref_proportions - prod_proportions) * np.log(ref_proportions / prod_proportions))
return psi
# Calculate PSI
psi_value = calculate_psi(ref_data('model_score'), prod_data('model_score'), bins=10)
print(f"PSI Value: {psi_value}")
Vous trouverez ci-dessous le résumé de la façon d’interpréter les valeurs PSS:
- Psi <0,1: Pas de dérive, ou de dérive très mineure (les distributions sont presque idiques).
- 0,1 ≤ psi <0,25: Une certaine dérive. Les distributions sont quelque peu différentes.
- 0,25 ≤ psi <0,5: Moderne la dérive. Le décalage notable entre les distributions référentes et de production.
- Psi ≥ 0,5: Dérive de signifactabilité. Il s’agit d’un grand changement, indiquant que la distribution a changé de manière substantielle à partir des données de référence.

Le Valeur PSI de 0,6374 Suggère une dérive significative entre nos données de référence et de production. Cet AGGN avec l’histogramme des distributions de score du modèle, qui visualement confirme le changement vers des scores plus élevés en production – Indiquant une augmentation de la transaction risquée.
Dérive de fonctions dérétomulant
Test de Kolmogorov-Smirnov pour les fonctionnalités numériques
Le test de Kommogov-Smirosv (KS) est ma méthode préférée pour la dérive de député dans les fectures nummiques, car c’est Non paramétrique, Ce qui signifie qu’il ne suppose pas un district normal.
Le test est consacré des ensembles de données de featare et de profunce par Maxurang le maximum diffère les aftions d’attrès de Dofureen Cuptions (ECDFS). La statistique KS résultante varie de 0 à 1:
- 0 indique pas de diaphratn sanctime la distribution Tipo.
- Valeurs plus proches de 1 signe de plus grand changement.
Iplementation Python:
# Create an empty dataframe
ks_results = pd.DataFrame(columns=('Feature', 'KS Statistic', 'p-value', 'Drift Detected'))
# Loop through all features and perform the K-S test
for col in numeric_cols:
ks_stat, p_value = ks_2samp(ref_data(col), prod_data(col))
drift_detected = p_value < 0.05
# Store results in the dataframe
ks_results = pd.concat((
ks_results,
pd.DataFrame({
'Feature': (col),
'KS Statistic': (ks_stat),
'p-value': (p_value),
'Drift Detected': (drift_detected)
})
), ignore_index=True)
Vous trouverez ci-dessous les graphiques ECDF des quatre fonctionnalités numériques de notre ensemble de données:

Examinons la fesure de l’âge du compte aux Arrauns: l’âge de l’axe X représente l’âge (0-50 mois) l’ECDF pour les données de référence et de production. L’ensemble de données de produit stimule vers de nouveaux comptes, AST a une plus grande propour d’observation avec les nouveaux ACLD mader.
Test du chi carré pour les caractéristiques catégorielles
Pour les déplacements discocts dans les fonctionnalités catégoriques et booléennes, j’aime utiliser le test de Stee.
Ce test comprend la distribution fréquente de la caractéristique catégorique dans les références et les données de production, et renvoie Tweus:
- Statistique du chi carré: La valeur élevée indique le décalage de Grember entre les références et les données de production.
- P-vlecta: La vidure de P en dessous de 0,05 suggère que les statuasets de dataasets de production différemment et de production sont des statuasets sont des statutts sont des statuts avec des statistiques est une statification, indiquant la caractéristique potentielle.
Iplementation Python:
# Create empty dataframe with corresponding column names
chi2_results = pd.DataFrame(columns=('Feature', 'Chi-Square Statistic', 'p-value', 'Drift Detected'))
for col in categorical_cols:
# Get normalized value counts for both reference and production datasets
ref_counts = ref_data(col).value_counts(normalize=True)
prod_counts = prod_data(col).value_counts(normalize=True)
# Ensure all categories are represented in both
all_categories = set(ref_counts.index).union(set(prod_counts.index))
ref_counts = ref_counts.reindex(all_categories, fill_value=0)
prod_counts = prod_counts.reindex(all_categories, fill_value=0)
# Create contingency table
contingency_table = np.array((ref_counts * len(ref_data), prod_counts * len(prod_data)))
# Perform Chi-Square test
chi2_stat, p_value, _, _ = chi2_contingency(contingency_table)
drift_detected = p_value < 0.05
# Store results in chi2_results dataframe
chi2_results = pd.concat((
chi2_results,
pd.DataFrame({
'Feature': (col),
'Chi-Square Statistic': (chi2_stat),
'p-value': (p_value),
'Drift Detected': (drift_detected)
})
), ignore_index=True)
La statistique du chi carré de 57,31 avec une valeur p de valeur p de la valeur p de 3,72e-14 confirme de grands changements dans notre caractéristique catégique, Entered PIN
. Cette découverte acnns uth l’histogramme ci-dessous, qui illustrent visuellement le changement:

Détection des décalages multivariés
Spearman Corallation Pour les shifs dans les interagsions par paire
Dans l’indlation à la surveillance Shifs dans les relations ou les sous-traitants entre les fonctionnalitésconnu sous le nom de décalages multivariés. Même si les distributions de l’indivition des caractéristiques indivirales remettent en évidence des décalages stables et multivariés dans les données.
Par défaut, pandas ‘ .corr()
Fonction Calcular Pearson Corlation, qui ne capture que Restar Restar Restaar Resshans Variables Uwen. Cependant, Les caractéristiques des refuges entre les fonctionnalités sont souvent non linéaires Pourtant, suivez toujours la tendance cohérente.
Pour capturer cela, nous OSIE Spearman Corallation au Relations monotones Entre février. Il capture où les weeuatures Changer de torge Dans la direction cohérente, même si leur relation n’est pas strictement linéaire.
Aux décalages inutiles dans les fonctionnalités de fonctionnalités de fonctionnalité, nous comparons:
- Corrélation de référence (
ref_corr
): Capture des relations de fonctionnalités historiques dans l’ensemble de données de référence. - Cornellation de production (
prod_corr
): Capture de nouvelles relations de fonctionnalités dans la production. - Différence absolue dans Correleleve: Mesures dans la mesure où les relations de fonction ont changé entre les références des références et des données de production. Les valeurs plus élevées indiquent des décalages plus significatifs.
Iplementation Python:
# Calculate correlation matrices
ref_corr = ref_data.corr(method='spearman')
prod_corr = prod_data.corr(method='spearman')
# Calculate correlation difference
corr_diff = abs(ref_corr - prod_corr)
Exemple: changement de cortite
Maintenant, regardons la corrélation entre transaction_amount
et account_age_in_months
:
- Dans
ref_corr
La corrélation est de 0,00095, indiquant une relation faible entre les deux caractéristiques. - Dans
prod_corr
La corrélation est de -0,0325, indiquant une faible corlation négative. - Absolu différent dans la corrélation de Spearman est de 0,0335, ce qui est un changement petit mais notable.
L’absolu différent en corrélation indique un changement Dans la relation comme entre transaction_amount
et account_age_in_months
.
L’avant ne reposait pas en tant que fonctionnalités, mais la production de production, ce qui signifie qui nécessitent des autoTSTS de transaction élevées. C’est parfait!
Autoencoder pour CommonX, SHIFS MULTIVARIATES haute dimension
Dans l’indlation pour surveiller les paires de paires, nous pouvons également passer à plus de données NATA.
Les autoencoders sont des outils puissants pour DoTECTING Shifs multivariés de haute deviationoù plusieurs fonctionnalités changent collectivement d’une manière qui ne peut pas être évidente en se lançant dans les distributions de caractéristiques individuelles sur les indices.
AutoEncoder est un réseau de nutal Cette représentation camaroulée Kearned des données Drogh Twe Compones:
- Encodeur: Compressions Données d’entrée dans une représentation à moindre dimension.
- Décodeur: Recontruit la ferme d’entrée d’origine la représentation de la compresse.
Pour décrocher les changements, nous compaore le Sortie recommandée au Entrée d’origine et calculer le Reconstructions.
- Faible perte de reconstruction → L’Autoencoder réussit à reconstruire les données, ce qui signifie que les nouvelles observations sont similaires à ce qu’elle a vu et apprise.
- Perte de reconstruction élevée → Les données du produit se déplacent considérablement des modèles apprises, indiquant la dérive poltentiale.
Les métriques de dérive traditionnelles qui se concentrent sur Caractéristiques individuelles ou relations par paireCapture Autoencoder Déplexénisces complexes et non linéaires ACRSSS plusieurs variables simples.
Iplementation Python:
ref_features = ref_data(numeric_cols + categorical_cols)
prod_features = prod_data(numeric_cols + categorical_cols)
# Normalize the data
scaler = StandardScaler()
ref_scaled = scaler.fit_transform(ref_features)
prod_scaled = scaler.transform(prod_features)
# Split reference data into train and validation
np.random.shuffle(ref_scaled)
train_size = int(0.8 * len(ref_scaled))
train_data = ref_scaled(:train_size)
val_data = ref_scaled(train_size:)
# Build autoencoder
input_dim = ref_features.shape(1)
encoding_dim = 3
# Input layer
input_layer = Input(shape=(input_dim, ))
# Encoder
encoded = Dense(8, activation="relu")(input_layer)
encoded = Dense(encoding_dim, activation="relu")(encoded)
# Decoder
decoded = Dense(8, activation="relu")(encoded)
decoded = Dense(input_dim, activation="linear")(decoded)
# Autoencoder
autoencoder = Model(input_layer, decoded)
autoencoder.compile(optimizer="adam", loss="mse")
# Train autoencoder
history = autoencoder.fit(
train_data, train_data,
epochs=50,
batch_size=64,
shuffle=True,
validation_data=(val_data, val_data),
verbose=0
)
# Calculate reconstruction error
ref_pred = autoencoder.predict(ref_scaled, verbose=0)
prod_pred = autoencoder.predict(prod_scaled, verbose=0)
ref_mse = np.mean(np.power(ref_scaled - ref_pred, 2), axis=1)
prod_mse = np.mean(np.power(prod_scaled - prod_pred, 2), axis=1)
Les graphiques ci-dessous montrent la distribution de la perte de reconstruction entre les deux données.

L’erreur de reconstruction moyenne élevée du produit que le thaot de l’ensemble de données de référence, indiquant un changement dans les données globales. Cela a une émission avec les Chamges dans les oreilles dans la base de données de données de probtion sur le nombre de nebouts avec des trandsss de Hight.
Sumparier
La surveillance des modèles est essentielle, mais les huiles ignorent, la reproronibilité pour les sciences des données et les ingénieurs d’apprentissage automatique.
Toutes les méthodes statistiques ont conduit à la même conclusion, ce qui a argument Affaire dans la production Towads Maching en mouvement plus récent. Ce changement entraîne des scores de modèle Highter, signifiant une augmentation de la fraude à la poéantie.
Dans donc un post, j’ai couvert des techniques pour détester la dérive à trois niveaux différents:
- Drift du score du modèle: En utilisant Stabulation des stabulations populaires (Psi)
- Dérive des caractéristiques individuelles: EN UTILISANT Kolmogorov-smirnovt pour les fonctionnalités numériques et Test du chi carré Pour les caractéristiques catégorielles
- Dérive multivariée: EN UTILISANT Spearman Corallation pour une interactation pure Autoencoders Pour les décalages multivariés de haute duature.
L’ara yep, juste pour la famt du technius que je relie pour pour plus de komegs totalisant – il y a des statistiques également valides qui ne peuvent pas détecter la dérive.
Les décalages détectés soulignent souvent des ISSSE sous-jacentes qui garantissent une enquête de quatre ans. La cause profonde pourrait être aussi grave qu’un bug de collecte de données, OMOR que le temps de rallongement du temps de changement de temps ajoute.
Tho sont également des packages Python fantastiques, comme Devisely.aiqui automatise de nombreux fils jeudi. Cependant, je pense que la valeur significative de laset pour sous-estimer profondément la technique statistique, plutôt que la sotection de relance, Rether que les outils.
Quel est le processus de surveillance des modèles comme dans les endroits où vous avez corned?
Vous voulez vos compétences?
👉🏻 Je dirige le AI Weekier et Rédiger des articles de blog hebdomadaires sur les projets de la science des données, les projets des week-ends de l’IA, des conseils de carrière pour les professionnels des données.
Ressources
Source link