سرفصل‌های آموزشی
آموزش یادگیری نظارت شده با scikit-learn
تکنیک‌های مقیاس‌بندی ویژگی با Sklearn

تکنیک‌های مقیاس‌بندی ویژگی با Sklearn

در مقاله "مقیاس‌بندی ویژگی در پایتون" متوجه شدیم که هدف از مقیاس‌بندی ویژگی‌ها این است که همه ویژگی‌ها به طور یکسان در فرآیند یادگیری ماشین مشارکت کنند، تا ویژگی خاصی تأثیر بیشتری نسبت به بقیه نداشته باشد. همچنین بررسی کردیم که چه زمانی باید مقیاس‌بندی ویژگی‌ها را انجام دهیم، چالش‌های مربوط به آن چیست و چگونه از آن در یادگیری ماشین استفاده کنیم. در این بخش آموزشی، با تکنیک‌های مقیاس‌بندی ویژگی‌ها با استفاده از Scikit-learn آشنا خواهیم شد.

مقایسه عملکرد نرمال‌سازی و استانداردسازی در پایتون

اکنون به بخش سرگرم‌کننده رسیدیم، یعنی عملی کردن به آنچه آموخته‌ایم. بیایید مقیاس‌بندی ویژگی را برای چند الگوریتم یادگیری ماشین در مجموعه داده‌های Big Mart از پلتفرم DataHack، اعمال کنیم. در این‌جا ما از مجموعه داده clean شده استفاده می‌کنیم و از مراحل پیش‌پردازش برای clean کردن صرف نظر می‌کنیم زیرا آنها خارج از محدوده این آموزش هستند. بنابراین، اجازه دهید ابتدا داده‌های خود را به مجموعه‌های آموزشی و آزمایشی تقسیم کنیم. قبل از رفتن به بخش مقیاس‌بندی ویژگی، بیایید با استفاده از متد ()pd.describe به جزئیات داده‌هایمان نگاهی بیندازیم:

جدول داده ها برای مقایسه عملکرد نرمال سازی و استاندارد سازی در پایتون

می‌توانیم ببینیم که تفاوت زیادی در دامنه مقادیر موجود در ویژگی‌های عددی ما وجود دارد: Item_Visibility، Item_Weight، Item_MRP و Outlet_Establishment_Year. بیایید سعی کنیم آن را با استفاده از مقیاس‌بندی ویژگی برطرف کنیم!

1- نرمال سازی با استفاده از  sklearn

برای نرمال‌سازی داده‌های خود، باید MinMaxScalar را از کتابخانه sklearn ایمپورت کرده و آن را به مجموعه داده اعمال کنید. بیایید این کار را انجام دهیم!

# data normalization with sklearn
from sklearn.preprocessing import MinMaxScaler
# fit scaler on training data
norm = MinMaxScaler().fit(X_train)
# transform training data
X_train_norm = norm.transform(X_train)
# transform testing dataabs
X_test_norm = norm.transform(X_test)

بیایید ببینیم نرمال سازی چگونه بر مجموعه داده ما تأثیر گذاشته است:

تاثیر نرمال سازی بر مجموعه داده ها در پایتون

همه ویژگی‌ها اکنون دارای حداقل مقدار ۰ و حداکثر مقدار  ۱ هستند. در مرحله بعد، بیایید سعی کنیم داده‌های خود را استاندارد کنیم.

2- استانداردسازی با استفاده از sklearn

برای استانداردسازی داده‌های خود، باید StandardScalar را از کتابخانه sklearn ایمپورت کرده و آن را به مجموعه داده اعمال کنید. در اینجا نحوه انجام آن آمده است:

# data standardization with  sklearn
from sklearn.preprocessing import StandardScaler
# copy of datasets
X_train_stand = X_train.copy()
X_test_stand = X_test.copy()
# numerical features
num_cols = ['Item_Weight','Item_Visibility','Item_MRP','Outlet_Establishment_Year']
# apply standardization on numerical features
for i in num_cols:
   # fit on training data column
   scale = StandardScaler().fit(X_train_stand[[i]])
   # transform the training data column
   X_train_stand[i] = scale.transform(X_train_stand[[i]])
   # transform the testing data column
   X_test_stand[i] = scale.transform(X_test_stand[[i]])

حتماً متوجه شده‌اید که استانداردسازی فقط برای ستون‌های عددی اعمال می‌شود و نه ویژگی‌های  One-Hot Encoded. استاندارد کردن ویژگی‌های One-Hot Encoded  به معنای اختصاص یک توزیع به ویژگی‌های طبقه‌بندی شده است که این کار را در این جا، انجام نمی‌دهیم.
اما چرا هنگام نرمال‌سازی داده‌ها این کار را نکردم؟ از آنجا که ویژگی‌های One-Hot Encoded در حال حاضر در محدوده بین ۰ تا ۱ قرار دارند، بنابراین، نرمال‌سازی بر مقدار آنها تأثیری نخواهد داشت.
بیایید نگاهی بیندازیم که چگونه استانداردسازی داده‌های ما را تغییر داده است:

تاثیر استانداردسازی بر مجموعه داده ها در پایتون

ویژگی‌های عددی اکنون بر روی میانگین صفر با انحراف معیار واحد متمرکز شده‌اند.

3- مقایسه داده‌های مقیاس نشده، نرمال‌شده و استاندارد شده

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

مقایسه داده های مقیاس نشده
مقایسه داده های نرمال‌سازی شده
مقایسه داده های استاندارسازی شده

می‌توانید متوجه شوید که چگونه مقیاس بندی ویژگی‌ها همه چیز را بهتر مشخص می‌کند. ویژگی‌ها اکنون قابل مقایسه‌تر هستند و تأثیر مشابهی روی مدل‌های یادگیری خواهند داشت.

مقیاس‌بندی ویژگی در Sklearn با StandardScaler، MinMaxScaler، RobustScaler و MaxAbsScaler

در این بخش، نمونه‌هایی از تکنیک‌های مقیاس‌بندی ویژگی با Sklearn از StandardScaler، MinMaxScaler، RobustScaler و MaxAbsScaler را خواهیم دید. برای این منظور روی مجموعه داده مسکن رگرسیون انجام می‌دهیم و ابتدا نتایج را بدون مقیاس‌بندی می‌بینیم و سپس با اعمال مقیاس‌بندی ویژگی‌ها، نتایج را با هم مقایسه می‌کنیم.

1- درباره مجموعه داده

مجموعه داده مورد استفاده در این بخش، مجموعه داده مسکن کالیفرنیا (California housing dataset) است که شامل ویژگی‌های مختلف خانه مانند مکان، سن، تعداد اتاق‌ها، ارزش خانه، و غیره است. هدف در این جا، پیش بینی ارزش خانه با توجه به متغیرهای ویژگی مستقل در مجموعه داده است. این مجموعه داده شامل ۲۰۴۳۳ ردیف و ۹ ستون است.

2- import کردن کتابخانه‌های مورد نیاز

برای شروع، اجازه دهید تمام کتابخانه‌های مورد نیاز برای مثال‌های خود را load کنیم.

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler,MinMaxScaler,MaxAbsScaler,RobustScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import accuracy_score
from sklearn import preprocessing

3- load کردن مجموعه داده

سپس مجموعه داده را در یک دیتافریم بارگذاری می‌کنیم و ویژگی غیر عددی ocean_proximity را حذف می‌کنیم. در زیر، ۱۰ ردیف بالای مجموعه داده را مشاهده می‌کنید.

#reading the dataset
df=pd.read_csv(r"C:\Users\Veer Kumar\Downloads\MLK internship\FeatureScaling\housing.csv")
df.drop(['ocean_proximity'],axis=1,inplace=True)
df.head(10)

4- رگرسیون بدون مقیاس بندی ویژگی

اجازه دهید ابتدا مدل رگرسیون را با KNN بدون اعمال مقیاس‌بندی ویژگی ایجاد کنیم. مشاهده می‌شود که دقت مدل رگرسیون بدون مقیاس‌بندی ویژگی تنها ۲۴ درصد است.

# Train Test Split
X=df.iloc[:,:-1]
y=df.iloc[:,[7]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)

# Creating Regression Model
clf = KNeighborsRegressor()
clf.fit(X_train, y_train)

# Accuracy on Tesing Data
clf.predict(X_test)
score=clf.score(X_test,y_test)
print("Accuracy for our testing dataset without Feature scaling is : {:.3f}%".format(score*100) )

خروجی:

Accuracy for our testing dataset without Feature scaling is : 24.722%

5- استفاده از Sklearn StandardScaler

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

ابتدا مجموعه داده را به آموزشی و آزمایشی تقسیم می‌کنیم. سپس یک آبجکت StandardScaler ایجاد می‌کنیم که با استفاده از آن مجموعه داده آموزشی را fit و transform می‌کنیم و سپس با همان شی، مجموعه داده آزمایشی را نیز transform می‌کنیم.

# Train Test Split
X=df.iloc[:,:-1]
y=df.iloc[:,[7]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)

#Creating StandardScaler Object
scaler = preprocessing.StandardScaler()

X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

#Seeing the scaled values of X_train
X_train.head()


اکنون که استاندارد سازی اعمال شد، بیایید مدل رگرسیون را آموزش دهیم و دقت آن را بررسی کنیم. می‌توان مشاهده کرد که دقت مدل اکنون به ۹۸.۴۱۹% می‌رسد که بسیار قابل توجه است.

# Creating Regression Model
model=KNeighborsRegressor()
model.fit(X_train,y_train)
# Accuracy on Tesing Data
y_test_hat=model.predict(X_test)
score=model.score(X_test,y_test)
print("Accuracy for our testing dataset using Standard Scaler is : {:.3f}%".format(score*100) )

خروجی:

Accuracy for our testing dataset using Standard Scaler is : 98.419%

6- استفاده از  Sklearn MinMaxScaler

درست مانند قبل، یک شی MinMaxScaler ایجاد می‌کنیم و با استفاده از آن مجموعه داده آموزشی را fit و transform می‌کنیم و سپس با همان شی، مجموعه داده آزمایشی را transform می‌کنیم.

# Train Test Split
X=df.iloc[:,:-1]
y=df.iloc[:,[7]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)
#Creating MinMax Object
mm = preprocessing.MinMaxScaler()
X_train = mm.fit_transform(X_train)
X_test = mm.transform(X_test)
#Seeing the scaled values of X_train
X_train.head()

اکنون از این داده‌های مقیاس شده برای ایجاد مدل رگرسیون استفاده می‌کنیم و مجدداً مشاهده می‌کنیم که به دقت بسیار خوب ۹۸.۵۵٪ می‌رسیم.

# Creating Regression Model
model=KNeighborsRegressor() 
model.fit(X_train,y_train)
# Accuracy on Tesing Data
y_test_hat=model.predict(X_test) 
score=model.score(X_test,y_test)
print("Accuracy for our testing dataset using MinMax Scaler is : {:.3f}%".format(score*100) )

خروجی:

Accuracy for our testing dataset using MinMax Scaler is : 98.559%

7- استفاده از MaxAbsScaler در Sklearn

یک شی MaxAbsScaler ایجاد می‌کنیم و سپس روش fit_transform را روی مجموعه داده آموزشی اعمال می‌کنیم و سپس مجموعه داده آزمایشی را با همان شی transform می‌کنیم.

# Train Test Split
X=df.iloc[:,:-1]
y=df.iloc[:,[7]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)
#Creating MaxAbsScaler Object
mab=MaxAbsScaler()
X_train = mab.fit_transform(X_train)
X_test = mab.transform(X_test)

در مرحله بعد، مدل رگرسیون KNN را با استفاده از داده‌های مقیاس شده ایجاد می کنیم و مشاهده می‌کنیم که دقت آزمون به ۹۹.۳۸٪ می‌رسد.

# Creating Regression Model
model=KNeighborsRegressor() 
model.fit(X_train,y_train)
# Accuracy on Tesing Data
y_test_hat=model.predict(X_test) 
score=model.score(X_test,y_test)
print("Accuracy for our testing dataset using MinMax Scaler is : {:.3f}%".format(score*100) )

خروجی:

Accuracy for our testing dataset using MaxAbs Scaler is : 99.382%

8- استفاده از RobustScaler در Sklearn 

یک شی RobustScaler ایجاد می‌کنیم و سپس متد fit_transform را روی مجموعه داده آموزشی اعمال می‌کنیم و سپس مجموعه داده آزمایشی را با همان شی transform می‌کنیم.

# Train Test Split
X=df.iloc[:,:-1]
y=df.iloc[:,[7]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)
#Creating RobustScaler Object
rob =RobustScaler()
X_train = rob.fit_transform(X_train)
X_test = rob.transform(X_test)

در نهایت، مدل رگرسیون را ایجاد می‌کنیم و به دقت ۹۸.۲۹۵٪ دست می‌یابیم.

# Creating Regression Model
model=KNeighborsRegressor() 
model.fit(X_train,y_train)
# Accuracy on Tesing Data
y_test_hat=model.predict(X_test) 
score=model.score(X_test,y_test)
print("Accuracy for our testing dataset using MinMax Scaler is : {:.3f}%".format(score*100) )

خروجی:

Accuracy for our testing dataset using Robust Scaler is : 98.295%

خلاصه

از مشاهدات زیر، کاملاً مشهود است که مقیاس بندی ویژگی یک مرحله بسیار مهم در پیش پردازش داده‌ها قبل از ایجاد مدل ML است. همانطور که در این بخش دیدیم، بدون مقیاس‌بندی ویژگی، دقت بسیار ضعیف بود ولی پس از اعمال تکنیک‌های مختلف مقیاس‌بندی ویژگی، دقت آزمون به بالای ۹۸ درصد رسید.