شرکت فناوران اینترنت اشیاء هیوا
پیش پردازش داده ها در یادگیری ماشین
پیش پردازش داده فرآیندی است برای آماده سازی داده های خام و مناسب ساختن آن ها برای یک مدل یادگیری ماشین، که اولین و مهمترین گام در ایجاد یک مدل یادگیری ماشین است.
هنگام ایجاد یک پروژه یادگیری ماشین، همیشه با داده های واضح و فرمت شده مواجه نمی شویم و هنگام انجام هر عملیاتی با داده، پاکسازی و قرار دادن آن به صورت فرمت شده الزامی است. بنابراین برای این کار از پیش پردازش داده ها استفاده می کنیم.
چرا به پیش پردازش داده نیاز داریم؟
پیش پردازش دادهها شامل مراحل زیر است:
• دریافت مجموعه داده
• وارد کردن کتابخانه ها
• وارد کردن مجموعه داده ها
• یافتن داده های از دست رفته
• کدگذاری داده های دستهای
• تقسیم مجموعه داده به مجموعه آموزشی و آزمایشی
• مقیاسبندی ویژگی
۱- دریافت مجموعه داده
مجموعه داده ممکن است با فرمتهای مختلف برای اهداف مختلف باشد، مثلا اگر بخواهیم یک مدل یادگیری ماشین برای اهداف تجاری ایجاد کنیم، مجموعه دادهها با مجموعه داده مورد نیاز برای یک بیمار کبدی متفاوت خواهد بود. بنابراین هر مجموعه داده با مجموعه داده دیگری متفاوت است. برای استفاده از مجموعه داده در کد خود، معمولا آن را در یک فایل CSV قرار می دهیم. با این حال، گاهی اوقات، ممکن است به استفاده از یک فایل HTML یا xlsx نیز نیاز داشته باشیم.
فایل CSV چیست؟
CSV مخفف فایل های "Comma-Separated Values" (به معنی مقادیر جدا شده با کاما) است. یک فرمت فایل است که به ما این امکان را می دهد داده های جدولی مانند صفحات گسترده را ذخیره کنیم. برای مجموعه داده های عظیم مفید است و می تواند از این مجموعه داده ها در برنامه ها استفاده کند.
در اینجا ما از یک مجموعه داده آزمایشی برای پیش پردازش داده ها استفاده خواهیم کرد و برای تمرین، می توان آن را از اینجا دانلود کرد.
همچنین میتوانیم مجموعه دادههای خود را با جمعآوری دادهها با استفاده از APIهای مختلف با Python ایجاد کنیم و آن دادهها را در یک فایل csv قرار دهیم.
۲- وارد کردن کتابخانهها
• Numpy: کتابخانه Numpy Python برای گنجاندن هر نوع عملیات ریاضی در کد استفاده می شود، و بستهای اساسی برای محاسبات علمی در پایتون است. همچنین از افزودن آرایه ها و ماتریس های چند بعدی بزرگ پشتیبانی می کند. بنابراین، در پایتون، می توانیم آن را به صورت زیر وارد کنیم:
import numpy as nm
در اینجا از nm استفاده کرده ایم که نام کوتاه Numpy است و در کل برنامه استفاده خواهد شد.
• Matplotlib: دومین کتابخانه، matplotlib میباشد که یک کتابخانه رسم دوبعدی پایتون است و با این کتابخانه باید یک pyplot زیرکتابخانهای وارد کنیم. این کتابخانه برای رسم هر نوع نمودار در پایتون برای کد استفاده می شود و به صورت زیر وارد خواهد شد:
import matplotlib.pyplot as mpt
در اینجا از mpt به عنوان نام کوتاهی برای این کتابخانه استفاده کرده ایم.
• Pandas: آخرین کتابخانه، کتابخانه Pandas میباشد که یکی از معروف ترین کتابخانه های پایتون است و برای وارد کردن و مدیریت مجموعه داده ها استفاده می شود. Pandas یک کتابخانه بامهارت و تجزیه و تحلیل داده های منبع باز است، که به صورت زیر وارد خواهد شد:
در اینجا از pd به عنوان نام کوتاهی برای این کتابخانه استفاده کردهایم. تصویر زیر را در نظر بگیرید:
۳- وارد کردن مجموعه دادهها
• فایل پایتون خود را در فهرست حاوی مجموعه داده ذخیره کنید.
• به گزینه File explorer در Spyder IDE بروید و فهرست مورد نیاز را انتخاب کنید.
• روی دکمه F5 یا گزینه run کلیک کنید تا فایل اجرا شود.
توجه: ما می توانیم هر فهرستی را به عنوان یک فهرست فعال تنظیم کنیم، اما باید مجموعه داده مورد نیاز را داشته باشد.
در اینجا، در تصویر زیر، میتوانیم فایل پایتون را به همراه مجموعه دادههای مورد نیاز مشاهده کنیم. اکنون، پوشه فعلی به عنوان یک فهرست کار تنظیم شده است.
تابع ()read_csv:
اکنون برای وارد کردن مجموعه داده، از تابع ()read_csv کتابخانه pandas که برای خواندن یک فایل csv استفاده می شود، استفاده می کنیم و عملیات مختلفی را روی آن انجام می دهد. با استفاده از این تابع، می توانیم یک فایل csv را به صورت محلی و همچنین از طریق URL بخوانیم.
می توانیم از تابع read_csv به صورت زیر استفاده کنیم:
data_set= pd.read_csv('Dataset.csv')
در اینجا data_set نام متغیری است که مجموعه داده ما را ذخیره می کند و در داخل تابع، نام مجموعه داده خود را وارد کرده ایم. هنگامی که خط کد بالا را اجرا می کنیم، مجموعه داده را با موفقیت در کد ما وارد می کند. همچنین میتوانیم مجموعه داده وارد شده را با کلیک بر روی جستجوگر متغیر بخش، و سپس دوبار کلیککردن روی data_set، بررسی کنیم. تصویر زیر را در نظر بگیرید:
همانند تصویر بالا، نمایه سازی از ۰، که ایندکس پیش فرض در پایتون است، شروع می شود. همچنین می توانیم با کلیک بر روی گزینه format، قالب مجموعه داده خود را تغییر دهیم.
استخراج متغیرهای وابسته و مستقل:
در یادگیری ماشین، تشخیص ماتریس ویژگی ها (متغیرهای مستقل) و متغیرهای وابسته از مجموعه داده مهم است. در مجموعه داده ما، سه متغیر مستقل وجود دارد که عبارتند از کشور، سن و حقوق، و یکی از آنها یک متغیر وابسته است که خریداری شده است.
استخراج متغیر مستقل:
برای استخراج یک متغیر مستقل، از روش [ ]iloc کتابخانه Pandas استفاده می کنیم که برای استخراج سطرها و ستون های مورد نیاز از مجموعه داده استفاده می شود.
x= data_set.iloc[:,:-1].values
در کد بالا از دونقطه(:) اول برای گرفتن تمام سطرها و دونقطه دوم (:) برای تمام ستون ها استفاده می شود. در اینجا ما از ۱-: استفاده کردهایم، زیرا نمیخواهیم آخرین ستون را بگیریم زیرا حاوی متغیر وابسته است. بنابراین با این کار ماتریس ویژگی ها را بدست می آوریم.
با اجرای کد بالا خروجی به صورت زیر بدست می آید:
[India' 38.0 68000.0']]
[France' 43.0 45000.0']
[Germany' 30.0 54000.0']
[France' 48.0 65000.0']
[Germany' 40.0 nan']
[India' 35.0 58000.0']
[Germany' nan 53000.0']
[France' 49.0 79000.0']
[India' 50.0 88000.0']
[[France' 37.0 77000.0']
همانطور که در خروجی بالا می بینیم، تنها سه متغیر وجود دارد.
استخراج متغیر وابسته:
برای استخراج متغیرهای وابسته، مجددا از روش [ ]Pandas .iloc استفاده میکنیم.
y= data_set.iloc[:,3].values
در اینجا ما تمام سطرها را فقط با آخرین ستون گرفتهایم که یک آرایه از متغیرهای وابسته را به دست می دهد.
با اجرای کد بالا، خروجی به صورت زیر بدست می آید:
خروجی:
,array(['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes']
(dtype=object
توجه: اگر از زبان پایتون برای یادگیری ماشین استفاده می کنید، استخراج اجباری است، اما برای زبان R نیازی به آن نیست.
۴- مدیریت داده های از دست رفته
راه های رسیدگی به داده های از دست رفته:
به طور عمده دو راه برای رسیدگی به داده های از دست رفته وجود دارد که عبارتند از:
• با حذف یک ردیف خاص: روش اول معمولا برای مقابله با مقادیر تهی استفاده می شود. به این ترتیب، ما فقط سطر یا ستون خاصی را که از مقادیر null تشکیل شده است حذف می کنیم. اما این روش چندان کارآمد نیست و حذف داده ها ممکن است منجر به از دست رفتن اطلاعات شود که خروجی دقیقی را به همراه نخواهد داشت.
• با محاسبه میانگین: به این ترتیب میانگین آن ستون یا ردیفی را که حاوی مقادیر گم شده است محاسبه کرده و در محل مقدار گم شده قرار می دهیم. این استراتژی برای ویژگی هایی که داده های عددی دارند مانند سن، حقوق، سال و غیره مفید است. در اینجا از این رویکرد استفاده خواهیم کرد.
برای رسیدگی به مقادیر از دست رفته، از کتابخانه Scikit-learn در کد خود استفاده می کنیم که شامل کتابخانه های مختلفی برای ساخت مدل های یادگیری ماشین است. در اینجا از کلاس Imputer کتابخانه sklearn.preprocessing استفاده خواهیم کرد. در زیر کد آن آمده است:
handling missing data (Replacing missing data with the mean value)#
from sklearn.preprocessing import Imputer
imputer= Imputer(missing_values ='NaN', strategy='mean', axis = 0)
.Fitting imputer object to the independent variables x#
imputerimputer= imputer.fit(x[:, 1:3])
Replacing missing data with the calculated mean value#
x[:, 1:3]= imputer.transform(x[:, 1:3])
خروجی:
,array([[India', 38.0, 68000.0']
,[France', 43.0, 45000.0']
,[Germany', 30.0, 54000.0']
,[France', 48.0, 65000.0']
,[Germany', 40.0, 65222.22222222222']
,[India', 35.0, 58000.0']
,[Germany', 41.111111111111114, 53000.0']
,[France', 49.0, 79000.0']
,[India', 50.0, 88000.0']
,[[France', 37.0, 77000.0']
dtype=object
همانطور که در خروجی بالا می بینیم، مقادیر از دسترفته با میانگین مقادیر بقیه ستونها جایگزین شده اند.
۵- کدگذاری داده های دستهای
از آنجایی که مدل یادگیری ماشین کاملا روی ریاضیات و اعداد کار می کند، اگر مجموعه داده ما دارای یک متغیر دستهای باشد، ممکن است در ساخت مدل مشکل ایجاد کند. بنابراین لازم است که این متغیرهای دستهای به اعداد کدگذاری تبديل شوند.
برای متغیر کشور:
ابتدا متغیرهای کشور را به داده های دستهای تبدیل می کنیم. بنابراین برای انجام این کار، از کلاس ()LabelEncoder از کتابخانه پیش پردازش استفاده می کنیم.
Catgorical data#
for Country Variable#
from sklearn.preprocessing import LabelEncoder
()label_encoder_x= LabelEncoder
x[:, 0]= label_encoder_x.fit_transform(x[:, 0])
خروجی:
Out[15]:
,array([[2, 38.0, 68000.0]
,[0, 43.0, 45000.0]
,[1, 30.0, 54000.0]
,[0, 48.0, 65000.0]
,[1, 40.0, 65222.22222222222]
,[2, 35.0, 58000.0]
,[1, 41.111111111111114, 53000.0]
,[0, 49.0, 79000.0]
,[2, 50.0, 88000.0]
,[[0, 37.0, 77000.0]
(dtype=object
توضیح:
در کد بالا، کلاس LabelEncoder از کتابخانه sklearn را وارد کرده ایم. این کلاس با موفقیت متغیرها را به ارقام کدگذاری کرده است.
اما در مورد ما، سه متغیر کشور وجود دارد، و همانطور که در خروجی بالا می بینیم، این متغیرها به ۰، ۱ و ۲ کدگذاری می شوند. با این مقادیر، مدل یادگیری ماشین ممکن است فرض کند که بین این متغیرها همبستگی وجود دارد و خروجی اشتباهی تولید خواهد کرد. بنابراین برای رفع این مشکل از کدگذاری ساختگی استفاده می کنیم.
متغیرهای ساختگی:
متغیرهای ساختگی آن دسته از متغیرهایی هستند که دارای مقادیر ۰ یا ۱ هستند. مقدار ۱ حضور آن متغیر را در یک ستون خاص نشان می دهد و متغیرهای دیگر به ۰ تبدیل می شوند. با کدگذاری ساختگی، تعدادی ستون برابر با تعداد دستهها خواهیم داشت.
در مجموعه داده ما، 3 دسته وجود دارد، بنابراین سه ستون با مقادیر ۰ و ۱ تولید می کند. برای کدگذاری ساختگی، از کلاس OneHotEncoder کتابخانه پیش پردازش استفاده خواهیم کرد.
for Country Variable#
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
()label_encoder_x= LabelEncoder
x[:, 0]= label_encoder_x.fit_transform(x[:, 0])
Encoding for dummy variables#
onehot_encoder= OneHotEncoder(categorical_features= [0])
()x= onehot_encoder.fit_transform(x).toarray
خروجی:
,array([0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.80000000e+01]
,[6.80000000e+04
,1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.30000000e+01]
,[4.50000000e+04
,0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 3.00000000e+01]
,[5.40000000e+04
,1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.80000000e+01]
,[6.50000000e+04
,0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 4.00000000e+01]
,[6.52222222e+04
,0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.50000000e+01]
,[5.80000000e+04
,0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 4.11111111e+01]
,[5.30000000e+04
,1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.90000000e+01]
,[7.90000000e+04
,0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 5.00000000e+01]
,[8.80000000e+04
,1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.70000000e+01]
([[7.70000000e+04
همانطور که در خروجی بالا مشاهده می کنیم، تمامی متغیرها در اعداد ۰ و ۱ کدگذاری شده و به سه ستون تقسیم می شوند.
که در قسمت variable explorer با کلیک بر روی گزینه x، به صورت واضحتر دیده می شود:
برای متغیر خریداری شده:
()labelencoder_y= LabelEncoder
y= labelencoder_y.fit_transform(y)
برای متغیر دستهای دوم، فقط از شیء labelencoder کلاس LableEncoder استفاده میکنیم. در اینجا ما از کلاس OneHotEncoder استفاده نمی کنیم زیرا متغیر خریداری شده تنها دارای دو دسته بله یا خیر است و به طور خودکار به ۰ و ۱ کدگذاری می شوند.
خروجی:
Out[17]: array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1])
همچنین می توان آن را به صورت زیر مشاهده کرد:
۶- تقسیم مجموعه داده به مجموعه آموزشی و مجموعه آزمایشی
فرض کنید، اگر ما به مدل یادگیری ماشین خود توسط یک مجموعه داده آموزش داده ایم و آن را با یک مجموعه داده کاملا متفاوت آزمایش کنیم، برای مدل ما در درک همبستگی بین مدل ها مشکل ایجاد می کند.
اگر مدل خود را خیلی خوب آموزش دهیم و دقت آموزشی آن نیز بسیار بالا باشد، اما مجموعه داده جدیدی به آن ارائه دهیم، کارایی آن کاهش می یابد. بنابراین ما همیشه سعی می کنیم یک مدل یادگیری ماشین بسازیم که با مجموعه آموزشی و همچنین با مجموعه داده آزمایشی عملکرد خوبی داشته باشد. در اینجا، می توانیم این مجموعه دادهها را به صورت زیر تعریف کنیم:
مجموعه آموزشی: زیر مجموعه ای از مجموعه داده برای آموزش مدل یادگیری ماشین است، و ما از قبل خروجی را می دانیم.
مجموعه آزمایشی: زیر مجموعه ای از مجموعه داده برای آزمایش مدل یادگیری ماشین است، و با استفاده از مجموعه آزمایش، مدل خروجی را پیشبینی میکند.
برای تقسیم مجموعه داده، از خطوط کد زیر استفاده می کنیم:
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.2, random_state=0)
توضیح:
o در کد بالا، خط اول برای تقسیم آرایهها مجموعه داده به زیرمجموعه های تصادفی آموزشی و آزمایشی استفاده می شود.
o در خط دوم از چهار متغیر برای خروجی خود استفاده کرده ایم که عبارتند از:
- x_train : ویژگی هایی برای آموزش دادهها
- x_test : ویژگی هایی برای آزمایش دادهها
- y_train : متغیرهای وابسته برای آموزش دادهها
- y_test : متغیر مستقل برای آزمایش دادهها
o در تابع ()train_test_split چهار پارامتر را پاس کرده ایم که دو پارامتر اول برای آرایه های داده و test_size برای تعیین اندازه مجموعه تست است. test_size شاید ۰.۵ ، ۰.۳ یا ۰.۲ باشد که نسبت تقسیم مجموعه های آموزشی و آزمایشی را نشان می دهد.
o آخرین پارامتر random_state برای تنظیم seed برای یک مولد تصادفی استفاده می شود تا همیشه نتیجه یکسانی داشته باشید و بیشترین مقدار استفاده شده برای آن ۴۲ است.
خروجی:
با اجرای کد بالا ۴ متغیر مختلف بدست می آوریم که در زیر قسمت variable explorer قابل مشاهده است.
همانطور که در تصویر بالا می بینیم، متغیرهای x و y به ۴ متغیر مختلف با مقادیر متناظر تقسیم می شوند.
۷- مقیاسبندی ویژگی
مجموعه داده زیر را در نظر بگیرید:
همانطور که می بینیم، مقادیر ستون سن و حقوق در یک مقیاس نیستند. یک مدل یادگیری ماشین مبتنی بر فاصله اقلیدسی است و اگر متغیر را مقیاسبندی نکنیم، باعث ایجاد مشکلی در مدل یادگیری ماشین ما میشود.
فاصله اقلیدسی به صورت زیر داده می شود:
اگر هر دو مقدار را از سن و حقوق محاسبه کنیم، ارزش حقوق بر مقادیر سنی غالب می شود و نتیجه نادرستی ایجاد می کند. بنابراین برای رفع این مشکل، باید مقیاس ویژگی را برای یادگیری ماشین انجام دهیم.
دو روش برای انجام مقیاسبندی ویژگی در یادگیری ماشین وجود دارد:
استاندارد سازی
عادیسازی
در اینجا، ما از روش استانداردسازی برای مجموعه داده خود استفاده خواهیم کرد.
برای مقیاسبندی ویژگی، کلاس StandardScaler کتابخانه sklearn.preprocessing را به صورت زیر وارد میکنیم:
from sklearn.preprocessing import StandardScaler
اکنون شیء کلاس StandardScaler را برای متغیرها یا ویژگی های مستقل ایجاد می کنیم، و سپس مجموعه داده آموزشی را جا داده و تبدیل می کنیم.
()st_x= StandardScaler
x_train= st_x.fit_transform(x_train)
برای مجموعه داده آزمایشی، ما مستقیما تابع ()transform را به جای ()fit_transform اعمال میکنیم؛ زیرا قبلا در مجموعه آموزشی انجام شده است.
x_test= st_x.transform(x_test)
خروجی:
با اجرای خطوط کد بالا، مقادیر مقیاس شده x_train و x_test را به صورت زیر دریافت می کنیم:
x_train:
x_test:
همانطور که در خروجی بالا می بینیم، همه متغیرها بین مقادیر ۱- تا ۱ مقیاسبندی می شوند.
توجه: در اینجا، ما متغیر وابسته را مقیاسبندی نکردهایم، زیرا فقط دو مقدار ۰ و ۱ وجود دارد. اما اگر این متغیرها دامنه مقادیر بیشتری داشته باشند، باید آن متغیرها را نیز مقیاسبندی کنیم.
ترکیب تمام مراحل:
حالا در نهایت میتوانیم تمام مراحل را با هم ترکیب کنیم تا کد کامل قابل درکتر شود.
در کد زیر، تمامی مراحل پیش پردازش داده ها را با هم قرار داده ایم. اما برخی از مراحل یا خطوط کد وجود دارد که برای همه مدلهای یادگیری ماشین ضروری نیست. بنابراین می توانیم آنها را از کد خود حذف کنیم تا برای همه مدل ها قابل استفاده مجدد باشد.
importing libraries#
import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd
importing datasets#
data_set= pd.read_csv('Dataset.csv')
Extracting Independent Variable#
x= data_set.iloc[:, :-1].values
Extracting Dependent variable#
y= data_set.iloc[:, 3].values
handling missing data(Replacing missing data with the mean value)#
from sklearn.preprocessing import Imputer
imputer= Imputer(missing_values ='NaN', strategy='mean', axis = 0)
Fitting imputer object to the independent varibles x.#
imputerimputer= imputer.fit(x[:, 1:3])
Replacing missing data with the calculated mean value#
x[:, 1:3]= imputer.transform(x[:, 1:3])
for Country Variable#
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
()label_encoder_x= LabelEncoder
x[:, 0]= label_encoder_x.fit_transform(x[:, 0])
Encoding for dummy variables#
onehot_encoder= OneHotEncoder(categorical_features= [0])
()x= onehot_encoder.fit_transform(x).toarray
encoding for purchased variable#
()labelencoder_y= LabelEncoder
y= labelencoder_y.fit_transform(y)
Splitting the dataset into training and test set.#
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.2, random_state=0)
Feature Scaling of datasets#
from sklearn.preprocessing import StandardScaler
()st_x= StandardScaler
x_train= st_x.fit_transform(x_train)
x_test= st_x.transform(x_test)
شرکت فناوران اینترنت اشیاء هیوا از سال ۱۳۹۷ با بهرهگیری از دانش، تخصص و تجربه افراد توانمند در زمینه پیش پردازش داده ها و یادگیری ماشین فعالیت می کند.
سایت مرجع: javatpoint.com