إعداد البيانات للتدريب (Data Preprocessing): تحجيم البيانات (Scaling & Normalization)

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

إعداد البيانات للتدريب: لماذا يُعد التحجيم والتطبيع خطوة حاسمة؟

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

لهذا السبب يأتي دور Data Preprocessing كمرحلة تأسيسية قبل التدريب. وبعد تنفيذ خطوات مثل تنظيف البيانات (Data Cleaning): اكتشاف ومعالجة القيم المفقودة (Missing Values) ومعالجة الشذوذ في معالجة البيانات المكررة والمشوهة (Duplicates & Outliers) باستخدام بايثون، يصبح من الضروري ضبط القيم العددية لتكون أكثر اتساقاً واستقراراً.

التحجيم Scaling والتطبيع Normalization ليسا مجرد تحسين تجميلي للبيانات، بل آليتان تؤثران مباشرة في سرعة التقارب، واستقرار التدريب، ودقة النماذج، خصوصاً في خوارزميات المسافة والانحدار والشبكات العصبية.

ما الفرق بين Scaling وNormalization؟

التحجيم Scaling

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

التطبيع Normalization

يركز غالباً على تحويل القيم إلى نطاق محدد مثل 0-1. ويُستخدم بكثرة عند الحاجة إلى توحيد المقاييس قبل خوارزميات تعتمد على المسافات أو عند تغذية النماذج العصبية بقيم مستقرة.

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

متى يكون التحجيم ضرورياً، ومتى يمكن تجاهله؟

يُعد التحجيم مهماً جداً مع خوارزميات مثل KNN وSVM وLogistic Regression وNeural Networks. السبب أن هذه النماذج تتأثر بشدة بتفاوت المقاييس بين الخصائص.

أما في نماذج الأشجار مثل Decision Tree وRandom Forest، فعادة لا يكون التحجيم شرطاً أساسياً، لأن الانقسام يتم بناء على حدود قيمية وليس مسافات هندسية مباشرة.

في بيئات Machine Learning الإنتاجية، تجاهل التحجيم قد لا يؤدي فقط إلى تراجع الدقة، بل قد يسبب بطئاً في التدريب وعدم استقرار في معاملات التحسين العددي، خاصة عند العمل على ملايين السجلات داخل خطوط ETL وبيئات Spark.

أشهر تقنيات التحجيم والتطبيع

Min-Max Scaling

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

Standard Scaling

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

Robust Scaling

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

تطبيق عملي باستخدام Pandas وNumPy

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

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler

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

numeric_cols = ["age", "monthly_income", "purchase_count"]

minmax_scaler = MinMaxScaler()
standard_scaler = StandardScaler()
robust_scaler = RobustScaler()

df_minmax = df.copy()
df_minmax[numeric_cols] = minmax_scaler.fit_transform(df[numeric_cols])

df_standard = df.copy()
df_standard[numeric_cols] = standard_scaler.fit_transform(df[numeric_cols])

df_robust = df.copy()
df_robust[numeric_cols] = robust_scaler.fit_transform(df[numeric_cols])

print(df_minmax.head())
print(df_standard.head())
print(df_robust.head())

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

كيف ندمج التحجيم داخل خط معالجة صحيح؟

الخطأ الشائع هو تنفيذ التحجيم على كامل البيانات قبل تقسيمها إلى تدريب واختبار. هذا يسبب تسرباً للمعلومات Data Leakage لأن معلمات التحويل ستتعلم من بيانات الاختبار أيضاً.

from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X = df[["age", "monthly_income", "purchase_count"]]
y = df["churn"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

pipeline = Pipeline([
    ("scaler", StandardScaler()),
    ("model", LogisticRegression())
])

pipeline.fit(X_train, y_train)

score = pipeline.score(X_test, y_test)
print("Test Score:", score)

هذا الأسلوب يضمن أن Pipeline يتعلم معاملات التحجيم من بيانات التدريب فقط. وهو امتداد طبيعي لما يُناقش عادة في هندسة الميزات (Feature Engineering): كيف تستخرج بيانات جديدة من البيانات الحالية؟ ومقدمة في تعلم الآلة (Machine Learning).

التحجيم في البيئات الضخمة باستخدام PySpark

عند التعامل مع بيانات كبيرة لا تكفيها المعالجة المحلية، يصبح تنفيذ التحجيم ضمن بيئة موزعة أمراً ضرورياً. هنا تظهر أهمية Apache Spark في تجهيز الميزات على نطاق واسع بكفاءة عالية.

from pyspark.sql import SparkSession
from pyspark.ml.feature import VectorAssembler, StandardScaler

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

data = [
    (25, 3000.0, 5),
    (40, 7000.0, 12),
    (31, 4500.0, 7)
]

columns = ["age", "monthly_income", "purchase_count"]
df = spark.createDataFrame(data, columns)

assembler = VectorAssembler(
    inputCols=["age", "monthly_income", "purchase_count"],
    outputCol="features"
)

assembled_df = assembler.transform(df)

scaler = StandardScaler(
    inputCol="features",
    outputCol="scaled_features",
    withStd=True,
    withMean=True
)

scaler_model = scaler.fit(assembled_df)
scaled_df = scaler_model.transform(assembled_df)

scaled_df.select("features", "scaled_features").show(truncate=False)

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

أفضل الممارسات والأخطاء الشائعة

  • لا تقم بتحجيم الأعمدة الفئوية المشفرة إلا إذا كانت طبيعة النموذج تتطلب ذلك.
  • حل مشكلة القيم المفقودة والشاذة أولاً قبل تطبيق أي Scaler.
  • اختر RobustScaler إذا كانت البيانات مليئة بالقيم المتطرفة.
  • احفظ كائن التحويل المستخدم في الإنتاج لضمان اتساق البيانات الجديدة مع بيانات التدريب.
  • اختبر أكثر من أسلوب تحجيم وقيّم الأداء بدلاً من الاعتماد على افتراضات عامة.

الخلاصة

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

كلما كان خط الإعداد أكثر انضباطاً، من الاستكشاف والتحليل إلى الإحصاء الوصفي والاستدلالي ثم الارتباط (Correlation) ومرحلة النمذجة، أصبحت نتائج Machine Learning أكثر موثوقية وقابلية للتعميم في البيئات الحقيقية.

اترك تعليقاً

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