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

ValueError: could not convert string to float

السؤال

نشر

أعمل على مجموعة بيانات "داتاسيت" هي تغريدات تويتر، لذا  قمت مبدأياً ببناء نموذج LogisticRegrission  لكن لاأعلم سبب الخطأ التالي:

<class 'pandas.core.series.Series'>

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-20b55637dec5> in <module>
     10 print(type(X_train))
     11 clf = LogisticRegression()
---> 12 clf.fit(X_train, y_train)

~\anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py in fit(self, X, y, sample_weight)
   1525 
   1526         X, y = check_X_y(X, y, accept_sparse='csr', dtype=_dtype, order="C",
-> 1527                          accept_large_sparse=solver != 'liblinear')
   1528         check_classification_targets(y)
   1529         self.classes_ = np.unique(y)

~\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)
    753                     ensure_min_features=ensure_min_features,
    754                     warn_on_dtype=warn_on_dtype,
--> 755                     estimator=estimator)
    756     if multi_output:
    757         y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,

~\anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    529                     array = array.astype(dtype, casting="unsafe", copy=False)
    530                 else:
--> 531                     array = np.asarray(array, order=order, dtype=dtype)
    532             except ComplexWarning:
    533                 raise ValueError("Complex data not supported\n"

~\anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
     81 
     82     """
---> 83     return array(a, dtype, copy=False, order=order)
     84 
     85 

~\anaconda3\lib\site-packages\pandas\core\series.py in __array__(self, dtype)
    752               dtype='datetime64[ns]')
    753         """
--> 754         return np.asarray(self.array, dtype)
    755 
    756     # ----------------------------------------------------------------------

~\anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
     81 
     82     """
---> 83     return array(a, dtype, copy=False, order=order)
     84 
     85 

~\anaconda3\lib\site-packages\pandas\core\arrays\numpy_.py in __array__(self, dtype)
    182 
    183     def __array__(self, dtype=None) -> np.ndarray:
--> 184         return np.asarray(self._ndarray, dtype=dtype)
    185 
    186     _HANDLED_TYPES = (np.ndarray, numbers.Number)

~\anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
     81 
     82     """
---> 83     return array(a, dtype, copy=False, order=order)
     84 
     85 

ValueError: could not convert string to float: 'قزم العهد'

الكود:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import pandas as pd
Data = pd.read_csv('D:/train.csv')
Data['Tweet'] =Data['Tweet'].astype(str)  
data["Class"].replace({"abusive":0,"hate":0,"normal":1},inplace=True) 
data = Data['Tweet']
label = Data["Class"]
X_train, X_test, y_train, y_test = train_test_split(data, label, test_size = 0.2, random_state = 2021)
clf = LogisticRegression()
clf.fit(X_train, y_train)

 

Recommended Posts

  • 0
نشر

سبب الخطأ أنك لم تقم بتحويل البيانات إلى صيغة رقمية، فالتابع fit يتوقع منك قيم float وليس String لذا يجب أن تقوم بتحويل النص إلى صيغة رقمية أي يجب أن تقوم بخطوة Text Represintaion.
المثال التالي سأعرض لك فيه كيف سأقوم بالأمر عن طريق تمثيل النص باستخدام ترميز TF-IDF:

from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.pipeline import make_pipeline
from sklearn.metrics import confusion_matrix,accuracy_score, classification_report
Data = pd.read_csv('D:/train.csv')
Data['Tweet'] =Data['Tweet'].astype(str)  
Data['Class'].replace({"abusive":0,"hate":0,"normal":1},inplace=True) 
data = Data['Tweet']
label = Data["Class"]
X_train, X_test, Y_train, Y_test = train_test_split(data, label, test_size = 0.2, random_state = 2021)
pipe = make_pipeline(TfidfVectorizer(),LogisticRegression())
pipe.fit(X_train,Y_train)
prediction = pipe.predict(X_test)
print(f"Accuracy score is {accuracy_score(prediction, Y_test):.2f}")
print(classification_report(prediction, Y_test))

 

  • 0
نشر

البيانات النصية في بايثون تتم معالجتها قبل تمريرها لأي نموذج تدريبي، منها تحويل النص ألى كلمات و تسمي word tokenization و من ثم تحويل الكلمات إلى أرقام صحيحة او كسرية وهذه العملية تسمي feature extraction أو vectorization. هنالك 3 طرق للقيام بعملية تحويل الكلمات لأرقام، إحداها قام بشرحها @Ali Haidar Ahmadوهي تقوم بإعطاء كل كلمة قيمة رقمية score بناء أهميتها ومع الأخذ في لاعتبار عدد مرات ظهورها. سأقوم بشرح طريقتين أخرتين لتحويل الكلمات إلى قيم رقمية.

الأولي: Count Vectorizer

وهي من أسهل الطرق وذلك لأنها تقسم الملف النصي لمجموعة كلمات، وبه دالة fit_transform تقوم بتحديد الكلمات الموجودة في الملف النصي و عدد مرات ظهورها. في هذه الحالة يمكننا التطبيق على المثال اعلاه كالتالي:

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(Data['Tweet'])

بهذا تكون X عبارة عن 2D array الصفوف تمثل عدد الجمل او التويتات، و الأعمدة تمثل عدد الكلمات، مقابل كل كلمة موجودة في الجملة يوجد رقم 1 و 0 في حالة عدم وجودها، يمكنك التحقق بتحويل X الي مصفوفة عن طريق دالة ()X.toarray.

و طبعاً في هذه الحالة يمكنك إستنتاج أن طريقة TfidfVectorizer أفضل من التعداد، لكن هل تنفع الطريقتين في حال وجود بيانات نصية كبيرة جداً، للإجابة على هذا السؤال يوجد طريقة أفضل و هي HashingVectorizer و التي تقوم بالمهمة في حال البيانات الضخمة بدون إستهلاك للذاكرة أو بطء ف عملية التحويل.

طريقة HashingVectorizer تقوم بعملية تحويل النصوص إلى أرقام بإستخدام طريقة تطبيع عدد مرات ظهور الكلمة normalized token occurrences و بتطبيق عملية ترميز hashing محددة تتحول الكلمات إلى أرقام، بذلك يصبح من السهل تحويل النصوص الضخمة إلى أرقام لتسهل عملية تدريب النموذج و التنبؤ فيما بعد. راجع المثال التالي لتتعرف على كيفية التطبيق على بياناتك:

from sklearn.feature_extraction.text import HashingVectorizer
vectorizer = HashingVectorizer(n_features=100)
X = vectorizer.transform(Data['Tweet'])

لاحظ للمتغير n_feature وهو عبارة عن عدد الأعمدة الثابتة لكل التويتات في Data['Tweet'] وهي تمثل ال hash functions، القيم الناتجة من تحويل X إلى مصفوفة و طبعاتها تكون محصورة بين 1و -1 و التي يمكن تحويلها لأرقام صحيحة بتغيير القيم الإبتدائية للدالة HashingVectorizer.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...