بالاخره رسیدیم به یه مبحث بسیار بسیار کاربردی و حیاتی که شاید به جرأت بتونم بگم از مهمترین چیزایی هست که هر برنامه نویسی به خصوص علاقه مندان به داده باید بلد باشن، یعنی One Hot Encoding.

قبل از اینکه مقاله رو شروع کنین به خوندن، باید بدونین که پیش نیازش خوندن مقاله مربوط به Label Encoding هست تا برای فهم مطالب کارتون راحت تر باشه.

بعد از اینکه با Label Encoding آشنا شدیم شاید همه چیز خوب بنظر میرسید، ولی مشکلاتی وجود داشت که باعث رخ دادن اختلالاتی میشد که بشر به فکر بهبودش در اومد و در ادامه یه ایده تکامل یافته تر ارائه شد که الان قراره دربارش صحبت کنیم.

مشکل اصلی از اونجایی شروع میشه که اعداد معنای خاصی دارن، در واقع مفهوم مشخصی رو پشت خودشون نگه داشتن؛ برای مثال من اگه بگم شخصی 20 سال تجربه کار درحوزه برنامه نویسی و دیتابیس داره، دیگه جای شکی در تخصص اون فرد باقی میمونه؟ حالا اگه فقط رقم صفر رو از آخرش بردارم و بگم 2 سال تجربه داره، الان چی؟ هنوز هم همون دیدگاه رو دارین نسبت به اون شخص؟
اینجاست که اعداد معنی دارن و باید داشته باشن، دلیلی که امروزه داریم از اعداد استفاده میکنیم انتقال همین مفاهیم مورد نظرمونه!

نکته اینجاست که توی لِیبل اِنکودینگ که دربارش صحبت کردیم مشکل این بود که شروع میکرد عدد نسبت میداد به هر مقداری که وجود داشت؛ برای مثال اگه بخوایم به هر رشته تحصیلی داخل دانشگاه یه عددی رو نسبت بدیم (لیبل انکودینگ) اون موقع به نظر شما رشته ای مثل مهندسی کامپیوتر باید چه عددی داشته باشه که مناسب باشه؟ هرچقدر عددش بزرگتر باشه بهتره یا کوچکتر؟ اگه یه رشته دیگه مثلا آبیاری گیاهان دریایی 😅 کد بزرگتری داشته باشه، یعنی بهتره؟ اینجاست که متوجه مفهوم اعداد میشیم که ناخودآگاه منتظریم که اون عدد یه مفهومی رو پشت خودش داشته باشه!

در دنیای واقعی بعضی از مسائل هستن که میتونیم بدون هیچ مشکلی براشون از لیبل انکودینگ استفاده کنیم. برای مثال وقتی بتونیم اون عدد رو با توجه به یه ویژگی (فیچر= Feature) خاص از داده هامون انتخاب کنیم که مرتبط با اون باشه، اون وقت هم داده هامون رو کدگذاری کردیم و هم عددهامون معنی دارن. برای مثال میتونیم لیست خودروهایی که داخل یک نمایشگاه هست رو به ترتیب قیمت لِیبِل اِنکود کنیم.

ولی همیشه که همچین ویژگی وجود نداره، مثلا فرض کنین که میخوایم پردازش زبان طبیعی (NLP) کار کنیم، مثلا چی میخوایم از اون کلمه یا جمله ای که در دسترسمونه انتخاب کنیم؟ آیا معیاری هست که بتونه همچین مسئولیت سنگینی رو به دوش بکشه؟ اینجاست که ما باید به فکر یه روش دیگه برای بیان کردن مقادیر غیر عددی که به هیچ طریقی هم نمیتونیم اونها رو به عدد ربط بدیم پیدا کنیم.

جالبترین و بهترین راه حلی که وجود داره بهش میگیم OHE که همون One Hot Encoding هستش. ولی قبل از اینکه صاف بریم توی تعریف این سیستم، شما به ذهنتون ایده ای نرسیده که چطوری این قضیه رو مدیریت کنیم؟ چه روش هایی رو پیشنهاد میدین که این چالشمون حل بشه؟ توی کامنتا منتظر پاسخهای متنوعتون هستم. 🔥
مفهوم پشت این مکانیسم چیز پیچیده ای نیست، فقط لازمه که شما درکش کنین تا بتونین به راحتی توی مسائل مختلف ازش استفاده کنین. چالش اصلی که ما داشتیم این بود که نمیتونستیم بین اعداد مختلف، خنثی رفتار کنیم؛ ولی اگه بیشتر از یه عدد داشته باشیم چی؟ ما وقتی که یه عدد تنها داریم، در واقع انگار داریم روی یه فضای تک بعدی از دکارتی حرکت میکنیم و نقطه ای که روش قرار داریم مقدار عددمون هست (محورهای دوران دبستان!).

ایده کلی اینه که بیایم و با بهره بردن از تعداد ابعاد بیشتر بتونیم بین اعداد تمایز قائل بشیم.برای مثال یه گریزی بزنیم به سال آخر دبیرستان؛ ما همه با فضای دو بعدی دکارتی آشناییم که تمام توابعی که داشتیم رو روش رسم میکردیم و ریشه عمیقی داره توی تقریبا تمام خاطره هامون که با مباحث علمی نقطه تلاقی داشتن. ما بردارهای یکه رو داشتیم که با نماد های i و j نمایش میدادیم؛ حالا اگه کسی بهتون بگه که بردارهای زیر با همدیگه برابر هستن، شما چه جوابی بهش میدین؟

v1 = 2i

v2 = 2j

بدون شک بهش میگیم که داره اشتباه میکنه و این دو بردار شاید ضرایب یکسانی داشته باشن، ولی در جهت های مختلفی حرکت میکنن که باعث میشه از همدیگه متمایز بشن.

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

یه بار دیگه با یه مثال شهودی تر براتون توضیح میدم تا اگه ابهامی مونده برطرف بشه. فرض کنیم که سه تا ماشین داریم یکی پراید، پژو و آخری هم سمند و ما میخوایم که این ها رو تبدیل کنیم به عدد. توی روش لیبل انکود که داشتیم اینطوری میگفتیم که به ترتیب مثلا حروف؛ بهشون یک عدد نسبت میدیم و به این شکل میشه که پراید=1، پژو=2 و سمند=3.

ولی توی سیستمی که داریم دربارش صحبت میکنیم قراره که متفاوت تر عمل کنیم، چون سه تا ماشین داریم سه تا محور میسازیم که هر کدوم بیانگر نوع ماشین خاصی هست و ما برای هر مقداری که داریم به جای یه عدد یه بردار نسبت میدیم که توی این مثال قراره که طول اون بردار سه باشه که به این شکل میشه:
پراید = [1, 0, 0]

پژو = [0, 1, 0]

سمند = [0, 0, 1]

به این ترتیب دیگه خبری از اختلال توی معنا و مفهوم اعداد نیست و کامپیوتر خیلی راحت تر و بهتر میتونه متوجه تفاوتشون بشه؛ باز هم میگم که این یک تکنیک برای ماشین لرنینگ و مباحث محاسباتی هستش که کاربردهای خاص خودش رو داره و استفاده عمومی نداره، ولی الان که شما بلدش هستین یه قدم از بقیه جلو هستین 😎

Encoding your categorical variables based on the response variable and correlations

تصویر (1) – نمایش روش One-Hot Encoding

دیدگاهتان را بنویسید

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

این فیلد را پر کنید
این فیلد را پر کنید
لطفاً یک نشانی ایمیل معتبر بنویسید.
برای ادامه، شما باید با قوانین موافقت کنید

keyboard_arrow_up