J'ai trouvé que lui et Garcia (2009) sont une revue utile de l'apprentissage dans les problèmes de classe déséquilibrés. Voici quelques éléments certainement non exhaustifs à considérer:
Approches basées sur les données:
On peut sous-échantillonner la classe majoritaire ou suréchantillonner la classe minoritaire. (Breiman a souligné que cela équivaut formellement à attribuer des coûts de classification erronée non uniformes.) Cela peut poser des problèmes: le sous-échantillonnage peut faire en sorte que l'apprenant rate certains aspects de la classe majoritaire; le suréchantillonnage augmente le risque de sur-ajustement.
Il existe des méthodes de «sous-échantillonnage éclairé» qui réduisent ces problèmes. L'un d'eux est EasyEnsemble , qui échantillonne indépendamment plusieurs sous-ensembles de la classe majoritaire et crée plusieurs classificateurs en combinant chaque sous-ensemble avec toutes les données de la classe minoritaire.
SMOTE (Synthetic Minority Oversampling Technique) ou SMOTEBoost (combinant SMOTE avec boosting) créent des instances synthétiques de la classe minoritaire en faisant des voisins les plus proches dans l'espace des fonctionnalités. SMOTE est implémenté dans R dans le package DMwR (qui accompagne le livre de Luis Torgo «Data Mining with R, learning with case studies» CRC Press 2016 ).
Approches d'ajustement des modèles
Appliquez des pondérations spécifiques à la classe dans votre fonction de perte (pondérations plus importantes pour les cas minoritaires).
Pour les approches basées sur les arbres, vous pouvez utiliser la distance de Hellinger comme fonction d'impureté des nœuds, comme le préconisent Cieslak et al. "Les arbres de décision de distance Hellinger sont robustes et insensibles à l'inclinaison" ( code Weka ici .)
Utilisez un classificateur à une classe , en apprenant (selon le modèle) une densité de probabilité ou une limite pour une classe et en traitant l'autre classe comme des valeurs aberrantes.
Bien sûr, n'utilisez pas la précision comme métrique pour la construction de modèles. Le kappa de Cohen est une alternative raisonnable.
Approches d'évaluation des modèles
Si votre modèle renvoie des probabilités prédites ou d'autres scores, choisissez un seuil de décision qui effectue un compromis approprié en matière d'erreurs (en utilisant un ensemble de données indépendant de la formation et des tests). Dans R, le package OptimalCutpoints implémente un certain nombre d'algorithmes, y compris ceux sensibles au coût, pour décider d'une coupure.
D'après ce que je comprends, il s'agit d'un domaine de recherche actif dans la communauté de l'apprentissage automatique et il n'y a pas de bonnes réponses, mais plutôt un nombre important et croissant de solutions potentielles. Vous obtiendrez probablement de meilleures réponses si vous spécifiez les algorithmes spécifiques que vous envisagez.
Si vous utilisez un modèle paramétrique (régression logistique), cela devrait être moins problématique et vous pouvez simplement faire varier le seuil en fonction de votre fonction de perte (coût des faux négatifs aux faux positifs)
Si vous utilisez des algorithmes d'apprentissage automatique, cela pourrait être plus difficile. Max Kuhn fait une tentative juste de résumer le problème dans le chapitre 16 de "Modélisation prédictive appliquée". Mais un sujet difficile à résumer. Si vous ne voulez pas acheter le livre, le code R est disponible dans le package AppliedPredictiveModeling pour ce chapitre et peut être suffisant en fonction de votre connaissance de R et des algorithmes utilisés.
Habituellement, la discussion tourne autour des algorithmes de sous-échantillonnage / suréchantillonnage +/- sensibles aux coûts. Avec des variations comme jous-boost également possibles.
Un exemple de ce type de discussion: Chen et al «Utilisation de la forêt aléatoire pour apprendre des données déséquilibrées» http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf
la source
Vous pouvez jeter un œil à l'implémentation de scikit-learn. faites attention à l'argument class_ weight qui peut avoir des valeurs d'un dictionnaire de poids de classe ou 'auto':
class sklearn.svm.SVC (C = 1.0, kernel = 'rbf', degree = 3, gamma = 0.0, coef0 = 0.0, rétrécissement = True, probabilité = False, tol = 0.001, cache_size = 200, class_weight = None, verbose = Faux, max_iter = -1, random_state = Aucun)
Vous pouvez jouer avec la valeur de l'argument class_weight qui peut être un dictionnaire de poids de classe ou 'auto'. En mode «auto», l'algorithme d'apprentissage attribuera automatiquement des poids à chaque classe en fonction du nombre d'échantillons dans chacun d'eux.
scikit-learn possède plusieurs autres algorithmes de classification, dont certains acceptent les pondérations de classe.
la source