Supposons que je travaille sur un problème de classification. (La détection de fraude et le spam de commentaires sont deux problèmes sur lesquels je travaille actuellement, mais je suis curieux de savoir quelle tâche de classement en général.)
Comment savoir quel classificateur utiliser?
Dans quels cas l’un d’eux est-il le premier choix "naturel", et quels sont les principes pour le choisir?
Exemples de type de réponses que je recherche (extrait de Manning et al., Intitulé: Introduction à la recherche d'informations book):
une. Si vos données sont étiquetées, mais que vous n'en avez qu'une quantité limitée, vous devez utiliser un classificateur à biais élevé (par exemple, Naive Bayes).
J'imagine que cela est dû au fait qu'un variateur à biais plus élevé aura une variance plus faible, ce qui est bien en raison du petit nombre de données.
b. Si vous avez une tonne de données, le classificateur n'a pas vraiment d'importance. Vous devriez donc probablement simplement choisir un classificateur avec une bonne évolutivité.
Quelles sont les autres lignes directrices? Même des réponses telles que "si vous devez expliquer votre modèle à un membre de la direction, vous devriez peut-être utiliser un arbre de décision, car les règles de décision sont assez transparentes" sont bonnes. Je me soucie moins des problèmes de mise en œuvre/bibliothèque, cependant.
En outre, pour une question un peu distincte, à part les classificateurs bayésiens standard, existe-t-il des méthodes «de pointe standard» pour la détection du spam de commentaires (par opposition au spam de courrier électronique)?
Tout d'abord, vous devez identifier votre problème. Cela dépend du type de données dont vous disposez et de la tâche souhaitée.
Si vous êtes
Predicting Category
:
- Vous avez
Labeled Data
- Vous devez suivre
Classification Approach
et ses algorithmes- Vous n'avez pas
Labeled Data
- Vous devez aller pour
Clustering Approach
Si vous êtes
Predicting Quantity
:
- Vous devez aller pour
Regression Approach
Autrement
- Vous pouvez aller pour
Dimensionality Reduction Approach
Il existe différents algorithmes dans chaque approche mentionnée ci-dessus. Le choix d'un algorithme particulier dépend de la taille de l'ensemble de données.
Source: http://scikit-learn.org/stable/tutorial/machine_learning_map/
Sélection du modèle using validation croisée peut être ce dont vous avez besoin.
Vous devez simplement diviser votre jeu de données en k sous-ensembles (plis) non chevauchants, former un modèle à l'aide de k-1 plis et prévoir ses performances en utilisant le pli que vous avez laissé de côté. C’est ce que vous faites pour chaque combinaison de plis possible (laissez tout d’abord le 1er pli, puis le 2e, ..., puis le kth et entraînez-vous avec les plis restants). Après avoir terminé, vous estimez la performance moyenne de tous les plis (peut-être aussi la variance/écart type de la performance).
Comment choisir le paramètre k dépend du temps dont vous disposez. Les valeurs habituelles pour k sont 3, 5, 10 ou même N, N étant la taille de vos données (identique à la validation croisée leave-one-out). Je préfère 5 ou 10.
Supposons que vous disposez de 5 méthodes (ANN, SVM, KNN, etc.) et de 10 combinaisons de paramètres pour chaque méthode (en fonction de la méthode). Vous devez simplement exécuter une validation croisée pour chaque combinaison de méthode et de paramètre (5 * 10 = 50) et sélectionner le meilleur modèle, la meilleure méthode et les meilleurs paramètres. Ensuite, vous vous entraînez de nouveau avec la meilleure méthode et les meilleurs paramètres pour toutes vos données et vous avez votre modèle final.
Il y a encore d'autres choses à dire. Si, par exemple, vous utilisez beaucoup de méthodes et de combinaisons de paramètres pour chacune, il est très probable que vous sur-ferez. Dans de tels cas, vous devez utiliser la validation croisée nested.
Dans nested cross validation, vous effectuez une validation croisée sur l'algorithme de sélection de modèle.
Encore une fois, vous divisez d’abord vos données en k plis. Après chaque étape, vous choisissez k-1 comme données d’entraînement et le dernier comme données de test. Ensuite, vous exécutez la sélection de modèle (procédure décrite précédemment) pour chaque combinaison possible de ces k plis. Une fois cette opération terminée, vous aurez k modèles, un pour chaque combinaison de plis. Ensuite, testez chaque modèle avec les données de test restantes et choisissez le meilleur. De nouveau, après avoir eu le dernier modèle, vous en entraînez un nouveau avec la même méthode et les mêmes paramètres pour toutes vos données. C'est ton dernier modèle.
Bien sûr, il existe de nombreuses variantes de ces méthodes et d’autres choses que je n’ai pas mentionnées. Si vous avez besoin de plus d'informations à ce sujet, recherchez des publications sur ces sujets.
Le livre "OpenCV" contient deux excellentes pages à ce sujet sur pages 462-463. En recherchant le mot "discriminant" dans l'aperçu Amazon (probablement aussi dans Google livres), vous pourrez voir les pages en question. Ces deux pages sont le plus grand bijou que j'ai trouvé dans ce livre.
En bref:
Boosting - souvent efficace quand une grande quantité de données d'entraînement est disponible.
Arbres aléatoires - souvent très efficaces et peuvent également effectuer régression.
K-voisins les plus proches - chose la plus simple que vous puissiez faire, souvent efficace mais lent et nécessite beaucoup de mémoire.
Réseaux de neurones - Lent à former mais très rapide à exécuter, toujours performant pour la reconnaissance lettre.
SVM - Parmi les meilleurs avec données limitées, mais perdant contre les arbres boostants ou aléatoires uniquement lorsque des ensembles de données volumineux sont disponibles.
Voici des éléments à prendre en compte pour choisir l’algorithme à utiliser:
Avez-vous besoin de former progressivement (par opposition à batch)?
Si vous devez mettre à jour votre classificateur avec de nouvelles données fréquemment (ou si vous avez des tonnes de données), vous voudrez probablement utiliser Bayesian. Les réseaux neuronaux et SVM doivent travailler sur les données d'entraînement en une fois.
Vos données sont-elles composées de catégorique seulement, ou numérique seulement, ou les deux ?
Je pense que Bayesian fonctionne mieux avec des données catégoriques/binomiales. Les arbres de décision ne peuvent pas prédire les valeurs numériques.
Est-ce que vous ou votre public devez comprendre comment fonctionne le classificateur?
Utilisez des arbres bayésiens ou de décision, car ils peuvent être facilement expliqués à la plupart des gens. Les réseaux de neurones et les SVM sont des "boîtes noires" dans le sens où vous ne pouvez pas vraiment voir comment ils classent les données.
De combien vitesse de classification avez-vous besoin?
Les SVM sont rapides en matière de classification car ils doivent seulement déterminer de quel côté de la "ligne" se trouvent vos données. Les arbres de décision peuvent être lents surtout quand ils sont complexes (par exemple beaucoup de branches).
Complexité .
Les réseaux neuronaux et les SVM peuvent gérer une classification non linéaire complexe.
Comme le dit souvent le professeur Andrew Ng: commencez toujours par implémenter un algorithme approximatif , puis affinez-le de manière itérative .
Pour la classification, Naive Bayes est un bon débutant, car il offre de bonnes performances, est très évolutif et peut s’adapter à presque tous les types de tâches de classification. Aussi 1NN (K-voisins les plus proches avec un seul voisin) est un algorithme de meilleur ajustement sans tracas (car les données seront le modèle, et donc vous ne vous souciez pas de l'ajustement de la dimensionnalité de votre limite de décision), le seul problème est le coût de calcul (quadratique car vous devez calculer la matrice de distance, elle ne convient donc peut-être pas aux données de grande dimension).
Un autre bon algorithme de démarrage est le forêts aléatoires (composé d’arbres de décision). Il est hautement extensible à un nombre quelconque de dimensions et présente des performances généralement tout à fait acceptables. Enfin, il existe des algorithmes génétiques qui s'adaptent admirablement à toute dimension et à toutes les données avec une connaissance minimale des données elles-mêmes, avec le plus simple et le plus simple l'implémentation étant le algorithme génétique microbien (une seule ligne de code C par Inman Harvey en 1996), et l'un des plus complexes étant CMA-ES et MOGA/e-MOEA.
Et rappelez-vous que, souvent, vous ne savez pas vraiment ce qui fonctionnera le mieux avec vos données avant d’essayer réellement les algorithmes.
En passant, si vous voulez un cadre théorique pour tester votre hypothèse et vos algorithmes de performances théoriques pour un problème donné, vous pouvez utiliser le cadre d’apprentissage PAC (Probablement approximativement correct) (attention: c’est très abstrait et complexe!), mais pour résumer, l’essentiel de l’apprentissage PAC dit que vous devez utiliser l’algorithme moins complexe, mais suffisamment complexe (la complexité étant la dimensionnalité maximale que l’algo peut s’adapter) qui puisse s’adapter à vos données. En d'autres termes, utilisez le rasoir d'Occam.
Sam Roweis avait l'habitude de dire que vous devriez essayer Bayes naïf, régression logistique, k-voisin le plus proche et discriminant linéaire de Fisher avant toute chose.
Mon point de vue est que vous exécutez toujours les classificateurs de base en premier pour avoir une idée de vos données. Plus souvent qu'autrement (du moins selon mon expérience), ils ont été assez bons.
Donc, si vous avez des données supervisées, formez un classificateur Naive Bayes. Si vous avez des données non supervisées, vous pouvez essayer le clustering k-means.
Une autre ressource est l’une des vidéos de lecture de la série de vidéos Stanford Machine Learning , que j’ai regardée il ya quelque temps. Je pense que dans la vidéo 4 ou 5, le conférencier discute de certaines conventions généralement acceptées lors de la formation de classificateurs, d'avantages/compromis, etc.
Vous devriez toujours garder en compte le inférence vs prédiction échange.
Si vous souhaitez comprendre la relation complexe qui se produit dans vos données, utilisez un algorithme d’inférence riche (par exemple, une régression linéaire ou un lasso). D'un autre côté, si vous êtes uniquement intéressé par le résultat, vous pouvez utiliser des algorithmes de grande dimension et plus complexes (mais moins interprétables), comme les réseaux de neurones.
Tout d’abord, cela dépend du type de problème auquel vous faites face, qu’il s’agisse de classification ou de régression. Ensuite, choisissez judicieusement votre modèle. Cela dépend d'un modèle particulier, un modèle spécifique surperformant d'autres modèles. Supposons que vous travaillez sur wine_dataset à partir de la bibliothèque sklearn et que vous avez d'abord essayé de former les données avec svm de noyau avec linear et que vous obteniez une sorte de précision. Ensuite, vous pensez que cela n'est pas satisfaisant. Vous avez donc essayé de former vos données avec DecisionTreeClassifier et puis vous avez essayé avec RandomForestClassifier (). Après cela, quelle que soit la précision qui sera meilleure ou si vous pouvez dire que cela correspond à vos données, vous pouvez le conclure. Il y a une si petite différence syntaxique que vous trouverez tout en continuant à changer de modèle pour les tests. Alors tout le monde comprend bien le problème.