خوارزمية الانحدار الخطي (Linear Regression): بناء نموذج لتوقع أسعار المنازل

دقائق القراءة: 7

خوارزمية الانحدار الخطي: بناء نموذج لتوقع أسعار المنازل

يُعد Linear Regression من أكثر نماذج Machine Learning استخداماً في توقع القيم العددية المستمرة، وخصوصاً في مسائل مثل تقدير أسعار المنازل بناءً على المساحة، عدد الغرف، الموقع، عمر العقار، وقربه من الخدمات. ورغم بساطة هذا النموذج رياضياً، فإن قيمته الحقيقية تظهر عندما نربطه بمنهجية صحيحة في جمع البيانات وتنظيفها واختيار الميزات وتقييم الأداء.

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

إذا كنت تتابع هذه السلسلة، فستجد أن هذا الموضوع يُكمل ما تناولناه سابقاً في مقدمة في تعلم الآلة (Machine Learning): الفرق بين التعلم الخاضع وغير الخاضع للإشراف، كما يعتمد عملياً على خطوات التنظيف والتجهيز المذكورة في تنظيف البيانات (Data Cleaning): اكتشاف ومعالجة القيم المفقودة (Missing Values) وإعداد البيانات للتدريب (Data Preprocessing): تحجيم البيانات (Scaling & Normalization).

ما هو الانحدار الخطي ولماذا يناسب توقع أسعار المنازل؟

يقيس نموذج Linear Regression العلاقة بين متغير تابع مثل سعر المنزل، ومجموعة من المتغيرات المستقلة مثل المساحة وعدد الحمامات وجودة الحي. الهدف هو إيجاد معادلة خطية تستطيع تقدير السعر بأقل خطأ ممكن بين القيمة الفعلية والمتوقعة.

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

في سوق العقارات، هذا النموذج مناسب كبداية قوية لأنه يسمح بتحليل تأثير الخصائص الأساسية بسرعة، كما يُستخدم كثيراً كنموذج مرجعي Baseline Model قبل الانتقال إلى نماذج أكثر تعقيداً.

فهم البيانات قبل بناء النموذج

أهم خطأ شائع هو التعامل مع ملف الأسعار وكأنه جاهز للتدريب. في الواقع، جودة التوقع ترتبط مباشرة بجودة البيانات. يجب أولاً فحص الأعمدة، أنواعها، القيم المفقودة، التكرارات، والقيم الشاذة. يمكن تنفيذ هذه المراحل باستخدام Pandas بعد قراءة البيانات كما شرحنا في مكتبة Pandas (1): قراءة واستدعاء البيانات من ملفات CSV و Excel برمجياً ومكتبة Pandas (2): استكشاف هيكل البيانات وفهم DataFrame و Series.

كذلك من المهم التحقق من قوة العلاقة بين المتغيرات والسعر باستخدام مقاييس مثل الارتباط، لأن بعض الأعمدة قد تكون عديمة الفائدة أو حتى مضللة. وهنا يظهر دور التحليل الإحصائي الأولي وربطه بما عرضناه في الارتباط (Correlation): كيف تكتشف العلاقة الخفية بين المتغيرات (مثل السعر والطلب)؟.

أمثلة على الميزات المناسبة

  • مساحة المنزل بالمتر المربع.
  • عدد غرف النوم والحمامات.
  • عمر العقار أو سنة البناء.
  • المسافة إلى مركز المدينة أو المدارس.
  • تصنيف الحي أو متوسط دخل المنطقة.

في بيئات البيانات الكبيرة، من الأفضل ألا تُحمّل كل البيانات الخام مباشرة إلى الذاكرة داخل Notebook. قم ببناء طبقة تنظيف أولية ضمن مسار ETL Pipeline لإزالة السجلات غير الصالحة وتوحيد الصيغ قبل وصول البيانات إلى مرحلة النمذجة. هذا يقلل تكلفة المعالجة ويرفع موثوقية النموذج.

إعداد البيانات وتدريب النموذج باستخدام بايثون

في المسار العملي، نبدأ بتحميل البيانات، تنظيفها، اختيار الأعمدة المهمة، ثم تقسيمها إلى بيانات تدريب واختبار. أهمية التقسيم موضحة بالتفصيل في تقسيم البيانات (Train/Test Split): لماذا يجب أن نختبر النموذج على بيانات لم يرها من قبل؟. بعد ذلك نستخدم مكتبة scikit-learn لبناء النموذج بسهولة ووضوح.

import pandas as pd
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# قراءة البيانات
df = pd.read_csv("housing_data.csv")

# اختيار أعمدة أساسية
selected_columns = ["area", "bedrooms", "bathrooms", "house_age", "distance_to_center", "price"]
df = df[selected_columns].copy()

# معالجة القيم المفقودة
df = df.dropna()

# إزالة القيم غير المنطقية
df = df[(df["area"] > 0) & (df["price"] > 0)]

# تحديد الميزات والهدف
X = df[["area", "bedrooms", "bathrooms", "house_age", "distance_to_center"]]
y = df["price"]

# تقسيم البيانات
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# تدريب النموذج
model = LinearRegression()
model.fit(X_train, y_train)

# التنبؤ
y_pred = model.predict(X_test)

# التقييم
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
r2 = r2_score(y_test, y_pred)

print("Intercept:", model.intercept_)
print("Coefficients:", dict(zip(X.columns, model.coef_)))
print("MAE:", mae)
print("RMSE:", rmse)
print("R2 Score:", r2)

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

كيف نقرأ نتائج التقييم بشكل صحيح؟

الاعتماد على رقم واحد فقط قد يكون مضللاً. لذلك يُفضّل استخدام عدة مقاييس معاً. مقياس MAE يوضح متوسط الخطأ المطلق، وهو سهل الفهم تجارياً لأنه يعبّر عن متوسط الفرق بين السعر الحقيقي والمتوقع.

أما RMSE فيعطي وزناً أكبر للأخطاء الكبيرة، لذا يفيد عندما تكون التوقعات السيئة مكلفة. بينما يوضح R2 Score نسبة التباين التي استطاع النموذج تفسيرها.

إذا كانت قيمة R2 منخفضة جداً، فهذا لا يعني بالضرورة فشل الخوارزمية فقط، بل قد يشير إلى نقص في الميزات أو ضعف في جودة البيانات أو وجود علاقة غير خطية لا يستطيع النموذج الخطي التقاطها.

هندسة الميزات وأثرها على دقة التوقع

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

يمكن أيضاً إنشاء ميزات مركبة مثل السعر لكل متر، أو نسبة عدد الحمامات إلى غرف النوم، أو مؤشر للكثافة العمرانية. هذه الميزات غالباً تجعل العلاقة مع المتغير الهدف أوضح للنموذج.

في مشاريع العقارات واسعة النطاق، تُخزن البيانات أحياناً في جداول متعددة مثل بيانات الحي، المعاملات التاريخية، ومواصفات العقار. هنا تصبح عمليات Merge وJoin المصممة جيداً عاملاً حاسماً في بناء مجموعة تدريب دقيقة وخالية من التشويه الإحصائي.

ماذا لو كانت البيانات ضخمة؟ استخدام Spark في التدريب والتحضير

عندما يتجاوز حجم البيانات قدرة المعالجة المحلية، ننتقل إلى منصات موزعة مثل Apache Spark. في هذه الحالة، يمكن تنفيذ التنظيف والتحويل والتجميع على مستوى موزع، ثم تدريب نموذج انحدار خطي باستخدام مكتبة MLlib.

from pyspark.sql import SparkSession
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.regression import LinearRegression
from pyspark.ml.evaluation import RegressionEvaluator

spark = SparkSession.builder.appName("HousePricePrediction").getOrCreate()

df = spark.read.csv("housing_data.csv", header=True, inferSchema=True)

df = df.dropna(subset=["area", "bedrooms", "bathrooms", "house_age", "distance_to_center", "price"])
df = df.filter((df.area > 0) & (df.price > 0))

feature_cols = ["area", "bedrooms", "bathrooms", "house_age", "distance_to_center"]
assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
final_df = assembler.transform(df).select("features", "price")

train_df, test_df = final_df.randomSplit([0.8, 0.2], seed=42)

lr = LinearRegression(featuresCol="features", labelCol="price")
model = lr.fit(train_df)

predictions = model.transform(test_df)

evaluator = RegressionEvaluator(labelCol="price", predictionCol="prediction", metricName="rmse")
rmse = evaluator.evaluate(predictions)

print("RMSE:", rmse)
print("Coefficients:", model.coefficients)
print("Intercept:", model.intercept)

هذا النهج مفيد جداً عندما تكون البيانات موزعة على ملفات ضخمة أو مخزنة في بيئات Data Lake. كما يتيح دمج التدريب ضمن مسارات تشغيل مجدولة بدلاً من العمل اليدوي المتكرر.

أفضل الممارسات لتحسين الدقة والاعتمادية

  • تحقق من جودة البيانات قبل التدريب، وليس بعد ظهور النتائج السيئة.
  • استخدم التحليل الإحصائي والرسوم لفهم التوزيعات والقيم الشاذة.
  • قارن النموذج الخطي مع نماذج مرجعية أخرى عند الحاجة.
  • طبّق تحجيماً للميزات عندما تكون الفروقات بين المقاييس كبيرة.
  • حدّث النموذج دورياً إذا كان السوق العقاري يتغير بسرعة.

كما يمكن الاستفادة من أدوات التصور مثل مكتبة Matplotlib: أساسيات تصوير البيانات ورسم المخططات البيانية ومكتبة Seaborn: إنشاء رسوم بيانية إحصائية متقدمة ومريحة للعين بسطر كود واحد لفحص العلاقة بين السعر والميزات، ومقارنة القيم المتوقعة بالقيم الحقيقية بصرياً.

خلاصة عملية

يمثل Linear Regression نقطة انطلاق ممتازة لبناء نموذج توقع أسعار المنازل، لأنه يجمع بين البساطة، القابلية للتفسير، وسرعة التنفيذ. لكن نجاحه لا يعتمد على المعادلة وحدها، بل على جودة البيانات، فهم العلاقات بين المتغيرات، والالتزام بمسار تحضير وتقييم صارم.

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *