Что значит добавить gaussian noise = 0.05 в scikit-learn make_circle()? Как это повлияет на данные?

#python #machine-learning #scikit-learn

#python #машинное обучение #scikit-learn

Вопрос:

Я работаю над гиперпараметрической настройкой нейронных сетей и просматриваю примеры. Я наткнулся на этот код в одном примере:

 train_X, train_Y = sklearn.datasets.make_circles(n_samples=300, noise=.05)
  

Я понимаю, что добавление шума оказывает влияние на регуляризацию данных. Чтение документации для этого говорит о том, что он добавляет шум гуассиана. Однако в приведенном выше коде я не мог понять, что значит добавлять 0.05 шум в данные. Как это повлияет на данные математически здесь?

Я попробовал приведенный ниже код. Я мог видеть изменение значений, но не мог понять, как, например, значения row1 из x в массиве 1 изменились путем добавления noise= .05 к соответствующей строке в массиве 2, т.е. x_1 здесь?

 np.random.seed(0)
x,y = sklearn.datasets.make_circles()
print(x[:5,:])

x_1,y_1 = sklearn.datasets.make_circles(noise= .05)
print(x_1[:5,:])
  

Вывод:

 [[-9.92114701e-01 -1.25333234e-01]
 [-1.49905052e-01 -7.85829801e-01]
 [ 9.68583161e-01  2.48689887e-01]
 [ 6.47213595e-01  4.70228202e-01]
 [-8.00000000e-01 -2.57299624e-16]]

[[-0.66187208  0.75151712]
 [-0.86331995 -0.56582111]
 [-0.19574479  0.7798686 ]
 [ 0.40634757 -0.78263011]
 [-0.7433193   0.26658851]]
  

Ответ №1:

Согласно документации:

sklearn.datasets.make_circles(n_samples=100, *, shuffle= True, noise= None, random_state = None, factor = 0.8)
Создайте большой круг, содержащий меньший круг в 2d. Простой игрушечный набор данных для визуализации алгоритмов кластеризации и классификации.

шум: двойное или нулевое (по умолчанию= Нет) Стандартное отклонение гауссовского шума, добавленного к данным.

Утверждение make_circles(noise=0.05) означает, что оно создает случайные круги с небольшими вариациями в соответствии с распределением Гаусса, также известным как нормальное распределение. Вы уже должны знать, что случайное распределение по Гауссу означает, что генерируемые числа имеют некоторое среднее значение и стандартное определение. В этом случае вызов make_circles(noise=0.05) означает, что стандартное отклонение равно 0.05.

Давайте вызовем функцию, проверим ее выходные данные и посмотрим, каков эффект от изменения параметра noise . Я позаимствую многое из этого замечательного руководства по созданию фиктивных данных scikit-learn.

Давайте сначала вызовем make_circles() с noise=0.0 помощью и посмотрим на данные. Я буду использовать фрейм данных Pandas, чтобы мы могли видеть данные в табличном виде.

 from sklearn.datasets import make_circles
import matplotlib.pyplot as plt
import pandas as pd

n_samples = 100
noise = 0.00

features, labels = make_circles(n_samples=n_samples, noise=noise)
df = pd.DataFrame(dict(x=features[:,0], y=features[:,1], label=labels))
print(df.head())
#           x         y  label
# 0 -0.050232  0.798421      1
# 1  0.968583  0.248690      0
# 2 -0.809017  0.587785      0
# 3 -0.535827  0.844328      0
# 4  0.425779 -0.904827      0
  

Вы можете видеть, что make_circles возвращает экземпляры данных, где каждый экземпляр является точкой с двумя объектами, x и y, и меткой. Давайте построим их, чтобы увидеть, как они на самом деле выглядят.

 # Collect the points together by label, either 0 or 1
grouped = df.groupby('label')

colors = {0:'red', 1:'blue'}
fig, ax = plt.subplots(figsize=(7,7))
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', marker='.', label=key, color=colors[key])
plt.title('Points')
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.grid()
plt.show()
  

введите описание изображения здесь

Похоже, что он создает два концентрических круга, каждый с разной меткой.

Давайте увеличим шум до noise=0.05 и посмотрим результат:

 n_samples = 100
noise = 0.05  # <--- The only change

features, labels = make_circles(n_samples=n_samples, noise=noise)
df = pd.DataFrame(dict(x=features[:,0], y=features[:,1], label=labels))

grouped = df.groupby('label')

colors = {0:'red', 1:'blue'}
fig, ax = plt.subplots(figsize=(7,7))
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', marker='.', label=key, color=colors[key])
plt.title('Points')
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.grid()
plt.show()
  

введите описание изображения здесь

Похоже, что шум добавляется к каждой из координат x, y, чтобы каждая точка немного смещалась. Когда мы проверяем код make_circles() , мы видим, что реализация делает именно это:

 def make_circles( ..., noise=None, ...):

    ...
    if noise is not None:
        X  = generator.normal(scale=noise, size=X.shape)
  

Итак, теперь мы увидели две визуализации набора данных с двумя значениями noise . Но две визуализации — это не круто. Знаете, что круто? Пять визуализаций с постепенным увеличением шума в 10 раз. Вот функция, которая это делает:

 def make_circles_plot(n_samples, noise):

    assert n_samples > 0
    assert noise >= 0

    # Use make_circles() to generate random data points with noise.
    features, labels = make_circles(n_samples=n_samples, noise=noise)

    # Create a dataframe for later plotting.
    df = pd.DataFrame(dict(x=features[:,0], y=features[:,1], label=labels))
    grouped = df.groupby('label')
    colors = {0:'red', 1:'blue'}

    fig, ax = plt.subplots(figsize=(5, 5))

    for key, group in grouped:
        group.plot(ax=ax, kind='scatter', x='x', y='y', marker='.', label=key, color=colors[key])
    plt.title('Points with noise=%f' % noise)
    plt.xlim(-2, 2)
    plt.ylim(-2, 2)
    plt.grid()
    plt.tight_layout()
    plt.show()
  

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

 for noise in [0.0, 0.01, 0.1, 1.0, 10.0]:
    make_circles_plot(500, noise)
  

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь