Question

Scénario


Je cherche à mettre en œuvre l'apprentissage supervisé sur un ensemble de données dans une application Java GUI. L'utilisateur sera donné une liste d'éléments ou « rapports » d'inspecter et de les étiqueter en fonction d'un ensemble d'étiquettes disponibles. Une fois l'apprentissage supervisé est terminé, les cas marqués seront ensuite données à un algorithme d'apprentissage. Cela va tenter de commander le reste des éléments sur la façon dont il est probable que l'utilisateur voudra les voir.

Pour tirer le maximum de temps de l'utilisateur que je veux effectuer une pré-sélectionner les rapports qui fourniront le plus d'informations sur la collection de rapports, et que l'utilisateur de les étiqueter. Si je comprends bien, pour calculer cela, il serait nécessaire de trouver la somme de toutes les valeurs d'information mutuelle pour chaque rapport, et les commander par cette valeur. Les rapports marqués d'apprentissage supervisé seront ensuite utilisés pour former un réseau bayésien pour trouver la probabilité d'une valeur binaire pour chaque rapport restant.

Exemple


Ici, un exemple artificiel peut aider à expliquer, et peut dissiper la confusion quand je l'ai sans doute utilisé la mauvaise terminologie :-) Prenons un exemple où l'application affiche des histoires de nouvelles à l'utilisateur. Il choisit les histoires de nouvelles à afficher en premier en fonction des préférences de l'utilisateur indiqué. Caractéristiques d'une histoire de nouvelles qui ont une corrélation sont country of origin, category ou date. Donc, si un utilisateur marque une seule histoire de nouvelles aussi intéressant quand il est venu de l'Ecosse, il dit à l'apprenant de la machine qu'il ya une plus grande chance d'autres histoires de nouvelles de l'Ecosse sera intéressant à l'utilisateur. Pareil pour une catégorie comme le sport, ou à une date telle 12 Décembre 2004 comme.

Cette préférence peut être calculée en choisissant un ordre pour toutes les nouvelles (par exemple par catégorie, par date) ou les commander au hasard, puis en calculant la préférence que l'utilisateur va de pair. Ce que je voudrais faire est d'obtenir une sorte de « départ » sur cette commande en ayant à l'utilisateur de regarder un petit nombre d'histoires de nouvelles spécifiques et dire s'ils sont intéressés à eux (la partie de l'apprentissage supervisé). Pour choisir les histoires pour montrer à l'utilisateur, je dois considérer la collection d'histoires. C'est là l'information mutuelle entre en jeu. Pour chaque histoire que je veux savoir combien il peut me parler de toutes les autres histoires quand il est classé par l'utilisateur. Par exemple, s'il y a un grand nombre d'histoires provenant d'Ecosse, je veux l'utilisateur de classer (au moins) un d'entre eux. Similaires pour d'autres fonctions corrélant comme la catégorie ou la date. L'objectif est de trouver des exemples de rapports qui, lorsqu'elles sont classées, fournissent le plus d'informations sur les autres rapports.

Problème


Parce que mon calcul est un peu rouillé, et je suis nouvelle à l'apprentissage de la machine que je vais avoir des problèmes de conversion de la définition de l'information mutuelle à une implémentation en Java. Wikipedia décrit l'équation d'information mutuelle comme:

équation d

Cependant, je ne suis pas sûr si cela peut effectivement être utilisé lorsque rien n'a été classé, et l'algorithme d'apprentissage n'a pas calculé encore rien.

Comme dans mon exemple, que j'ai eu un grand nombre de nouveaux cas de non marqués cette classe:

public class NewsStory {
    private String countryOfOrigin;
    private String category;
    private Date date;
    // constructor, etc.
}

Dans mon scénario spécifique, la corrélation entre les champs / caractéristiques est basé sur une correspondance exacte ainsi, par exemple, un jour et 10 ans différence de date sont équivalentes dans leur inégalité.

Les facteurs de corrélation (par exemple est la date que la catégorie plus corrélant?) Ne sont pas nécessairement égaux, mais ils peuvent être prédéfinis et constante. Est-ce que cela signifie que le résultat de la fonction p(x,y) est la valeur prédéfinie, ou suis-je mélanger des termes?

La question (enfin)


Comment puis-je aller sur la mise en œuvre du calcul de l'information mutuelle donné ce (faux) exemple de nouvelles histoires? Bibliothèques, javadoc, exemples de code, etc. sont toutes les informations de bienvenue. En outre, si cette approche est fondamentalement erronée, expliquant pourquoi tel est le cas serait une réponse tout aussi précieux.


PS. Je suis conscient des bibliothèques telles que Weka et Apache Mahout, donc il suffit de les mentionner est pas vraiment utile pour moi. Je cherche toujours à travers la documentation et des exemples pour ces deux bibliothèques à la recherche de choses sur l'information mutuelle spécifique. Ce qui serait vraiment me aider pointe aux ressources (exemples de code, javadoc) où ces bibliothèques aident à l'information mutuelle.

Était-ce utile?

La solution

Je suppose que votre problème est quelque chose comme ...

« Étant donné une liste d'exemples non marqués, trier la liste par combien l'exactitude prédictive du modèle améliorerait si l'utilisateur marqué l'exemple et l'a ajouté à l'ensemble de la formation. »

Si tel est le cas, je ne pense pas que l'information mutuelle est la bonne chose à utiliser parce que vous ne pouvez pas calculer MI entre deux instances. La définition de MI est en termes de variables aléatoires et une instance individuelle n'est pas une variable aléatoire, il est juste une valeur.

Les caractéristiques et l'étiquette de classe peut être que des variables comme aléatoires. Autrement dit, ils ont une distribution de valeurs sur l'ensemble des données. Vous pouvez calculer l'information mutuelle entre les deux caractéristiques, pour voir comment une caractéristique est donnée l'autre « redondant », ou entre une caractéristique et l'étiquette de classe, pour avoir une idée de combien cette fonctionnalité pourrait aider à prédire. Voici comment les gens utilisent habituellement l'information mutuelle dans un problème d'apprentissage supervisé.

Je pense que la suggestion de ferdystschenko que vous regardez les méthodes d'apprentissage actif est un bon.


En réponse au commentaire de Grundlefleck, je vais un peu plus profondément dans la terminologie en utilisant son idée d'une analogie avec l'objet Java ...

Collectivement, nous avons utilisé le terme « instance », « chose », « rapport » et « exemple » pour faire référence à l'objet clasified. Pensons à ces choses comme des instances d'une classe Java (je l'ai quitté le constructeur de boilerplate):


class Example
{ String f1;
  String f2;
}

Example e1 = new Example("foo", "bar");
Example e2 = new Example("foo", "baz");

La terminologie habituelle dans l'apprentissage de la machine est que e1 est un exemple , que tous les exemples ont deux caractéristiques f1 et f2 et que pour e1, f1 prend la valeur « foo 'et f2 prend la valeur « bar ». Une collection d'exemples est appelé jeu de données .

Prenez toutes les valeurs de f1 pour tous les exemples de l'ensemble de données, ceci est une liste de chaînes, il peut aussi être considéré comme une distribution. On peut penser à la fonction comme variable aléatoire et que chaque valeur de la liste est un échantillon prélevé de cette variable aléatoire. Ainsi, nous pouvons, par exemple, calculer le MI entre f1 et f2. Le pseudo-code serait quelque chose comme:

mi = 0
for each value x taken by f1:
{  sum = 0
   for each value y taken by f2:
   {  p_xy = number of examples where f1=x and f2=y
      p_x = number of examples where f1=x
      p_y = number of examples where f2=y
      sum += p_xy * log(p_xy/(p_x*p_y))
   }
   mi += sum
}

Cependant, vous ne pouvez pas calculer MI entre e1 et e2, il est tout simplement pas défini de cette façon.

Autres conseils

Je sais que l'information gagne en relation avec des arbres de décision (DTS), où, dans la construction d'un DT, la scission de faire sur chaque nœud est celui qui maximise le gain d'information. Delirium tremens sont mises en œuvre Weka, donc vous pourriez probablement utiliser directement que, bien que je ne sais pas si Weka vous permet de calculer le gain d'information pour toute scission particulier sous un nœud de DT.

En dehors de cela, si je vous comprends bien, je pense que ce que vous essayez de faire est généralement appelé apprentissage actif . Là, vous devez d'abord quelques données de formation initiale marquée qui est envoyée à votre algorithme d'apprentissage automatique. Ensuite, vous avez votre étiquette classificateur un ensemble d'instances et non marquées renvoient des valeurs de confiance pour chacun d'eux. Les cas avec les valeurs les plus basses de confiance sont généralement ceux qui sont les plus instructifs, de sorte que vous les montrer à un annotateur humain et lui / elle étiquette ces manuellement, les ajouter à votre jeu de formation, recycler votre classificateur, et faire la chose sur et encore jusqu'à ce que votre classificateur a une assez grande précision ou jusqu'à ce qu'un autre critère d'arrêt soit atteint. Donc, si cela fonctionne pour vous, vous pouvez en principe utiliser tout ML-algorithme mis en oeuvre dans Weka ou tout autre ML-cadre tant que l'algorithme que vous choisissez est en mesure de retourner les valeurs de confiance (en cas d'approche ce serait probabilités que bayésien) .


Avec votre question, je pense que je édité viens de comprendre ce que votre visant à. Si ce que vous voulez est le calcul de MI, puis le code de réponse de StompChicken et pseudo ne pouvait pas être beaucoup plus claire à mon avis. Je pense aussi que MI n'est pas ce que vous voulez et que vous essayez de réinventer la roue.

Récapitulons: vous souhaitez former un classificateur qui peut être mis à jour par l'utilisateur. Ceci est un cas classique d'apprentissage actif. Mais pour cela, vous avez besoin d'un classificateur initial (vous pouvez fondamentalement juste donner à l'utilisateur des données aléatoires à étiqueter mais je considérer ce n'est pas une option) et afin de former votre classificateur initial, vous avez besoin d'au moins une petite quantité de formation étiquetée données pour l'apprentissage supervisé. Cependant, tout ce que vous avez données sont sans étiquette. Que pouvez-vous faire avec ça?

Eh bien, vous pouvez les en groupes d'instances connexes, en utilisant l'un de la norme algorithmes de regroupement fournis par Weka ou un autre outil de classification spécifique comme Cluto . Si vous prenez maintenant les x la plupart des cas centraux de chaque groupe (x en fonction du nombre de grappes et la patience de l'utilisateur), et ont l'étiquette de l'utilisateur comme intéressant ou pas intéressant, vous pouvez adopter ce label pour les autres cas de cette grappe et (ou tout au moins pour les plus centrales). Voila, maintenant vous avez des données de formation que vous pouvez utiliser pour former votre classificateur initial et coup d'envoi du processus d'apprentissage actif en mettant à jour le classificateur chaque fois que l'utilisateur marque une nouvelle instance comme intéressant ou non. Je pense que ce que vous essayez d'atteindre par calculait MI est essentiellement similaire, mais peut-être juste le mauvais chariot pour votre charge.

Ne connaissant pas les détails de votre scénario, je pense que vous ne pouvez pas même besoin des données marquées du tout, sauf si vous êtes intéressé par les étiquettes elles-mêmes. Il suffit de regrouper vos données une fois, laissez l'utilisateur choisir un élément intéressant de lui / elle des membres centraux de tous les groupes et de proposer d'autres éléments des groupes sélectionnés comme étant peut-être intéressant. suggèrent également ici et là quelques exemples au hasard d'autres groupes, de sorte que si l'utilisateur sélectionne l'un de ceux-ci, vous pouvez supposer que le cluster correspondant peut généralement être trop intéressante,. S'il y a une contradiction et un utilisateur aime certains membres d'un cluster, mais past d'autres de la même, alors vous essayez de re-regrouper les données en groupes plus fines qui discriminent les bons des mauvais. L'étape nouvelle formation pourrait même être évité en utilisant la classification hiérarchique depuis le début et les voyages dans la hiérarchie du cluster à toutes les contradictions provoque l'entrée utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top