نمایش داده های سری زمانی در قالب جدولی استاندارد برای مدل های کلاسیک ML و بهبود دقت با استفاده از AutoML
این مقاله به بهبود فرآیند پیشبینی سطوح مصرف انرژی روزانه با تبدیل مجموعهای از سریهای زمانی به قالب جدولی با استفاده از کتابخانههای منبع باز میپردازد. ما کاربرد یک مدل طبقهبندی چند کلاسه محبوب را بررسی میکنیم و از AutoML با Cleanlab Studio استفاده میکنیم تا دقت خارج از نمونه خود را به میزان قابل توجهی افزایش دهیم.
نکته کلیدی این مقاله این است که میتوانیم از روشهای عمومیتری برای مدلسازی مجموعهای از دادههای سری زمانی با تبدیل آنها به یک ساختار جدولی استفاده کنیم و حتی در تلاش برای پیشبینی این دادههای سری زمانی پیشرفتهایی پیدا کنیم.
در سطح بالا شما:
- با برازش یک مدل پیشبینی پیامبر به دادههای سری زمانی، دقت خط پایه را ایجاد کنید
- دادههای سری زمانی خود را با استفاده از کتابخانههای ویژگی منبع باز به یک قالب جدولی تبدیل کنید و سپس نشان دهید که آنها میتوانند از مدل پیامبر ما با رویکرد طبقهبندی استاندارد چند کلاسه (تقویت گرادیان) بهتر عمل کنند. کاهش 67 درصدی در خطای پیش بینی (یک افزایش 38 درصدی خام در دقت خارج از نمونه).
- از راه حل AutoML برای طبقه بندی چند کلاسه استفاده کنید منجر به کاهش 42 درصدی خطای پیشبینی شد (8٪ افزایش در نقاط درصد خام در دقت خارج از نمونه) در مقایسه با مدل تقویت گرادیان ما و منجر به کاهش 81 درصدی خطای پیشبینی شد (46 درصد افزایش در درصد خام در دقت خارج از نمونه) در مقایسه با مدل پیشبینی پیامبر ما.
برای اجرای کد نشان داده شده در این مقاله، نوت بوک کامل در اینجا آمده است.
می توانید مجموعه داده را از اینجا دانلود کنید.
داده ها مصرف برق ساعتی PJM (به مگاوات) را به صورت ساعتی نشان می دهد. PJM Interconnection LLC (PJM) یک سازمان انتقال منطقه ای (RTO) در ایالات متحده است. این بخشی از سیستم بین سیستم شرقی است، یک سیستم انتقال الکتریکی که به بسیاری از کشورها خدمات می دهد.
بیایید نگاهی به مجموعه داده خود بیندازیم. داده ها شامل یک ستون تاریخ زمان (object
نوع) و مگاوات مصرف انرژی (float64
) نوع) ستونی که سعی داریم آن را به عنوان یک متغیر گسسته (مرتبط با چارک سطوح مصرف انرژی ساعتی) پیش بینی کنیم. هدف ما آموزش یک مدل پیشبینی سری زمانی است تا بتواند سطح مصرف روزانه انرژی فردا را که در 1 از 4 سطح قرار میگیرد، پیشبینی کند: low
، below average
، above average
یا high
(این سطوح بر اساس چارک توزیع کل مصرف روزانه تعیین می شود). ما ابتدا نحوه اعمال روش های پیش بینی سری های زمانی مانند پیامبر را برای این مشکل نشان می دهیم، اما آنها به انواع خاصی از مدل های ML مناسب برای داده های سری زمانی محدود می شوند. سپس نشان میدهیم که چگونه میتوان این مسئله را به یک مسئله طبقهبندی چند کلاسه استاندارد تبدیل کرد که میتوانیم هر مدل یادگیری ماشینی را برای آن اعمال کنیم، و نشان میدهیم که چگونه میتوانیم پیشبینیهای برتر را با استفاده از ML نظارت شده قدرتمند به دست آوریم.
ابتدا این دادهها را به میانگین مصرف انرژی روزانه تبدیل میکنیم و نام ستونها را به قالبی که مدل پیشبینی پیامبر انتظار دارد تغییر میدهیم. این سطوح تخمینی واقعی مصرف انرژی روزانه به چارک تبدیل می شود، که این مقداری است که ما سعی داریم پیش بینی کنیم. داده های آموزشی ما در زیر به همراه چارکی که هر سطح انرژی روزانه در آن قرار می گیرد نشان داده شده است. چارک ها با استفاده از داده های آموزشی برای جلوگیری از نشت داده ها محاسبه می شوند.
سپس دادههای تست را در زیر نشان میدهیم، که دادههایی است که نتایج پیشبینی خود را بر اساس آن ارزیابی میکنیم.
سپس دادههای تست را در زیر نشان میدهیم، که دادههایی است که نتایج پیشبینی خود را بر اساس آن ارزیابی میکنیم.
همانطور که در تصاویر بالا مشاهده می شود، از تاریخ پایان استفاده خواهیم کرد 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٪ است. با مدلسازی سریهای زمانی خود به این روش، خود را به استفاده از مدلهای پیشبینی سری زمانی محدود میکنیم (زیر مجموعه محدودی از مدلهای ممکن ML). در بخش بعدی، به این میپردازیم که چگونه میتوانیم این دادهها را با انعطافپذیری بیشتر با تبدیل سریهای زمانی به یک مجموعه داده جدولی استاندارد از طریق یک نمایش مناسب، مدلسازی کنیم. هنگامی که سری های زمانی به یک مجموعه داده جدولی استاندارد تبدیل شد، می توانیم از هر مدل ML نظارت شده برای پیش بینی این داده های مصرف انرژی روزانه استفاده کنیم.
اکنون داده های سری زمانی را به فرمت جدولی تبدیل می کنیم و داده ها را با استفاده از کتابخانه های منبع باز ارائه می کنیم sktime
، tsfresh
و tsfel
. با استفاده از کتابخانههایی مانند این، میتوانیم طیف وسیعی از ویژگیها را استخراج کنیم که الگوها و ویژگیهای زیربنایی دادههای سری زمانی را به تصویر میکشند. این شامل ویژگی های آماری، زمانی و احتمالاً طیفی است که تصویری جامع از رفتار داده ها در طول زمان ارائه می دهد. با تجزیه سری های زمانی به ویژگی های فردی، درک اینکه چگونه جنبه های مختلف داده بر متغیر هدف تأثیر می گذارد آسان تر می شود.
TSFreshFeatureExtractor
ابزاری برای استخراج ویژگی ها از sktime
کتابخانه ای که از قابلیت های tsfresh
برای استخراج ویژگی های مرتبط از داده های سری زمانی. tsfresh
برای محاسبه خودکار تعداد زیادی از ویژگی های سری زمانی طراحی شده است که می تواند برای درک دینامیک های زمانی پیچیده بسیار مفید باشد. برای موارد استفاده ما از مجموعه ویژگی های حداقلی و اولیه خود استفاده می کنیم TSFreshFeatureExtractor
برای ارائه داده های ما
tsfel
، یا Time Series Feature Extraction Library، مجموعه ای جامع از ابزارها را برای استخراج ویژگی ها از داده های سری زمانی ارائه می دهد. ما از یک پیکربندی از پیش تعریفشده استفاده میکنیم که اجازه میدهد مجموعهای غنی از ویژگیها (به عنوان مثال، آماری، زمانی، طیفی) از دادههای سری زمانی مصرف انرژی ساخته شود و طیف گستردهای از ویژگیها را که ممکن است با وظیفه طبقهبندی ما مرتبط باشد، ثبت کند.
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 تابع داریم که توسط کتابخانه های رندر سری زمانی که استفاده می کردیم اضافه شده اند. برچسبی که بر اساس این ویژگی ها پیش بینی خواهیم کرد سطح مصرف انرژی در روز بعد است.
توجه به این نکته مهم است که ما از بهترین روش برای اجرای فرآیند نمایش به طور جداگانه برای آموزش و داده های آزمایشی استفاده کردیم تا از نشت داده ها جلوگیری کنیم (و داده های آزمون حفظ شده جدیدترین مشاهدات ما هستند).
همچنین، ما مقدار چارک گسسته خود را (با استفاده از چارک هایی که در ابتدا تعریف کردیم) را با استفاده از کد زیر محاسبه می کنیم تا برچسب انرژی قطار/آزمایش خود را که برچسب های 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)
با استفاده از مجموعه داده های جدولی ارائه شده ما، می توانیم هر مدل ML نظارت شده را برای پیش بینی سطوح مصرف انرژی در آینده اعمال کنیم. در اینجا ما از یک مدل طبقهبندی کننده تقویت گرادیان (GBC) استفاده میکنیم، سلاح انتخابی برای اکثر دانشمندان داده که با دادههای جدولی کار میکنند.
مدل GBC ما توسط sklearn.ensemble
ماژول و با هایپرپارامترهای خاص برای بهینه سازی عملکرد آن و جلوگیری از تنظیم مجدد پیکربندی شده است.
from sklearn.ensemble import GradientBoostingClassifiergbc = 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 درصد به طور قابل توجهی بهتر از نتایج قبلی ما از مدل پیامبر است.
اکنون که نحوه نمایش یک مسئله سری زمانی و مزایای استفاده از مدلهای قدرتمند ML مانند Gradient Boosting را دیدیم، یک سوال طبیعی مطرح میشود: کدام مدل ML نظارت شده را باید اعمال کنیم؟ البته، ما میتوانیم مدلهای زیادی را آزمایش کنیم، فراپارامترهای آنها را تنظیم کنیم و آنها را با هم ترکیب کنیم. راه حل ساده تر این است که به AutoML اجازه دهیم همه اینها را برای ما مدیریت کند.
در اینجا ما از یک راه حل ساده AutoML ارائه شده در Cleanlab Studio استفاده خواهیم کرد که شامل پیکربندی صفر است. ما به سادگی مجموعه داده جدولی خود را ارائه می دهیم و پلتفرم به طور خودکار انواع بسیاری از مدل های نظارت شده ML را آموزش می دهد (از جمله تقویت گرادیان در میان سایرین)، فراپارامترهای آنها را تنظیم می کند و تعیین می کند که کدام مدل ها به بهترین وجه در یک پیش بینی ترکیب شوند. در اینجا تمام کدهای مورد نیاز برای آموزش و پیاده سازی یک طبقه بندی کننده AutoML نظارت شده آمده است:
from cleanlab_studio import Studiostudio = 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 را نشان میدهد که بهطور خودکار مناسب و ارزیابی شدهاند (از جمله مدلهای تقویت گرادیان متعدد)، و همچنین یک پیشبینیکننده مجموعه که با ترکیب بهینه پیشبینیهای آنها ساخته شده است.
پس از استنباط دادههای تست ما برای به دست آوردن پیشبینیهای سطح مصرف برق روز بعد، میبینیم که دقت تست 89٪ است، یک 8٪ بهبود نقطه درصد خام نسبت به تقویت رویکرد گرادیان قبلی ما.
برای دادههای PJM ما در مورد مصرف انرژی روزانه، متوجه شدیم که تبدیل دادهها به قالب جدولی و وصل کردن آن به کاهش 67 درصدی در خطای پیش بینی (یک افزایش 38 درصدی در نقاط درصد خام در دقت خارج از نمونه) در مقایسه با دقت پایه ما که با مدل پیشبینی پیامبر ما پیدا شد.
ما همچنین یک رویکرد AutoML ساده را برای طبقه بندی چند کلاسه امتحان کردیم که منجر به کاهش 42 درصدی خطای پیشبینی شد (8٪ افزایش در نقاط درصد خام در دقت خارج از نمونه) در مقایسه با مدل تقویت گرادیان ما و منجر به کاهش 81 درصدی خطای پیشبینی شد (46 درصد افزایش در درصد خام در دقت خارج از نمونه) در مقایسه با مدل پیشبینی پیامبر ما.
با اتخاذ رویکردهایی مانند مواردی که در بالا نشان داده شد برای مدلسازی مجموعهداده سری زمانی فراتر از رویکرد محدود که فقط به روشهای پیشبینی نگاه میکند، میتوانیم تکنیکهای یادگیری ماشینی تحت نظارت کلیتری را اعمال کنیم و برای انواع خاصی از مشکلات پیشبینی به نتایج بهتری دست یابیم.
مگر اینکه غیر از این ذکر شده باشد، همه تصاویر توسط نویسنده است.