آموزش هوش مصنوعی با پایتون - آماده‌سازی داده‌ها

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

این فصل بر روی آماده‌سازی داده‌ها برای الگوریتم‌های یادگیری ماشین تمرکز دارد.

پیش‌پردازش داده‌ها

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

مراحل پیش‌پردازش داده‌ها

برای پیش‌پردازش داده‌ها در پایتون مراحل زیر را دنبال کنید −

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

import numpy as np
import sklearn.preprocessing

در اینجا ما از دو پکیج زیر استفاده کرده‌ایم −

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

  • Sklearn.preprocessing − این پکیج توابع کاربردی رایج و کلاس‌های مبدل متعددی را برای تبدیل بردارهای ویژگی خام به نمایشی که برای الگوریتم‌های یادگیری ماشین مناسب‌تر باشد، ارائه می‌دهد.

مرحله ۲ − تعریف داده‌های نمونه − پس از وارد کردن پکیج‌ها، باید چند داده نمونه تعریف کنیم تا بتوانیم تکنیک‌های پیش‌پردازش را روی آن داده‌ها اعمال کنیم. اکنون داده‌های نمونه زیر را تعریف می‌کنیم −

input_data = np.array([2.1, -1.9, 5.5],
                      [-1.5, 2.4, 3.5],
                      [0.5, -7.9, 5.6],
                      [5.9, 2.3, -5.8])

مرحله ۳ − اعمال تکنیک پیش‌پردازش − در این مرحله، باید هر یک از تکنیک‌های پیش‌پردازش را اعمال کنیم.

بخش زیر تکنیک‌های پیش‌پردازش داده‌ها را توصیف می‌کند.

تکنیک‌های پیش‌پردازش داده‌ها

تکنیک‌های پیش‌پردازش داده‌ها در ادامه توصیف شده‌اند −

باینری‌سازی (Binarization)

این یک تکنیک پیش‌پردازش است که وقتی می‌خواهیم مقادیر عددی خود را به مقادیر بولین (Boolean) تبدیل کنیم استفاده می‌شود. می‌توانیم از یک متد توکار برای باینری‌سازی داده‌های ورودی استفاده کنیم، به عنوان مثال با استفاده از ۰.۵ به عنوان مقدار آستانه به روش زیر −

data_binarized = preprocessing.Binarizer(threshold = 0.5).transform(input_data)
print("\nBinarized data:\n", data_binarized)

حالا پس از اجرای کد بالا، خروجی زیر را دریافت خواهیم کرد؛ تمام مقادیر بالاتر از ۰.۵ (مقدار آستانه) به ۱ و تمام مقادیر زیر ۰.۵ به ۰ تبدیل می‌شوند.

داده‌های باینری‌شده

[[ 1. 0. 1.]
[ 0. 1. 1.]
[ 0. 0. 1.]
[ 1. 1. 0.]]

حذف میانگین (Mean Removal)

این یکی دیگر از تکنیک‌های بسیار رایج پیش‌پردازش است که در یادگیری ماشین استفاده می‌شود. اساساً از آن برای حذف میانگین از بردار ویژگی استفاده می‌شود تا هر ویژگی حول صفر مرکزیت یابد. همچنین می‌توانیم انحراف (bias) را از ویژگی‌ها در بردار ویژگی حذف کنیم. برای اعمال تکنیک پیش‌پردازش حذف میانگین روی داده‌های نمونه، می‌توانیم کد پایتون نشان‌داده‌شده در زیر را بنویسیم. این کد میانگین و انحراف معیار داده‌های ورودی را نمایش می‌دهد −

print("Mean = ", input_data.mean(axis = 0))
print("Std deviation = ", input_data.std(axis = 0))

پس از اجرای خطوط کد بالا، خروجی زیر را دریافت خواهیم کرد −

         Mean = [ 1.75       -1.275       2.2]
Std deviation = [ 2.71431391  4.20022321  4.69414529]

اکنون، کد زیر میانگین و انحراف معیار داده‌های ورودی را حذف می‌کند −

data_scaled = preprocessing.scale(input_data)
print("Mean =", data_scaled.mean(axis=0))
print("Std deviation =", data_scaled.std(axis = 0))

پس از اجرای خطوط کد بالا، خروجی زیر را دریافت خواهیم کرد −

         Mean = [ 1.11022302e-16 0.00000000e+00 0.00000000e+00]
Std deviation = [ 1.             1.             1.]

مقیاس‌بندی (Scaling)

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

# مقیاس‌بندی کمینه-بیشینه (Min max scaling)

data_scaler_minmax = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = data_scaler_minmax.fit_transform(input_data)
print ("\nMin max scaled data:\n", data_scaled_minmax)

پس از اجرای خطوط کد بالا، خروجی زیر را دریافت خواهیم کرد −

داده‌های مقیاس‌بندی‌شده کمینه-بیشینه

[ [ 0.48648649  0.58252427   0.99122807]
[   0.          1.           0.81578947]
[   0.27027027  0.           1.        ]
[   1.          0. 99029126  0.        ]]

نرمال‌سازی (Normalization)

این یکی دیگر از تکنیک‌های پیش‌پردازش داده‌ها است که برای تغییر بردارهای ویژگی استفاده می‌شود. چنین تغییری برای اندازه‌گیری بردارهای ویژگی در یک مقیاس مشترک ضروری است. در ادامه دو نوع نرمال‌سازی آورده شده است که می‌توان در یادگیری ماشین از آن‌ها استفاده کرد −

نرمال‌سازی L1

به آن کمترین انحرافات قدر مطلقی (Least Absolute Deviations) نیز گفته می‌شود. این نوع نرمال‌سازی مقادیر را طوری تغییر می‌دهد که مجموع مقادیر قدر مطلقی در هر سطر همیشه تا ۱ باشد. این کار را می‌توان با کمک کد پایتون زیر روی داده‌های ورودی پیاده‌سازی کرد −

# Normalize data
data_normalized_l1 = preprocessing.normalize(input_data, norm = 'l1')
print("\nL1 normalized data:\n", data_normalized_l1)

خط کد بالا خروجی زیر را تولید می‌کند −

L1 normalized data:
[[ 0.22105263  -0.2          0.57894737]
[ -0.2027027    0.32432432   0.47297297]
[  0.03571429  -0.56428571   0.4       ]
[  0.42142857   0.16428571  -0.41428571]]

نرمال‌سازی L2

به آن کمترین مربعات (Least Squares) نیز گفته می‌شود. این نوع نرمال‌سازی مقادیر را طوری تغییر می‌دهد که مجموع مربعات در هر سطر همیشه تا ۱ باشد. این کار را می‌توان با کمک کد پایتون زیر روی داده‌های ورودی پیاده‌سازی کرد −

# Normalize data
data_normalized_l2 = preprocessing.normalize(input_data, norm = 'l2')
print("\nL2 normalized data:\n", data_normalized_l2)

خط کد بالا خروجی زیر را تولید خواهد کرد −

L2 normalized data:
[[ 0.33946114  -0.30713151   0.88906489]
[ -0.33325106   0.53320169   0.7775858 ]
[  0.05156558  -0.81473612   0.57753446]
[  0.68706914   0.26784051  -0.6754239 ]]

برچسب‌گذاری داده‌ها

ما از قبل می‌دانیم که داده‌ها با فرمتی خاص برای الگوریتم‌های یادگیری ماشین ضروری هستند. یکی دیگر از الزامات مهم این است که داده‌ها باید قبل از ارسال به عنوان ورودی الگوریتم‌های یادگیری ماشین، به درستی برچسب‌گذاری شوند. به عنوان مثال، اگر درباره طبقه‌بندی (Classification) صحبت کنیم، برچسب‌های زیادی روی داده‌ها وجود دارد. آن برچسب‌ها به شکل کلمات، اعداد و غیره هستند. توابع مربوط به یادگیری ماشین در sklearn انتظار دارند که داده‌ها دارای برچسب‌های عددی باشند. بنابراین، اگر داده‌ها به شکل دیگری باشند، باید به عدد تبدیل شوند. این فرآیند تبدیل برچسب‌های کلمه‌ای به شکل عددی، کدگذاری برچسب (Label Encoding) نامیده می‌شود.

مراحل کدگذاری برچسب

برای کدگذاری برچسب‌های داده‌ها در پایتون مراحل زیر را دنبال کنید −

مرحله ۱ − وارد کردن پکیج‌های کاربردی

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

import numpy as np
from sklearn import preprocessing

مرحله ۲ − تعریف برچسب‌های نمونه

پس از وارد کردن پکیج‌ها، باید چند برچسب نمونه تعریف کنیم تا بتوانیم کدگذار برچسب (Label Encoder) را ساخته و آموزش دهیم. اکنون برچسب‌های نمونه زیر را تعریف می‌کنیم −

# Sample input labels
input_labels = ['red','black','red','green','black','yellow','white']

مرحله ۳ − ساخت و آموزش شیء کدگذار برچسب

در این مرحله، باید کدگذار برچسب را بسازیم و آن را آموزش دهیم. کد پایتون زیر به انجام این کار کمک می‌کند −

# Creating the label encoder
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

پس از اجرای کد پایتون بالا، خروجی زیر حاصل می‌شود −

LabelEncoder()

مرحله ۴ − بررسی عملکرد با کدگذاری یک لیست با ترتیب تصادفی

از این مرحله می‌توان برای بررسی عملکرد با کدگذاری یک لیست با ترتیب تصادفی استفاده کرد. کد پایتون زیر را می‌توان برای انجام همین کار نوشت −

# encoding a set of labels
test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)

برچسب‌ها به صورت زیر چاپ می‌شوند −

Labels = ['green', 'red', 'black']

اکنون، می‌توانیم لیست مقادیر کدگذاری‌شده، یعنی برچسب‌های کلمه‌ای تبدیل‌شده به اعداد را به صورت زیر به دست آوریم −

print("Encoded values =", list(encoded_values))

مقادیر کدگذاری‌شده به صورت زیر چاپ می‌شوند −

Encoded values = [1, 2, 0]

مرحله ۵ − بررسی عملکرد با رمزگشایی یک مجموعه تصادفی از اعداد −

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

# decoding a set of values
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)
print("\nEncoded values =", encoded_values)

اکنون، مقادیر کدگذاری‌شده به صورت زیر چاپ می‌شوند −

Encoded values = [3, 0, 4, 1]
print("\nDecoded labels =", list(decoded_list))

اکنون، مقادیر رمزگشایی‌شده به صورت زیر چاپ می‌شوند −

Decoded labels = ['white', 'black', 'yellow', 'green']

داده‌های برچسب‌دار در برابر داده‌های بدون برچسب

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

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

سناریوهای زیادی وجود دارد که در آن‌ها داده‌های بدون برچسب فراوان بوده و به راحتی به دست می‌آیند، اما داده‌های برچسب‌دار اغلب به یک انسان/متخصص برای یادداشت‌نویسی (تفسیر) نیاز دارند. یادگیری نیمه‌نظارت‌شده تلاش می‌کند داده‌های برچسب‌دار و بدون برچسب را ترکیب کند تا مدل‌های بهتری بسازد.

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