AI: أساسيات البيانات

آخر تحديث: 2026-08-26

البيانات هي وقود الذكاء الاصطناعي - بدون بيانات، حتى أفضل الخوارزميات لا تستطيع تدريب نماذج فعّالة. ستساعدك هذه الفصل على فهم أنواع البيانات، وهندسة الميزات، وتقسيم مجموعات البيانات، والحديد القاعدة "قمامة الداخل، قمامة الخارج".

1. ما ستتعلمه



2. قصة حقيقية عن مشروع تعلّم آلي

(1) نقطة الألم: بعد شهر من التدريب، تكون الدقة 60%

أمضى فريق بوب شهرًا في تدريب نموذج لتصنيف الصور، لكن دقته كانت 60% فقط. عند التحقيق، اكتشفوا أن 70% من بيانات التدريب كانت مكونة من صور ملتقطة في أيام مشمسة، بينما تشمل سيناريوهات العالم الحقيقي مجموعة متنوعة من ظروف الطقس - المطر، الضباب، والليل. بما أن النموذج "لم يرَ" هذه الظروف قط، فمن الطبيعي ألا يكون قادرًا على التعرف عليها.

(2) الحلول المُستندة إلى البيانات

قال تشارلي: "هذا هو 'القمامة الداخلة، القمامة الخارجة' - الذكاء الاصطناعي لا يستطيع تعلّم إلا ما تُغذيه له. بدلاً من ضبط معاملات الخوارزمية، يجب عليك أولاً إصلاح توزيع البيانات."

▶ مثال: فحص توزيع البيانات - تحديد التحيّز (الصعوبة: ⭐⭐)

PYTHON
# Check data distribution — first step before any AI project
import pandas as pd

df = pd.DataFrame({
    'weather': ['sunny'] * 70 + ['rainy'] * 15 + ['foggy'] * 10 + ['night'] * 5,
    'label': ['car'] * 50 + ['car'] * 5 + ['car'] * 3 + ['car'] * 2 +
             ['truck'] * 20 + ['truck'] * 10 + ['truck'] * 7 + ['truck'] * 3
})

print("Weather distribution:")
print(df['weather'].value_counts())
print(f"\nSunny images: {70/100*100:.0f}% — That's a problem!")
💻 المخرجات:

TEXT 📖 للعرض فقط
Weather distribution:
sunny    70
rainy    15
foggy    10
night     5
Name: weather, dtype: int64

Sunny images: 70% — That's a problem!

(3) الفوائد: عقلية تُقدّم البيانات أولاً

بعد أن أضاف بوب صورًا لكل حالة طقس، ارتفعت نسبة الدقة من 60% إلى 85%. وخلص إلى وجود قاعدة حديدية واحدة: "ضبط البيانات أكثر فعالية من ضبط النموذج."


3. أنواع البيانات

(1) التصنيف حسب البنية

النوع الوصف المثال طريقة معالجة الذكاء الاصطناعي
مُهيكلة لها تنسيق ثابت (صفوف وأعمدة) CSV، جداول SQL، Excel يتم إدخالها مباشرة في نماذج التعلم الآلي التقليدية
شبه مُهيكلة مُهيكلة جزئيًا لكن بتنسيق مرن JSON، XML، HTML، السجلات يتم إدخالها في النموذج بعد استخراج الحقول
غير مُهيكلة لا تنسيق ثابت لها الصور، الصوت، الفيديو، اللغة الطبيعية التعلم العميق (CNN/RNN/Transformer)

(2) التصنيف حسب النوع العددي

النوع الوصف المثال معالجة النموذج
عددي أرقام مستمرة أو منفصلة السعر، المساحة، العمر تُستخدم مباشرة
فئوي عدد محدود من القيم المنفصلة الجنس، المدينة، المهنة يتطلب ترميزًا (One-Hot)
نصي سلاسل لغوية طبيعية التعليقات، نصوص البريد الإلكتروني يتطلب تمثيلات رقمية (Embedding)
زمني التاريخ والوقت وقت الطلب، وقت السجل ميزات يجب استخراجها (السنة/الشهر/الساعة)


4. الميزات والتصنيفات

الميزات هي المُدخلات للنموذج، والتصنيفات هي الأهداف التي يتنبأ بها النموذج.

100%
graph LR
    A[الميزة 1<br/>المساحة 120 م²] --> C[نموذج الذكاء الاصطناعي]
    B[الميزة 2<br/>الغرف 4] --> C
    D[الميزة 3<br/>تقييم الموقع 8] --> C
    C --> E[التصنيف<br/>السعر 350,000$]

(1) ما هي الميزة؟

الميزة هي سمة في البيانات تكون "مُفيدة في اتخاذ القرارات":

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

(2) هندسة الميزات—الاستخراج اليدوي مقابل التلقائي

▶ مثال: هندسة ميزات يدوية—استخراج الميزات من النص (الصعوبة: ⭐⭐)

PYTHON
# مثال: هندسة ميزات يدوية
import pandas as pd

df = pd.DataFrame({
    'text': ['Free iPhone winner!', 'Meeting at 3pm', 'URGENT: Claim now'],
    'label': ['spam', 'ham', 'spam']
})

# استخراج ميزات يدوي: عد كلمات محددة
df['has_free'] = df['text'].str.lower().str.contains('free').astype(int)
df['has_urgent'] = df['text'].str.lower().str.contains('urgent').astype(int)
df['exclamation_count'] = df['text'].str.count('!')
df['text_length'] = df['text'].str.len()

print(df)
💻 المخرجات:

TEXT 📖 للعرض فقط
                  text label  has_free  has_urgent  exclamation_count  text_length
0  Free iPhone winner!  spam         1           0                  1           19
1     Meeting at 3pm    ham         0           0                  0           14
2  URGENT: Claim now   spam         0           1                  0           17
💡 نصيحة: يتطلب التعلم الآلي التقليدي تصميم الميزات يدويًا (هندسة الميزات)، بينما يمكن للتعلم العميق تعلم الميزات تلقائيًا من البيانات الخام. هذه إحدى المزايا الجوهرية لثورة التعلم العميق.



5. تقسيم مجموعات البيانات

عند تدريب نموذج ذكاء اصطناعي، يجب تقسيم البيانات إلى ثلاث مجموعات متعارضة:

100%
graph TB
    A[مجموعة البيانات الكاملة<br/>1000 عينة] --> B[مجموعة التدريب<br/>800 عينة<br/>80%]
    A --> C[مجموعة التحقق<br/>100 عينة<br/>10%]
    A --> D[مجموعة الاختبار<br/>100 عينة<br/>10%]
    
    B --> E[تدريب النموذج]
    C --> F[ضبط المعاملات الفائقة]
    D --> G[التقييم النهائي<br/>لا تُستخدم أثناء التدريب]
المجموعة العملية النسبة القواعد الأساسية
مجموعة التدريب تدريب النموذج (تعلم المعلمات) 60–80% يتعلم النموذج مباشرة من هذه المجموعة
مجموعة التحقق ضبط المعاملات الفائقة (اختيار التكوين الأمثل) 10–20% تؤثر بشكل غير مباشر على النموذج، لكن لا يتم تعلمها مباشرة
مجموعة الاختبار التقييم النهائي (الأداء المُبلَّغ عنه) 10–20% يجب ألا تُستخدم أثناء التدريب

(1) تقسيم مجموعة البيانات باستخدام بايثون

▶ مثال: تقسيم البيانات إلى مجموعات التدريب والتحقق والاختبار (الصعوبة: ⭐⭐)

PYTHON
# Split dataset into train/validation/test sets
from sklearn.model_selection import train_test_split
import pandas as pd

# Sample dataset
df = pd.DataFrame({
    'area_sqm': [50, 80, 120, 65, 200, 90, 55, 110, 75, 150,
                 60, 85, 130, 95, 180, 70, 100, 45, 140, 105],
    'price_usd': [150000, 280000, 350000, 220000, 500000, 260000,
                  165000, 320000, 240000, 420000, 175000, 270000,
                  380000, 290000, 460000, 210000, 300000, 135000,
                  400000, 310000]
})

# First split: 80% train+val, 20% test
train_val, test = train_test_split(df, test_size=0.2, random_state=42)

# Second split: 75% of train_val = 60% total train, 25% = 20% total val
train, val = train_test_split(train_val, test_size=0.25, random_state=42)

print(f"Full dataset:  {len(df)} samples")
print(f"Training set:  {len(train)} samples ({len(train)/len(df)*100:.0f}%)")
print(f"Validation set:{len(val)} samples ({len(val)/len(df)*100:.0f}%)")
print(f"Test set:      {len(test)} samples ({len(test)/len(df)*100:.0f}%)")
💻 الإخراج:

TEXT 📖 للعرض فقط
مجموعة البيانات الكاملة:  20 عينة
مجموعة التدريب:  12 عينة (60%)
مجموعة التحقق: 4 عينات (20%)
مجموعة الاختبار: 4 عينات (20%)
⚠️ ملاحظة: يجب ألا تُستخدم مجموعة الاختبار أبدًا أثناء التدريب. إذا كان النموذج قد "رأى" البيانات في مجموعة الاختبار، فلن تكون نتائج التقييم موضوعية - تمامًا كما لو نظرت إلى الإجابات قبل امتحان، فإن درجتك لن تعكس قدرتك الحقيقية.



6. جودة البيانات — القمامة الداخلة، القمامة الخارجة

تُحدِّد جودة البيانات مباشرةً الحد الأقصى لأداء الذكاء الاصطناعي. فمهما كان الخوارزمية جيدة، لا يمكنها تعويض البيانات الرديئة:

مشكلة الجودة الوصف التأثير طريقة الاختبار
القيم المفقودة بعض الحقول تكون فارغة لا يستطيع النموذج معالجة المدخلات المفقودة df.isnull().sum()
البيانات المكررة نفس السجل يظهر عدة مرات يُفرط النموذج في التكيف مع العينات المكررة df.duplicated().sum()
عدم توازن الفئات أحد الفئات يحتوي على عينات أكثر بكثير من غيرها يُفضِّل النموذج الفئة الأكثرية df[label].value_counts()
الضوضاء/الأخطاء قيم البيانات غير معقولة بوضوح تعلَّم النموذج نمطاً خاطئاً الكشف عن القيم الشاذة إحصائياً
خطأ التصنيف تصنيف غير صحيح تعلَّم النموذج تعييناً غير صحيح فحص عشوائي يدوي

(1) تحديد مشكلات جودة البيانات

▶ مثال: تقرير فحص جودة البيانات (الصعوبة: ⭐⭐)

PYTHON
# قائمة التحقق من جودة البيانات
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'age': [25, 30, np.nan, 45, 200, 28, 30, 30, 35, np.nan],
    'income': [50000, 60000, 45000, np.nan, 80000, 55000, 60000, 62000, 70000, 48000],
    'label': ['buy', 'no', 'buy', 'no', 'buy', 'no', 'no', 'no', 'buy', 'no']
})

print("=== تقرير جودة البيانات ===")
print(f"إجمالي الصفوف: {len(df)}")
print(f"\nالقيم المفقودة لكل عمود:")
print(df.isnull().sum())
print(f"\nالصفوف المكررة: {df.duplicated().sum()}")
print(f"\nتوزيع التصنيفات:")
print(df['label'].value_counts())
print(f"\nالقيم المشبوهة (العمر > 120):")
print(df[df['age'] > 120])
💻 المخرجات:

TEXT 📖 للعرض فقط
=== تقرير جودة البيانات ===
إجمالي الصفوف: 10

القيم المفقودة لكل عمود:
age       2
income    1
label     0
dtype: int64

الصفوف المكررة: 0

توزيع التصنيفات:
no     6
buy    4
Name: label, dtype: int64

القيم المشبوهة (العمر > 120):
   age  income label
4  200   80000   buy
💡 نصيحة: القيمة age=200 هي بيانات خاطئة بوضوح. إذا لم تُنظَّف القيم الشاذة كهذه، فسيتعلم النموذج قاعدة عبثية مثل "الأشخاص الذين أعمارهم 200 سنة سيقومون بالشراء."



7. مجموعات البيانات العامة الشائعة الاستخدام

لا يتطلب إجراء تجارب الذكاء الاصطناعي بالضرورة جمع بياناتك الخاصة؛ فهناك العديد من مجموعات البيانات العامة عالية الجودة المتاحة للاستخدام الفوري:

مجموعة البيانات المهمة عدد العينات السمات
آيريس تصنيف 150 أبسط مجموعة بيانات تمهيدية لتعلم الآلة
تايتانيك تصنيف 891 تحدي Kaggle التمهيدي الكلاسيكي
MNIST تصنيف الصور 70,000 أرقام مكتوبة بخط اليد، مقدمة في الرؤية الحاسوبية
CIFAR-10 تصنيف الصور 60,000 10 فئات من الصور الملونة؛ أكثر تحديًا من MNIST
California Housing انحدار 20,640 تنبؤ بأسعار الإسكان في كاليفورنيا
IMDb Reviews تحليل المشاعر 50,000 تصنيف مراجعات الأفلام إلى إيجابية أو سلبية


8. مثال كامل: خط إعداد بيانات تايتانيك

على مجموعة بيانات تايتانيك، قم بتنفيذ الخطوات التالية: نظرة عامة على البيانات → التحقق من القيم المفقودة → إحصائيات توزيع الفئات → تقسيم البيانات إلى مجموعات تدريب واختبار، لتكوين "خط إعداد بيانات" متكامل:

▶ مثال: خط إعداد بيانات متكامل لمجموعة بيانات تايتانيك (الصعوبة: ⭐⭐⭐)

PYTHON
# ============================================
# Complete Data Preparation Pipeline
# Dataset: Titanic (simulated)
# ============================================
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# Simulated Titanic-like dataset
np.random.seed(42)
df = pd.DataFrame({
    'pclass': np.random.choice([1, 2, 3], 100, p=[0.2, 0.3, 0.5]),
    'sex': np.random.choice(['male', 'female'], 100, p=[0.6, 0.4]),
    'age': np.where(np.random.rand(100) > 0.15,
                    np.random.randint(1, 80, 100), np.nan),
    'fare': np.round(np.random.uniform(10, 500, 100), 2),
    'survived': np.random.choice([0, 1], 100, p=[0.6, 0.4])
})

# Step 1: Overview
print("=== Step 1: Data Overview ===")
print(f"Shape: {df.shape}")
print(df.head(5))

# Step 2: Missing values
print("\n=== Step 2: Missing Values ===")
missing = df.isnull().sum()
missing_pct = (df.isnull().sum() / len(df) * 100).round(1)
print(pd.DataFrame({'count': missing, 'percent': missing_pct}))

# Step 3: Label distribution
print("\n=== Step 3: Label Distribution ===")
print(df['survived'].value_counts())
print(f"Survival rate: {df['survived'].mean()*100:.1f}%")

# Step 4: Train/test split
train, test = train_test_split(df, test_size=0.2, random_state=42, 
                                stratify=df['survived'])
print(f"\n=== Step 4: Data Split ===")
print(f"Train: {len(train)} samples, survival rate: {train['survived'].mean()*100:.1f}%")
print(f"Test:  {len(test)} samples, survival rate: {test['survived'].mean()*100:.1f}%")
print(f"\nStratified split ensures same survival rate in both sets!")
💻 المخرجات:

TEXT 📖 للعرض فقط
=== Step 1: Data Overview ===
Shape: (100, 5)
   pclass     sex   age    fare  survived
0       3  female  47.0  339.89         1
1       3  female  63.0  361.38         0
2       1  female  44.0  309.18         0
3       3    male  28.0  385.59         0
4       1    male   8.0  477.95         0

=== Step 2: Missing Values ===
         count  percent
pclass       0      0.0
sex          0      0.0
age         14     14.0
fare         0      0.0
survived     0      0.0

=== Step 3: Label Distribution ===
0    58
1    42
Name: survived, dtype: int64
Survival rate: 42.0%

=== Step 4: Data Split ===
Train: 80 samples, survival rate: 42.5%
Test:  20 samples, survival rate: 40.0%

Stratified split ensures same survival rate in both sets!

❓ أسئلة شائعة

س هل يصبح الذكاء الاصطناعي أكثر دقة مع زيادة كمية البيانات؟
ج ليس بالضرورة. جودة البيانات أهم من كميتها. قد تتفوق 10,000 سجل نظيف على 1 مليون سجل مزعج عند نموذج تدريب أفضل. العوامل الأساسية: حجم البيانات، الجودة، التنوع، والتمثيل – جميعها ضرورية.
س لماذا لا يمكن لمجموعة التدريب ومجموعة الاختبار أن تتداخل؟
ج لأن مجموعة الاختبار تُستخدم لتقييم "القدرة الحقيقية" للنموذج. إذا كان النموذج قد "رأى" بيانات من مجموعة الاختبار أثناء التدريب، فسيقوم بحفظ الإجابات بدلاً من تعلم الطريقة – وهذا يسمى تسرّب البيانات، وسيؤدي إلى نتائج تقييم مبالغ فيها.
س ما هو انحراف البيانات (عدم التوازن)؟ وكيف يمكن معالجته؟
ج يشير انحراف البيانات إلى فرق كبير في عدد العينات عبر الفئات المختلفة (مثل 99% طبيعي مقابل 1% غير طبيعي). تشمل الحلول: ① جمع المزيد من البيانات من الفئة الأقل عدداً؛ ② أخذ عينات زائدة من الفئة الأقل (SMOTE)؛ ③ أخذ عينات ناقصة من الفئة الأكثر عدداً؛ ④ ضبط أوزان الفئات؛ ⑤ استخدام درجة F1 بدلاً من الدقة للتقييم.
س ما هو هندسة الميزات؟ ولماذا يتم إجراؤها؟
ج هندسة الميزات هي عملية استخلاص أو بناء ميزات جديدة من البيانات الخام تكون مفيدة للتنبؤ. على سبيل المثال، يمكن اشتقاق ميزات مثل "هل هو عطلة نهاية الأسبوع" أو "هل هو وقت ليلي" من "وقت الطلب". يمكن لهندسة الميزات الجيدة أن تُمكّن النماذج البسيطة من تحقيق نتائج مماثلة للنماذج المعقدة، مما يجعلها حاسمة في التعلم الآلي التقليدي. يمكن للتعلم العميق إجراء استخلاص الميزات تلقائياً، مما يقلل الحاجة إلى هندسة الميزات اليدوية.
س أين يمكنني العثور على مجموعات بيانات مجانية؟
ج Kaggle (kaggle.com/datasets)، مستودع التعلم الآلي في UCI، بحث مجموعات بيانات Google، مجموعات بيانات Hugging Face، ومنصات البيانات الحكومية المفتوحة. يستخدم هذا البرنامج التعليمي مجموعات البيانات المضمنة في sklearn، لذا لا حاجة للتنزيل الإضافي.
س ما هو التقسيم الطبقي (Stratified Split)؟
ج قد يؤدي التقسيم العشوائي القياسي إلى عدم توازن في نسب الفئات بين مجموعتي التدريب والاختبار. يضمن التقسيم الطبقي أن نسب الفئات في كل مجموعة تتطابق مع تلك الموجودة في البيانات الأصلية. لمجموعات البيانات المنحرفة (مثل 90% مقابل 10%)، يكون التقسيم الطبقي ضرورياً فعلياً.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (الصعوبة ⭐): قم بتحميل مجموعة بيانات CSV (أو مجموعة بيانات مضمنة مع sklearn) باستخدام Python، واستخدم df.info() و df.describe() لتلخيص المعلومات الأساسية.
  2. مسألة متقدمة (الصعوبة ⭐⭐): تحقق من القيم المفقودة وافحص توزيع الفئات في البيانات، ثم ارسم هيستوجراماً لعمود معين (تلميح: df[column].hist()).
  3. مسألة تحدٍّ (الصعوبة ⭐⭐⭐): استخدم train_test_split لتقسيم البيانات وفقاً للقاعدة 80/20، وقارن ما إذا كانت نسب الفئات متماثلة بعد التقسيم العادي والتقسيم الطبقي (stratified split).
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%