یادگیری نظارت شده (Supervised Learning) با پایتون – راهنمای جامع
آینده سیاره زمین «هوش مصنوعی» (Artificial Intelligence)/«یادگیری ماشین» (Machine Learning) است. هرکسی که این موضوع را درک نکند خیلی زود از قافله عقب خواهد ماند. بیدار شدن در دنیای سرشار از نوآوری روز به روز بیشتر شبیه به جادو میشود. پیادهسازیها و روشهای گوناگونی برای هوش مصنوعی و یادگیری ماشین به منظور حل مسائل جهان واقعی وجود دارد و «یادگیری نظارت شده» (Supervised Learning) یکی از پرکاربردترین رویکردها است. «جف هاوکینز» (Jeff Hawkins) موسس کمپانی «Palm Computing» در این رابطه میگوید: «کلید ورود به هوش مصنوعی همواره ارائه کردن بوده است».
یادگیری نظارت شده چیست؟
در یادگیری نظارت شده» کار با ایمپورت کردن مجموعه دادههای شامل ویژگیهای آموزش (خصیصههای آموزش | training attributes) و ویژگیهای هدف (خصیصههای هدف | target attributes) آغاز میشود. الگوریتم یادگیری نظارت شده رابطه بین مثالهای آموزش و متغیرهای هدف مختص آنها را به دست میآورد و آن رابطه یاد گرفته شده را برای دستهبندی ورودیهای کاملا جدید مورد استفاده قرار میدهد (بدون هدفها).
برای نمایش اینکه یادگیری نظارت شده چگونه کار میکند، یک مثال از پیشبینی نمرات دانشآموزان برپایه ساعات مطالعه آنها ارائه میشود. از منظر ریاضی:
Y = f(X)+ C
که در آن:
- F رابطه بین نمرات و تعداد ساعاتی است که دانشآموزان به منظور آماده شدن برای امتحانات به مطالعه میپردازند.
- X ورودی است (تعداد ساعاتی که دانشآموز خود را آماده میکند).
- Y خروجی است (نمراتی که دانشآموزان در آزمون کسب کردهاند).
- C یک خطای تصادفی است.
هدف نهایی یادگیری نظارت شده پیشبینی Y با حداکثر دقت برای ورودی جدید داده شده X است. چندین راه برای پیادهسازی یادگیری نظارت شده وجود دارد. برخی از متداولترین رویکردها در ادامه مورد بررسی قرار میگیرند. برپایه مجموعه داده موجود، مساله یادگیری ماشین در دو نوع «دستهبندی» (Classification) و «رگرسیون» (Regression) قرار میگیرد. اگر دادههای موجود دارای مقادیر ورودی (آموزش) و خروجی (هدف) باشند، مساله از نوع دستهبندی است. اگر مجموعه داده دارای «مقادیر عددی پیوسته» (continuous numerical values) بدون هرگونه برچسب هدفی باشد، مساله از نوع رگرسیون محسوب میشود.
Classification: Has the output label. Is it a Cat or Dog? Regression: How much will the house sell for?
دستهبندی
مثالی مفروض است که در آن یک پژوهشگر حوزه پزشکی میخواهد دادههای سرطان سینه را بهمنظور پیشبینی اینکه بیمار کدام یک از سه نوع درمان را باید دریافت کند، مورد تحلیل قرار دهد. این وظیفه تحلیل داده «دستهبندی» (Classification) نامیده و در آن یک مدل یا «دستهبند» (Classifier) به منظور پیشبینی برچسبهای دسته (کلاس) مانند «درمان A» (همان treatment A)، «درمان B» (همان treatment B) یا «درمان C» (همان treatment C) ساخته میشود.
دستهبندی یک مساله پیشبینی است که برچسبهای کلاس دستهای را که گسسته یا بدون ترتیب هستند پیشبینی میکند. این یک فرآیند دو مرحلهای است که شامل مرحله یادگیری و دستهبندی میشود.
روشهای دستهبندی و انتخاب بهترین آنها
برخی از الگوریتمهای متداول دادهکاوی در ادامه بیان شدهاند.
- K-نزدیکترین همسایگی
- «درخت تصمیم» (Decision Trees)
- «نایو بیز» (Naïve Bayes)
- «ماشین بردار پشتیبان» (Support Vector Machines)
در مرحله یادگیری، مدل دستهبندی، دستهبند را با تحلیل مجموعه داده آموزش میسازد. در مرحله دستهبندی، برچسبهای کلاس برای دادههای موجود پیشبینی میشوند. تاپلهای مجموعه داده و برچسبهای کلاس مربوط در حال تحلیل به دو دسته «مجموعه آموزش» (training set) و «مجموعه تست» (test set) تقسیم میشوند. «تاپلهای» (tuples) مجزایی که مجموعه داده تست را میسازند از مجموعه داده تحت تحلیل به طور تصادفی نمونهبرداری میشوند. تاپلهای باقیمانده مجموعه داده تست را شکل میدهند و از تاپلهای آموزش مستقل هستند، بدین معنا که برای ساخت دستهبند مورد استفاده قرار نمیگیرند.
مجموعه داده تست به منظور تخمین پیشبینی دستهبند استفاده میشود. دقت دستهبند درصدی از تاپلهای تست است که توسط دستهبند به درستی دستهبندی شدهاند. به منظور کسب دقت بیشتر، بهترین راه تست الگوریتمهای گوناگون و آزمودن پارامترهای مختلف در هر الگوریتم است. بهترین حالت با «اعتبارسنجی متقابل» (cross-validation) قابل انتخاب است. برای انتخاب یک الگوریتم خوب برای مساله، پارامترهایی مانند دقت، زمان آموزش، «خطی بودن» (linearity)، تعداد پارامترها و شرایط خاص باید برای الگوریتمهای متفاوت در نظر گرفته شود.
پیادهسازی KNN در Scikit-Learn روی مجموعه داده Iris جهت دستهبندی نوع گلها برپایه ورودیهای داده شده
اولین گام برای اعمال الگوریتم یادگیری ماشین مورد نیاز، درک و اکتشاف مجموعه داده است. در این مثال، از مجموعه داده Iris استفاده شده که از بسته scikit-learn ایمپورت شده. اکنون کد لازم برای این کار را نوشته و مجموعه داده گلهای زنبق (scikit-learn) مورد بررسی قرار میگیرد.
ابتدا باید از نصب بودن پایتون روی سیستم کاربر اطمینان حاصل کرد. همچنین، بستههای زیر نیز باید با استفاده از PIP نصب شوند.
pip install pandas pip install matplotlib pip install scikit-learn
در قطعه کد پایین، مدل با بهرهگیری از چند متد در کتابخانه Pandas، پیرامون ویژگیهای مجموعه داده Iris میآموزد.
from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt
# Loading IRIS dataset from scikit-learn object into iris variable.
iris = datasets.load_iris()
# Prints the type/type object of iris
print(type(iris))
# <class 'sklearn.datasets.base.Bunch'>
# prints the dictionary keys of iris data
print(iris.keys())
# prints the type/type object of given attributes
print(type(iris.data), type(iris.target))
# prints the no of rows and columns in the dataset
print(iris.data.shape)
# prints the target set of the data
print(iris.target_names)
# Load iris training dataset
X = iris.data
# Load iris target set
Y = iris.target
# Convert datasets' type into dataframe
df = pd.DataFrame(X, columns=iris.feature_names)
# Print the first five tuples of dataframe.
print(df.head())
خروجی
<class ‘sklearn.datasets.base.Bunch’> dict_keys([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’])] <class ‘numpy.ndarray’> <class ‘numpy.ndarray’> (150, 4) [‘setosa’ ‘versicolor’ ‘virginica’] sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) 0 5.1 3.5 1.4 0.2 1 4.9 3.0 1.4 0.2 2 4.7 3.2 1.3 0.2 3 4.6 3.1 1.5 0.2 4 5.0 3.6 1.4 0.2
K-نزدیکترین همسایگی در scikit-learn
به یک الگوریتم «یادگیرنده تنبل» (Lazy Learner) گفته میشود اگر تاپلهای مجموعه داده آموزش را ذخیره کرده و تا هنگامی که تاپل آزمون (test) داده می شود صبر کند. این نوع یادگیرنده، تنها هنگامی که تاپل تست را میبیند عمومیسازی را به منظور دستهبندی تاپلها برپایه مشابهت آنها با تاپلهای آموزش ذخیره شده انجام میدهد.
دستهبند K-نزدیکترین همسایگی یک یادگیرنده تنبل است. این الگوریتم (KNN) برپایه یادگیری با مقایسه، که در واقع مقایسه یک تاپل تست داده شده با تاپلهای آموزش مشابه آن محسوب میشود بنا نهاده شده است. تاپلهای آموزش با n مشخصه تشریح شدهاند. هر تاپل یک نقطه را در فضای n-بعدی نشان میدهد. بدین شکل، همه تاپلهای آموزش در فضای الگوری n-بُعدی ذخیره میشوند. هنگامی که یک تاپل ناشناخته داده میشود، دستهبند k-نزدیکترین همسایگی فضای الگو را برای k تاپلهای آموزش که نزدیکترین همسایههای «تاپل ناشناخته هستند» جستوجو میکند. «نزدیکی» (Closeness) با توجه به سنجه فاصله مانند فاصله اقلیدسی تعریف میشود. یک مقدار خوب برای K به طور تجربی تعیین میشود. در این قطعه کد، دستهبند KNN از sklearn ایمپورت و بر دادههای ورودی اعمال میشود و سپس میتواند گلها را دستهبندی کند.
1from sklearn import datasets
2from sklearn.neighbors import KNeighborsClassifier
3
4# Load iris dataset from sklearn
5iris = datasets.load_iris()
6
7# Declare an of the KNN classifier class with the value with neighbors.
8knn = KNeighborsClassifier(n_neighbors=6)
9
10# Fit the model with training data and target values
11knn.fit(iris['data'], iris['target'])
12
13# Provide data whose class labels are to be predicted
14X = [
15 [5.9, 1.0, 5.1, 1.8],
16 [3.4, 2.0, 1.1, 4.8],
17]
18
19# Prints the data provided
20print(X)
21
22# Store predicted class labels of X
23prediction = knn.predict(X)
24
25# Prints the predicted class labels of X
26print(prediction)
خروجی
[1 1]
در اینجا
- ۰ مطابق با Versicolor است.
- ۱ مطابق با Virginica است.
- ۲ مطابق با Setosa است.
برپایه ورودی داده شده، ماشین پیشبینی کرده که هر دو گل از گونه Versicolor هستند.
رگرسیون
رگرسیون معمولا به منظور تعیین روابط بین دو یا تعداد بیشتری متغیر مورد استفاده قرار میگیرد. برای مثال، حالتی را میتوان در نظر گرفت که نیاز به پیشبینی درآمد یک نفر بر پایه دادههای درآمد X است. در اینجا، متغیر هدف به معنای متغیر ناشناختهای است که کاربر به پیشبینی آن اهمیت میدهد و پیوسته به معنای آن است که شکافی (ناپیوستگی) در مقداری که Y میتواند داشته باشد وجود ندارد.
پیشبینی درآمد یک مساله کلاسیک رگرسیون است. داده ورودی باید همه اطلاعاتی (که با عنوان ویژگی شناخته شدهاند) را درباره یک فرد که میتواند منجر به پیشبینی درآمد شود، مانند ساعات کار، تجربه آموزش، عنوان شغلی و محلی که زندگی میکند داشته باشد.
مدل رگرسیون
برخی از مدلهای رگرسیون متداول عبارتند از:
- «رگرسیون خطی» (Linear Regression)
- «رگرسیون لجستیک» (Logistic Regression)
- «رگرسیون چند جملهای» (Polynomial Regression)
رگرسیون خطی، رابطهای بین متغیر وابسته (Y) و یک یا تعداد بیشتری متغیر مستقل (X) با استفاده از بهترین خط راستی که برازش دارد برقرار میکند (به این نوع رگرسیون، رگرسیون خطی نیز گفته میشود).
به بیان ریاضی:
h(xi) = βo + β1 * xi + e
در حالیکه βo عرض از مبدا است، β1 شیب خط و e میزان خطا محسوب میشود.
الگوریتم رگرسیون لجستیک هنگامی مورد استفاده قرار میگیرد که متغیر پاسخ دستهای باشد. ایده رگرسیون لجستیک پیدا کردن رابطه بین ویژگی و احتمال یک خروجی خاص است.
به بیان ریاضی:
p(X) = βo + β1 * X
که در آن
p(x) = p(y = 1 | x)
رگرسیون لجستیک شکلی از تحلیلهای رگرسیون است که در آن ارتباطی بین متغیرهای مستقل x و متغیر وابسته y به عنوان یک چندجملهای درجه n در x مدل میشود.
حل مساله رگرسیون خطی
مجموعه داده X و مقدار هدف Y موجود است. از «کمترین مربعات» (Least Squares) برای یادگیری مدل خطی استفاده میشود که میتوان از آن برای پیشبینی یک y جدید که به x دیده نشده پیشین داده شده با کمترین میزان خطای ممکن بهره برد. دادههای موجود به دو بخش مجموعه داده آموزش و آزمون (تست) تقسیم میشوند.
مجموعه داده آموزش دارای برچسبهایی است (ویژگیها بارگذاری شدهاند)، بنابراین الگوریتم میتواند از این مثالهای برچسبگذاری شده بیاموزد. مجموعه داده تست هیچ برچسبی ندارد، در واقع کاربر نمیداند مقداری که سعی در پیشبینی آن دارد چیست. در اینجا یک ویژگی برای آموزش در نظر گرفته شده و روش رگرسیون خطی برای برازش دادههای آموزش اعمال و سپس خروجی با استفاده از مجموعه داده تست پیشبینی میشود.
پیادهسازی رگرسیون خطی در scikit-learn
from sklearn import datasets, linear_model
import matplotlib.pyplot as plt
import numpy as np
# Load the diabetes dataset
diabetes = datasets.load_diabetes()
# Use only one feature for training
diabetes_X = diabetes.data[:, np.newaxis, 2]
# Split the data into training/testing sets
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
# Split the targets into training/testing sets
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
# Create linear regression object
regr = linear_model.LinearRegression()
# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)
# Input data
print('Input Values')
print(diabetes_X_test)
# Make predictions using the testing set
diabetes_y_pred = regr.predict(diabetes_X_test)
# Predicted Data
print("Predicted Output Values")
print(diabetes_y_pred)
# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test, color='black')
plt.plot(diabetes_X_test, diabetes_y_pred, color='red', linewidth=1)
plt.show()
خروجی
Input Values [ [ 0.07786339] [-0.03961813] [ 0.01103904] [-0.04069594] [-0.03422907] [ 0.00564998] [ 0.08864151] [-0.03315126] [-0.05686312] [-0.03099563] [ 0.05522933] [-0.06009656] [ 0.00133873] [-0.02345095] [-0.07410811] [ 0.01966154][-0.01590626] [-0.01590626] [ 0.03906215] [-0.0730303 ] ] Predicted Output Values [ 225.9732401 115.74763374 163.27610621 114.73638965 120.80385422 158.21988574 236.08568105 121.81509832 99.56772822 123.83758651 204.73711411 96.53399594 154.17490936 130.91629517 83.3878227 171.36605897 137.99500384 137.99500384 189.56845268 84.3990668 ]
نمودار بین پیشبینیهای (diabetes_X_test, diabetes_y_pred) در معادله خطی پیوسته خواهد بود.
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- مجموعه آموزشهای هوش محاسباتی
- مجموعه آموزشهای شبکههای عصبی مصنوعی
- گنجینه آموزشهای برنامه نویسی پایتون (Python)
- آموزش برنامهنویسی R و نرمافزار R Studio
- مجموعه آموزشهای برنامه نویسی متلب (MATLAB)
- علم داده، تحلیل داده، دادهکاوی و یادگیری ماشین ــ تفاوتها و شباهتها
^^