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

السؤال

نشر

السلام عليكم

هو لو استخدمات الOne-Hot Encoding في الكود ده بدل OrdinalEnocder  عادي لو هيحصل مشكله في قيمه الNULL ؟

ده الكود


def ordinalencoder_data(data):

    # Select the categorical columns (object type) from the dataframe
    categorical_cols = data.select_dtypes(include=['object']).columns

    # Create a mask to identify missing values (NaN) in the categorical columns
    mask = data[categorical_cols].isna()

    # Fill missing values with the string 'missing' to ensure no NaN values before encoding
    temp_data = data[categorical_cols].fillna('missing')

    # Initialize the OrdinalEncoder, which will convert categorical values to numerical labels
    oe = OrdinalEncoder()

    # Fit the encoder to the data and transform the categorical columns into numerical labels
    encoded_data = oe.fit_transform(temp_data)

    # Convert the encoded data to a DataFrame, keeping the original column names and specifying the dtype as 'Int64'
    encoded_series = pd.DataFrame(encoded_data, columns=categorical_cols, dtype='Int64')

    # Restore the missing values (NaN) in the original positions, using pd.NA to indicate missing values
    encoded_series[mask] = pd.NA

    # Update the original dataframe with the encoded columns while preserving the missing value positions
    data[categorical_cols] = encoded_series

    return data

 

Recommended Posts

  • 0
نشر

وعليكم السلام ورحمة الله وبركاته.

إذا قمت باستبدال OrdinalEncoder بـ One-Hot Encoding في الكود المرفق فستواجه مشكلة مع القيم المفقودة حيث الكود الحالي سقوم بتحديد الأعمدة الفئوية (categorical) في البيانات. ومن ثم يقوم بملئ القيم المفقودة في تلك الأعمدة بالقيمة 'missing' لكي لا تحدث مشكلة أثناء إستخدام OrdinalEncoder . بعد ذلك يقوم بإستعادة القيم المفقودة الأصلية مرة أخرى بعد إتمام ال OrdinalEncoder.

أما عند إستخدام One-Hot Encoding فإنه يقوم بتحول كل فئة إلى عمود منفصل يحتوي على 1 أو 0 بحسب وجود الفئة.

وإليك الفرق بين One-Hot Encoding و OrdinalEncoder  :

  • OrdinalEncoder: يقوم بتحويل القيم الفئوية إلى أرقام صحيحة فمثلا لو لدينا  
    ["cat", "dog", "bird"] # سيتم تحويلها إلى [0,1,2]
     وهنا يمكنك بسهوله إمكانية إستبدال القيم المفقودة وإسترجاعها
  • One-Hot Encoding: يحول القيم الفئوية إلى أعمدة منفصلة لكل فئة. فمثلا إذا كانت لدنيا فئة animal مثل المثال السابق :
    ["cat", "dog", "bird"]
    فسيتم تحويلها إلى ثلاثة أعمدة animal_cat و  animal_dog و animal_bird حيث ستكون قيمة العمود ب1 إذا كانت الفئة موجودة و ب 0 إذا لم تكن موجودة.

ولذلك فإنه إذا كانت هناك قيم مفقودة (NaN) في البيانات الأصلية فإن One-Hot Encoding سيحولها إلى عمود جديد مما قد يؤدي إلى زيادة كببيرة في عدد الأعمدة.

ولذلك يوجد لديك بعض الحلول وهو إما إهمال البيانات المفقودة وعدم تضمينها أو يمكنك إضافة عمود خاص بالقيم المفقودة حيث يحتوي على 1 إذا كانت القيمة مفقودة و0 إذا لم تكن كذللك.

  • 0
نشر

سيؤدي إلى مشاكل كبيرة مع القيم الفارغة NULL/NaN في حال لم يتم التعامل معها بحذر، لديك استخدمت OrdinalEncoder الذي يحوِّل كل عمود فئوي إلى عمود واحد عددي مع الحفاظ على هيكل الأعمدة، وذلك يسمح باستخدام نفس الـ mask لاستعادة القيم الفارغة بعد التشفير.

لكن من خلال One-Hot Encoding كـ OneHotEncoder من sklearn، يتم إنشاء أعمدة جديدة لكل فئة، الأمر الذي يغير هيكل البيانات بالكامل، ويجعل تطبيق الـ mask الأصلي الذي يعتمد على عدد الأعمدة القديمة مستحيلًا.

بعد التشفير بـ One-Hot، ستنشئ أعمدة جديدة لكل فئة كعمود لون به ٣ فئات سيصبح ٣ أعمدة.

والـ mask الأصلي يعتمد على عدد الأعمدة القديمة، ولن يتطابق مع عدد الأعمدة الجديدة، ويؤدي إلى أخطاء.

وحتى لو تم تعبئة القيم الفارغة بـ missing قبل التشفير، فإن One-Hot سينشئ عمودًا جديدًا لتلك القيمة، وعند محاولة استعادة القيم الفارغة باستخدام encoded_series[mask] = pd.NA، ستكون العملية غير منطقية لأن الأعمدة الجديدة لا تتوافق مع الـ mask.

بالتالي عليك التعامل مع القيم الفارغة كفئة مستقلة، بمعنى املأ القيم الفارغة بـ missing قبل التشفير كما تفعل حاليًا.

ثم استخدم OneHotEncoder مع تحديد المعلمة 

handle_unknown='ignore'

وستعتبر missing فئة عادية، ولن تحتاج إلى استعادة القيم الفارغة بعد التشفير.

from sklearn.preprocessing import OneHotEncoder

def onehotencoder_data(data):
    categorical_cols = data.select_dtypes(include=['object']).columns
    temp_data = data[categorical_cols].fillna('missing')
    
    ohe = OneHotEncoder(handle_unknown='ignore', sparse_output=False)
    encoded_data = ohe.fit_transform(temp_data)
    
    new_columns = ohe.get_feature_names_out(categorical_cols)
    encoded_df = pd.DataFrame(encoded_data, columns=new_columns, dtype='Int64')
    
    data = data.drop(columns=categorical_cols)
    data = pd.concat([data, encoded_df], axis=1)
    
    return data

ثم احذف الصفوف التي تحتوي على قيم فارغة قبل التشفير، وذلك ربما يؤدي إلى فقدان بيانات مهمة، فتعامل بحذر، بمعنى القيم الفارغة يجب أن تُعالَج بشكل منفصل حسب البيانات، أقصد هل تعكس missing معلومة مهمة؟ ففي بعض البيانات هي مهمة وتمثل معلومة.

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...