الدرس 2 من 9

أول موديل: Linear Regression

الخط المستقيم اللي بدأنا نفهمه في المرحلة ٣، بس المكتبة هي اللي بتتعلمه.

الفكرة

الموديل بيفترض إن السعر = (وزن × المساحة) + (وزن × عدد الأوض) + ... + رقم ثابت. وبيدور على أحسن أوزان تقلل الغلط، بالظبط زي الـ gradient descent اللي عملناه بإيدنا، بس لكل الأعمدة مرة واحدة.

price = w₁·area + w₂·rooms + ... + b
linear.py
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score

df = pd.read_csv("apartments.csv")
features = ["area", "rooms", "floor", "age", "metro_km"]
X_train, X_test, y_train, y_test = train_test_split(
    df[features], df["price_k"], test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)            # learn the weights

preds = model.predict(X_test)          # predict prices it never saw
print(f"MAE: {mean_absolute_error(y_test, preds):.0f}K EGP")
print(f"R2:  {r2_score(y_test, preds):.3f}")

نقرا النتيجة إزاي؟

MAE متوسط الغلط بالأرقام المطلقة، بنفس وحدة السعر. يعني الموديل بيغلط في المتوسط بالمبلغ ده.
بيقيس الموديل فاهم قد إيه من تغير الأسعار. 1 يعني كامل، و0 يعني زي ما تقول المتوسط وخلاص.

الموديل اتعلم إيه؟

coefficients.py
import pandas as pd
from sklearn.linear_model import LinearRegression

df = pd.read_csv("apartments.csv")
features = ["area", "rooms", "floor", "age", "metro_km"]
model = LinearRegression().fit(df[features], df["price_k"])

for name, w in zip(features, model.coef_):
    print(f"{name:9} {w:+8.1f}K per unit")

كل متر زيادة بيزود السعر حوالي ١٨ ألف، وكل سنة من عمر العمارة بتنقصه، وكل كيلو بُعد عن المترو بينقصه أكتر. أرقام منطقية جداً، والموديل وصلها لوحده من الداتا.

توقع لشقة جديدة

predict.py
import pandas as pd
from sklearn.linear_model import LinearRegression

df = pd.read_csv("apartments.csv")
features = ["area", "rooms", "floor", "age", "metro_km"]
model = LinearRegression().fit(df[features], df["price_k"])

new_flat = pd.DataFrame([{"area": 130, "rooms": 3, "floor": 4,
                          "age": 5, "metro_km": 1.2}])
print(f"Estimated price: {model.predict(new_flat)[0]:,.0f}K EGP")
⚠ نسينا المدينة!الشقة في القاهرة غير الإسكندرية، بس عمود city نص، والموديل مبيفهمش غير أرقام. هنعالج ده في درس الـ Feature Engineering، وهتشوف الغلط هيقل قد إيه.
الدرس اللي فات