مقیاس‌گذاری ویژگی‌ها

یادگیری ماشین شبیه درست کردن آبمیوه است. اگر میوه‌ها را بر اساس نسبت آن‌ها نه صرفاً اندازه‌شان درست مخلوط ‌کنیم؛ ترکیب خوبی به‌ دست می‌آوریم.در یادگیری ماشین نباید اجازه دهیم ویژگی‌هایی که مقدارشان بزرگ‌تر است تأثیر بیشتری در مدل بگذارند بلکه لازم است ویژگی‌ها را مقیاس‌گذاری کنیم تا بر اساس نسبت‌شان در مدل تأثیر دهیم.

مقیاس‌گذاری‌ ویژگی‌ها یکی از مهم‌ترین مراحل پیش‌پردازش داده‌ها در یادگیری ماشین و بسیار ضروری است زیرا فاصله‌ی بین داده‌ها را می‌سنجد. در این صورت است که می‌توانیم بین یک مدل ضعیف و یک مدل قوی در یادگیری ماشین تفاوت قائل شویم. از رایج‌ترین روش‌های مقیاس‌گذاری نرمال‌سازی و استاندارسازی داده‌ها می‌باشد.

نرمال‌سازی، داده‌ها را بین بازه‌ی [0,1] یا [-1,+1] قرار می‌دهد درحالی‌ که استانداردسازی، داده‌ها را به‌صورت میانگین ۰ و واریانس 1 تبدیل می‌کند و و اصطلاحاً داده‌های ما را بی واحد می‌کند. نمودار زیر به‌روشنی این مفهوم را به تصویر می‌کشد.

توزیع داده
توزیع داده

چرا مقیاس‌گذاری اهمیت دارد؟

الگوریتم‌های یادگیری ماشین تنها به اعداد نگاه می‌کنند. اگر تفاوت بین اعداد زیاد باشد؛ به اعداد بزرگ‌تر رتبه‌ی برتری اختصاص می‌دهند درنتیجه این اعداد تأثیر بیش‌تری روی مدل می‌گذارند. این الگوریتم‌ها تفاوت بین اعداد هم متوجه نمی‌شوند. به‌عنوان مثال 5 گرم شکر با 5 دلار برای انسان فرق می‌کند اما الگوریتم یادگیری تفاوتی بین این دو عدد قائل نمی‌شود.  جدول زیر را در نظر بگیرید. در این جدول بر اساس یک سری وزن‌ها، قیمت‌هایی را مشاهده می‌کنیم. چون مقدار وزن‌ها بیشتر از قیمت می‌باشد الگوریتم یادگیری این ویژگی را مهم‌تر در نظر می‌گیرد درحالی‌که قیمت مؤلفه‌ی مهم‌تری است.

جدول داده‌ها
جدول داده‌ها

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

یکی دیگر از دلایل اهمیت مقیاس‌گذاری این است که الگوریتم‌های محدودی مانند گرادیانِ کاهشیِ شبکه‌های عصبی اگر از مقیاس‌گذاری استفاده کنند سریع‌تر همگرا می‌شوند.

همگرایی
همگرایی

دلیل دیگر اهمیت مقیاس‌گذاری، اشباع شدن (saturation) می‌باشد. شبیه تابع فعال‌سازی سیگمویید در شبکه‌های عصبی، مقیاس‌گذاری سبب می‌شود به‌سرعت اشباع نشود.

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

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

K-nearest neighbors

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

K-Means

این الگوریتم به معنای k– میانگین است و از اندازه‌ی فاصله‌ی اقلیدسی در مقیاس‌گذاری ویژگی‌ها استفاده می‌کند.

PCA

مقیاس‌گذاری هنگام انجام تحلیل مؤلفه‌های اصلی (PCA) بسیار مهم استPCA . تلاش می‌کند تا ویژگی‌ها را با حداکثر واریانس به‌دست آورد، واریانس برای ویژگی‌ها با اندازه‌ی زیاد، بالا است و PCA را به سمت ویژگی‌های با اندازه زیاد سوق می‌دهد.

Gradient Descent

ما می‌توانیم با استفاده از مقیاس‌گذاری، سرعتِ گرادیان کاهشی (شیب نزولی) را افزایش دهیم به‌این‌علت که ϴ در دامنه‌های کوچک به‌سرعت و در دامنه‌های بزرگ به‌آرامی کاهش می‌یابد.

مقیاس‌گذاری ویژگی از طریق شیوه‌های زیر قابل انجام است:

  • Min Max Scaler
  • Standard Scaler
  • Max Abs Scaler
  • Robust Scaler
  • Quantile Transformer Scaler
  • Power Transformer Scaler

اکنون با استفاده از جدول داده‌ها که در ابتدای مقاله به آن اشاره شد، به توضیح این روش‌ها و پیاده‌سازی آن‌ها با زبان پایتون و کتابخانه scikit-learn می‌پردازیم.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.DataFrame({'WEIGHT': [15, 18, 12,10],
                   'PRICE': [1,3,2,5]},
                   index = ['Orange','Apple','Banana','Grape'])
print(df)
خروجی کد
خروجی کد

Min-Max Scaler

\begin{equation}x_{n e w}=\frac{x-x_{\min }}{x_{\max }-x_{\min }}\end{equation}

 

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

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df1 = pd.DataFrame(scaler.fit_transform(df),
                   columns=['WEIGHT','PRICE'],
                   index = ['Orange','Apple','Banana','Grape'])
ax = df.plot.scatter(x='WEIGHT', y='PRICE',color=['red','green','blue','yellow'], 
                     marker = '*',s=80, label='BREFORE SCALING');
df1.plot.scatter(x='WEIGHT', y='PRICE', color=['red','green','blue','yellow'],
                 marker = 'o',s=60,label='AFTER SCALING', ax = ax);
plt.axhline(0, color='red',alpha=0.2)
plt.axvline(0, color='red',alpha=0.2);
خروجی Min-Max Scaler
خروجی Min-Max Scaler

 Standard Scaler

\begin{equation}x_{n e w}=\frac{x-\mu}{\sigma}\end{equation}

Standard Scaler فرض می‌کند که داده‌ها به‌صورت نرمال در هر ویژگی توزیع‌شده‌اند و آن‌ها را به‌گونه‌ای مقیاس‌گذاری می‌کند که حول محور 0 با انحراف معیار 1 توزیع شوند.

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df2 = pd.DataFrame(scaler.fit_transform(df),
                   columns=['WEIGHT','PRICE'],
                   index = ['Orange','Apple','Banana','Grape'])
ax = df.plot.scatter(x='WEIGHT', y='PRICE',color=['red','green','blue','yellow'], 
                     marker = '*',s=80, label='BREFORE SCALING');
df2.plot.scatter(x='WEIGHT', y='PRICE', color=['red','green','blue','yellow'],
                 marker = 'o',s=60,label='AFTER SCALING', ax = ax)
plt.axhline(0, color='red',alpha=0.2)
plt.axvline(0, color='red',alpha=0.2);
خروجی Standard Scaler
خروجی Standard Scaler

Max Abs Scaler

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

from sklearn.preprocessing import MaxAbsScaler
scaler = MaxAbsScaler()
df4 = pd.DataFrame(scaler.fit_transform(df),
                   columns=['WEIGHT','PRICE'],
                   index = ['Orange','Apple','Banana','Grape'])
ax = df.plot.scatter(x='WEIGHT', y='PRICE',color=['red','green','blue','yellow'], 
                     marker = '*',s=80, label='BREFORE SCALING');
df4.plot.scatter(x='WEIGHT', y='PRICE', color=['red','green','blue','yellow'],
                 marker = 'o',s=60,label='AFTER SCALING', ax = ax)
plt.axhline(0, color='red',alpha=0.2)
plt.axvline(0, color='red',alpha=0.2);
خروجی Max Abs Scaler
خروجی Max Abs Scaler

Robust Scaler

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

from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
df3 = pd.DataFrame(scaler.fit_transform(df),
                   columns=['WEIGHT','PRICE'],
                   index = ['Orange','Apple','Banana','Grape'])
ax = df.plot.scatter(x='WEIGHT', y='PRICE',color=['red','green','blue','yellow'], 
                     marker = '*',s=80, label='BREFORE SCALING');
df3.plot.scatter(x='WEIGHT', y='PRICE', color=['red','green','blue','yellow'],
                 marker = 'o',s=60,label='AFTER SCALING', ax = ax)
plt.axhline(0, color='red',alpha=0.2)
plt.axvline(0, color='red',alpha=0.2);
خروجیRobust Scaler
خروجیRobust Scaler

Quantile Transformer Scaler

این روش ویژگی‌ها را به‌منظور دستیابی به توزیع یکنواخت یا نرمال تغییر می‌دهد.

حال ببینیم چه اتفاقی می‌افتد اگر ما یک داده‌ی دورافتاده را معرفی کنیم و تأثیر مقیاس‌گذاری را با استفاده از استاندارد Scaler و Robust Scaler مشاهده کنیم.

dfr = pd.DataFrame({'WEIGHT': [15, 18, 12,10,50],
                   'PRICE': [1,3,2,5,20]},
                   index = ['Orange','Apple','Banana','Grape','Jackfruit'])
print(dfr)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df21 = pd.DataFrame(scaler.fit_transform(dfr),
                   columns=['WEIGHT','PRICE'],
                   index = ['Orange','Apple','Banana','Grape','Jackfruit'])
ax = dfr.plot.scatter(x='WEIGHT', y='PRICE',color=['red','green','blue','yellow','black'], 
                     marker = '*',s=80, label='BREFORE SCALING');
df21.plot.scatter(x='WEIGHT', y='PRICE', color=['red','green','blue','yellow','black'],
                 marker = 'o',s=60,label='STANDARD', ax = ax,figsize=(12,6))
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
df31 = pd.DataFrame(scaler.fit_transform(dfr),
                   columns=['WEIGHT','PRICE'],
                   index = ['Orange','Apple','Banana','Grape','Jackfruit'])
df31.plot.scatter(x='WEIGHT', y='PRICE', color=['red','green','blue','yellow','black'],
                 marker = 'v',s=60,label='ROBUST', ax = ax,figsize=(12,6))
plt.axhline(0, color='red',alpha=0.2)
plt.axvline(0, color='red',alpha=0.2);
افزودن یک داده‌ی پرت
افزودن یک داده‌ی پرت
خروجی پس از افزودن داده‌ی پرت
خروجی پس از افزودن داده‌ی پرت

Quantile Transformer Scaler

این روش ویژگی‌ها را به‌منظور دستیابی به توزیع یکنواخت یا نرمال تغییر می‌دهد.

from sklearn.preprocessing import QuantileTransformer
scaler = QuantileTransformer()
df6 = pd.DataFrame(scaler.fit_transform(df),
                   columns=['WEIGHT','PRICE'],
                   index = ['Orange','Apple','Banana','Grape'])
ax = df.plot.scatter(x='WEIGHT', y='PRICE',color=['red','green','blue','yellow'], 
                     marker = '*',s=80, label='BREFORE SCALING');
df6.plot.scatter(x='WEIGHT', y='PRICE', color=['red','green','blue','yellow'],
                 marker = 'o',s=60,label='AFTER SCALING', ax = ax,figsize=(6,4))
plt.axhline(0, color='red',alpha=0.2)
plt.axvline(0, color='red',alpha=0.2);
خروجی Quantile Transformer Scaler
خروجی Quantile Transformer Scaler

Power Transformer Scaler

این روش برای مدل‌سازی موضوعاتی است که تغییرات متغیر در سراسر دامنه یکسان نیست (ناهمسانی) یا موقعیت‌هایی که نرمال بودن مطلوب ماست اما داده‌ها نرمال نیستند.

from sklearn.preprocessing import PowerTransformer
scaler = PowerTransformer(method='yeo-johnson')
df5 = pd.DataFrame(scaler.fit_transform(df),
                   columns=['WEIGHT','PRICE'],
                   index = ['Orange','Apple','Banana','Grape'])
ax = df.plot.scatter(x='WEIGHT', y='PRICE',color=['red','green','blue','yellow'], 
                     marker = '*',s=80, label='BREFORE SCALING');
df5.plot.scatter(x='WEIGHT', y='PRICE', color=['red','green','blue','yellow'],
                 marker = 'o',s=60,label='AFTER SCALING', ax = ax)
plt.axhline(0, color='red',alpha=0.2)
plt.axvline(0, color='red',alpha=0.2);
خروجی Power Transformer Scaler
خروجی Power Transformer Scaler
مقیاس‌گذاریِ ویژگی، یک گام اساسی در پیش‌پردازش یادگیری ماشین است. یادگیری عمیق برای همگرایی سریع‌تر به مقیاس‌گذاریِ ویژگی نیاز دارد، بنابراین تصمیم‌گیری برای استفاده از کدام نوع مقیاس‌گذاریِ ویژگی بسیار مهم است.

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.