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

السؤال

نشر

السلام عليكم

مثال

انا عندي عمود زي دي فيه قيمه زي دي اغلب القيمه عبار عن 0.0 فا ازي اخلي النموذج مايكونش منحيز لقيمه دي ؟

وكمان القيمه الزي دي اي الافضل الطبقه الاخير sigmoid والا linear ؟

efs_combined
0.0     13268
5.8       329
5.5       326
5.2       322
5.6       317
        ...
27.7        1
24.1        1
37.6        1
21.8        1
17.2        1

 

Recommended Posts

  • 0
نشر

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

توجد عدة حلول لتلك المشكلة :

إعادة توزيع البيانات بشكل متوازن :

  • Oversampling: يمكنك زيادة عدد العينات للفئات الأقل مثل القيم الأخرى غير ال 0 عن طريق تكرارها.
  • Undersampling: هنا يمكنك تقليل عدد العينات للفئة الأكثر وهي ال 0 عن طريق حذف بعض البيانات منها.
  • SMOTE (Synthetic Minority Over-sampling Technique): هنا يمكنك إستخدام تلك التقنية والتي تقوم بإنشاء عينات جديدة للفئات الأقل عن طريق توليد بيانات وعينات أخرى.

استخدام الأوزان (Class Weights) :

عند استخدام نماذج معينة مثل الشبكات العصبية يمكنك تخصيص وزن أكبر للعينات الأقل تكرارا في بيانات التدريب مثل القيم التي تكون 5.8 أو 37.6 في المثال الخاص بك. وذلك لكي يتعلم النموذج تمثيلها بشكل أفضل. ويمكنك تعيين أوزان للفئات أثناء تدريب النموذج فمثلا في scikit-learn يمكنك استخدام class_weight='balanced' في العديد من النماذج. وفي TensorFlow أو PyTorch، يمكنك تعيين أوزان الفئات يدويا. مثال :

from sklearn.linear_model import LogisticRegression

class_weights = {0: 1, 1: 10}
model = LogisticRegression(class_weight=class_weights)
model.fit(X_train, y_train)

تعديل دالة الخسارة (Loss Function) :

يمكنك استخدام دالة خسارة Focal Loss والتي يتم إستخدامها عندما لا يكون هنا توزيع متوازن للبيانات والتي تقوم بإعطاء وزن أكبر للعينات الأقل .مثال :

import tensorflow as tf

def focal_loss(gamma=2., alpha=.25):
    def focal_loss_fixed(y_true, y_pred):
        pt = tf.where(tf.equal(y_true, 1), y_pred, 1 - y_pred)
        return -tf.reduce_sum(alpha * tf.pow(1. - pt, gamma) * tf.math.log(pt))
    return focal_loss_fixed

model.compile(optimizer='adam', loss=focal_loss(), metrics=['accuracy'])

أما بخصوص الطبقة الأخيرة فإن Sigmoid يستخدم غالبا في المشاكل الثنائية (Binary Classification) حيث يكون المخرج بين 0 و 1.

بينما Linear: يستخدم في مشاكل الانحدار (Regression) حيث يكون المخرج قيمة حقيقية.وهنا إذا كنت تحاول التنبؤ بقيمة مستمرة مثل efs_combined فمن الأفضل أن تكون الطبقة الأخيرة خطية (Linear) .

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

 

  • 0
نشر

هل الأصفار تمثل قيمًا صحيحة كغياب النشاط أو قيمًا مفقودة missing data؟

في حال مفقودة استخدم تقنيات مثل KNNImputer أو تعويضها بالمتوسط/المنوال، ولو صحيحة تعامل معها كجزء من التوزيع الطبيعي للبيانات.

ولو المشكلة تصنيف Classification، فاستخدم تقنيات مثل SMOTE لإنشاء عينات جديدة للفئات النادرة، وحدد أوزانًا للفئات كالتالي TensorFlow: class_weight={0: 0.1, 1: 0.9}.

أما لو المشكلة انحدار Regression جرب تحويل الـ Target باستخدام log(1 + y) لتقليل تأثير القيم الكبيرة، وحول المشكلة إلى تصنيف بتقسيم الـ Target إلى فئات (0، 5-10، 10-15، إلخ).

أو أضف ميزة ثنائية binary feature تشير هل القيمة تساوي صفرًا أم لا.

df['is_zero'] = df['efs_combined'].apply(lambda x: 1 if x == 0 else 0)

أو استخدم نماذج مع Regularization ومنها L1/L2 في الانحدار الخطي لتجنب التركيز المفرط على الأصفار، كالتالي في Keras:

model.add(Dense(64, kernel_regularizer='l2'))

بخصوص اختيار الطبقة الأخيرة، ففي  Binary Classification في حال تريد احتمالًا بين 0 و1 (وجود/عدم وجود حدث)، استخدم Sigmoid.

model.add(Dense(1, activation='sigmoid'))

في الإنحدار Regression لو تتنبأ بقيمة رقمية مستمرة  كأسعار وقياسات، استخدم Linear.

model.add(Dense(1, activation='linear'))

 

  • 0
نشر
بتاريخ 6 دقائق مضت قال Mustafa Suleiman:

هل الأصفار تمثل قيمًا صحيحة كغياب النشاط أو قيمًا مفقودة missing data؟

 

اه دي نتيجه الكود ده الان الefs عبارن 0.0-1.0 

data_train['efs_combined'] = data_train['efs'] * data_train['efs_time']
y_target = data_train['efs_combined']

 

بتاريخ 9 دقائق مضت قال Mustafa Suleiman:
model.add(Dense(64, kernel_regularizer='l2'))

 

طيب دي استخدم ازي في الشبكه العصبيه

دي

# The 'deep_hit_model' is a Sequential model in Keras, meaning the layers are stacked in a linear fashion.
deep_hit_model = keras.models.Sequential([
    # - The first layer is a Dense layer with 8 units and 'tanh' activation function. This layer is responsible for transforming the input into a higher-dimensional space.
    keras.layers.Dense(8),                
    keras.layers.BatchNormalization(),    
    keras.layers.Activation('tanh'),      
    keras.layers.Dropout(0.1),  
    # - The second layer is a Dense layer with 128 units and 'tanh' activation function, allowing the model to learn more complex patterns.
    keras.layers.Dense(128),
    keras.layers.BatchNormalization(),
    keras.layers.Activation('tanh'),
    keras.layers.Dropout(0.3),
    # - The third layer is a Dense layer with 64 units and 'tanh' activation function, further processing the data with non-linearities.
    keras.layers.Dense(64),
    keras.layers.BatchNormalization(),
    keras.layers.Activation('tanh'),
    # - The fourth layer is a Dense layer with 32 units and 'tanh' activation function, continuing to refine the representation of the data.
      keras.layers.Dense(32),
    keras.layers.BatchNormalization(),
    keras.layers.Activation('tanh'),
    # - The final layer is a Dense layer with 1 unit and 'sigmoid' activation function, producing an output between 0 and 1, suitable for binary classification.
    keras.layers.Dense(1 , activation='linear'),

 

  • 0
نشر
بتاريخ On 10‏/2‏/2025 at 14:46 قال Ali Ahmed55:

اه دي نتيجه الكود ده الان الefs عبارن 0.0-1.0 

data_train['efs_combined'] = data_train['efs'] * data_train['efs_time']
y_target = data_train['efs_combined']
 

 

طيب دي استخدم ازي في الشبكه العصبيه

دي

# The 'deep_hit_model' is a Sequential model in Keras, meaning the layers are stacked in a linear fashion.
deep_hit_model = keras.models.Sequential([
    # - The first layer is a Dense layer with 8 units and 'tanh' activation function. This layer is responsible for transforming the input into a higher-dimensional space.
    keras.layers.Dense(8),                
    keras.layers.BatchNormalization(),    
    keras.layers.Activation('tanh'),      
    keras.layers.Dropout(0.1),  
    # - The second layer is a Dense layer with 128 units and 'tanh' activation function, allowing the model to learn more complex patterns.
    keras.layers.Dense(128),
    keras.layers.BatchNormalization(),
    keras.layers.Activation('tanh'),
    keras.layers.Dropout(0.3),
    # - The third layer is a Dense layer with 64 units and 'tanh' activation function, further processing the data with non-linearities.
    keras.layers.Dense(64),
    keras.layers.BatchNormalization(),
    keras.layers.Activation('tanh'),
    # - The fourth layer is a Dense layer with 32 units and 'tanh' activation function, continuing to refine the representation of the data.
      keras.layers.Dense(32),
    keras.layers.BatchNormalization(),
    keras.layers.Activation('tanh'),
    # - The final layer is a Dense layer with 1 unit and 'sigmoid' activation function, producing an output between 0 and 1, suitable for binary classification.
    keras.layers.Dense(1 , activation='linear'),
 

 

الـ L2 Regularization يُضاف إلى الطبقات للحد من مشكلة Overfitting عن طريق معاقبة الأوزان الكبيرة في النموذج.

model.add(Dense(64, kernel_regularizer='l2'))
  • 0
نشر
بتاريخ 4 ساعة قال Mustafa Suleiman:

الـ L2 Regularization يُضاف إلى الطبقات للحد من مشكلة Overfitting عن طريق معاقبة الأوزان الكبيرة في النموذج.

model.add(Dense(64, kernel_regularizer='l2'))

الف شكراا جدا لحضرتك جزاك الله كل خير

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...