Пример #1
0
def modelToDataFrame(model, test):
    """ De modelo Python aprendido a DataFrame Python
    
    Descripción
    -----------
    Permite, a partir de un modelo aprendido comparar las variables con el dataset y así eliminar las variables que no se
    deben utilizar para realizar calculos posteriores.
        
    Parámetros
    ----------
    model: modelo del tipo "dict"
    
    test: data frame Python
      
    Retorna
    -------
    Retorna un Data Frame Python
       
    """

    # Obteniendo la matriz de Source y Target del modelo
    vector = bn.adjmat2vec(model['adjmat'])
    col = []
    # Se recorre el la matriz para obtener todas las columnas que esta matriz posee
    for columna in vector:  #recorriendo las columnas
        if columna in ('weight'):
            continue
        else:
            for fila in vector.index:  # recorriendo las filas
                col.append(vector[columna][fila])

    #Se lista la lista dejando solo valores únicos
    vectorUnique = list(set(col))

    # Buscando la columna que el modelo descarto para eliminarla del dataset
    borrarVar = []
    for i in range(len(test.columns.values)):
        x = -1
        for j in range(len(vectorUnique)):
            if test.columns.values[i] == vectorUnique[j]:
                x = j
                break

        if x == -1:
            borrarVar.append(test.columns.values[i])
            print('COLUMNA ELIMINADA DE LA INFERENCIA: ',
                  test.columns.values[i])

    print(test)
    for z in range(len(borrarVar)):
        del (test[borrarVar[z]])
    print(test)

    return test
Пример #2
0
def test_vec2adjmat():
    DAG = bn.import_DAG('Sprinkler', verbose=0)
    out = bn.adjmat2vec(DAG['adjmat'])
    # TEST: conversion
    assert bn.vec2adjmat(out['source'],
                         out['target']).shape == DAG['adjmat'].shape
Пример #3
0
def test_adjmat2vec():
    DAG = bn.import_DAG('Sprinkler', verbose=0)
    out = bn.adjmat2vec(DAG['adjmat'])
    assert np.all(out['source'] == ['Cloudy', 'Cloudy', 'Sprinkler', 'Rain'])
Пример #4
0
def Aprendizaje(model, fold, tipo, score):
    """ Aprendizaje de estructura y parámetros de BNLEARN en Python
    
    Descripción
    -----------
    Encapsula el aprendizaje de estructura y el aprendizaje de parámetros (probabilidad anterior).
    El aprendizaje de la estructura es guardado en un archivo CSV y el DAG aprendido es renderizado y guardado en un 
    archivo PDF en la carpeta \Experimentos con el nombre "EstructuraCPD_'tipo'_fold.gv.pdf"
        
    Parámetros
    ----------
    model: recibe un dataframe con los la información a aprender 
    fold : Valor númerico que indica el cross-validation del cual se está solicitando el aprendizaje
    tipo :  Indicador del tipo de datos del que se desa aprender.  Valores posibles:
        a. "TRAIN"
        b. "TEST"
    score   : Tipo de score a utilizar para el aprendizaje de la estructura
        a. "bic"  -> Bayesian Information Criterion (Tambien llamado MDL)
        b. "k2"   -> 
        c. "bdeu" -> (DB) Bayesian Dirichlet, (e) for likelihood-equivalence, (u) for uniform joint distibution        
         
    Retorna
    -------
    Retorna un modelo aprendido "dict"
       
    """
    # -------------------------------------------------------------------
    # APRENDIENDO LA ESTRUCTURA DE UNA PORCION DE DATOS DE TRAIN O TEST -
    # -------------------------------------------------------------------

    modelo = bn.structure_learning.fit(model,
                                       methodtype='hc',
                                       scoretype=score,
                                       verbose=3)
    # modelo = bn.structure_learning.fit(model, methodtype='hc', scoretype=score, verbose=3, bw_list_method = 'enforce', black_list = ['programa', 'estado'])

    # Guardando la estructura estructura aprendida
    nombreArchivo = 'EstructuraCPD_' + tipo + '_' + str(fold)
    nombreArchivoExt = 'Experimentos\\' + nombreArchivo + '.gv'
    f = Digraph(name=nombreArchivo,
                filename=nombreArchivoExt,
                format='pdf',
                engine='dot',
                encoding="utf-8")

    # Obteniendo la matriz de Source y Target del modelo
    vector = bn.adjmat2vec(modelo['adjmat'])
    col = []

    # Se recorre el la matriz para obtener todas las columnas que esta matriz posee
    for columna in vector:  # recorriendo las columnas
        if columna in ('weight'):
            continue
        else:
            for fila in vector.index:  # recorriendo las filas
                col.append(vector[columna][fila])

    # Se lista la lista dejando solo valores únicos
    vectorUnique = list(set(col))

    # Asignando los nodos de la estructura aprendida
    f.attr('node', shape='circle')
    for x in range(len(vectorUnique)):
        f.node(vectorUnique[x])

    # Asignando los arcos de la estructura aprendida
    edges = modelo['model'].edges()
    f.attr('node', shape='circle')
    for edge in edges:
        xfrom = edge[0]
        xto = edge[1]
        f.edge(xfrom, xto)

    # f.view()
    f.save()
    f.render(filename=nombreArchivoExt, view=False, cleanup=1)

    # Guardando la estructura aprendida
    vector = modelo['adjmat']
    vector = bn.adjmat2vec(vector)
    vector.to_csv("Experimentos\EstructuraCPD_" + tipo + "_" + str(fold) +
                  ".csv",
                  sep=";")
    G = bn.plot(modelo, verbose=0)

    # -------------------------------------------------------------------------
    # APRENDIENDO LOS PARAMETROS DEL MODELO RECIEN APRENDIDO DE SU ESTRUCTURA -
    # -------------------------------------------------------------------------

    modelo = bn.parameter_learning.fit(modelo, model, verbose=1)

    # Convertiendo a BayesianModel para guardar los parametros aprendidos
    if isinstance(modelo, dict):
        model1 = modelo['model']

    filename = "Experimentos\ParametrosCPD_" + tipo + "_" + str(fold) + ".txt"
    if os.path.exists(filename):
        file = open(filename, "a")
    else:
        file = open(filename, "w")

    for cpd in model1.get_cpds():
        file.write("CPD of {variable}:".format(variable=cpd.variable) + "\n")
        file.write(str(cpd) + os.linesep)

    file.close()

    # Muestra como queda la red bayesiana con la porción de los datos entrenados y los parametros aprendidos
    G = bn.plot(modelo, verbose=0)

    return modelo
Пример #5
0
                      evidence={
                          'Sex': 1,
                          'Pclass': 1
                      })
q1 = bn.inference.fit(model, variables=['Survived'], evidence={'Sex': 0})

bn.print_CPD(model)

# %%
DAG = bn.import_DAG('sprinkler', CPD=False)
DAG = bn.import_DAG('asia')
bn.plot(DAG)
bn.print_CPD(DAG)

df = bn.sampling(DAG, n=1000)
vector = bn.adjmat2vec(DAG['adjmat'])
adjmat = bn.vec2adjmat(vector['source'], vector['target'])

# %%
from pgmpy.factors.discrete import TabularCPD
edges = [('A', 'E'), ('S', 'E'), ('E', 'O'), ('E', 'R'), ('O', 'T'),
         ('R', 'T')]

DAG = bn.make_DAG(edges)
bn.plot(DAG)

cpd_A = TabularCPD(variable='A', variable_card=3, values=[[0.3], [0.5], [0.2]])
print(cpd_A)
cpd_S = TabularCPD(variable='S', variable_card=2, values=[[0.6], [0.4]])
print(cpd_S)
cpd_E = TabularCPD(variable='E',
Пример #6
0
# Parameter learning
model = bnlearn.parameter_learning.fit(DAG, dfnum)
# Make inference
q1 = bnlearn.inference.fit(model, variables=['Survived'], evidence={'Sex':1, 'Pclass':1})
q1 = bnlearn.inference.fit(model, variables=['Survived'], evidence={'Sex':0})

bnlearn.print_CPD(model)

# %%
DAG = bnlearn.import_DAG('sprinkler', CPD=False)
DAG = bnlearn.import_DAG('asia')
bnlearn.plot(DAG)
bnlearn.print_CPD(DAG)

df = bnlearn.sampling(DAG, n=1000)
vector = bnlearn.adjmat2vec(DAG['adjmat'])
adjmat = bnlearn.vec2adjmat(vector['source'], vector['target'])

# %%
from pgmpy.factors.discrete import TabularCPD
edges = [('A', 'E'),
         ('S', 'E'),
         ('E', 'O'),
         ('E', 'R'),
         ('O', 'T'),
         ('R', 'T')]

DAG = bnlearn.make_DAG(edges)
bnlearn.plot(DAG)