מחלקות לא מאוזנות
חלק מהיחידה למידה מונחית במסלול ה-Machine Learning של Coddy. שיעור 24 מתוך 58.
כש־95 מתוך 100 מטופלים בריאים, מודל שתמיד חוזה שהם בריאים משיג דיוק של 95% ואינו מזהה אף אחד. במחלקות לא מאוזנות, הדיוק מחמיא למודל:
שני תיקונים. stratify=y שומר על היחס של 95 ל־5 בשתי הקבוצות, כך שבקבוצת הבדיקה יהיו חולים שאפשר לזהות. class_weight="balanced" נותן לכל שורה נדירה משקל גדול יותר:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=0, stratify=y)
model = LogisticRegression(max_iter=1000, class_weight="balanced")המודל המאוזן מוותר על מעט דיוק כדי לזהות הרבה יותר מקרים. במקרים נדירים, בחנו את ה-recall ואת ה-precision, ולא את הדיוק.
אתגר
בינוניכ־5% מהמיסבים במפעל מתקלקלים מוקדם. קוד הפתיחה מפצל את הרשומות של עמדת בדיקה ומעריך מודל רגיל, אבל בקבוצת הבדיקה שלו יש רק 2 מיסבים פגומים, ולכן ל־0.993 שלו אין משמעות רבה.
- תקן את הפיצול כך שבשתי הקבוצות יישמר אותו שיעור של מיסבים פגומים.
- אמן מודל שני שנותן משקל גדול יותר לשורות הפגומות, והדפס את השורה שלו כפי שמוצג למטה.
עבור עמדת בדיקה אחרת:
Faulty bearings: train 8.1%, test 7.8%
Plain: accuracy 0.947, recall 0.417
Balanced: accuracy 0.900, recall 0.833נסו בעצמכם
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, recall_score
# שורה אחת לכל מיסב ממתקן הבדיקה: 1 ב-faulty פירושו שהמיסב כשל זמן קצר לאחר מכן
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]
# תקנו את החלוקה הזו
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
print(f"Faulty bearings: train {y_train.mean() * 100:.1f}%, test {y_test.mean() * 100:.1f}%")
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
plain = LogisticRegression(max_iter=1000)
plain.fit(X_train, y_train)
pred = plain.predict(X_test)
print(f"Plain: accuracy {accuracy_score(y_test, pred):.3f}, recall {recall_score(y_test, pred):.3f}")
# כתבו את הקוד שלכם למטה
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה למידה מונחית
תרגלו בעצמכם: קומפיילר Python אונליין