روش کدگذاری وان هات (One Hot Encoding) — به زبان ساده

روش کدبندی وان هات (One Hot Encoding)

در پروژه‌های یادگیری ماشین «Machine Learning» و داده‌کاوی «Data Mining»، اکثراً با مجموعه داده‌هایی «DataSets» مواجه هستیم که شامل انواع داده‌های ترکیبی (شامل ستون‌های عددی و هم دسته‌ای) هستند. بسیاری از مدل‌های یادگیری ماشین نمی‌توانند با داده‌های دسته‌ای «Categorical» کار کنند و برای استفاده از این داده‌ها در مدل یادگیری ماشین، لازم است که آن‌ها به داده‌های عددی «Numerical» تبدیل شوند. در این مقاله به توضیح و تشریح یکی از روش‌های کدبندی دیتاست یعنی روش کدگذاری وان هات «One Hot Encoding» خواهیم پرداخت و این روش را همراه با مثال و پیاده سازی آن در پایتون بررسی خواهیم کرد.

مقدمه

روش کدگذاری وان هات One-Hot Encoding یکی از تکنیک‌های محبوب و پراستفاده در پیش‌پردازش داده‌های «Data Preprocessing» دسته‌ای برای یادگیری ماشین است. در بسیاری از مسائل، داده‌های دسته‌ای به شکل متنی یا مقادیر غیرعددی ذخیره می‌شوند که مستقیماً برای مدل‌های یادگیری ماشین قابل استفاده نیستند.

این تکنیک با تبدیل هر دسته به یک بردار دودویی که فقط یک مقدار ۱ (فعال) و بقیه مقادیر ۰ دارد. با این روش، مدل‌های یادگیری ماشین می‌توانند داده‌های دسته‌ای را بدون ایجاد ترتیب یا سلسله‌مراتب اشتباه پردازش کنند. هرچند این روش مزایای قابل توجهی دارد، اما در شرایطی مانند کاردینالیتی بالا ممکن است باعث افزایش ابعاد داده و پیچیدگی مدل شود.

نمایش یک ستون مجموعه داده در روش کدگذاری وان هات

برای مثال، فرض کنید یک مجموعه داده دارای ستونی به نام «اندازه» باشد که شامل عناصر دسته‌ای مانند «Medium»، «Small» و «Large» است. این برچسب‌ها ترتیب مشخصی ندارند و از آنجا که داده‌ها به صورت رشته‌ای هستند، مدل‌های یادگیری ماشین ممکن است به اشتباه تصور کنند که بین این برچسب‌ها یک نوع سلسله‌مراتب وجود دارد.

برای حل این مشکل، یکی از تکنیک‌های موثر، کدگذاری تک‌گرمی یا وان هات (One Hot Encoding) است. روش کدبندی OHE در یادگیری ماشین داده‌های دسته‌ای را به فرمت عددی تبدیل می‌کند که الگوریتم‌های یادگیری ماشین بتوانند آن را پردازش کنند، بدون اینکه هیچ رابطه ترتیبی بر آن تحمیل شود.

One Hot Encoding چیست؟

One Hot Encoding روشی برای تبدیل متغیرهای دسته‌ای به فرمت دودویی «Binary» است. این تکنیک ستون‌های جدیدی ایجاد می‌کند که حاوی مقادیر صفر و یک برای هر دسته موجود در متغیر اصلی هستند. هر دسته در ستون اصلی به صورت یک ستون جداگانه نمایش داده می‌شود که مقدار ۱ حضور آن دسته و مقدار ۰ نبود آن را نشان می‌دهد.

چرا از One Hot Encoding استفاده کنیم؟

هدف اصلی از استفاده روش One Hot Encoding این است که داده‌های دسته‌ای به‌صورت مؤثر در مدل‌های یادگیری ماشین استفاده شوند. دلایل اصلی برای مفید بودن این تکنیک عبارتند از:

۱- حذف ترتیبی بودن داده‌ها

بسیاری از متغیرهای دسته‌ای ترتیب ذاتی ندارند (برای مثال، «مرد» و «زن»). اگر به این متغیرها مقادیر عددی اختصاص دهیم (مثل مرد = 0 و زن = 1)، مدل ممکن است به اشتباه این را به‌عنوان یک ترتیب یا رتبه‌بندی تفسیر کند که منجر به پیش‌بینی‌های اشتباه می‌شود. روش کدگذاری وان هات این خطر را با رفتار مستقل با هر دسته حذف می‌کند.

۲- بهبود عملکرد مدل

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

۳- سازگاری با الگوریتم‌ها

بسیاری از الگوریتم‌های یادگیری ماشین، به‌ویژه آن‌هایی که بر اساس رگرسیون خطی و نزول گرادیان عمل می‌کنند، به ورودی‌های عددی نیاز دارند. روش One Hot Encoding تضمین می‌کند که متغیرهای دسته‌ای به فرم مناسبی تبدیل شوند.

روش کار One Hot Encoding

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

  • اگر میوه «سیب» باشد، ستون «سیب» مقدار ۱ خواهد داشت، در حالی که ستون‌های دیگر مانند «انبه» یا «پرتقال» مقدار ۰ خواهند داشت.
  • این الگو تضمین می‌کند که هر مقدار دسته‌ای ستون مخصوص به خود را دارد و با مقادیر دودویی (۱ یا ۰) نشان داده می‌شود، که این امر استفاده از آن را برای مدل‌های یادگیری ماشین ممکن می‌سازد.
نام میوه مقدار ارزش دسته‌ای قیمت
سیب ۱ ۵۰۰۰
انبه ۲ ۱۲۰۰۰
سیب ۱ ۷۰۰۰
پرتغال ۳ ۱۰۰۰۰

خروجی پس از اعمال روش کدگذاری وان هات (One Hot Encoding) بر روی داده ها به شرح زیر است:

میوه سیب میوه انبه میوه پرتغال قیمت
۱ ۰ ۰ ۵۰۰۰
۰ ۱ ۰ ۱۲۰۰۰
۱ ۰ ۰ ۷۰۰۰
۰ ۰ ۱ ۱۰۰۰۰

پیاده سازی روش کدگذاری وان هات One Hot Encoding در پایتون

برای پیاده سازی و اجرای روش کدگذاری وان هات One-Hot Encoding در Python، می‌توان از کتابخانه‌های Pandas یا Scikit-learn استفاده کرد. هر دو این کتابخانه‌ها روش‌های کارآمد و آسانی برای انجام این کار ارائه می‌دهند.

۱- پیاده سازی کدگذاری وان هات با کتابخانه Pandas

در کتابخانه Pandas تابعی با نام تابع get_dummies وجود دارد که روشی ساده و موثر برای اجرای روش کدگذاری وان هات است. این روش متغیرهای دسته‌ای را به چندین ستون دودویی تبدیل می‌کند. برای مثال دیتاستی با ستون های Employee id، Gender و Remarks داریم:

ستون “Gender” با مقادیر ‘M’ و ‘F’ به دو ستون دودویی Gender_F و Gender_M تبدیل می‌شود.

اگر drop_first=True ست شود، یکی از ستون‌های اضافی حذف می‌شود (مثلاً فقط Gender_F باقی می‌ماند) تا از مشکل چندخطی بودن (Multicollinearity) جلوگیری شود.

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

# Create a dummy employee dataset
data = {
    'Employee id': [10, 20, 15, 25, 30],
    'Gender': ['M', 'F', 'F', 'M', 'F'],
    'Remarks': ['Good', 'Nice', 'Good', 'Great', 'Nice']
}

# Convert the data into a pandas DataFrame
df = pd.DataFrame(data)
print(f"Original Employee Data:\n{df}\n")
# Use pd.get_dummies() to one-hot encode the categorical columns
df_pandas_encoded = pd.get_dummies(df, columns=['Gender', 'Remarks'], drop_first=True)
print(f"One-Hot Encoded Data using Pandas:\n{df_pandas_encoded}\n")

# Initialize OneHotEncoder
encoder = OneHotEncoder(sparse_output=False)

# Fit and transform the categorical columns
one_hot_encoded = encoder.fit_transform(df[categorical_columns])

# Create a DataFrame with the encoded columns
one_hot_df = pd.DataFrame(one_hot_encoded, 
                          columns=encoder.get_feature_names_out(categorical_columns))

# Concatenate the one-hot encoded columns with the original DataFrame
df_sklearn_encoded = pd.concat([df.drop(categorical_columns, axis=1), one_hot_df], axis=1)

print(f"One-Hot Encoded Data using Scikit-Learn:\n{df_sklearn_encoded}\n")

خروجی:

Original Employee Data:
   Employee id Gender Remarks
۰           ۱۰      M    Good
۱           ۲۰      F    Nice
۲           ۱۵      F    Good
۳           ۲۵      M   Great
۴           ۳۰      F    Nice

One-Hot Encoded Data using Pandas:
   Employee id  Gender_M  Remarks_Great  Remarks_Nice
۰           ۱۰      True          False         False
۱           ۲۰     False          False          True
۲           ۱۵     False          False         False
۳           ۲۵      True           True         False
۴           ۳۰     False          False          True

می‌توانیم مشاهده کنیم که در مجموعه داده‌ها ۳ ستون Remarks و ۲ ستون Gender وجود دارد. اما، می‌توانیم به جای استفاده از n ستون برای n برچسب منحصربه‌فرد، تنها از n-1 ستون استفاده کنیم.

برای مثال، اگر فقط ستون Gender_Female را نگه داریم و ستون Gender_Male را حذف کنیم، همچنان می‌توانیم اطلاعات کامل را انتقال دهیم.

  • مقدار ۱ در Gender_Female نشان‌دهنده ‘F’ است.
  • مقدار ۰ نشان‌دهنده ‘M’ است.

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

۲- پیاده سازی کدگذاری وان هات با کتابخانه Scikit-learn

کتابخانه Scikit-learn یکی از کتابخانه‌های محبوب یادگیری ماشین در پایتون است که ابزارهای متعددی برای پیش‌پردازش داده‌ها در این کتابخانه وجود دارد. این کتابخانه تابعی به نام OneHotEncoder دارد که برای کدگذاری متغیرهای دسته‌ای و عددی به بردارهای دودویی استفاده می‌شود.

با استفاده از df.select_dtypes(include=[‘object’]) می‌توان تنها ستون‌هایی را انتخاب کرد که دارای داده‌های دسته‌ای (نوع داده object) هستند.

در این مثال، ستون‌های Gender و Remarks به‌عنوان ستون‌های دسته‌ای شناسایی می‌شوند.

#one hot encoding using OneHotEncoder of Scikit-Learn

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

#Building a dummy employee dataset for example
data = {'Employee id': [10, 20, 15, 25, 30],
        'Gender': ['M', 'F', 'F', 'M', 'F'],
        'Remarks': ['Good', 'Nice', 'Good', 'Great', 'Nice'],
        }
df = pd.DataFrame(data)
print(f"Employee data : \n{df}")

#Extract categorical columns from the dataframe
#Here we extract the columns with object datatype as they are the categorical columns
categorical_columns = df.select_dtypes(include=['object']).columns.tolist()
encoder = OneHotEncoder(sparse_output=False)

# Apply one-hot encoding to the categorical columns
one_hot_encoded = encoder.fit_transform(df[categorical_columns])

#Create a DataFrame with the one-hot encoded columns
#We use get_feature_names_out() to get the column names for the encoded data
one_hot_df = pd.DataFrame(one_hot_encoded, columns=encoder.get_feature_names_out(categorical_columns))

# Concatenate the one-hot encoded dataframe with the original dataframe
df_encoded = pd.concat([df, one_hot_df], axis=1)

# Drop the original categorical columns
df_encoded = df_encoded.drop(categorical_columns, axis=1)
print(f"Encoded Employee data : \n{df_encoded}")

خروجی:

Employee data : 
   Employee id Gender Remarks
۰           ۱۰      M    Good
۱           ۲۰      F    Nice
۲           ۱۵      F    Good
۳           ۲۵      M   Great
۴           ۳۰      F    Nice
Encoded Employee data : 
   Employee id  Gender_F  Gender_M  Remarks_Good  Remarks_Great  Remarks_Nice
۰           ۱۰       ۰.۰       ۱.۰           ۱.۰            ۰.۰           ۰.۰
۱           ۲۰       ۱.۰       ۰.۰           ۰.۰            ۰.۰           ۱.۰
۲           ۱۵       ۱.۰       ۰.۰           ۱.۰            ۰.۰           ۰.۰
۳           ۲۵       ۰.۰       ۱.۰           ۰.۰            ۱.۰           ۰.۰
۴           ۳۰       ۱.۰       ۰.۰           ۰.۰            ۰.۰           ۱.۰

مزایا روش کدگذاری وان هات One Hot Encoding

  • سازگاری با مدل‌ها: امکان استفاده از متغیرهای دسته‌ای در مدل‌هایی که به ورودی عددی نیاز دارند.
  • بهبود عملکرد مدل: اطلاعات بیشتری درباره متغیر دسته‌ای به مدل ارائه می‌دهد، که می‌تواند روابط پیچیده‌تری را کشف کند.
  • حل مشکل ترتیبی بودن: به رفع مشکل ترتیب ذاتی کمک می‌کند، به‌ویژه زمانی که متغیر دسته‌ای دارای یک ترتیب طبیعی مانند “کوچک”، “متوسط”، “بزرگ” باشد.

معایب روش کدگذاری وان هات One Hot Encoding

  • افزایش ابعاد داده: هر دسته یک ستون جداگانه ایجاد می‌کند که می‌تواند پیچیدگی مدل و زمان آموزش را افزایش دهد.
  • ایجاد داده‌های پراکنده (Sparse Data): اکثر مشاهدات در ستون‌های کدگذاری‌شده، مقدار صفر خواهند داشت.
  • خطر بیش‌برازش (Overfitting): اگر متغیر دارای تعداد زیادی دسته باشد و حجم داده کوچک باشد، ممکن است مدل دچار بیش‌برازش شود.

بهترین روش‌ها برای استفاده از روش کدگذاری وان هات

برای بهره‌برداری بهینه از روش کدگذاری وان هات و کاهش معایب آن می‌توان موارد زیر را در نظر گرفت:

  1. محدود کردن تعداد دسته‌ها: برای متغیرهای دسته‌ای با کاردینالیتی بالا، تعداد دسته‌ها را از طریق گروه‌بندی یا مهندسی ویژگی کاهش دهید.
  2. انتخاب ویژگی: تکنیک‌های انتخاب ویژگی را پیاده‌سازی کنید تا تنها ویژگی‌های مرتبط پس از کدگذاری نگه داشته شوند. این کار به کاهش ابعاد و بهبود عملکرد مدل کمک می‌کند.
  3. ارزیابی عملکرد مدل: پس از اعمال One Hot Encoding، عملکرد مدل را به‌طور منظم ارزیابی کنید. در صورت مشاهده نشانه‌های بیش‌برازش یا مشکلات دیگر، به سراغ روش‌های کدگذاری جایگزین بروید.
  4. درک ماهیت داده‌ها: قبل از اعمال One Hot Encoding، ماهیت متغیرهای دسته‌ای را بررسی کنید. مشخص کنید که آیا این متغیرها ترتیب طبیعی دارند یا خیر و آیا One Hot Encoding روش مناسبی است.

روش‌های جایگزین برای روش کدگذاری وان هات

  1. Label Encoding: زمانی که متغیر دسته‌ای دارای ترتیب طبیعی (مانند “پایین”، “متوسط”، “بالا”) باشد، بهتر است از Label Encoding استفاده کنید. این روش به هر دسته یک عدد صحیح منحصربه‌فرد اختصاص می‌دهد.
  2. Binary Encoding: ترکیبی از مزایای One Hot Encoding و Label Encoding است. این روش دسته‌ها را به اعداد دودویی تبدیل کرده و سپس ستون‌های دودویی ایجاد می‌کند. این تکنیک می‌تواند ابعاد داده را کاهش دهد و اطلاعات را حفظ کند.
  3. Target Encoding: در این روش، هر دسته با میانگین مقدار متغیر هدف برای آن دسته جایگزین می‌شود. این روش برای متغیرهای دسته‌ای با تعداد زیاد مقادیر یکتا مناسب است، اما اگر به‌درستی مدیریت نشود، خطر نشت داده را به همراه دارد.

جمع بندی

در مجموع، One-Hot Encoding ابزاری قدرتمند برای تبدیل داده‌های دسته‌ای به فرمت قابل استفاده در یادگیری ماشین است. این روش با جلوگیری از القای ترتیب اشتباه میان دسته‌ها، به بهبود دقت مدل‌ها کمک می‌کند و امکان استفاده از طیف گسترده‌ای از الگوریتم‌ها را فراهم می‌سازد. با این حال، باید در استفاده از آن دقت کرد، زیرا ممکن است منجر به افزایش ابعاد داده و پیچیدگی مدل شود، به‌ویژه در شرایطی که داده‌ها دارای کاردینالیتی بالا هستند.

انتخاب تکنیک مناسب برای کدگذاری داده‌های دسته‌ای، مانند استفاده از Label Encoding، Binary Encoding یا دیگر روش‌ها در کنار One-Hot Encoding، باید بر اساس ویژگی‌های داده و نیاز مدل انجام شود. این تصمیم‌گیری می‌تواند نقش مهمی در بهبود کارایی و عملکرد نهایی مدل یادگیری ماشین داشته باشد.


سوالات متداول


استراتژی One-Hot Encoding چیست؟

1- شناسایی ستون‌های دسته‌ای در مجموعه داده. 2- ایجاد ستون‌های دودویی جدید—یکی برای هر دسته یکتا. 3- تخصیص مقدار 1 به ستونی که دسته حاضر را نشان می‌دهد و مقدار 0 به سایر ستون‌ها.

نتیجه One-Hot Encoding چیست؟

نتیجه این تکنیک یک ماتریس دودویی است که داده‌های دسته‌ای را نمایش می‌دهد. این ماتریس جایگزین ستون دسته‌ای اصلی می‌شود و شامل چندین ستون دودویی است که هر کدام یک دسته را نشان می‌دهند.

نام دیگر One-Hot Encoding چیست؟

Dummy Encoding نیز به عنوان جایگزین استفاده می‌شود. با این حال، در Dummy Encoding معمولاً یکی از ستون‌های دودویی برای جلوگیری از مشکل چندخطی بودن (Multicollinearity) حذف می‌شود (برخلاف استاندارد One-Hot Encoding).

چه زمانی نباید از One-Hot Encoding استفاده کرد؟

کاردینالیتی بالا: اگر یک ویژگی دسته‌ای تعداد زیادی مقادیر یکتا داشته باشد، این روش می‌تواند داده‌هایی با ابعاد بسیار زیاد ایجاد کند. مدل‌های مبتنی بر درخت: الگوریتم‌هایی مانند درخت تصمیم، جنگل تصادفی یا گرادیان بوستینگ نیازی به این روش ندارند. این مدل‌ها می‌توانند ویژگی‌های دسته‌ای را به‌طور بومی یا با Label Encoding پردازش کنند. مسئله پراکندگی داده‌ها (Sparsity): اگر مدل شما با داده‌های پراکنده (مقادیر زیاد صفر) مشکل دارد، One-Hot Encoding ممکن است گزینه مناسبی نباشد.

One-Hot Encoding برای کلمات چیست؟

در پردازش زبان طبیعی (NLP)، این روش برای نمایش کلمات به‌صورت بردارهای دودویی استفاده می‌شود. به هر کلمه یک موقعیت منحصربه‌فرد در بردار اختصاص داده می‌شود. مقدار 1 حضور کلمه و مقادیر 0 غیاب آن را نشان می‌دهند. با این حال، برای واژگان بزرگ، استفاده از One-Hot Encoding به دلیل ایجاد بردارهای با ابعاد بالا کمتر رایج است.

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 5 از 1 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع و مراجع:
analyticsvidhya geeksforgeeks مجله پی استور datacamp

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *



برچسب‌ها:
یادگیری ماشین


پیمایش به بالا