Scikit Learn از کتابخانههای متنباز، مفید، پرکاربرد و قدرتمند در زبان برنامهنویسی پایتون است که برای اهداف یادگیری ماشین به کار میرود. این کتابخانه ابزارهای کاربردی زیادی به منظور یادگیری ماشین و مدلسازی آماری دادهها همچون طبقهبندی (classification)، رگرسیون، خوشهبندی و کاهش ابعاد فراهم میکند. این کتابخانه که به طور عمده توسط زبان پایتون ارائه شده، بر پایهی کتابخانههای Numpy ،Scipy و Matplotlib طراحی شده است.
در این مقاله به آموزش کتابخانهی Scikit-Learn میپردازیم. آموزش Scikit-Learn میتواند برای علاقهمندان به یادگیری علم داده بسیار مفید باشد. همچنین نحوهی پیادهسازی SVM در Scikit-Learn را میبینیم. برای یادگیری آموزش Scikit-Learn، شما نیاز دارید تا با برنامهنویسی Python و کتابخانههای پرکاربرد علم داده بر مبنای این زبان همچون Numpy، Pandas، Scipy و Matplotlib آشنایی داشته باشید که هر کدام از این کتابخانهها پیش از این در مجموعه مقالات آموزشی علم داده، مورد بررسی قرار گرفتهاند. شما با مطالعهی این مقاله اطلاعات لازم را برای آشنایی و پیادهسازی الگوریتمهای یادگیری ماشین مورد نیاز خود به دست میآورید؛ با ما همراه باشید.
نصب Scikit-Learn
به منظور پیادهسازی الگوریتمها و کدها در Scikit-Learn نیاز است تا موارد زیر را بر روی کامپیوتر خود نصب داشته باشید:
Python (>=3.5)
NumPy (>= 1.11.0)
Scipy (>= 0.17.0)
Joblib (>= 0.11)
Matplotlib : به منظور افزودن قابلیت رسم نمودار و اشکال.
Pandas (>= 0.18.0) : جهت استفاده در مثالها و کدهایی که از ساختار دادهی پانداس بهره میبرند.
اگر Numpy و Scipy را نصب کردهاید، دو روش زیر آسانترین راه برای نصب Scikit-Learn هستند:
استفاده از دستور Pip:
در محیط خط فرمان Command به شکل زیر، Scikit را نصب کنید:
pip install -U scikit-learn
استفاده از Conda:
به کمک دستور زیر میتوان Scikit-Learn را در Conda نصب کرد:
conda install scikit-learn
البته شما میتوانید توزیعهای پایتونی مثل آناکوندا را نصب کنید و از آنجایی که پکیجهایی همچون Numpy، Scipy و Scikit-Learn در این توزیع موجود هستند، کدهای خود را اجرا نمایید.
ویژگیهای Scikit-Learn
علاوه بر کاربرد این کتابخانه در مواردی مانند بارگذاری، تغییر و دستکاری دادهها، Scikit-Learn در مدلسازی داده، تمرکز ویژهای دارد. برخی از مدلسازیهای مشهور در این کتابخانه عبارتند از:
الگوریتمهای یادگیری نظارت شده (Superuised Learning)
تقریبا تمامی الگویتمهای یادگیری نظارت شده معروف رگرسیون خطی، ماشین بردار پشتیبان (SUM)، درخت تصمیمگیری و... در این کتابخانه موجود هستند.
به منظور کنترل دقت مدل نظارتی بر روی دادههای تست، مورد استفاده قرار میگیرد.
کاهش ابعاد و دادهها
به منظور کاهش ویژگیهای دادهها جهت خلاصهسازی، مصورسازی و نیز انتخاب ویژگی مورد استفاده قرار میگیرد.
کاهش ابعاد دادهها
به منظور کاهش ویژگیهای دادهها جهت خلاصهسازی، مصورسازی و نیز انتخاب ویژگی مورد استفاده قرار میگیرد.
روشهای گروهبندی Ensemble Methods
همانطور که از نامش پیداست، این روش برای ترکیب مدلهای یادگیری نظارت شده، به منظور پیشبینی برچسب دادههای تست به کار میرود.
استخراج ویژگی Feature extraction
به منظور تعریف ویژگیهای جدید از روی ویژگیهای اصلی جهت استخراج دادههای مفید به کار میرود.
انتخاب ویژگی یا Feature selection
روشی جهت انتخاب ویژگی برای ایجاد مدلهایی با دقت بالاتر یا افزونگی کمتر است.
فرایند مدلسازی در Scikit-Learn
در این قسمت به شرح فرایند مدلسازی در Scikit-Learn میپردازیم. مدلسازی در Scikit-Learn شامل مراحل بارگذاری داده، تقسیم داده، آموزش داده و تست آن است. در ادامه با جزییات بیشتری به شرح هر کدام از این مراحل میپردازیم.
بارگذاری داده Dataset Loading
ویژگی متغیرهای مربوط به دادهها، feature یا ویژگی نامیده میشوند. گاه به ویژگی، پیشبینیکننده (predictor)، ورودی (input) یا صفت (attribute) نیز میگویند.
ماتریس ویژگی: مجموعهای از ویژگیها تحت شرایطی است که بیش از یک ویژگی دارد.
نام ویژگی: لیستی از نام ویژگیهاست.
پاسخ یا ویژگی برچسب: متغیر خروجی که به متغیرهای ویژگی وابسته است. که به آن هدف (target)، برچسب (label) یا خروجی (output) میگویند.
بردار پاسخ (Response Vector): بیانگر ستون پاسخ است. به طور کلی ما یک ستون پاسخ داریم.
نامهای هدف: Target Name
بیانگر مقادیری است که ستون پاسخ میتواند داشته باشد.
Scikit-Learn مجموعه دادههای نمونهی محدودی همچون Iris و digit برای طبقهبندی (Classification) و قیمت خانه در Boston برای رگرسیون دارد.
در زیر مثالی برای بارگذاری مجموعه دادهی iris داریم:
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names
target_names = iris.target_names
print("Feature names:", feature_names)
print("Target names:", target_names)
print("\nFirst 10 rows of X:\n", X[:10])
برای کنترل دقت مدل استخراجشده، میتوان مجموعه داده را به دو قسمت تقسیم کرد: مجموعهی آموزشی (training set) و مجموعهی آزمایشی یا تست (testing set).
از دادهی آموزشی برای آموزش روش یادگیری ماشین و استخراج مدل آموزشی استفاده میشود. مدل استخراجی حاصل روی مجموعهی تست اعمال میشود تا دقت مدل بررسی شود.
در کد زیر داده را به نسبت 70 به 30 تقسیم کردهایم. یعنی 70 درصد دادهها، دادهی آموزشی در نظر گرفته شدهاند و 30 درصد به دادههای تست اختصاص یافتهاند.
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size = 0.3, random_state = 1
)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
که خروجی به شکل زیر است:
(105, 4) (45, 4) (105,) (45,)
همان طور که در کد بالا میبینید تابع ()train_test_split برای تقسیم مجموعه داده به کار گرفته میشود. آرگومانهای این تابع به شرح زیر هستند:
X ماتریس ویژگی و Y بردار پاسخ است.
Test_size بیانگر نسبت دادههای تست به کل مجموعه داده است. در مثال بالا، 0.3 از 150 سطر موجود برای X را به عنوان دادهی تست در نظر گرفتیم. پس 45 سطر X متعلق به دادهی تست و بقیه متعلق به دادههای آموزشی است.
Random_state: اگر مقدار این پارامتر را برابر هر عددی صحیحی در نظر بگیریم (فرقی نمیکند 1، 4، 42....) در آن صورت در هر مرحلهای که الگوریتم برای تولید مدل تکرار میشود، دادهها به نسبت مساوی با مرحلهی قبل به دادههای آموزشی و تست تقسیم میشوند. به طور مثال در هرمرحله به طور تصادفی 0.7 دادهها به دادهی آموزشی و 0.3 آن به دادهی تست اختصاص مییابد.
آموزش مدل
بعد از تقسیم دادهها، میتوانیم دادهها را برای یادگیری مدلهای پیشبینی به کار بگیریم.
همان طور که گفته شد، Scikit-Learn الگوریتمهای یادگیری ماشین گستردهای دارد که رابط یا اینترفیس ثابتی برای مدل کردن، پیشبینی دقت و فراخوانی برای تمام الگوریتمها ارائه میدهد.
مثال زیر نحوهی آموزش طبقهبندی KNN (نزدیکترین همسایه k) را توسط Scikit نمایش میدهد. (جزییات الگوریتم KNN در بخشهای بعدی شرح داده شده است)
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size = 0.4, random_state=1
)
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
classifier_knn = KNeighborsClassifier(n_neighbors = 3)
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
# Finding accuracy by comparing actual response values(y_test)with predicted response value(y_pred)
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
# Providing sample data and the model will make prediction out of that data
sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)
وقتی با اعمال الگوریتمی بر روی مجموعه دادههای آموزشی مدلی را استخراج میکنیم، انتظار داریم این مدل برای استفادههای آتی نیز پایدار بماند. از این رو مدل را چندین مرتبه بازآموزی (retrain) میکنیم. این کار را میتوان به کمک ویژگیهای dump و load از پکیج joblib انجام داد. مثال زیر را در نظر بگیرید که در آن مدل یادگرفته شده از مثال قبل (classifier_knn) را برای استفادههای آتی ذخیره میکنیم:
from sklearn.externals import joblib
joblib.dump(classifier_knn, 'iris_classifier_knn.joblib')
قطعه کد بالا، مدل را در فایلی تحت عنوان iris_classifier_knn.joblib ذخیره میکند.
حال میتوان آبجکت ایجاد شده را با کمک دستور زیر دوباره بارگذاری کرد.
joblib.load('iris_classifier_knn.joblib')
پیشپردازش داده Preprocessing the Data:
از آنجایی که در فرم خام دادهها با مقادیر زیادی داده سر و کار داریم، باید قبل از بهکارگیری داده به عنوان ورودی الگوریتم یادگیری ماشین، آنها را آمادهسازی کنیم و به دادههایی مناسب و معنیدار تبدیل کنیم. این فرایند، پیشپردازش دادهها نامیده میشود.
Scikit-Learn از پکیج preprocessing برای این منظور استفاده میکند. پکیج sklearn.preprocessing چندین تابع و کلاس تبدیل کنندهی رایج برای تبدیل بردار ویژگی و دادهی خام به دادههای قابل استفاده توسط تخمینگرها را فراهم میکند. به طور کلی، الگوریتمهای یادگیری با استفاده از استانداردسازی دادهها، میتوانند عملکرد بهتری داشته باشند. اگر برخی دادههای پرت در مجموعه داده وجود داشته باشد، مقیاسدهی دادهها (scaling) و استفاده از توابع تبدیل کنندهی قویتر مناسب است.
برای الگوریتمهای تخمینگر تعریف شده در مجموعهی scikit-learn استانداردسازی مجموعه داده، عمل رایج و مورد نیاز محسوب میشود. اگر مقادیر ویژگیهای ورودی الگوریتم تخمینگر شباهت زیادی به توزیع نرمال استاندارد داده (منظور از توزیع نرمال: دادههایی با توزیع گوسی با میانگین صفر و واریانس واحد) نداشته باشد، باعث میشود که تخمینگر رفتار خوب و خروجی مناسبی روی دادهها نداشته باشد.
در عمل، اکثراً شکل و نحوهی توزیع دادهها را در نظر نمیگیریم و ابتدا مقدار میانگین دادهها را از آنها کم میکنیم و سپس حاصل را بر انحراف معیار تقسیم کرده و به این صورت دادهها را، متمرکز یا centralized میکنیم. به عنوان مثال بسیاری از عناصر مورد استفاده در تابع هدف الگوریتم یادگیری ماشین (مانند RBF Kernel در SVM) فرض میکنند که مرکز تمام ویژگیها حول صفر است و دارای پراکندگی و واریانس یکساناند. اگر ویژگی دارای واریانس بزرگتر از سایرین باشد، ممکن است بر عملکرد تابع هدف مسلط شود و سبب شود تا تخمینگر به درستی از مقادیر سایر ویژگیها برای یادگیری خود استفاده نکند.
این پکیج تکنیکهای زیر را شامل میشود:
1. باینری کردن
این تکنیک پیشپردازش زمانی به کار میرود که میخواهیم مقادیر عددی را به مقادیر بولین (منطقی) تبدیل کنیم.
این روش برای حذف میانگین دادهها از بردار ویژگی است که منجر به نرمالسازی ویژگیها با محدودیت صفر میشود.
import numpy as np
from sklearn import preprocessing
Input_data = np.array(
[2.1, -1.9, 5.5],
[-1.5, 2.4, 3.5],
[0.5, -7.9, 5.6],
[5.9, 2.3, -5.8]]
)
#displaying the mean and the standard deviation of the input data
print("Mean =", input_data.mean(axis=0))
print("Stddeviation = ", input_data.std(axis=0))
#Removing the mean and the standard deviation of the input data
data_scaled = preprocessing.scale(input_data)
print("Mean_removed =", data_scaled.mean(axis=0))
print("Stddeviation_removed =", data_scaled.std(axis=0))
ماژول preprocessing کلاسی تحت عنوان stanardscaler دارد که حذف میانگین و تقسیم واریانس را بر روی دادههای آموزشی اجرا میکند و توسط transformer API خود امکان اعمال حذف همین مقدار میانگین و تقسیم همان واریانس محاسبه شدهی حاصل از دادههای آموزشی را بر روی دادههای تست فراهم میکند.
اگر به هر دلیلی بخواهیم در کلاس standardscaler امکان حذف میانگین و یا تقسیم شدن داده به انحراف معیار را حذف کنیم، به ترتیب میتوانیم تنظیمات را به صورت with_mean=False و with_std=False اعمال کنیم.
یک روش استاندارد جایگزین مقیاسدهی به ویژگیها، مقداردهی به آنها در بازهی حداقلی و حداکثری (معمولاً بین 0 و 1) است. روش دیگر، تعیین حداکثر مقدار مطلق یک ویژگی به اندازهی واحد است.
4. نرمالسازی
نرمالسازی بردار ویژگی برای این که ویژگیها در مقیاس یکسانی قرار گیرند به کار میآید. دو روش نرمالسازی داریم:
نرمالسازی L1
این روش که به آن حداقل انحراف مطلق نیز میگویند، مقادیر ویژگیها را به گونهای تغییر میدهد که مجموع مقادیر مطلق در هر سطر حداکثر 1 باقی بماند.
در مثال زیر اجرای نرمالسازی L1 را روی دادههای ورودی میبینیم:
ماشین بردار پشتیبان (Support Vector Machine (SVM از جمله متدهای قدرتمند طبقهبندی نظارت شده است. SVM در ابعاد بالا انعطافپذیر است و در مسائل طبقهبندی به طور گسترده استفاده میشود. SVM از نظر مصرف حافظه کاراست؛ زیرا زیرمجموعهای از نقاط آموزشی را برای توابع تصمیمگیری به کار میگیرد. مهمترین هدف SVM تقسیم مجموعه داده به تعدادی از کلاسها به منظور به دست آوردن ابرصفحه با بیشترین حاشیه (Maximum Marginal Hyperplane: MMH) است که در دو مرحله صورت میگیرد.
ماشین بردار پشتیبان در ابتدا ابرصفحاتی را تولید میکند که نقاط را به شکل صحیح تقسیم میکند.
سپس میان ابرصفحات آن ابرصفحهای را برمیگزیند که نقاط را به بهترین شکل ممکن جدا میکند.
برخی ویژگیهای مهم در خصوص SVM به شرح زیر است:
بردارهای پشتیبان (Support Vector): نقاطی هستند که به ابرصفحه نزدیکترند. بردارهای پشتیبان در شناسایی خطوط جداساز کمک کننده هستند.
ابرصفحه (Hyper Plane): صفحهای که نقاط را به کلاسهای مختلف تقسیم میکند.
حاشیه (Margin): فاصلهی خالی میان نقاط مرزی دو کلاس یا همان بردارهای پشتیبان، را حاشیه یا لبه یا همان Margin گویند.
با توجه به شکل زیر درک بهتری از مفاهیم و تعاریف ارائه شده در بالا را به دست میآورید:
SVM در Scikit-Learn از هر دو نوع ورودی نقاط به صورت متراکم و پراکنده پشتیبانی میکند.
طبقهبندی با SVM
Scikit-learn سه کلاس با نامهای SVC، NuSVC و LinearSVC دارد که میتوانند طبقهبندی چند کلاسه (multivlass_class) را انجام دهند. برای نمونه طبقهبندی از طریق SVC را بررسی میکنیم.
SVC طبقهبندی چند کلاسه را از طریق مقایسه و طبقهبندی به صورت یک به یک (یک برچسب در مقایسه با سایر نمونهها) انجام میدهد.
به مثال زیر توجه کنید:
import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import SVC
SVCClf = SVC(kernel = 'linear',gamma = 'scale', shrinking = False,)
SVCClf.fit(X, y)
همانند سایر طبقهبندیها، SVC با دو آرایه مدل میشود:
یک آرایهی X که نگهدارندهی نمونههای آموزشی است و در اندازهی [n_samples, n_features] است.
یک آرایهی Y که مقادیر هدف یا target را نگهداری میکند. کلاس برچسب برای نمونههای آزمایشی است و در اندازهی [n_samples] است.
توضیح پارامترهای به کار رفته در این کد به شکل زیر است:
svc از کلاس svm است.
Kernel از جنس string است، مقداری اختیاری است و پیش فرض آن ‘rbf’ است. این پارامتر تعیین کنندهی نوع kernel به کار گرفته شده در الگوریتم است. میتواند یکی از مقادیر ‘linear’، ‘poly’، ‘rbf’، ‘sigmoid’ و ‘precomputed’ را بگیرد که مقدار پیشفرض ‘rbf’ است.
Gamma ضریب کرنل برای کرنلهای ‘rbf’، ‘poly’ و ‘sigmoid’ است و مقادیر {‘scale’,’auto’} یا اعشاری میگیرد.
Shrinking مقداری Boolean است که اختیاری است و به طور پیشفرض True است.
در نهایت تخمینگر را بر روی ورودی X و ستون خروجی Yمدل میکنیم (با اعمال تابع fit)، و خروجی به شکل زیر است:
حال میتوانیم به کمک صفت coef_ از این کلاس، وزن اختصاصی هر ویژگی دادههای ورودی را به دست آوریم که این ویژگی مختص کرنل خطی است:
SVCClf.coef_
که خروجی به صورت زیر است:
array([[0.5, 0.5]])
میتوانیم به کمک کد زیر مقدار برچسب برای ورودی دلخواه را به دست آوریم:
SVCClf.predict([[-0.5,-0.8]])
خروجی کد به شکل زیر است:
array([1])
بردارهای پشتیبان را نیز میتوان به شکل زیر به دست آورد:
SVCClf.support_vectors_
خروجی بردارهای پشتیبان به شکل زیر است:
array( [ [-1., -1.], [ 1., 1.] ] )
جمع بندی
در این مقاله به معرفی و آموزش کتابخانهی Scikit-Learn و مفاهیم به کار رفته در آن پرداختیم. برای کار کردن با این کتابخانه لازم است تا با کتابخانههای Numpy، Pandas و matplotlib آشنایی داشته باشید و بتوانید با ساختار دادههای آنها کار کنید. این کتابخانه مدلهای زیادی را با تخمینگرهای خود فیت (fit) میکند و با استفاده از API امکان تست آن را روی دادههای تست فراهم میکند.
امیدوار هستیم که این مقاله برای شما مفید بوده باشد. خوشحال میشویم نظرات و تجربیات خود را با ما به اشتراک بگذارید.
اگر دوست داری به یک متخصص داده کاوی اطلاعات با زبان پایتون تبدیل شوی و با استفاده از آن در بزرگترین شرکتها مشغول به کار شوی، شرکت در دوره جامع آموزش علم داده با پایتون را پیشنهاد میکنیم.
جناب پرفسور تو قسمت کدها به منظور تعیین نمونههای آزمایشی نوشتی نوشتی test_size = 0.3... در ادامه برای توضیحات کد نوشتی text_size! مرقوم بفرمایید text رو به test تغییر دهید.
نازنین کریمی مقدم۲۸ خرداد ۱۴۰۲، ۰۶:۲۴
سلام
ممنون از اطلاع رسانی تون اصلاح شد.
۰۹ مرداد ۱۴۰۱، ۱۲:۳۸
جالب بود متشکرم
۰۱ دی ۱۴۰۰، ۲۱:۵۸
سپاس فراوان اما خوب بود مدلهای دیگر یادگیری ماشین هم بررسی میشد
نازنین کریمی مقدم۰۴ دی ۱۴۰۰، ۰۶:۴۱
درود
بله در دستور کار قرار داره انشالله کار به روزرسانی مطالب قبلی که تموم شد سراغ مقالات این دسته خواهیم اومد. ممنون که با ما همراه هستید.
hassan۲۶ آبان ۱۴۰۰، ۱۳:۳۷
سلام و خسته نباشید.
ایا در کتابخانه sklearn دستوری وجود داره که بعد از فیت کردن داده در رگرسیون خطی ، اگر داده ای نسبت به خط فیت شده از یک مقداری بالاتر یا پایینتر بود رو به عنوان داده بد و پرت با تخصیص یک نمره ای گزاش کنه، یعنی به یک حد بالا و پایین براش در نظر بگیره؟
Nazanin KarimiMoghaddam۲۹ آبان ۱۴۰۰، ۰۷:۱۶
درود
با خوندن <a href="https://scikit-learn.org/stable/modules/outlier_detection.html" rel="nofollow ugc">این بخش</a> جواب سوالتون رو کامل میگیرید. پاینده باشید.