Evalml: BalancedClassificationDataCVSplit ينتج تقسيمات مختلفة في كل مرة يتم استدعاؤها

تم إنشاؤها على ١٦ مارس ٢٠٢١  ·  3تعليقات  ·  مصدر: alteryx/evalml

ريبرو

import joblib
from evalml.demos import load_fraud
from evalml.preprocessing.data_splitters import BalancedClassificationDataCVSplit

splitter = BalancedClassificationDataCVSplit(n_splits=3, random_seed=0, shuffle=True)

X, y = load_fraud(5000)
X = X.to_dataframe()
y = y.to_series().astype("int")

for train, test in splitter.split(X, y):
    print((joblib.hash(train), joblib.hash(test)))

# Output
('75f1b95d7ce307ac6c793055330969aa', '8c89fe1a592c50a700b6d5cbb02dba8b')
('f8c849bbfbed37c13f66c5c742e237cb', '9c4879fb550fded8be9ac03e95a1bf95')
('cdc21f0d6bbf45459c9695258f7f04dc', '5b575765bbe176e732b8eb4dc1bf2822')

for train, test in splitter.split(X, y):
    print((joblib.hash(train), joblib.hash(test)))

# Output
('bf462b82af243c552ac48acad2dfd748', '8c89fe1a592c50a700b6d5cbb02dba8b')
('b8341b536c63c7957c099b05e315f49c', '9c4879fb550fded8be9ac03e95a1bf95')
('780e74673b601790037fc0b17dde56fe', '5b575765bbe176e732b8eb4dc1bf2822')

for train, test in splitter.split(X, y):
    print((joblib.hash(train), joblib.hash(test)

# Output
('385f6c538568ad3a33cf84f61d94144c', '8c89fe1a592c50a700b6d5cbb02dba8b')
('8db65d0a3bdf87ae0f135b9766a260dd', '9c4879fb550fded8be9ac03e95a1bf95')
('2a7293fc1308b8a572091d7c76d20205', '5b575765bbe176e732b8eb4dc1bf2822')

هذا يختلف عن سلوك sklearn splitter:

from sklearn.model_selection import StratifiedKFold

kfold = StratifiedKFold(n_splits=3, random_state=0, shuffle=True)

for train, test in kfold.split(X, y):
    print((joblib.hash(train), joblib.hash(test)))

#Output
('6c30ee6a11803927024354405389506a', '8c89fe1a592c50a700b6d5cbb02dba8b')
('df0a70e2e6ca783f12461e8c82a26ad4', '9c4879fb550fded8be9ac03e95a1bf95')
('2898e4b3d3621b436641016499f4aafb', '5b575765bbe176e732b8eb4dc1bf2822')

for train, test in kfold.split(X, y):
    print((joblib.hash(train), joblib.hash(test)))

# Output
('6c30ee6a11803927024354405389506a', '8c89fe1a592c50a700b6d5cbb02dba8b')
('df0a70e2e6ca783f12461e8c82a26ad4', '9c4879fb550fded8be9ac03e95a1bf95')
('2898e4b3d3621b436641016499f4aafb', '5b575765bbe176e732b8eb4dc1bf2822')

أعتقد أن هذا يمثل مشكلة لسببين:

  1. نظرًا لأن BalancedClassificationDataCVSplit هو التقسيم الافتراضي في automl ، فهذا يعني أن خطوط الأنابيب لدينا يتم تقييمها على تقسيمات مختلفة
  2. نظرًا لأن split يعدل حالة مُقسم البيانات ، فهذا يعني أنه سيكون لدينا نتائج مختلفة بين المحركات المتسلسلة والمتوازية.
bug

ال 3 كومينتر

شكرا لتوضيح هذا.

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

نصيحتي: لا تفعل شيئًا. على هذا النحو ، إغلاق.

freddyaboulton إذا كنت لا توافق على هذا السلوك ، فلنتخلص منه ، أعني الحديث 😅

dsherry أعتقد أن هذا يستحق التغيير لسببين:

  1. يقدم تباينات للبحث الآلي لأنه يتم تقييم خطوط الأنابيب المختلفة بناءً على بيانات مختلفة. هذا يجعل جدول التصنيف مضللًا بعض الشيء لأن الدرجات لا تُحسب على نفس البيانات.
  2. إنه أمر سيء بالنسبة للبحث التلقائي المتوازي

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

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

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

خطة المضي قدما:

  1. أصلح هذه المشكلة عن طريق تعديل BalancedClassificationDataCVSplit
  2. على المدى الطويل ، نود أن نكتب اختبارات تتحقق من أننا لا نقوم بتغذية انقسامات مختلفة إلى خطوط أنابيب مختلفة في بحث تلقائي.

شكرا للجميع على المناقشة!

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