Обнаружение медицинского мошенничества (часть 1) - сбор и предварительная обработка данных

Узнайте, как обнаружить врача-мошенника

Фон

Миллионы американцев полагаются на субсидируемое государством здравоохранение, чтобы позволить себе медицинские процедуры, лекарства и вспомогательные устройства. По данным Центра услуг Medicare и Medicaid (CMS), правительство Соединенных Штатов потратило более триллиона долларов на свою систему здравоохранения в 2018 году, и с каждым годом они прогнозируют все больше. Вместо того, чтобы выставлять счета пациенту напрямую, врачи и медицинские учреждения получают оплату напрямую от страховых компаний и государственных фондов. При огромном количестве денег в системе для некоторых естественно совершать незаконные действия. Мошеннические схемы в системе здравоохранения варьируются от выставления счетов за услуги, которые не были предоставлены, до проникновения организованной преступности в программу Medicare. По оценкам Федерального бюро расследований, более десяти процентов общих расходов на здравоохранение составляют мошеннические счета.

Данные

Чтобы решить проблему обнаружения мошеннических организаций, CMS выпустила большие многомерные наборы данных для различных частей своей программы Medicare / Medicaid. В этом эксперименте для понимания и выявления мошенничества в сфере здравоохранения используются только данные об использовании и платежах провайдера (часть B). Часть B помогает покрыть расходы на услуги врачей и амбулаторное лечение. Именно здесь существует высокий процент мошенничества, поскольку завышение счетов - одна из наиболее распространенных форм мошенничества. Каждое наблюдение в наборе данных соответствует процедуре, выполняемой конкретным врачом, где каждому врачу присваивается уникальный код NPI. Всего имеется 8 910 479 наблюдений.

import numpy as np
import pandas as pd
import os
from sklearn.preprocessing import LabelEncoder, OneHotEncoder 
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
CMS = pd.read_csv(file, delimiter="\t")
CMS = CMS.iloc[1:]            
CMS.dropna(subset=['npi'], inplace=True)            
CMS = CMS.loc[
    (CMS.npi != 0000000000) & (CMS['hcpcs_drug_indicator'] == 'N')]

Чтобы узнать, какие врачи и организации являются мошенниками, Управление генерального инспектора Министерства здравоохранения и социальных служб (OIG) составило Список исключенных лиц и организаций (LEIE), который ведется ежемесячно. Закон требует от OIG исключать кого-либо из программ здравоохранения, финансируемых из федерального бюджета, если он уличен в мошенничестве с Medicare / Medicaid. LEIE - это набор данных, в котором у каждого человека есть набор функций, включая его уникальный код NPI.

LEIE = pd.read_csv("LEIE.csv")
NPI = list(LEIE.NPI)
CMS["fraud"] = 0
CMS.fraud.loc[CMS['npi'].isin(NPI)] = 1
CMS.sort_values(by=['fraud'], inplace=True)

На приведенных выше цифрах нет какой-либо тенденции или закономерностей, которые четко отделяют мошеннические дела от обычных, что затрудняет поиск всех красных точек в море зеленых точек. Это связано с тем, что медицинское мошенничество принимает различные формы, и многие случаи врачебной халатности остаются незамеченными, поскольку они очень похожи на обычные процедуры.

Обнаружение аномалий

На диаграммах выше показано равное количество случаев мошенничества и обычных случаев, но на самом деле только 0,017% всего набора данных является мошенничеством. Следовательно, это не простая задача двоичной классификации, а проблема обнаружения аномалий. Проблема обнаружения аномалий (AD) возникает, когда нас просят обнаружить чрезвычайно мало происходящих событий в сильно несбалансированных данных. По сути, это похоже на попытку найти крошечную иголку в действительно большом стоге сена. Распространенные методы AD включают автоэнкодеры, K-ближайшего соседа, фактор локальных выбросов и изолированные леса.

Предварительная обработка

После понимания характеристик набора данных с помощью исследовательского анализа данных пора подготовить его к этапу моделирования. Набор данных необходимо преобразовать и разделить, чтобы создать входные данные для модели обнаружения. Поскольку это проблема AD, на этапе предварительной обработки следует учитывать определенные критерии.

Кодирование данных

Есть много переменных, которые содержат конечный набор помеченных значений. Эти категориальные переменные необходимо преобразовать в числовые значения, чтобы модель их приняла. Label Encoder и One-Hot Encoder помогают нам в достижении этой цели. Не вдаваясь в подробности, Label Encoder превращает помеченные значения в числовые значения, а One-Hot Encoder расширяет каждую переменную, чтобы создать бинаризованный столбец для каждого уникального значения. В результате общее пространство функций расширяется за счет количества уникальных помеченных значений. Это полезно, учитывая большое количество наблюдений в наборе данных.

le = LabelEncoder()
CMS[obj_cols] = CMS[obj_cols].apply(
             lambda col:le.fit_transform(col))
X = CMS.loc[CMS.fraud == 0].values
Xf = CMS.loc[CMS.fraud == 1].values 
y = CMS['fraud'].valuesdel CMS 
ohe = OneHotEncoder(categorical_features=[1], sparse=False)
X = ohe.fit_transform(X)Xf = ohe.transform(Xf)

Тренировка / тестовый сплит

После того, как данные были закодированы, пора разделить данные на обучающие и тестовые наборы. Поскольку конечной целью является обнаружение чрезвычайно небольшой группы врачей-мошенников, модель должна изучить и понять сложности и основные компоненты, которые представляют нормальных, не мошенников. В тренировочный набор входят только нормальные врачи. Набор для тестирования включает в себя всех врачей-мошенников и оставшихся нормальных врачей, перемешанных вместе.

X_train, X_test_norm = train_test_split(X, test_size=0.3)
y_train = np.zeros(len(X_train))  
X_test = np.concatenate((X_test_norm, Xf), axis=0)
y_test_norm = list(np.zeros((len(X_test_norm))))
yf_test = list(np.ones((len(Xf))))
y_test = np.array(y_test_norm + yf_test)
X_test, y_test = shuffle(X_test, y_test, random_state=0)

Стандартизация

Последний шаг предварительной обработки - стандартизация данных. Это означает, что все переменные масштабируются, чтобы получить среднее значение 0 и стандартное отклонение 1. Этот шаг важно использовать, когда характеристики наших входных данных имеют большие различия между своими диапазонами. Большие различия обременительны для многих моделей, особенно для моделей, основанных на расстоянии. Сохранение всего в одном масштабе позволяет ускорить вычисления.

stdsc = StandardScaler()
X_train = stdsc.fit_transform(X_train)
X_test = stdsc.transform(X_test)

Часть 2: чего ожидать

Теперь, когда набор данных очищен и предварительно обработан, пришло время построить нашу модель обнаружения аномалий. Во второй части этого обзора проекта, состоящего из двух частей, обсуждается модель, которую я выбрал для выявления врачей-мошенников, и результаты, которых я добился после запуска поездов и наборов тестов.



См. полный проект на моей странице GitHub

Ссылки

[1] США Правительство, Центры услуг Medicare и Medicaid США. Официальный сайт правительства США по программе Медикэр

[2] Список исключенных лиц / организаций, Правительство США, Министерство здравоохранения и социальных служб США, Офис Генерального инспектора

[3] Выявление уклонения от уплаты налога на добавленную стоимость со стороны хозяйствующих субъектов Казахстана, Асылбеков, Женисбек и Мельников, Игорь и Бекишев, Рустам и Балтабаева, Асель и Биссенгалиева, Дария и Мамлин, Эльдар. (2016)