در برنامه نویسی سنتی، تمرکز بر روی کد است. در پروژه های یادگیری ماشینی، تمرکز به سمت نمایش می رود. یعنی یکی از راه هایی که توسعه دهندگان یک مدل را تقویت می کنند، افزودن و بهبود ویژگی های آن است.
نگاشت داده های خام به ویژگی ها
سمت چپ شکل 1 داده های خام از منبع داده ورودی را نشان می دهد. سمت راست یک بردار ویژگی را نشان میدهد که مجموعهای از مقادیر ممیز شناور است که شامل نمونههای مجموعه دادههای شما است. مهندسی ویژگی به معنای تبدیل داده های خام به بردار ویژگی است. انتظار داشته باشید زمان قابل توجهی را صرف انجام مهندسی ویژگی کنید.
بسیاری از مدلهای یادگیری ماشین باید ویژگیها را بهعنوان بردارهایی با شماره واقعی نشان دهند، زیرا مقادیر ویژگی باید در وزن مدل ضرب شوند.
شکل 1. مهندسی ویژگی داده های خام را به ویژگی های ML نگاشت می کند.
نگاشت مقادیر عددی
داده های اعداد صحیح و ممیز شناور به رمزگذاری خاصی نیاز ندارند زیرا می توان آنها را در وزن عددی ضرب کرد. همانطور که در شکل 2 پیشنهاد شده است، تبدیل مقدار صحیح خام 6 به مقدار ویژگی 6.0 بی اهمیت است:
شکل 2. نگاشت مقادیر صحیح به مقادیر ممیز شناور.
نگاشت مقادیر طبقه بندی شده
ویژگی های طبقه بندی دارای مجموعه ای مجزا از مقادیر ممکن است. برای مثال، ممکن است یک ویژگی به نام street_name
با گزینههایی وجود داشته باشد که عبارتند از:
{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}
از آنجایی که مدل ها نمی توانند رشته ها را در وزن های آموخته شده ضرب کنند، از مهندسی ویژگی برای تبدیل رشته ها به مقادیر عددی استفاده می کنیم.
ما می توانیم این کار را با تعریف یک نگاشت از مقادیر ویژگی، که به عنوان واژگان مقادیر ممکن، به اعداد صحیح می گوییم، انجام دهیم. از آنجایی که همه خیابانهای دنیا در مجموعه دادههای ما ظاهر نمیشوند، میتوانیم همه خیابانهای دیگر را در یک دسته «دیگر» که به عنوان سطل OOV (خارج از واژگان) شناخته میشود، گروهبندی کنیم.
با استفاده از این رویکرد، در اینجا نحوه ترسیم نام خیابان های خود به اعداد آمده است:
- نقشه جاده چارلستون به 0
- نقشه بلوار ساحلی شمالی به 1
- نقشه Shorebird Way to 2
- نقشه خیابان رنگستورف به 3
- همه چیزهای دیگر (OOV) را به 4 ترسیم کنید
با این حال، اگر این اعداد شاخص را مستقیماً در مدل خود بگنجانیم، محدودیت هایی را اعمال می کند که ممکن است مشکل ساز باشد:
ما یک وزن واحد را یاد خواهیم گرفت که برای همه خیابان ها کاربرد دارد. به عنوان مثال، اگر وزن 6 را برای
street_name
یاد بگیریم، آنگاه آن را در 0 برای Charleston Road، در 1 برای North Shoreline Boulevard، 2 برای Shorebird Way و غیره ضرب می کنیم. مدلی را در نظر بگیرید که قیمت خانه را با استفاده ازstreet_name
به عنوان یک ویژگی پیش بینی می کند. بعید است که یک تعدیل خطی قیمت بر اساس نام خیابان وجود داشته باشد، و علاوه بر این فرض بر این است که شما خیابانها را بر اساس میانگین قیمت خانهشان سفارش دادهاید. مدل ما به انعطافپذیری یادگیری وزنهای مختلف برای هر خیابان نیاز دارد که با استفاده از ویژگیهای دیگر به قیمت تخمین زده شده اضافه میشود.ما مواردی را که
street_name
ممکن است چندین مقدار داشته باشد در نظر نمی گیریم. به عنوان مثال، بسیاری از خانهها در گوشه دو خیابان قرار دارند و هیچ راهی برای رمزگذاری آن اطلاعات در مقدارstreet_name
در صورتی که دارای یک شاخص باشد وجود ندارد.
برای حذف هر دو این محدودیتها، میتوانیم یک بردار باینری برای هر ویژگی طبقهبندی در مدل خود ایجاد کنیم که مقادیر را به صورت زیر نشان میدهد:
- برای مقادیری که در مثال اعمال می شود، عناصر برداری مربوطه را روی
1
تنظیم کنید. - همه عناصر دیگر را روی
0
تنظیم کنید.
طول این بردار برابر با تعداد عناصر موجود در واژگان است. این نمایش زمانی که یک مقدار منفرد 1 باشد، رمزگذاری تک داغ و زمانی که چندین مقدار 1 باشد ، رمزگذاری چند داغ نامیده می شود.
شکل 3 یک رمزگذاری یکباره از یک خیابان خاص را نشان می دهد: Shorebird Way. عنصر موجود در بردار باینری برای Shorebird Way دارای مقدار 1
است، در حالی که عناصر برای سایر خیابان ها دارای مقادیر 0
هستند.
شکل 3. نگاشت آدرس خیابان از طریق رمزگذاری یک طرفه.
این رویکرد به طور موثر یک متغیر بولی برای هر مقدار مشخصه ایجاد می کند (به عنوان مثال، نام خیابان). در اینجا، اگر خانه ای در Shorebird Way باشد، مقدار باینری فقط برای Shorebird Way 1 است. بنابراین، مدل فقط از وزن برای Shorebird Way استفاده می کند.
به طور مشابه، اگر خانه ای در گوشه دو خیابان باشد، دو مقدار باینری روی 1 تنظیم می شود و مدل از هر دو وزن مربوطه استفاده می کند.
نمایندگی پراکنده
فرض کنید 1,000,000 نام خیابان مختلف در مجموعه دادههای خود دارید که میخواهید به عنوان مقادیر برای street_name
درج کنید. ایجاد صریح یک بردار باینری از 1000000 عنصر که در آن تنها 1 یا 2 عنصر درست است، نمایش بسیار ناکارآمدی از نظر ذخیره و زمان محاسبه در هنگام پردازش این بردارها است. در این شرایط، یک رویکرد رایج استفاده از یک نمایش پراکنده است که در آن فقط مقادیر غیر صفر ذخیره می شود. همانطور که در بالا توضیح داده شد، در نمایشهای پراکنده، وزن مدل مستقل برای هر مقدار مشخصه آموخته میشود.