آموزش

آموزش کار با داده‌های طبقه‌ای در یادگیری ماشین با پایتون

با ترفندهای رایج برای کار با داده‌های طبقه‌ای و پیش‌پردازش اون‌ها آشنا شو تا بتونی از این داده‌ها برای ساخت مدل‌های یادگیری ماشین استفاده کنی!

تاریخ انتشار:
9 شهریور 1405
پایتون
14 دقیقه
یادگیری ماشین
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

مقدمه

داده‌هایی که می‌شه اون‌ها رو طبقه‌بندی کرد ولی هیچ ترتیب یا سلسله‌مراتب خاصی ندارن، به اسم داده‌های طبقه‌ای (Categorical Data) شناخته می‌شن. به بیان دیگه، هیچ رابطه ریاضی‌ای بین این طبقه‌ها وجود نداره. جنسیت یک آدم (مرد/زن)، رنگ چشم (آبی، سبز، قهوه‌ای و...)، نوع ماشینی که می‌رونه (شاسی‌بلند، کامیون و...) یا نوع میوه‌ای که می‌خوره (سیب، موز، پرتقال و...) نمونه‌هایی از داده‌های طبقه‌ای هستن.

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

دیتاست طبقه‌ای

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

داده‌های عددی هم به داده‌هایی می‌گن که می‌شه اون‌ها رو با عدد نشون داد. قد، وزن و دما نمونه‌هایی از داده‌های عددی هستن.

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

ما دو نوع داده طبقه‌ای داریم: اسمی و ترتیبی.

داده‌های اسمی

داده‌های اسمی نوعی داده طبقه‌ای هستن که می‌تونن طبقه‌بندی بشن، اما این طبقه‌ها هیچ برتری، ترتیب یا سلسله‌مراتب خاصی نسبت به هم ندارن. اسم برندها (کوکاکولا، پپسی، اسپرایت)، موادی که روی پیتزا می‌ریزن (پپرونی، قارچ، پیاز)، و رنگ مو (بلوند، قهوه‌ای، مشکی و غیره) نمونه‌هایی از داده‌های اسمی هستن.

داده‌های ترتیبی

از طرف دیگه، داده‌های ترتیبی اطلاعاتی رو نشون می‌دن که علاوه بر اینکه می‌شه طبقه‌بندیشون کرد، یک ترتیب یا رتبه‌بندی مشخص هم دارن. سطح تحصیلات (دیپلم، لیسانس، فوق‌لیسانس)، میزان رضایت شغلی (خیلی راضی، راضی، ممتنع، ناراضی، خیلی ناراضی)، و امتیازدهی ستاره‌ای (۱ تا ۵ ستاره) چند تا نمونه از داده‌های ترتیبی هستن.

با اختصاص دادن یک عدد به هر طبقه که نشون‌دهنده ترتیب یا رتبه‌بندی اون باشه، می‌تونیم داده‌های ترتیبی رو به عددی تبدیل کنیم تا در یادگیری ماشین استفاده بشن. این کار مخصوصاً برای الگوریتم‌هایی که به اندازه و مقدار داده‌های ورودی حساس هستن، خیلی مفیده.

البته فرق بین داده‌های اسمی و ترتیبی همیشه هم در عمل خیلی واضح نیست و ممکنه بسته به کاربردی که داری فرق کنه. مثلاً، در حالی که بعضی‌ها ممکنه «امتیاز ستاره‌ای» رو یک داده ترتیبی بدونن، بقیه ممکنه اون رو داده اسمی در نظر بگیرن. مهم‌ترین چیز اینه که ماهیت داده‌های خودت رو خوب بشناسی و روش کدگذاری‌ای رو انتخاب کنی که به بهترین شکل روابط بین داده‌هات رو نشون بده.

درک انواع داده در کتابخونه Pandas

کتابخونه متن‌باز و پرکاربرد pandas در پایتون برای تحلیل و کار با داده‌ها استفاده می‌شه. این کتابخونه امکانات خیلی خوبی برای کار با داده‌های ساختاریافته داره؛ مثل دیتافریم‌ها (DataFrames) و سری‌ها (Series) که می‌تونن داده‌های جدولی دارای سطر و ستون رو مدیریت کنن.

همچنین pandas توابع مختلفی برای خوندن و نوشتن انواع فایل‌ها (مثل csv، parquet، دیتابیس‌ها و غیره) داره. وقتی فایلی رو با استفاده از pandas می‌خونی، خودش سعی می‌کنه نوع داده هر ستون رو تشخیص بده. لیست زیر، انواع داده‌هایی هستن که pandas می‌تونه به ستون‌ها اختصاص بده:

  1. عددی (Numeric): شامل اعداد صحیح و اعشاری می‌شه و معمولاً برای تحلیل‌های کمی و ریاضیات ازش استفاده می‌کنن.
  2. رشته‌ای (String): برای نشون دادن داده‌های متنی مثل اسم‌ها، آدرس‌ها و توضیحات کاربرد داره.
  3. بولی (Boolean): فقط می‌تونه دو تا مقدار داشته باشه: True (درست) یا False (غلط). بیشتر برای شرط‌های منطقی و فیلتر کردن استفاده می‌شه.
  4. تاریخ و زمان (Datetime): برای نشون دادن تاریخ و ساعت به کار می‌ره و pandas ابزارهای خیلی قدرتمندی برای کار با این نوع داده داره.
  5. طبقه‌ای (Categorical): نشون‌دهنده داده‌ایه که می‌تونه فقط یکی از چند مقدار محدود و مشخص رو به خودش بگیره. خیلی وقت‌ها از این نوع داده برای گروه‌بندی و تجمیع استفاده می‌شه.
  6. شیء (Object): یک طبقه‌بندی کلی برای داده‌هائیه که در بقیه طبقه‌ها جا نمی‌شن. می‌تونه شامل انواع مختلفی از داده‌ها مثل لیست‌ها، دیکشنری‌ها و اشیای دیگه باشه.
نوع داده در Pandas نوع در Python نوع در NumPy کاربرد
object str string_, unicode_ متن
int64 int int_, int8, int16, int32, int64, uint8, uint16, uint32, uint64 اعداد صحیح
float64 float float_, float16, float32, float64 اعداد اعشاری
bool bool bool_ مقادیر درست/نادرست
datetime64 NA datetime64[ns] مقادیر تاریخ و زمان
timedelta[ns] NA NA اختلاف بین دو تاریخ و زمان
category NA NA فهرست محدودی از مقادیر متنی

 

داده‌هایی که در بقیه طبقه‌ها جا نمی‌گیرن، مثل متون (رشته‌ها)، انواع ترکیبی یا بقیه اشیاء، در pandas به عنوان داده طبقه‌ای یا شیء (Object) در نظر گرفته می‌شن. با این حال، این دو نوع داده چند تا تفاوت مهم با هم دارن که روی نحوه کار و سرعت پردازششون تأثیر می‌ذاره.

نوع داده طبقه‌ای

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

نوع داده شیء

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

به طور خلاصه، اگر داده‌های تو تعداد مقادیر محدود و مشخصی دارن و قراره زیاد روی اون‌ها عملیات گروه‌بندی (Groupby) انجام بدی، بهتره از نوع داده طبقه‌ای استفاده کنی. در بقیه موارد، استفاده از شیء معمولاً گزینه بی‌دردسرتریه. البته در نهایت، بهترین انتخاب به کار تو و ویژگی‌های داده‌هات بستگی داره.

بیا با خوندن یک فایل csv از گیت‌هاب، این موضوع رو در یک مثال ببینیم.

خروجی
   Carat Weight   Cut   Color   Clarity   Polish   Symmetry   Report   Price
0          1.10   Ideal     H       SI1       VG         EX      GIA    5169
1          0.83   Ideal     H       VS1       ID         ID     AGSL    3470
2          0.85   Ideal     H       SI1       EX         EX      GIA    3183
3          0.91   Ideal     E       SI1       VG         VG      GIA    4370
4          0.83   Ideal     G       SI1       EX         EX      GIA    3171

می‌تونی تشخیص بدی کدوم یکی از این ستون‌ها طبقه‌ای و کدومشون عددیه؟ در این مثال، به جز Carat Weight و Price، بقیه ستون‌ها طبقه‌ای هستن. بیا نوع داده پیش‌فرض اون‌ها رو بررسی کنیم تا ببینیم آیا حدمون درست بوده یا نه.

خروجی
Carat Weight     float64
Cut               object
Color             object
Clarity           object
Polish            object
Symmetry          object
Report            object
Price              int64
dtype: object

دقت کن که همون‌طور که انتظار داشتیم، به ستون Price نوع int64 (عدد صحیح)، به Carat Weight نوع float64 (عدد اعشاری) اختصاص داده شده و بقیه ستون‌ها هم نوع object (شیء) دارن.

تحلیل ویژگی‌های طبقه‌ای در پایتون

در pandas چند تا تابع وجود داره که بهت اجازه می‌دن خیلی سریع داده‌های طبقه‌ای موجود در دیتاستت رو تحلیل کنی. بیا یکی‌یکی بررسیشون کنیم:

شمارش مقادیر

متد value_counts() تابعی در pandas هست که تعداد تکرار مقادیر یکتای یک ستون رو برمی‌گردونه. این تابع وقتی به درد می‌خوره که بخوای خیلی سریع بفهمی توزیع یک متغیر طبقه‌ای چطوره؛ مثلاً کدوم طبقه از همه رایج‌تره و هرکدوم چند بار تکرار شدن.

خروجی
Cut
Ideal              2482
Very Good          2428
Good                708
Signature-Ideal     253
Fair                129
Name: count, dtype: int64

اگر دلت می‌خواد این توزیع رو به شکل هندسی و بصری ببینی، می‌تونی از کتابخونه plotly کمک بگیری و یک نمودار میله‌ای (Bar chart) تعاملی رسم کنی.

خروجی:

گروه‌بندی

متد groupby() در pandas بهت اجازه می‌ده داده‌ها رو بر اساس یک یا چند ستون طبقه‌بندی کنی و توابع تجمعی مثل جمع، میانگین یا شمارش رو روی اون‌ها اعمال کنی. این تابع برای تحلیل‌های پیچیده‌تری که روی داده‌های طبقه‌ای انجام می‌شه خیلی کاربرد داره؛ مثلاً وقتی که بخوای میانگین یک متغیر عددی رو به تفکیک هر طبقه حساب کنی. بیا یک مثال ببینیم:

خروجی
                  Carat Weight         Price
Cut
Fair                  1.058682   5886.178295
Good                  1.268927   9326.656780
Ideal                 1.382293  13127.331185
Signature-Ideal       1.205217  11541.525692
Very Good             1.332941  11484.696870

می‌بینی که این متد فقط دیتافریمی شامل ستون‌های عددی رو برمی‌گردونه. پارامتر by در متد groupby، ستونی که قصد داری گروه‌بندی روش انجام بشه رو تعیین می‌کنه و تابع تجمیعی mean() هم بعدش صدا زده می‌شه.

خروجی رو می‌شه این‌طوری تفسیر کرد: میانگین قیمت الماسی که نوع برشش Fair باشه ۵,۸۸۶ دلاره و وزن میانگینش ۱.۰۵ قیراطه؛ در حالی که میانگین قیمت یک الماس با برش Very Good حدود ۱۱,۴۸۵ دلاره.

جدول تقاطعی

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

خروجی
Color               D    E    F    G    H    I
Cut
Fair               12   32   24   21   24   16
Good               74  110  133  148  128  115
Ideal             280  278  363  690  458  413
Signature-Ideal    30   35   38   64   45   41
Very Good         265  323  455  578  424  383

خروجی تابع crosstab جدولی هست که فراوانی توزیع دو یا چند متغیر طبقه‌ای رو نمایش می‌ده. هر سطر از جدول نشون‌دهنده یک مقدار یکتا در متغیر اول و هر ستون نشون‌دهنده یک مقدار یکتا در متغیر دومه. اعدادی که در جدول می‌بینی، تعداد دفعاتی هستن که اون ترکیب خاص از دو طبقه با هم در داده‌ها ظاهر شدن.

جدول محوری

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

خروجی
Color               D             E             F             G             H            I
Cut
Fair             6058.250000   5370.625000   6063.625000   7345.523810   5908.500000  4573.187500
Good            10058.716216   8969.545455   9274.007519   9988.614865   9535.132812  8174.113043
Ideal           18461.953571  12647.107914  14729.426997  13570.310145  11527.700873  9459.588378
Signature-Ideal 19823.100000  11261.914286  13247.947368  10248.296875   9112.688889  8823.463415
Very Good       13218.826415  12101.910217  12413.005495  12354.013841  10056.106132  8930.031332

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

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

کدگذاری ویژگی‌های طبقه‌ای در پایتون

از اون‌جایی که الگوریتم‌های یادگیری ماشین معمولاً جوری طراحی شدن که فقط با اعداد کار می‌کنن، نمی‌تونن مستقیم داده‌های طبقه‌ای رو پردازش کنن. پس قبل از اینکه این ویژگی‌ها رو بدیم به الگوریتم، باید اون‌ها رو به اعداد تبدیل، یا اصطلاحاً «کدگذاری» کنیم.

تکنیک‌های مختلفی برای کدگذاری داده‌های طبقه‌ای وجود داره، مثل کدگذاری وان-هات (One-Hot Encoding)، کدگذاری ترتیبی (Ordinal Encoding) و کدگذاری هدف (Target Encoding). اینکه کدوم تکنیک رو انتخاب کنی بستگی به ویژگی‌های داده‌هات و نیازهای الگوریتم یادگیری ماشینی داره که قراره ازش استفاده کنی.

کدگذاری وان-هات (One-Hot Encoding)

روش وان-هات فرایندیه که در اون داده‌های طبقه‌ای به شکلی از مقادیر باینری (صفر و یک) تبدیل می‌شن؛ به این صورت که هر طبقه از داده‌ها، نقش یک ستون جدید رو بازی می‌کنه. در هر سطر از داده‌ها، فقط همون ستونی که مقدارش در اصل وجود داشته برابر با ۱ (روشن یا Hot) و بقیه ستون‌ها برابر با ۰ می‌شن؛ به همین دلیله که بهش می‌گن «وان-هات» (One-Hot). در دنیای یادگیری ماشین، از این روش خیلی استفاده می‌شه تا داده‌های طبقه‌ای رو به زبونی که برای الگوریتم‌ها قابل فهم باشه تبدیل کنن.

تبدیل داده طبقه‌ای به عددی در Pandas

یکی از راه‌های انجام این کار، استفاده از متد pd.get_dummies() در pandas هست. با این تابع می‌تونی خیلی راحت متغیرهای طبقه‌ای موجود در یک دیتافریم رو وان-هات کنی. این مِتد دیتافریم اصلی رو می‌گیره و یک دیتافریم جدید به همراه ستون‌های باینری اضافه شده برمی‌گردونه. بیا یک مثال ببینیم:

فرض کن دیتافریمی با یک ستون به اسم fruit (میوه) داریم که حاوی اطلاعات طبقه‌ای هست:

خروجی
    fruit
0   apple
1  banana
2  orange
3   apple
خروجی
   apple  banana  orange
0      1       0       0
1      0       1       0
2      0       0       1
3      1       0       0

با اینکه استفاده از pandas.get_dummies خیلی ساده است، اما در پروژه‌های پردازش و یادگیری ماشین معمولاً مرسوم‌تره که از کلاس OneHotEncoder در کتابخونه scikit-learn (یا همون sklearn) استفاده بشه. فرق اصلیشون اینه که pandas.get_dummies قدرت یادگیری قوانین کدگذاری رو نداره؛ یعنی فقط به صورت درجا کار تبدیل رو انجام می‌ده. از اون طرف، sklearn.OneHotEncoder کلاسیه که یک مدل می‌سازه؛ تو می‌تونی اون مدل (فرایند کدگذاری) رو ذخیره کنی و در آینده دقیقاً با همون قوانین روی داده‌های جدید ورودی اعمالش کنی.

خروجی
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [1. 0. 0.]]

کدگذاری برچسب (Label Encoding)

در کدگذاری برچسب، ما متغیرهای طبقه‌ای رو جوری تبدیل می‌کنیم که به هر طبقه یک عدد صحیح یکتا تعلق بگیره. مثلاً، در نظر بگیر که یک متغیر رنگ با سه طبقه قرمز، سبز و آبی داریم. با استفاده از این روش می‌تونیم این‌طوری رنگ‌ها رو کدگذاری کنیم: (قرمز مقدراش بشه ۰، سبز بشه ۱، آبی بشه ۲).

کدگذاری برچسب برای استفاده در اون طبقه از الگوریتم‌های یادگیری ماشینی که فقط ورودی عددی می‌گیرن خیلی مفیده، چون مفهوم طبقه‌ها رو به زبون ریاضی ترجمه می‌کنه. اما یک نکته خیلی مهم هست که باید حتماً یادت بمونه: کدگذاری برچسب یک «ترتیب دلخواه» برای اون طبقه‌ها می‌سازه، که لزوماً هیچ معنی و مفهوم خاصی در دنیای واقعی نداره. در بعضی از الگوریتم‌ها که روی موضوعِ «ترتیب» حساس هستن، این قضیه می‌تونه مدل تو رو به اشتباه بندازه؛ چون ممکنه فکر کنه عدد ۲ در این متغیر، دو برابر عدد ۱ ارزش داره!

مقایسه کدگذاری وان-هات و کدگذاری برچسب

هم کدگذاری وان-هات و هم برچسب، روش‌هایی برای تبدیل ویژگی‌های طبقه‌ای به شکل عددی هستن، اما هرکدوم خواص متفاوتی دارن و در موقعیت‌های مختلفی به کار میان.

کدگذاری وان-هات هر طبقه رو در یک ستون مجزا به صورت صفر و یکی نمایش می‌ده (۱ به معنی حضور اون طبقه و ۰ به معنی عدم حضورشه). همون مثال بالا رو اگه با طبقه‌های رنگ قرمز، سبز و آبی درنظر بگیریم، کدگذاری وان‌-هات این متغیر رو به سه تا ستون جداگانه می‌شکنه:

رنگ قرمز سبز آبی
قرمز    1    0    0
سبز    0    1    0
آبی    0    0    1

 

کدگذاری وان-هات دقیقاً وقتی انتخاب خوبیه که هیچ نوع ترتیب یا سلسله‌مراتبی بین طبقه‌های اطلاعات وجود نداشته باشه؛ چون این روش، هر طبقه رو به چشم یک متغیر کاملاً مستقل که به بقیه مقادیر ربطی نداره می‌بینه. ضمناً، این روش وقتی جواب می‌ده که تعداد طبقه‌هات منطقی و کم باشن. اگه داده‌ها صدها یا هزاران مقدار متفاوت (کاردینالیتی بالا) داشته باشن، اون‌وقت اضافه شدن کلی ستون بی‌معنی، حافظت رو خفه می‌کنه.

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

رنگ کد رنگ
قرمز 0
سبز 1
آبی 2

 

کدگذاری برچسب بهترین راهکاره برای وقتی که واقعاً یک ترتیب یا ارزش ذاتی بین طبقه‌هات وجود داره؛ یعنی دقیقاً برای متغیرهای ترتیبی! به عنوان مثال طبقه‌های «کوچک»، «متوسط» و «بزرگ». در این‌جور موارد، عددی که متناسب با طبقه می‌ذاریم باید بازتاب‌دهنده همون ترتیب واقعی باشه (مثلاً کوچک بشه ۱، متوسط بشه ۲ و...). همچنین اگر تعداد طبقه‌هات فوق‌العاده زیاده، می‌تونی برای کاهش ابعاد داده از این متد استفاده کنی.

در کل در دنیای یادگیری ماشین، روش وان-هات محبوب‌تره، چون خیلی منعطف‌تر عمل می‌کنه و مشکلات ناشی از سوءتفاهم‌های مربوط به «ترتیب‌های الکی و من‌درآوردی» توسط مدل پیش نمیاد. اما خب برای مواقعی که طبقه‌هات ترتیب مشخص دارن یا تعداد مقادیر انقدر زیاده که وان-هات جوابگو نیست، قطعاً برچسب زدن گزینه منطقی‌تریه.

مدیریت داده‌های طبقه‌ای با کاردینالیتی بالا

منظور از کاردینالیتی بالا (High Cardinality) اینه که یک ویژگی آماری، تعداد بسیار زیادی طبقه‌بندی متمایز از هم داشته باشه. کاردینالیتی بالا موقع کدگذاری‌های یادگیری ماشین حسابی می‌تونه واست چالش درست کنه. این موضوع می‌تونه باعث بشه دیتاست نهایی خیلی پراکنده بشه و عملکرد بعضی از مدل‌های ماشینی رو کند یا خراب کنه. این‌جا چند تا تکنیک معرفی شده تا موقع برخورد با کاردینالیتی بالا ازشون کمک بگیری:

ترکیب طبقه‌های نادر

این روش یعنی طبقه‌هایی که خیلی کم تکرار شدن رو با هم قاطی کنی و همه رو داخل یک طبقه جمع کنی (مثلاً یک طبقه به اسم «سایر موارد»). این کار باعث می‌شه تعداد طبقه‌های یکتای تو پایین بیاد و پراکندگی مدل کمتر بشه.

کدگذاری هدف (Target Encoding)

در این روش، به جای مقدار هر طبقه، میانگین متغیر هدف برای همون طبقه جایگزین می‌شه. در نتیجه داده پیوسته‌تر نمایش داده می‌شه و راحت‌تر می‌شه دید که آیا رابطه‌ای بین این ویژگی‌های طبقه‌ای و متغیر هدف هست یا نه.

کدگذاری وزن شواهد (WOE Encoding)

کدگذاری بر اساس وزن شواهد (یا Weight of Evidence)، خیلی شبیه به کدگذاری هدفه، با این فرق که توزیع متغیر هدف به تفکیک هر طبقه رو هم وارد بازی می‌کنه. مقدار پراامتر WOE برای یک طبقه برابره با: لگاریتمِ نسبتِ میانگین هدفِ اون طبقه، تقسیم بر میانگین هدف در کل دیتاست (جامعه آماری).

مهندسی ویژگی برای داده‌های طبقه‌ای

مهندسی ویژگی‌ها (Feature Engineering) یکی از قدم‌های اساسی موقع جمع‌وجور کردن داده‌ها برای ماشینه. در این مرحله از دل ویژگی‌های قدیمی که داخل دیتاست داریم، ویژگی‌های جدیدی استخراج می‌کنیم تا دیتای کاربردی‌تری برای مدل بسازیم و عملکردش رو بکشیم بالا. چند تا رویکرد برای مهندسی ویژگی‌های طبقه‌ای داریم:

ایجاد متغیرهای تعاملی

این متغیرها، ویژگی‌های تازه‌ای هستن که با ترکیب دو یا چندتا ویژگیِ قبلی درست می‌شن. مثال می‌زنم: فرض کن دو تا ویژگی طبقه‌ای بنام‌های «جنسیت» و «وضعیت تأهل» داری. می‌تونی یه ستون جدید به اسم «جنسیت-تأهل» بسازی که حاصل ترکیب این دوتا باشه. این تکنیک می‌تونه به‌خوبی رابطه‌های غیرخطی پیچیده بین ویژگی‌ها و هدف اصلی مدل رو بهت نشون بده.

بخش‌بندی متغیرهای عددی (Binning)

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

کدگذاری متغیرهای چرخه‌ای

یه سری از متغیرها هستن که در یک بازه زمانی خاص مدام تکرار می‌شن. مثلاً زمان و ساعت؛ این متغیر در شبانه‌روز کلاً ۲۴ ساعت داره که بعدش تکرار می‌شه. کدگذاری این متغیرهای چرخه‌ای می‌تونه کمک کنه تا الگوهایی که تکرارپذیرن، بهتر کشف بشن. یه ترفند باحال و رایج واسه سر و کله زدن با این نوع از متغیرها اینه که دو تا ویژگی برای اون بسازیم: یه ستون بهش سینوس اون متغیر رو بدیم و در بخش دوم کسینوس همون متغیر!

نتیجه‌گیری

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

ما بحثمون رو با اینکه داده طبقه‌ای چیه و چرا مدیریتش برای ماشین حیاتیه، شروع کردیم. بعدش رفتیم سراغ یک راهنمای کاربردی و قدم‌به‌قدم برای اجرای کدگذاری وان-هات با ابزارهایی مثل pandas و scikit-learn و از مثال‌های کدنویسی استفاده کردیم تا مبحث قشنگ دستت بیاد.

در این آموزش روی یک‌سری مباحث حرفه‌ای‌تر مثل مدیریت داده‌ها با کاردینالیتی بالا، مهندسی ویژگی‌ها، کدگذاری‌های آماری مثل WOE هم مروری داشتیم. اگر خیلی مشتاقی که بیشتر از اینا در موردش بدونی، پیشنهاد می‌کنیم نگاهی به دوره ما در فینکا با اسم کار با داده‌های طبقه‌ای در پایتون بندازی.

راستی اگر حس می‌کنی زبون برنامه‌نویسی R رو بیشتر از پایتون می‌پسندی، دوره‌های دیگه ما مثل داده‌های طبقه‌ای در Tidyverse یا استنتاج برای داده‌های طبقه‌ای در R دقیقاً برازنده‌ی تو هستن و در فینکا می‌تونی ازشون لذت ببری.

اشتراک‌گذاری
فهرست مطالب
  • مقدمه
  • دیتاست طبقه‌ای
  • درک انواع داده در کتابخونه Pandas
  • تحلیل ویژگی‌های طبقه‌ای در پایتون
  • کدگذاری ویژگی‌های طبقه‌ای در پایتون
  • مدیریت داده‌های طبقه‌ای با کاردینالیتی بالا
  • مهندسی ویژگی برای داده‌های طبقه‌ای
  • نتیجه‌گیری

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.