وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

تولید داده های مصنوعی با Numpy و Scikit-Learn

0 30
زمان لازم برای مطالعه: 7 دقیقه


معرفی

در این آموزش، جزئیات تولید مجموعه داده های مصنوعی مختلف با استفاده از ناامپی و Scikit- Learn کتابخانه ها خواهیم دید که چگونه می توان نمونه های مختلف را از توزیع های مختلف با پارامترهای شناخته شده تولید کرد.

همچنین در مورد تولید مجموعه داده ها برای اهداف مختلف، مانند رگرسیون، طبقه بندی و خوشه بندی بحث خواهیم کرد. در پایان خواهیم دید که چگونه می توانیم مجموعه داده ای تولید کنیم که توزیع یک مجموعه داده موجود را تقلید کند.

نیاز به داده های مصنوعی

در علم داده، داده های مصنوعی نقش بسیار مهمی دارند. این به ما امکان می دهد الگوریتم جدیدی را تحت شرایط کنترل شده آزمایش کنیم. به عبارت دیگر، می‌توانیم داده‌هایی تولید کنیم که ویژگی یا رفتار بسیار خاصی از الگوریتم ما را آزمایش کند.

به عنوان مثال می توانیم عملکرد آن را آزمایش کنیم روی مجموعه داده های متعادل در مقابل نامتعادل، یا می توانیم عملکرد آن را در سطوح مختلف نویز ارزیابی کنیم. با انجام این کار، می‌توانیم یک خط پایه از عملکرد الگوریتم خود تحت سناریوهای مختلف ایجاد کنیم.

موارد بسیار دیگری وجود دارد که ممکن است به داده های مصنوعی نیاز باشد. به عنوان مثال، به دست آوردن داده های واقعی ممکن است سخت یا پرهزینه باشد، یا ممکن است نقاط داده بسیار کمی داشته باشند. دلیل دیگر حریم خصوصی است، جایی که داده های واقعی را نمی توان برای دیگران فاش کرد.

راه اندازی

قبل از نوشتن کد برای تولید داده های مصنوعی، اجازه دهید import کتابخانه های مورد نیاز:

import numpy as np


import matplotlib.colors
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


import sklearn.datasets as dt


from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV

سپس، در ابتدا چند متغیر مفید خواهیم داشت:


seed = 11
rand_state = 11


color_map = plt.cm.get_cmap('RdYlBu')
color_map_discrete = matplotlib.colors.LinearSegmentedColormap.from_list("", ("red","cyan","magenta","blue"))

تولید نمونه های 1 بعدی از توزیع های شناخته شده

اکنون، ما در مورد تولید نقاط نمونه از توزیع های شناخته شده در یک بعدی صحبت خواهیم کرد.

را random ماژول از numpy طیف گسترده ای از راه ها را برای تولید اعداد تصادفی نمونه برداری شده از یک توزیع شناخته شده با مجموعه ای ثابت از پارامترها ارائه می دهد. برای اهداف بازتولید، ما را تصویب خواهیم کرد seed به RandomState تماس بگیرید و تا زمانی که از همان seed استفاده می کنیم، همان شماره ها را دریافت می کنیم.

بیایید یک لیست توزیع تعریف کنیم، مانند uniform، normal، exponentialو غیره، یک لیست پارامتر، و یک لیست رنگی به طوری که ما بتوانیم بین این موارد به صورت بصری تشخیص دهیم:

rand = np.random.RandomState(seed)

dist_list = ('uniform','normal','exponential','lognormal','chisquare','beta')
param_list = ('-1,1','0,1','1','0,1','2','0.5,0.9')
colors_list = ('green','blue','yellow','cyan','magenta','pink')

اکنون، اینها را در قالب های فرعی a بسته بندی می کنیم Figure برای تجسم و تولید داده های مصنوعی مبتنی بر روی این توزیع‌ها، پارامترها و رنگ‌های مناسب را به آنها اختصاص می‌دهند.

این کار از طریق eval() تابعی که از آن برای تولید عبارت پایتون استفاده می کنیم. به عنوان مثال می توانیم استفاده کنیم rand.exponential(1, 5000) برای تولید نمونه از توزیع نمایی مقیاس 1 و اندازه 5000.

در اینجا، ما از خود استفاده خواهیم کرد dist_list، param_list و color_list برای ایجاد این تماس ها:

fig,ax = plt.subplots(nrows=2, ncols=3,figsize=(12,7))
plt_ind_list = np.arange(6)+231

for dist, plt_ind, param, colors in zip(dist_list, plt_ind_list, param_list, colors_list):
    x = eval('rand.'+dist+'('+param+',5000)')

    plt.subplot(plt_ind)
    plt.hist(x,bins=50,color=colors)
    plt.title(dist)

fig.subplots_adjust(hspace=0.4,wspace=.3) 
plt.suptitle('Sampling from Various Distributions',fontsize=20)
plt.show()

این منجر به:

تولید نمونه های 1 بعدی با numpy

داده های ترکیبی برای رگرسیون

را بسته sklearn.datasets دارای توابع برای تولید مجموعه داده های مصنوعی برای رگرسیون در اینجا، داده های خطی و غیر خطی را برای رگرسیون مورد بحث قرار می دهیم.

را make_regression() تابع مجموعه ای از نقاط داده ورودی (رگرسیون) را به همراه خروجی آنها (هدف) برمی گرداند. این تابع را می توان با پارامترهای زیر تنظیم کرد:

  1. n_features – تعداد ابعاد/ویژگی های داده های تولید شده
  2. noise – انحراف استاندارد نویز گاوسی
  3. n_samples – تعداد نمونه ها

متغیر پاسخ ترکیبی خطی از مجموعه ورودی تولید شده است.

متغیر پاسخ چیزی است که وابسته است روی متغیرهای دیگر، در این مورد خاص، یک ویژگی هدف است که سعی می کنیم با استفاده از تمام ویژگی های ورودی دیگر آن را پیش بینی کنیم.

در کد زیر، داده های مصنوعی برای سطوح مختلف نویز تولید شده است و از دو ویژگی ورودی و یک متغیر هدف تشکیل شده است. تغییر رنگ نقاط ورودی، تغییر در مقدار هدف، مربوط به نقطه داده را نشان می دهد. داده ها برای تجسم بهتر به صورت دو بعدی تولید می شوند، اما داده های با ابعاد بالا را می توان با استفاده از آن ایجاد کرد n_features پارامتر:

map_colors = plt.cm.get_cmap('RdYlBu')
fig,ax = plt.subplots(nrows=2, ncols=3,figsize=(16,7))
plt_ind_list = np.arange(6)+231

for noise,plt_ind in zip((0,0.1,1,10,100,1000),plt_ind_list): 
    x,y = dt.make_regression(n_samples=1000,
                             n_features=2,
                             noise=noise,
                             random_state=rand_state)

    plt.subplot(plt_ind)
    my_scatter_plot = plt.scatter(x(:,0),
                                  x(:,1),
                                  c=y,
                                  vmin=min(y),
                                  vmax=max(y),
                                  s=35,
                                  cmap=color_map)
    
    plt.title('noise: '+str(noise))
    plt.colorbar(my_scatter_plot)
    
fig.subplots_adjust(hspace=0.3,wspace=.3)
plt.suptitle('make_regression() With Different Noise Levels',fontsize=20)
plt.show()

در اینجا، ما مجموعه ای از 1000 نمونه، با دو متغیر ورودی (ویژگی) ایجاد کرده ایم. بسته به روی سطح سر و صدا (0..1000، می توانیم ببینیم که چگونه داده های تولید شده به طور قابل توجهی متفاوت است روی طرح پراکندگی:

تولید داده های مصنوعی برای رگرسیون

را make_friedman خانواده توابع

سه نسخه از آن وجود دارد make_friedman?() تابع (جایگزین ? با مقدار از {1,2,3}).

این توابع متغیر هدف را با استفاده از ترکیب غیر خطی متغیرهای ورودی تولید می کنند که در زیر به تفصیل شرح داده شده است:

  • make_friedman1(): n_features آرگومان این تابع باید حداقل 5 باشد، بنابراین حداقل تعداد 5 بعد ورودی ایجاد می شود. در اینجا هدف توسط:
    $$
    y(x) = 10 * \sin(\pi x_0 x_1) + 20(x_2 – 0.5)^2 + 10x_3 + 5x_4 + \text{نویز}
    $$

  • make_friedman2(): داده های تولید شده دارای 4 بعد ورودی است. متغیر پاسخ به صورت زیر ارائه می شود:

$$
y(x) = \sqrt{(x_0^2+x_1 x_2 – \frac{1}{(x_1 x_3)^2})} + \text{نویز}
$$

  • make_friedman3(): داده های تولید شده در این حالت نیز دارای 4 بعد می باشد. متغیر خروجی به صورت زیر داده می شود:

$$
y(x) = \arctan(\frac{x_1 x_2 -\frac{1}{(x_1 x_3)}}{x_0})+\text{نویز}
$$

کد زیر مجموعه داده ها را با استفاده از این توابع تولید می کند و سه ویژگی اول را به صورت سه بعدی ترسیم می کند که رنگ ها بر اساس متغیر هدف متفاوت است:

fig = plt.figure(figsize=(18,5))

x,y = dt.make_friedman1(n_samples=1000,n_features=5,random_state=rand_state)
ax = fig.add_subplot(131, projection='3d')
my_scatter_plot = ax.scatter(x(:,0), x(:,1),x(:,2), c=y, cmap=color_map)
fig.colorbar(my_scatter_plot)
plt.title('make_friedman1')

x,y = dt.make_friedman2(n_samples=1000,random_state=rand_state)
ax = fig.add_subplot(132, projection='3d')
my_scatter_plot = ax.scatter(x(:,0), x(:,1),x(:,2), c=y, cmap=color_map)
fig.colorbar(my_scatter_plot)
plt.title('make_friedman2')

x,y = dt.make_friedman3(n_samples=1000,random_state=rand_state)
ax = fig.add_subplot(133, projection='3d')
my_scatter_plot = ax.scatter(x(:,0), x(:,1),x(:,2), c=y, cmap=color_map)
fig.colorbar(my_scatter_plot)
plt.suptitle('make_friedman?() for Non-Linear Data',fontsize=20)
plt.title('make_friedman3')

plt.show()

خانواده کارکردهای فریدمن را بسازید

داده های مصنوعی برای طبقه بندی

Scikit- Learn دارای توابع ساده و آسان برای تولید مجموعه داده ها برای طبقه بندی در sklearn.dataset مدول. اجازه دهید چند مثال را مرور کنیم.

make_classification() برای مسائل طبقه بندی n-Class

برای مسائل طبقه بندی n کلاس، make_classification() تابع چندین گزینه دارد:

  1. class_sep: مشخص می کند که آیا طبقات مختلف باید گسترده تر باشند و تشخیص آنها آسان تر باشد
  2. n_features: تعداد امکانات
  3. n_redundant: تعداد ویژگی های اضافی
  4. n_repeated: تعداد ویژگی های تکراری
  5. n_classes: تعداد کل کلاس ها

بیایید یک مجموعه داده طبقه بندی برای داده های ورودی دو بعدی بسازیم. ما ارزش های متفاوتی خواهیم داشت class_sep برای یک مشکل طبقه بندی باینری نقاط رنگی یکسان متعلق به یک کلاس هستند. شایان ذکر است که این تابع همچنین می تواند کلاس های نامتعادل ایجاد کند:

fig,ax = plt.subplots(nrows=1, ncols=3,figsize=(16,5))
plt_ind_list = np.arange(3)+131

for class_sep,plt_ind in zip((0.1,1,10),plt_ind_list):
    x,y = dt.make_classification(n_samples=1000,
                                 n_features=2,
                                 n_repeated=0,
                                 class_sep=class_sep,
                                 n_redundant=0,
                                 random_state=rand_state)

    plt.subplot(plt_ind)
    my_scatter_plot = plt.scatter(x(:,0),
                                  x(:,1),
                                  c=y,
                                  vmin=min(y),
                                  vmax=max(y),
                                  s=35,
                                  cmap=color_map_discrete)
    plt.title('class_sep: '+str(class_sep))

fig.subplots_adjust(hspace=0.3,wspace=.3)
plt.suptitle('make_classification() With Different class_sep Values',fontsize=20)
plt.show()

برای کلاس های n طبقه بندی کنید

make_multilabel_classification() برای مسائل طبقه بندی چند برچسبی

make_multilabel_classification() تابع داده هایی را برای مسائل طبقه بندی چند برچسبی تولید می کند. گزینه های مختلفی دارد که قابل توجه ترین آنهاست n_label، که میانگین تعداد برچسب ها را در هر نقطه داده تعیین می کند.

بیایید یک مشکل چند برچسبی 4 کلاسه را در نظر بگیریم، با بردار هدف برچسب ها که برای تجسم به یک مقدار تبدیل می شود. نقاط با توجه به نمایش اعشاری بردار برچسب باینری رنگ می شوند. کد به شما کمک می کند تا ببینید که چگونه از یک مقدار متفاوت برای استفاده می کنید n_label، طبقه بندی یک نقطه داده تولید شده را تغییر می دهد:

fig,ax = plt.subplots(nrows=1, ncols=3,figsize=(16,5))
plt_ind_list = np.arange(3)+131

for label,plt_ind in zip((2,3,4),plt_ind_list):
    x,y = dt.make_multilabel_classification(n_samples=1000,
                                            n_features=2,
                                            n_labels=label,
                                            n_classes=4,
                                            random_state=rand_state)
    target = np.sum(y*(8,4,2,1),axis=1)

    plt.subplot(plt_ind)
    my_scatter_plot = plt.scatter(x(:,0),
                                  x(:,1),
                                  c=target,
                                  vmin=min(target),
                                  vmax=max(target),
                                  cmap=color_map)
    plt.title('n_labels: '+str(label))

fig.subplots_adjust(hspace=0.3,wspace=.3)
plt.suptitle('make_multilabel_classification() With Different n_labels Values',fontsize=20)
plt.show()

طبقه بندی چند برچسبی

داده های ترکیبی برای خوشه بندی

برای خوشه بندی، sklearn.datasets چندین گزینه ارائه می دهد. در اینجا، ما را پوشش خواهیم داد make_blobs() و make_circles() کارکرد.

make_blobs()

را make_blobs() تابع داده ها را از توزیع های گاوسی همسانگرد تولید می کند. تعداد ویژگی ها، تعداد مراکز و انحراف استاندارد هر خوشه را می توان به عنوان یک آرگومان مشخص کرد.

در اینجا، این تابع را به صورت دو بعدی نشان می دهیم و نشان می دهیم که چگونه نقاط داده با مقادیر مختلف تغییر می کنند cluster_std پارامتر:

fig,ax = plt.subplots(nrows=1, ncols=3,figsize=(16,5))
plt_ind_list = np.arange(3)+131

for std,plt_ind in zip((0.5,1,10),plt_ind_list):
    x, label = dt.make_blobs(n_features=2,
                             centers=4,
                             cluster_std=std,
                             random_state=rand_state)

    plt.subplot(plt_ind)
    my_scatter_plot = plt.scatter(x(:,0),
                                  x(:,1),
                                  c=label,
                                  vmin=min(label),
                                  vmax=max(label),
                                  cmap=color_map_discrete)
    plt.title('cluster_std: '+str(std))

fig.subplots_adjust(hspace=0.3,wspace=.3)
plt.suptitle('make_blobs() With Different cluster_std Values',fontsize=20)
plt.show()

داده های مصنوعی برای خوشه بندی

make_circles()

را make_circles() تابع دو دایره متحدالمرکز با مرکز یکسان، یکی در داخل دیگری ایجاد می کند.

با استفاده از پارامتر نویز می توان اعوجاج را به داده های تولید شده اضافه کرد. این نوع داده برای ارزیابی الگوریتم‌های خوشه‌بندی مبتنی بر قرابت مفید است. کد زیر داده های مصنوعی تولید شده در سطوح مختلف نویز را نشان می دهد:

fig,ax = plt.subplots(nrows=1, ncols=3,figsize=(16,5))
plt_ind_list = np.arange(3)+131

for noise,plt_ind in zip((0,0.1,1),plt_ind_list):
    x, label = dt.make_circles(noise=noise,random_state=rand_state)

    plt.subplot(plt_ind)
    my_scatter_plot = plt.scatter(x(:,0),
                                  x(:,1),
                                  c=label,
                                  vmin=min(label),
                                  vmax=max(label),
                                  cmap=color_map_discrete)
    plt.title('noise: '+str(noise))

fig.subplots_adjust(hspace=0.3,wspace=.3)
plt.suptitle('make_circles() With Different Noise Levels',fontsize=20)
plt.show()

دایره های داده مصنوعی بسازید

تولید نمونه های مشتق شده از مجموعه داده های ورودی

راه‌های زیادی برای تولید نمونه‌های داده اضافی از یک مجموعه داده موجود وجود دارد. در اینجا، ما یک روش بسیار ساده را نشان می دهیم که ابتدا چگالی هسته داده ها را با استفاده از یک هسته گاوسی تخمین می زند و سپس نمونه های اضافی را از این توزیع تولید می کند.

برای تجسم نمونه های تازه تولید شده، اجازه دهید به مجموعه داده چهره های Olivetti، قابل بازیابی از طریق نگاه کنیم. sklearn.datasets.fetch_olivetti_faces(). مجموعه داده دارای 10 تصویر مختلف از چهره 40 فرد مختلف است.

این چیزی است که ما انجام خواهیم داد:

  1. داده های چهره را دریافت کنید
  2. مدل چگالی هسته را از داده ها ایجاد کنید
  3. از چگالی هسته برای تولید نمونه های جدید داده استفاده کنید
  4. نمایش چهره های اصلی و مصنوعی.

faces = dt.fetch_olivetti_faces()
X = faces.data


bandwidth_params = {'bandwidth': np.arange(0.01,1,0.05)}
grid_search = GridSearchCV(KernelDensity(), bandwidth_params)
grid_search.fit(X)
kde = grid_search.best_estimator_


new_faces = kde.sample(8, random_state=rand_state)


fig,ax = plt.subplots(nrows=2, ncols=8,figsize=(18,6),subplot_kw=dict(xticks=(), yticks=()))
for i in np.arange(8):
    ax(0,i).imshow(X(10*i,:).reshape(64,64),cmap=plt.cm.gray)
    ax(1,i).imshow(new_faces(i,:).reshape(64,64),cmap=plt.cm.gray)
ax(0,3).set_title('Original Data',fontsize=20)
ax(1,3).set_title('Synthetic Data',fontsize=20)
fig.subplots_adjust(wspace=.1)
plt.show()

تولید داده های مصنوعی مبتنی بر on ورودی

چهره‌های اصلی که در اینجا نشان داده شده‌اند نمونه‌ای از 8 چهره هستند که از بین 400 تصویر انتخاب شده‌اند تا ایده‌ای در مورد اینکه مجموعه داده اصلی چگونه است. ما می‌توانیم با استفاده از آن هر تعداد نقطه داده جدید تولید کنیم sample() تابع.

در این مثال 8 نمونه جدید تولید شد. توجه داشته باشید که چهره های مصنوعی نشان داده شده در اینجا لزوماً با چهره شخصی که در بالای آن نشان داده شده است مطابقت ندارد.

نتیجه گیری

در این مقاله با چند روش تولید مجموعه داده مصنوعی برای مشکلات مختلف آشنا شدیم. مجموعه داده‌های مصنوعی به ما کمک می‌کنند الگوریتم‌های خود را تحت شرایط کنترل‌شده ارزیابی کنیم و یک خط پایه برای معیارهای عملکرد تعیین کنیم.

پایتون دارای طیف گسترده ای از توابع است که می تواند برای تولید داده های مصنوعی استفاده شود. درک اینکه کدام توابع و APIها می توانند برای نیازهای خاص شما استفاده شوند بسیار مهم است.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-15 22:16:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید