در پروژههای یادگیری ماشین «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): اگر متغیر دارای تعداد زیادی دسته باشد و حجم داده کوچک باشد، ممکن است مدل دچار بیشبرازش شود.
بهترین روشها برای استفاده از روش کدگذاری وان هات
برای بهرهبرداری بهینه از روش کدگذاری وان هات و کاهش معایب آن میتوان موارد زیر را در نظر گرفت:
- محدود کردن تعداد دستهها: برای متغیرهای دستهای با کاردینالیتی بالا، تعداد دستهها را از طریق گروهبندی یا مهندسی ویژگی کاهش دهید.
- انتخاب ویژگی: تکنیکهای انتخاب ویژگی را پیادهسازی کنید تا تنها ویژگیهای مرتبط پس از کدگذاری نگه داشته شوند. این کار به کاهش ابعاد و بهبود عملکرد مدل کمک میکند.
- ارزیابی عملکرد مدل: پس از اعمال One Hot Encoding، عملکرد مدل را بهطور منظم ارزیابی کنید. در صورت مشاهده نشانههای بیشبرازش یا مشکلات دیگر، به سراغ روشهای کدگذاری جایگزین بروید.
- درک ماهیت دادهها: قبل از اعمال One Hot Encoding، ماهیت متغیرهای دستهای را بررسی کنید. مشخص کنید که آیا این متغیرها ترتیب طبیعی دارند یا خیر و آیا One Hot Encoding روش مناسبی است.
روشهای جایگزین برای روش کدگذاری وان هات
- Label Encoding: زمانی که متغیر دستهای دارای ترتیب طبیعی (مانند “پایین”، “متوسط”، “بالا”) باشد، بهتر است از Label Encoding استفاده کنید. این روش به هر دسته یک عدد صحیح منحصربهفرد اختصاص میدهد.
- Binary Encoding: ترکیبی از مزایای One Hot Encoding و Label Encoding است. این روش دستهها را به اعداد دودویی تبدیل کرده و سپس ستونهای دودویی ایجاد میکند. این تکنیک میتواند ابعاد داده را کاهش دهد و اطلاعات را حفظ کند.
- Target Encoding: در این روش، هر دسته با میانگین مقدار متغیر هدف برای آن دسته جایگزین میشود. این روش برای متغیرهای دستهای با تعداد زیاد مقادیر یکتا مناسب است، اما اگر بهدرستی مدیریت نشود، خطر نشت داده را به همراه دارد.
جمع بندی
در مجموع، One-Hot Encoding ابزاری قدرتمند برای تبدیل دادههای دستهای به فرمت قابل استفاده در یادگیری ماشین است. این روش با جلوگیری از القای ترتیب اشتباه میان دستهها، به بهبود دقت مدلها کمک میکند و امکان استفاده از طیف گستردهای از الگوریتمها را فراهم میسازد. با این حال، باید در استفاده از آن دقت کرد، زیرا ممکن است منجر به افزایش ابعاد داده و پیچیدگی مدل شود، بهویژه در شرایطی که دادهها دارای کاردینالیتی بالا هستند.
انتخاب تکنیک مناسب برای کدگذاری دادههای دستهای، مانند استفاده از Label Encoding، Binary Encoding یا دیگر روشها در کنار One-Hot Encoding، باید بر اساس ویژگیهای داده و نیاز مدل انجام شود. این تصمیمگیری میتواند نقش مهمی در بهبود کارایی و عملکرد نهایی مدل یادگیری ماشین داشته باشد.