Supposons que j'ai un classificateur (il pourrait s'agir de n'importe quel classificateur standard comme l'arbre de décision, la forêt aléatoire, la régression logistique, etc.) pour la détection de fraude en utilisant le code ci-dessous
library(randomForest)
rfFit = randomForest(Y ~ ., data = myData, ntree = 400) # A very basic classifier
Say, Y is a binary outcome - Fraud/Not-Fraud
Maintenant, j'ai prédit sur un ensemble de données invisibles .
pred = predict(rfFit, newData)
J'ai ensuite obtenu les commentaires de l'équipe d'enquête sur ma classification et j'ai constaté que j'avais commis une erreur en classant une fraude comme non-fraude (c'est-à-dire un faux négatif ) . Y a-t-il de toute façon que je puisse laisser mon algorithme comprendre qu'il a fait une erreur? c'est-à-dire une façon d'ajouter une boucle de rétroaction à l'algorithme afin qu'il puisse corriger les erreurs?
Une option que je peux penser du haut de ma tête est de construire un adaboost classifier
pour que le nouveau classificateur corrige l'erreur de l'ancien. ou j'ai entendu quelque chose de Incremental Learning
ou Online learning
. Existe-t-il des implémentations (packages) existantes dans R
?
Est-ce la bonne approche? ou Existe-t-il un autre moyen de modifier le modèle au lieu de le construire à partir de zéro?
la source
Réponses:
Une stratégie de boosting peut améliorer les performances de votre modèle, cela vaut donc la peine d'essayer. En ce qui concerne l'apprentissage incrémentiel / en ligne, je ne connais aucun package dans R qui l'implémente (autres, veuillez me corriger si je me trompe). Dans Scikit Learn, il existe des classificateurs hors cœur qui permettent un apprentissage incrémentiel. Cependant, si vous êtes lié à l'utilisation de R, vous n'aurez peut-être pas d'autre choix que d'écrire votre propre modèle incrémentiel. Dans les deux cas, la recherche dans les classificateurs hors cœur de Scikit Learn peut vous donner une idée par où commencer.
Un autre détail à garder à l'esprit est la mesure dans laquelle la mise à jour du modèle sur un seul faux positif ou faux négatif améliorera les performances du modèle. Dans le domaine de la fraude, il y a généralement des milliers à des millions de fois plus de non-fraude que de fraude. En tant que tel, il est important d'essayer d'apprendre à discriminer correctement chaque instance de fraude, mais la mise à jour d'un modèle sur une seule instance de fraude ne changera probablement pas le modèle de manière significative. Envisagez d'autres stratégies pour que le modèle attribue plus d'importance aux cas de fraude.
La façon la plus simple d'améliorer votre modèle supervisé, sur la base des commentaires des enquêteurs humains, serait de construire un modèle distinct des instances corrigées (c'est-à-dire les instances prédites incorrectement qui ont été correctement étiquetées après). Vous pourriez alors faire voter vos deux modèles sur la classification des instances futures en agrégeant leur appartenance à la classe prévue. Par exemple, ModelA peut croire que Instance1 est [Fraude: 0,65, non-fraude: 0,35], tandis que ModelB pense que Instance1 est [Fraude: 0,47, non-fraude: 0,53]. La prédiction de l'ensemble serait donc [Fraude: (0,65 + 0,47) /2=0,56, Non-Fraude: (0,35 + 0,53) /2=0,44].
Si votre modèle d'origine fonctionne mieux que le hasard, le nombre d'instances qu'il classe correctement sera supérieur au nombre incorrectement classé. Ainsi, vous ne voulez pas attribuer un poids égal aux modèles s'ils sont formés sur un nombre disproportionné d'instances. Il existe deux options simples pour gérer cette disparité: 1) attendre jusqu'à ce que vous accumuliez suffisamment d'instances corrigées pour correspondre approximativement au nombre sur lequel le modèle d'origine a été formé, ou 2) attribuer un poids à chaque modèle en fonction de la performance du modèle sur un ensemble de validation.
la source
J'ai fait des recherches dans le passé sur l'apprentissage en ligne et incrémental. Il y a quelques idées dont vous devez tenir compte.
Chaque classificateur peut «faire» un apprentissage incrémental, le seul problème est qu'avec certains, il est beaucoup plus difficile de le faire. Il n'y a pas d'algorithme d'apprentissage incrémental en tant que tel, seulement un moyen de réaliser cet achat en utilisant les algorithmes courants. Normalement, vous en choisiriez un et adapteriez la façon dont vous l'entraînez et alimentez les données soit par lots, soit en ligne.
Vous pouvez le faire de deux manières: a) Réentraînez le modèle à partir de zéro chaque fois qu'un nouvel échantillon (ou un ensemble d'échantillons) arrive. Évidemment, ce n'est pas idéal, mais si votre modèle n'est pas trop complexe (ce qui signifie que vous pouvez effectuer une formation complète entre les instances à venir) et que vous limitez la taille de votre ensemble de données (en supprimant les anciennes données, les nouvelles données ou les données aléatoires et en gardant un nombre constant d'instances de formation ), il peut fonctionner dans certains scénarios. Un bel exemple de cet apprentissage « pseudo-progressive » avec support vector machines peuvent être trouvées ici .
b) Trouvez un moyen de mettre à jour les paramètres / poids de votre modèle en modifiant uniquement «un peu» ces paramètres lorsque la prédiction était erronée. Les réseaux neuronaux sont naturellement parfaits pour cela, car vous pouvez former un modèle, enregistrer les poids puis vous recycler avec de nouveaux lots de données au fur et à mesure. De plus, vous pouvez modifier le taux d'apprentissage pour donner plus / moins de pertinence à vos nouvelles entrées. Si vous pouvez choisir n'importe quel algorithme pour votre cas, ce serait mon choix. Cependant, il existe de nombreuses autres méthodes: par exemple, dans les approches bayésiennes, vous pouvez modifier les distributions en appliquant des incréments / diminutions numériques à certains paramètres (voir ceci pour un autre exemple).
Faites un peu de lecture et recherchez les approches précédentes qui correspondent à ce que vous voulez que votre comportement d'algorithme d'apprentissage. Il peut sembler intimidant au début de tout configurer pour vous-même au lieu d'utiliser telle ou telle bibliothèque, mais cela devient super cool lorsque vous arrivez au point où vous vous sentez responsable de tout le processus d'apprentissage de votre modèle.
Bonne chance!
la source