#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)