داده های رسته ای یا ویژگی های رسته ای (Categorical Data) به داده‌ هایی گفته می شود که مقادیر مشاهده‌ شده به یکی از دسته ها (Class) تعلق داشته‌ باشد. مثال هایی از این داده ها می توانند جنسیت ها (gender)، رنگ ها (Color) یا نام تجاری (Brand) ماشین ها باشد.

این داده ها خودشان به دو گونه هستند. دسته ای از داده های رسته ای، به صورت ذاتی مرتب شده نیستند، که اصطلاحا آنها را Nominal می گویند. از جمله این داده ها می توان از رنگ ها (آبی، سبز و قرمز)، جنسیت ها (زن و مرد) و میوه ها (سیب، گلابی، انار و توت فرنگی) نام برد. همانطور که می بینید هیچ ترتیبی میان سه رنگ آبی و سبز و قرمز وجود ندارد و مهم نیست کدام در ابتدا و کدام در ترتیب های بعدی باشد.

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

یکی از چالشی ترین الگوریتم ها، الگوریتم K نزدکترین همسایه (K-Nearest Neighbors یا KNN) است. یک گام در الگوریتم K نزدیکترین همسایه پیدا کردن فاصله (Distance) میان مشاهده ها (Observations) یا نمونه ها (Examples) است. معادله شکل زیر (۱) چگونگی فاصله میان دو مشاهده را نشان می دهد. قاعدتا اگر مشاهده از نوع رشته باشد، نمی توان فاصله میان آنها را محاسبه کنید. بنابراین لزوم تغییر رشته به فرمت عددی غیر قابل انکار است.

در این مطلب می خواهیم در مورد به کار گیری ویژگی های کتابخانه Scikit-Learan برای تبدیل ویژگی های رشته ای به ویژگی های دودویی (Binray) و همچنین در مورد مفهومی به نام کد گذاری One-Hot صحبت کنیم. در کتابخانه Scikit-Learn چندین کلاس در دسته بندی کلاس های پیش پردازش داده ها (Data Preprocessing) وجود دارند.

توجه کنید که منظور از ویژگی می تواند یک ستون از DataFrame یا یک Series از ماژول pandas یا یک ستون از فایل های اکسل یا CSV باشد. مطلب مهم این است که مقدار این ستون ها به صورت رشته ای است و ما می خواهیم از آنها در الگوریتم های یادگیری ماشین یا شبکه های عصبی و یادگیری ژرف استفاده کنیم، پس لازم است پیش از این، یک پیش پردازش انجام دهیم و آنها را به ویژگی های شماره ای (عددی) تبدیل کنیم.

ایجاد DataFrame توسط ماژول Pandas در پایتون

نوع Series در ماژول Pandas

بارگذاری فایل های CSV توسط ماژول Pandas

بارگذاری فایل های اکسل توسط ماژول Pandas

ایجاد متغیرهای Dummy در ماژول Pandas

تبدیل داده های رسته  نوع Nominal به فرمت عددی

تبدیل داده های رسته ای Nominal، یکی از کارهایی است که باید در گام پیش پردازش داده ها انجام دهیم تا این داده ها آماده به کار برده شدن در الگوریتم های یادگیری ماشین و شبکه عصبی باشند.. به طور مثال برنامه ای می خواهیم که میزان حقوق را بر اساس محل کار (شهر) پیش بینی کنیم. محل کار یا همان نام شهر یک ویژگی (Feature) رسته ای، رشته ای و ذاتی غیر ترتیبی است. در کد شکل زیر و توسط متد ()array از ماژول numpy، یک آرایه دوبعدی 6x1 (یعنی ماتریسی از ۶ سطر و ۱ ستون) از نام شهرها را ایجاد کرده ایم. توجه کنید هر عنصر از این ماتریس (آرایه دو بعدی) به صورت یک بردار (Vector) رشته ای (نام شهر) است.

حال می خواهیم این ویژگی های رشته ای را توسط کتابخانه scikit-learn به فرمت عددی و به طور خاص فرمت عدد باینری (Binary) تبدیل کنیم. برای این منظور و مطابق کد زیر می توانیم از کلاس LabelBinarizer استفاده کنیم. نخست یک شی از کلاس LabelBinarizer به نام oneHot ایجاد کرده ایم. سپس متد ()fit_transform از کلاس LabelBinarizer را فراخوانی کرده ایم که متغیر sampleFeature به آن فرستاده شده است.

در شکل زیر و بدست ویژگی (Property) به نام _ classes می توانیم فهرست تمامی رسته ها یا کلاس ها را نشان دهیم. در واقع با استفاده از متد ()fit_transform به هر کلاس درون ویژگی یک ویژگی دودویی (شماره باینری) انتساب داده می شود. به این مورد اصطلاحا کد گذاری One-Hot (یا One-Hot Encoding) گفته می شود.

در واقع انگیزه از کدگذازی One-Hot تبدیل (Transform) ویژگی های رسته بندی به فرمتی است که بتوان از آن در الگوریتم های کلاس بندی (Classification) یا رگرسیون (Regression) استفاده کنیم .در شکل بالا و در نتیجه اجرای متد ()fit_transform می بینید که یک آرایه دو بعدی 6x1 از عددهای باینری ایجاد کرده ایم. در واقع هر یک از این عددها معادل یکی از رشته های درون ویژگی هستند.نکته مهم در کد گذاری One-Hot این است که ویژگی های دودویی ایجاد شده لزوما دارای ترتیب نیستند، زیرا ویژگی های رسته بندی اصلی، از نوع Nominal و ذاتی غیر مرتب بودند.

بنابراین هدف از کد گذاری One-Hot تبدیل ویژگی های رسته بندی رشته ای به ویژگی های دودویی هستند که لزوما دارای مرتب شده نیستند.توجه کنید که در هر یک از عددهای باینری تنها یک مرتبه عدد 1 آمده است و مابقی عددها صفر هستند که این همان مفهوم One-Hot است. به طور مثال در تمامی ویژگی حتی اگر چندین سطر از شهر تهران وجود داشته باشد، عدد باینری آن 0, 0, 0, 0, 1, 0 خواهد بود.

همچنین توجه کنید که طول عددهای باینری برابر با طول اعضای منحصر به فرد و غیر تکراری از ویژگی هستند. به طور مثال در کد  زیر دو شهر اهواز و تبریز به انتهای فهرست شهرها در متغیر تازه ای به نام newSampleFeature اضافه و سپس این متغیر به متد ()fit_transform فرستاده شده است. می بنید که هر عنصر درون مارتیس خروجی آن دارای ۸ عدد صفر و یک است.