מסווגי מטבחים 1

April 20, 2026 · View on GitHub

בשעור זה, תשתמש במאגר הנתונים ששמרת מהשיעור הקודם מלא בנתונים נקיים ומאוזנים אודות מטבחים.

תשתמש במאגר זה עם מגוון מסווגים כדי לחזות מטבח לאומי נתון בהתבסס על קבוצה של מרכיבים. בעת ביצוע זאת, תלמד עוד על כמה מהדרכים בהן ניתן לנצל אלגוריתמים לביצוע משימות סיווג.

מבחן טרום-הרצאה

הכנה

בהנחה שסיימת את שיעור 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: 0cuisinealmondangelicaaniseanise_seedappleapple_brandyapricotarmagnac...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00indian00000000...0000000000
11indian10000000...0000000000
22indian00000000...0000000000
33indian00000000...0000000000
44indian00000000...0000000010
  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 לשני DataFrame-ים עבור האימון. cuisine יכול להיות ה-DataFrame של התוויות:

    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()
    

    המאפיינים שלך נראים כך:

almondangelicaaniseanise_seedappleapple_brandyapricotarmagnacartemisiaartichoke...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00000000000...0000000000
11000000000...0000000000
20000000000...0000000000
30000000000...0000000000
40000000000...0000000010

כעת אתה מוכן לאמן את המודל שלך!

בחירת המסווג

כעת שהנתונים שלך נקיים ומוכנים לאימון, עליך להחליט איזה אלגוריתם להשתמש למטרה.

Scikit-learn מסווג את הסיווג תחת לימת מפקח, ובקטגוריה זו תמצא דרכים רבות לסווג. המגוון מבלבל למדי במבט ראשון. השיטות הבאות כוללות טכניקות סיווג:

  • מודלים לינאריים
  • מכונות וקטור תמיכה (SVM)
  • ירידת גרדיאנט סטוכסטית
  • השכנים הקרובים ביותר
  • תהליכים גאוסיים
  • עצי החלטה
  • שיטות אסמבלא (מסווג הצבעות)
  • אלגוריתמים לריבוי מחלקות וריבוי תפוקות (סיווג Multiclass ו-multilabel, סיווג multiclass-multioutput)

ניתן גם להשתמש ברשתות עצביות לסיווג נתונים, אך זה מחוץ לתחום שיעור זה.

איזה מסווג לבחור?

אז, איזה מסווג כדאי לבחור? לעיתים קרובות, הרצת כמה מהם וחיפוש אחר תוצאה טובה היא דרך לבדוק. Scikit-learn מציעה השוואה מקבילה על מאגר נתונים שנוצר, המשווה בין KNeighbors, SVC בשתי דרכים, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB ו-QuadraticDiscrinationAnalysis, ומציגה את התוצאות בצורה ויזואלית:

השוואת מסווגים

תרשימים שנוצרו בתיעוד של Scikit-learn

AutoML פותר בעיה זו באופן אלגנטי על ידי ביצוע השוואות אלה בענן, ומאפשר לך לבחור את האלגוריתם הטוב ביותר עבור הנתונים שלך. נסה את זה כאן

גישה טובה יותר

גישה טובה יותר מאשר ניחוש פרוע, היא לעקוב אחר הרעיונות שבגליון ML Cheat sheet הניתן להורדה. כאן, אנו מגלים שלבעיית הריבוי מחלקות שלנו יש כמה אפשרויות:

גליון רמאויות לבעיות ריבוי מחלקות

קטע מגליון הרמאויות של מיקרוסופט, המתאר אפשרויות לסיווג ריבוי מחלקות

✅ הורד את גיליון הרמאויות הזה, הדפס אותו ותלה אותו על הקיר שלך!

שיקול דעת

בוא נראה אם נוכל לנמק את הדרך דרך גישות שונות בהתחשב במגבלות שיש לנו:

  • רשתות עצביות כבדות מדי. בהתבסס על מאגר הנתונים הנקי, אך המינימלי שלנו, ועל העובדה שאנו עושים אימון מקומי דרך פנקסי הערות (notebooks), רשתות עצביות הן כבדות מדי למשימה זו.
  • אין מסווג דו-מחלקתי. אנחנו לא משתמשים במסווג דו-מחלקתי, ולכן שוללים את השיטה one-vs-all.
  • עץ החלטה או רגרסיה לוגיסטית יכולים להתאים. עץ החלטה עשוי להתאים, או רגרסיה לוגיסטית לנתונים מרובי מחלקות.
  • עצים מחוזקים לריבוי מחלקות פותרים בעיה שונה. עץ החלטה מחוזק לריבוי מחלקות מתאים בעיקר למשימות לא פרמטריות, לדוגמה משימות שנועדו לבנות דירוגים, ולכן אינו שימושי במקרה שלנו.

שימוש ב-Scikit-learn

נשתמש ב-Scikit-learn לניתוח הנתונים שלנו. עם זאת, יש דרכים רבות להשתמש ברגרסיה לוגיסטית ב-Scikit-learn. עיין בפרמטרים שיש להעביר כאן.

בעיקרון קיימים שני פרמטרים חשובים - multi_class ו-solver - שעלינו להגדיר כאשר מבקשים מ-Scikit-learn לבצע רגרסיה לוגיסטית. הערך של multi_class מכתיב התנהגות מסוימת. ערך solver הוא האלגוריתם שיש להשתמש בו. לא כל ה-solvers יכולים להיות משולבים עם כל ערכי multi_class .

לפי התיעוד, במקרה של ריבוי מחלקות, אלגוריתם האימון:

  • משתמש בסכמת one-vs-rest (OvR) אם אפשרות multi_class מוגדרת כ-ovr
  • משתמש בהפסד cross-entropy, אם אפשרות multi_class מוגדרת ל-multinomial (כיום אפשרות multinomial נתמכת רק על ידי solvers מסוג ‘lbfgs’, ‘sag’, ‘saga’ ו-‘newton-cg’)."

🎓 ה'סכמה' כאן יכולה להיות 'ovr' (one-vs-rest) או 'multinomial'. כיוון שרגרסיה לוגיסטית תוכננה במקור לתמוך בסיווג בינארי, סכמות אלו מאפשרות לה להתמודד טוב יותר עם משימות סיווג ריבוי מחלקות. מקור

🎓 ה-'solver' מוגדר כ"אלגוריתם לשימוש בפתרון בעיית האופטימיזציה". מקור.

Scikit-learn מציעה טבלה המסבירה איך שיטות הפיתרון מתמודדות עם אתגרים שונים המוצגים על ידי סוגי מבני נתונים שונים:

solvers

תרגיל - פצל את הנתונים

נוכל להתמקד ברגרסיה לוגיסטית לניסוי האימון הראשון שלנו מכיוון שלמדת רק לאחרונה עליה בשיעור קודם.
חתוך את הנתונים שלך לקבוצות אימון ובדיקה עם קריאה ל-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 עם הגדרת ריבוי מחלקות ו-liblinear בתור ה-solver לאימון.

  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 כדי לשטח את הנתונים בעת הצורך.

    הדיוק טוב ומעל 80%!

  2. תוכל לראות את המודל פועל על ידי בדיקת שורה אחת (#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
    

    ✅ נסה מספר שורה שונה ובדוק את התוצאות

  3. חופרים לעומק, ניתן לבדוק את הדיוק של התחזית הזו:

    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
    indian0.715851
    chinese0.229475
    japanese0.029763
    korean0.017277
    thai0.007634

    ✅ האם תוכל להסביר מדוע המודל די בטוח שזה מטבח הודי?

  4. קבל פרטים נוספים על ידי הדפסת דוח סיווג, כפי שעשית בשיעורי הרגרסיה:

    y_pred = model.predict(X_test)
    print(classification_report(y_test,y_pred))
    
    precisionrecallf1-scoresupport
    chinese0.730.710.72229
    indian0.910.930.92254
    japanese0.700.750.72220
    korean0.860.760.81242
    thai0.790.850.82254
    accuracy0.801199
    macro avg0.800.800.801199
    weighted avg0.800.800.801199

🚀אתגר

בשיעור זה, השתמשת בנתונים המסוננים שלך לבניית מודל למידת מכונה שיכול לנבא מטבח לאומי בהתבסס על סדרת רכיבים. קח קצת זמן לקרוא על האפשרויות הרבות ש-Scikit-learn מספקת לסיווג נתונים. חקור לעומק את מושג ה'פותר' (solver) כדי להבין מה מתרחש מאחורי הקלעים.

חידון לאחר ההרצאה

סקירה ולמידה עצמית

חפר קצת יותר לעומק למתמטיקה שמאחורי רגרסיה לוגיסטית בהשיעור הזה

משימה

למד את הפותרים


כתב ויתור:
מסמך זה תורגם בעזרת שירות תרגום מבוסס בינה מלאכותית Co-op Translator. למרות שאנו שואפים לדייק, יש להיות מודעים לכך שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. המסמך המקורי בשפת המקור שלו הוא המקור המוסמך. למידע קריטי מומלץ להשתמש בתרגום מקצועי אנושי. איננו אחראים לאי-הבנות או לפרשנויות שגויות הנגרמות משימוש בתרגום זה.