Use Case
Detecção de Erros em Sinistros de Seguros
Paulo Maia · 5 de maio de 2020
Os códigos de seguros são utilizados pelos planos de saúde para tomar decisões sobre quanto os médicos e outros prestadores de cuidados de saúde devem ser pagos. Existe diversidade de sistemas de codificação em uso atualmente [1]:
- Códigos Current Procedural Terminology (CPT), utilizados pelos médicos para descrever os serviços que prestam.
- Healthcare Common Procedure Coding System (HCPCS), utilizado pelo Medicare. Subdivide-se em códigos de nível I (equivalentes aos códigos CPT) e códigos de nível II. Estes últimos são utilizados para identificar produtos, suprimentos e serviços não incluídos nos códigos CPT (por exemplo, próteses e serviços de ambulância).
- International Classification of Diseases (ICD), desenvolvido pela Organização Mundial de Saúde (OMS), com o objetivo de identificar a condição/diagnóstico de saúde do paciente. Estes códigos são tipicamente combinados com Códigos CPT, para garantir que a condição de saúde do paciente e os serviços recebidos correspondem (ou seja, para compatibilizar faturação e documentação do diagnóstico).
Após um determinado procedimento, os profissionais de saúde indicam o código do procedimento num formulário de sinistro de seguros para que o hospital seja parcial ou totalmente reembolsado por esse procedimento.
No entanto, é natural que nem todos os sinistros apresentados correspondam aos procedimentos realmente realizados – devido a fraude ou erros de submissão, por exemplo.
Eis um exemplo (adaptado de [1]): se cair e se torcer o tornozelo, e procurar o serviço de emergência em consequência disso, pode acabar por realizar uma radiografia do tornozelo. Se por engano os profissionais de saúde classificarem incorretamente radiografia do tornozelo como radiografia do cotovelo, mas mesmo assim derem-lhe um diagnóstico de tornozelo torcido, o procedimento e o diagnóstico não são consistentes, e o sinistro de seguros pode acabar por ser rejeitado.
Quais são alguns dos problemas resultantes deste processo que podem ter consequências monetárias, de vários pontos de vista dos stakeholders afetados negativamente?
O que cada um perde?
-
Paciente
- A codificação incorreta dos serviços recebidos (diagnóstico ou procedimentos) pode levar a que o paciente seja identificado com uma condição que não tem.
- Despesas acrescidas, incorrendo em custos adicionais para o paciente, para a seguradora ou para ambas.
- O paciente com condições pré-existentes (que podem ser diagnosticadas incorretamente) pode potencialmente enfrentar obstáculos na obtenção de cobertura de saúde.
- Frequentemente o paciente não tem acesso aos seus registos médicos, o que leva a falta de visibilidade destes problemas.
-
Hospital
- Os profissionais de saúde podem ser pagos a mais ou a menos por um procedimento.
- As seguradoras podem mesmo rejeitar o sinistro e não pagar nada, resultando em aumentos de preços também para o hospital.
- Os hospitais podem esquecer-se de incluir algumas despesas, perdendo a oportunidade de serem reembolsados por procedimentos que realizaram ou materiais que utilizaram.
- Atrasos na correção podem levar a custos administrativos extra e atraso no pagamento.
-
Seguradora
- Além dos erros de codificação, os hospitais podem tentar apresentar itens adicionais associados a um procedimento que não utilizaram realmente, para receber mais financiamento (fraude).
- Atrasos na correção podem levar a custos administrativos adicionais e atraso no pagamento.
Então, como podemos usar IA para ajudar nesta área?
Modelação de Detecção de Anomalias em Sinistros de Seguros
Mostraremos como resolver isto usando múltiplas técnicas, incluindo: versões supervisionadas, não supervisionadas e fracamente supervisionadas. Para saber mais sobre isto, inscreva-se no nosso curso online onde discutimos em profundidade todos estes conceitos.
O curso The Machine Learning Spectrum
O que fazer?
Podemos identificar problemas nas submissões de sinistros de seguros a um determinado nível de granularidade:
- Um grupo de códigos de sinistro não faz sentido.
- Um grupo de códigos de sinistro não faz sentido porque o profissional de saúde clicou no código adjacente na interface ou utilizou o código na categoria errada (uma vez que os códigos têm uma certa hierarquia – por exemplo, anestesia local e geral).
Este caso de uso de detecção de erros em sinistros de seguros pode ser aplicado tanto a hospitais como a seguradoras, pois existe interesse em perceber quais os sinistros que não estão corretos. Basicamente, as opções possíveis são: identificar um sinistro como incorreto, corrigir um erro nos códigos de sinistro e/ou tentar explicar por que ou onde ocorreu.
Começaremos agora a utilizar letras para referir os códigos de sinistro, como simplificação. A figura seguinte representa os possíveis dados de entrada e saída de um modelo de sinistro de seguros.
No terceiro caso, podemos ter itens extra no sinistro enviado pelo hospital – uma seguradora desejará ter o mínimo possível de itens, portanto o modelo deve eliminar os códigos desnecessários.
No quarto caso, um sinistro enviado por um hospital pode estar faltando códigos para alguns procedimentos (ou seja, por engano ou por falta de conhecimento sobre um código específico). Um modelo aplicado num hospital deve ser capaz de adicionar sinistros extra quando estão em falta.
Quais são as restrições?
Um modelo utilizado para detectar erros em sinistros de seguros deve ser invariante à ordem em que o profissional de saúde coloca os códigos (por exemplo, A-B-C ou C-A-B). Podemos adicionar esta invariância de diferentes formas:
- Ampliando os dados de entrada com embaralhamento aleatório.
- Ordenando tanto entradas como saídas em ordem alfabética/numérica.
- Utilizando uma representação invariante à posição. Por exemplo, uma vez que as sequências de sinistro podem ser consideradas como texto, poderíamos utilizar Bag-of-Words para contar a presença de sinistros independentemente da sua ordem.
Como fazer isto?
Existem várias abordagens que podemos tomar neste problema, dependendo da quantidade de rótulos e dados disponíveis. Daremos alguns exemplos de como podemos abordar isto de forma supervisionada e não supervisionada, com um foco mais detalhado numa abordagem não supervisionada.
Dados disponíveis
- Código de sinistro
- Data do sinistro
- Possivelmente: Resultado (utilizado como rótulo)
Rótulos assumidos
- Positivo: Sinistro incorreto. A seguradora reportou problemas com o sinistro de um determinado hospital, e o hospital recuou e concordou com o erro.
- Negativo: Casos em que a seguradora detetou que o sinistro não tinha erros, não quis despender tempo e dinheiro em processos legais para esse sinistro em particular, ou não conseguiu detetar um erro que existia. Como tal, os rótulos negativos são uma mistura de positivos e negativos.
- Nenhum: Sinistros restantes que ainda não foram avaliados.
Dois mecanismos de aprendizagem principais podem ser utilizados:
Abordagens Supervisionadas
Se tivermos rótulos positivos e negativos, este é um problema clássico de aprendizagem supervisionada enquadrado como classificação binária. Podemos então extrair manualmente características dos códigos, como a coocorrência de pares de códigos, ou utilizar um Modelo Profundo (por exemplo, RNNs) para tentar inferir a relação entre códigos a partir da entrada.
No entanto, como os rótulos negativos também podem conter o alvo positivo, podemos em vez disso considerar este problema como fracamente supervisionado e utilizar Positive Unlabeled learning (PU Learning), em que a classe que não é positiva é considerada como tendo exemplos positivos e negativos (conjunto misto). Dentro de PU Learning, existem vários algoritmos que podem ser utilizados, alguns dos quais são descritos/referidos na literatura [2].
Abordagens não supervisionadas
Se não houver rótulos disponíveis, então precisamos de seguir uma abordagem não supervisionada. Descreveremos alguns exemplos a seguir:
Embeddings de códigos
Podemos treinar um modelo word2vec que, dados dois códigos, estima o código adjacente mais provável. Neste caso estamos a adicionar invariância à posição.
Desta forma, podemos treinar embeddings de códigos (similares aos embeddings de palavras) que aprendem as relações entre diferentes códigos. Depois, verificamos se um determinado código tem o embedding com a menor distância aos seus vizinhos. Se não tiver, substituímo-lo pelo código que tem.
Isto é mais propenso a erros uma vez que podemos ter códigos para operações comuns com distância de embedding similar.
Modelo generativo
Utilizando um modelo generativo, podemos ajustar os sinistros a um modelo, aprendendo uma função de densidade. Os sinistros mais comuns estarão próximos num determinado espaço de probabilidade. Exemplos de modelos que fazem isto são autoencoders variacionais ou modelos de mistura gaussiana. Seremos então capazes de saber a probabilidade de cada sinistro ser um outlier.
Inspirado em Seq2Seq: reconstruindo sequências corretas
Com um autoencoder com ruído, estamos a tentar reconstruir uma determinada sequência de sinistro. Adicionamos ruído e o modelo tenta saber o que está errado e tenta corrigi-lo. Podemos então calcular um erro de reconstrução, que nos diz se devemos ter mais elementos de um determinado sinistro e menos elementos de outro sinistro. Temos então uma explicação informativa para saber o que está errado no sinistro.
Inspirado em Seq2Seq: probabilidade de uma sequência estar errada
Alternativamente, podemos ter um único modelo que nos diz a probabilidade de cada elemento estar errado (e portanto, sabemos a probabilidade de todo o sinistro estar errado).
Para fazer isto, adicionamos aleatoriamente ruído de rótulo ao adicionar, remover e trocar sinistros. Temos então um autoencoder que tem uma camada sigmoid que reconstrói a probabilidade de cada sinistro estar errado.
Temos um maior grau de confiança no modelo (e podemos medir a sua incerteza) e podemos decidir melhor em que sinistros devemos analisar manualmente, uma vez que temos probabilidades. Por outro lado, sabemos que uma determinada sequência tem uma alta probabilidade de estar errada, mas não sabemos se deve ser adicionada ou eliminada.
Para resolver este problema, poderíamos adicionar uma rede com três tarefas extra: probabilidade do código de sinistro estar errado porque precisa ser editado, eliminado ou adicionado.
Modelo generativo e reconstrutivo misto
Podemos também ter um modelo generativo que partilha pesos com um autoencoder com ruído (ou outro modelo reconstrutivo). Desta forma, um modelo generativo diz-nos qual sinistro está errado, e o modelo reconstrutivo diz-nos por que está errado (ou seja, que parte da sequência está errada), devolvendo também a sequência corrigida.
O que fazer com os resultados do modelo?
Então, como podemos ser operacionais com o nosso modelo? Assumamos que somos uma seguradora com estas duas ferramentas:
- Probabilidade do sinistro estar errado.
- Sugestões do que está errado.
Se quisermos selecionar N casos para avaliar manualmente, como poderíamos otimizar isto para determinar quais são os sinistros mais económicos? A seguradora tem determinados custos associados a este procedimento, e um exemplo de sinistro com os códigos AAGKM, que deveria ser AAGKD. Cada código é um procedimento/item com um determinado custo.
| Código | Custo |
|---|---|
| A | 5 |
| B | 50 |
| K | 1000 |
| M | 200 |
| G | 300 |
| D | 100 |
AAGKM = 5*2 + 300 + 1000 + 200 = 1510€
AAGKD = 5*2 + 300 + 1000 + 100 = 1500 €
Casos positivos são casos de fraude, que queremos avaliar manualmente.
Se aplicarmos este modelo numa seguradora, queremos maximizar tanto Verdadeiros Positivos (VP) como Verdadeiros Negativos (VN). Ao maximizar Verdadeiros Negativos, economizamos tempo de análise, e ao maximizar Verdadeiros Positivos, estamos a reduzir o número de casos que a seguradora não deveria estar a pagar, mas realmente está.
Por outro lado, se aplicarmos isto num hospital, queremos minimizar FP – casos que são sinalizados como fraude mas não o são, custando horas de trabalho em análise manual – e FN – casos que são sinalizados como negativos mas são realmente fraude, custando dinheiro devido a erros.
Como podemos otimizar isto para uma seguradora?
Existe um determinado custo associado à correção de algo num sinistro e uma diferença de preço entre o sinistro reconstruído e o sinistro original.
Para cada sinistro X, podemos calcular uma pontuação, e escolher as amostras com as N pontuações mais altas como os sinistros a avaliar manualmente.
Esta pontuação precisa de ser composta por dois termos. No primeiro termo, contendo o valor esperado em caso de fraude detetada, multiplicamos a probabilidade de fraude pelo dinheiro economizado pela seguradora quando a fraude é detetada. Aqui, o fluxo de dinheiro depende do custo do sinistro corrigido subtraído ao preço do sinistro original e a taxa de horas de trabalho necessária para corrigir esse sinistro manualmente.
No segundo termo, multiplicamos a probabilidade de não fraude pela taxa de horas de trabalho necessária para analisar essa amostra, porque mesmo se não houver fraude, existe um custo associado à análise manual desse sinistro.
Score(X) = P(Fraude) x ( PreçoSinistroCorrigido(X) - Preço(X) - TaxaHorasTrabalho(Corrigido(X) - X) ) - (1-P(Fraude)) x TaxaHorasTrabalho(Corrigido(X) - X)
que é igual a:
Score(X) = Prob(Fraude) x ( PreçoSinistroCorrigido(X) - Preço(X) ) - HorasTrabalho
Portanto, para o exemplo acima, se o modelo corrigir a sequência AAGKM para AAGKD, temos uma confiança de 90% de que é anómala, e assumindo um preço fixo de 5€ por análise de sinistro:
Score(AAGKM) = 0.9 x (1510 - 1500 - 5) = 4.5
Conclusão
Neste artigo, apresentámos o problema de detectar automaticamente erros/anomalias em sinistros de seguros, um caso de uso que pode afetar vários stakeholders: pacientes, hospitais e seguradoras.
Esta abordagem pode ser feita de forma supervisionada ou não supervisionada, dependendo dos dados disponíveis. Mesmo sem rótulos disponíveis, é possível criar um modelo interpretável e operacional para otimizar o processo de revisão manual de sinistros.
Avise-nos se tiver mais ideias para resolver este problema!
Referências
- https://www.verywellhealth.com/learn-about-insurance-codes-to-avoid-billing-errors-1738628
- Sansone, E., De Natale, F. G., & Zhou, Z. H. (2018). Efficient training for positive unlabeled learning. IEEE transactions on pattern analysis and machine intelligence, 41(11), 2584-2598.
