Speed Data Scientist

Prédiction de panne sur des disques durs

Dans cet article, je vais décrire la méthodologie et les astuces que j’utilise dans des cas de prédiction comme l’exercice 3 du concours Speed Data Scientist sur Coder Power. L’article consiste en différentes catégories agrémentées de liens vers des ressources de grande qualité.

Dans cet exercice, vous êtes chargés de prédire si une panne va survenir sur un disque dur dans les 30 jours.

Méthodologie
Il est très important de mettre en place, dès le début, une approche itérative. Essayez
d’avoir un modèle très rapidement et améliorez-le régulièrement tout en vérifiant l’effet sur le résultat.

Vous allez ainsi pouvoir piocher, dans chacune des catégories, pour améliorer votre score. Il est très facile de vouloir un algorithme parfait dès le début et de perdre ainsi beaucoup de temps et d’énergie pour un résultat potentiellement médiocre.

Il est ainsi fortement conseillé d’utiliser un outil de versionning (Git par exemple) durant
votre développement pour enregistrer les modifications. N’hésitez pas à enregistrer votre
score dans les commits pour vous permettre facilement de prendre du recul sur les étapes
ayant eu le plus d’impact sur le résultat.

Je vous conseille ainsi de commencer très simplement : ayez un modèle et proposez des
résultats très rapidement. Ensuite, (si vous avez validé l’exercice, ne quittez pas la fenêtre de coderpower (ou vous ne pourrez plus soumettre de résultats et ) itérez rapidement pour
améliorer votre score. Utilisez les différentes méthodes que j’apporte ci-dessous
unitairement afin de bien comprendre ce qu’elles font et quel impact elles apportent.

Préparer
Les données disponibles sont rarement aussi bien formatées que dans les cas d’école.
Il vous faudra dans un premier temps prendre connaissance des données puis travailler sur les valeurs manquantes.

Vous trouverez ici un très bon article de scikit-learn vous présentant les différentes
préparations de données que vous pouvez / devez réaliser sur vos datasets : http://scikitlearn.org/stable/modules/preprocessing.html (en anglais).

Analyse exploratoire
Faites une analyse exploratoire sur les différentes données et leurs dimensions. Cette
analyse vous permettra de comprendre le type de données, si certaines sont fortement
corrélées, leur répartition. Ce travail vous est demandé étape par étape dans les exercices 1
et 2 mais n’hésitez pas à investir du temps dans cet étape.

Valeurs manquantes
La majorité des modèles ne savent pas gérer les valeurs manquantes, il vous faudra les
remplacer durant la phase de préparation.
Analysez, pour chaque colonne, le nombre de valeurs manquantes. Si ce nombre est faible,
alors vous devrez trouver une méthode à appliquer à ces quelques lignes.

Certains utilisent la moyenne ou la médiane, d’autres utilisent des méthodes bien plus avancées (ressource dans scitkit-learn : http://scikitlearn.org/stable/modules/generated/sklearn.preprocessing.Imputer.html) Dans le cas où la colonne contient trop de valeurs nulles, vous pouvez choisir de la supprimer de votre dataset, elle apporte peut-être trop peu d’information pour être prise en compte.

Rescale

En fonction du modèle que vous choisirez, il vous faudra peut-être modifier ses valeurs pour réduire leur écart-type. La standardization permet d’aligner les valeurs autour d’une gaussienne avec une moyenne nulle.

Scikit-learn vous fournit tous les outils dont vous avez besoin pour réaliser cette étape :
http://scikitlearn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html

Category data
Tous les modèles gèrent à la perfection les mesures continues mais certains ne gèrent pas
nativement les données de catégorie (modèle du disque par exemple). Pour cela, vous allez
devoir transformer cette colonne dans une autre forme qui sera prise en compte par votre
modèle.

Cette méthode s’appelle One Hot Encoding. Elle va transformer votre vecteur de string
« modèle » en n vecteurs booléens, n étant chaque modèle de disque.
Pour limiter le bruit mais aussi améliorer la lecture de votre modèle, vous pouvez limiter n
aux x modèles les plus présents (10 par exemple).
Exemple d’implémentation : http://stackoverflow.com/questions/38978853/onehotencoding-mapping 

Enrichir
Dans cette phase, vous allez chercher à ajouter des informations qui aideront votre modèle
à mieux performer.

Création de feature à partir des existantes
Dans cette méthode, vous allez combiner les features existantes dans votre modèle pour en
créer de nouvelles. Vous pouvez ainsi sommer, multiplier ou diviser des features entre elles pour en créer une autre qui aura portera potentiellement plus d’information.
Vous pouvez également créer des features en utilisant les dates (nombre de jours
d’utilisation par exemple).

Ajout de features externes
Vous pouvez trouver sur internet facilement des statistiques de fiabilité des différents
modèles de disques dur. Ces statistiques peuvent vous permettre d’enrichir votre
algorithme.

Les modèles

Lequel choisir ?
« Tous les modèles sont faux, mais certains sont utiles ».

Ici, pas de bonne méthode. Je ne souhaite surtout pas vous biaiser dans votre choix
d’algorithme. Regardez les différents algorithmes disponibles dans scikit-learn et testez !

Commencez simple et complexifiez vos modèles par la suite.

Avancé : Stacking
Une méthode avancée consiste à utiliser plusieurs algorithmes pour mener à une
prédiction. On peut comparer cette méthode à une random Forest qui génère plusieurs
arbres et qui utilise l’ensemble pour prendre la décision finale, vous pouvez utiliser plusieurs algorithmes sur les mêmes données et utiliser l’ensemble pour avoir la réponse finale. Vous pouvez même pondérer vos différents algorithmes en fonction des résultats pour améliorer votre score.

Cette technique est assez chronophage mais apporte de bons résultats. A conserver
uniquement aux analystes avancés qui souhaitent pousser le problème dans ses
retranchements.

Pièges

Surapprentissage / Overfitting
Le sur apprentissage est causé par un modèle qui serait trop spécialisé sur vos données
d’apprentissage et ne se généralise pas à d’autres cas de données.

C’est le cas principal que vous allez combatre dans l’exercice 3.

Comment détecter que nous sommes dans un cas d’overfitting ?

Comment régler ce problème ?

Plus de données
Il est toujours intéressant d’avoir plus de données. En augmentant les données, vous limitez votre dépendance à votre jeu de données actuel et votre modèle prendra en compte plus de cas.
Il vous sera cependant difficile de trouver des données similaires.

Régularisation
La régularisation permet de modifier le poids des différentes features dans votre modèle
après la phase d’apprentissage.

Il faut, dans tous les cas, que vous suiviez la méthodologie du train / cross validation / test
(http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html) N’utilisez surtout pas les mêmes jeux de données pour apprendre et tester votre modèle.

Article présentant la régularisation : https://datanice.github.io/machine-learning-101-whatis-regularization-interactive.html (anglais)

Tester

Mesurer
Cette étape est la plus importante dans votre processus itératif puisqu’elle vous permet
d’avancer toujours dans la bonne direction à chaque changement.

Confusion matrix
Une matrice de confusion analyse vos résultats sous 4 mesures différentes :

1. Faux positifs : Eléments négatifs attribués positifs par votre modèle
2. Vrai positifs : Eléments positifs attribués positif par votre modèle
3. Faux Négatifs : Eléments positifs attribués négatifs par votre modèle
4. Vrai négatifs : Eléments négatifs attribués négatifs par votre modèle

Le F1 score est calculé à partir de ces élements. Il reprend la « précision » et le « recall ».

Capture d’écran 2017-04-03 à 18.39.04

Le F1 score est la moyenne harmonique de la précision et du rappel (recall).

Il est très important que vous utilisiez le F1 score pour mesurer vos modèles car c’est la
variable qui sera testé lors de votre soumission.

Threshold
Votre modèle vous donnera probablement la probabilité que la ligne soit Positive ainsi que
la probabilité que la ligne soit négative (1 – Proba positif). Il vous faudra ensuite choisir un
seuil au-dessus duquel vous considérerez le disque comme ayant un problème matériel.
Naïvement, nous pouvons mettre cette valeur à 0,5 dans un premier temps.

Quand vous souhaiterez améliorer votre score, tracez la courbe F1-score en fonction de ce
seuil. Cela vous permettra de choisir la valeur optimale pour votre modèle et devrait vous
permettre de gagner quelques points supplémentaires.

Essayez de tracer cette courbe avec votre précision et recall pour mieux comprendre ce que
vous avez amélioré.

Capture d’écran 2017-04-03 à 18.48.43

Figure 1: Exemple dans Dataiku

Itérer
Testez votre code en local, analysez votre score : quelle mesure avez-vous amélioré ?
Pourquoi ?

Soyez futé !
Retraitez vos données avant de les soumettre
Il est possible que votre modèle retourne différentes prédictions pour le même disque en
fonction des jours, même dans les 30 derniers jours. Or, vous savez que la réponse est
binaire : incident ou aucun incident et, ce, uniquement dans les 30 derniers jours.
Retraitez votre fichier de prédiction avant de l’envoyer pour prendre en compte ce côté
binaire. Si le disque est en échec, alors les 30 dernières valeurs seront à 1 et toutes les
précédentes à 0. Evitez de perdre des points en ayant quelques valeurs mal placées.

 

This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>