الفئات غير المتوازنة
جزء من قسم التعلّم الخاضع للإشراف في رحلة 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")يُضحّي النموذج المتوازن بقليل من الدقة مقابل اكتشاف عدد أكبر بكثير من الحالات. عند التعامل مع الحالات النادرة، اطّلع على الاستدعاء والإحكام، لا على الدقة.
التحدي
متوسطيتعطل نحو 5% من محامل أحد المصانع مبكرًا. يقسّم الكود التمهيدي سجلات منصة اختبار ويقيّم نموذجًا عاديًا، لكن مجموعة الاختبار لا تضم سوى محملين معطّلين، لذا فإن قيمة 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}")
# اكتب شيفرتك أدناه
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس التعلّم الخاضع للإشراف
5قياس أداء المصنّفات
مصفوفة الالتباسالدقة والاستدعاءدرجة F1الفئات غير المتوازنةمنحنيات ROCمراجعة: اختبار الفحصتدرّب بنفسك: مترجم Python عبر الإنترنت