April 5, 2022

Генерация данных для классификации

Рассмотрим возможности создания искусственных наборов данных с заданными свойствами для задач классификации. Как и датасеты для кластеризации их можно получить специальной функцией библиотеки Scikit-learn - make_classification.

Она имеет следующие параметры:

n_samples - количество точек данных;

n_classes - количество классов;

n_features - число признаков разных типов, количество каждого из которых задается параметрами:

n_informative - информативные,

n_redundant - производные (линейные комбинации информативных),

n_repeated - повторяющиеся.

Соответственно, бесполезных признаков - n_features-n_informative-n_redundant-n_repeated.

n_clusters_per_class - число кластеров, на который разбит каждый из классов точек.

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

class_sep - управляет длиной каждой из сторон кластера (равна 2*class_sep). Чем она больше, тем сильнее кластера отделяются;

weights - задает пропорции классов, чтобы вносить несбалансированность;

flip_y - доля точек, для которой класс задается случайно, вносит шум в данные;

random_state - инициализатор счетчика случайных чисел для воспроизводимости эксперимента;

shift - задает сдвиги в значениях признаков;

scale - определяет мультипликатор для признаков;

shuffle - опция перемешивания, при этом не только точек, но и порядка признаков, иначе они идут в последовательности - n_informative, n_redundant, n_repeated.

Из всего перечисленного самое сложное - это параметры, связанные с кластерами. Визуализируем взаимное распределение информативных координат точек для двух классов при разном количестве кластеров - 2 и 1:

from sklearn.datasets import make_classification
import seaborn as sns
X, y = make_classification(n_samples=1000, n_features=5, n_informative=2, 
                           n_redundant=0, class_sep = 3,random_state=0, shuffle=False, 
                           flip_y=0, n_clusters_per_class=2)

если кластера 2:

sns.scatterplot(x = X[:,0], y = X[:,1], hue=y)

Если 1:

X, y = make_classification(n_samples=1000, n_features=5, n_informative=2, n_redundant=0, class_sep = 3, random_state=0, shuffle=False, flip_y=0, n_clusters_per_class=1)
sns.scatterplot(x = X[:,0], y = X[:,1], hue=y)