You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/fa/4-Classification/2-Classifiers-1
leestott e4050807fb
🌐 Update translations via Co-op Translator
2 weeks ago
..
solution 🌐 Update translations via Co-op Translator 3 weeks ago
README.md 🌐 Update translations via Co-op Translator 2 weeks ago
assignment.md 🌐 Update translations via Co-op Translator 3 weeks ago
notebook.ipynb 🌐 Update translations via Co-op Translator 3 weeks ago

README.md

طبقه‌بندی‌کننده‌های آشپزی 1

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

شما از این مجموعه داده با انواع طبقه‌بندی‌کننده‌ها برای پیش‌بینی یک آشپزی ملی بر اساس گروهی از مواد اولیه استفاده خواهید کرد. در این فرآیند، بیشتر با روش‌هایی که الگوریتم‌ها برای وظایف طبقه‌بندی به کار گرفته می‌شوند، آشنا خواهید شد.

آزمون پیش از درس

آماده‌سازی

فرض بر این است که شما درس 1 را کامل کرده‌اید، مطمئن شوید که فایل cleaned_cuisines.csv در پوشه اصلی /data برای این چهار درس وجود دارد.

تمرین - پیش‌بینی یک آشپزی ملی

  1. در پوشه notebook.ipynb این درس، آن فایل را به همراه کتابخانه Pandas وارد کنید:

    import pandas as pd
    cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
    cuisines_df.head()
    

    داده‌ها به این شکل هستند:

Unnamed: 0 cuisine almond angelica anise anise_seed apple apple_brandy apricot armagnac ... whiskey white_bread white_wine whole_grain_wheat_flour wine wood yam yeast yogurt zucchini
0 0 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 1 indian 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 2 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 3 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 4 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 0
  1. حالا چند کتابخانه دیگر را وارد کنید:

    from sklearn.linear_model import LogisticRegression
    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
    from sklearn.svm import SVC
    import numpy as np
    
  2. مختصات X و y را به دو دیتافریم برای آموزش تقسیم کنید. دیتافریم cuisine می‌تواند به عنوان برچسب‌ها باشد:

    cuisines_label_df = cuisines_df['cuisine']
    cuisines_label_df.head()
    

    به این شکل خواهد بود:

    0    indian
    1    indian
    2    indian
    3    indian
    4    indian
    Name: cuisine, dtype: object
    
  3. ستون Unnamed: 0 و ستون cuisine را با استفاده از drop() حذف کنید. بقیه داده‌ها را به عنوان ویژگی‌های قابل آموزش ذخیره کنید:

    cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
    cuisines_feature_df.head()
    

    ویژگی‌های شما به این شکل خواهند بود:

almond angelica anise anise_seed apple apple_brandy apricot armagnac artemisia artichoke ... whiskey white_bread white_wine whole_grain_wheat_flour wine wood yam yeast yogurt zucchini
0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 0

حالا آماده آموزش مدل خود هستید!

انتخاب طبقه‌بندی‌کننده

حالا که داده‌های شما پاک و آماده آموزش هستند، باید تصمیم بگیرید که از کدام الگوریتم برای این کار استفاده کنید.

Scikit-learn طبقه‌بندی را تحت یادگیری نظارت‌شده گروه‌بندی می‌کند و در این دسته‌بندی روش‌های زیادی برای طبقه‌بندی وجود دارد. تنوع در ابتدا ممکن است گیج‌کننده به نظر برسد. روش‌های زیر شامل تکنیک‌های طبقه‌بندی هستند:

  • مدل‌های خطی
  • ماشین‌های بردار پشتیبان
  • نزول گرادیان تصادفی
  • نزدیک‌ترین همسایه‌ها
  • فرآیندهای گوسی
  • درخت‌های تصمیم‌گیری
  • روش‌های ترکیبی (طبقه‌بندی‌کننده رأی‌گیری)
  • الگوریتم‌های چندکلاسه و چندخروجی (طبقه‌بندی چندکلاسه و چندبرچسبی، طبقه‌بندی چندکلاسه-چندخروجی)

شما همچنین می‌توانید از شبکه‌های عصبی برای طبقه‌بندی داده‌ها استفاده کنید، اما این موضوع خارج از محدوده این درس است.

کدام طبقه‌بندی‌کننده را انتخاب کنیم؟

پس، کدام طبقه‌بندی‌کننده را باید انتخاب کنید؟ اغلب، اجرای چندین طبقه‌بندی‌کننده و جستجوی نتیجه خوب راهی برای آزمایش است. Scikit-learn یک مقایسه کنار هم روی یک مجموعه داده ایجاد شده ارائه می‌دهد که KNeighbors، SVC به دو روش، GaussianProcessClassifier، DecisionTreeClassifier، RandomForestClassifier، MLPClassifier، AdaBoostClassifier، GaussianNB و QuadraticDiscrinationAnalysis را مقایسه می‌کند و نتایج را به صورت تصویری نشان می‌دهد:

مقایسه طبقه‌بندی‌کننده‌ها

نمودارها از مستندات Scikit-learn تولید شده‌اند

AutoML این مشکل را به خوبی حل می‌کند و این مقایسه‌ها را در فضای ابری اجرا می‌کند و به شما اجازه می‌دهد بهترین الگوریتم را برای داده‌های خود انتخاب کنید. آن را اینجا امتحان کنید

یک رویکرد بهتر

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

برگه تقلب برای مشکلات چندکلاسه

بخشی از برگه تقلب الگوریتم مایکروسافت، گزینه‌های طبقه‌بندی چندکلاسه را نشان می‌دهد

این برگه تقلب را دانلود کنید، چاپ کنید و روی دیوار خود آویزان کنید!

استدلال

بیایید ببینیم آیا می‌توانیم با توجه به محدودیت‌هایی که داریم، راه‌حل‌های مختلف را بررسی کنیم:

  • شبکه‌های عصبی سنگین هستند. با توجه به مجموعه داده پاک اما حداقلی ما و این واقعیت که آموزش را به صورت محلی از طریق نوت‌بوک‌ها اجرا می‌کنیم، شبکه‌های عصبی برای این وظیفه سنگین هستند.
  • طبقه‌بندی‌کننده دوکلاسه مناسب نیست. ما از طبقه‌بندی‌کننده دوکلاسه استفاده نمی‌کنیم، بنابراین گزینه one-vs-all حذف می‌شود.
  • درخت تصمیم‌گیری یا رگرسیون لجستیک ممکن است کار کند. یک درخت تصمیم‌گیری ممکن است کار کند، یا رگرسیون لجستیک برای داده‌های چندکلاسه.
  • درخت‌های تصمیم‌گیری تقویت‌شده چندکلاسه مشکل دیگری را حل می‌کنند. درخت تصمیم‌گیری تقویت‌شده چندکلاسه بیشتر برای وظایف غیرپارامتری مناسب است، مانند وظایفی که برای ایجاد رتبه‌بندی طراحی شده‌اند، بنابراین برای ما مفید نیست.

استفاده از Scikit-learn

ما از Scikit-learn برای تحلیل داده‌های خود استفاده خواهیم کرد. با این حال، روش‌های زیادی برای استفاده از رگرسیون لجستیک در Scikit-learn وجود دارد. به پارامترهایی که باید تنظیم شوند نگاهی بیندازید.

به طور کلی دو پارامتر مهم وجود دارد - multi_class و solver - که باید مشخص شوند، زمانی که از Scikit-learn می‌خواهیم رگرسیون لجستیک انجام دهد. مقدار multi_class رفتار خاصی را اعمال می‌کند. مقدار solver مشخص می‌کند که از کدام الگوریتم استفاده شود. همه solverها نمی‌توانند با همه مقادیر multi_class جفت شوند.

طبق مستندات، در حالت چندکلاسه، الگوریتم آموزش:

  • از طرح one-vs-rest (OvR) استفاده می‌کند، اگر گزینه multi_class روی ovr تنظیم شده باشد.
  • از ضرر آنتروپی متقاطع استفاده می‌کند، اگر گزینه multi_class روی multinomial تنظیم شده باشد. (در حال حاضر گزینه multinomial فقط توسط solverهای lbfgs, sag, saga و newton-cg پشتیبانی می‌شود.)

🎓 'طرح' در اینجا می‌تواند 'ovr' (one-vs-rest) یا 'multinomial' باشد. از آنجا که رگرسیون لجستیک واقعاً برای پشتیبانی از طبقه‌بندی دودویی طراحی شده است، این طرح‌ها به آن اجازه می‌دهند وظایف طبقه‌بندی چندکلاسه را بهتر مدیریت کند. منبع

🎓 'solver' به عنوان "الگوریتمی که در مسئله بهینه‌سازی استفاده می‌شود" تعریف شده است. منبع.

Scikit-learn این جدول را ارائه می‌دهد تا توضیح دهد چگونه solverها چالش‌های مختلفی که توسط ساختارهای مختلف داده ارائه می‌شوند را مدیریت می‌کنند:

solverها

تمرین - تقسیم داده‌ها

ما می‌توانیم برای اولین آزمایش آموزشی خود روی رگرسیون لجستیک تمرکز کنیم، زیرا شما اخیراً درباره آن در درس قبلی یاد گرفته‌اید. داده‌های خود را با فراخوانی train_test_split() به گروه‌های آموزشی و آزمایشی تقسیم کنید:

X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)

تمرین - اعمال رگرسیون لجستیک

از آنجا که شما از حالت چندکلاسه استفاده می‌کنید، باید انتخاب کنید که از کدام طرح استفاده کنید و کدام solver را تنظیم کنید. از LogisticRegression با تنظیم multi_class روی ovr و solver روی liblinear برای آموزش استفاده کنید.

  1. یک رگرسیون لجستیک با تنظیم multi_class روی ovr و solver روی liblinear ایجاد کنید:

    lr = LogisticRegression(multi_class='ovr',solver='liblinear')
    model = lr.fit(X_train, np.ravel(y_train))
    
    accuracy = model.score(X_test, y_test)
    print ("Accuracy is {}".format(accuracy))
    

    یک solver متفاوت مانند lbfgs را امتحان کنید که اغلب به صورت پیش‌فرض تنظیم می‌شود. توجه داشته باشید، از تابع ravel در Pandas برای مسطح کردن داده‌های خود در صورت نیاز استفاده کنید. دقت این مدل بیش از ۸۰٪ است!

۱. می‌توانید عملکرد این مدل را با آزمایش یک سطر داده (#۵۰) مشاهده کنید:

```python
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
print(f'cuisine: {y_test.iloc[50]}')
```

نتیجه چاپ می‌شود:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
cuisine: indian

یک شماره سطر متفاوت را امتحان کنید و نتایج را بررسی کنید.

۱. با بررسی بیشتر، می‌توانید دقت این پیش‌بینی را بررسی کنید:

```python
test= X_test.iloc[50].values.reshape(-1, 1).T
proba = model.predict_proba(test)
classes = model.classes_
resultdf = pd.DataFrame(data=proba, columns=classes)

topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
topPrediction.head()
```

نتیجه چاپ می‌شود - غذای هندی بهترین حدس مدل است، با احتمال خوب:

|          |        0 |
| -------: | -------: |
|   indian | 0.715851 |
|  chinese | 0.229475 |
| japanese | 0.029763 |
|   korean | 0.017277 |
|     thai | 0.007634 |

✅ آیا می‌توانید توضیح دهید چرا مدل مطمئن است که این یک غذای هندی است؟

۱. جزئیات بیشتری را با چاپ گزارش طبقه‌بندی، همانطور که در درس‌های رگرسیون انجام دادید، دریافت کنید:

```python
y_pred = model.predict(X_test)
print(classification_report(y_test,y_pred))
```

|              | precision | recall | f1-score | support |
| ------------ | --------- | ------ | -------- | ------- |
| chinese      | 0.73      | 0.71   | 0.72     | 229     |
| indian       | 0.91      | 0.93   | 0.92     | 254     |
| japanese     | 0.70      | 0.75   | 0.72     | 220     |
| korean       | 0.86      | 0.76   | 0.81     | 242     |
| thai         | 0.79      | 0.85   | 0.82     | 254     |
| accuracy     | 0.80      | 1199   |          |         |
| macro avg    | 0.80      | 0.80   | 0.80     | 1199    |
| weighted avg | 0.80      | 0.80   | 0.80     | 1199    |

🚀چالش

در این درس، از داده‌های پاک‌سازی‌شده خود برای ساخت یک مدل یادگیری ماشین استفاده کردید که می‌تواند یک غذای ملی را بر اساس مجموعه‌ای از مواد اولیه پیش‌بینی کند. زمانی را صرف کنید تا گزینه‌های مختلفی که Scikit-learn برای طبقه‌بندی داده‌ها ارائه می‌دهد بررسی کنید. مفهوم 'solver' را عمیق‌تر بررسی کنید تا بفهمید پشت صحنه چه اتفاقی می‌افتد.

آزمون پس از درس

مرور و مطالعه شخصی

ریاضیات پشت رگرسیون لجستیک را در این درس بیشتر بررسی کنید.

تکلیف

مطالعه حل‌کننده‌ها


سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.