Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

0
respostas

[Projeto] Faça como eu fiz: construindo uma Rede Bayesiana | Fundamentos de IA: explorando a estrutura e abordagens de sistemas inteligentes

from pgmpy.models import DiscreteBayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination

modelo = DiscreteBayesianNetwork([
    ('HC', 'RC'), ('TS', 'RC'), ('IP', 'RC')
])

cpd_hc = TabularCPD('HC', 2, [[0.60], [0.40]], 
    state_names={'HC': ['Nao', 'Sim']})
cpd_ts = TabularCPD('TS', 2, [[0.45], [0.55]], 
    state_names={'TS': ['Curto', 'Longo']})
cpd_ip = TabularCPD('IP', 2, [[0.65], [0.35]], 
    state_names={'IP': ['Nao', 'Sim']})
cpd_rc = TabularCPD('RC', 2,
    [[0.90,0.70,0.40,0.30,0.55,0.35,0.15,0.10],
     [0.10,0.30,0.60,0.70,0.45,0.65,0.85,0.90]],
    evidence=['HC', 'TS', 'IP'], evidence_card=[2,2,2],
    state_names={'RC': ['Nao', 'Sim'], 'HC': ['Nao', 'Sim'],
                 'TS': ['Curto', 'Longo'], 'IP': ['Nao', 'Sim']})

modelo.add_cpds(cpd_hc, cpd_ts, cpd_ip, cpd_rc)
modelo.check_model()

inf = VariableElimination(modelo)

print("REDE BAYESIANA - ANALISE DE COMPORTAMENTO DE CLIENTES\n")

testes = [
    ("Historico + Tempo Longo + Promocao", 
     {'HC': 'Sim', 'TS': 'Longo', 'IP': 'Sim'}),
    ("Novo + Tempo Curto + Sem Promocao", 
     {'HC': 'Nao', 'TS': 'Curto', 'IP': 'Nao'}),
    ("Novo + Tempo Longo + Promocao", 
     {'HC': 'Nao', 'TS': 'Longo', 'IP': 'Sim'}),
]

for nome, ev in testes:
    res = inf.query(variables=['RC'], evidence=ev)
    prob = res.values[1] * 100
    print(f"{nome}: {prob:.1f}%")

print("\nTABELA DE TODOS OS CENARIOS\n")
print("Historico | Tempo  | Promocao | P(Compra)")
print("-" * 44)

for hc in ['Nao', 'Sim']:
    for ts in ['Curto', 'Longo']:
        for ip in ['Nao', 'Sim']:
            res = inf.query(variables=['RC'], 
                evidence={'HC': hc, 'TS': ts, 'IP': ip})
            prob = res.values[1] * 100
            print(f"{hc:9} | {ts:6} | {ip:8} | {prob:6.1f}%")

print("\nINFERENCIA REVERSA")
res_rev = inf.query(variables=['IP'], evidence={'RC': 'Sim'})
prob_ip_dado_rc = res_rev.values[1] * 100
print(f"P(Promocao | Compra) = {prob_ip_dado_rc:.1f}%\n")

print("RECOMENDACOES:")
print("1. Clientes com historico + tempo longo + promo: MAIOR prioridade (90%)")
print("2. Clientes novos + tempo curto + sem promo: MENOR prioridade (10%)")
print("3. Investir em estrategias para aumentar tempo no site")
print("4. Segmentar promocoes para clientes novos")