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

По данным Управления национальной статистики Великобритании, мошенничество является одним из наиболее распространенных преступлений в Великобритании, в год, закончившийся в декабре 2020 года, мошенничество было вторым наиболее распространенным преступлением в Англии и Уэльсе после кражи.

По оценкам, в том году в Англии и Уэльсе произошло 3,8 миллиона случаев мошенничества со взрослыми в возрасте 16 лет и старше по сравнению с 5,2 миллиона случаев воровства (UK Office for National Statistics, 2021). Стоит отметить, что эти цифры включают только инциденты, о которых сообщалось правоохранительным органам или иным образом привлекало их внимание, поэтому истинное количество случаев мошенничества может быть выше.

Согласно отчету Национального аудиторского управления Великобритании (NAO), мошенничество только в отношении государственного сектора, по оценкам, обходится правительству Великобритании в сумму от 31 до 49 миллиардов фунтов стерлингов в год (National Audit Office, 2020). Это включает мошенничество с государственными ведомствами, местными властями и Национальной службой здравоохранения (NHS).

Кроме того, частный сектор также несет значительные убытки из-за мошенничества. Согласно отчету Центра исследований по борьбе с мошенничеством Портсмутского университета, ежегодный ущерб от мошенничества для британских предприятий оценивается примерно в 140 миллиардов фунтов стерлингов (Центр исследований по борьбе с мошенничеством, 2018).

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

Наиболее распространенным видом мошенничества в Великобритании является финансовое мошенничество, которое включает мошенничество с кредитными картами, страхованием, налогами и кредитными заявками, среди прочего. Около 74% мошенничества происходит в частном секторе.

Чтобы уменьшить количество мошенничества, лучшим подходом может быть система, основанная на правилах, в сочетании с машинным обучением.

СИСТЕМА НА ОСНОВЕ ПРАВИЛ:

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

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

Существует 4 основных компонента системы, основанной на правилах:

· Набор правил, больше похожий на базу знаний.

· Механизм логического вывода выступает в роли интерпретатора, который выводит информацию и предпринимает действия на основе введенных данных и правил.

· Временная рабочая память.

· Пользовательский интерфейс, через который можно вводить и отправлять данные.

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

ОГРАНИЧЕНИЯ СИСТЕМЫ, ОСНОВАННОЙ НА ПРАВИЛАХ:

· Ограниченная гибкость. Способность систем, основанных на правилах, реагировать на новые или разрабатываемые схемы мошенничества может быть ограничена тем фактом, что они созданы для соблюдения набора заранее определенных правил. Это означает, что они могут быть не в состоянии выявить более изощренные или запутанные схемы мошенничества, которые не соответствуют установленным правилам.

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

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

Чтобы справиться с последствиями ограничений системы, основанной на правилах, в отношении обнаружения мошенничества, сочетание системы, основанной на правилах, и машинного обучения в качестве гибридной системы было бы лучшим подходом.

МАШИННОЕ ОБУЧЕНИЕ ДЛЯ ОБНАРУЖЕНИЯ МОШЕННИЧЕСТВА:

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

· Обнаружение аномалий. Алгоритмы машинного обучения можно научить распознавать шаблоны типичного поведения и помечать транзакции или действия, резко отличающиеся от этих шаблонов, как потенциально мошеннические. Этот метод очень хорош для выявления тенденций мошенничества, которые ранее не наблюдались.

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

· Обработка естественного языка. Алгоритмы машинного обучения могут использоваться для анализа неструктурированных данных, таких как текстовые сообщения или сообщения в социальных сетях, для выявления моделей подозрительного поведения или действий.

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

ПРЕИМУЩЕСТВА ГИБРИДНОЙ СИСТЕМЫ ПРИ ОБНАРУЖЕНИИ МОШЕННИЧЕСТВА:

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

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

· Улучшенная масштабируемость. Системы на основе правил могут быть сложными для масштабирования по мере роста объема данных и количества моделей мошенничества, поскольку новые правила должны определяться и тестироваться вручную. С другой стороны, машинное обучение может масштабироваться быстрее, поскольку оно может адаптироваться к новым схемам мошенничества и учиться на свежих данных без необходимости взаимодействия с человеком.

· Прозрачность: поскольку системы, основанные на правилах, построены на явных, заранее заданных правилах, они часто очень прозрачны и просты для понимания. С другой стороны, модели машинного обучения могут быть более сложными и сложными для объяснения. Гибридная система может обеспечить как прозрачность, так и точность, установив баланс между этими двумя подходами.

· Уменьшение убытков. Сочетание обоих подходов повышает точность обнаружения мошеннических транзакций, тем самым уменьшая потери в результате мошеннических действий.

· Уменьшение количества ложных срабатываний. Системы на основе правил могут давать ложные срабатывания, расследование которых может занимать много времени и средств. Машинное обучение может помочь уменьшить количество ложных срабатываний за счет изучения исторических данных и выявления закономерностей, которые с большей вероятностью могут быть связаны с мошенническими действиями.

РАЗРАБОТКА ГИБРИДНОЙ СИСТЕМЫ ДЛЯ ВЫЯВЛЕНИЯ МОШЕННИЧЕСТВ

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

Набор данных можно скачать по этой ссылке: https://www.kaggle.com/datasets/shivamb/vehicle-claim-fraud-detection

Модель машинного обучения будет построена с использованием классификатора случайного леса в Azure Databricks с использованием Pyspark.

Примечание. Этот код был написан с использованием Pyspark на Databricks, для других IDE вам потребуется импортировать сеанс spark.

import numpy as np                   # array, vector, matrix calculations
import pandas as pd                  # DataFrame handling
from pyspark.ml.feature import OneHotEncoder, StandardScaler, VectorAssembler, StringIndexer, Imputer
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml import Pipeline
import mlflow
import mlflow.pyfunc
import mlflow.spark
import pyspark.sql.functions as f
from pyspark.sql.types import *
from pyspark.ml.evaluation import BinaryClassificationEvaluator

Затем мы читаем файл во фрейм данных искры. Файл был загружен непосредственно из Kaggle и сохранен в хранилище файлов на Databricks.

spark_df = spark.read.csv('/FileStore/Fraud_Det/Test/fraud_oracle.csv', header=True, inferSchema=True)
spark_df.display()

Затем были выбраны необходимые столбцы для разработки модели.

df = (
  spark_df.select('Make','AccidentArea','Sex','MaritalStatus','Age','Fault','PolicyType','VehicleCategory','RepNumber','Deductible','DriverRating','Days_Policy_Accident','Days_Policy_Claim','PastNumberOfClaims','AgeOfVehicle','AgeOfPolicyHolder','WitnessPresent','PoliceReportFiled','AddressChange_Claim','NumberOfCars','BasePolicy','FraudFound_P')
      )

df.display()

Затем данные обрабатывались путем создания конвейера для масштабирования числовых значений и кодирования категориальных значений для разработки модели.

execlude_from_df= ["FraudFound_P"]

#the predictors, of all types
ex_df= [item for item in df.columns if item not in execlude_from_df]

to_encode= [col[0] for col in df.select(*ex_df).dtypes if col[1]=='string']
numerical_cols= [col[0] for col in df.select(*ex_df).dtypes if col[1]!='string']

pipe_stages= []

# all string(categorical) variables will be encoded into numbers, each category by frequency of label
sindexer= StringIndexer(inputCols= to_encode, 
                        outputCols= ["indexed_{}".format(item) for item in to_encode],
                        handleInvalid='keep',
                        stringOrderType='frequencyDesc')
pipe_stages += [sindexer] # must add each step to the Pipeline

# dummy numerized strings into a sparse vector. 
ohe= OneHotEncoder(inputCols= ["indexed_{}".format(item) for item in to_encode],
                   outputCols= ["indexed_ohe_{}".format(item) for item in to_encode],
                   handleInvalid='keep',
                   dropLast=True)
pipe_stages += [ohe]

# impute missing numerical values, with the median (though bad practice)
#imp= Imputer(inputCols= numerical_cols,
#             outputCols=['imputed_{}'.format(item) for item in numerical_cols],
#             strategy= 'median')
#pipe_stages += [imp]

# create the un-standardized features vector
assembler= VectorAssembler(inputCols= ["indexed_ohe_{}".format(item) for item in to_encode] + numerical_cols,
                           outputCol= "features",
                           handleInvalid="keep")
pipe_stages += [assembler]

# scale all features. Maybe you want to do this Before encoding the string columns?
ss= StandardScaler(inputCol="features",
                   outputCol="features_1",
                   withMean= False,
                   withStd=True)
pipe_stages += [ss]

pipe= Pipeline(stages= pipe_stages)

Затем мы преобразуем фрейм данных, применяя к нему конвейер.

df_fit= pipe.fit(df)
df= df_fit.transform(df)
df.display()

Конвейер использует векторный ассемблер для создания функций, которые будут использоваться для обучения модели.

train, test= df.randomSplit([0.75, 0.25], seed=42)

rfc= RandomForestClassifier(numTrees=70,
                            maxDepth=3, 
                            labelCol='FraudFound_P',
                            featuresCol="features_1",
                            seed=42)

rfc_model= rfc.fit(train)

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

predDF= rfc_model.transform(test) 

# Instantiate the evaluator
# similarly with MulticlassClassificationEvaluator
bce= BinaryClassificationEvaluator(rawPredictionCol= "rawPrediction",
                                   labelCol="FraudFound_P", 
                                   metricName= "areaUnderROC")
                                   
# Apply
bce.evaluate(predDF) 

Чтобы оценить производительность модели, модель сначала использовалась для прогнозирования результатов тестового набора данных. Затем для расчета ROC-AUC был использован оценщик бинарной классификации, который дал оценку 0,82, что является справедливым. Когда дело доходит до использования в бизнесе, потребуется модель с более высокой производительностью. Чтобы добиться этого, модель должна быть дополнительно настроена для повышения производительности.

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

Для целей этого блога модель также была зарегистрирована в MLflow, поэтому ее можно вызвать для логического вывода в оркестраторе мошенничества.

# Start an MLflow run
with mlflow.start_run(run_name="RF Model_Fraud") as run:
    
    # Log the pipeline model as an artifact of the run
    mlflow.spark.log_model(rfc_model, "model")
    
    # Set run's metadata
    mlflow.set_tag("model_type", "RandomForestClassifier")
    mlflow.set_tag("Accuraccy", bce.evaluate(predDF))
    
    # Log the run id and artifact location
    run_id = run.info.run_id
    artifact_location = mlflow.get_artifact_uri()
    print(f"Run with ID: {run_id} logged to MLflow")
    print(f"Artifact location: {artifact_location}")

Модель зарегистрирована как RF MODEL_FRAUD.

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

Для создания правил для блога использовался объяснитель SHAP для объяснения особенностей модели, которые больше всего влияют на предсказание модели.

from sklearn.ensemble import RandomForestClassifier
import numpy as np
import shap
import pandas as pd

new_cols = [f.col(c).alias(c.replace('index_', '')) if c.startswith('index_') else f.col(c) for c in df.columns]
pandas_df = (
      df.select(
        numerical_cols
        + ["indexed_{}".format(item) for item in to_encode]
    )
)

new_cols = [f.col(c).alias(c.replace('indexed_', '')) if c.startswith('indexed_') else f.col(c) for c in pandas_df.columns]
cleaned_df = pandas_df.select(*new_cols).toPandas()


model = RandomForestClassifier()
model.fit(cleaned_df, df.select("FraudFound_P").toPandas().values.ravel())
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(cleaned_df, check_additivity=False)
p = shap.summary_plot(shap_values[0], cleaned_df, show=False)
display(p)

Чтобы создать образцы правил для этого блога, строки с мошенничеством были отфильтрованы из набора данных и проанализированы на основе первых пяти функций SHAP. Правила были созданы и использованы в оркестраторе обнаружения мошенничества. Это только что было сделано для целей этого блога, как правило, у предприятий есть более сложные и расширенные правила, относящиеся к этому бизнесу для обнаружения мошенничества.

#creating rule system for scoring
def rules(df):
  # initialize score variable
  total_score = 0

  # Rule 1: if Fault = policy holder score 10 else 5
  if df['Fault'] == 'policy holder':
    rule1_score = 10
  else:
      rule1_score = 5
  total_score += rule1_score

  # Rule 2: if PolicyType = sedan score 10, if its collision score 7, if its peril score 5, else score 3
  if df['PolicyType'] == 'Sedan - Collision':
      rule2_score = 10
  elif df['PolicyType'] == 'Sedan - Liability':
      rule2_score = 7
  elif df['PolicyType'] == 'Sedan - All Perils':
      rule2_score = 5
  else:
      rule2_score = 3
  total_score += rule2_score

  # Rule 3: if VC = Sedan score 10, if its Sport score 5, else score 3
  if df['VehicleCategory'] == 'Sedan':
      rule3_score = 10
  elif df['VehicleCategory'] == 'Sport':
      rule3_score = 5
  else:
      rule3_score = 3  # no score if BP is not collision or peril
  total_score += rule3_score

  # Rule 4: if BP = Sedan score 10, if its Sport score 5, else score 3
  if df['BasePolicy'] == 'Collision':
      rule4_score = 10
  elif df['BasePolicy'] == 'Liability':
      rule4_score = 7
  else:
      rule4_score = 5  # no score if BP is not collision or Liability
  total_score += rule4_score

  # Rule 5: if age is between 24 and 27 score 5, if its between 28 and 34 score 7 else if age is between 35 and 42 score 10.
  if 24 <= df['Age'] <= 32:
      rule5_score = 8
  elif 32 <= df['Age'] <= 40:
      rule5_score = 10
  elif 40 <= df['Age'] <= 48:
      rule5_score = 6
  elif 48 <= df['Age'] <= 56:
      rule5_score = 3
  else:
      rule5_score = 0  # no score if age is outside the specified range
  total_score += rule5_score

  return total_score

def sensitivity(df):
  if 40 <= df['score'] <= 50:
    action = 'High'
  elif 25 <= df['score'] <= 40:
    action = 'Medium'
  else:
    action = 'low'
  return action

def scores(df):
  df=df.toPandas()
  df['score']=df.apply(lambda x: rules(x), axis=1)
  score=df['score']
  df['action']=df.apply(lambda x: sensitivity(x), axis=1)
  action = df['action']
  return score,action


#setting up model function
def predict(uri,df):
  logged_model = (uri)

  # Load model
  loaded_model = mlflow.spark.load_model(logged_model)

  #process df
  df = df_fit.transform(df)

  # Perform inference via model.transform()
  pred_df = loaded_model.transform(df)
  return pred_df.select(f.col('prediction')).display()

Приведенный выше код является оркестратором мошенничества. Функция «правила» содержит правила, которые должны применяться к входным данным. Мы создали правила функции для вывода оценки в диапазоне от 0 до 50. Эта оценка представляет собой уверенность (основанную на знании предметной области) в том, что введенные данные являются мошенническими. Более высокий балл дает большую уверенность в мошеннической деятельности.

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

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

Затем функция прогнозирования импортирует зарегистрированную модель из Databricks MLflow, а затем использует ее для прогнозирования возможного заявления о мошенничестве.

Мы создали образец входных данных для тестирования оркестратора.

data = [('Honda','Urban','Female','Single',21,'Policy Holder','Sport - Liability','Sport',12,300,1,'more than 30','more than 30','none','3 years','26 to 30','No','No','1 year','3 to 4','Liability')]
Test_df1 = Test_df.drop(f.col('FraudFound_P'))
Test_df2 = spark.createDataFrame(data,schema = Test_df1.schema)
Test_df2.display()

Затем входные данные использовались для подсчета очков.

#Scores input for fraud detection
scores(Test_df2)

Результат оценки дал 20 баллов и указывает на низкую чувствительность к мошенничеству.

#Predict fraud using model
predict('runs:/69697682f58048ac97a65baa5dd7622c/model',Test_df2)

Модель также предсказала претензию как не мошенническую. На основе этого понимания может быть принято решение.

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

Кроме того, когда дело доходит до обнаружения мошенничества, методы мошенничества со временем меняются. Модель необходимо будет регулярно переобучать, чтобы фиксировать новые закономерности. Со временем можно извлечь новые данные из предсказанного моделью мошенничества, чтобы улучшить правила.

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

ССЫЛКА: