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

السؤال

نشر

ظهور الخطأ التالي  ValueError: bad input shape  عند محاولة تدريب نموذج باستخدام خوارزمية MultinomialNB.
الكود مع الخطأ:

import numpy as np
from sklearn.naive_bayes import MultinomialNB
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.datasets import mnist
from sklearn.metrics import accuracy_score
(X, Y),(Xtest, Ytest) = mnist.load_data()
Y = to_categorical(Y)
Ytest = to_categorical(Ytest)
X = np.reshape(X, [-1, X.shape[1]*X.shape[1]])
Xtest = np.reshape(Xtest, [-1, input_size])
M =MultinomialNB()
M.fit(X, Y)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-161d6ac448e8> in <module>
     10 Xtest = np.reshape(Xtest, [-1, input_size])
     11 t =MultinomialNB()
---> 12 t.fit(X, Y)
     13 accuracy_score(Ytest,t.predict(Xtest)) # 0.8357

~\anaconda3\lib\site-packages\sklearn\naive_bayes.py in fit(self, X, y, sample_weight)
    607         self : object
    608         """
--> 609         X, y = self._check_X_y(X, y)
    610         _, n_features = X.shape
    611         self.n_features_ = n_features

~\anaconda3\lib\site-packages\sklearn\naive_bayes.py in _check_X_y(self, X, y)
    473 
    474     def _check_X_y(self, X, y):
--> 475         return check_X_y(X, y, accept_sparse='csr')
    476 
    477     def _update_class_log_prior(self, class_prior=None):

~\anaconda3\lib\site-packages\sklearn\utils\validation.py in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
    758                         dtype=None)
    759     else:
--> 760         y = column_or_1d(y, warn=True)
    761         _assert_all_finite(y)
    762     if y_numeric and y.dtype.kind == 'O':

~\anaconda3\lib\site-packages\sklearn\utils\validation.py in column_or_1d(y, warn)
    795         return np.ravel(y)
    796 
--> 797     raise ValueError("bad input shape {0}".format(shape))
    798 
    799 

ValueError: bad input shape (60000, 10)

 

Recommended Posts

  • 1
نشر

هذا الخطأ قد يظهر لك في أي خوارزمية أخرى قد تستخدمها.
المشكلة في أنك تقوم بترميز قيم ال labels باستخدام ال One-Hot Encoding (التابع to_categorical) فتحدث المشكلة في التابع fit أي عندما يبدأ التدريب.
صحيح أننا نستخدم عادةً التابع to_categorical لترميز ال labels في مسائل التصنيف المتعدد لكن في الخوارزميات المعرفة في مكتبة Sklearn لانستخدمه لأن الخوارزميات فيها لاتتعامل مع هذا الشكل من البيانات.
إن شكل التابع fit في مكتبة Sklearn كالتالي:

fit(X, Y)

بحيث أن y هي مصفوفة من الشكل (,n_sampels) أي مصفوفة أحادية الأبعاد (1D-array).
وعند استخدامك لترميز to_categorical سوف يتحول شكل البيانات إلى (n_sampels,voc) بحيث voc هي عدد ال labels الموجودة.
وهذا الشكل لايتطابق مع شكل البيانات الذي تتعامل معه fit.
لذا يجب أن لانقوم باستخدام هذا الترميز وأن نجعل ال labels ضمن مصفوفة 1D: 
حل المشكلة:

import numpy as np
from sklearn.naive_bayes import MultinomialNB
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.datasets import mnist
from sklearn.metrics import accuracy_score
(X, Y),(Xtest, Ytest) = mnist.load_data()
Y=Y.reshape(-1,)
Ytest=Ytest.reshape(-1,)
X = np.reshape(X, [-1, X.shape[1]*X.shape[1]])
Xtest = np.reshape(Xtest, [-1, input_size])
M =MultinomialNB()
M.fit(X, Y)
accuracy_score(Ytest,M.predict(Xtest)) # 0.83

 

  • 1
نشر

حسب تعريف موقع sklearn للخوارزمية، عدد الصور samples يجب أن تساوى في كل من قيم y الممرة للنموذج و المدخل الأول ل X:

اقتباس

Parameters

X{array-like, sparse matrix} of shape (n_samples, n_features)

Training vectors, where n_samples is the number of samples and n_features is the number of features.

yarray-like of shape (n_samples,)

Target values.

sample_weightarray-like of shape (n_samples,), default=None

Weights applied to individual samples (1. for unweighted).

بالتالي الخطأ هو عملية تحويل مصفوفات Y و Ytest إلى مصفوفات ذات بعدين بإستخدام to_categorical والتي تنتج (6000,10) و (1000,10) على التوالي و الصحيح تمريرها بنفس الشكل 6000,100.

import numpy as np
from sklearn.naive_bayes import MultinomialNB
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.datasets import mnist
from sklearn.metrics import accuracy_score
(X, Y),(Xtest, Ytest) = mnist.load_data()
# Y = to_categorical(Y)
# Ytest = to_categorical(Ytest)
X = np.reshape(X, [-1, X.shape[1]*X.shape[1]])
Xtest = np.reshape(Xtest, [-1, Xtest.shape[1]*Xtest.shape[1]])
M =MultinomialNB()
M.fit(X, Y)

لاحظ للبرنامج أعلاه، لقد قمت بإخفاء الدالة to_categorical لكل من Y و Ytest و لا تنسى إستبدال المتغير input_size في السطر رقم 10 إلى Xtest.shape[1]*Xtest.shape[1] للحصول على مصفوفة ذات بعدين بدلاً من ثلاثة أبعاد.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...