Недавно я начал проект по разработке модели обнаружения мошенничества на основе набора данных Kaggle, доступного по адресу: https://www.kaggle.com/c/fraud-detection-analysis. Когда я начал импортировать данные, Я понял, что время на выполнение простого read_csv было слишком большим. Это привело меня к поиску более практичных способов работы с большими данными. Двумя основными вопросами были: как сократить время обработки при использовании Pandas? Как сохранить представление явления, присутствующее в необработанных данных, чтобы его можно было использовать как для моделирования, так и для исследовательского анализа данных?

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

  • PySpark

Настройка сеанса PySpark так же проста, как показано ниже:

Затем все, что осталось сделать, это определить схему набора данных (имеется в виду характеристики каждого столбца или объекта в наборе данных):

И теперь мы можем использовать Spark для визуализации данных с помощью таких классов, как «describe().show()», и получить общее представление о качестве данных.

  • SkLearn.model_selection.StratifiedShuffleSplit

Как указано на веб-сайте SKLearn:

«Этот объект перекрестной проверки представляет собой слияние StratifiedKFold и ShuffleSplit, которое возвращает стратифицированные рандомизированные складки. Складки сделаны с сохранением процентного соотношения образцов для каждого класса».

В случае классификации, такой как обнаружение мошенничества, эта функция позволит поддерживать сбалансированную пропорцию между категориальными признаками, включая, конечно же, целевой признак «мошенничество». Из набора данных чуть более 6 миллионов строк мы можем создать набор поездов только с 10% от его общего значения и то же самое для тестового набора с остальными данными.

sample = StratifiedShuffleSplit(n_splits=1, test_size=0.1, random_state=42)
for trainread_csv index, train_2_index in sample.split(df_raw, df_raw['isFraud']):
    df_raw_1 = df_raw.iloc[trainread_csv index]
    df_raw_2 = df_raw.iloc[train_2_index]

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

Узнайте больше об этом проекте по адресу: https://github.com/LucasBMedeiros/fraud_blocker.