ريبرو
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')
أعتقد أن هذا يمثل مشكلة لسببين:
split
يعدل حالة مُقسم البيانات ، فهذا يعني أنه سيكون لدينا نتائج مختلفة بين المحركات المتسلسلة والمتوازية.شكرا لتوضيح هذا.
شخصيا ، هذا السلوك لا يزعجني. طالما أننا في كل مرة نبدأ فيها بذرة معينة ، نحصل على نفس تسلسل المخرجات بعد تلك النقطة ، فنحن جيدون. سأكون قلقًا إذا لم نحترم البذرة العشوائية ؛ ولكن هذا ليس ما تتبعه هذه القضية.
نصيحتي: لا تفعل شيئًا. على هذا النحو ، إغلاق.
freddyaboulton إذا كنت لا توافق على هذا السلوك ، فلنتخلص منه ، أعني الحديث 😅
dsherry أعتقد أن هذا يستحق التغيير لسببين:
إنه أمر سيء بالنسبة للبحث التلقائي المتوازي
اسمحوا لي أن أشرح 2. مع السلوك الحالي ، من المتوقع أن يقوم المحرك المتسلسل بتعديل حالة مقسم البيانات خلال البحث. في التقييم المتوازي ، نجمع فاصل البيانات ونرسله إلى العمال لحساب الانقسام. نظرًا لأن العمال يحصلون على نسخة من جهاز التقسيم ، فإنهم لا يقومون بتعديل حالة موزع البيانات الأصلي.
يقدم هذا اختلافًا في السلوك بين المحركات المتسلسلة والمتوازية لأن الانقسامات لن تتطابق اعتمادًا على الترتيب الذي يتم فيه تقييم خط الأنابيب! هذا يعني أن نفس مجموعة خطوط الأنابيب / المعلمة ستحصل على نتائج مختلفة في المحرك المتسلسل والمحرك المتوازي وأعتقد أن هذا غير مرغوب فيه.
في رأيي ، تعتبر النقطة 1 سببًا كافيًا لإصلاح ذلك لأنه يجب تقييم جميع خطوط الأنابيب لدينا على نفس البيانات إذا أردنا أن نكون قادرين على مقارنتها بشكل هادف. لكن بينما نتحرك نحو التقييم المتوازي ، أعتقد أنه من المهم أن نتأكد من أن تعديل الحالة العالمية ليس جزءًا من سلوكنا المتوقع.
خطة المضي قدما:
BalancedClassificationDataCVSplit
شكرا للجميع على المناقشة!