Python Programming

إتقان سير عمل التعلم الآلي باستخدام Scikit-learn: من تجهيز البيانات إلى النشر

في المشهد الشاسع لنظام بيئي علوم البيانات بلغة بايثون، يظل مكتبة Scikit-learn البطل اللامع للتعلم الآلي الكلاسيكي. بينما تهيمن أطر العمل للتعلم العميق مثل PyTorch وTensorFlow على عناوين الأخبار الخاصة بالشبكات العصبية، توفر Scikit-learn الأدوات الأساسية للانحدار، التصنيف، التجميع، وتقليل الأبعاد. بالنسبة للمطورين من المستوى المتوسط إلى المتقدم، يتطلب الانتقال من الدروس الأساسية إلى بناء خطوط أنابيب تعلم آلي قوية وقابلة للصيانة فهماً عميقاً لهيكلية المكتبة. يستكشف هذا المنشور كيفية الاستفادة من واجهة برمجة التطبيقات الموحدة في Scikit-learn لبناء أنظمة تعلم آلي قابلة للتكرار وقابلة للتوسع.

فلسفة واجهة برمجة التطبيقات الموحدة

تتمثل القوة الرئيسية لـ Scikit-learn في تصميم واجهة برمجة التطبيقات المتسقة. بغض النظر عن الخوارزمية المستخدمة، سواء كانت آلة ناقلات الدعم (SVM)، أو الغابة العشوائية، أو تجميع K-Means، تظل الواجهة موحدة. يسمح هذا الاتساق للمطورين بتبديل الخوارزميات بتغييرات حدية في الكود، مما يسهل النمذجة الأولية السريعة والتجريب. يدور الهيكل الأساسي حول ثلاث طرق رئيسية: 1. fit(X, y): تدرب النموذج على البيانات. 2. predict(X): تولد تنبؤات للبيانات الجديدة. 3. transform(X): تطبق تحويلًا على البيانات (شائع في المعالجة الأولية). من خلال الالتزام بهذا النمط، تضمن أن يكون الكود الخاص بك قابلاً للقراءة وسهل التكامل في الأنظمة الأكبر.

معالجة بيانات قوية باستخدام المحولات

نادرًا ما تكون البيانات الواقعية نظيفة. قبل إدخال البيانات في أي مُقدّر، تعد المعالجة الأولية أمرًا حاسمًا. توفر Scikit-learn مجموعة من المحولات التي تتعامل مع القياس، الترميز، واستكمال القيم المفقودة. من الأخطاء الشائعة للمبتدئين تطبيق القياس قبل تقسيم البيانات، مما يؤدي إلى تسرب البيانات. لمنع ذلك، يجب علينا تغليف خطوات المعالجة الأولية الخاصة بنا. فيما يلي مثال باستخدام ColumnTransformer للتعامل مع السمات الرقمية والفئوية في وقت واحد. يضمن هذا النهج تطبيق التحويلات بشكل متسق على كل من مجموعات التدريب والاختبار.
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

# تعريف الأعمدة
numeric_features = ['age', 'income']
categorical_features = ['gender', 'city']

# تعريف المحولات
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# دمج المحولات
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ])

تبسيط سير العمل باستخدام خطوط الأنابيب

بمجرد تعريف المعالجة الأولية، تكون الخطوة التالية هي دمجها مع النموذج. يُعد كائن Pipeline في Scikit-learn لا غنى عنه لهذا الغرض. فهو يربط خطوات المعالجة الأولية والمُقدّر النهائي معًا في كائن واحد. تقدم خطوط الأنابيب ثلاث مزايا رئيسية: 1. **إيجاز الكود**: يقلل من الحاجة إلى المتغيرات الوسيطة. 2. **الأمان**: يمنع تسرب البيانات عن طريق ضمان أن المحولات تُدرَّب فقط على بيانات التدريب أثناء التحقق المتقاطع. 3. **النشر**: يبسط حفظ وتحميل النماذج، حيث يتم حزم سير العمل بأكمله في كائن واحد.
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# نفترض أن X و y معرفتان
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# إنشاء خط الأنابيب الكامل
model_pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('classifier', RandomForestClassifier(n_estimators=100, random_state=42))
])

# التدريب والتنبؤ
model_pipeline.fit(X_train, y_train)
predictions = model_pipeline.predict(X_test)

print(f"Accuracy: {accuracy_score(y_test, predictions):.2f}")

ضبط المعلمات الفائقة والتحقق من الصحة

لتعظيم الأداء، يعد ضبط المعلمات الفائقة أمرًا أساسيًا. توفر Scikit-learn GridSearchCV و RandomizedSearchCV لأتمتة هذه العملية. عند العمل مع خطوط الأنابيب، يمكنك ضبط المعلمات عبر خطوات المعالجة الأولية والنموذج نفسه باستخدام شرطات سفلية مزدوجة __ للتنقل عبر هيكل خط الأنابيب.
from sklearn.model_selection import GridSearchCV

param_grid = [
    {
        'classifier__n_estimators': [50, 100],
        'classifier__max_depth': [None, 10]
    }
]

grid_search = GridSearchCV(model_pipeline, param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X_train, y_train)

print(f"Best Parameters: {grid_search.best_params_}")

الخاتمة

تعد Scikit-learn أكثر من مجرد مجموعة من الخوارزميات؛ إنها إطار عمل لبناء سير عمل تعلم آلي موثوق. من خلال الاستفادة من Pipeline و ColumnTransformer واستراتيجيات التحقق المتقاطع المناسبة، يمكن للمطورين بناء نماذج ليست دقيقة فحسب، بل قابلة للتكرار وجاهزة للإنتاج. لأولئك الذين يتطلعون إلى ترسيخ مهارات هندسة التعلم الآلي الخاصة بهم، يعد إتقان هذه الأدوات خطوة حاسمة في الرحلة من استكشاف البيانات إلى النشر.
Share: