روش کدبندی وان هات (One Hot Encoding) — به زبان ساده

۳۳۵۵ بازدید
آخرین به‌روزرسانی: ۱۲ اردیبهشت ۱۴۰۲
زمان مطالعه: ۵ دقیقه
روش کدبندی وان هات (One Hot Encoding) — به زبان ساده

متغیر «طبقه‌ای» (Categorical)، نوع داده‌ای است که تنها می‌تواند تعداد محدودی مقدار را بگیرد. برای مثال، اگر یک نظرسنجی وجود داشته باشد که از افراد برند خودرو آن‌ها را پرسیده باشند، نتیجه یک متغیر طبقه‌ای خواهد بود؛ به این دلیل که، برند خودرویی که افراد می‌توانند داشته باشند به چند شرکت ساخت خودروسازی خاص (در همان کشور، در همان کشور و چند کشور دیگر یا در کلی‌ترین حالت به همه برندهای خودروی موجود در جهان) محدود می‌شود. بنابراین، پاسخ‌ها محدود به یک سری گزینه خاص خواهد بود. یا اگر از افراد بپرسند که رنگ مورد علاقه آن‌ها چیست، پاسخ‌های افراد محدود به یک سری گزینه خاص (اسامی رنگ‌ها یعنی مثلا: سفید، آبی، قرمز، مشکی، قهره‌ای و دیگر موارد) خواهد بود.

در صورت استفاده از این نوع متغیرها در اغلب مدل‌های «یادگیری ماشین» (Machine Learning)، پیغام خطا صادر خواهد شد. دلیل این امر آن است که بسیاری از مدل‌ها، امکان انجام پردازش مستقیم و بدون انجام «کدبندی» (Encoding) را روی داده‌های طبقه‌ای ندارند. در ادامه، یکی از روش‌های محبوب کدبندی داده‌های طبقه‌ای با عنوان «کدبندی وان‌هات» (One Hot Encoding) همراه با مثال، آموزش داده شده است. برای مطالعه بیشتر پیرامون انواع متغیرها شامل متغیرهای طبقه‌ای، مطالعه مطلب «انواع ویژگی ها (خصیصه‌ها) و مفهوم بردار ویژگی در داده کاوی» توصیه می‌شود. شایان توجه است که در این مطلب، روش پیاده‌سازی روش کدبندی One-Hot در پایتون، با استفاده از یک مثال آموزش داده خواهد شد.

کدبندی One-Hot

روش کدبندی One-Hot، یکی از پرکاربردترین رویکردها است و عملکرد آن به جز در مواردی که متغیر دسته‌ای مقادیر خیلی زیادی بگیرد، بسیار خوب است (معمولا از این روش برای متغیرهایی که بیش‌تر از ۱۵ مقدار متفاوت بگیرند، مناسب نیست. در برخی از مواردی که تعداد متغیرها کمتر است نیز امکان دارد گزینه مناسبی نباشد). کدبندی One-Hot ستون‌های دودویی (binary) جدیدی می‌سازد که هر یک مربوط به یکی از مقادیری هستند که متغیر به خود می‌گیرد. برای درک بهتر موضوع، مثالی در ادامه ارائه شده است.

فرض می‌شود که یک متغیر با عنوان Color در مجموعه داده وجود دارد که مقادیر آن Red ،Yellow و Green هستند. اکنون، کلیه مقادیر این متغیر به سه ستون جدا با عنوان‌های Yellow ،Red و Green تبدیل می‌شوند. همانطور که در تصویر مشهود است، پنج «نمونه» در مجموعه داده وجود دارد که مقدار متغیر Color برای آن‌ها به ترتیب برابر با Green ،Yellow ،Red ،Red و Yellow است. اکنون، برای نمونه اول که رنگ آن قرمز است در ستون Red عدد ۱ و در ستون‌های Yellow و Green عدد صفر وارد می‌شوند. برای نمونه دوم نیز که رنگ آن قرمز است به همین صورت عمل می‌شود. برای نمونه سوم که رنگ آن زرد است در ستون Red و Green مقدار صفر و در ستون Yellow مقدار ۱ وارد می‌شود. برای متغیر چهارم که رنگ آن Green است در خانه‌های Red و Yellow مقدار صفر و در خانه Green مقدار ۱ وارد می‌شود. برای سایر نمونه‌ها نیز به همین صورت عمل می‌شود.

کدبندی one-hot

پیاده‌سازی کدبندی One-Hot در پایتون

در ادامه، روش پیاده‌سازی کدبندی One-Hot در زبان برنامه‌نویسی پایتون آموزش داده است. در اینجا از گام‌های اولیه نوشتن کد چشم‌پوشی و فرض شده که این مراحل انجام شده‌اند. بنابراین، کار از جایی آغاز می‌شود که دیتافریم‌ها (DataFrame) برا train_predictors و test_predictors وجود دارند.

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

ورودی [1]:

1# Read the data
2import pandas as pd
3train_data = pd.read_csv('../input/train.csv')
4test_data = pd.read_csv('../input/test.csv')
5
6# Drop houses where the target is missing
7train_data.dropna(axis=0, subset=['SalePrice'], inplace=True)
8
9target = train_data.SalePrice
10
11# Since missing values isn't the focus of this tutorial, we use the simplest
12# possible approach, which drops these columns. 
13# For more detail (and a better approach) to missing values, see
14# https://www.kaggle.com/dansbecker/handling-missing-values
15cols_with_missing = [col for col in train_data.columns 
16                                 if train_data[col].isnull().any()]                                  
17candidate_train_predictors = train_data.drop(['Id', 'SalePrice'] + cols_with_missing, axis=1)
18candidate_test_predictors = test_data.drop(['Id'] + cols_with_missing, axis=1)
19
20# "cardinality" means the number of unique values in a column.
21# We use it as our only way to select categorical columns here. This is convenient, though
22# a little arbitrary.
23low_cardinality_cols = [cname for cname in candidate_train_predictors.columns if 
24                                candidate_train_predictors[cname].nunique() < 10 and
25                                candidate_train_predictors[cname].dtype == "object"]
26numeric_cols = [cname for cname in candidate_train_predictors.columns if 
27                                candidate_train_predictors[cname].dtype in ['int64', 'float64']]
28my_cols = low_cardinality_cols + numeric_cols
29train_predictors = candidate_train_predictors[my_cols]
30test_predictors = candidate_test_predictors[my_cols]

کتابخانه «پانداس» (Pandas) نوع داده (که به آن dtype گفته می‌شود) هر ستون از سری را مشخص کرده و در مقابل نام آن ستون نمایش می‌دهد.

در ادامه، یک نمونه تصادفی از dtype‌های داده‌های پیش‌بینی شده نمایش داده می‌شود.

ورودی [۲]:

1train_predictors.dtypes.sample(10)

خروجی [۲]:

Heating object
CentralAir object
Foundation object
Condition1 object
YrSold int64
PavedDrive object
RoofMatl object
PoolArea int64
EnclosedPorch int64
KitchenAbvGr int64
dtype: object

Object نشان می‌دهد که یک ستون دارای متن (text) است (به لحاظ تئوری می‌تواند حاوی موارد دیگری نیز باشد که در اینجا برای ما اهمیتی ندارد). متداول‌ترین کار برای One-Hot آن است که این ستون‌های «شی» (Object) را کدبندی کند، زیرا نمی‌توان آن‌ها را به طور مستقیم به مدل داد. پانداس یک تابع convenience function با عنوان get_dummies برای دریافت کدبندی One-Hot دارد. این تابع را می‌توان به صورت زیر فراخوانی کرد:

ورودی[3]:

1one_hot_encoded_training_predictors = pd.get_dummies(train_predictors)

متعاقبا، متغیرهای طبقه‌ای نیز حذف شدند. برای مشاهده اینکه رویکردها چگونه مقایسه می‌شوند، می‌توان «میانگین قدر مطلق خطا» (Mean Absolute Error) برای مدل‌ها را محاسبه کرد که با دو مجموعه متناوب از پیش‌بین‌ها ساخته شده است:

۱. طبقه‌بندی‌های کدبندی شده One-Hot به عنوان پیش‌بین‌های عددی

۲. پیش‌بین‌های عددی در جایی که طبقه‌ای‌ها حذف شده‌اند.

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

ورودی [۴]:

1from sklearn.model_selection import cross_val_score
2from sklearn.ensemble import RandomForestRegressor
3
4def get_mae(X, y):
5    # multiple by -1 to make positive MAE score instead of neg value returned as sklearn convention
6    return -1 * cross_val_score(RandomForestRegressor(50), 
7                                X, y, 
8                                scoring = 'neg_mean_absolute_error').mean()
9
10predictors_without_categoricals = train_predictors.select_dtypes(exclude=['object'])
11
12mae_without_categoricals = get_mae(predictors_without_categoricals, target)
13
14mae_one_hot_encoded = get_mae(one_hot_encoded_training_predictors, target)
15
16print('Mean Absolute Error when Dropping Categoricals: ' + str(int(mae_without_categoricals)))
17print('Mean Abslute Error with One-Hot Encoding: ' + str(int(mae_one_hot_encoded)))
Mean Absolute Error when Dropping Categoricals: 18350
Mean Abslute Error with One-Hot Encoding: 18023

اعمال به چندین فایل

تاکنون، داده‌های آموزش با روش One-Hot کدبندی شدند. اما وقتی چندین فایل وجود دارد (برای مثال داده‌های تست یا برخی از دیگر داده‌ها که کاربر قصد دارد برای آن‌ها پیش‌بینی انجام دهد) چه کار می‌توان کرد؟ کتابخانه «سایکیت لِرن» (Scikit Learn) به ترتیب ستون‌ها حساس است، بنابراین اگر مجموعه داده آموزش و تست ناهماهنگ باشند، نتایج بی‌معنی خواهد بود.

این مساله در صورتی ممکن است به وقوع بپیوندد که داده‌های طبقه‌ای دارای تعداد متفاوتی از مقادیر در داده‌های آموزش و تست باشند.

با استفاده از دستور align می‌توان اطمینان حاصل کرد که داده‌های تست به همان ترتیبی کدبندی شده‌اند که داده‌های آموزش:

1one_hot_encoded_training_predictors = pd.get_dummies(train_predictors)
2one_hot_encoded_test_predictors = pd.get_dummies(test_predictors)
3final_train, final_test = one_hot_encoded_training_predictors.align(one_hot_encoded_test_predictors,
4                                                                    join='left', 
5                                                                    axis=1)

دستور align اطمینان حاصل می‌کند که ستون‌ها به ترتیب مشابهی در هر دو مجموعه داده نمایش داده شده‌اند (از نام ستون‌ها برای شناسایی اینکه کدام ستون‌ها در هر مجموعه داده صف کشیده‌اند). آرگومان 'join='left تعیین می‌کند که  left join مشابهی در SQL انجام خواهد شد. آرگومان 'join='inner کاری را انجام می‌دهد که پایگاه داده SQL به آن inner join می‌گوید و تنها ستون‌ها را در هر دو مجموعه داده در حالت نمایش قرار می‌دهد. این مورد، انتخاب معقولی به نظر می‌رسد.

نتیجه‌گیری

جهان مملو از داده‌های طبقه‌ای است. افراد در صورتی که بدانند چگونه از این داده‌ها استفاده کنند، «دانشمندان داده» (Data Scientists) بهتری خواهند بود.

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

^^

بر اساس رای ۱۴ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
kaggle
۱ دیدگاه برای «روش کدبندی وان هات (One Hot Encoding) — به زبان ساده»

سلام
می خواستم بدونم ترجمه این عبارت چی میشه؟ معادلی براش هست one-hot encoding?
hot در اینجا چی میتونه معنی بشه :کدگزاری یکسان کننده ، کدگزاری یکسان کننده اهمیت؟
ممنون

نظر شما چیست؟

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