|
|
# طبقهبندی آشپزی ۲
|
|
|
|
|
|
در این درس دوم طبقهبندی، شما راههای بیشتری برای طبقهبندی دادههای عددی کاوش خواهید کرد. همچنین درباره عواقب انتخاب یک طبقهبند نسبت به دیگری خواهید آموخت.
|
|
|
|
|
|
## [آزمون قبل از درس](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
### پیشنیاز
|
|
|
|
|
|
فرض میکنیم که درسهای قبلی را به پایان رساندهاید و یک مجموعهداده تمیز شده به نام _cleaned_cuisines.csv_ در پوشه `data` در ریشه این فولدر ۴ درسی دارید.
|
|
|
|
|
|
### آمادهسازی
|
|
|
|
|
|
ما فایل _notebook.ipynb_ شما را با مجموعهداده تمیز شده بارگذاری کردهایم و آن را به DataFrame های X و y تقسیم کردهایم که آماده فرآیند ساخت مدل هستند.
|
|
|
|
|
|
## نقشه طبقهبندی
|
|
|
|
|
|
قبلاً درباره گزینههای مختلفی که هنگام طبقهبندی دادهها با استفاده از چیت شیت مایکروسافت دارید، یاد گرفتید. Scikit-learn چیتشیتی مشابه، اما دقیقتر ارائه میدهد که میتواند به شما کمک کند برآوردگرهای خود (اصطلاحی دیگر برای طبقهبندها) را بیشتر محدود کنید:
|
|
|
|
|
|

|
|
|
> نکته: [این نقشه را به صورت آنلاین ببینید](https://scikit-learn.org/stable/tutorial/machine_learning_map/) و در مسیرها کلیک کنید تا مستندات را بخوانید.
|
|
|
|
|
|
### برنامه
|
|
|
|
|
|
این نقشه زمانی بسیار مفید است که تسلط خوبی روی دادههای خود داشته باشید، زیرا میتوانید در مسیرهای آن قدم بزنید تا به تصمیم برسید:
|
|
|
|
|
|
- ما بیش از ۵۰ نمونه داریم
|
|
|
- میخواهیم یک دستهبندی را پیشبینی کنیم
|
|
|
- دادهها برچسبخوردهاند
|
|
|
- کمتر از ۱۰۰ هزار نمونه داریم
|
|
|
- ✨ میتوانیم Linear SVC را انتخاب کنیم
|
|
|
- اگر این کار نکند، چون دادههای عددی داریم
|
|
|
- میتوانیم یک ✨ KNeighbors Classifier را امتحان کنیم
|
|
|
- اگر آن هم خوب نبود، امتحان کنید ✨ SVC و ✨ Ensemble Classifiers
|
|
|
|
|
|
این مسیر بسیار مفیدی است که باید دنبال شود.
|
|
|
|
|
|
## تمرین - تقسیم دادهها
|
|
|
|
|
|
با دنبال کردن این مسیر، باید با وارد کردن برخی کتابخانهها شروع کنیم.
|
|
|
|
|
|
1. کتابخانههای لازم را وارد کنید:
|
|
|
|
|
|
```python
|
|
|
from sklearn.neighbors import KNeighborsClassifier
|
|
|
from sklearn.linear_model import LogisticRegression
|
|
|
from sklearn.svm import SVC
|
|
|
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
|
|
|
from sklearn.model_selection import train_test_split, cross_val_score
|
|
|
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
|
|
|
import numpy as np
|
|
|
```
|
|
|
|
|
|
2. دادههای آموزش و تست خود را تقسیم کنید:
|
|
|
|
|
|
```python
|
|
|
X_train, X_test, y_train, y_test = train_test_split(cuisines_features_df, cuisines_label_df, test_size=0.3)
|
|
|
```
|
|
|
|
|
|
## طبقهبند Linear SVC
|
|
|
|
|
|
خوشهبندی پشتیبانی برداری (SVC) از خانواده ماشینهای بردار پشتیبان است (برای اطلاعات بیشتر درباره اینها در ادامه بخوانید). در این روش، میتوانید یک 'هسته' انتخاب کنید تا تصمیم بگیرد چگونه برچسبها را خوشهبندی کند. پارامتر 'C' به «تنظیم» اشاره دارد که تأثیر پارامترها را کنترل میکند. هسته میتواند از [چندین](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC) مورد باشد؛ در اینجا آن را روی 'linear' قرار دادیم تا اطمینان حاصل شود از SVC خطی استفاده میکنیم. احتمال پیشفرض 'false' است؛ در اینجا روی 'true' تنظیم شده است تا تخمینهای احتمال جمعآوری شود. حالت تصادفی را روی '۰' تنظیم کردیم تا دادهها را برای به دست آوردن احتمالات جابهجا کند.
|
|
|
|
|
|
### تمرین - اعمال Linear SVC
|
|
|
|
|
|
با ایجاد آرایهای از طبقهبندها شروع کنید. به تدریج به این آرایه اضافه خواهید کرد همانطور که آزمایش میکنیم.
|
|
|
|
|
|
1. با یک Linear SVC شروع کنید:
|
|
|
|
|
|
```python
|
|
|
C = 10
|
|
|
# ایجاد طبقهبندهای مختلف.
|
|
|
classifiers = {
|
|
|
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
2. مدل خود را با استفاده از Linear SVC آموزش دهید و گزارش چاپ کنید:
|
|
|
|
|
|
```python
|
|
|
n_classifiers = len(classifiers)
|
|
|
|
|
|
for index, (name, classifier) in enumerate(classifiers.items()):
|
|
|
classifier.fit(X_train, np.ravel(y_train))
|
|
|
|
|
|
y_pred = classifier.predict(X_test)
|
|
|
accuracy = accuracy_score(y_test, y_pred)
|
|
|
print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
|
|
|
print(classification_report(y_test,y_pred))
|
|
|
```
|
|
|
|
|
|
نتیجه نسبتاً خوب است:
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for Linear SVC: 78.6%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.71 0.67 0.69 242
|
|
|
indian 0.88 0.86 0.87 234
|
|
|
japanese 0.79 0.74 0.76 254
|
|
|
korean 0.85 0.81 0.83 242
|
|
|
thai 0.71 0.86 0.78 227
|
|
|
|
|
|
accuracy 0.79 1199
|
|
|
macro avg 0.79 0.79 0.79 1199
|
|
|
weighted avg 0.79 0.79 0.79 1199
|
|
|
```
|
|
|
|
|
|
## طبقهبند K-Neighbors
|
|
|
|
|
|
K-Neighbors بخشی از خانواده روشهای یادگیری ماشین "همسایهها" است که میتواند برای یادگیری نظارت شده و بدون نظارت استفاده شود. در این روش، تعداد نقاط از پیش تعریف شدهای ساخته میشود و دادهها اطراف این نقاط جمع میشوند تا برچسبهای تعمیمیافته برای دادهها پیشبینی شود.
|
|
|
|
|
|
### تمرین - اعمال طبقهبند K-Neighbors
|
|
|
|
|
|
طبقهبند قبلی خوب بود و با دادهها خوب کار کرد، اما شاید بتوانیم دقت بهتری داشته باشیم. یک طبقهبند K-Neighbors را امتحان کنید.
|
|
|
|
|
|
1. یک خط به آرایه طبقهبندهای خود اضافه کنید (بعد از عنصر Linear SVC یک ویرگول اضافه کنید):
|
|
|
|
|
|
```python
|
|
|
'KNN classifier': KNeighborsClassifier(C),
|
|
|
```
|
|
|
|
|
|
نتیجه کمی بدتر است:
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for KNN classifier: 73.8%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.64 0.67 0.66 242
|
|
|
indian 0.86 0.78 0.82 234
|
|
|
japanese 0.66 0.83 0.74 254
|
|
|
korean 0.94 0.58 0.72 242
|
|
|
thai 0.71 0.82 0.76 227
|
|
|
|
|
|
accuracy 0.74 1199
|
|
|
macro avg 0.76 0.74 0.74 1199
|
|
|
weighted avg 0.76 0.74 0.74 1199
|
|
|
```
|
|
|
|
|
|
✅ درباره [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) بیشتر بدانید
|
|
|
|
|
|
## طبقهبند Support Vector
|
|
|
|
|
|
طبقهبندهای بردار پشتیبان بخشی از خانواده ماشین بردار پشتیبان (SVM) هستند که برای وظایف طبقهبندی و رگرسیون استفاده میشوند. SVMها "نمونههای آموزش را به نقاطی در فضا نگاشت میدهند" تا فاصله بین دو دسته را به حداکثر برسانند. دادههای بعدی در این فضا نگاشت میشود تا دسته آنها پیشبینی شود.
|
|
|
|
|
|
### تمرین - اعمال طبقهبند Support Vector
|
|
|
|
|
|
بیایید برای دقت کمی بهتر، طبقهبند Support Vector را امتحان کنیم.
|
|
|
|
|
|
1. بعد از عنصر K-Neighbors یک ویرگول اضافه کنید، سپس این خط را اضافه کنید:
|
|
|
|
|
|
```python
|
|
|
'SVC': SVC(),
|
|
|
```
|
|
|
|
|
|
نتیجه خیلی خوب است!
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for SVC: 83.2%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.79 0.74 0.76 242
|
|
|
indian 0.88 0.90 0.89 234
|
|
|
japanese 0.87 0.81 0.84 254
|
|
|
korean 0.91 0.82 0.86 242
|
|
|
thai 0.74 0.90 0.81 227
|
|
|
|
|
|
accuracy 0.83 1199
|
|
|
macro avg 0.84 0.83 0.83 1199
|
|
|
weighted avg 0.84 0.83 0.83 1199
|
|
|
```
|
|
|
|
|
|
✅ درباره [راهحلهای بردار پشتیبان](https://scikit-learn.org/stable/modules/svm.html#svm) بیشتر بدانید
|
|
|
|
|
|
## طبقهبندهای Ensemble
|
|
|
|
|
|
بیایید مسیر را تا انتها دنبال کنیم، گرچه آزمایش قبلی بسیار خوب بود. بیایید برخی 'طبقهبندهای Ensemble' را امتحان کنیم، به خصوص Random Forest و AdaBoost:
|
|
|
|
|
|
```python
|
|
|
'RFST': RandomForestClassifier(n_estimators=100),
|
|
|
'ADA': AdaBoostClassifier(n_estimators=100)
|
|
|
```
|
|
|
|
|
|
نتیجه بسیار خوب است، به ویژه برای Random Forest:
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for RFST: 84.5%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.80 0.77 0.78 242
|
|
|
indian 0.89 0.92 0.90 234
|
|
|
japanese 0.86 0.84 0.85 254
|
|
|
korean 0.88 0.83 0.85 242
|
|
|
thai 0.80 0.87 0.83 227
|
|
|
|
|
|
accuracy 0.84 1199
|
|
|
macro avg 0.85 0.85 0.84 1199
|
|
|
weighted avg 0.85 0.84 0.84 1199
|
|
|
|
|
|
Accuracy (train) for ADA: 72.4%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.64 0.49 0.56 242
|
|
|
indian 0.91 0.83 0.87 234
|
|
|
japanese 0.68 0.69 0.69 254
|
|
|
korean 0.73 0.79 0.76 242
|
|
|
thai 0.67 0.83 0.74 227
|
|
|
|
|
|
accuracy 0.72 1199
|
|
|
macro avg 0.73 0.73 0.72 1199
|
|
|
weighted avg 0.73 0.72 0.72 1199
|
|
|
```
|
|
|
|
|
|
✅ درباره [طبقهبندهای Ensemble](https://scikit-learn.org/stable/modules/ensemble.html) بیشتر بخوانید
|
|
|
|
|
|
این روش یادگیری ماشین "پیشبینی چندین برآوردگر پایه را ترکیب میکند" تا کیفیت مدل را بهبود بخشد. در مثال ما، از درختان تصادفی و AdaBoost استفاده کردیم.
|
|
|
|
|
|
- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest)، یک روش میانگینگیری، یک «جنگل» از «درخت تصمیم» ایجاد میکند که با تصادفی بودن ترکیب شده تا از بیشبرازش جلوگیری کند. پارامتر n_estimators روی تعداد درختان تنظیم شده است.
|
|
|
|
|
|
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) یک طبقهبند را روی مجموعه داده برازش میدهد و سپس نسخههایی از همان طبقهبند را روی همان مجموعه داده برازش میدهد. تمرکز آن روی وزن نمونههای نادرست طبقهبندی شده است و برازش را برای طبقهبند بعدی تنظیم میکند تا خطا را اصلاح کند.
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🚀چالش
|
|
|
|
|
|
هر یک از این تکنیکها دارای تعداد زیادی پارامتر هستند که میتوانید تنظیم کنید. پارامترهای پیشفرض هر کدام را تحقیق کنید و فکر کنید تنظیم این پارامترها برای کیفیت مدل چه معنایی دارد.
|
|
|
|
|
|
## [آزمون بعد از درس](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
## بازبینی و مطالعه خودخوان
|
|
|
|
|
|
در این درسها اصطلاحات زیادی وجود دارد، پس یک دقیقه وقت بگذارید و [این فهرست](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) اصطلاحات مفید را مرور کنید!
|
|
|
|
|
|
## تمرین
|
|
|
|
|
|
[بازی با پارامترها](assignment.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
|
**سلب مسئولیت**:
|
|
|
این سند با استفاده از سرویس ترجمه مبتنی بر هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است حاوی اشتباهات یا نادرستیهایی باشند. سند اصلی به زبان بومی خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، توصیه میشود از ترجمه حرفهای انسانی استفاده شود. ما مسئول هیچگونه سوءتفاهم یا برداشت نادرستی که ناشی از استفاده از این ترجمه باشد، نمیباشیم.
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |