کدگذاری دادههای دستهای (Encoding)
تبدیل دادههای متنی به عدد با Label Encoding و One-Hot Encoding و انتخاب روش درست
چرا کدگذاری؟
مدلهای ریاضی فقط با عدد کار میکنند. وقتی ویژگیای مثل «شهر» مقدار متنی دارد (تهران، شیراز)، باید آن را به عدد تبدیل کنیم.
روش ۱: Label Encoding
به هر دسته یک عدد میدهد:
تهران → 0
شیراز → 1
اصفهان → 2
در scikit-learn:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df["city_encoded"] = le.fit_transform(df["city"])
خطر Label Encoding
وقتی دستهها ترتیب واقعی ندارند، Label Encoding دروغ میگوید! مدل فکر میکند اصفهان (۲) «بزرگتر» از تهران (۰) است و بین آنها رابطه عددی قائل میشود. برای دستههای اسمی از One-Hot استفاده کنید.
روش ۲: One-Hot Encoding
برای هر دسته یک ستون باینری (۰/۱) میسازد:
| شهر | تهران؟ | شیراز؟ | اصفهان؟ |
|---|---|---|---|
| تهران | ۱ | ۰ | ۰ |
| شیراز | ۰ | ۱ | ۰ |
| اصفهان | ۰ | ۰ | ۱ |
در Pandas:
df = pd.get_dummies(df, columns=["city"])
کدام را انتخاب کنیم؟
| وضعیت | روش پیشنهادی |
|---|---|
| دستههای اسمی بدون ترتیب (شهر، رنگ) | One-Hot |
| دستههای ترتیبی (تحصیلات، رضایت) | Label/Ordinal |
| برچسب هدف (y) | Label Encoding |
| تعداد دستههای خیلی زیاد | One-Hot مشکلساز است؛ روشهای پیشرفتهتر |
نکته: تعداد ستونها
One-Hot با ۱۰ دسته، ۱۰ ستون میسازد. اگر دستهها هزاران تا باشند، داده بسیار پهن میشود و فاصلهها بیمعنا میشوند!
جمعبندی
- داده متنی باید به عدد تبدیل شود
- Label Encoding ساده است ولی برای دستههای بدون ترتیب گمراهکننده
- One-Hot استاندارد برای دستههای اسمی با
get_dummiesاست
این مبحث بخشی از دوره آموزش کامل ماشین لرنینگ است.