Xgboost: [ميزة جديدة] القيود الرتيبة في بناء الشجرة

تم إنشاؤها على ٢٧ أغسطس ٢٠١٦  ·  46تعليقات  ·  مصدر: dmlc/xgboost

تلقيت بعض الطلبات لدعم القيود الرتيبة على ميزة معينة فيما يتعلق بالإخراج ،

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

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

التعليق الأكثر فائدة

هذه الميزة غير موجودة حاليًا في Sklearn api. هل يمكنك أنت أو أي شخص الرجاء المساعدة في إضافته؟ شكرا!

ال 46 كومينتر

يتم توفير نسخة تجريبية في https://github.com/dmlc/xgboost/pull/1516. لاستخدام هذا قبل أن يتم دمجه ، قم باستنساخ الريبو https://github.com/tqchen/xgboost ،

قم بتشغيل الخيارات التالية (من المحتمل أن يكون ذلك ممكنًا عبر python، r API)

monotone_constraints = "(0,1,1,0)"

هناك نوعان من الحجج

  • monotone_constraints هي قائمة بطول عدد الميزات ، 1 تشير إلى زيادة رتيبة ، - 1 تعني تناقص ، 0 تعني عدم وجود قيود. إذا كان أقصر من عدد الميزات ، فسيكون 0 مبطنًا.

    • حاليًا يدعم تنسيق tuple لبيثون ، يمكنك تمرير الأشياء كسلسلة عند استخدام r

أشياء للتحقق

  • [x] لا تتباطأ سرعة معززات الشجرة الأصلية (لقد غيرت بنية الكود قليلاً ، من الناحية النظرية ، فإن تحسين القوالب سيضمّنها ، لكن يلزم تأكيدها)
  • [x] سرعة وصحة الانحدار الرتيب
  • [x] الأداء بإدخال هذا القيد

القيود المعروفة

يدعم حاليًا فقط خوارزمية جشعة دقيقة على نواة متعددة. غير متوفر بعد في النسخة الموزعة

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

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

بناءً على الحديث هنا ، تفرض GBM (حزمة R) الرتابة محليًا فقط.
هل يمكنك توضيح كيفية تطبيق XGBoost للقيود الرتيبة؟
سيكون من الرائع أن يقوم XGBoost بفرض قيود عالمية.

لا أفهم ما تقصده بالقيود المحلية أو الشمولية ، هل يمكنك التفصيل؟

عذرا ، لقد قمت بلصق رابط خاطئ ، ها هو الرابط الصحيح (الرابط)
قد تتبع كل شجرة قيودًا رتيبة فقط في مجموعة فرعية معينة من الميزة المهتمة ، لذلك قد يؤدي تجميع العديد من الأشجار معًا إلى انتهاك الرتابة الكلية على النطاق الكامل لتلك الميزة.

حسنًا ، حسب فهمي ، يتم فرضه عالميًا. أنت مرحب بك لتجربتها.

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

https://github.com/XiaoxiaoWang87/xgboost_mono_test/blob/master/xgb_monotonicity_constraint_testing1-univariate.ipynb

بعض الملاحظات الأولية:

  • بالنسبة لمشكلة انحدار متغير واحد ، يبدو أن القيد الرتيب = +1 يعمل بشكل جيد
  • بالنسبة لمشكلة انحدار متغير واحد ، في مجموعة البيانات الخاصة بي ، لا يبدو أن القيد الرتيب = -1 يعطي دالة تناقص رتيبة. بدلا من ذلك ، يعطي ثابت. ولكن يمكن أن يكون هذا أيضًا بسبب عدم وجود تحسين عند فرض القيد. ليتم التأكيد (وفقًا لاقتراح Tianqi ، حاول قلب مجموعة البيانات وتعيين القيد على +1).
  • يمكن أن تؤدي إضافة القيد (بشكل صحيح) إلى منع فرط التجهيز وتحقيق بعض مزايا الأداء / التفسير.

تبين أنني قدمت خطأ في القيد = -1 الحالة. لقد دفعت إلى الإصلاح ، يرجى معرفة ما إذا كان الإصدار الأحدث يعمل بشكل جيد. يرجى أيضًا التحقق مما إذا كان يعمل عند وجود قيود متعددة

tqchen لقد اختبرت الإصلاح الخاص بك للخلل المتدهور ، ويبدو أنه يعمل الآن.

xgboost-no-constraint
xgboost-with-constraint

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

tqchen لقد اختبرت نموذجًا متغيرين ، أحدهما

params_constrained = params.copy()
params_constrained['updater'] = "grow_monotone_colmaker,prune"
params_constrained['monotone_constraints'] = "(1,-1)"

النتائج جيدة

xgboost-two-vars-increasing
xgboost-two-vars-decreasing

سأحاول أن أجد القليل من الوقت لإجراء بعض اختبارات التوقيت بعد ظهر اليوم.

لقد أجريت تحديثًا على # 1516 للسماح بالكشف التلقائي عن خيارات montone ، والآن يحتاج المستخدم فقط إلى تمرير monotone_constraints = "(0,1,1,0)" ، يرجى التحقق مما إذا كان يعمل.

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

madrury @ XiaoxiaoWang87

تمت إضافة اختبارات لحالة المتغيرات المتعددة هنا:

https://github.com/XiaoxiaoWang87/xgboost_mono_test/blob/master/xgb_monotonicity_constraint_testing2-multivariate.ipynb

  • أؤكد الآن أن كلا من القيد الرتيب = 1 و = -1 يعملان كما هو متوقع.
  • لا يؤدي تقييد الرتابة إلى تدهور واضح في السرعة *
    * السرعة = متوسط ​​[الوقت حتى التوقف المبكر / عدد عمليات التعزيز حتى التوقف المبكر]

no constraint: 964.9 microseconds per iteration
with constraint: 861.7 microseconds per iteration

(يرجى التعليق إذا كان لديك طريقة أفضل لإجراء اختبار السرعة)

  • يجب توخي الحذر عند تقييد الاتجاه لمتغير غير رتيب. يمكن أن يؤدي هذا إلى تدهور الأداء.
  • رؤية تحطم التعليمات البرمجية بسبب Check failed: (wleft) <= (wright) عند اللعب حول معلمات تشعبية مختلفة.

أجريت تجربتي توقيت في دفتر جوبيتر.

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

X = np.random.random(size=(N, K))
y = (5*X[:, 0] + np.sin(5*2*pi*X[:, 0])
     - 5*X[:, 1] - np.cos(5*2*pi*X[:, 1])
     + np.random.normal(loc=0.0, scale=0.01, size=N))

فيما يلي نتائج التوقيت من xgboosts مع وبدون قيود أحادية اللون. لقد أوقفت التوقف المبكر وعززت عددًا محددًا من التكرارات لكل منها.

أولاً بدون قيود رتيبة:

%%timeit -n 100
model_no_constraints = xgb.train(params, dtrain, 
                                 num_boost_round = 2500, 
                                 verbose_eval = False)

100 loops, best of 3: 246 ms per loop

وهنا مع قيود الرتابة

%%timeit -n 100
model_with_constraints = xgb.train(params_constrained, dtrain, 
                                 num_boost_round = 2500, 
                                 verbose_eval = False)

100 loops, best of 3: 196 ms per loop

الاختبار الثاني: بيانات الإسكان في كاليفورنيا من sklearn. بدون قيود

%%timeit -n 10
model_no_constraints = xgb.train(params, dtrain, 
                                 num_boost_round = 2500, 
                                 verbose_eval = False)

10 loops, best of 3: 5.9 s per loop

فيما يلي القيود التي استخدمتها

print(params_constrained['monotone_constraints'])

(1,1,1,0,0,1,0,0)

وتوقيت النموذج المقيد

%%timeit -n 10
model_no_constraints = xgb.train(params, dtrain, 
                                 num_boost_round = 2500, 
                                 verbose_eval = False)

10 loops, best of 3: 6.08 s per loop

@ XiaoxiaoWang87 لقد دفعت علاقات عامة أخرى لتفقد الاختيار على wleft و wright ، يرجى الاطلاع على أنه يعمل.
madrury هل يمكنك أيضًا المقارنة مع الإصدار السابق من XGBoost بدون ميزة التقييد؟

تضمين التغريدة هل يمكنك التوصية بتجزئة الالتزام للمقارنة بها؟ هل يجب علي فقط استخدام الالتزام قبل إضافة القيود الرتيبة؟

نعم ، سيفعل السابق

tqchen عند إعادة إنشاء الإصدار المحدث ، تظهر لي بعض الأخطاء التي لم

إذا حاولت تشغيل نفس الكود كما كان من قبل ، فسأحصل على استثناء ، فإليكم التتبع الكامل:

XGBoostError                              Traceback (most recent call last)
<ipython-input-14-63a9f6e16c9a> in <module>()
      8    model_with_constraints = xgb.train(params, dtrain, 
      9                                        num_boost_round = 1000, evals = evallist,
---> 10                                    early_stopping_rounds = 10)  

/Users/matthewdrury/anaconda/lib/python2.7/site-packages/xgboost-0.6-py2.7.egg/xgboost/training.pyc in train(params, dtrain, num_boost_round, evals, obj, feval, maximize, early_stopping_rounds, evals_result, verbose_eval, learning_rates, xgb_model, callbacks)
    201                            evals=evals,
    202                            obj=obj, feval=feval,
--> 203                            xgb_model=xgb_model, callbacks=callbacks)
    204 
    205 

/Users/matthewdrury/anaconda/lib/python2.7/site-packages/xgboost-0.6-py2.7.egg/xgboost/training.pyc in _train_internal(params, dtrain, num_boost_round, evals, obj, feval, xgb_model, callbacks)
     72         # Skip the first update if it is a recovery step.
     73         if version % 2 == 0:
---> 74             bst.update(dtrain, i, obj)
     75             bst.save_rabit_checkpoint()
     76             version += 1

/Users/matthewdrury/anaconda/lib/python2.7/site-packages/xgboost-0.6-py2.7.egg/xgboost/core.pyc in update(self, dtrain, iteration, fobj)
    804 
    805         if fobj is None:
--> 806             _check_call(_LIB.XGBoosterUpdateOneIter(self.handle, iteration, dtrain.handle))
    807         else:
    808             pred = self.predict(dtrain)

/Users/matthewdrury/anaconda/lib/python2.7/site-packages/xgboost-0.6-py2.7.egg/xgboost/core.pyc in _check_call(ret)
    125     """
    126     if ret != 0:
--> 127         raise XGBoostError(_LIB.XGBGetLastError())
    128 
    129 

XGBoostError: [14:08:41] src/tree/tree_updater.cc:18: Unknown tree updater grow_monotone_colmaker

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

TypeError                                 Traceback (most recent call last)
<ipython-input-15-ef7671f72925> in <module>()
      8                                    monotone_constraints="(1)",
      9                                    num_boost_round = 1000, evals = evallist,
---> 10                                    early_stopping_rounds = 10)  

TypeError: train() got an unexpected keyword argument 'monotone_constraints'

قم بإزالة وسيطة المحدث واحتفظ بوسائط القيد أحادية اللون في المعلمات ، والآن يتم تنشيط محدث القيد الرتيب تلقائيًا عند تقديم قيود أحادية اللون

tqchen ساعدني صديقي amontz في معرفة ذلك فور نشر الرسالة. لقد فسرت تعليقك على أنه تمرير monotone_constraints أنه kwarg إلى .train .

إنه يعمل مع تلك التعديلات. شكرا.

madrury هل يمكنك تأكيد السرعة؟

وأيضًا madrury و @ XiaoxiaoWang87 نظرًا لأن هذه الميزة قريبة الآن من الدمج ، سيكون من الرائع أن تتمكن من التنسيق لإنشاء برنامج تعليمي يقدم هذه الميزة للمستخدمين.

لا يمكننا أخذ دفتر ipy مباشرة إلى الريبو الرئيسي. ولكن يمكن دفع الصور إلى https://github.com/dmlc/web-data/tree/master/xgboost وتخفيض السعر إلى الريبو الرئيسي.

نحتاج أيضًا إلى تغيير تحويل سلسلة واجهة الواجهة الأمامية ، بحيث يمكن تحويل int tuple إلى تنسيق string tuple الذي يمكن قبوله بواسطة الواجهة الخلفية.

@ hetong007 للتغييرات في R و slundberg لـ Julia

tqchen Julia مرفق حاليًا بالإصدار 0.4 من XGBoost ، لذا في المرة القادمة أحتاج إلى استخدامه وأخصص وقتًا ، سأقوم بتحديث الارتباطات إذا لم يكن لدى أي شخص آخر بحلول ذلك الوقت. في هذه المرحلة يمكن أيضًا إضافة هذا التغيير.

فيما يلي المقارنة بين النماذج _ بدون_ قيد رتيب من قبل التنفيذ إلى ما بعده.

الالتزام 8cac37 : قبل تنفيذ القيد الرتيب. '
بيانات محاكاة : 100 loops, best of 3: 232 ms per loop
بيانات كاليفورنيا : 10 loops, best of 3: 5.89 s per loop

الالتزام b1c224 : بعد تنفيذ القيد الرتيب.
بيانات محاكاة : 100 loops, best of 3: 231 ms per loop
بيانات كاليفورنيا : 10 loops, best of 3: 5.61 s per loop

يبدو لي تسريع كاليفورنيا بعد التنفيذ مريبًا ، لكنني جربته مرتين في كل اتجاه ، وهو ثابت.

سأكون سعيدًا لأخذ لقطة لكتابة برنامج تعليمي. سألقي نظرة حول الوثائق الموجودة وأضع شيئًا ما معًا في الأيام القليلة القادمة.

هذا شيء عظيم ، العلاقات العامة الآن مدمجة رسميًا مع السيد. نتطلع لرؤية البرنامج التعليمي

شكراmadrury. اتطلع اليه. اسمحوا لي أن أعرف ما يمكنني المساعدة. سأكون بالتأكيد على استعداد لإجراء المزيد من الدراسات حول هذا الموضوع.

سوف أقوم بتحسينه غدا. أنا أشعر بالفضول فقط حول سبب التواصل مع C ++ عبر سلسلة بدلاً من مصفوفة.

أقوم باختبار من R. لقد قمت بتوليد بيانات ذات متغيرين بشكل عشوائي وأحاول أن أقوم بالتنبؤ.

ومع ذلك ، وجدت ذلك

  1. xgboost لا يقيد المسبق.
  2. المعلمة monotone_constraints تجعل التوقع مختلفًا بعض الشيء.

يرجى الإشارة إليها إذا ارتكبت أي أخطاء.

الكود المطلوب إعادة إنتاجه (تم اختباره على أحدث إصدار من github ، وليس من drat ):

set.seed(1024)
x1 = rnorm(1000, 10)
x2 = rnorm(1000, 10)
y = -1*x1 + rnorm(1000, 0.001) + 3*sin(x2)
train = cbind(x1, x2)

bst = xgboost(data = train, label = y, max_depth = 2,
                   eta = 0.1, nthread = 2, nrounds = 10,
                   monotone_constraints = '(1,-1)')

pred = predict(bst, train)
ind = order(train[,1])
pred.ord = pred[ind]
plot(train[,1], y, main = 'with constraint')
pred.ord = pred[order(train[,1])]
lines(pred.ord)

wc

bst = xgboost(data = train, label = y, max_depth = 2,
                   eta = 0.1, nthread = 2, nrounds = 10)

pred = predict(bst, train)
ind = order(train[,1])
pred.ord = pred[ind]
plot(train[,1], y, main = 'without constraint')
pred.ord = pred[order(train[,1])]
lines(pred.ord)

woc

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

@ hetong007 لجعل

  • قمت بإنشاء مصفوفة تحتوي على شبكة إحداثيات x أردت أن أتنبأ بهذا المتغير ثم انضم إلى مخطط الخط. سيستخدم هذا seq في R.
  • ضع جميع المتغيرات الأخرى مساوية لمتوسط ​​قيمتها في بيانات التدريب. سيكون هذا شيئًا مثل colmeans في R.

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

def plot_one_feature_effect(model, X, y, idx=1):

    x_scan = np.linspace(0, 1, 100)    
    X_scan = np.empty((100, X.shape[1]))
    X_scan[:, idx] = x_scan

    left_feature_means = np.tile(X[:, :idx].mean(axis=0), (100, 1))
    right_feature_means = np.tile(X[:, (idx+1):].mean(axis=0), (100, 1))
    X_scan[:, :idx] = left_feature_means
    X_scan[:, (idx+1):] = right_feature_means

    X_plot = xgb.DMatrix(X_scan)
    y_plot = model.predict(X_plot, ntree_limit=bst.best_ntree_limit)

    plt.plot(x_scan, y_plot, color = 'black')
    plt.plot(X[:, idx], y, 'o', alpha = 0.25)

إليك كيف أفعل مخططات الاعتماد الجزئي (لنموذج تعسفي):

  • امسح شبكة من القيم للميزة X.
  • لكل قيمة شبكة للميزة X:

    • اضبط العمود X للميزة بالكامل (كل الصفوف) على هذه القيمة. الميزات الأخرى لم تتغير.

    • قم بعمل تنبؤات لجميع الصفوف.

    • خذ متوسط ​​التنبؤ.

  • تمنحك أزواج (قيمة خاصية X ، متوسط ​​التنبؤ) الناتجة تبعية جزئية لميزة X.

رمز:

def plot_partial_dependency(bst, X, y, f_id):

    X_temp = X.copy()

    x_scan = np.linspace(np.percentile(X_temp[:, f_id], 0.1), np.percentile(X_temp[:, f_id], 99.5), 50)
    y_partial = []

    for point in x_scan:

        X_temp[:, f_id] = point

        dpartial = xgb.DMatrix(X_temp[:, feature_ids])
        y_partial.append(np.average(bst.predict(dpartial)))

    y_partial = np.array(y_partial)

    # Plot partial dependence

    fig, ax = plt.subplots()
    fig.set_size_inches(5, 5)
    plt.subplots_adjust(left = 0.17, right = 0.94, bottom = 0.15, top = 0.9)

    ax.plot(x_scan, y_partial, '-', color = 'black', linewidth = 1)
    ax.plot(X[:, f_id], y, 'o', color = 'blue', alpha = 0.02)

    ax.set_xlim(min(x_scan), max(x_scan))
    ax.set_xlabel('Feature X', fontsize = 10)    
    ax.set_ylabel('Partial Dependence', fontsize = 12)

شكرا على التوجيه! أدركت أنني ارتكبت خطأً سخيفًا في المؤامرة. إليك اختبار آخر على بيانات أحادية المتغير ، تبدو الحبكة جيدة:

set.seed(1024)
x = rnorm(1000, 10)
y = -1*x + rnorm(1000, 0.001) + 3*sin(x)
train = matrix(x, ncol = 1)

bst = xgboost(data = train, label = y, max_depth = 2,
               eta = 0.1, nthread = 2, nrounds = 100,
               monotone_constraints = '(-1)')
pred = predict(bst, train)
ind = order(train[,1])
pred.ord = pred[ind]
plot(train[,1], y, main = 'with constraint', pch=20)
lines(train[ind,1], pred.ord, col=2, lwd = 5)

rplot

bst = xgboost(data = train, label = y, max_depth = 2,
               eta = 0.1, nthread = 2, nrounds = 100)
pred = predict(bst, train)
ind = order(train[,1])
pred.ord = pred[ind]
plot(train[,1], y, main = 'without constraint', pch=20)
lines(train[ind,1], pred.ord, col=2, lwd = 5)

woc

@ hetong007 لذا فإن الهدف في واجهة R هو تمكين المستخدم من تمرير مجموعة R بجانب السلاسل

monotone_constraints=c(1,-1)

يرجى إعلامنا عندما تكون العلاقات العامة البرنامج التعليمي

@ hetong007 أنت أيضًا أكثر من موضع ترحيب لتقديم إصدار r-blogger

tqchen آسف يا شباب ، لقد كنت في رحلة عمل طوال الأسبوع.

لقد أرسلت بضع طلبات سحب مع برنامج تعليمي رتيب القيد. واسمحوا لي أن أعرف ما هو رأيك ، أنا سعيد بأي نقد أو نقد.

نأمل أن يكون من المناسب طرح هذا السؤال هنا: هل سيعمل هذا الآن إذا قمنا بالتحديث باستخدام git clone --recursive https://github.com/dmlc/xgboost المعتاد؟

أسأل كما رأيت البرنامج التعليمي الجديد ولكن لا شيء جديد حول تغيير في الكود نفسه. شكرا لكم جميعا!

نعم ، يتم دمج الميزة الجديدة قبل دمج البرنامج التعليمي

مرحبا،

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

فيما يلي مثال بسيط لكسر الرتابة:

"
df <- data.frame (y = c (2، rep (6،100)، 1، rep (11،100)) ،
x1 = c (rep (1،101)، rep (2،101))، x2 = c (1، rep (2،100)، 1، rep (2،100)))

مكتبة (xgboost)
set.seed (0)
XGB <- xgboost (data = data.matrix (df [، - 1])، label = df [، 1]،
الهدف = " reg: linear " ،
bag.fraction = 1 ، nround = 100 ، monotone_constraints = c (1،0) ،
إيتا = 0.1)

sans_corr <- data.frame (x1 = c (1،2،1،2)، x2 = c (1،1،2،2))

توقع sans_corr $ <- توقع (XGB ، مصفوفة البيانات (sans_corr))
"

آمل أن يكون فهمي للرمز الخاص بك ومثالي غير خاطئ

هذه الميزة غير موجودة حاليًا في Sklearn api. هل يمكنك أنت أو أي شخص الرجاء المساعدة في إضافته؟ شكرا!

من الممكن فرض الرتابة العامة على متغير ، دون تحديد ما إذا كان ينبغي زيادة أو نقصان؟

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

يبدو أن هذه الميزة غير صالحة عند استخدام "tree_method": "اصمت". tqchen أي مساعدة؟ شكرا لكم جميعا.

كيف يعمل القيد لهدف متعدد الفئات مثل mlogloss؟ هل قيد الرتابة مدعوم لفقدان الطبقات المتعددة؟ إذا كانت الإجابة بنعم ، فكيف يتم تنفيذها. (أما كل فصل فيوجد شجرة)

هل هناك أي مستند تقني حول خوارزمية Monoticity المطبقة في XGBOOST؟ هل هي عالمية أم محلية؟ الوسائل المحلية الخاصة بعقد معينة ولكن العقد الموجودة في أجزاء أخرى من الشجرة قد تخلق انتهاكًا للرتابة الكلية. كما يمكن لأي شخص مساعدتي في فهم السطر L412-417 . لماذا يتم تحديد "w" - العلوي والسفلي. كيف يساعد هذا في الحفاظ على الرتابة. الخط 457 - لماذا يتم استخدام "mid"؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات