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
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
def test_adjmat2vec(): DAG = bn.import_DAG('Sprinkler', verbose=0) out = bn.adjmat2vec(DAG['adjmat']) assert np.all(out['source'] == ['Cloudy', 'Cloudy', 'Sprinkler', 'Rain'])
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
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',
# 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)