مرحباً بك في Ascend Studios

اكتشف الرؤى والأدلة والتحديثات من خبرائنا في التكنولوجيا والتمويل والابتكار

11
مقالات
7
فئات
20
وسوم
3142
مشتركين

هل أنت خبير أو باحث؟

انضم إلى مجتمعنا المُتحقق من المهنيين وشارك خبرتك مع العالم. احصل على التحقق وابدأ المساهمة في تقدم المعرفة في مجالك.

تقدم للتحقق
مهنيون طبيون
علماء حاسوب
مهندسون وباحثون
جميع المجالات الأكاديمية

بحث & Filters

🧹 الدليل الشامل للمعالجة المسبقة للبيانات في نماذج الذكاء الاصطناعي

🧹 الدليل الشامل للمعالجة المسبقة للبيانات في نماذج الذكاء الاصطناعي


"البيانات هي النفط الجديد، لكن مثل النفط، يجب تكريرها قبل الاستخدام" - Clive Humby




📌 مقدمة: لماذا المعالجة المسبقة للبيانات مهمة؟


المعالجة المسبقة للبيانات هي أساس نجاح نماذج الذكاء الاصطناعي. وفقاً لدراسة بارزة من IBM، يقضي علماء البيانات حوالي 80% من وقتهم في إعداد وتنظيف البيانات، بينما يُخصص 20% فقط للتحليل الفعلي وبناء النماذج (Lohr, 2014).


كما ذُكر في العمل الأساسي لـ García, Luengo, & Herrera (2015) في كتابهم "المعالجة المسبقة للبيانات في التنقيب عن البيانات":


"جودة البيانات تؤثر مباشرة على جودة النموذج. القمامة تدخل، القمامة تخرج (GIGO) تبقى الحقيقة الأساسية في تعلم الآلة."




🎯 لماذا المعالجة المسبقة للبيانات حرجة؟


المشاكل الشائعة في البيانات الخام:


  • القيم المفقودة (Missing Values): سجلات غير مكتملة قد تسبب تحيز في النماذج
  • القيم الشاذة (Outliers): قيم متطرفة تؤثر على المقاييس الإحصائية
  • عدم التناسق (Inconsistency): تنسيقات مختلفة لنفس نوع البيانات
  • الضوضاء (Noise): أخطاء عشوائية ومعلومات غير ذات صلة
  • عدم توازن الفئات (Class Imbalance): توزيع غير متساوٍ للفئات المستهدفة
  • التكرار (Redundancy): ميزات مكررة أو مترابطة بشكل عالٍ

📊 إحصائية مهمة: وفقاً لتقرير Kaggle 2023 لحالة علم البيانات، 67% من مشاريع ML تفشل بسبب جودة البيانات السيئة، وليس اختيار الخوارزمية.


التأثير على أداء النموذج:


أظهر بحث Gudivada وآخرون (2017) أن المعالجة المسبقة المناسبة للبيانات يمكن أن تحسن دقة النموذج بنسبة 15-25% مقارنة باستخدام البيانات الخام مباشرة.




📊 نظرة عامة مرئية: خط أنابيب المعالجة المسبقة للبيانات


خط أنابيب المعالجة المسبقة للبيانات
📥 البيانات الخام
1جمع
→ الجمع من APIs، قواعد البيانات، الملفات
→ البيانات التحقق من سلامة البيانات
2التحليل
→ التحليل الإحصائي، التصورات البيانية
→ الاستكشافي اكتشاف الأنماط والشذوذ
3تنظيف
→ معالجة القيم المفقودة، إزالة التكرارات
→ البيانات إصلاح التناقضات، معالجة القيم الشاذة
4تحويل
→ التطبيع، الترميز، القياس
→ البيانات هندسة الميزات
5هندسة
→ الاختيار، الاستخراج، الإنشاء
→ الميزات تقليل الأبعاد
6تقسيم
→ تقسيم التدريب/الاختبار/التحقق
→ البيانات إعداد التحقق المتقاطع
→ 📤 بيانات نظيفة → جاهزة لنماذج ML!



🔧 طرق المعالجة المسبقة خطوة بخطوة


الخطوة 1️⃣: جمع وتحميل البيانات


الخطوة الأولى تتضمن جمع البيانات من مصادر مختلفة وتحميلها في تنسيق قابل للعمل.


مصادر البيانات الشائعة:

  • ملفات CSV/Excel
  • قواعد بيانات SQL
  • واجهات برمجة التطبيقات (REST, GraphQL)
  • استخراج البيانات من الويب
  • البيانات المتدفقة

مثال Python:

PYTHON
import pandas as pd
import numpy as np

# تحميل البيانات من CSV
df = pd.read_csv('dataset.csv')

# التحميل من قاعدة بيانات SQL
from sqlalchemy import create_engine
engine = create_engine('postgresql://user:pass@host/db')
df = pd.read_sql('SELECT * FROM table', engine)

# نظرة عامة أساسية على البيانات
print(f"الشكل: {df.shape}")
print(f"الأعمدة: {df.columns.tolist()}")
print(f"أنواع البيانات:\n{df.dtypes}")
print(f"القيم المفقودة:\n{df.isnull().sum()}")



الخطوة 2️⃣: التحليل الاستكشافي للبيانات (EDA)


يساعد EDA في فهم توزيع البيانات والعلاقات والمشاكل المحتملة.


تقنيات EDA الرئيسية:


التحليل الاستكشافي للبيانات
📈 التحليل الأحادي المتغير
→ الرسوم البيانية (التوزيع)
→ مخططات الصندوق (القيم الشاذة)
→ مخططات الكثافة
→ الإحصائيات الملخصة
📊 التحليل ثنائي المتغير
→ مخططات التشتت (الارتباط)
→ خرائط الحرارة (مصفوفة الارتباط)
→ مخططات الأزواج
→ الجدولة التبادلية
→ 🔍 التحليل متعدد المتغيرات
→ تصور PCA
→ مخططات t-SNE
→ الإحداثيات المتوازية

كود EDA بـ Python:

PYTHON
import matplotlib.pyplot as plt
import seaborn as sns

# الملخص الإحصائي
print(df.describe())

# توزيع الميزات الرقمية
df.hist(figsize=(15, 10), bins=30)
plt.suptitle('توزيعات الميزات')
plt.tight_layout()
plt.show()

# خريطة حرارة الارتباط
plt.figure(figsize=(12, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', center=0)
plt.title('مصفوفة ارتباط الميزات')
plt.show()

# مخططات الصندوق لاكتشاف القيم الشاذة
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
for idx, col in enumerate(df.select_dtypes(include=[np.number]).columns[:6]):
    ax = axes[idx // 3, idx % 3]
    df.boxplot(column=col, ax=ax)
    ax.set_title(f'مخطط الصندوق: {col}')
plt.tight_layout()
plt.show()



الخطوة 3️⃣: معالجة القيم المفقودة


البيانات المفقودة هي واحدة من أكثر المشاكل شيوعاً في مجموعات البيانات الحقيقية. وفقاً لـ Little & Rubin (2019)، هناك ثلاثة أنواع من البيانات المفقودة:


أنواع البيانات المفقودة
📌 MCAR (مفقودة بشكل عشوائي تماماً)
→ الفقدان مستقل عن جميع المتغيرات
→ مثال: عدم الرد العشوائي على الاستبيانات
📌 MAR (مفقودة بشكل عشوائي)
→ الفقدان يعتمد على البيانات المرصودة
→ مثال: الشباب أقل احتمالاً للإبلاغ عن الدخل
📌 MNAR (مفقودة ليس بشكل عشوائي)
→ الفقدان يعتمد على القيمة المفقودة نفسها
→ مثال: أصحاب الدخل العالي يخفون دخلهم

طرق معالجة القيم المفقودة:


| الطريقة | متى تُستخدم | المزايا | العيوب |

|---------|-------------|---------|--------|

| الحذف | MCAR، نسبة صغيرة مفقودة | بسيط | فقدان البيانات |

| التعويض بالمتوسط/الوسيط | رقمي، MCAR | سهل التنفيذ | يقلل التباين |

| التعويض بالمنوال | فئوي | بسيط | قد يسبب تحيز |

| تعويض KNN | علاقات معقدة | يلتقط الأنماط | مكلف حسابياً |

| MICE | MAR | متطور | معقد التنفيذ |

| التعلم العميق | مجموعات بيانات كبيرة | قوي | يتطلب بيانات كثيرة |


تطبيق Python:

PYTHON
from sklearn.impute import SimpleImputer, KNNImputer
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

# فحص القيم المفقودة
print("القيم المفقودة:")
print(df.isnull().sum())
print(f"\nنسبة الفقدان:")
print((df.isnull().sum() / len(df) * 100).round(2))

# الطريقة 1: التعويض البسيط (المتوسط/الوسيط/المنوال)
mean_imputer = SimpleImputer(strategy='mean')
median_imputer = SimpleImputer(strategy='median')
mode_imputer = SimpleImputer(strategy='most_frequent')

# التطبيق على الأعمدة الرقمية
df_numeric = df.select_dtypes(include=[np.number])
df_numeric_imputed = pd.DataFrame(
    mean_imputer.fit_transform(df_numeric),
    columns=df_numeric.columns
)

# الطريقة 2: تعويض KNN
knn_imputer = KNNImputer(n_neighbors=5)
df_knn_imputed = pd.DataFrame(
    knn_imputer.fit_transform(df_numeric),
    columns=df_numeric.columns
)

# الطريقة 3: MICE (التعويض المتعدد بالمعادلات المتسلسلة)
mice_imputer = IterativeImputer(random_state=42, max_iter=10)
df_mice_imputed = pd.DataFrame(
    mice_imputer.fit_transform(df_numeric),
    columns=df_numeric.columns
)

print("اكتمل التعويض!")



الخطوة 4️⃣: معالجة القيم الشاذة


القيم الشاذة يمكن أن تؤثر بشكل كبير على أداء النموذج. عرّف Hawkins (1980) القيمة الشاذة بأنها "ملاحظة تنحرف كثيراً عن الملاحظات الأخرى لدرجة تثير الشك في أنها نُتجت بآلية مختلفة."


طرق اكتشاف القيم الشاذة:


طرق اكتشاف القيم الشاذة
📊 الطرق الإحصائية
→ درجة Z (قيم > 3 انحرافات معيارية من المتوسط)
→ طريقة IQR (< Q1-1.5*IQR أو > Q3+1.5*IQR)
→ درجة Z المعدلة (باستخدام الوسيط)
→ 🤖 طرق ML
→ غابة العزل (Isolation Forest)
→ عامل الشذوذ المحلي (LOF)
→ SVM أحادي الفئة
→ تجميع DBSCAN
📈 التصور البياني
→ مخططات الصندوق
→ مخططات التشتت
→ مخططات الكمان

تطبيق Python:

PYTHON
from scipy import stats
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor

# الطريقة 1: درجة Z
def detect_outliers_zscore(data, threshold=3):
    z_scores = np.abs(stats.zscore(data))
    return z_scores > threshold

# الطريقة 2: طريقة IQR
def detect_outliers_iqr(data):
    Q1 = data.quantile(0.25)
    Q3 = data.quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    return (data < lower_bound) | (data > upper_bound)

# الطريقة 3: غابة العزل
isolation_forest = IsolationForest(contamination=0.1, random_state=42)
outliers_if = isolation_forest.fit_predict(df_numeric) == -1

# الطريقة 4: عامل الشذوذ المحلي
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
outliers_lof = lof.fit_predict(df_numeric) == -1

# معالجة القيم الشاذة
# الخيار 1: الإزالة
df_clean = df[~outliers_if]

# الخيار 2: التحديد (Winsorization)
for col in df_numeric.columns:
    Q1, Q3 = df[col].quantile([0.25, 0.75])
    IQR = Q3 - Q1
    df[col] = df[col].clip(Q1 - 1.5*IQR, Q3 + 1.5*IQR)

# الخيار 3: التحويل (اللوغاريتم، الجذر التربيعي)
df['log_feature'] = np.log1p(df['feature'])



الخطوة 5️⃣: تحويل البيانات والقياس


قياس الميزات أمر حاسم للعديد من خوارزميات ML، خاصة تلك التي تستخدم مقاييس المسافة (KNN، SVM) أو الانحدار التدريجي (الشبكات العصبية).


مقارنة طرق القياس:


مقارنة طرق القياس
الطريقة الصيغة نطاق المخرجات الأفضل لـ
قياس Min-Max (x-min)/(max-min) [0, 1] الشبكات العصبية
بيانات الصور
التوحيد القياسي (x - μ) / σ ~ [-3, 3] النماذج الخطية
(درجة Z) SVM، PCA
القياس القوي (x-الوسيط)/IQR متغير بيانات مع شذوذ
قياس Max Abs x / max(|x|) [-1, 1] البيانات المتناثرة
تحويل Log log(1 + x) متغير بيانات منحرفة
Box-Cox (x^λ - 1) / λ متغير بيانات غير طبيعية

تطبيق Python:

PYTHON
from sklearn.preprocessing import (
    StandardScaler, MinMaxScaler, RobustScaler,
    MaxAbsScaler, PowerTransformer, QuantileTransformer
)

# التوحيد القياسي (تطبيع درجة Z)
standard_scaler = StandardScaler()
df_standardized = standard_scaler.fit_transform(df_numeric)

# قياس Min-Max
minmax_scaler = MinMaxScaler(feature_range=(0, 1))
df_minmax = minmax_scaler.fit_transform(df_numeric)

# القياس القوي (مقاوم للقيم الشاذة)
robust_scaler = RobustScaler()
df_robust = robust_scaler.fit_transform(df_numeric)

# تحويل القوة (Box-Cox أو Yeo-Johnson)
power_transformer = PowerTransformer(method='yeo-johnson')
df_power = power_transformer.fit_transform(df_numeric)

# تحويل الكميات (توزيع منتظم أو طبيعي)
quantile_transformer = QuantileTransformer(output_distribution='normal')
df_quantile = quantile_transformer.fit_transform(df_numeric)



الخطوة 6️⃣: ترميز المتغيرات الفئوية


خوارزميات ML تتطلب مدخلات رقمية. تحويل المتغيرات الفئوية بشكل صحيح أمر ضروري.


نظرة عامة على طرق الترميز:


طرق ترميز المتغيرات الفئوية
📌 ترميز التسمية (Label Encoding)
→ يُحوّل الفئات إلى أعداد صحيحة (0، 1، 2، ...)
→ الأفضل لـ: المتغيرات الترتيبية (منخفض، متوسط، عالي)
→ ⚠️ تحذير: يُضمّن ترتيباً للمتغيرات الاسمية
📌 الترميز الأحادي الساخن (One-Hot Encoding)
→ ينشئ أعمدة ثنائية لكل فئة
→ الأفضل لـ: المتغيرات الاسمية مع فئات قليلة
→ ⚠️ تحذير: العدد الكبير = لعنة الأبعاد
📌 الترميز الترتيبي (Ordinal Encoding)
→ تعيين مخصص بترتيب محدد
→ الأفضل لـ: الترتيب الطبيعي (مستوى التعليم، التقييم)
📌 ترميز الهدف (Target Encoding)
→ استبدال الفئة بمتوسط المتغير المستهدف
→ الأفضل لـ: الفئويات عالية العدد
→ ⚠️ تحذير: خطر تسرب الهدف
📌 الترميز الثنائي (Binary Encoding)
→ يجمع ترميز التسمية + التمثيل الثنائي
→ الأفضل لـ: العدد الكبير مع فئات كثيرة
📌 ترميز التكرار/العدد (Frequency Encoding)
→ استبدال بعدد التكرار
→ الأفضل لـ: عندما يحمل التكرار معنى

تطبيق Python:

PYTHON
from sklearn.preprocessing import LabelEncoder, OneHotEncoder, OrdinalEncoder
import category_encoders as ce

# بيانات فئوية نموذجية
df_cat = pd.DataFrame({
    'color': ['red', 'blue', 'green', 'red', 'blue'],
    'size': ['small', 'medium', 'large', 'medium', 'small'],
    'brand': ['A', 'B', 'C', 'A', 'D']
})

# 1. ترميز التسمية
label_encoder = LabelEncoder()
df_cat['color_encoded'] = label_encoder.fit_transform(df_cat['color'])

# 2. الترميز الأحادي الساخن
onehot_encoder = OneHotEncoder(sparse=False, drop='first')
color_onehot = onehot_encoder.fit_transform(df_cat[['color']])

# باستخدام pandas get_dummies (طريقة أبسط)
df_onehot = pd.get_dummies(df_cat, columns=['color'], drop_first=True)

# 3. الترميز الترتيبي (بترتيب مخصص)
size_order = ['small', 'medium', 'large']
ordinal_encoder = OrdinalEncoder(categories=[size_order])
df_cat['size_encoded'] = ordinal_encoder.fit_transform(df_cat[['size']])

# 4. ترميز الهدف
target_encoder = ce.TargetEncoder(cols=['brand'])
df_cat['brand_target'] = target_encoder.fit_transform(df_cat['brand'], y_target)

# 5. الترميز الثنائي
binary_encoder = ce.BinaryEncoder(cols=['brand'])
df_binary = binary_encoder.fit_transform(df_cat)

# 6. ترميز التكرار
freq_map = df_cat['color'].value_counts().to_dict()
df_cat['color_freq'] = df_cat['color'].map(freq_map)



الخطوة 7️⃣: هندسة الميزات


هندسة الميزات هي فن إنشاء ميزات جديدة من البيانات الموجودة. وفقاً لـ Andrew Ng:


"التوصل إلى الميزات صعب، يستغرق وقتاً، يتطلب معرفة الخبراء. تعلم الآلة التطبيقي هو في الأساس هندسة الميزات."


تقنيات هندسة الميزات:


تقنيات هندسة الميزات
🔢 الميزات الرقمية
التجميع/التقسيم
ميزات متعددة الحدود (x²، x³، x₁*x₂)
تحويلات Log/الجذر التربيعي
النسب والفروقات
الإحصائيات المتحركة (المتوسط، الانحراف، الحد الأدنى)
📅 ميزات التاريخ/الوقت
السنة، الشهر، اليوم، الساعة، الدقيقة
يوم الأسبوع، أسبوع السنة
هل نهاية أسبوع، هل عطلة
الوقت منذ الحدث
الترميز الدوري (sin/cos)
📝 ميزات النص
عدد الكلمات، عدد الأحرف
تحويل TF-IDF
تضمينات الكلمات (Word2Vec، BERT)
درجات المشاعر
استخراج الكيانات المسماة
🌍 الميزات الجغرافية
المسافة إلى المعالم
التجميع (تحديد المنطقة)
كثافة السكان
Geohashing
🔗 ميزات التجميع
إحصائيات التجميع
ترميز العدد
إحصائيات الهدف حسب المجموعة

تطبيق Python:

PYTHON
from sklearn.preprocessing import PolynomialFeatures
from sklearn.feature_extraction.text import TfidfVectorizer

# 1. ميزات متعددة الحدود
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(df_numeric)

# 2. ميزات التاريخ/الوقت
df['datetime'] = pd.to_datetime(df['date'])
df['year'] = df['datetime'].dt.year
df['month'] = df['datetime'].dt.month
df['day'] = df['datetime'].dt.day
df['day_of_week'] = df['datetime'].dt.dayofweek
df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
df['quarter'] = df['datetime'].dt.quarter

# الترميز الدوري للشهر (يلتقط استمرارية يناير-ديسمبر)
df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)

# 3. التجميع
df['age_group'] = pd.cut(df['age'], 
                         bins=[0, 18, 35, 50, 65, 100],
                         labels=['طفل', 'شاب', 'بالغ', 'متوسط العمر', 'كبير'])

# 4. ميزات النسب
df['price_per_sqft'] = df['price'] / df['square_feet']
df['income_to_debt_ratio'] = df['income'] / (df['debt'] + 1)

# 5. ميزات التجميع
df['avg_purchase_by_customer'] = df.groupby('customer_id')['amount'].transform('mean')
df['total_orders_by_customer'] = df.groupby('customer_id')['order_id'].transform('count')

# 6. ميزات النص
tfidf = TfidfVectorizer(max_features=100)
text_features = tfidf.fit_transform(df['text_column'])



الخطوة 8️⃣: اختيار الميزات


ليست كل الميزات تساهم بالتساوي في أداء النموذج. اختيار الميزات يقلل الأبعاد ويحسن كفاءة النموذج.


طرق اختيار الميزات:


طرق اختيار الميزات
🎯 طرق التصفية (بناءً على المقاييس الإحصائية)
→ عتبة الارتباط
→ عتبة التباين
→ اختبار Chi-squared
→ اختبار ANOVA F
→ المعلومات المتبادلة
🔄 طرق المغلف (تستخدم أداء نموذج ML)
→ الاختيار التقدمي
→ الإزالة العكسية
→ الإزالة التكرارية للميزات (RFE)
→ البحث الشامل
→ 🌳 الطرق المضمنة (مدمجة في تدريب النموذج)
→ LASSO (تنظيم L1)
→ Ridge (تنظيم L2)
→ ElasticNet
→ أهمية قائمة على الأشجار
→ أهمية التبديل
📉 تقليل الأبعاد
→ PCA (تحليل المكونات الرئيسية)
→ LDA (التحليل التمييزي الخطي)
→ t-SNE (للتصور)
→ UMAP

تطبيق Python:

PYTHON
from sklearn.feature_selection import (
    VarianceThreshold, SelectKBest, chi2, f_classif,
    RFE, SelectFromModel, mutual_info_classif
)
from sklearn.ensemble import RandomForestClassifier
from sklearn.decomposition import PCA
from sklearn.linear_model import LassoCV

# 1. عتبة التباين (إزالة الميزات منخفضة التباين)
variance_selector = VarianceThreshold(threshold=0.01)
X_high_variance = variance_selector.fit_transform(X)

# 2. الاختيار القائم على الارتباط
corr_matrix = df_numeric.corr().abs()
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))
to_drop = [column for column in upper.columns if any(upper[column] > 0.95)]
df_reduced = df_numeric.drop(to_drop, axis=1)

# 3. SelectKBest مع chi-squared
kbest_selector = SelectKBest(score_func=chi2, k=10)
X_kbest = kbest_selector.fit_transform(X, y)
selected_features = X.columns[kbest_selector.get_support()]

# 4. الإزالة التكرارية للميزات
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rfe = RFE(estimator=rf, n_features_to_select=10)
X_rfe = rfe.fit_transform(X, y)
ranking = rfe.ranking_

# 5. أهمية الميزات القائمة على الأشجار
rf.fit(X, y)
importances = pd.DataFrame({
    'feature': X.columns,
    'importance': rf.feature_importances_
}).sort_values('importance', ascending=False)

# 6. LASSO لاختيار الميزات
lasso = LassoCV(cv=5, random_state=42)
lasso.fit(X, y)
selected_by_lasso = X.columns[lasso.coef_ != 0]

# 7. PCA لتقليل الأبعاد
pca = PCA(n_components=0.95)  # الحفاظ على 95% من التباين
X_pca = pca.fit_transform(X)
print(f"تم التقليل من {X.shape[1]} إلى {X_pca.shape[1]} مكون")



الخطوة 9️⃣: معالجة البيانات غير المتوازنة


عدم توازن الفئات شائع في المشاكل الحقيقية مثل اكتشاف الاحتيال والتشخيص الطبي والتنبؤ بالتسرب.


تقنيات معالجة عدم التوازن:


معالجة مجموعات البيانات غير المتوازنة
📈 الإفراط في العينات (زيادة فئة الأقلية)
→ الإفراط العشوائي في العينات
→ SMOTE (تقنية الإفراط في عينات الأقلية الاصطناعية)
→ ADASYN (الاصطناعي التكيفي)
→ BorderlineSMOTE
📉 نقص العينات (تقليل فئة الأغلبية)
→ نقص العينات العشوائي
→ روابط Tomek
→ الجيران الأقرب المحررين
→ NearMiss
🔄 طرق التركيب
→ SMOTEENN (SMOTE + ENN)
→ SMOTETomek
→ ⚖️ حلول مستوى الخوارزمية
→ أوزان الفئات
→ التعلم الحساس للتكلفة
→ تعديل العتبة
→ طرق المجموعة (BalancedRandomForest)

تطبيق Python:

PYTHON
from imblearn.over_sampling import SMOTE, ADASYN, RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler, TomekLinks
from imblearn.combine import SMOTEENN, SMOTETomek
from collections import Counter

# فحص توزيع الفئات
print(f"التوزيع الأصلي: {Counter(y)}")

# 1. الإفراط العشوائي في العينات
ros = RandomOverSampler(random_state=42)
X_ros, y_ros = ros.fit_resample(X, y)
print(f"بعد الإفراط العشوائي: {Counter(y_ros)}")

# 2. SMOTE
smote = SMOTE(random_state=42, k_neighbors=5)
X_smote, y_smote = smote.fit_resample(X, y)
print(f"بعد SMOTE: {Counter(y_smote)}")

# 3. ADASYN
adasyn = ADASYN(random_state=42)
X_adasyn, y_adasyn = adasyn.fit_resample(X, y)
print(f"بعد ADASYN: {Counter(y_adasyn)}")

# 4. نقص العينات العشوائي
rus = RandomUnderSampler(random_state=42)
X_rus, y_rus = rus.fit_resample(X, y)
print(f"بعد نقص العينات العشوائي: {Counter(y_rus)}")

# 5. SMOTEENN (التركيب)
smoteenn = SMOTEENN(random_state=42)
X_smoteenn, y_smoteenn = smoteenn.fit_resample(X, y)
print(f"بعد SMOTEENN: {Counter(y_smoteenn)}")

# 6. أوزان الفئات في النموذج
from sklearn.ensemble import RandomForestClassifier
rf_weighted = RandomForestClassifier(
    class_weight='balanced',  # يضبط الأوزان تلقائياً
    random_state=42
)
rf_weighted.fit(X, y)



الخطوة 🔟: تقسيم البيانات


التقسيم الصحيح للبيانات يضمن تقييم النموذج بدون تحيز.


استراتيجيات التقسيم:


استراتيجيات تقسيم البيانات
📊 طريقة الحجز (Holdout)
→ تقسيم بسيط للتدريب/الاختبار (عادة 80/20 أو 70/30)
📊 التقسيم الثلاثي
→ تدريب (60%) / تحقق (20%) / اختبار (20%)
🔄 التحقق المتقاطع K-Fold
→ تقسيم البيانات إلى K طيات، تدوير مجموعة الاختبار
→ الشائع: K = 5 أو K = 10
📈 K-Fold الطبقي
→ يحافظ على توزيع الفئات في كل طية
→ ضروري لمجموعات البيانات غير المتوازنة
→ 📅 تقسيم السلسلة الزمنية
→ يحترم الترتيب الزمني
→ لا تسرب لبيانات المستقبل
→ 🎲 K-Fold المجمّع
→ يبقي العينات المرتبطة معاً
→ يمنع تسرب البيانات من المجموعات

تطبيق Python:

PYTHON
from sklearn.model_selection import (
    train_test_split, KFold, StratifiedKFold,
    TimeSeriesSplit, GroupKFold, cross_val_score
)

# 1. تقسيم بسيط للتدريب/الاختبار
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# 2. تقسيم ثلاثي (تدريب/تحقق/اختبار)
X_temp, X_test, y_temp, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)
X_train, X_val, y_train, y_val = train_test_split(
    X_temp, y_temp, test_size=0.25, random_state=42, stratify=y_temp
)  # 0.25 من 80% = 20% من الإجمالي

# 3. التحقق المتقاطع K-Fold
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
for fold, (train_idx, val_idx) in enumerate(kfold.split(X)):
    X_train_fold = X.iloc[train_idx]
    X_val_fold = X.iloc[val_idx]
    print(f"الطية {fold+1}: حجم التدريب = {len(train_idx)}, حجم التحقق = {len(val_idx)}")

# 4. K-Fold الطبقي (يحافظ على توزيع الفئات)
strat_kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=strat_kfold, scoring='accuracy')
print(f"درجات CV: {scores}")
print(f"المتوسط: {scores.mean():.4f} (+/- {scores.std()*2:.4f})")

# 5. تقسيم السلسلة الزمنية
tscv = TimeSeriesSplit(n_splits=5)
for fold, (train_idx, val_idx) in enumerate(tscv.split(X)):
    print(f"الطية {fold+1}: تدريب = {train_idx[0]}-{train_idx[-1]}, "
          f"تحقق = {val_idx[0]}-{val_idx[-1]}")



📚 مكتبات Python الأساسية للمعالجة المسبقة للبيانات


📊 معالجة البيانات
→ pandas ← DataFrames، تنظيم البيانات
→ numpy ← العمليات الرقمية، المصفوفات
→ polars ← مكتبة DataFrame سريعة
→ dask ← الحوسبة المتوازية للبيانات الكبيرة
→ 🤖 تعلم الآلة
→ scikit-learn ← المعالجة المسبقة، النماذج، التقييم
→ imblearn ← معالجة البيانات غير المتوازنة
→ category_encoders ← ترميز فئوي متقدم
→ feature_engine ← أدوات هندسة الميزات
📈 التصور البياني
→ matplotlib ← الرسم الأساسي
→ seaborn ← التصور الإحصائي
→ plotly ← الرسوم التفاعلية
→ missingno ← تصور البيانات المفقودة
→ 📝 معالجة النص
→ nltk ← مجموعة أدوات اللغة الطبيعية
→ spacy ← NLP صناعي
→ gensim ← نمذجة المواضيع، Word2Vec
→ transformers ← تضمينات BERT، GPT
→ 🔢 التحليل الإحصائي
→ scipy ← الدوال الإحصائية
→ statsmodels ← النماذج الإحصائية
→ pingouin ← الاختبارات الإحصائية
🔄 التحقق من البيانات
→ great_expectations ← اختبار جودة البيانات
→ pandera ← التحقق من DataFrame
→ pydantic ← التحقق من البيانات

أمر التثبيت:

BASH
pip install pandas numpy scikit-learn imbalanced-learn category_encoders \
            matplotlib seaborn plotly missingno scipy feature-engine



🎯 مثال خط أنابيب المعالجة المسبقة الكامل


إليك خط أنابيب معالجة مسبقة جاهز للإنتاج:


PYTHON
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.feature_selection import SelectKBest, f_classif

# تحديد أنواع الأعمدة
numeric_features = ['age', 'income', 'balance']
categorical_features = ['gender', 'occupation', 'region']

# خط أنابيب المعالجة المسبقة الرقمية
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])

# خط أنابيب المعالجة المسبقة الفئوية
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('encoder', OneHotEncoder(drop='first', handle_unknown='ignore'))
])

# دمج خطوات المعالجة المسبقة
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ],
    remainder='drop'
)

# خط الأنابيب الكامل مع النموذج
from sklearn.ensemble import RandomForestClassifier

full_pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('feature_selection', SelectKBest(f_classif, k=20)),
    ('classifier', RandomForestClassifier(n_estimators=100, random_state=42))
])

# التدريب والتنبؤ
full_pipeline.fit(X_train, y_train)
y_pred = full_pipeline.predict(X_test)

# التقييم
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))



📊 قائمة فحص المعالجة المسبقة


قائمة فحص المعالجة المسبقة للبيانات ✓
□ تم تحميل البيانات وفحص المعلومات الأساسية (الشكل، الأنواع)
□ تم تحديد ومعالجة القيم المفقودة
□ تم إزالة التكرارات
□ تم تصحيح أنواع البيانات
□ تم اكتشاف ومعالجة القيم الشاذة
□ تم قياس/تطبيع الميزات الرقمية
□ تم ترميز الميزات الفئوية
□ تم استخراج ميزات التاريخ/الوقت
□ تم معالجة ميزات النص (إن وجد)
□ تم تحليل ارتباطات الميزات
□ تم تقييم أهمية الميزات
□ تم إزالة الميزات غير ذات الصلة
□ تم معالجة عدم توازن الفئات
□ تم تقسيم البيانات إلى تدريب/تحقق/اختبار
□ تم التحقق من عدم وجود تسرب للبيانات
□ تم إنشاء خط أنابيب لإعادة الإنتاج



🔬 المراجع الأكاديمية وأوراق البحث


الأعمال التأسيسية:


1. García, S., Luengo, J., & Herrera, F. (2015). المعالجة المسبقة للبيانات في التنقيب عن البيانات. Springer International Publishing. DOI: 10.1007/978-3-319-10247-4

- كتاب شامل يغطي جميع تقنيات المعالجة المسبقة


2. Han, J., Kamber, M., & Pei, J. (2011). التنقيب عن البيانات: المفاهيم والتقنيات (الطبعة 3). Morgan Kaufmann.

- المرجع القياسي لأساسيات التنقيب عن البيانات


3. Kotsiantis, S. B., Kanellopoulos, D., & Pintelas, P. E. (2006). "المعالجة المسبقة للبيانات للتعلم الخاضع للإشراف." المجلة الدولية لعلوم الحاسب, 1(2), 111-117.

- ورقة أساسية عن المعالجة المسبقة للتصنيف


البيانات المفقودة:


4. Little, R. J., & Rubin, D. B. (2019). التحليل الإحصائي مع البيانات المفقودة (الطبعة 3). Wiley.

- الدليل القاطع لنظرية وطرق البيانات المفقودة


5. Van Buuren, S. (2018). التعويض المرن للبيانات المفقودة (الطبعة 2). CRC Press.

- تغطية شاملة لـ MICE والتعويض الحديث


هندسة الميزات:


6. Zheng, A., & Casari, A. (2018). هندسة الميزات لتعلم الآلة. O'Reilly Media.

- دليل عملي لتقنيات هندسة الميزات


7. Kuhn, M., & Johnson, K. (2019). هندسة الميزات واختيارها: نهج عملي للنماذج التنبؤية. CRC Press.

- نهج أكاديمي وعملي لهندسة الميزات


التعلم غير المتوازن:


8. Chawla, N. V., et al. (2002). "SMOTE: تقنية الإفراط في عينات الأقلية الاصطناعية." مجلة أبحاث الذكاء الاصطناعي, 16, 321-357.

- ورقة SMOTE الأصلية (>25,000 اقتباس)


9. He, H., & Garcia, E. A. (2009). "التعلم من البيانات غير المتوازنة." معاملات IEEE على هندسة المعرفة والبيانات, 21(9), 1263-1284.

- مسح شامل لطرق التعلم غير المتوازن


المعالجة المسبقة للتعلم العميق:


10. Goodfellow, I., Bengio, Y., & Courville, A. (2016). التعلم العميق. MIT Press.

- الفصل 7 يغطي التنظيم والمعالجة المسبقة للشبكات العصبية


أوراق المسح الحديثة:


11. Raschka, S. (2018). "تقييم النموذج، واختيار النموذج، واختيار الخوارزمية في تعلم الآلة." arXiv:1811.12808.

- منظور حديث لتقسيم البيانات والتحقق


12. Gudivada, V., et al. (2017). "اعتبارات جودة البيانات للبيانات الضخمة وتعلم الآلة." مؤتمر IEEE على البيانات الضخمة.

- منظور صناعي على تأثير جودة البيانات




💡 النقاط الرئيسية


1. المعالجة المسبقة للبيانات ليست اختيارية - إنها أساس نجاح ML

2. افهم بياناتك أولاً - EDA حاسم قبل أي معالجة مسبقة

3. تعامل مع القيم المفقودة بشكل مناسب - الطريقة تعتمد على نوع الفقدان

4. قِس الميزات عند الضرورة - خاصة للخوارزميات القائمة على المسافة

5. رمّز الفئويات بشكل صحيح - one-hot مقابل ordinal يعتمد على المتغير

6. هندسة الميزات فن + علم - المعرفة بالمجال لا تقدر بثمن

7. تحقق دائماً من تسرب البيانات - خاصة أثناء التحقق المتقاطع

8. ابنِ خطوط أنابيب - ضمان إعادة الإنتاج ومنع الأخطاء

9. وثّق معالجتك المسبقة - أنت المستقبلي ستشكر أنت الحالي

10. كرر وحسّن - المعالجة المسبقة عملية تكرارية




🚀 الخطوات التالية


مستعد لتطبيق هذه التقنيات؟ إليك مسار التعلم:


1. تدرب على Kaggle - مجموعات بيانات حقيقية مع تحديات المعالجة المسبقة

2. اقرأ وثائق scikit-learn - دروس ممتازة للمعالجة المسبقة

3. ادرس الأوراق المرجعية - عمّق فهمك النظري

4. ابنِ مشاريع شاملة - طبق كل شيء في سيناريوهات حقيقية

5. انضم لمجتمعات علم البيانات - تعلم من تجارب الممارسين




🎓 "الهدف هو تحويل البيانات إلى معلومات، والمعلومات إلى بصيرة." - Carly Fiorina




هذا الدليل يُحافظ عليه فريق أبحاث الذكاء الاصطناعي في استوديوهات أسند. للأسئلة أو المساهمات، تواصل معنا على [email protected]

العودة للصفحة الرئيسية تحميل PDF