|
2 weeks ago | |
---|---|---|
.. | ||
solution | 3 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 3 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
مصنفات المأكولات 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 يحل هذه المشكلة بشكل أنيق عن طريق تشغيل هذه المقارنات في السحابة، مما يتيح لك اختيار أفضل خوارزمية لبياناتك. جربه هنا
نهج أفضل
نهج أفضل من التخمين العشوائي هو اتباع الأفكار الموجودة في ورقة الغش الخاصة بالتعلم الآلي القابلة للتنزيل. هنا، نكتشف أنه بالنسبة لمشكلتنا متعددة الفئات، لدينا بعض الخيارات:
قسم من ورقة الغش الخاصة بخوارزميات Microsoft، يوضح خيارات التصنيف متعددة الفئات
✅ قم بتنزيل ورقة الغش هذه، واطبعها، وعلقها على حائطك!
التفكير
دعونا نحاول التفكير في الطرق المختلفة بناءً على القيود التي لدينا:
- الشبكات العصبية ثقيلة جدًا. بالنظر إلى مجموعة البيانات النظيفة ولكن الصغيرة، وحقيقة أننا نقوم بالتدريب محليًا عبر دفاتر الملاحظات، فإن الشبكات العصبية ثقيلة جدًا لهذه المهمة.
- لا يوجد مصنف ثنائي الفئات. نحن لا نستخدم مصنف ثنائي الفئات، لذا يتم استبعاد طريقة واحد ضد الكل.
- شجرة القرار أو الانحدار اللوجستي قد يعملان. قد تعمل شجرة القرار، أو الانحدار اللوجستي للبيانات متعددة الفئات.
- أشجار القرار المعززة متعددة الفئات تحل مشكلة مختلفة. شجرة القرار المعززة متعددة الفئات مناسبة بشكل أكبر للمهام غير المعلمية، مثل المهام المصممة لإنشاء تصنيفات، لذا فهي ليست مفيدة لنا.
استخدام Scikit-learn
سنستخدم Scikit-learn لتحليل بياناتنا. ومع ذلك، هناك العديد من الطرق لاستخدام الانحدار اللوجستي في Scikit-learn. ألقِ نظرة على المعلمات التي يمكن تمريرها.
بشكل أساسي، هناك معلمتان مهمتان - multi_class
و solver
- يجب تحديدهما عند طلب Scikit-learn تنفيذ الانحدار اللوجستي. قيمة multi_class
تطبق سلوكًا معينًا. وقيمة solver
تحدد الخوارزمية المستخدمة. ليس كل الحلول يمكن أن تقترن بكل قيم multi_class
.
وفقًا للوثائق، في حالة التصنيف متعدد الفئات، فإن خوارزمية التدريب:
- تستخدم مخطط واحد ضد الباقي (OvR)، إذا تم تعيين خيار
multi_class
إلىovr
- تستخدم خسارة الانتروبيا المتقاطعة، إذا تم تعيين خيار
multi_class
إلىmultinomial
. (حاليًا، خيارmultinomial
مدعوم فقط بواسطة الحلول ‘lbfgs’، ‘sag’، ‘saga’ و ‘newton-cg’.)
🎓 "المخطط" هنا يمكن أن يكون إما 'ovr' (واحد ضد الباقي) أو 'multinomial'. نظرًا لأن الانحدار اللوجستي مصمم لدعم التصنيف الثنائي، فإن هذه المخططات تسمح له بالتعامل بشكل أفضل مع مهام التصنيف متعددة الفئات. المصدر
🎓 "الحل" يُعرف بأنه "الخوارزمية المستخدمة في مشكلة التحسين". المصدر.
تقدم Scikit-learn هذا الجدول لشرح كيفية تعامل الحلول مع التحديات المختلفة التي تقدمها هياكل البيانات المختلفة:
تمرين - تقسيم البيانات
يمكننا التركيز على الانحدار اللوجستي لتجربة التدريب الأولى لدينا نظرًا لأنك تعلمت عنه مؤخرًا في درس سابق.
قسّم بياناتك إلى مجموعات تدريب واختبار باستخدام train_test_split()
:
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
تمرين - تطبيق الانحدار اللوجستي
نظرًا لأنك تستخدم حالة التصنيف متعدد الفئات، تحتاج إلى اختيار ما المخطط الذي ستستخدمه وما الحل الذي ستحدده. استخدم LogisticRegression مع إعداد متعدد الفئات والمحلل liblinear للتدريب.
-
قم بإنشاء انحدار لوجستي مع تعيين multi_class إلى
ovr
والمحلل إلى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))
✅ جرب محللًا مختلفًا مثل
lbfgs
، الذي يتم تعيينه غالبًا كإعداد افتراضي
ملاحظة، استخدم وظيفة Pandas
ravel
لتسطيح بياناتك عند الحاجة. الدقة جيدة بنسبة تزيد عن 80%!
-
يمكنك رؤية هذا النموذج أثناء العمل من خلال اختبار صف واحد من البيانات (#50):
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
✅ جرب رقم صف مختلف وتحقق من النتائج.
-
بالتعمق أكثر، يمكنك التحقق من دقة هذا التنبؤ:
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 ✅ هل يمكنك تفسير لماذا النموذج متأكد إلى حد كبير أن هذا مطبخ هندي؟
-
احصل على مزيد من التفاصيل عن طريق طباعة تقرير التصنيف، كما فعلت في دروس الانحدار:
y_pred = model.predict(X_test) print(classification_report(y_test,y_pred))
الدقة الاسترجاع درجة F1 الدعم 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 الدقة 0.80 1199 المتوسط الكلي 0.80 0.80 0.80 1199 المتوسط الموزون 0.80 0.80 0.80 1199
🚀التحدي
في هذا الدرس، استخدمت بياناتك المنظفة لبناء نموذج تعلم آلي يمكنه التنبؤ بالمطبخ الوطني بناءً على سلسلة من المكونات. خذ بعض الوقت لقراءة الخيارات العديدة التي يوفرها Scikit-learn لتصنيف البيانات. تعمق أكثر في مفهوم 'solver' لفهم ما يحدث خلف الكواليس.
اختبار ما بعد المحاضرة
المراجعة والدراسة الذاتية
تعمق قليلاً في الرياضيات وراء الانحدار اللوجستي في هذا الدرس
الواجب
إخلاء المسؤولية:
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية Co-op Translator. بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.