مشخصات مقاله
-
646
-
0.0
-
4378
-
0
-
1
الگوریتم های طبقه بندی
الگوریتم های طبقه بندی (Classification) در یادگیری ماشین
مقدمه بر طبقه بندی
کلاس بندی می تواند به عنوان روند پیش بینی کلاس یا طبقه(category )، از مقادیر مشاهده شده یا نقاط داده ارائه شده، تعریف شود. خروجی طبقه بندی شده می تواند قالبی مانند "سیاه" یا "سفید" یا "spam " یا "no spam" داشته باشد.
از نظر ریاضی، طبقه بندی وظیفه تقریب یک تابع نگاشت(f) از متغیر های ورودی(X) به متغیر های خروجی(Y) است. اساسا طبقه بندی به یادگیری ماشین تحت نظارت تعلق دارد که در آن، اهداف به همراه مجموعه داده ورودی ، ارائه می شوند.
مثالی از یک مساله طبقه بندی، می تواند تشخیص spam در ایمیل ها باشد. در این حالت تنها دو دسته خروجی وجود دارد، "spam" و "no spam" . در نتیجه این یک طبقه بندی از نوع دودویی است.
برای پیاده سازی این طبقه بندی، در ابتدا باید طبقه بندی کننده(classifier) را آموزش دهیم. در مثال مطرح شده، می توان از ایمیل های spam و no spam ، به عنوان داده آموزشی استفاده کرد. پس از آموزش موفقیت آمیز طبقه بندی کننده، می توان از آن برای تشخیص ایمیل های ناشناخته استفاده کرد.
انواع یادگیرنده ها(learners) در طبقه بندی
دو نوع یادگیرنده در رابطه با مسائل طبقه بندی وجود دارد.
یادگیرنده های تنبل (Lazy Learner) در طبقه بندی داده
همان طور که از نام آن بر می آید، این دسته از یادگیرنده ها، منتظر نمایش داده تست، پس از ذخیره داده آموزشی، می شوند. طبقه بندی تنها پس از دریافت داده تست انجام می شود. آنها زمان کمتری را روی یادگیری اما زمان بیشتری را روی پیش بینی صرف می کنند. K-nearest neighbor و استدلال مبتنی بر مورد (case-based reasoning) نمونه هایی از یادگیرنده های تنبل هستند.
یادگیرنده های کوشا (Eager Learner) در طبقه بندی داده
بر خلاف یادگیرنده های تنبل، یادگیرنده های کوشا بدون منتظر ماندن برای نمایش داده تست، پس از ذخیره داده آموزشی، مدل طبقه بندی را می سازند. آنها زمان بیشتری را روی یادگیری و زمان کمتری را روی پیش بینی صرف می کنند. درخت تصمیم گیری(Decision Trees) ، Naïve Bayes و شبکه های عصبی مصنوعی (Artificial Neural Networks – ANN ) نمونه هایی از یادگیرنده های کوشا هستند.
ساخت یک طبقه بندی کننده در پایتون
از کتابخانه پایتون Scikit-lear که برای یادگیری ماشین است می توان برای ساخت یک طبقه بندی کننده در پایتون استفاده کرد. مراحل ساخت یک طبقه بندی کننده در پایتون به صورت زیر است.
مرحله 1 :
برای ساخت یک طبقه بندی کننده با استفاده از scikit-learn ، باید آن را وارد کنیم(import). با استفاده از اسکریپت زیر می توان آن را وارد کرد.
حال می توانیم برای مقیاس بندی داده در بازه بین صفر و یک از کلاس MinMaxScaler استفاده کنیم.
import sklearn
مرحله 2 :
وارد کردن مجموعه داده:
پس از وارد کردن بسته های(package) ضروری، برای ساخت مدل پیش بینی طبقه بندی نیاز به یک مجموعه داده داریم. می توانیم آن را از مجموعه داده sklearn وارد کنیم یا بر اساس نیاز خود از مجموعه داده دیگری استفاده کنیم. ما از مجموعه داده Breast Cancer Wisconsin Diagnostic ، از sklearn ، استفاده خواهیم کرد. با کمک اسکریپت زیر می توانیم آن را وارد کنیم.
from sklearn.datasets import load_breast_cancer
اسکریپت زیر مجموعه داده را بار گیری می کند.
data = load_breast_cancer()
همچنین باید داده را سازمان دهی کنیم که این امر با استفاده از اسکریپت زیر انجام می شود.
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']
دستور زیر نام برچسب های(labels) "بدخیم" (malignant) و "خوش خیم" (benign) را در مورد بانک اطلاعاتی(database) ما چاپ می کند.
print(label_names)
خروجی دستور بالا نام برچسب ها است.
['malignant' 'benign']
این برچسب ها به مقادیر دودویی 0 و 1 نگاشت می شوند. سرطان بدخیم (Malignant cancer) با 0 و سرطان خوش خیم (Benign cancer) با 1 نمایش داده می شوند. با کمک دستورات زیر می توان نام و مقادیر ویژگی های این برچسب ها را دید.
print(feature_names[0])
خروجی دستور بالا نام ویژگی های مربوط به برچسب 0 است مانند سرطان بدخیم.
mean radius
به همین طریق، می توان نام ویژگی های مربوط به برچسب 1 را به صورت زیر تولید کرد.
print(feature_names[1])
خروجی دستور بالا، نام ویژگی های مربوط به برچسب 1 است، مانند سرطان خوش خیم.
mean texture
با کمک دستور زیر می توانیم ویژگی های این برچسب ها را چاپ کنیم.
print(features[0])
خروجی زیر به دست می آید:
[1.799e+01 1.038e+01 1.228e+02 1.001e+03 1.184e-01 2.776e-01 3.001e-01
1.471e-01 2.419e-01 7.871e-02 1.095e+00 9.053e-01 8.589e+00 1.534e+02
6.399e-03 4.904e-02 5.373e-02 1.587e-02 3.003e-02 6.193e-03 2.538e+01
1.733e+01 1.846e+02 2.019e+03 1.622e-01 6.656e-01 7.119e-01 2.654e-01
4.601e-01 1.189e-01]
با کمک دستور زیر می توانیم ویژگی های این برچسب ها را چاپ کنیم.
print(features[1])
خروجی زیر به دست می آید:
[2.057e+01 1.777e+01 1.329e+02 1.326e+03 8.474e-02 7.864e-02 8.690e-02
7.017e-02 1.812e-01 5.667e-02 5.435e-01 7.339e-01 3.398e+00 7.408e+01
5.225e-03 1.308e-02 1.860e-02 1.340e-02 1.389e-02 3.532e-03 2.499e+01
2.341e+01 1.588e+02 1.956e+03 1.238e-01 1.866e-01 2.416e-01 1.860e-01
2.750e-01 8.902e-02]
مرحله 3 :
سازمان دهی داده به دو مجموعه ِیادگیری(training) و تست(test):
از آنجایی که باید مدل خود را با داده دیده نشده تست کنیم، مجموعه داده خود را به دو بخش تقسیم خواهیم کرد: یک مجموعه یادگیری و یک مجموعه تست. با استفاده از تابع train_test_split() ، از بسته sklearn پایتون، می توان داده را به دو مجموعه تقسیم کرد. دستور زیر تابع را وارد می کند.
from sklearn.model_selection import train_test_split
حال، دستور بعدی، داده را به داده یادگیری و تست تقسیم می کند. در این مثال، 40 درصد از داده را برای هدف مربوط به تست و 60 درصد از داده را برای هدف یادگیری استفاده می کنیم.
train, test, train_labels, test_labels =
train_test_split(features,labels,test_size = 0.40, random_state = 42)
مرحله 4 :
ارزیابی مدل:
پس از تقسیم داده به دو مجموعه یادگیری و تست، باید مدل را بسازیم. از الگوریتم Naïve Bayes برای این منظور استفاده می کنیم. دستورات زیر ماژول GaussianNB را وارد میکند.
from sklearn.naive_bayes import GaussianNB
حال، به صورت زیر مدل را راه اندازی کنید(initialize).
gnb = GaussianNB()
سپس، با کمک دستور زیر می توانیم مدل را آموزش دهیم.
model = gnb.fit(train, train_labels)
حال ، برای هدف ارزیابی، باید پیش بینی هایی را انجام دهیم. این کار را می توان با استفاده از تابع predict() به صورت زیر انجام داد.
preds = gnb.predict(test)
print(preds)
خروجی زیر به دست می آید.
[1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0
1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0
1 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0
1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 1 0 0
1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0
0 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1
0 0 1 1 0 1]
دنباله 0 و 1 ها در خروجی، مقادیر پیش بینی شده برای کلاس های تومور بدخیم(Malignant) و خوش خیم (Benign) است.
مرحله 5 :
یافتن دقت/درستی (accuracy):
صحت و دقت مدل ساخته شده در مرحله قبل را می توان با مقایسه دو آرایه به نام های test_labels و preds پیدا کرد. برای تعیین دقت از تابع accuracy_score( استفاده می کنیم.
from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels,preds))
0.951754385965
خروجی بالا نشان می دهد که طبقه بندی کننده NaïveBayes ، 95.17 درصد دقیق است.
معیار های ارزیابی طبقه بندی کردن در یادگیری ماشین
حتی اگر پیاده سازی مدل یا برنامه کاربردی یادگیری ماشین را تمام کرده باشید، کار هنوز تمام نشده است. باید بفهمیم مدل ما چقدر موثر است. معیار های ارزیابی متفاوتی وجود دارد، اما باید به دقت انتخاب شوند زیرا معیارهای انتخاب شده، چگونگی اندازه گیری و مقایسه کارایی الگوریتم های یادگیری ماشین را تحت تاثیر قرار می دهد.
در ادامه برخی از معیارهای مهم ارزیابی طبقه بندی معرفی شده است که بر اساس مجموعه داده و نوع مساله خود می توانید از بین آنها انتخاب کنید.
ماتریس پریشانی(confusion matrix):
زمانی که خروجی، دو نوع کلاس یا بیشتر باشد، این ماتریس ساده ترین روش برای اندازه گیری کارایی مساله طبقه بندی است.
الگوریتم های متنوع طبقه بندی Machine Learning :
تعدادی از الگوریتم های مهم طبقه بندی ML در ادامه معرفی شده است.
- Logistic Regression
- Support Vector Machine (SVM)
- Decision Tree
- Naïve Bayes
- Random Forest
در بخش های بعدی این الگوریتم های طبقه بندی را با جزییات بررسی می کنیم.