يعني إيه Machine Learning؟
بدل ما تكتب القواعد بنفسك، الكمبيوتر يستنتجها من الأمثلة.
البرمجة العادية ضد تعلم الآلة
في البرمجة العادية انت بتكتب القواعد: «لو الإيميل فيه كلمة مبروك كسبت، يبقى spam». بس مستحيل تكتب قاعدة لكل حالة. في Machine Learning بتدي الكمبيوتر آلاف الإيميلات ومكتوب على كل واحد spam ولا لأ، وهو يستنتج القواعد لوحده.
الأنواع
| النوع | بيعمل إيه | مثال |
|---|---|---|
| Supervised: Regression | بيتوقع رقم | سعر شقة، مبيعات الشهر الجاي |
| Supervised: Classification | بيتوقع فئة | العميل هيمشي ولا لأ، الصورة قطة ولا كلب |
| Unsupervised: Clustering | بيقسم الداتا لمجموعات من غير إجابات | تقسيم الزباين لشرايح |
Supervised (تعلم موجّه) يعني الداتا فيها الإجابة الصح، زي طالب بيذاكر من امتحانات قديمة محلولة. Unsupervised (غير موجّه) يعني مفيش إجابات، والموديل بيدور على أنماط لوحده.
features المدخلات اللي الموديل بيتعلم منها، زي المساحة وعدد الأوض. بنسميها X.label / target الحاجة اللي عايزين نتوقعها، زي السعر. بنسميها y.training إن الموديل يتعلم من الداتا، وفي scikit-learn اسمها fit.prediction إن الموديل يتوقع لحالة جديدة، واسمها predict.الداتا اللي هنشتغل عليها
هنعمل ملفين داتا واقعيين: أسعار شقق في القاهرة والجيزة وإسكندرية، وعملاء شركة اتصالات منهم اللي ساب الشركة. شغّل الكود ده مرة واحدة جنب الـ notebook بتاعك:
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).
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 عاملة كل الموديلات بنفس الشكل بالظبط، فلو اتعلمت واحد اتعلمت الكل.