HyperAI
Back to Headlines

تحسين الدقة في 15 دقيقة باستخدام تقنية التراصف والتحسين المركب بمسارعةVIDIA cuML GPU

منذ 21 أيام

تحسين الدقة باستخدام تقنية Stacking Generalization مع Hyperparameter Optimization على GPU مقدمة تقنية Stacking Generalization هي واحدة من التقنيات الشائعة بين مهندسي التعلم الآلي، حيث يتم دمج عدة نماذج لتعزيز الأداء التنبؤي العام. من ناحية أخرى، فإن عملية تحسين المعلمات الفوقية (Hyperparameter Optimization - HPO) تتضمن البحث المنهجي عن أفضل مجموعة من المعلمات الفوقية لتعزيز أداء خوارزمية التعلم الآلي. تحدي شائع عند استخدام كلتا التقنيتين هو الاستهلاك الحاسوبي الكبير، حيث يتطلب الأمر تدريب العديد من النماذج والمرور عبر العديد من مجموعات المعلمات الفوقية لكل نموذج. هذا يمكن أن يصبح مكلفًا ومكثفًا زمنيًا خاصة للبيانات الكبيرة. في هذا المقال، سنوضح كيفية تبسيط هذا الخط الإنتاجي الذي يدمج بين تقنية Stacking Generalization و HPO، وكيف يمكن تنفيذه في غضون 15 دقيقة باستخدام حساب مسرع بالGPU مع مكتبة NVIDIA cuML. بفضل التكامل الصفر للرمز مع scikit-learn، يمكنك استخدام خط إنتاج التعلم الآلي الحالي الخاص بك مع تسريع GPU (بدون تغييرات في الرمز) وتحقيق نفس دقة النموذج. على عكس التنفيذ القائم على CPU، حيث يتم عادةً تشغيل تجربة واحدة فقط في وقت واحد، يتيح تسريع GPU تشغيل عدة تجارب HPO بشكل متوازي، مما يقلل بشكل كبير من وقت التدريب. تقنية Stacking Generalization تقنية Stacking Generalization هي طريقة مجمعة فعالة تستخدم بشكل واسع في التجارب، بما في ذلك العديد من مسابقات Kaggle. وهي تجمع بين قوة عدة نماذج مختلفة لتحسين الدقة التنبؤية الكلية، لكنها غالبًا ما تُهمل في التطبيقات العملية بسبب تكلفتها الحاسوبية. الشكل 1 يوضح هندسة Stacking التي تم تنفيذها في هذا المشروع. على المستوى الأساسي، استخدمنا ثلاثة نماذج مختلفة: Random Forest، K-Nearest Neighbors (KNN)، و Logistic Regression. تم تمرير التنبؤات من هذه النماذج الأساسية إلى نموذج KNN متقدم، الذي قام بالتصنيف النهائي بناءً على النتائج المدمجة. لم تكن البيانات المستخدمة في تجاربنا كبيرة جدًا، حيث اشتملت على مليون عينة وتسعة خصائص. هذا الإعداد مكّننا من الاستفادة من نقاط القوة الخاصة بكل نموذج أساسي وتحسين الدقة التنبؤية الكلية من خلال Stacking. الشفرة التالية تظهر كيف تم إعداد خط الأنابيب لدينا باستخدام النماذج الثلاثة الأساسية، مع نموذج KNN كنموذج متقدم. لمزيد من التفاصيل، يمكنك مراجعة الدفتر المرافق Jupyter Notebook. ```python %load_ext cuml.accel تحميل مكتبات cuML from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier تعريف النماذج الأساسية (النماذج من المستوى 0) base_models = [ ("logistic_regression", LogisticRegression(lr_study.best_params, max_iter=20000, tol=1e-3)), ("random_forest", RandomForestClassifier(rf_study.best_params, random_state=42)), ("k_nearest_neighbors", KNeighborsClassifier(**knn_study.best_params)) ] دالة لإنشاء الخصائص المتقدمة للدمج def generate_meta_features_for_stacking(base_models, X, y, X_meta): kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) meta_features = cp.zeros((X_meta.shape[0], len(base_models))) for i, (name, model) in enumerate(base_models): meta_predictions = cp.zeros((X.shape[0],)) print("Model name: ", name) for train_idx, val_idx in kfold.split(X, y): model.fit(cp.array(X.iloc[train_idx]), cp.array(y.iloc[train_idx])) predictions = model.predict(cp.array(X.iloc[val_idx])) meta_predictions[val_idx] = predictions.ravel() model.fit(cp.array(X), cp.array(y)) predictions = model.predict(cp.array(X_meta)) meta_features[:, i] = cp.array(predictions).ravel() return meta_features meta_train يستخدم التنبؤات خارج الطي لمنع التسريب meta_train = generate_meta_features_for_stacking(base_models, X_train_scaled, y_train_df, X_train_scaled) meta_valid يستخدم التنبؤات من النماذج الأساسية المدربة على مجموعة البيانات الكاملة meta_valid = generate_meta_features_for_stacking(base_models, X_train_scaled, y_train_df, X_valid_scaled) ``` كما يظهر في الشكل 2، أدت تقنية Stacking Generalization إلى تحسن عام بنسبة 0.28% في دقة التنبؤ، المقاسة باستخدام التحقق المتقاطع المصنف 5 مرات. تحسين المعلمات الفوقية (Hyperparameter Optimization) لمزيد من تعزيز أداء مجموعتنا المجمعة، طبقنا HPO على كل من النماذج الأساسية والنماذج المتقدمة. في التنفيذ، اخترنا أفضل نموذج أساسي ل GENERATE out-of-fold predictions، والتي تم دمجها لإنشاء مجموعة بيانات متقدمة جديدة. استخدمت هذه المجموعة الجديدة لتشغيل HPO على نموذج KNN المتقدم، مما أدى إلى تقنين أداءه بشكل أكبر. لتنفيذ HPO، استخدمنا مكتبة Optuna، مع التركيز على تحسين دقة التصنيف كمعيار. من المهم ملاحظة أن عملية HPO بأكملها تم تسريعها باستخدام GPU من خلال تفعيل نواة cuML باستخدام %load_ext cuml.accel. وبالتالي، يظل الرمز بنفس القواعد المستخدمة في scikit-learn. الشفرة التالية توضح كيفية تنفيذ HPO لنموذج Logistic Regression. يمكن تطبيق نفس النهج على نماذج Random Forest، KNN، و KNN المتقدم. لمزيد من التفاصيل، يمكنك مراجعة الدفتر المرافق Jupyter Notebook. ```python %load_ext cuml.accel تحميل مكتبات cuML from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier تعريف دالة تدريب وتقييم النموذج def train_and_eval(C=1, penalty='l2'): lr = LogisticRegression(C=C, penalty=penalty, max_iter=20000, tol=1e-3) lr.fit(X_train_scaled, y_train_df) y_proba = lr.predict_proba(X_valid_scaled)[:, 1] # حساب درجة الدقة score = cp.round(lr.score(cp.asnumpy(X_valid_scaled), cp.asnumpy(y_valid_df)) * 100, 2) return score تعريف الدالة الهدف لOptuna لضبط المعلمات الفوقية def objective(trial): C = trial.suggest_float("C", 1e-2, 1e2, log=True) penalty = trial.suggest_categorical("penalty", ["l1", "l2"]) return train_and_eval(C, penalty) إنشاء دراسة Optuna لتعظيم درجة الدقة lr_study = optuna.create_study( direction="maximize", study_name="optuna_logistic_acc_score", sampler=optuna.samplers.RandomSampler(seed=142), ) إطلاق عملية ضبط المعلمات الفوقية مع الدالة الهدف المحددة lr_study.optimize(objective, n_trials=40) طباعة أفضل مجموعة من المعلمات الفوقية ودرجة التقييم المقابلة print(f"Best params: {lr_study.best_params}") print(f"Best accuracy score: {lr_study.best_value}") ``` كما يظهر في الشكل 3، أدى تطبيق HPO على النماذج الأساسية والنماذج المتقدمة إلى تحسن في دقة التنبؤ بنسبة 1.44% مقارنة بالنماذج بدون HPO. مزايا استخدام تسريع GPU مع cuML لتعزيز سرعة التنفيذ، خاصة أثناء HPO لأربع نماذج مختلفة، فإن استخدام مكتبة cuML المُسرّعة بالGPU يعتبر مفيدًا للغاية. فهي تسمح بإكمال عدة تكرارات في نفس الفترة الزمنية التي يحتاجها تنفيذ CPU لتجربة واحدة فقط. في سياقنا، استطعنا إجراء حوالي 40 تكرارًا لكل نموذج، حيث استغرق كل تكرار حوالي 5 ثوانٍ، بينما يستغرق تكرار واحد على CPU حوالي 5 دقائق. بالإضافة إلى ذلك، فإن تفعيل تسريع GPU أمر بسيط—فقط قم بتضمين الأمر %load_ext cuml.accel في رمزك، وهو يوفر تكاملًا سلسًا مع scikit-learn. بدء العمل يمكن تحسين دقة النظام من خلال دمج تقنية Stacking Generalization مع HPO. الحل المقترح يستخدم مكتبة cuML المُسرّعة بالGPU، مما يمكّن علماء البيانات من تنفيذ عمليات HPO عميقة لكل نموذج في مكدس Stacking Generalization. توافق مكتبة cuML مع قواعد الرمز في scikit-learn يُمكّن المطورين من دمج هذه التقنية في بيئات الإنتاج بسلاسة. يعمل التكامل ليس فقط على تطوير نماذج أفضل، بل يسرع أيضًا عملية التكرار، مما يمكّن علماء البيانات والمطورين من تحقيق تنفيذ أسرع وأداء نموذج أفضل في التطبيقات الحقيقية. لتجربة هذا النهج في تطبيقك الخاص، قم بتنزيل أحدث إصدار من NVIDIA cuML. يمكنك دائمًا مشاركة آرائك على Slack في قناة #RAPIDS-GoAi. لمعرفة المزيد عن تسريع cuML بدون تغييرات في الرمز، راجع NVIDIA cuML يجلب تسريعًا بدون تغييرات في الرمز إلى scikit-learn. للمزيد من الأمثلة على هذه القدرة، راجع الدفتر المُرافق في Google Colab. يتم تثبيت أحدث إصدار من cuML مع قدرات تسريع الرمز الصفرية مسبقًا في Google Colab. لدورات تدريبية ذاتية وتوجيهية، راجع المسار التعليمي DLI لعلم البيانات.

Related Links