예제 #1
0
    def statsOnDF(self, data):
        vp = 0
        vn = 0
        fp = 0
        fn = 0

        for i in range(len(data)):
            e = data["target"][i]
            if e == 0:
                if self.estimClass(utils.getNthDict(data, i)) == 1:
                    fp += 1
                else:
                    vn += 1
            else:
                if self.estimClass(utils.getNthDict(data, i)) == 1:
                    vp += 1
                else:
                    fn += 1

        return {
            "VP": vp,
            "VN": vn,
            "FP": fp,
            "FN": fn,
            "Précision": vp / (vp + fp),
            "Rappel": vp / (vp + fn)
        }
예제 #2
0
파일: projet.py 프로젝트: ohouens/3i005
 def __init__(self, df, seuil):
     self.df = df
     self.liste_attributs = utils.getNthDict(df, 0).keys()
     self.proba = {}
     for attribut in self.liste_attributs:
         if not isIndepFromTarget(df, attribut, seuil):
             self.proba[attribut] = P2D_l(self.df, attribut)
예제 #3
0
파일: projet.py 프로젝트: TTLI0609/STAT
    def statsOnDF(self, df):
        """
        A partir d'un pandas.dataframe, calcule les taux d'erreurs de classification 
        et rend un dictionnaire.
        VP : nombre d'individus avec target=1 et classe prévue=1
        VN : nombre d'individus avec target=0 et classe prévue=0
        FP : nombre d'individus avec target=0 et classe prévue=1
        FN : nombre d'individus avec target=1 et classe prévue=0
        Précision : combien de candidats sélectionnés sont pertinents = VP/(VP+FP)
        Rappel : combien d'éléments pertinents sont sélectionnés  = VP/(VP+FN)
        
        :param df:  le dataframe à tester
        :return: un dictionnaire contennat les VP, FP, VN, FN, précision et rappel
        """
        dic = dict()
        dic['VP'] = 0
        dic['VN'] = 0
        dic['FP'] = 0
        dic['FN'] = 0

        for t in df.itertuples():
            dicEl = t._asdict()
            ligne = utils.getNthDict(df, dicEl.get('Index'))
            if (dicEl.get('target') == 1 and self.estimClass(ligne) == 1):
                dic['VP'] += 1
            if (dicEl.get('target') == 0 and self.estimClass(ligne) == 0):
                dic['VN'] += 1
            if (dicEl.get('target') == 0 and self.estimClass(ligne) == 1):
                dic['FP'] += 1
            if (dicEl.get('target') == 1 and self.estimClass(ligne) == 0):
                dic['FN'] += 1

        dic['Précision'] = dic['VP'] / (dic['VP'] + dic['FP'])
        dic['Rappel'] = (dic['VP']) / (dic['VP'] + dic['FN'])
        return dic
예제 #4
0
파일: projet.py 프로젝트: ohouens/3i005
 def __init__(self, df):
     self.df = df
     self.liste_attributs = list(utils.getNthDict(df, 0).keys())
     self.liste_attributs.remove('target')
     self.proba = {}
     for i in self.liste_attributs:
         self.proba[i] = P2D_l(self.df, i)
예제 #5
0
파일: projet.py 프로젝트: ohouens/3i005
def nbParamsNaiveBayes(df, attribut, liste_attributs=None):
    valAttr = len(P2D_p(df, attribut))
    result = 0
    units = ["o", "Ko", "Mo", "Go"]
    if (liste_attributs == None):
        liste_attributs = utils.getNthDict(df, 0).keys()
    for i in liste_attributs:
        if i == attribut:
            result += 1
        else:
            result += len(P2D_p(df, i))
    if (result != 0):
        result *= 8 * valAttr
    else:
        result = 8 * valAttr
    string = str(
        len(liste_attributs)) + " variable(s) : " + str(result) + " octets"
    if result >= 1024:
        string += " ="
        conver = conversion(result)
        i = len(conver) - 1
        while i >= 0:
            while i > 0 and conver[i] == 0:
                i -= 1
            string = string + " " + str(conver[i]) + units[i]
            i -= 1
    print(string)
예제 #6
0
def P2D_l(df, attr):
    """
  On prend toutes les valeurs uniques dans la target et toutes les valeurs uniques dans l'attribut
  en utilisant 2 sets. La clé du dictionnaire principal doit être target, donc pour chaque valeur on
  crée un nouveau dictionnaire avec toutes les valeurs de s2 commes cles, avec les valeurs correspondantes
  initialisées avec 0. On parcours le tableau et compte les apparitions de chaque attribut.
  A la fin on divise par la taille du tableau pour trouver la probabilité de chacun.
  """
    x = {}

    s1 = set()
    s2 = set()
    for i in df['target']:
        s1.add(i)

    for i in df[attr]:
        s2.add(i)

    for i in s1:
        x[i] = {}
        for j in s2:
            x[i][j] = 0

    size_target = df.groupby('target')[attr].count()

    for i in range(0, df.shape[0]):
        dic = util.getNthDict(df, i)
        x[dic['target']][dic[attr]] += 1

    for target, attribute in x.items():
        for key in attribute:
            attribute[key] /= size_target[target]

    return x
예제 #7
0
    def statsOnDF(self, df):
        """
        à partir d'un pandas.dataframe, calcule les taux d'erreurs de classification et rend un dictionnaire.
    
        :param df:  le dataframe à tester
        :return: un dictionnaire incluant les VP,FP,VN,FN,précision et rappel
        """
        dic = {}
        dic['VP'] = 0
        dic['VN'] = 0
        dic['FP'] = 0
        dic['FN'] = 0

        n = df.shape[0]
        for i in range(n):
            line = utils.getNthDict(df, i)
            t = self.estimClass(line)
            if line['target'] == t:
                if t == 1:
                    dic['VP'] += 1
                else:
                    dic['VN'] += 1
            else:
                if t == 1:
                    dic['FP'] += 1
                else:
                    dic['FN'] += 1
        dic['rappel'] = dic['VP'] / (dic['VP'] + dic['FN'])
        dic['précision'] = dic['VP'] / (dic['VP'] + dic['FP'])
        return dic
예제 #8
0
파일: projet.py 프로젝트: ohouens/3i005
def nbParamsIndep(df, attrs=None):
    """calcule la taille mémoire nécessaire pour représenter les tables de probabilité
	étant donné un dataframe, en supposant qu'un float est représenté sur 8octets
	et en supposant l'indépendance des variables """
    result = 0
    if (attrs == None):
        attrs = utils.getNthDict(df, 0).keys()
    for i in attrs:
        result += len(P2D_p(df, i))
    result *= 8
    string = str(len(attrs)) + " variable(s) : " + str(result) + " octets"
    if (result > 1024):
        quotient = result // 1024
        reste = result % 1024
        string = string + " = " + str(quotient) + "ko " + str(reste) + "o"
    print(string)
예제 #9
0
    def statsOnDF(self, df):
        """
        à partir d'un pandas.dataframe, calcule les taux d'erreurs de classification et rend un dictionnaire.
        
        :param df:  le dataframe à tester
        :return: un dictionnaire incluant les VP,FP,VN,FN,précision et rappel
        """

        dico = dict()

        VP = 0
        FP = 0
        VN = 0
        FN = 0

        i = 0

        for t in df.itertuples():

            dic = t._asdict()
            attrs = ut.getNthDict(df, i)
            c = self.estimClass(attrs)

            if dic['target'] == 1 and c == 1:
                VP += 1
            if dic['target'] == 0 and c == 0:
                VN += 1
            if dic['target'] == 0 and c == 1:
                FP += 1
            if dic['target'] == 1 and c == 0:
                FN += 1

            i += 1

        precision = VP / (VP + FP)
        rappel = VP / (VP + FN)

        dico = {
            "VP": VP,
            "VN": VN,
            "FP": FP,
            "FN": FN,
            "precision": precision,
            "rappel": rappel
        }

        return dico
예제 #10
0
    def statsOnDF(self, df):
        """
        res = {'VP': 0, 'VN': 0, 'FP': 0, 'FN': 0 , 'Precision': 0 , 'Rappel': 0 }
        classMajoritaire = self.estimClass(df)
        for t in df.itertuples():
            dic = t._asdict()
            v = dic['target']
            if v == 1 and classMajoritaire == 1:
                res['VP'] += 1
            elif v == 0 and classMajoritaire == 0:
                res['VN'] += 1
            elif v == 0 and classMajoritaire == 1:
                res['FP'] += 1
            else:
                res['FN'] += 1

        res['Précision'] = res['VP'] / (res['VP'] + res['FP'])
        res['Rappel'] = res['VP'] / (res['VP'] + res['FN'])
        return res
        
        """
        res = {'VP': 0, 'VN': 0, 'FP': 0, 'FN': 0 , 'Precision': 0 , 'Rappel': 0 }
        
        i = 0
        for t in df.itertuples():
            dic = t._asdict()
            v = dic['target']
            attrs = ut.getNthDict(df,i)
            classePrevue = self.estimClass(attrs)

            if v == 1 and classePrevue == 1:
                res['VP'] += 1
            elif v == 0 and classePrevue == 0:
                res['VN'] += 1
            elif v == 0 and classePrevue == 1:
                res['FP'] += 1
            else:
                res['FN'] += 1
            i += 1

        res['Precision'] = res['VP'] / (res['VP'] + res['FP'])
        res['Rappel'] = res['VP'] / (res['VP'] + res['FN'])
        return res
예제 #11
0
    def statsOnDF(self, train):
        stats = dict()
        stats["VP"] = stats["VN"] = stats["FP"] = stats["FN"] = 0
        for i in range(len(train)):
            t = ut.getNthDict(train, i)
            x = t['target']
            if x == 1 and self.estimClass(t) == 1:
                stats["VP"] += 1
            elif x == 1 and self.estimClass(t) == 0:
                stats["FN"] += 1
            elif t['target'] == 0 and self.estimClass(t) == 1:
                stats["FP"] += 1
            else:
                stats["VN"] += 1

        stats["Précision"] = stats["VP"] / (stats["VP"] + stats["FP"])
        stats["Rappel"] = stats["VP"] / (stats["VP"] + stats["FN"])
        return stats

        ###########################
        """Question 3.a"""
예제 #12
0
    def statsOnDF(self, df):
        """
        à partir d'un pandas.dataframe, calcule les taux d'erreurs de classification et rend un dictionnaire.
        VP : nombre d'individus avec target=1 et classe prévue=1
        VN : nombre d'individus avec target=0 et classe prévue=0
        FP : nombre d'individus avec target=0 et classe prévue=1
        FN : nombre d'individus avec target=1 et classe prévue=0
        Précision : combien de candidats sélectionnés sont pertinents (VP/(VP+FP))
        Rappel : combien d'éléments pertinents sont sélectionnés (VP/(VP+FN))
        *le parametre df:
        le dataframe 
        *le return:
        un dictionnaire incluant les VP,FP,VN,FN,précision et rappel
        """
        dictionnaire_proba = {}
        dictionnaire_proba["VP"] = 0
        dictionnaire_proba["VN"] = 0
        dictionnaire_proba["FP"] = 0
        dictionnaire_proba["FN"] = 0
        #calcul stats: estim représente l'estimation de la classe de la personne et  dic['target'] sa classe réelle
        for t in range(df.shape[0]):
            dic = utils.getNthDict(df, t)
            estim = self.estimClass(dic)
            if dic["target"] == 1:
                if estim == 1:
                    dictionnaire_proba["VP"] += 1
                else:
                    dictionnaire_proba["FN"] += 1
            else:
                if estim == 1:
                    dictionnaire_proba["FP"] += 1
                else:
                    dictionnaire_proba["VN"] += 1

        dictionnaire_proba["Précision"] = dictionnaire_proba["VP"] / (
            dictionnaire_proba["VP"] + dictionnaire_proba["FP"])
        dictionnaire_proba["Rappel"] = dictionnaire_proba["VP"] / (
            dictionnaire_proba["VP"] + dictionnaire_proba["FN"])

        return dictionnaire_proba
예제 #13
0
파일: projet.py 프로젝트: ohouens/3i005
def nbParams(df, attrs=None):
    """nbParams calcule la taille mémoire des tables $P(target|attr_1,..,attr_k)$
	étant donné un dataframe et la liste $[target,attr_1,...,attr_l]$
	 en supposant qu'un float est représenté sur 8octets"""
    result = 1
    units = ["o", "Ko", "Mo", "Go"]
    if (attrs == None):
        attrs = utils.getNthDict(df, 0).keys()
    for i in attrs:
        result *= len(P2D_p(df, i))
    result *= 8
    string = str(len(attrs)) + " variable(s) : " + str(result) + " octets"
    if result >= 1024:
        string += " ="
        conver = conversion(result)
        i = len(conver) - 1
        while i >= 0:
            while i > 0 and conver[i] == 0:
                i -= 1
            string = string + " " + str(conver[i]) + units[i]
            i -= 1
    print(string)
예제 #14
0
    def statsOnDF(self, df):
        """
        à partir d'un pandas.dataframe, calcule les taux d'erreurs de classification et rend un dictionnaire.
        
        :param df:  le dataframe à tester
        :return: un dictionnaire incluant les VP,FP,VN,FN,précision et rappel
        
        VP : nombre d'individus avec target=1 et classe prévue=1
        VN : nombre d'individus avec target=0 et classe prévue=0
        FP : nombre d'individus avec target=0 et classe prévue=1
        FN : nombre d'individus avec target=1 et classe prévue=0
        Précision : combien de candidats sélectionnés sont pertinents (VP/(VP+FP))
        Rappel : combien d'éléments pertinents sont sélectionnés (VP/(VP+FN))
        """
        dico = {}
        dico["VP"] = 0
        dico["VN"] = 0
        dico["FP"] = 0
        dico["FN"] = 0
        for t in range(df.shape[0]):
            dic = utils.getNthDict(df, t)
            resultat = self.estimClass(dic)
            if dic["target"] == 1:
                if resultat == 1:
                    dico["VP"] += 1
                else:
                    dico["FN"] += 1
            else:
                if resultat == 1:
                    dico["FP"] += 1
                else:
                    dico["VN"] += 1

        dico["Précision"] = dico["VP"] / (dico["VP"] + dico["FP"])
        dico["Rappel"] = dico["VP"] / (dico["VP"] + dico["FN"])

        return dico
예제 #15
0
파일: projet.py 프로젝트: ohouens/3i005
 def __init__(self, df):
     self.df = df
     self.liste_attributs = utils.getNthDict(df, 0).keys()
     self.proba = {}
     for attribut in self.liste_attributs:
         self.proba[attribut] = P2D_l(self.df, attribut)
예제 #16
0
파일: projet.py 프로젝트: ohouens/3i005
def drawNaiveBayes(df, attr):
    result = ""
    for i in utils.getNthDict(df, 0).keys():
        if (i != attr):
            result += attr + "->" + i + ";"
    return utils.drawGraph(result)