كيفية اختيار عدد المقدرات لتعزيز التدرج

في علم البيانات ، هناك العديد من الخوارزميات المتاحة للاستخدام هذه الأيام. لذلك ، تتمثل إحدى التقنيات المفيدة في دمجها في نموذج واحد للحصول على أفضل النتائج من كل منها ، مما يؤدي إلى نموذج أكثر دقة.

باستخدام Scikit-Learn ، ستجد خوارزمية Random Forest ، وهي نوع التعبئة لنموذج المجموعة. من ناحية أخرى ، ستجد أيضًا نماذج التعزيز ، التي تدرب المقدرين بالتسلسل ، حيث يتم تمرير نتيجة أحد النماذج إلى النموذج التالي ، والتي ستحاول تحسين التنبؤات ، حتى تصل إلى النتيجة المثلى.

عند إنشاء مقدر تعزيز التدرج ، ستجد هذا المعامل التشعبي n_estimator=100 بقيمة افتراضية 100 شجرة يتم إنشاؤها للوصول إلى نتيجة. في كثير من الأحيان ، قمنا فقط بتعيين هذا على الإعداد الافتراضي أو ربما زيادته حسب الحاجة ، حتى باستخدام تقنيات البحث الشبكي.

في هذا المنشور ، سنجد طريقة بسيطة للوصول إلى رقم واحد لاستخدامه في تدريب نموذجنا.

يمكن تحميل التدرج اللوني من Scikit-Learn باستخدام هذا الفصل from sklearn.ensemble import GradientBoostingRegressor. يمكن استخدام خوارزمية تعزيز التدرج إما للتصنيف أو لنماذج الانحدار. وهو مقدر قائم على الشجرة - مما يعني أنه يتكون من العديد من أشجار القرار.

نتيجة شجرة 1 سيولد أخطاء. سيتم استخدام هذه الأخطاء والمدخلات لـ شجرة 2. مرة أخرى ، سيتم استخدام أخطاء النموذج الأخير ومدخلات النموذج التالي ، حتى تصل إلى n_estimators .

سيتناسب كل نموذج مع أخطاء النموذج السابق. الصورة من قبل المؤلف.

نظرًا لأن كل مقدر سوف يتناسب مع الخطأ السابق ، فإن التوقع هو أن مجموعة التنبؤات ستكون أفضل من أي مقدر وحده. بعد كل تكرار ، نجعل النموذج أكثر تعقيدًا ، مع تقليل التحيز ولكن زيادة التباين ، على الجانب الآخر. لذلك يجب أن نعرف متى نتوقف.

دعونا نرى كيف نفعل ذلك الآن.

رمز هذا التمرين بسيط. كل ما يجب علينا فعله هو حلقة بعد كل تكرار والتحقق من أي واحدة لدينا أقل خطأ.

لنبدأ باختيار مجموعة بيانات. سوف نستخدم ملف حوادث_السيارات مجموعة البيانات الأصلية من مكتبة seaborn (لذا فهي بيانات مفتوحة بموجب ترخيص BDS).

# مجموعة البيانات
df = sns.load_dataset ('car_crashes')

فيما يلي نظرة سريعة على البيانات. سنحاول تقدير total المبلغ باستخدام الميزات الأخرى كمتنبئات. نظرًا لأنه ناتج رقم حقيقي ، فإننا نتحدث عن نموذج الانحدار.

مجموعة بيانات حوادث السيارات، من البحر. الصورة من قبل المؤلف.

النظر بسرعة في الارتباطات.

# الارتباطات
df.corr (). style.background_gradient (cmap = 'coolwarm')
الارتباطات في مجموعة البيانات. الصورة من قبل المؤلف.

حسنًا ، لا توجد علاقة خطية رئيسية متعددة الخطوط. يمكننا أن نرى أن ins_premium و ins_losses لا ترتبط ارتباطًا وثيقًا بامتداد total ، لذلك لن نأخذها في الاعتبار في النموذج.

إذا تحققنا من البيانات المفقودة ، فلا يوجد أي منها

# مفقود
df.isnull (). sum ()
0

رائع ، فلنقم بتقسيم البيانات الآن.

# X و y
X = df.drop (['ins_premium'، 'ins_losses'، 'abbrev'، 'total']، المحور = 1)
y = df ['total']
# اختبار القطار
X_train، X_test، y_train، y_test = train_test_split (X، y، test_size = 0.3، random_state = 22)

يمكننا إنشاء خط أنابيب لقياس البيانات ونمذجتها (ليس من الضروري جدًا قياس هذه البيانات ، نظرًا لأنها في نفس المقياس بالفعل ، على أساس العشرات). بعد ذلك ، نلائم البيانات مع النموذج ونتوقع النتائج.

أنا أستخدم 500 مقدر مع أ learning_rate من 0.3.

معدل التعلم هو حجم الخطوة التي نتخذها للوصول إلى الحد الأدنى من الخطأ. إذا استخدمنا قيمة عالية جدًا ، فقد نجتاز الحد الأدنى. إذا استخدمنا رقمًا صغيرًا جدًا ، فقد لا نقترب منه. لذا ، فإن القاعدة الأساسية التي يمكنك وضعها في الاعتبار هي: إذا كان لديك عدد كبير من المقدرين ، فيمكنك استخدام قيم أقل لمعدل التعلم. إذا كان لديك عدد قليل من المقدرين ، ففضل استخدام قيم أعلى لمعدل التعلم.

الخطوات = [('scale'، StandardScaler ())،
('GBR'، GradientBoostingRegressor (n_estimators = 500، Learning_rate = 0.03))]
# خط الأنابيب المثيل والملاءمة
الأنابيب = خط الأنابيب (الخطوات). تناسب (X_train ، y_train)
# يتنبأ
preds = pipe.predict (X_test)

الآن ، التقييم.

# RMSE للتنبؤات
طباعة (f'RMSE: {round (np.sqrt (mean_squared_error (y_test، preds))، 1)} ')
[خارج]: RMSE: 1.1# متوسط ​​قيم Y الحقيقية
print (f'Data y mean: {round (y.mean ()، 1)} ')
[OUT]: البيانات y يعني: 15.8

جيد. تبلغ نسبة RMSE الخاصة بنا 6.9٪ من المتوسط. لذلك نحن بعيدون عن هذا كثيرًا ، في المتوسط.

الآن دعنا نتحقق من طريقة لضبط نموذجنا عن طريق اختيار العدد الأمثل من المقدرين لتدريبهم والذي سيعطينا أقل معدل خطأ.

كما قلت ، ليس علينا حقًا قياس هذه البيانات لأنها في نفس النسبة بالفعل. لذلك دعونا نلائم النموذج.

#نموذج
gbr = GradientBoostingRegressor (n_estimators = 500 ، معدل التعلم = 0.3). fit (X_train ، y_train)

الآن هي الأشياء الجيدة. هناك طريقة في تعزيز التدرج تسمح لنا بالتكرار على تنبؤات كل مقدر تم تدريبه ، من 1 إلى 500. لذلك ، سننشئ حلقة تمر عبر 500 مقدر في gbr نموذج ، يتوقع النتائج باستخدام الطريقة staged_predict()، بحساب متوسط ​​الخطأ التربيعي وتخزين النتيجة في القائمة errors.

# حلقة لأفضل رقم
الأخطاء = [mean_squared_error (y_test، preds) للمفترسات في gbr.staged_predict (X_test)]
# العدد الأمثل للمقدرات
optimal_num_estimators = np.argmin (أخطاء) + 1

بعد ذلك ، يمكننا رسم النتيجة.

#حبكة
g = sns.lineplot (x = النطاق (500) ، y = الأخطاء)
g.set_title (f'Best عدد المقدرات في {best_n_estimators} '، الحجم = 15) ؛
أفضل عدد من المقدرين. الصورة من قبل المؤلف.

نرى أن أقل معدل للخطأ هو 34 مقدرًا. لذلك ، دعنا نعيد تدريب نموذجنا باستخدام 34 مقدرًا ونقارنه بالنتيجة من النموذج المدرب مع خط الأنابيب.

# إعادة التدريب
gbr = GradientBoostingRegressor (n_estimators = 34 ، معدل التعلم = 0.3). fit (X_train ، y_train)
# التوقعات
preds2 = gbr.predict (X_test)

التقييم ...

# RMSE للتنبؤات
طباعة (f'RMSE: {round (np.sqrt (mean_squared_error (y_test، preds2))، 1)} ')
[خارج]: RMSE: 1.0
# البيانات Y يعني
print (f'Data y mean: {round (y.mean ()، 1)} ')
[OUT]: البيانات y يعني: 15.8

لقد انخفضنا من 6.9٪ إلى 6.3٪ الآن. تقريبا. 9٪ أفضل. دعونا نلقي نظرة على بعض التوقعات.

تنبؤات من كلا النموذجين. الصورة من قبل المؤلف.

نتائج مثيرة للاهتمام. بعض تنبؤات النموذج الثاني أفضل من الأولى.

لقد تعلمنا كيفية تحديد أفضل عدد من المقدرات لتعديل أ GradientBoostingRegressor من Scikit-Learn. هذه المعلمة الفائقة يمكن أن تحدث فرقًا في هذا النوع من نموذج المجموعة ، الذي يدرب المقدرين بالتسلسل.

في بعض الأحيان ، بعد عدة تكرارات ، يمكن أن يبدأ النموذج في التجهيز الزائد ، وبالتالي سيبدأ في زيادة التباين كثيرًا ، مما يؤثر على التنبؤات.

لقد رأينا أن حلقة بسيطة يمكن أن تساعدنا في إيجاد الحل الأمثل في هذه الحالة. ولكن ، بالتأكيد ، بالنسبة لمجموعات البيانات الكبيرة ، قد يكون حسابها مكلفًا ، لذلك قد تكون الفكرة أقل n_estimators في البداية ومعرفة ما إذا كان بإمكانك الوصول إلى الحد الأدنى من الخطأ قريبًا بما يكفي.

وهنا أكمل التعليمات البرمجية في جيثب.

إذا أعجبك هذا المحتوى ، فاتبع مدونتي.

تجدني على لينكدين:.

استند هذا التمرين إلى كتاب نصي ممتاز من تأليف Aurélien Géron ، في المرجع.

كيفية اختيار عدد المقدرات لتعزيز التدرج المعاد نشره من المصدر https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891؟source=rss—-7f60cf5620c9— 4 عبر https://towardsdatascience.com/feed

<!–

->

الطابع الزمني:

اكثر من مستشارو Blockchain