|
|
6 months ago | |
|---|---|---|
| .. | ||
| solution | 6 months ago | |
| README.md | 6 months ago | |
| assignment.md | 6 months ago | |
| notebook.ipynb | 6 months ago | |
README.md
دستهبندیکنندههای آشپزی 1
در این درس، شما از مجموعه دادهای که در درس قبلی ذخیره کردهاید استفاده خواهید کرد؛ مجموعهای پر از دادههای متوازن و پاک درباره آشپزی.
شما از این مجموعه داده با انواع دستهبندیکنندهها برای پیشبینی یک آشپزی ملی بر اساس گروهی از مواد اولیه استفاده خواهید کرد. در این فرآیند، بیشتر با روشهایی که الگوریتمها برای وظایف دستهبندی به کار گرفته میشوند آشنا خواهید شد.
آزمون پیش از درس
آمادهسازی
فرض کنید درس درس 1 را کامل کردهاید، مطمئن شوید که فایل cleaned_cuisines.csv در پوشه اصلی /data برای این چهار درس وجود دارد.
تمرین - پیشبینی یک آشپزی ملی
-
در پوشه 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 |
-
حالا چند کتابخانه دیگر وارد کنید:
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 -
مختصات 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 -
ستون
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 این مشکل را به خوبی حل میکند و این مقایسهها را در فضای ابری اجرا میکند و به شما اجازه میدهد بهترین الگوریتم را برای دادههای خود انتخاب کنید. آن را اینجا امتحان کنید
یک رویکرد بهتر
یک روش بهتر از حدس زدن بیهدف، دنبال کردن ایدههای موجود در این برگه تقلب یادگیری ماشین قابل دانلود است. در اینجا، متوجه میشویم که برای مشکل چندکلاسه ما، چند گزینه داریم:
بخشی از برگه تقلب الگوریتمهای مایکروسافت، گزینههای دستهبندی چندکلاسه را نشان میدهد
✅ این برگه تقلب را دانلود کنید، چاپ کنید و روی دیوار خود آویزان کنید!
استدلال
بیایید ببینیم آیا میتوانیم با توجه به محدودیتهایی که داریم، راهحلهای مختلف را بررسی کنیم:
- شبکههای عصبی سنگین هستند. با توجه به مجموعه داده پاک اما حداقلی ما و این واقعیت که آموزش را به صورت محلی از طریق نوتبوکها اجرا میکنیم، شبکههای عصبی برای این وظیفه سنگین هستند.
- دستهبندیکننده دوکلاسه مناسب نیست. ما از دستهبندیکننده دوکلاسه استفاده نمیکنیم، بنابراین این گزینه حذف میشود.
- درخت تصمیم یا رگرسیون لجستیک ممکن است کار کند. یک درخت تصمیم ممکن است کار کند، یا رگرسیون لجستیک برای دادههای چندکلاسه.
- درختهای تصمیم تقویتشده چندکلاسه مشکل دیگری را حل میکنند. درخت تصمیم تقویتشده چندکلاسه بیشتر برای وظایف غیرپارامتری مناسب است، مانند وظایفی که برای ایجاد رتبهبندی طراحی شدهاند، بنابراین برای ما مفید نیست.
استفاده از 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ها چالشهای مختلفی که توسط ساختارهای مختلف داده ارائه میشوند را مدیریت میکنند:
تمرین - تقسیم دادهها
ما میتوانیم برای اولین آزمایش آموزشی خود روی رگرسیون لجستیک تمرکز کنیم، زیرا شما اخیراً درباره آن در درس قبلی یاد گرفتهاید.
دادههای خود را به گروههای آموزشی و آزمایشی تقسیم کنید با فراخوانی 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 با تنظیم چندکلاسه و solver liblinear برای آموزش استفاده کنید.
-
یک رگرسیون لجستیک با تنظیم 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 ترجمه شده است. در حالی که ما برای دقت تلاش میکنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادقتیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفهای انسانی توصیه میشود. ما هیچ مسئولیتی در قبال سوءتفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.


