الدرس 1 من 9

يعني إيه Machine Learning؟

بدل ما تكتب القواعد بنفسك، الكمبيوتر يستنتجها من الأمثلة.

البرمجة العادية ضد تعلم الآلة

في البرمجة العادية انت بتكتب القواعد: «لو الإيميل فيه كلمة مبروك كسبت، يبقى spam». بس مستحيل تكتب قاعدة لكل حالة. في Machine Learning بتدي الكمبيوتر آلاف الإيميلات ومكتوب على كل واحد spam ولا لأ، وهو يستنتج القواعد لوحده.

Machine Learningداتا + إجابات ← الكمبيوتر يطلع القواعد
البرمجة العاديةقواعد انت كاتبها + داتا ← إجابات

الأنواع

النوعبيعمل إيهمثال
Supervised: Regressionبيتوقع رقمسعر شقة، مبيعات الشهر الجاي
Supervised: Classificationبيتوقع فئةالعميل هيمشي ولا لأ، الصورة قطة ولا كلب
Unsupervised: Clusteringبيقسم الداتا لمجموعات من غير إجاباتتقسيم الزباين لشرايح

Supervised (تعلم موجّه) يعني الداتا فيها الإجابة الصح، زي طالب بيذاكر من امتحانات قديمة محلولة. Unsupervised (غير موجّه) يعني مفيش إجابات، والموديل بيدور على أنماط لوحده.

features المدخلات اللي الموديل بيتعلم منها، زي المساحة وعدد الأوض. بنسميها X.
label / target الحاجة اللي عايزين نتوقعها، زي السعر. بنسميها y.
training إن الموديل يتعلم من الداتا، وفي scikit-learn اسمها fit.
prediction إن الموديل يتوقع لحالة جديدة، واسمها predict.

الداتا اللي هنشتغل عليها

هنعمل ملفين داتا واقعيين: أسعار شقق في القاهرة والجيزة وإسكندرية، وعملاء شركة اتصالات منهم اللي ساب الشركة. شغّل الكود ده مرة واحدة جنب الـ notebook بتاعك:

make_data.py
import numpy as np
import pandas as pd

rng = np.random.default_rng(42)

# ---------- apartments.csv (regression) ----------
n = 600
city = rng.choice(["Cairo", "Giza", "Alexandria"], n, p=[0.45, 0.30, 0.25])
area = rng.integers(60, 221, n)
rooms = np.clip((area / 45).round().astype(int) + rng.integers(-1, 2, n), 1, 6)
floor = rng.integers(0, 16, n)
age = rng.integers(0, 41, n)
metro_km = rng.uniform(0.2, 8, n).round(1)
city_bonus = pd.Series(city).map({"Cairo": 600, "Giza": 300, "Alexandria": 0}).to_numpy()
price = (area * 18 + rooms * 80 + floor * 15 - age * 12 - metro_km * 90
         + city_bonus + rng.normal(0, 250, n))
apartments = pd.DataFrame({
    "city": city, "area": area, "rooms": rooms, "floor": floor,
    "age": age, "metro_km": metro_km, "price_k": price.round(0).astype(int),
})
apartments.to_csv("apartments.csv", index=False)

# ---------- churn.csv (classification) ----------
n = 1500
tenure = rng.integers(1, 73, n)                     # months with the company
bill = rng.uniform(100, 900, n).round(0)            # monthly bill (EGP)
complaints = rng.poisson(0.8, n)
data_gb = rng.uniform(1, 80, n).round(1)
contract = rng.choice(["monthly", "yearly"], n, p=[0.6, 0.4])
logit = (-0.3 - 0.05 * tenure + 0.003 * (bill - 400) + 0.8 * complaints
         - 1.6 * (contract == "yearly") + 0.9 * ((data_gb > 50) & (tenure < 12)))
churned = (rng.random(n) < 1 / (1 + np.exp(-logit))).astype(int)
churn = pd.DataFrame({
    "tenure": tenure, "bill": bill, "complaints": complaints,
    "data_gb": data_gb, "contract": contract, "churned": churned,
})
churn.to_csv("churn.csv", index=False)

print("apartments.csv:", apartments.shape)
print("churn.csv:", churn.shape, "| churn rate:", f"{churned.mean():.0%}")

أهم قاعدة: قسّم الداتا

لو اديت الطالب الامتحان بإجاباته وذاكر منه، وبعدين امتحنته في نفس الأسئلة، هيجيب الدرجة النهائية حتى لو مش فاهم حاجة. عشان كده بنقسم الداتا: جزء يتعلم منه (train) وجزء نخبيه ونمتحنه فيه في الآخر (test).

split.py
import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv("apartments.csv")

X = df[["area", "rooms", "floor", "age", "metro_km"]]   # features
y = df["price_k"]                                        # target

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)   # 80% train, 20% test

print("Train:", X_train.shape)
print("Test: ", X_test.shape)
🤖 الخطوات دي ثابتة في كل مشروعجهّز الداتا ← قسّمها ← اختار موديل ← fit على الـ train ← predict على الـ test ← قيّم. هتعمل الخطوات دي آلاف المرات، وscikit-learn عاملة كل الموديلات بنفس الشكل بالظبط، فلو اتعلمت واحد اتعلمت الكل.
صفحة المرحلة