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

السؤال

نشر (معدل)

قمت ببناء مودل LogisticRegression لكن عند محاولة قياس الكفاءة يظهر لي الخطأالتالي:

import numpy as np
from tensorflow.keras.datasets import mnist
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from tensorflow.keras.utils import to_categorical
from sklearn.metrics import f1_score,precision_score,recall_score,accuracy_score,log_loss
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train.shape
image_size = x_train.shape[1]
input_size = image_size * image_size
x_train = np.reshape(x_train, [-1, input_size])/ 255
x_test = np.reshape(x_test, [-1, input_size]) / 255
#y_train = to_categorical(y_train)
#y_test = to_categorical(y_test)
t =LogisticRegression()
t.fit(x_train, y_train)
f1_score(y_test,t.predict(x_test))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-bbb2bd2287ff> in <module>
     15 t =LogisticRegression()
     16 t.fit(x_train, y_train)
---> 17 f1_score(y_test,t.predict(x_test))
     18 
     19 #ValueError: Target is multiclass but average='binary'. Please choose another average setting, one of [None, 'micro', 'macro', 'weighted'].

~\anaconda3\lib\site-packages\sklearn\metrics\_classification.py in f1_score(y_true, y_pred, labels, pos_label, average, sample_weight, zero_division)
   1097                        pos_label=pos_label, average=average,
   1098                        sample_weight=sample_weight,
-> 1099                        zero_division=zero_division)
   1100 
   1101 

~\anaconda3\lib\site-packages\sklearn\metrics\_classification.py in fbeta_score(y_true, y_pred, beta, labels, pos_label, average, sample_weight, zero_division)
   1224                                                  warn_for=('f-score',),
   1225                                                  sample_weight=sample_weight,
-> 1226                                                  zero_division=zero_division)
   1227     return f
   1228 

~\anaconda3\lib\site-packages\sklearn\metrics\_classification.py in precision_recall_fscore_support(y_true, y_pred, beta, labels, pos_label, average, warn_for, sample_weight, zero_division)
   1482         raise ValueError("beta should be >=0 in the F-beta score")
   1483     labels = _check_set_wise_labels(y_true, y_pred, average, labels,
-> 1484                                     pos_label)
   1485 
   1486     # Calculate tp_sum, pred_sum, true_sum ###

~\anaconda3\lib\site-packages\sklearn\metrics\_classification.py in _check_set_wise_labels(y_true, y_pred, average, labels, pos_label)
   1314             raise ValueError("Target is %s but average='binary'. Please "
   1315                              "choose another average setting, one of %r."
-> 1316                              % (y_type, average_options))
   1317     elif pos_label not in (None, 1):
   1318         warnings.warn("Note that pos_label (set to %r) is ignored when "

ValueError: Target is multiclass but average='binary'. Please choose another average setting, one of [None, 'micro', 'macro', 'weighted'].

ما الحل؟

تم التعديل في بواسطة Meezo ML

Recommended Posts

  • 1
نشر (معدل)

هذا خطأ عام، وقد يظهر لك عند استخدامك لأي خوارزمية أخرى أوشبكة عصبية ويحدث عند محاولتك قياس كفاءة نموذج باستخدام معيار f1-score  مع مسائل التصنيف المتعدد.
الخطأ في السطر التالي:

f1_score(y_test,t.predict(x_test))

إن مجموعة البيانات الشهيرة MINST تشكل مسألة تصنيف متعدد، لذا لايمكن استخدام معيار f1-score معها كما في الشكل الذي أرفقته.
الشكل العام للتابع:

f1_score(y_true, y_pred,average='binary')

أي افتراضياً يكون ال average تم تعيينه على binary (أي يقيس الكفاءة لمسألة تصنيف ثنائي)، لكن مسألتك هي مسألة تصنيف متعدد وبالتالي لايصلح استخدامه هنا.
لحل المشكلة نستخدم أحد المعاملات ['None, 'micro', 'macro', 'weighted].
طبعاً يمكنك استخدام أي منها ولا يعطونك نتائج متفاوتة (غالباً تكون الفروقات بقيم مهملة)  وبشكل عام فإن  [None, 'micro', 'macro', 'weighted'] يمكنك استخدامها في حالة التصنيف المتعدد والثنائي.
الحل:

import numpy as np
from tensorflow.keras.datasets import mnist
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from tensorflow.keras.utils import to_categorical
from sklearn.metrics import f1_score,precision_score,recall_score,accuracy_score,log_loss
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train.shape
image_size = x_train.shape[1]
input_size = image_size * image_size
x_train = np.reshape(x_train, [-1, input_size])/ 255
x_test = np.reshape(x_test, [-1, input_size]) / 255
t =LogisticRegression()
t.fit(x_train, y_train)
f1_score(y_test,t.predict(x_test),average='micro') #0.9258
# أو 
#f1_score(y_test,t.predict(x_test),average='macro') #0.9247
# أو
#f1_score(y_test,t.predict(x_test),average=None)

weighted: استخدمها إذا أردت أن تكون قيمة f1 معتمدة على عدد عينات كل صنف أيضاً .
macro: تأخذ متوسطات ال f1 لكل كلاس.
micro: نفس مبدأ accuracy.
None: تعطيك ال f1 لكل فئة .

تم التعديل في بواسطة Ali Haidar Ahmad
  • 0
نشر

الطريقة الأخرى لتفادي الوقوع في مشكلة الdefault values لدوال حساب الدقة هو إستدعاء دالة classification_report التي تعمل مع التصنيف الثنائي و المتعدد، و الناتج من هذه الدالة يحتوي على القيم الممكنة الحساب في حالة دوال مثل f1 والتي تكون محسوبة لكل صنف على حدة، بالإضافة لعدد من مقاييس الدقة الأخرى مثل precision و recall و support.

from sklearn.metrics import classification_report
y_pred = t.predict(x_test)
print(classification_report(y_test, y_pred))

في المثال إعلاه تم إستدعاء الدالة classification_report ومن ثم تعريف متغير y_pred ليحتوي على كل القيم المتوقعة من قبل النموذج، أخيراً تم إستدعاء الدالة classification_report والتي تخرج مقاييس الدقة السابق ذكرها بالإضافة لمتوسطات ال macro و weighted (مع العلم أن الmicro لا يظهر إلا في حالة التصنيف المتعدد).

يمكنك أيضاً الحصول على قيمة f1 score عن طريق الدالة precision_recall_fscore_support والتي تنتج قيمة f1 score, precision, recall and support، راجع البرنامج التالي:

from sklearn.metrics import precision_recall_fscore_support
precision_recall_fscore_support(y_test, y_pred, average='macro')

مع العلم أن القيمة المتوسطة المحسوبة في الدالة يجب أن تكون إحدي هذه القيم: micro, macro, none, weighted حسب ما هو موضح في الشرح أعلاه.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...