Menu
CoddyTech

מחלקות לא מאוזנות

חלק מהיחידה למידה מונחית במסלול ה-Machine Learning של Coddy. שיעור 24 מתוך 58.

כש־95 מתוך 100 מטופלים בריאים, מודל שתמיד חוזה שהם בריאים משיג דיוק של 95% ואינו מזהה אף אחד. במחלקות לא מאוזנות, הדיוק מחמיא למודל:

עמודות דיוק ורגישות עבור שלושה מודלים על נתונים שבהם 5% מהמטופלים חולים. תמיד בריאים: דיוק 0.95, רגישות 0.00. מודל פשוט: 0.98 ו־0.62. מודל מאוזן: 0.94 ו־0.92

שני תיקונים. 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, ולא את הדיוק.

challenge icon

אתגר

בינוני

כ־5% מהמיסבים במפעל מתקלקלים מוקדם. קוד הפתיחה מפצל את הרשומות של עמדת בדיקה ומעריך מודל רגיל, אבל בקבוצת הבדיקה שלו יש רק 2 מיסבים פגומים, ולכן ל־0.993 שלו אין משמעות רבה.

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

עבור עמדת בדיקה אחרת:

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}")

# כתבו את הקוד שלכם למטה
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה למידה מונחית

תרגלו בעצמכם: קומפיילר Python אונליין