À l'étranger, l'utilisation de l'intelligence artificielle dans l'industrie pour
la maintenance prédictive de divers systèmes gagne de plus en plus en popularité. Le but de cette technique est d'identifier les dysfonctionnements dans le fonctionnement du système pendant la phase de fonctionnement avant qu'il ne tombe en panne pour une réponse rapide.
Quelle est la pertinence de cette approche dans notre pays et en Occident? La conclusion peut être faite, par exemple, sur des articles sur Habré et dans Medium. Il n'y a presque pas d'articles sur Habré sur la résolution des problèmes de maintenance prédictive. Sur Medium, il y a tout un ensemble. Ici,
ici et
ici, il
est bien décrit quels sont les objectifs et les avantages de cette approche.
De cet article, vous apprendrez:
- pourquoi cette technique est-elle nécessaire
- quelles approches d'apprentissage automatique sont plus couramment utilisées pour la maintenance prédictive,
- comment j'ai essayé l'une des astuces avec un exemple simple.
SourceQuelles sont les fonctionnalités du service prédictif?
- un processus maîtrisé de travaux de réparation, qui est effectué selon les besoins, permettant ainsi d'économiser de l'argent, et sans précipitation, ce qui améliore la qualité de ces travaux;
- identification d'un dysfonctionnement spécifique dans le fonctionnement de l'équipement (la possibilité d'acheter une pièce spécifique pour le remplacement lorsque l'équipement fonctionne offre d'énormes avantages)
- optimisation du fonctionnement des équipements, des charges, etc.
- réduction des coûts pour l'arrêt régulier des équipements.
Le
prochain article sur Medium décrit bien les questions auxquelles il faut répondre afin de comprendre comment aborder cette question dans un cas particulier.
Lors de la collecte de données ou lors du choix de données pour construire un modèle, il est important de répondre à trois groupes de questions:
- Peut-on prévoir tous les problèmes du système? Quelle prédiction est particulièrement importante?
- Qu'est-ce qu'un processus d'échec? Le système entier cesse-t-il de fonctionner ou le mode de fonctionnement change-t-il seulement? S'agit-il d'un processus rapide, d'une dégradation instantanée ou progressive?
- Les performances du système reflètent-elles correctement ses performances? Se rapportent-ils à des parties individuelles du système ou au système dans son ensemble?
Il est également important de comprendre à l'avance ce que vous voulez prédire, ce qui est possible de prédire et ce qui ne l'est pas.
L'article sur Medium répertorie également les questions qui vous aideront à déterminer votre objectif spécifique:
- Que faut-il prévoir? La durée de vie restante, comportement anormal ou non, la probabilité d'échec dans les N prochaines heures / jours / semaines?
- Y a-t-il suffisamment de données historiques?
- Sait-on quand le système a donné des relevés anormaux et quand non. Est-il possible de marquer de telles indications?
- Jusqu'où le modèle doit-il voir? Quel est le degré d'indépendance des lectures reflétant le fonctionnement du système dans l'intervalle d'une heure / jour / semaine
- De quoi avez-vous besoin pour optimiser? Le modèle doit-il détecter autant de violations que possible, tout en émettant une fausse alarme, ou suffit-il d'attraper plusieurs événements sans faux positifs?
Il est à espérer que la situation s'améliorera à l'avenir. Jusqu'à présent, il existe des difficultés dans le domaine de la maintenance prédictive: il existe peu d'exemples de dysfonctionnement du système, ou des moments de dysfonctionnement du système suffisent, mais ils ne sont pas marqués; le processus d'échec est inconnu.
Le principal moyen de surmonter les difficultés de la maintenance prédictive consiste à utiliser
des méthodes de recherche d'anomalies . De tels algorithmes ne nécessitent pas de balisage pour la formation. Pour tester et déboguer des algorithmes, un balisage sous une forme ou une autre est nécessaire. De telles méthodes sont limitées en ce qu'elles ne prédisent pas une défaillance spécifique, mais signalent uniquement une anomalie des indicateurs.
Mais ce n'est déjà pas mal.
SourceLes méthodes
Maintenant, je veux parler de certaines caractéristiques des approches de détection d'anomalies, puis ensemble, nous testerons les capacités de quelques algorithmes simples dans la pratique.
Bien qu'une situation particulière nécessite de tester plusieurs algorithmes pour rechercher des anomalies et choisir le meilleur, il est possible de déterminer certains avantages et inconvénients des principales techniques utilisées dans ce domaine.
Tout d'abord, il est important de comprendre à l'avance quel est le pourcentage d'anomalies dans les données.
Si nous parlons d'une variation de l'approche semi-supervisée (nous étudions uniquement sur des données «normales», et nous travaillons (testons) puis sur des données présentant des anomalies), alors le choix le plus optimal est
la méthode du vecteur support à une classe ( SVM à une classe ) . Lorsque vous utilisez des fonctions de base radiales comme noyau, cet algorithme construit une surface non linéaire autour de l'origine. Plus les données d'entraînement sont propres, mieux cela fonctionne.
Dans d'autres cas, la nécessité de connaître le rapport des points anormaux et "normaux" demeure également - pour déterminer le seuil de coupure.
Si le nombre d'anomalies dans les données est supérieur à 5% et qu'elles sont assez bien séparables de l'échantillon principal, des méthodes de recherche d'anomalies standard peuvent être utilisées.
Dans ce cas, la
méthode de la forêt d'isolement est la plus stable en termes de qualité: la
forêt d'isolement est constituée de données randomisées. Une indication plus caractéristique est plus susceptible d'aller plus loin, tandis que des indicateurs inhabituels se sépareront du reste de l'échantillon dans les premières itérations.
D'autres algorithmes fonctionnent mieux s'ils "cadrent" avec les spécificités des données.
Lorsque les données ont une distribution normale, la
méthode de l'enveloppe elliptique convient, en rapprochant les données avec une distribution normale multidimensionnelle. Moins le point appartient à la distribution, plus il est probable qu'il soit anormal.
Si les données sont présentées de telle manière que la position relative des différents points reflète bien leurs différences, alors les méthodes métriques semblent être un bon choix: par exemple,
k voisins les plus proches, k-ème voisin le plus proche, ABOD (détection des valeurs aberrantes basées sur l'angle) ou LOF (facteur local des valeurs aberrantes) )Toutes ces méthodes suggèrent que les «bons» indicateurs sont concentrés dans une zone d'espace multidimensionnel. Si, parmi les k (ou k-èmes) voisins les plus proches, tout est loin de la cible, alors le point est une anomalie. Pour ABOD, le raisonnement est similaire: si tous les k points les plus proches sont dans le même secteur d'espace par rapport à celui considéré, alors le point est une anomalie. Pour LOF: si la densité locale (prédéterminée pour chaque point par k voisins les plus proches) est inférieure à celle des k voisins les plus proches, alors le point est une anomalie.
Si les données sont bien regroupées, les
méthodes basées sur l'analyse des clusters sont un bon choix. Si le point est équidistant des centres de plusieurs grappes, il est alors anormal.
Si les directions de la plus grande variation de variance sont bien distinguées dans les données, alors il semble être un bon choix pour
rechercher des anomalies en se basant sur la méthode des composantes principales . Dans ce cas, les écarts par rapport à la valeur moyenne pour n1 (les composants les plus «principaux») et n2 (le moins «principal») sont considérés comme une mesure d'anomalie.
Par exemple, il est suggéré d'examiner l'ensemble de données de
The Prognostics and Health Management Society (PHM Society) . Cette organisation à but non lucratif organise des concours chaque année. En 2018, par exemple,
il était nécessaire de prévoir les erreurs de fonctionnement et le temps avant la panne de l'usine de gravure par faisceau d'ions . Nous prendrons l'
ensemble de données pour 2015 . Il contient les lectures de plusieurs capteurs pour 30 installations (échantillon de formation) et il est nécessaire de prévoir quand et quelle erreur se produira.
Je n'ai pas trouvé les réponses pour l'échantillon de test sur le réseau, donc nous ne jouerons qu'avec celui de formation.
En général, tous les paramètres sont similaires, mais diffèrent, par exemple, par le nombre de composants, le nombre d'anomalies, etc. Par conséquent, l'apprentissage dans les 20 premiers et les tests dans d'autres n'ont pas beaucoup de sens.
Nous allons donc choisir l'une des installations, la charger et jeter un œil à ces données. L'article ne traitera pas de l'
ingénierie des fonctionnalités , donc nous ne nous attarderons pas beaucoup.
import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns from sklearn.covariance import EllipticEnvelope from sklearn.neighbors import LocalOutlierFactor from sklearn.ensemble import IsolationForest from sklearn.svm import OneClassSVM dfa=pd.read_csv('plant_12a.csv',names=['Component number','Time','S1','S2','S3','S4','S1ref','S2ref','S3ref','S4ref']) dfa.head(10)

Comme vous pouvez le voir, il y a sept composants pour chacun desquels il y a des lectures de quatre capteurs qui sont prises toutes les 15 minutes. S1ref-S4ref dans la description de la compétition sont répertoriés comme valeurs de référence, mais les valeurs sont très différentes des lectures des capteurs. Afin de ne pas perdre de temps à réfléchir à leur signification, nous les supprimons. Si vous regardez la distribution des valeurs pour chaque entité (S1-S4), il s'avère que les distributions sont continues pour S1, S2 et S4 et discrètes pour S3. De plus, si vous regardez la distribution conjointe de S2 et S4, il s'avère qu'elles sont inversement proportionnelles.
Bien qu'un écart par rapport à une dépendance directe puisse indiquer une erreur, nous ne vérifierons pas cela, mais supprimerons simplement S4.
Encore une fois, nous traitons l'ensemble de données. Quittez S1, S2 et S3. Nous mettons à l'échelle S1 et S2 avec StandardScaler (nous soustrayons la moyenne et divisons par l'écart-type), traduisons S3 en OHE (One Hot Encoding). Nous cousons les lectures de tous les composants d'installation sur une seule ligne. Total 89 fonctionnalités. 2 * 7 = 14 - lectures S1 et S2 pour 7 composants et 75 valeurs uniques de R3. Seulement 56 mille lignes de ce type.
Téléchargez le fichier contenant des erreurs.
dfc=pd.read_csv('plant_12c.csv',names=['Start Time', 'End Time','Type']) dfc.head()
Avant d'essayer ces algorithmes sur notre jeu de données, je me permettrai une autre petite digression. Vous devez être testé. Pour cela, il est proposé de prendre l'heure de début de l'erreur et l'heure de fin. Et toutes les indications à l'intérieur de cet intervalle sont considérées comme anormales et à l'extérieur - normales. Cette approche présente de nombreux inconvénients. Mais surtout, un comportement anormal se produit très probablement avant que l'erreur ne soit corrigée. Pour la fidélité, déplaçons la fenêtre des anomalies il y a une demi-heure dans le temps. Nous évaluerons la mesure F1, la précision et le rappel.
Le code pour distinguer les caractéristiques et déterminer la qualité du modèle:
def load_and_preprocess(plant_num):
Résultats des tests pour des algorithmes de recherche d'anomalies simples sur l'ensemble de données PHM 2015 Data ChallengeRetour aux algorithmes. Essayons One Class SVM (OCSVM), IsolationForest (IF), EllipticEnvelope (EE) et LocalOutlierFactor (LOF) sur nos données. Pour commencer, nous ne définirons aucun paramètre. Je note que LOF peut fonctionner dans deux modes. Si novelty = False ne peut rechercher des anomalies que dans l'ensemble d'apprentissage (il n'y a que fit_predict), si True, alors il vise à rechercher des anomalies en dehors de l'ensemble d'apprentissage (peut s'adapter et prédire séparément). IF a un mode de comportement ancien et nouveau. Nous utilisons de nouveaux. Il donne de meilleurs résultats.
OCSVM détecte bien les anomalies, mais il y a trop de faux positifs. Pour d'autres méthodes, le résultat est encore pire.
Mais supposons que nous connaissions le pourcentage d'anomalies dans les données. Dans notre cas, 27%. OCSVM a nu - l'estimation supérieure pour le pourcentage d'erreurs et la plus faible pour le pourcentage de vecteurs de support. D'autres méthodes de contamination ont un pourcentage d'erreurs de données. Dans les méthodes IF et LOF, il est déterminé automatiquement, tandis que pour OCSVM et EE, il est défini sur 0,1 par défaut. Essayons de définir la contamination (nu) à 0,27. Maintenant le meilleur résultat pour EE.
Code de vérification des modèles:
def check_model(model,df_train,df_test,filt='S[123]'): model_type,model = model model.fit(df_train.drop('Time',axis=1).filter(regex=(filt))) y_preds = pd.Series(model.predict(df_test.drop(['Time','Label'],axis=1).filter(regex=(filt)))).map({-1:1,1:0}) print('F1 score for {}: {:.3f}'.format(model_type,f1_score(df_test['Label'],y_preds))) print('Precision score for {}: {:.3f}'.format(model_type,precision_score(df_test['Label'],y_preds))) print('Recall score for {}: {:.3f}'.format(model_type,recall_score(df_test['Label'],y_preds))) score = model.decision_function(df_test.drop(['Time','Label'],axis=1).filter(regex=(filt))) sns.distplot(score[df_test['Label']==0]) sns.distplot(score[df_test['Label']==1]) plt.title('Decision score distribution for {}'.format(model_type)) plt.show()
Il est intéressant de regarder la distribution des indicateurs d'anomalie pour différentes méthodes. On peut voir que LOF ne fonctionne pas bien pour ces données. EE a des points que l'algorithme considère comme extrêmement anormaux. Cependant, les points normaux y tombent. IsoFor et OCSVM montrent que le choix du seuil de coupure (contamination / nu) est important, ce qui changera le compromis entre précision et exhaustivité.
Il est logique que les lectures des capteurs aient une distribution proche de la normale, proche des valeurs stationnaires. Si nous avons vraiment un échantillon de test étiqueté, et de préférence également un échantillon de validation, alors la valeur de contamination peut être teintée. La question suivante est, quelles erreurs sont plus orientées: faux positif ou faux négatif?
Le résultat LOF est très faible. Pas très impressionnant. Mais rappelez-vous que les variables OHE vont à l'entrée avec les variables transformées par StandardScaler. Et les distances par défaut sont euclidiennes. Mais si vous ne comptez que les variables selon S1 et S2, la situation est corrigée et le résultat est comparable avec d'autres méthodes. Il est toutefois important de comprendre que l'un des paramètres clés des classificateurs de mesures répertoriés est le nombre de voisins. Cela affecte considérablement la qualité et doit être réglé. La mesure de la distance elle-même serait également intéressante à saisir.
Essayez maintenant de combiner les deux modèles. Au début d'un, nous supprimons les anomalies de l'ensemble d'entraînement. Et puis nous formerons OCSVM sur un ensemble de formation «plus propre». Selon les résultats précédents, nous avons observé la plus grande exhaustivité en EE. Nous effaçons l'échantillon de formation via EE, formons OCSVM dessus et obtenons F1 = 0,50, Précision = 0,34, exhaustivité = 0,95. Pas impressionnant. Mais nous venons de demander nu = 0,27. Et les données dont nous disposons sont plus ou moins «propres». Si nous supposons que la plénitude de l'EE sur l'échantillon d'apprentissage est la même, alors 5% des erreurs resteront. Nous nous fixons un tel nu et obtenons F1 = 0,69, Précision = 0,59, exhaustivité = 0,82. Super. Il est important de noter que dans d'autres méthodes, une telle combinaison ne fonctionnera pas, car elles impliquent que le nombre d'anomalies dans l'ensemble d'apprentissage et le numéro de test sont les mêmes. Lors de la formation de ces méthodes sur un ensemble de données de formation pur, vous devrez spécifier moins de contamination que dans les données réelles et pas proche de zéro, mais il est préférable de le sélectionner pour une validation croisée.
Il est intéressant de regarder le résultat de la recherche sur la séquence des indications:

La figure montre un segment des lectures des premier et deuxième capteurs pour 7 composants. Dans la légende, la couleur des erreurs correspondantes (le début et la fin sont indiqués par des lignes verticales de la même couleur). Les points indiquent les prédictions: vert - prédictions vraies, rouge - faux positif, violet - faux négatif. On peut voir sur la figure qu'il est difficile de déterminer visuellement le temps d'erreur, et l'algorithme gère assez bien cette tâche. Bien qu'il soit important de comprendre que les lectures du troisième capteur ne sont pas données ici. De plus, il y a des lectures faussement positives après la fin de l'erreur. C'est-à-dire l'algorithme voit qu'il existe également des valeurs erronées, et nous avons marqué cette zone comme sans erreur. Le côté droit de la figure montre la zone avant l'erreur, que nous avons marquée comme erronée (une demi-heure avant l'erreur), qui a été reconnue comme sans erreur, ce qui conduit à des erreurs de modèle faussement négatives. Au centre de la figure, une pièce cohérente est reconnue, reconnue comme une erreur. La conclusion peut être tirée comme suit: lors de la résolution du problème de recherche d'anomalies, vous devez interagir étroitement avec des ingénieurs qui comprennent l'essence des systèmes dont vous devez prédire la sortie, car la vérification des algorithmes utilisés sur le balisage ne reflète pas pleinement la réalité et ne simule pas les conditions dans lesquelles ces algorithmes pourraient être utilisé.
Code pour tracer le graphique:
def plot_time_course(df_test,dfc,y_preds,start,end,vert_shift=4): plt.figure(figsize=(15,10)) cols=df_train.filter(regex=('S[12]')).columns add=0 preds_idx=y_preds.iloc[start:end][y_preds[0]==1].index true_idx=df_test.iloc[start:end,:][df_test['Label']==1].index tp_idx=set(true_idx.values).intersection(set(preds_idx.values)) fn_idx=set(true_idx.values).difference(set(preds_idx.values)) fp_idx=set(preds_idx.values).difference(set(true_idx.values)) xtime=df_test['Time'].iloc[start:end] for col in cols: plt.plot(xtime,df_test[col].iloc[start:end]+add) plt.scatter(xtime.loc[tp_idx].values,df_test.loc[tp_idx,col]+add,color='green') plt.scatter(xtime.loc[fn_idx].values,df_test.loc[fn_idx,col]+add,color='violet') plt.scatter(xtime.loc[fp_idx].values,df_test.loc[fp_idx,col]+add,color='red') add+=vert_shift failures=dfc[(dfc['Start Time']>xtime.iloc[0])&(dfc['Start Time']<xtime.iloc[-1])] unique_fails=np.sort(failures['Type'].unique()) colors=np.array([np.random.rand(3) for fail in unique_fails]) for fail_idx in failures.index: c=colors[np.where(unique_fails==failures.loc[fail_idx,'Type'])[0]][0] plt.axvline(failures.loc[fail_idx,'Start Time'],color=c) plt.axvline(failures.loc[fail_idx,'End Time'],color=c) leg=plt.legend(unique_fails) for i in range(len(unique_fails)): leg.legendHandles[i].set_color(colors[i])
Si le pourcentage d'anomalies est inférieur à 5% et / ou si elles sont mal séparées des indicateurs «normaux», les méthodes ci-dessus fonctionnent mal et il vaut la peine d'utiliser des algorithmes basés sur des réseaux de neurones. Dans le cas le plus simple, ce serait:
- encodeurs automatiques (une erreur élevée d'un encodeur automatique formé signalera une anomalie dans la lecture);
- réseaux récurrents (apprentissage par séquence pour prédire la dernière lecture. Si la différence est grande - le point est anormal).
Séparément, il convient de noter les spécificités du travail avec les séries chronologiques. Il est important de comprendre que la plupart des algorithmes ci-dessus (à l'exception des encodeurs automatiques et des forêts isolantes) donneront très probablement une qualité inférieure lors de l'ajout de fonctionnalités de décalage (lectures des points précédents).
Essayons d'ajouter des fonctionnalités de décalage dans notre exemple. La description du concours indique que les valeurs 3 heures avant l'erreur ne sont en aucun cas liées à l'erreur. Ajoutez ensuite les panneaux en 3 heures. 259 signes au total.
En conséquence, les résultats pour OCSVM et IsolationForest sont restés presque inchangés, tandis que ceux pour Elliptic Envelope et LOF ont chuté.
Pour utiliser les informations sur la dynamique du système, des auto-encodeurs avec des réseaux de neurones récurrents ou convolutionnels doivent être utilisés. Ou, par exemple, une combinaison d'auto-encodeurs, de compression d'informations et d'approches conventionnelles pour rechercher des anomalies sur la base d'informations compressées. L'approche inverse semble également prometteuse. Dépistage primaire des points les plus inhabituels par des algorithmes standard, puis formation de l'auto-encodeur déjà sur des données plus propres.
SourceIl existe un ensemble de techniques pour travailler avec des séries chronologiques unidimensionnelles. Tous visent à prédire les lectures futures, et les points qui s'écartent de la prédiction sont considérés comme des anomalies.
Triple lissage exponentiel, divise la série en 3 composantes: niveau, tendance et saisonnalité. Par conséquent, si la série est présentée sous cette forme, la méthode fonctionne bien. Facebook Prophet fonctionne sur un principe similaire, mais évalue les composants eux-mêmes d'une manière différente. Plus de détails peuvent être lus, par exemple,
ici .
S (ARIMA)
Dans cette méthode, le modèle prédictif est basé sur l'autorégression et la moyenne mobile. Si nous parlons de l'expansion de S (ARIMA), cela nous permet d'évaluer la saisonnalité. En savoir plus sur l'approche
ici ,
ici et
ici .
Autres approches de services prédictifs
En ce qui concerne les séries chronologiques et les informations sur les heures d'occurrence des erreurs, vous pouvez appliquer des méthodes d'enseignement avec un enseignant. Outre le besoin de données balisées, dans ce cas, il est important de comprendre que la prédiction d'erreur dépendra de la nature de l'erreur. S'il y a beaucoup d'erreurs et de nature différente, il sera probablement nécessaire de prévoir chacune séparément, ce qui nécessitera des données encore plus étiquetées, mais les perspectives seront plus attrayantes.
Il existe d'autres façons d'utiliser l'apprentissage automatique dans la maintenance prédictive. Par exemple, prédire une défaillance du système dans les N prochains jours (tâche de classification). Il est important de comprendre qu'une telle approche nécessite que la survenue d'une erreur dans le fonctionnement du système soit précédée d'une période de dégradation (pas forcément progressive). Dans ce cas, l'approche la plus réussie semble être l'utilisation de réseaux de neurones avec des couches convolutionnelles et / ou récurrentes. Séparément, il convient de noter les méthodes d'augmentation des séries chronologiques.
Deux approches me semblent les plus intéressantes et en même temps simples:
- la partie continue de la ligne est sélectionnée (par exemple, 70% et le reste est supprimé) et étirée à la taille d'origine
- une partie continue de la rangée (par exemple, 20%) est sélectionnée et étirée ou compressée. Après cela, la ligne entière est compressée ou étirée en conséquence à sa taille d'origine.
Il existe également une option pour prédire la durée de vie restante du système (tâche de régression). Ici, nous pouvons distinguer une approche distincte: la prédiction n'est pas de la durée de vie, mais des paramètres de distribution de Weibull.
Vous pouvez lire sur la distribution elle-même
ici , et
ici sur son utilisation en conjonction avec des maillages récurrents. Cette distribution a deux paramètres α et β. α indique quand l'événement se produira et β indique le degré de confiance de l'algorithme. Bien que l'application de cette approche soit prometteuse, des difficultés surviennent dans la formation du réseau neuronal dans ce cas, car il est plus facile pour l'algorithme d'être précaire au début que de prédire une durée de vie adéquate.
Séparément, il convient de noter la
régression de Cox . Il vous permet de prédire la tolérance aux pannes du système pour chaque instant dans le temps après le diagnostic, en le présentant comme un produit de deux fonctions. Une fonction est la dégradation du système, indépendamment de ses paramètres, c'est-à-dire commun à ces systèmes. Et le second est une dépendance exponentielle des paramètres d'un système particulier. Donc, pour une personne, il y a une fonction commune associée au vieillissement, plus ou moins la même pour tout le monde. Mais la détérioration de la santé est également associée à l'état des organes internes, différent pour chacun.
J'espère que vous en savez maintenant un peu plus sur la maintenance prédictive. Je suis sûr que vous aurez des questions concernant les méthodes d'apprentissage automatique les plus souvent utilisées pour cette technologie. Je serai heureux de répondre à chacun d'eux dans les commentaires. Si vous souhaitez non seulement demander ce qui est écrit, mais souhaitez faire quelque chose de similaire, notre équipe
CleverDATA est toujours ravie de professionnels talentueux et enthousiastes.
Y a-t-il des postes vacants? Bien sûr!