اذهب إلى المحتوى

السؤال

Recommended Posts

  • 1
نشر

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

from sklearn.model_selection import ShuffleSplit
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import make_blobs
# إنشاء داتاسيت مزيفة ب10 عينات و3 فئات
X, y = make_blobs(n_samples=10, random_state=2021) # y=array([1, 1, 2, 0, 1, 2, 0, 2, 0, 0])
# ShuffleSplit إنشاء كائن من الكلاس
# حددنا عدد التقسيمات ب  5 وهو العدد الافتراضي
# وحددنا حجم عينة الاحتبار ب20 في المئة
cv = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
# لتخزين النتائج من كل تقسيمة 
y_true, y_pred = list(), list()
# عدد التقسيمات
sp=cv.get_n_splits(X)
# عملية التقسيم
for train_ix, test_ix in cv.split(X):
    # تقسيم البيانات
    X_train, X_test = X[train_ix, :], X[test_ix, :]
    y_train, y_test = y[train_ix], y[test_ix]
    # تدريب النموذج
    model = RandomForestClassifier(random_state=44)
    model.fit(X_train, y_train)
    # توقع النموذج
    yhat = model.predict(X_test)
    # تخزين النتيجة
    for i in range(0,len(y_test)):
        y_true.append(y_test[i])
        y_pred.append(yhat[i])
# حساب الدقة
acc = accuracy_score(y_true, y_pred)
print('Accuracy: %.3f' % acc)# Accuracy: 1.000

لاحظ كيف أنه قمنا بتحديد عدد معين من التقسيمات وهو 5 وحددنا نسبة مئوية للعينات التي سيتم استخدامها للاختبار في كل تقسيمة وهو 20%، ثم أدرب النموذج على بيانات التدريب وأقوم بحساب القيمة المتوقعة على عينات الاختبار وأضعها في  y_pred  وأضع القيم الحقيقية المقابلة لها في y_true, وهكذا بالنسبة لبقية التقسيمات حتى ننتهي وبعدها أقوم بحساب دقة النموذج.

  • 0
نشر

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

اقتباس

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

تعتمد shufflesplit على 4 مدخلات تتحكم في البيانات المقسمة:

  • n_splits عدد التقسيمات
  • test_size نسبة بيانات الإختبار (0.1%) كقيمة إفتراضية إذا لم يتم تحديدها.
  • train_size باقي نسبة الإختبار.
  • random_state قيمة رقمية للتحكم في إنتاج نفس البيانات كل مرة.
import numpy as np
from sklearn.model_selection import ShuffleSplit
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [3, 4], [5, 6]])
y = np.array([1, 2, 1, 2, 1, 2])
rs = ShuffleSplit(n_splits=2, test_size=.25, random_state=0)
#rs = ShuffleSplit(n_splits=200, test_size=.25, random_state=0)
#rs = ShuffleSplit(n_splits=5, train_size=0.5, test_size=.75,random_state=0)
for train_index, test_index in rs.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)

لاحظ البرنامج أعلاه و الذي يقوم بتقسيم البيانات بإستخدام sufflesplit و إخراج عينتين تمثلان مؤشرات البيانات لكل من التدريب و الإختبار مقسمة بنسبة 75% و 25% على التوالي، لاحظ أن ربع البيانات المدخلة الكلية 1.5 من أصل 6 عينات، لكن تم إخراج مؤشرين.

TRAIN: [1 3 0 4] TEST: [5 2]
TRAIN: [4 0 2 5] TEST: [1 3]

يمكنك أيضاً تفعيل السطر 6 و 7 لترى الناتج، لابد أن تعلم أن shufflesplit تعطي الخطأ التالي في حال كان مجموع نسب التدريب و الإختبار أعلى من 1.

ValueError: The sum of test_size and train_size = 1.25, should be in the (0, 1) range. Reduce test_size and/or train_size.

 

 

انضم إلى النقاش

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

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...