AI: أساسيات البيانات
آخر تحديث: 2026-08-26
البيانات هي وقود الذكاء الاصطناعي - بدون بيانات، حتى أفضل الخوارزميات لا تستطيع تدريب نماذج فعّالة. ستساعدك هذه الفصل على فهم أنواع البيانات، وهندسة الميزات، وتقسيم مجموعات البيانات، والحديد القاعدة "قمامة الداخل، قمامة الخارج".
1. ما ستتعلمه
- الدور المركزي للبيانات في الذكاء الاصطناعي
- البيانات المُهيكلة مقابل البيانات غير المُهيكلة
- السمات والعلامات
- تقسيم مجموعة البيانات: التدريب / التقييم / الاختبار
- كيف يؤثر جودة البيانات على أداء الذكاء الاصطناعي؟
2. قصة حقيقية عن مشروع تعلّم آلي
(1) نقطة الألم: بعد شهر من التدريب، تكون الدقة 60%
أمضى فريق بوب شهرًا في تدريب نموذج لتصنيف الصور، لكن دقته كانت 60% فقط. عند التحقيق، اكتشفوا أن 70% من بيانات التدريب كانت مكونة من صور ملتقطة في أيام مشمسة، بينما تشمل سيناريوهات العالم الحقيقي مجموعة متنوعة من ظروف الطقس - المطر، الضباب، والليل. بما أن النموذج "لم يرَ" هذه الظروف قط، فمن الطبيعي ألا يكون قادرًا على التعرف عليها.
(2) الحلول المُستندة إلى البيانات
قال تشارلي: "هذا هو 'القمامة الداخلة، القمامة الخارجة' - الذكاء الاصطناعي لا يستطيع تعلّم إلا ما تُغذيه له. بدلاً من ضبط معاملات الخوارزمية، يجب عليك أولاً إصلاح توزيع البيانات."
▶ مثال: فحص توزيع البيانات - تحديد التحيّز (الصعوبة: ⭐⭐)
# 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!")
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. الميزات والتصنيفات
الميزات هي المُدخلات للنموذج، والتصنيفات هي الأهداف التي يتنبأ بها النموذج.
graph LR
A[الميزة 1<br/>المساحة 120 م²] --> C[نموذج الذكاء الاصطناعي]
B[الميزة 2<br/>الغرف 4] --> C
D[الميزة 3<br/>تقييم الموقع 8] --> C
C --> E[التصنيف<br/>السعر 350,000$]
(1) ما هي الميزة؟
الميزة هي سمة في البيانات تكون "مُفيدة في اتخاذ القرارات":
| مجموعة البيانات | ميزات محتملة | تصنيف |
|---|---|---|
| بيانات أسعار الإسكان | الحجم، عدد الغرف، تقييم الموقع، المستوى (الطابق) | سعر العقار |
| بيانات البريد الإلكتروني | المُرسل، تكرار الكلمات المفتاحية، عدد المرفقات | هل هو بريد مزعج؟ |
| بيانات المستخدم | العمر، عدد مشاهدات الصفحة، سجل الشراء | احتمالية الشراء |
| بيانات الصور | قيم البكسل (ميزات مُستخرجة تلقائيًا بالتعلم العميق) | فئة الصورة |
(2) هندسة الميزات—الاستخراج اليدوي مقابل التلقائي
▶ مثال: هندسة ميزات يدوية—استخراج الميزات من النص (الصعوبة: ⭐⭐)
# مثال: هندسة ميزات يدوية
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 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. تقسيم مجموعات البيانات
عند تدريب نموذج ذكاء اصطناعي، يجب تقسيم البيانات إلى ثلاث مجموعات متعارضة:
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) تقسيم مجموعة البيانات باستخدام بايثون
▶ مثال: تقسيم البيانات إلى مجموعات التدريب والتحقق والاختبار (الصعوبة: ⭐⭐)
# 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}%)")
مجموعة البيانات الكاملة: 20 عينة
مجموعة التدريب: 12 عينة (60%)
مجموعة التحقق: 4 عينات (20%)
مجموعة الاختبار: 4 عينات (20%)
6. جودة البيانات — القمامة الداخلة، القمامة الخارجة
تُحدِّد جودة البيانات مباشرةً الحد الأقصى لأداء الذكاء الاصطناعي. فمهما كان الخوارزمية جيدة، لا يمكنها تعويض البيانات الرديئة:
| مشكلة الجودة | الوصف | التأثير | طريقة الاختبار |
|---|---|---|---|
| القيم المفقودة | بعض الحقول تكون فارغة | لا يستطيع النموذج معالجة المدخلات المفقودة | df.isnull().sum() |
| البيانات المكررة | نفس السجل يظهر عدة مرات | يُفرط النموذج في التكيف مع العينات المكررة | df.duplicated().sum() |
| عدم توازن الفئات | أحد الفئات يحتوي على عينات أكثر بكثير من غيرها | يُفضِّل النموذج الفئة الأكثرية | df[label].value_counts() |
| الضوضاء/الأخطاء | قيم البيانات غير معقولة بوضوح | تعلَّم النموذج نمطاً خاطئاً | الكشف عن القيم الشاذة إحصائياً |
| خطأ التصنيف | تصنيف غير صحيح | تعلَّم النموذج تعييناً غير صحيح | فحص عشوائي يدوي |
(1) تحديد مشكلات جودة البيانات
▶ مثال: تقرير فحص جودة البيانات (الصعوبة: ⭐⭐)
# قائمة التحقق من جودة البيانات
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])
=== تقرير جودة البيانات ===
إجمالي الصفوف: 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
7. مجموعات البيانات العامة الشائعة الاستخدام
لا يتطلب إجراء تجارب الذكاء الاصطناعي بالضرورة جمع بياناتك الخاصة؛ فهناك العديد من مجموعات البيانات العامة عالية الجودة المتاحة للاستخدام الفوري:
| مجموعة البيانات | المهمة | عدد العينات | السمات |
|---|---|---|---|
| آيريس | تصنيف | 150 | أبسط مجموعة بيانات تمهيدية لتعلم الآلة |
| تايتانيك | تصنيف | 891 | تحدي Kaggle التمهيدي الكلاسيكي |
| MNIST | تصنيف الصور | 70,000 | أرقام مكتوبة بخط اليد، مقدمة في الرؤية الحاسوبية |
| CIFAR-10 | تصنيف الصور | 60,000 | 10 فئات من الصور الملونة؛ أكثر تحديًا من MNIST |
| California Housing | انحدار | 20,640 | تنبؤ بأسعار الإسكان في كاليفورنيا |
| IMDb Reviews | تحليل المشاعر | 50,000 | تصنيف مراجعات الأفلام إلى إيجابية أو سلبية |
8. مثال كامل: خط إعداد بيانات تايتانيك
على مجموعة بيانات تايتانيك، قم بتنفيذ الخطوات التالية: نظرة عامة على البيانات → التحقق من القيم المفقودة → إحصائيات توزيع الفئات → تقسيم البيانات إلى مجموعات تدريب واختبار، لتكوين "خط إعداد بيانات" متكامل:
▶ مثال: خط إعداد بيانات متكامل لمجموعة بيانات تايتانيك (الصعوبة: ⭐⭐⭐)
# ============================================
# 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!")
=== 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!
❓ أسئلة شائعة
📖 ملخص
- البيانات هي وقود الذكاء الاصطناعي؛ بدون بيانات عالية الجودة، لن تكون هناك نماذج جيدة — القمامة الداخلة تعني القمامة الخارجة.
- تنقسم البيانات إلى ثلاث فئات: منظمة (جداول)، شبه منظمة (JSON/XML)، و غير منظمة (صور/نصوص/صوتيات).
- الخصائص هي مُدخلات النموذج، والعلامات هي الأهداف التي يتنبأ بها النموذج؛ هندسة الخصائص مهارة أساسية في التعلم الآلي التقليدي.
- يجب تقسيم مجموعة البيانات إلى مجموعة تدريب، مجموعة تحقق، ومجموعة اختبار؛ يجب عدم استخدام مجموعة الاختبار مطلقًا أثناء التدريب.
- يجب حل مشكلات جودة البيانات (القيم المفقودة، التكرارات، الالتواء، الضوضاء، والعلامات غير الصحيحة) في المراحل الأولى؛ لا يمكن لتدريب النموذج إصلاح البيانات الرديئة.
- مجموعات البيانات العامة (Iris، Titanic، MNIST) هي أفضل نقطة انطلاق عند التعلم حول الذكاء الاصطناعي.
📝 تمارين
- تمرين أساسي (الصعوبة ⭐): قم بتحميل مجموعة بيانات CSV (أو مجموعة بيانات مضمنة مع sklearn) باستخدام Python، واستخدم
df.info()وdf.describe()لتلخيص المعلومات الأساسية. - مسألة متقدمة (الصعوبة ⭐⭐): تحقق من القيم المفقودة وافحص توزيع الفئات في البيانات، ثم ارسم هيستوجراماً لعمود معين (تلميح:
df[column].hist()). - مسألة تحدٍّ (الصعوبة ⭐⭐⭐): استخدم
train_test_splitلتقسيم البيانات وفقاً للقاعدة 80/20، وقارن ما إذا كانت نسب الفئات متماثلة بعد التقسيم العادي والتقسيم الطبقي (stratified split).