تقنية وتكنولوجيا

كيفية التنبؤ ببيانات السلاسل الزمنية باستخدام أي نموذج تعليمي خاضع للإشراف | بواسطة ماثيو تورك


تحويل بيانات السلاسل الزمنية إلى تنسيق جدولي قياسي لنماذج تعلم الآلة الكلاسيكية وتحسين الدقة باستخدام AutoML

نحو علم البيانات
المصدر: أهاسانارا أكتر

تتعمق هذه المقالة في تعزيز عملية التنبؤ بمستويات استهلاك الطاقة اليومية عن طريق تحويل مجموعة بيانات السلاسل الزمنية إلى تنسيق جدولي باستخدام المكتبات مفتوحة المصدر. نحن نستكشف تطبيق نموذج تصنيف متعدد الفئات شائع ونستفيد من AutoML مع Cleanlab Studio لتعزيز دقتنا خارج العينة بشكل كبير.

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

على مستوى عال سنقوم بما يلي:

  • إنشاء دقة أساسية من خلال تركيب نموذج التنبؤ النبوي على بيانات السلاسل الزمنية لدينا
  • قم بتحويل بيانات السلاسل الزمنية الخاصة بنا إلى تنسيق جدولي باستخدام مكتبات الميزات مفتوحة المصدر ومن ثم سيظهر أنه يمكن أن يتفوق على نموذج النبي الخاص بنا من خلال منهج التصنيف القياسي متعدد الفئات (تعزيز التدرج) من خلال انخفاض بنسبة 67% في خطأ التنبؤ (زيادة بنسبة 38% من النقاط المئوية الأولية في الدقة خارج العينة).
  • استخدم حل AutoML للتصنيف متعدد الفئات أدى إلى انخفاض بنسبة 42٪ في خطأ التنبؤ (زيادة بنسبة 8% في النقاط المئوية الأولية في الدقة خارج العينة) مقارنةً بنموذج تعزيز التدرج الخاص بنا و أدى إلى انخفاض بنسبة 81٪ في خطأ التنبؤ (زيادة بنسبة 46% في النقاط المئوية الأولية في الدقة خارج العينة) مقارنةً بنموذج التنبؤ النبي الخاص بنا.

لتشغيل التعليمات البرمجية الموضحة في هذه المقالة، إليك دفتر الملاحظات الكامل.

يمكنك تنزيل مجموعة البيانات هنا.

تمثل البيانات استهلاك الطاقة PJM كل ساعة (بالميغاواط) على أساس الساعة. PJM Interconnection LLC (PJM) هي منظمة نقل إقليمية (RTO) في الولايات المتحدة. وهي جزء من شبكة الربط الشرقية التي تعمل بنظام نقل كهربائي يخدم العديد من الولايات.

دعونا نلقي نظرة على مجموعة البيانات لدينا. تتضمن البيانات عمودًا واحدًا للتاريخ والوقت (object نوع)، واستهلاك الطاقة ميجاوات (float64) النوع) الذي نحاول التنبؤ به كمتغير منفصل (يتوافق مع ربع مستويات استهلاك الطاقة في الساعة). هدفنا هو تدريب نموذج التنبؤ بالسلاسل الزمنية حتى نتمكن من التنبؤ بمستوى استهلاك الطاقة اليومي في الغد والذي يقع في مستوى واحد من 4 مستويات: low , below average , above average أو high (تم تحديد هذه المستويات على أساس أرباع توزيع الاستهلاك اليومي الإجمالي). نوضح أولاً كيفية تطبيق أساليب التنبؤ بالسلاسل الزمنية مثل النبي على هذه المشكلة، ولكنها تقتصر على أنواع معينة من نماذج تعلم الآلة المناسبة لبيانات السلاسل الزمنية. نوضح بعد ذلك كيفية إعادة صياغة هذه المشكلة إلى مشكلة تصنيف قياسية متعددة الفئات يمكننا تطبيق أي نموذج للتعلم الآلي عليها، ونوضح كيف يمكننا الحصول على تنبؤات متفوقة باستخدام تعلم الآلة القوي الخاضع للإشراف.

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

نعرض بعد ذلك بيانات الاختبار أدناه، وهي البيانات التي نقوم بتقييم نتائج التنبؤ الخاصة بنا على أساسها.

تم تضمين بيانات التدريب مع ربع مستوى استهلاك الطاقة اليومي

نعرض بعد ذلك بيانات الاختبار أدناه، وهي البيانات التي نقوم بتقييم نتائج التنبؤ الخاصة بنا على أساسها.

تم تضمين بيانات الاختبار مع ربع مستوى استهلاك الطاقة اليومي

كما هو موضح في الصور أعلاه، سوف نستخدم تاريخًا مقطوعًا 2015-04-09 لإنهاء نطاق بيانات التدريب لدينا وبدء بيانات الاختبار لدينا في 2015-04-10 . نحن نحسب العتبات الربعية لاستهلاكنا اليومي للطاقة باستخدام بيانات التدريب فقط. يؤدي هذا إلى تجنب تسرب البيانات – باستخدام بيانات خارج العينة والتي لا تتوفر إلا في المستقبل.

بعد ذلك، سوف نقوم بالتنبؤ بمستوى استهلاك الطاقة اليومي لـ PJME (بالميغاواط) طوال مدة بيانات الاختبار الخاصة بنا ونمثل القيم المتوقعة كمتغير منفصل. يمثل هذا المتغير الربع الذي يقع فيه مستوى استهلاك الطاقة اليومي، ويمثل بشكل قاطع بـ 1 (low)، 2 (below average)، 3 (above average) أو 4 (high). للتقييم، سوف نستخدم accuracy_score وظيفة من scikit-learn لتقييم أداء نماذجنا. وبما أننا نقوم بصياغة المشكلة بهذه الطريقة، فإننا قادرون على تقييم توقعات نموذجنا في اليوم التالي (ومقارنة النماذج المستقبلية) باستخدام دقة التصنيف.

import numpy as np
from prophet import Prophet
from sklearn.metrics import accuracy_score

# Initialize model and train it on training data
model = Prophet()
model.fit(train_df)

# Create a dataframe for future predictions covering the test period
future = model.make_future_dataframe(periods=len(test_df), freq='D')
forecast = model.predict(future)

# Categorize forecasted daily values into quartiles based on the thresholds
forecast['quartile'] = pd.cut(forecast['yhat'], bins = [-np.inf] + list(quartiles) + [np.inf], labels=[1, 2, 3, 4])

# Extract the forecasted quartiles for the test period
forecasted_quartiles = forecast.iloc[-len(test_df):]['quartile'].astype(int)

# Categorize actual daily values in the test set into quartiles
test_df['quartile'] = pd.cut(test_df['y'], bins=[-np.inf] + list(quartiles) + [np.inf], labels=[1, 2, 3, 4])
actual_test_quartiles = test_df['quartile'].astype(int)

# Calculate the evaluation metrics
accuracy = accuracy_score(actual_test_quartiles, forecasted_quartiles)

# Print the evaluation metrics
print(f'Accuracy: {accuracy:.4f}')
>>> 0.4249

الدقة خارج العينة سيئة جدًا بنسبة 43%. من خلال نمذجة سلاسلنا الزمنية بهذه الطريقة، فإننا نقتصر على استخدام نماذج التنبؤ بالسلاسل الزمنية فقط (مجموعة فرعية محدودة من نماذج تعلم الآلة المحتملة). في القسم التالي، سننظر في كيفية تصميم هذه البيانات بشكل أكثر مرونة عن طريق تحويل السلاسل الزمنية إلى مجموعة بيانات جدولية قياسية عبر الميزات المناسبة. بمجرد تحويل السلاسل الزمنية إلى مجموعة بيانات جدولية قياسية، يمكننا استخدام أي نموذج تعلم الآلة تحت الإشراف للتنبؤ ببيانات استهلاك الطاقة اليومية هذه.

نقوم الآن بتحويل بيانات السلاسل الزمنية إلى تنسيق جدولي وتمييز البيانات باستخدام المكتبات مفتوحة المصدر sktime, tsfresh، و tsfel. ومن خلال استخدام مثل هذه المكتبات، يمكننا استخراج مجموعة واسعة من الميزات التي تلتقط الأنماط والخصائص الأساسية لبيانات السلاسل الزمنية. يتضمن ذلك ميزات إحصائية وزمنية وربما طيفية، والتي توفر لمحة شاملة عن سلوك البيانات مع مرور الوقت. من خلال تقسيم السلاسل الزمنية إلى ميزات فردية، يصبح من الأسهل فهم كيفية تأثير الجوانب المختلفة للبيانات على المتغير المستهدف.

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

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

import tsfel
from sktime.transformations.panel.tsfresh import TSFreshFeatureExtractor

# Define tsfresh feature extractor
tsfresh_trafo = TSFreshFeatureExtractor(default_fc_parameters="minimal")

# Transform the training data using the feature extractor
X_train_transformed = tsfresh_trafo.fit_transform(X_train)

# Transform the test data using the same feature extractor
X_test_transformed = tsfresh_trafo.transform(X_test)

# Retrieves a pre-defined feature configuration file to extract all available features
cfg = tsfel.get_features_by_domain()

# Function to compute tsfel features per day
def compute_features(group):
# TSFEL expects a DataFrame with the data in columns, so we transpose the input group
features = tsfel.time_series_features_extractor(cfg, group, fs=1, verbose=0)
return features

# Group by the 'day' level of the index and apply the feature computation
train_features_per_day = X_train.groupby(level="Date").apply(compute_features).reset_index(drop=True)
test_features_per_day = X_test.groupby(level="Date").apply(compute_features).reset_index(drop=True)

# Combine each featurization into a set of combined features for our train/test data
train_combined_df = pd.concat([X_train_transformed, train_features_per_day], axis=1)
test_combined_df = pd.concat([X_test_transformed, test_features_per_day], axis=1)

بعد ذلك، نقوم بتنظيف مجموعة البيانات الخاصة بنا عن طريق إزالة الميزات التي أظهرت ارتباطًا عاليًا (أعلى من 0.8) مع المتغير المستهدف – متوسط ​​مستويات استهلاك الطاقة اليومي – وتلك ذات الارتباطات الخالية. يمكن أن تؤدي ميزات الارتباط العالية إلى الإفراط في التجهيز، حيث يؤدي النموذج أداءً جيدًا على بيانات التدريب ولكن بشكل سيئ على البيانات غير المرئية. من ناحية أخرى، لا توفر الميزات المرتبطة بالقيمة الخالية أي قيمة لأنها تفتقر إلى علاقة محددة مع الهدف.

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

# Filter out features that are highly correlated with our target variable
column_of_interest = "PJME_MW__mean"
train_corr_matrix = train_combined_df.corr()
train_corr_with_interest = train_corr_matrix[column_of_interest]
null_corrs = pd.Series(train_corr_with_interest.isnull())
false_features = null_corrs[null_corrs].index.tolist()

columns_to_exclude = list(set(train_corr_with_interest[abs(train_corr_with_interest) > 0.8].index.tolist() + false_features))
columns_to_exclude.remove(column_of_interest)

# Filtered DataFrame excluding columns with high correlation to the column of interest
X_train_transformed = train_combined_df.drop(columns=columns_to_exclude)
X_test_transformed = test_combined_df.drop(columns=columns_to_exclude)

إذا نظرنا الآن إلى الصفوف العديدة الأولى من بيانات التدريب، فهذه لقطة لما تبدو عليه. لدينا الآن 73 ميزة تمت إضافتها من مكتبات ميزات السلاسل الزمنية التي استخدمناها. التسمية التي سنتوقعها بناءً على هذه الميزات هي مستوى استهلاك الطاقة في اليوم التالي.

أول 5 صفوف من بيانات التدريب المميزة حديثًا وبتنسيق جدولي

من المهم ملاحظة أننا استخدمنا أفضل الممارسات لتطبيق عملية التخصيص بشكل منفصل لبيانات التدريب والاختبار لتجنب تسرب البيانات (وبيانات الاختبار المعلقة هي أحدث ملاحظاتنا).

أيضًا، نقوم بحساب القيمة الربعية المنفصلة (باستخدام الأرباع التي حددناها في الأصل) باستخدام الكود التالي للحصول على تسميات طاقة التدريب/الاختبار، وهي ما هي علامات y الخاصة بنا.

# Define a function to classify each value into a quartile
def classify_into_quartile(value):
if value < quartiles[0]:
return 1
elif value < quartiles[1]:
return 2
elif value < quartiles[2]:
return 3
else:
return 4

y_train = X_train_transformed["PJME_MW__mean"].rename("daily_energy_level")
X_train_transformed.drop("PJME_MW__mean", inplace=True, axis=1)

y_test = X_test_transformed["PJME_MW__mean"].rename("daily_energy_level")
X_test_transformed.drop("PJME_MW__mean", inplace=True, axis=1)

energy_levels_train = y_train.apply(classify_into_quartile)
energy_levels_test = y_test.apply(classify_into_quartile)

باستخدام مجموعة البيانات الجدولية المميزة، يمكننا تطبيق أي نموذج تعلم الآلة تحت الإشراف للتنبؤ بمستويات استهلاك الطاقة في المستقبل. سنستخدم هنا نموذج Gradient Boosting Classifier (GBC)، وهو السلاح المفضل لمعظم علماء البيانات الذين يعملون على البيانات الجدولية.

تم إنشاء نموذج GBC الخاص بنا من sklearn.ensemble الوحدة النمطية وتهيئتها بمعلمات تشعبية محددة لتحسين أدائها وتجنب التجهيز الزائد.

from sklearn.ensemble import GradientBoostingClassifier

gbc = GradientBoostingClassifier(
n_estimators=150,
learning_rate=0.1,
max_depth=4,
min_samples_leaf=20,
max_features="sqrt",
subsample=0.8,
random_state=42
)

gbc.fit(X_train_transformed, energy_levels_train)

y_pred_gbc = gbc.predict(X_test_transformed)
gbc_accuracy = accuracy_score(energy_levels_test, y_pred_gbc)
print(f'Accuracy: {gbc_accuracy:.4f}')
>>> 0.8075

تعد الدقة خارج العينة البالغة 81% أفضل بكثير من نتائج نموذج النبي السابقة.

الآن بعد أن رأينا كيفية إبراز مشكلة السلاسل الزمنية وفوائد تطبيق نماذج تعلم الآلة القوية مثل Gradient Boosting، يظهر سؤال طبيعي: ما هو نموذج تعلم الآلة الخاضع للإشراف الذي يجب أن نطبقه؟ بالطبع، يمكننا تجربة العديد من النماذج، وضبط معلماتها الفائقة، وتجميعها معًا. الحل الأسهل هو السماح لـ AutoML بالتعامل مع كل هذا نيابةً عنا.

سنستخدم هنا حل AutoML البسيط المتوفر في Cleanlab Studio، والذي لا يتضمن أي تكوين. نحن نقدم فقط مجموعة البيانات الجدولية الخاصة بنا، وتقوم المنصة تلقائيًا بتدريب العديد من أنواع نماذج تعلم الآلة الخاضعة للإشراف (بما في ذلك Gradient Boosting وغيرها)، وضبط المعلمات الفائقة الخاصة بها، وتحديد النماذج الأفضل لدمجها في متنبئ واحد. إليك كل التعليمات البرمجية اللازمة لتدريب ونشر مصنف خاضع للإشراف AutoML:


from cleanlab_studio import Studio

studio = Studio()
studio.create_project(
dataset_id=energy_forecasting_dataset,
project_name="ENERGY-LEVEL-FORECASTING",
modality="tabular",
task_type="multi-class",
model_type="regular",
label_column="daily_energy_level",
)

model = studio.get_model(energy_forecasting_model)
y_pred_automl = model.predict(test_data, return_pred_proba=True)

يمكننا أن نرى أدناه تقديرات تقييم النموذج في منصة AutoML، والتي تعرض جميع الأنواع المختلفة لنماذج ML التي تم ملاءمتها وتقييمها تلقائيًا (بما في ذلك نماذج Gradient Boosting المتعددة)، بالإضافة إلى متنبئ المجموعة الذي تم إنشاؤه من خلال الجمع بين تنبؤاتهم على النحو الأمثل.

نتائج AutoML عبر أنواع مختلفة من النماذج المستخدمة

بعد إجراء الاستدلال على بيانات الاختبار الخاصة بنا للحصول على تنبؤات بمستوى استهلاك الطاقة في اليوم التالي، نرى أن دقة الاختبار تبلغ 89%، وهو تحسن بنسبة 8% في النقاط المئوية الأولية مقارنة بنهجنا السابق لتعزيز التدرج.

دقة اختبار AutoML على بيانات مستوى استهلاك الطاقة اليومية لدينا

بالنسبة لبيانات استهلاك الطاقة اليومية لـ PJM، وجدنا أن تحويل البيانات إلى تنسيق جدولي وتمييزها حقق نجاحًا كبيرًا انخفاض بنسبة 67% في خطأ التنبؤ (زيادة بنسبة 38% في النقاط المئوية الأولية في الدقة خارج العينة) مقارنةً بدقة خط الأساس التي تم تحديدها باستخدام نموذج التنبؤ النبي الخاص بنا.

لقد جربنا أيضًا أسلوب AutoML السهل للتصنيف متعدد الفئات، والذي أدى إلى انخفاض بنسبة 42٪ في خطأ التنبؤ (زيادة بنسبة 8% في النقاط المئوية الأولية في الدقة خارج العينة) مقارنةً بنموذج تعزيز التدرج الخاص بنا و أدى إلى انخفاض بنسبة 81٪ في خطأ التنبؤ (زيادة بنسبة 46% في النقاط المئوية الأولية للدقة خارج العينة) مقارنةً بنموذج التنبؤ النبي الخاص بنا.

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

ما لم يذكر خلاف ذلك، جميع الصور هي من قبل المؤلف.

اترك تعليقاً

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

زر الذهاب إلى الأعلى