ما قبلاً الگوریتمهای یادگیری ماشین نظارت شده(supervised) و همچنین نظارت نشده(unsupervised) را مطالعه کرده ایم. این الگوریتمها برای شروع فرایند آموزش، به داده های فرمت شده نیاز دارند. ما باید دادهها را به روشی خاص آماده یا قالب بندی کنیم تا بتواند به عنوان ورودی الگوریتم های ML مورد استفاده قرار گیرند. در این بخش به آمادهسازی دادهها برای استفاده در الگوریتمهای یادگیری ماشین میپردازیم.
پیشپردازش دادهها(Preprocessing the Data)
در زندگی روزمره ما با دادههای زیادی سروکار داریم اما این دادهها به صورت خام هستند. برای آمادهسازی داده به عنوان ورودی الگوریتمهای یادگیری ماشین، باید آن را به یک داده معنی دار تبدیل کنیم. اینجاست که پیشپردازش دادهها به تصویر کشیده میشود. به عبارت دیگر، میتوان گفت قبل از ارائه دادهها به الگوریتمهای یادگیری ماشین، ما نیاز به پیشپردازش دادهها داریم.
مراحل پیشپردازش دادهها
برای پیشپردازش دادهها در پایتون، این مراحل را دنبال کنید:
مرحله ۱ – وارد کردن بسته های مفید:
اگر از پایتون استفاده می کنیم، پیشپردازش اطلاعات اولین قدم برای تبدیل دادهها به یک قالب خاص، یعنی پردازش اولیه خواهد بود و میتواند به شرح زیر انجام شود:
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
این روش هنگامی که ما نیاز به تبدیل مقادیر عددی خود به مقادیر بولی(درست/نادرست) داریم، استفاده می شود. ما میتوانیم از یک روش inbuilt استفاده کنیم تا دادههای ورودی را با استفاده از یک مقدار آستانه که در مثال زیر ۰٫۵ است، به صورت زیر باریک سازی کنیم:
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
این یکی دیگر از تکنیکهای پیشپردازش بسیار رایج است که در یادگیری ماشین استفاده می شود. در اصل از آن برای از بین بردن میانگین از بردار ویژگی استفاده می شود تا هر ویژگی در صفر محور باشد. همچنین می توان سوگیری را از ویژگیهای موجود در بردار ویژگی حذف کرد. برای استفاده از تکنیک پیشپردازش حذف میانگین بر روی داده های نمونه، میتوانیم کد پایتون را که در زیر آورده شده بنویسیم. کد، میانگین و انحراف معیار داده های ورودی را نمایش می دهد:
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.]
مقیاس گذاری
یکی دیگر از تکنیکهای پیشپردازش داده است که برای مقیاسبندی بردارهای ویژگی استفاده میشود. مقیاسبندی بردارهای ویژگی مورد نیاز است زیرا مقادیر هر ویژگی می تواند بین بسیاری از مقادیر تصادفی متفاوت باشد. به عبارت دیگر می توان گفت که مقیاسبندی مهم است زیرا نمیخواهیم هیچ ویژگی از نظر مصنوعی بزرگ یا کوچک باشد. با کمک کد پایتون زیر میتوانیم مقیاسگذاری دادههای ورودی خود مانند بردار ویژگی را انجام دهیم.
# مقیاس حداقل حداکثر:
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. ]]
نرمالسازی
یکی دیگر از تکنیکهای پیشپردازش داده است که برای اصلاح بردارهای ویژگی استفاده می شود. چنین اندازه گیری برای اندازه گیری بردارهای ویژگی در مقیاس مشترک ضروری است. موارد زیر دو نوع نرمالسازی است که می تواند در یادگیری ماشین مورد استفاده قرار گیرد:
نرمال سازی L1
همچنین از آن به عنوان کمترین انحرافات مطلق یاد می شود. این نوع نرمالسازی مقادیر را طوری تغییر می دهد که مجموع مقادیر مطلق همیشه در هر سطر حداکثر ۱ باشد. می توان آن را با کمک کد پایتون زیر روی داده های ورودی پیاده سازی کرد:
# 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
همچنین به آن حداقل مربعات نیز گفته میشود. این نوع نرمالسازی مقادیر را به گونهای تغییر می دهد که مجموع مربعات همیشه در هر سطر حداکثر ۱ است. می توان آن را با کمک کد پایتون زیر روی دادههای ورودی پیاده سازی کرد:
# 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 ]]
برچسب زدن به داده ها
ما قبلاً می دانیم که داده ها در قالب مشخص برای الگوریتم های یادگیری ماشین لازم است. شرط مهم دیگر این است که داده ها قبل از ارسال به عنوان الگوریتم های یادگیری ماشین باید به درستی برچسب گذاری شوند. به عنوان مثال ، اگر ما در مورد طبقه بندی صحبت می کنیم ، برچسب های زیادی روی داده ها وجود دارد. این برچسب ها به صورت کلمات ، اعداد و غیره هستند. توابع مربوط به یادگیری ماشین در Sklearn انتظار دارند که داده ها باید دارای برچسب شماره باشند. از این رو ، اگر داده ها به شکل دیگری هستند ، باید به اعداد تبدیل شوند. این فرآیند تبدیل برچسبهای کلمه به شکل عددی ، رمزگذاری برچسب نامیده می شود.
مراحل رمزگذاری برچسب
این مراحل را برای رمزگذاری برچسب های داده در پایتون دنبال کنید –
مرحله ۱ – وارد کردن بسته های مفید
اگر ما از پایتون استفاده می کنیم ، این اولین قدم برای تبدیل داده ها به قالب خاص ، یعنی پردازش اولیه است. این می تواند به شرح زیر انجام شود:
import numpy as np from sklearn import preprocessing
مرحله ۲ – تعیین برچسب های نمونه
پس از وارد کردن بسته ها، باید برخی از برچسب های نمونه را تعریف کنیم تا بتوانیم رمزگذار لیبل را ایجاد و آموزش دهیم. اکنون برچسب های نمونه زیر را تعریف خواهیم کرد:
# 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']
دادههای دارای برچسب در مقابل دادههای بدون برچسب
دادههای بدون برچسب به طور عمده شامل نمونههایی از شیء طبیعی یا ساخته شده به دست انسان است که به راحتی از جهان قابل دستیابی است. آنها شامل، صوت، ویدئو، عکس، مقالات خبری و غیره هستند.
از طرف دیگر، دادههای دارای برچسب مجموعهای از دادههای بدون برچسب را در اختیار میگیرند و هر قطعه از دادههای بدون برچسب را با برخی از علائم یا برچسبها یا کلاسهایی که معنیدار است، پیوند میدهند. به عنوان مثال، اگر ما یک عکس داشته باشیم، می توان برچسب را بر اساس محتوای عکس، یعنی این که در آن عکس یک پسر یا دختر یا حیوان یا هر چیز دیگری وجود داد، تعیین کرد. برچسب زدن به دادهها به تخصص و قضاوت انسانی در مورد قطعه دادههای بدون برچسب نیاز دارد.
سناریوهای بسیاری وجود دارد که دادههای بدون برچسب فراوان است و به راحتی بدست می آید اما دادههای دارای برچسب اغلب به یک انسان / متخصص نیاز دارند تا تفسیر شوند. یادگیری نیمه تحت نظارت(Semi-supervised)، سعی در ترکیب دادههای دارای برچسب و بدون برچسب برای ساخت مدلهای بهتر دارد.