{"id":14293,"url":"\/distributions\/14293\/click?bit=1&hash=05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","hash":"05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043d\u0438 \u043a\u043e\u043f\u0435\u0439\u043a\u0438","buttonText":"","imageUuid":""}

5 Лучших генераторов синтетических данных на Python и как их использовать, когда вам не хватает данных

В 2021 году ежедневно производилось 2,5 квинтиллиона байт (2,5 миллиона терабайт) данных. Сегодня это число только увеличивается. Но, по-видимому, этого недостаточно, потому что экосистема Python имеет множество библиотек для создания синтетических данных. Возможно, некоторые из них созданы только для того, чтобы иметь возможность генерировать синтетические данные, но большинство из них имеют полезные дополнения, такие как:

  • Машинное обучение: когда реальные данные недоступны или их трудно получить для обучения модели;
  • Конфиденциальность и безопасность данных: Замените конфиденциальную информацию в наборах данных реалистичными, но не фактическими данными;
  • Тестирование и отладка: тестирование и отладка программного обеспечения с синтетическими данными в контролируемой среде;
  • Увеличение данных: искусственное создание большего количества точек данных из существующих данных с использованием машинного обучения или статистики.

В этой статье будут показаны шесть библиотек Python для вышеуказанных целей и то, как их использовать.

Случайная информация о пользователе с помощью Faker

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

  • Личная информация: имя, день рождения, электронная почта, пароль, адрес;
  • Все виды информации о дате и часовом поясе;
  • Финансовые реквизиты: кредитные карты, SSN, банковские услуги;
  • Разное: URL-адреса, предложения, языковые коды
  • и так далее...

Он также имеет интуитивно понятный API. После инициирования класса Faker вы можете сгенерировать новый поддельный элемент, вызвав его метод:

from faker import Faker fake = Faker() >>> fake.name() 'Nicole Perkins' >>> fake.address() '11669 Foster Cliffs Suite 161\nPort Elizabethfurt, OK 47591' >>> fake.url() 'http://www.wade.com/'

Все эти методы возвращают новые элементы при каждом вызове, поэтому легко создать искусственный набор данных CSV с помощью фрагмента кода, подобного приведённому ниже:

import pandas as pd df = pd.DataFrame( [ { "name": fake.name(), "address": fake.address(), "birthday": fake.date_of_birth(), "email": fake.email(), "password": fake.password(), } for _ in range(1000) ] ) df.to_csv("data/fake.csv", index=False)
df.sample(5)

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

Узнайте больше об этом из документации.

Синтетические наборы данных с Sklearn для задач ML

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

Её модуль datasets включает в себя множество функций для создания искусственных датасетов для различных задач машинного обучения. Наиболее популярными функциями являются make_classification и make_regression.

Обе имеют параметры n_samples и n_features для управления количеством строк и объектов, выводящихся результатом синтетического набора данных.

Чтобы контролировать сложность задачи, вы можете указать, сколько функций нужно или не стоит использовать, с помощью параметровn_informative (коррелированных) или n_redundant (линейных комбинаций информативных функций).

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

Существует также функция make_blobs для генерации задач кластеризации, как показано ниже:

import seaborn as sns from sklearn.datasets import make_blobs X, y = make_blobs(n_samples=500, n_features=2) sns.scatterplot(X[:, 0], X[:, 1], hue=y);

Если вы ищете что-то необычное, есть и другие функции, такие как make_checkboard, make_circles, make_moons и make_s_curve.

Набор данных с аномалиями в PyOD

Обнаружение аномалий - повсеместная проблема в Data Science. Качественные наборы данных с выбросами всегда трудно найти. К счастью, библиотека обнаружения выбросов Python (PyOD) имеет служебную функцию для генерации синтетических данных с выбросами:

from pyod.utils.data import generate_data import seaborn as sns import matplotlib.pyplot as plt X, y = generate_data( n_train=500, contamination=0.13, n_features=2, train_only=True, random_state=1 ) # Plot sns.scatterplot(X[:, 0], X[:, 1], hue=y) # Modify the damn legend legend = plt.legend(labels=['Inlier', 'Outlier']) legend.legendHandles[1].set_color("orange")

generate_data позволяет контролировать количество строк в обучающих и тестовых наборах, а также процент выбросов в результирующих наборах.

PyOD также обладает самым большим набором алгоритмов обнаружения аномалий в экосистеме Python.

Синтетические данные поверх другого набора данных с помощью CTGAN

Итак, перейдём к замечательному материалу.

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

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

CTGAN предоставляется проектом Synthetic Data Vault (SDV). Его Python API предоставляет класс CTGAN , который требует изучения набора данных и списка его категориальных столбцов.

Затем вы можете извлечь из него столько образцов, сколько захотите, с помощью функции sample. Ниже мы отбираем 20 тысяч синтетических образцов из набора данных cliché Iris:

import seaborn as sns import pandas as pd from ctgan import CTGAN # Extract categorical data types iris = sns.load_dataset("iris") categoricals = iris.select_dtypes(exclude="number").columns.tolist() # Fit CTGAN ctgan = CTGAN(epochs=10) ctgan.fit(iris, categoricals) # Generate the data synthetic_iris = ctgan.sample(20000) synthetic_iris.head()

Mimesis — Продвинутый Faker

Mimesis - это полноценный генератор случайной информации, построенный на базе Faker. Он может генерировать гораздо больше случайных атрибутов, чем Faker:

from mimesis import Generic from mimesis.locales import Locale # Spanish locale fake = Generic(Locale.ES) print(dir(fake))
address code development food locale payment text binaryfile cryptographic file hardware numeric person transport choice datetime finance internet path science

Его генераторы случайных чисел сгруппированы по 20 категориям, что делает Mimesis намного более организованным.

Он также в значительной степени поддерживает информацию о конкретной стране для 32 локализаций (языков). Ниже мы генерируем тысячу строк поддельных испанских данных:

from mimesis import Generic from mimesis.locales import Locale import pandas as pd # Spanish locale fake = Generic(Locale.ES) df = pd.DataFrame( [ { "name": fake.person.full_name(), "country": fake.address.country(), "birthday": fake.datetime.date(), "email": fake.person.email(), "password": fake.person.password(), } for _ in range(1000) ] ) df.head()

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

Узнайте больше об этом из обширной документации.

Увеличение изображения с помощью TensorFlow

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

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

Геометрические: поворот, перемещение, масштабирование, переворачивание — изменение размера, ориентации и положения объектов на изображенияхЦвет и яркость: случайные изменения яркости и контрастности для увеличения вариабельности освещения и цветовых условий.Шум и размытие: добавление эффектов случайного шума и размытия для имитации различных уровней качества изображения.

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

Увеличение изображения может быть выполнено многими способами в TensorFlow. Для задач классификации изображений существует класс ImageDataGenerator:

import tensorflow as tf train_datagen = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1.0 / 255, rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, zoom_range=0.15, horizontal_flip=True, fill_mode="nearest", )

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

train_generator = train_datagen.flow_from_directory( "data/raw/train", target_size=(50, 50), batch_size=32, class_mode="categorical", )

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

Чтобы flow_from_directory работал, структура папки dataset должна иметь иерархию, подобную приведённой ниже:

$ tree -L 3 data/raw/train data/raw/ ├── train │ ├── 0 │ ├── 1 │ ├── 2 | ... ├── validation │ ├── 0 │ ├── 1 │ ├── 2 | ...

Набор данных должен содержать учебные и проверочные (и тестовые) каталоги с изображениями, сгруппированными в отдельные папки под именем их класса.

Есть и другие альтернативы, если вы не можете принудительно преобразовать свой набор данных в такую структуру. Например, когда вы создаёте свои модели с помощью Keras Sequential API, вы можете использовать слои преобразования:

from tensorflow.keras import layers resize_and_rescale = tf.keras.Sequential([ layers.Resizing(IMG_SIZE, IMG_SIZE), layers.Rescaling(1./255) ]) image_augmentation = tf.keras.Sequential([ layers.RandomFlip("horizontal_and_vertical"), layers.RandomRotation(0.2), ]) model = tf.keras.Sequential([ # Add the preprocessing layers you created earlier. resize_and_rescale, data_augmentation, layers.Conv2D(16, 3, padding='same', activation='relu'), layers.MaxPooling2D(), # Rest of your model. ])

Заключение

Несмотря на то, что во всем мире уже и так имеется много данных, синтетические данные становятся всё более популярными. Это отражается в количестве появляющихся стартапов с синтетическими данными. Согласно анализу рынка, глобальная индустрия генерации синтетических данных в 2021 году стоила более 100 миллионов долларов и, как ожидается, будет расти в годовом исчислении на 34,8%.

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

Спасибо за чтение!

Статья была взята из этого источника:

0
Комментарии
-3 комментариев
Раскрывать всегда