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

السؤال

نشر
اقتباس

 

 


%%time
# define fixed parameters and parameters to search
crf = sklearn_crfsuite.CRF(
    algorithm='lbfgs', 
    max_iterations=1000, 
    all_possible_transitions=True
)
params_space = {
    'c1': scipy.stats.expon(scale=0), 
    'c2': scipy.stats.expon(scale=500), 
}

# use the same metric for evaluation
f1_scorer = make_scorer(metrics.flat_f1_score, 
                        average='weighted', labels=labels)
# search
rs = RandomizedSearchCV(crf, params_space, 
                        cv=3, 
                        verbose=20, 
                        n_jobs=-1, 
                        n_iter=4, 
                        return_train_score=True,
                        scoring=f1_scorer)
rs.fit(X_train, y_train)
print(rs.best_score_)
print(rs.best_estimator_.get_params())

مرحبا 

 

في هذا الكود يوجد params_space وهي مجال القيم التي سينتج عنها تحديد أفضل قيمتين c1 وc2 لخوارزمية crf

crf = sklearn_crfsuite.CRF(algorithm= 'lbfgs',

    c1=0, #القيمة الافتراضية
    c2=1,#القيمة الافتراضية
    max_iterations=1000,
    all_possible_transitions=True)
crf.fit(X_train, y_train)

مجال القيم هذا توجد فيه أرقام لا أفهمها ولا أفهم إلام ترمز ولماذا كلما صغرت كانت النتيجة أدق ؟ وهل لها مقابل بالنسبة المئوية ؟ يعني لو وضعت 0.5 ماذا تعني وليكن ذلك موضحا على محورين  x y  أود أن أفهمها حقيقة كما فهمت أن n_iter=4 كلما زادت كلما كان فرص الحصول على قيم أدق أفضل.

 

شكرا لكم

Recommended Posts

  • 0
نشر
بتاريخ 16 دقائق مضت قال Arabic Language:

ليس عندي كلمات تفي شكرك حقيقة

شكرا بحجم الكون أفدتني كثير 

عفوا فقط لأتأكد من فهمي 

 

تحديدي يعني للمعاملين كلما صغر كان ذلك أفضل، أليس كذلك؟

الأول يجب أن يكون أكبر من صفر الثاني يجب أن يكون أصغر من 1 حتى يتعلم المودل بدون الوقوع في الاوفر فتينق

يعني التحديد للتوزيع الإحصائي كيف ؟ أعتمد على ماذا؟ هل أضعه اعتباطيا؟ 

العفو شكراً جدا على ذوق حضرتك.

اقتباس

تحديدي يعني للمعاملين كلما صغر كان ذلك أفضل، أليس كذلك

ليس بالظبط، فهذا يتوقف على المقصود ب"أفضل".

للحصول على أفضل نتيجة في التدريب، فبوضع c1 وc2  ب صفر سيعطي أفضل نتيجة خلال التدريب، بسبب الoverfitting.

لكن أفضل نتيجة على بيانات الإختبار والcross validation يتم الحصول عليها تجريبياً، بتجربة قيم مختلفة لc1 وc2 في search space أو  param space معينة.

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

بالتالي بمعرفتنا تلك المعلومات قمنا بحصر الsearch space بين الصفر والواحد، ويتبقى فقط تحديد توزيع إحصائي يعطي قيم في هذا المجال.

يمكن مثلاً إستخدام توزيع uniform بين 0 و 1 أو exponential distribution كما في الكود الخاص بك، لكن تأكد من أن الscale المعطى للدالة expon يعطي قيم في المجال المرغوب.

  • 1
نشر

السلام عليكم

بالنسبة لسؤال حضرتك عن القيمتين c1 وc2 قمت بالرجوع إلى الdocumentation وبه موجود أن:

c1:

The coefficient for L1 regularization.

و c2:

The coefficient for L2 regularization.

أي أن c1 و c2 هما معاملات الL1 و L2 ـ regularization.

والregularization هو أحدى الطرق لمنع الoverfitting عن طريق إضافة عقوبة penalty إلى الloss function، وتكون العقوبة دالة في متغيرات الmodel.

بالتحديد الL1 regularization :

l1.png.f2e86dab82ee08c58439474103512d7e.png

يقوم بإضافة الterm المظلل إلى دالة الخطأ، وهو مجموع ال القيم المطلقة للparameters المستخدمة في المودل، مضروب في ثابت وهو c1 لديك في الكود.

وبالنسبة لL2 regularization:

l2.png.82183dd9b8d1eddc7f4a94f85c776bf8.png

يقوم بإضافة مجموع مربعات الparameters المستخدمة في المودل مضروبة في ثابت وهو c2 المستخدم لديك في الكود.

لاحظ أن في الكود الخاص بك القيمة الإفتراضية لc1 هي 0، أي أنه لا يتم إستخدام الl1 regularization والقيمة لc2 هي 1، أي أنه يتم إضافة مجموع المربعات للparameters في المودل إلى دالة الخطأ، هنا يجب أن تسأل ماذا سيؤدي إضافة مجموع الparameters في المودل إلى دالة الخطأ؟

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

وسبب أن أداء المودل يكون أفضل عند تقليل قيم معملات الregularization هو أنه بتقليل تلك القيم، يكون للمودل حرية أكبر في إختيار الparameters، ولكنه سيكون في عرضة أكبر لحدوث overfitting.

بالتوفيق، يمكنك القراءة أكثر هنا، وقمت بالإعتماد عليها في الشرح.

  • 1
نشر

وبالنسبة للparam space، في الكود لديك تم إختيار مجال القيم أن تتبع exponential distribution.

بالرجوع إلى الdocumentation للدالة RandomizedSearchCV، يمكنك معرفة التالي:

اقتباس

param_distributions dict or list of dicts

Dictionary with parameters names (str) as keys and distributions or lists of parameters to try. Distributions must provide a rvs method for sampling (such as those from scipy.stats.distributions). If a list is given, it is sampled uniformly. If a list of dicts is given, first a dict is sampled uniformly, and then a parameter is sampled using that dict as above.

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

في الكود لديك:

params_space = {
    'c1': scipy.stats.expon(scale=0), 
    'c2': scipy.stats.expon(scale=500), 
}

قمت بإختيار قيم c1 وc1 من توزيع إحصائي نوعه exponential ، والscale لهذا التوزيع هو 0 و 500 بالترتيب.

لمعرفة القيم التي سيتم سحبها يمكن تجربة الآتي:

import scipy

c1_dist = scipy.stats.expon(scale=0)
c2_dist = scipy.stats.expon(scale=500)

for i in range(10):
  print(c1_dist.rvs())
  
for i in range(10):
  print(c2_dist.rvs())

تقوم الدالة rvs بسحب أرقام عشوائية من التوزيع الإحصائي.

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

  • 0
نشر

وجدت هذا الكلام ولكني ما زلت أجهل كيف أحدد search space هل أضعها عشوائيا؟

 

Definition: A scalar field is a broad term for functions who take in points in a two or three dimensional space (R2 or R3) and outputs real numbers. The scalar field is a concept spawn from the natural and physical sciences since they often deal with a region of physical space with a function attached to it. For example, the function that gives the temperature of any point in the room you are sitting is a scalar field.You should note that a function doesn't need to expressed and defined as a mathematical formulat for it to be an explicit function. (Good luck figuring out the function for the temperature of every spot in your room!) Just the input-output correspondence. So particular scalara field may be specified by a mathematical expression, or it may be a function whose value at any point could be obtained by physical measurement.

  • 0
نشر (معدل)

ليس عندي كلمات تفي شكرك حقيقة

شكرا بحجم الكون أفدتني كثير 

عفوا فقط لأتأكد من فهمي 

 

تحديدي يعني للمعاملين كلما صغر كان ذلك أفضل، أليس كذلك؟

الأول يجب أن يكون أكبر من صفر الثاني يجب أن يكون أصغر من 1 حتى يتعلم المودل بدون الوقوع في الاوفر فتينق

يعني التحديد للتوزيع الإحصائي كيف ؟ أعتمد على ماذا؟ هل أضعه اعتباطيا؟ 

تم التعديل في بواسطة Arabic Language

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...