One-Hot Encoding2
نحوه انجام One-Hot Encodingبرای متغیر های چند طبقه ای
مهندسی ویژگی
مهندسی ویژگی فرآیند استخراج ویژگی ها از داده های خام با استفاده از دانش دامنه مسئله است. از این ویژگی ها می توان برای بهبود عملکرد الگوریتم های یادگیری ماشینی استفاده کرد و در صورت افزایش عملکرد، بهترین دقت را ارائه می دهد. همچنین می توان گفت که مهندسی ویژگی همان یادگیری ماشینی کاربردی است. مهندسی ویژگی مهمترین هنر در یادگیری ماشین است که تفاوت زیادی بین یک مدل خوب و یک مدل بد ایجاد می کند. این سومین گام در چرخه عمر پروژه علم داده است.
مفهوم شفافیت برای مدل های یادگیری ماشینی موضوع پیچیده ای می باشد زیرا مدل های مختلف اغلب به رویکرد های متفاوتی برای انواع مختلف داده ها نیاز دارند. مانند:
- داده های پیوسته
- ویژگی های طبقه بندی شده
- مقادیر از دست رفته
- نرمال سازی
- تاریخ و زمان
اما در اینجا ما فقط ویژگی های طبقه بندی را مورد بحث قرار می دهیم، ویژگی های طبقه بندی، آن دسته از ویژگی هایی هستند که در آنها نوع داده از نوع Object است. مقدار نقطه داده در هر ویژگی مقوله ای به صورت عددی نیست، بلکه به شکل object بوده است.
تکنیک های زیادی برای مدیریت متغیر های طبقه بندی شده وجود دارد که برخی از آنها عبارتند از:
- Label Encoding or Ordinal Encoding
- One hot Encoding
- رمزگذاری ساختگی(Dummy Encoding)
- رمزگذاری اثر(Effect Encoding)
- رمزگذاری باینری(Binary Encoding)
- رمزگذاری بازل(Basel Encoding)
- رمزگذاری هش(Hash Encoding)
- رمزگذاری هدف(Target Encoding)
بنابراین، در اینجا ما ویژگی های طبقه بندی شده را توسط One Hot Encoding بررسی می کنیم، بنابراین ابتدا از One Hot Encoding بحث خواهیم کرد.
One Hot Encoding
ما می دانیم که متغیر های طبقه بندی شده حاوی مقادیر برچسب به جای مقادیر عددی هستند. تعداد مقادیر ممکن، اغلب به یک مجموعه ثابت محدود می شود. متغیر های طبقه بندی شده اغلب اسمی نامیده می شوند. بسیاری از الگوریتم های یادگیری ماشینی نمی توانند مستقیما روی داده های برچسب کار کنند. آنها نیاز دارند که همه متغیر های ورودی و متغیر های خروجی، عددی باشند.
این بدان معنی است که داده های طبقه بندی شده باید به یک فرم عددی تبدیل شوند. اگر متغیر طبقه ای، یک متغیر خروجی است، ممکن است بخواهید پیش بینی های مدل را دوباره به یک فرم طبقه بندی شده تبدیل کنید تا آنها را ارائه کنید یا در برخی از برنامه ها استفاده کنید.
به عنوان مثال داده های جنسیت به شکل «مرد male» و «زن female» است.
اما اگر از one-hot encoding استفاده کنیم، رمزگذاری و اجازه دادن به مدل برای فرض به یک نظم طبیعی بین دسته ها ممکن است منجر به عملکرد ضعیف یا نتایج غیر منتظره شود.
one-hot encoding را می توان برای نمایش عدد صحیح اعمال کرد. اینجاست که متغیر رمزگذاری شده عدد صحیح حذف می شود و یک متغیر باینری جدید برای هر عدد صحیح منحصر به فرد اضافه می شود.
به عنوان مثال، ما متغیر رنگ ها را رمزگذاری می کنیم،
Red_color |
Blue_color |
0 | 1 |
1 | 0 |
0 | 1 |
اکنون ما سفر خود را آغاز خواهیم کرد. در مرحله اول، مجموعه داده ای از پیش بینی قیمت مسکن را استفاده می کنیم.
مجموعه داده
در اینجا از مجموعه داده house_price استفاده می کنیم که در پیش بینی قیمت خانه با توجه به متراژ منطقه استفاده می شود.
اگر می خواهید مجموعه داده پیش بینی قیمت خانه را دانلود کنید، اینجا را کلیک کنید.
وارد کردن ماژول ها
اکنون، ما باید ماژول های مهمی را از پایتون وارد کنیم که برای one-hot encoding استفاده می شوند.
# importing pandas
import pandas as pd
# importing numpy
import numpy as np
# importing OneHotEncoder
from sklearn.preprocessing import OneHotEncoder()
در اینجا، ما از پاندا هایی که برای تجزیه و تحلیل داده ها استفاده می شوند، از NumPyused برای آرایه های n بعدی استفاده می کنیم، و از sklearn، از یک کلاس مهم One Hot Encoder برای رمزگذاری طبقه بندی شده استفاده می کنیم.
حال باید این داده ها را با استفاده از پایتون بخوانیم.
خواندن مجموعه داده
به طور کلی مجموعه داده به صورت CSV است و همچنین مجموعه داده ای که ما استفاده می کنیم نیز به صورت CSV است. برای خواندن فایل CSV از تابع ()pandas read_csv استفاده می کنیم. به کد های زیر توجه کنید:
# reading dataset
df = pd.read_csv(‘house_price.csv’)
df.head()
خروجی:
اما ما فقط باید از متغیر های طبقه بندی شده برای one hot encoder استفاده کنیم و برای درک آسان فقط سعی می کنیم با متغیر های طبقه بندی شده توضیح دهیم.
برای پارتیشن بندی متغیر های طبقه بندی شده از داده ها، باید بررسی کنیم که چند ویژگی دارای مقادیر طبقه بندی شده هستند.
بررسی مقادیر طبقه بندی شده
برای بررسی مقادیر، از تابع select_dtypes پانداس استفاده می کنیم که برای انتخاب انواع داده های متغیر استفاده می شود.
# checking features
cat = df.select_dtypes(include=’O’).keys()
# display variabels
cat
خروجی:
اکنون باید آن ستون های عددی را از مجموعه داده حذف کنیم و از این متغیر طبقه بندی شده برای خود استفاده خواهیم کرد. ما فقط از 3 4 ستون طبقه بندی شده از مجموعه داده برای اعمال one-hot encoding استفاده می کنیم.
ایجاد DataFrame جدید
اکنون برای استفاده از متغیر های طبقه بندی شده، یک دیتافریم جدید از ستون های طبقه بندی انتخاب شده، ایجاد می کنیم.
خروجی:
اکنون باید بفهمیم که در هر ستون طبقه بندی شده چند طبقه منحصر به فرد وجود دارد.
یافتن ارزش های منحصر به فرد
برای یافتن مقادیر منحصر به فرد از تابع ()unique پانداس استفاده می کنیم.
# unique values in each columns
for x in new_df.columns:
#prinfting unique values
print(x ,’:’, len(new_df[x].unique()))
خروجی:
Neighborhood : 25
Exterior1st : 15
Exterior2nd : 16
اکنون، ما به سراغ تکنیک خود می رویم تا one-hot encoding را روی متغیر های چند طبقه ای اعمال کنیم.
تکنیک برای متغیر های چند طبقه ای
تکنیک این است که ما one-hot encoding را به 10 برچسب متداول متغیر محدود می کنیم. این بدان معنی است که ما فقط برای هر یک از 10 برچسب متداول یک متغیر باینری می سازیم، این معادل گروه بندی سایر برچسب ها در یک دسته جدید است که در این مورد حذف می شود. بنابراین، 10 متغیر ساختگی جدید نشان می دهد که اگر یکی از 10 برچسب متداول وجود داشته باشد، 1 است یا خیر، پس برای یک مشاهده خاص 0 است.
متداول ترین متغیر ها
در اینجا ما 20 متغیر متداول را انتخاب می کنیم.
فرض کنید یک متغیر مقوله ای Neighborhood را انتخاب می کنیم.
# finding the top 20 categories
new_df.Neighborhood.value_counts().sort_values(ascending=False).head(20)
خروجی:
وقتی در این تصویر خروجی می بینید متوجه می شوید که برچسب NAmes 225 بار در ستون های Neighborhood تکرار می شود و هر چقدر پایین می رویم این تعداد در حال کاهش است.
بنابراین ما 10 نتیجه برتر را از بالا گرفتیم و این 10 نتیجه برتر را به one-hot encoding تبدیل می کنیم و برچسب های سمت چپ به صفر تبدیل می شوند.
خروجی:
فهرست متداول ترین متغیر های طبقه بندی شده
# make list with top 10 variables
top_10 = [x for x in new_df.Neighborhood.value_counts().sort_values(ascending=False).head(10).index]
top_10
خروجی:
[‘NAmes’,
‘CollgCr’,
‘OldTown’,
‘Edwards’,
‘Somerst’,
‘Gilbert’,
‘NridgHt’,
‘Sawyer’,
‘NWAmes’,
‘SawyerW’]
10 برچسب طبقه بندی شده برتر در ستون Neighborhood وجود دارد.
باینری بسازید
اکنون باید 10 متغیر باینری از برچسب های top_10 بسازیم:
# make binary of labels
for label in top_10:
new_df[label] = np.where(new_df[‘Neighborhood’]==label,1,0)
new_df[[‘Neighborhood’]+top_10]
خروجی:
NAmes | CollgCr | OldTown |
Edwards |
Somerst | Gilbert | NridgHt | Sawyer | NWAmes | SawyerW | ||
0 | CollgCr | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | Veenker | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | CollgCr | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | Crawfor | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | NoRidge | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | Mitchel | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6 | Somerst | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
7 | NWAmes | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
8 | OldTown | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
9 | BrkSide | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
10 | Sawyer | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
11 | NridgHt | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
می توانید ببینید که چگونه برچسب های top_10 اکنون به فرمت باینری تبدیل می شوند.
بگذارید یک مثال بزنیم، در جدول ببینید که در آن یک شاخصه Veenker که به طبقه های top_10 ما تعلق نداشت، وجود دارد، بنابراین، همه طبقه های آن را 0 به دست می آورد.
اکنون این کار را برای تمام متغیر های طبقه بندی که در بالا انتخاب کرده ایم انجام می دهیم.
همه متغیر های انتخاب شده در OneHotEncoding
# for all categorical variables we selected
def top_x(df2,variable,top_x_labels):
for label in top_x_labels:
df2[variable+’_’+label] = np.where(data[variable]==label,1,0)
# read the data again
data = pd.read_csv(‘D://xdatasets/train.csv’,usecols = [‘Neighborhood’,’Exterior1st’,’Exterior2nd’])
#encode Nighborhood into the 10 most frequent categories
top_x(data,’Neighborhood’,top_10)
# display data
data.head()
خروجی:
حال، ما در اینجا One Hot Encoding را روی همه متغیر های چند طبقه ای اعمال می کنیم.
اکنون مزایا و معایب One Hot Encoding برای چند متغیری را خواهیم دید.
مزایا
- روشی ساده برای پیاده سازی
- برای کاوش متغیر به زمان زیادی نیاز ندارد
- فضای ویژگی را به شدت گسترش نمی دهد
معایب
- هیچ اطلاعاتی را که ممکن است متغیر را قابل پیش بینی تر کند، اضافه نمی کند
- اطلاعات متغیر های نادیده گرفته شده را حفظ نمی کند
دیدگاهتان را بنویسید