dans le predicteur naive bayes, ajouter une sortie avec la probabilité jointe log(p(X, Y))
utile pour évaluer la confiance dans le modèle générateur
-> généraliser au NB, SNB, en régression, classification avec groupement de valeurs cibles?
-> add-on python, ou évolution de khiops?
-> possibilité de générer une nouvelle variable en sortie sytématiquement, mais en unused par défaut?
t//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
t// On dispose d'une base ayant n individus, une variable cible Y et k variable X_i, 1 <= i <= k, numeriques ou categorielles.
t// On souhaite évaluer la probabilite jointe P(X, Y) (en pratique Ln(P(X, Y)))
t//
t// P(X=x, Y=y) = P(Y=y)P(X=x|Y=y)
t// = P(Y=y)P(X_1=x_1|Y=y)P(X_2=x_2|Y=y)...P(X_k=x_k|Y=y)
t// = P(Y=y) product_i(P(X_i=x_i|Y=y))
t// = P(Y=y) product_i(P(X_i=x_i, Y=y)/P(Y=y))
t// = product_i(P(X_i=x_i, Y=y)) / P(Y=y)^(k-1)
t// Il ne reste qu'a estimer les probabilites P(Y=y) et les probabilites jointes bivariees P(X_i=x_i, Y=y).
t// Pour P(Y=y):
t// . cas categoriel ou Y contient c valeurs v_j d'effectif n(v_j): P(Y=vj) = n(v_j)/n
t// . cas numerique: P(Y=y) = 1/n (en theorie, on est ici dans le cas d'une densite, pas d'une probabilite)
t//
t// Pour les probabilites jointes bivariees, on utilise les estimateurs MODL, bases sur de partitions en intervalles ou groupe de valeurs.
t// On note part(v) la partie contenant une valeur v et n(part(v)) son effectif
t//
t// P(X_i=x_i, Y=y) = P(X_i in part(x_i), Y in part(y)) P(X_i = x_i | X_i in part(x_i)) P(Y=y | Y in part(y)
t// = n(part(x_i), part(y))/n P(X_i = x_i | X_i in part(x_i)) P(Y=y | Y in part(y))
t// Pour les termes locaux aux parties (pour X_i ou Y), on a:
t// . cas categoriel: P(X_i = x_i | X_i in part(x_i)) = 1
t// . cas numerique: P(X_i = x_i | X_i in part(x_i)) = 1/n(part(x_i)
t//
t// Pour le WNB, on dispose d’un vecteur de poids w = (w_1, w_2, … w_k), avec W = w_1 + w_2 +… + w_k
t// On etend le NB avec l’hypothese naive ponderee d’independance des X_i conditionnellement a Y,
t// selon P(X | Y) = p(X_1 | y) ^ w_1 p(X_2 | y) ^ w_2 … p(X_k | y) ^ w_k
t// Les formules de P(X, Y) s’etendent alors selon ce schema.
t//
t// Une variable LogJointProb() qui est généré systématiquement (en Unused).
t// Plus des règles de dérivation disponible dans la librairie, que les utilisateurs pourront ajouter à la demande :
t// . LogJointProbAt(value), ou value est une valeur catégorielle
t// . LogJointProbAtRank(rank), ou rank est un rang normalisé entre 0 et 1 (sachant qu’il y par ailleurs des règles de conversion entres rangs et valeurs)
t// . on se base sur un intervalle de rang de largeur 1/n (on reste une probabilité jointe, pas une densité|probabilité jointe)
t// . faudrait-il également un LogJointProbAtInterval(minRank, maxRank), pour un intervalles de rang quelconque [minRank, maxRank]
t//
* -> début de prise en compte dans Learning, KWDRNBClassifier
* il manque les effectifs par valeurs dans les groupement des valeurs des attributs catégoriel des grilles bivariées
* c'est une évolution potentiellement peu pertinent dans le coruer de Khiops
* demande une évolution significative de la génération des dictionnaires
* problème de comatibilité ascendante
* ferait grossir inutilement les dictionnaires, pour une besoin rare
* => la solution est de passer par des fonctions python sous pykhiops
* les .json, contrairement aux dictionaires, contiennent toutes les information nécessaires
* totale liberté d'expérimenter des variantes
* séparation claire entre le noyau Khiops robuste, performant, et des add-on externes pouvant arrivr au fil de l'eau, avec moins de contrainte sur la robustesse, utiles pour des besoins rares ou expérimentaux
* plus tard, pourrait de toutes façon être "solififié" dans Khiop