Insight

Treine modelos locais de previsão, agrupamento, detecção de anomalia e previsão de tendência a partir dos seus próprios dados, para que uma pergunta repetida seja respondida na hora e de graça, em vez de raciocinada do zero toda vez.

A tool insight deixa um agente transformar dado já verificado em um modelo pequeno, treinado e guardado por ele mesmo, para que uma pergunta específica e repetida (“esse paciente vai piorar”, “esse lead vai converter”, “quantas internações semana que vem”) seja respondida na hora, sem chamada de modelo nenhuma, assim que houver histórico suficiente para aprender. O Pepe escolhe o algoritmo sozinho, de acordo com o volume real de dado disponível; não há nada para configurar ou ajustar.

Isso não é pesquisa de machine learning em aberto. É responder uma pergunta bem definida, a partir de um dado que você já tem, uma capacidade real e limitada, não descoberta livre.

Quatro tipos de pergunta

Nenhum desses tipos é exclusivo de saúde: o mesmo pipeline de classificação serve para um time de suporte prevendo se um chamado vai escalar, ou para uma clínica prevendo risco de reinternação. O que muda entre os dois é só a coluna-alvo e as colunas usadas para prever, não o tipo de modelo.

Em termos de ML: classificação, regressão e previsão de tendência são aprendizado supervisionado, porque o modelo aprende a partir de exemplos onde a resposta já é conhecida. Agrupamento é o único tipo não supervisionado aqui: não há resposta conhecida nem exemplo rotulado, o modelo encontra os grupos sozinho a partir dos dados.

O agrupamento já resolve detecção de anomalia de graça: um registro muito longe do padrão do grupo dele volta marcado, usando o mesmo modelo que fez o agrupamento. Um paciente cujos sinais vitais o colocam bem longe do grupo em que ele normalmente estaria é exatamente esse tipo de anomalia, vale a pena olhar antes que vire uma emergência.

De onde vem o dado

Duas fontes, escolhidas na hora de definir o que prever:

Onde fica guardado

As linhas de uma conexão de banco nunca são copiadas pra lugar nenhum: todo treino e toda contagem de linhas consulta a conexão na hora, do mesmo jeito que o db_query já faz. Só fica salvo o que prever (alvo, colunas usadas, nome da tabela), não o dado em si.

Linhas importadas são diferentes: o import_rows guarda elas de verdade, no próprio armazenamento operacional do Pepe (a mesma SQLite onde já vivem commitments, watches e traces), com um teto de 50 mil linhas por modelo, descartando as mais antigas quando passa disso.

O modelo treinado em si é um binário pequeno (poucos kilobytes, não megabytes) guardado nesse mesmo armazenamento, não importa de qual fonte veio o treino. Perder esse arquivo só significa que a próxima previsão vai treinar de novo do zero; ele não guarda nada que uma pessoa leia diretamente.

Ainda não sabe o que prever?

Peça para “analisar meus dados em busca de insights” e, para uma conexão de banco, o insight propose_targets amostra linhas reais e sugere algo pra cada tipo de pergunta que o Insight sabe responder, não só classificação ou regressão: uma coluna de baixa cardinalidade é uma categoria plausível para classificar, uma coluna numérica com variação real é algo para prever por regressão, um nome tipo status/risk/churn pesa a favor. Quando uma tabela também tem uma coluna que parece data ou horário, ele junta isso com uma coluna numérica e sugere uma previsão de tendência (“acompanhar isso ao longo do tempo”). E quando a tabela tem várias colunas numéricas com variação real, ele junta elas numa sugestão de agrupamento (“agrupar as linhas por essas colunas e ver que grupos e valores fora do padrão aparecem”), mesmo sem nenhuma coluna-alvo à vista. É uma heurística, não uma garantia, e não define nada sozinha - é um ponto de partida para confirmar, não uma spec pronta. Isso serve justamente pra quem não tem a menor ideia de por onde começar: pergunta, e o Pepe aponta candidatas reais em vez de você ficar olhando pra uma tela em branco.

Definindo o que prever

Não existe uma sintaxe separada para aprender: descreva o que você quer na conversa, e o agente preenche a chamada real de insight define. Para uma spec de classificação ou regressão, diga o alvo e quais colunas usar para prever: “prever se um paciente reinterna em até 30 dias, usando idade, dias internado e internações prévias, a partir da tabela altas em pacientes_prod”. Uma previsão de tendência aponta uma coluna de tempo em vez de (ou além de) outras colunas: “prever o total de internações por dia, sobre a coluna dia”. Um agrupamento não aponta alvo nenhum, só o que agrupar: “agrupar pacientes por idade, número de comorbidades e internações prévias”.

Depois, insight import_rows (para uma spec importada) ou insight train_now (para qualquer uma das duas) assim que houver histórico suficiente, e insight_predict para ter uma resposta, ver o que está definido e o histórico de cada modelo. É uma tool separada de propósito: insight (define/import_rows/train_now/delete) é a que muda alguma coisa; insight_predict (predict/list/describe) só lê. Essa separação deixa um operador liberar previsão para uma superfície sem humano no loop (um cron, um webhook) sem também dar a ela poder de redefinir ou retreinar o que está sendo previsto.

Como o Pepe escolhe o algoritmo

Por padrão, nunca é escolha manual: o modelo é escolhido pelo volume real de dado verificado que existe, a mesma filosofia de “descobrir sozinho” por trás do roteamento por complexidade:

Uma exceção: o binário de Windows vem só com a primeira faixa. As bibliotecas por trás das outras duas não publicam versão para Windows, e não há o que corrigir do nosso lado. Tudo o que o Insight faz continua funcionando lá, um modelo para cada um dos quatro tipos de pergunta, treinado e respondido do mesmo jeito; o Pepe só vai usar regressão simples independente do volume, e pedir na mão uma faixa que não existe ali avisa isso com todas as letras, em vez de quebrar no meio do treino. Em qualquer outra plataforma as três faixas estão lá, como descrito acima.

Uma previsão de tendência é uma regressão por baixo dos panos, com o horário virando atributos de tempo decorrido e dia da semana/mês automaticamente, as mesmas três faixas se aplicam. Um modelo nesse porte nunca treina em cima de todas as linhas de uma tabela gigante: o treino usa uma amostra aleatória representativa (TABLESAMPLE do Postgres, não “as primeiras N linhas”, que puxaria viés para como a tabela está ordenada), limitada a 200 mil linhas, depois de um certo ponto, mais linha não melhora o modelo de forma relevante.

Um operador que já sabe qual algoritmo quer pode indicar explicitamente com o family do define (“linear”, “gbm” ou “neural”), em vez de deixar automático - útil se ele já comparou os próprios dados, ou só prefere o que já conhece. Deixe sem definir a menos que peçam; automático é o padrão certo para quase todo mundo.

O número de acerto ou erro que o Pepe mostra vem de testar o modelo contra vários pedaços diferentes do dado, não só um - um número mais estável e mais confiável do que testar contra um único recorte aleatório daria, e mais próximo do que o modelo realmente vai fazer com dado que nunca viu. O modelo que efetivamente responde as previsões depois é treinado de novo em cima de tudo que existe, não só no pedaço usado pra testar.

Retreino

Defina retrain_interval_s numa spec e o Pepe retreina sozinho assim que houver linhas novas suficientes (min_new_rows, padrão 50), um modelo de risco de paciente fica mais preciso conforme mais altas são registradas, sem ninguém rodar nada manualmente. O insight train_now retreina na hora, independente disso.

Retreinar, em qualquer frequência, não custa nada em uso de modelo: é um temporizador interno conferindo se já é hora e se chegou linha nova suficiente e, se sim, ajustando o modelo, computação simples do início ao fim, igual ao próprio train_now. Um modelo só custa alguma coisa em dois momentos separados: uma vez, em conversa, quando alguém descreve pela primeira vez o que prever, e depois, só se algo for montado pra transformar uma previsão num resumo escrito pra uma pessoa ler (um aviso programado, por exemplo), a previsão em si, não importa com que frequência retreina ou é consultada, nunca precisa de um.

O que isso não faz

Todo modelo responde uma pergunta só, definida de antemão, a partir de dado estruturado. Um número entra direto, e uma coluna com um número razoável de valores diferentes (até 20, tipo um plano ou uma região) já vira algo que o modelo consegue usar sozinho, sem configurar nada. Uma coluna com muito mais valores distintos do que isso, tipo um ID de cliente, ainda não dá pra usar assim. Não lê texto livre (um resumo de alta, um PDF de prontuário), esse dado precisa virar coluna antes do Insight conseguir usar. Não faz série temporal além de tendência e sazonalidade semanal/anual, e não faz imagem nem áudio. Se a pergunta precisa de julgamento em vez de um padrão no dado passado, aí é trabalho do próprio agente, raciocinando turno a turno, não do Insight.