پیش بینی سری زمانی در پایتون — به زبان ساده
ایجاد یک مبنا برای انجام «پیشبینی» (Prediction) در مسائل «سری زمانی» (Time Series)، بسیار حائز اهمیت است. یک مبنا برای انجام پیشبینی این ایده را به پژوهشگر میدهد که دیگر مدلها چقدر خوب روی یک مسئله مشخص کار میکنند. در این راهنما، چگونگی توسعه یک مدل پیشبینی پایدار که میتوان از آن برای محاسبه سطح پایهای کارایی مدلهای مختلف در مجموعه دادههای سری زمانی استفاده کرد با ارائه یک مثال کاربردی، آموزش داده شده است. در مطلب پروژه پیش بینی سری زمانی در پایتون مباحث زیر مورد بررسی قرار میگیرند.
- اهمیت محاسبه کارایی مبنا برای مسائل پیشبینی سری زمانی
- روش توسعه یک مدل پایدار از پایه در پایتون
- روش ارزیابی پیشبینی حاصل از یک مدل پایدار و استفاده از آن برای ایجاد خط مبنایی در کارایی
مبنای کارایی پیشبینی
مبنا در پیشبینی کارایی، یک نقطه مقایسه را فراهم میکند. اگر مدل به کارایی کمتر از مبنا دست پیدا کند، باید از آن صرفنظر کرد و یا آن را بهبود بخشید. پیادهسازی روشی که برای تولید یک پیشبینی برای محاسبه کارایی مبنا مورد استفاده قرار میگیرد، باید آسان و دارای جزئیات ویژه مسئله باشد. پیش از آنکه پژوهشگر مبنای کارایی را برای مسئله پیشبینی تعیین کند، باید یک «چارچوب تست خودکار» (Automated Test Framework) را توسعه دهد. این چارچوب، شامل موارد زیر است:
- مجموعه دادهای که کاربر تمایل دارد برای آموزش و ارزیابی مدل از آن استفاده کند.
- روش «بازنمونهگیری» (Resampling) که کاربر برای تخمین کارایی روش استفاده خواهد کرد (برای مثال، مجموعه دادههای آموزش و تست)
- معیار کارایی که فرد تمایل دارد برای ارزیابی پیشبینیها مورد استفاده قرار دهد (برای مثال، میانگین مربعات خطا یا همان Mean Squared Error)
سه مشخصه یک روش خوب برای ساخت پیشبینی مبنا، عبارتند از:
- سادگی: روش به میزان کمی داده آموزش نیاز داشته باشد و یا به طور کل به هیچ داده یا هوشمندی نیاز نداشته باشد.
- سریع: روشی که پیادهسازی آن سریع و به لحاظ محاسباتی برای انجام پیشبینی ساده باشد.
- تکرار پذیر: روش باید قطعی باشد، بدین معنا که خروجی مورد انتظار را با دادن یک ورودی مشابه تولید کند.
یک الگوریتم متداول برای ایجاد کارایی مبنا، «الگوریتم مانا» (Persistence Algorithm) است.
الگوریتم مانا
متداولترین روش مبنا برای یادگیری ماشین نظارت شده، الگوریتم «قاعده صفر» است. این الگوریتم، کلاس اکثریت را در دستهبندی و یا، میانگین خروجی را در تحلیل رگرسیون تعیین میکند. از این الگوریتم میتوان برای سریهای زمانی استفاده کرد؛ اما الگوریتم ساختار همبستگی سریالی در مجموعه دادههای سری زمانی را در نظر نمیگیرد.
روش معادل برای استفاده با مجموعه داده سری زمانی «الگوریتم مانا» (Persistence Algorithm) است. الگوریتم مانا، از مقدار موجود در گام زمانی پیشین (t-1) برای پیشبینی خروجی مورد انتظار در گام زمانی بعدی (t+1) استفاده میکند. این امر موجب میشود هر سه شرط بیان شده در بالا برای پیشبینی خط مبنا محقق شود. در ادامه، چگونگی توسعه یک مدل مانا مورد بررسی قرار میگیرد و از این مدل برای ایجاد کارایی پایه برای یک مسئله سری زمانی تکمتغیره (Univariate) استفاده میکند. ابتدا، بررسی موردی روی مجموعه داده فروش شامپو انجام خواهد شد.
مجموعه داده فروش شامپو
«مجموعه داده فروش شامپو» (Shampoo Sales Dataset)، نشانگر فروش شامپو در طول سه سال گذشته است. نمونهها مربوط به تعداد فروش هستند و ۳۶ مشاهده (نمونه) در آن وجود دارد. مجموعه داده اصلی برای «ماکریداکیس» (Makridakis)، «ویلرایت» (Wheelwright) و «هیندمن» (Hyndman) (سال ۱۹۹۸) است. در زیر، نمونههای پنج سطر اول مجموعه داده مذکور، شامل سربرگ (Header) ارائه شده است.
"Month","Sales"
"1-01",266.0
"1-02",145.9
"1-03",183.1
"1-04",119.3
"1-05",180.3
تصویر زیر، نمودار کل مجموعه داده است (مخاطبان میتوانند این مجموعه داده را دانلود کرده و مطالب بیشتری را پیرامون آن بیاموزند).
مجموعه داده، گرایش رو به افزایش و احتمالا مولفههای فصلی را از خود نشان میدهد. توصیه میشود که مجموعه داده دانلود [+] و در پوشه کاری جاری با نام فایل «shampoo-sales.csv» قرار داده شود. قطعه کد زیر، مجموعه داده فروش شامپو را بارگذاری و سری زمانی را ترسیم میکند.
from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')
series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
series.plot()
pyplot.show()
با اجرای قطعه کد بالا، نمودار خروجی به صورت زیر حاصل میشود:
پروژه پیش بینی سری زمانی در پایتون و الگوریتم مانا
یک مدل مانا را میتوان به سادگی در پایتون پیادهسازی کرد. در ادامه، کار پیادهسازی به پنج گام شکسته میشود.
- تبدیل مجموعه داده تکمتغیره به یک مسئله «یادگیری نظارت شده» (Supervised Learning Problem)
- ایجاد مجموعه دادههای تست و آموزش برای چارچوب تست خودکار
- تعریف مدل مانا
- انجام پیشبینی و تبیین کارایی مبنا
- بازبینی مثال کامل و ترسیم نمودار خروجی
گام ۱: تعریف مسئله یادگیری نظارت شده
اولین گام، بارگذاری مجموعه داده و ساخت یک ارائه پسین است. بدین شکل، بر اساس مشاهده در زمان t-1، مشاهده در زمان t+1 پیشبینی میشود.
# Create lagged dataset
values = DataFrame(series.values)
dataframe = concat([values.shift(1), values], axis=1)
dataframe.columns = ['t-1', 't+1']
print(dataframe.head(5))
قطعه کد بالا، مجموعه داده را میسازد و پنج سطر ابتدایی مجموعه داده جدید را چاپ میکند. میتوان مشاهده کرد که از سطر اول (اندیس ۰) به دلیل آنکه هیچ مشاهدهای پیش از اولین مشاهده وجود ندارد، صرف نظر شده است. از چشمانداز یادگیری ماشین نظارت شده، ستون t-1 یک متغیر ورودی یا x است، و ستون t+1 متغیر خروجی یا Y محسوب میشود.
t-1 t+1
0 NaN 266.0
1 266.0 145.9
2 145.9 183.1
3 183.1 119.3
4 119.3 180.3
گام ۲: آموزش و تست مجموعهها
گام بعدی آن است که مجموعه داده به دو دسته «آموزش» (Train) و «آزمون» (Test) تقسیم شود. ٪۶۶ مشاهدات ابتدایی برای آموزش و ٪۳۴ باقیمانده برای آزمون مورد استفاده قرار میگیرد. در طول تقسیمبندی، باید توجه داشت که سطرهای حاوی مقدار NaN در نظر گرفته نشوند. در این مورد، هیچ آموزشی نیاز نیست. هر یک از مجموعههای آموزش و تست، سپس به متغیرهای ورودی و خروجی شکسته میشوند.
# split into train and test sets
X = dataframe.values
train_size = int(len(X) * 0.66)
train, test = X[1:train_size], X[train_size:]
train_X, train_y = train[:,0], train[:,1]
test_X, test_y = test[:,0], test[:,1]
گام ۳: الگوریتم مانا
میتوان الگوریتم مبنا را به عنوان تابعی که مقدار فراهم شده را به عنوان ورودی باز میگرداند تعریف کرد. برای مثال، اگر مقدار t-1 از ۲۶۶٫۰ فراهم شد، این مورد به عنوان پیشبینی باز گردانده میشود؛ در حالی که مقدار مورد انتظار یا واقعی که به وقوع میپیوندد ۱۴۵٫۹ است (از اولین سطر قابل استفاده در مجموعه داده پسین گرفته شده است).
# persistence model
def model_persistence(x):
return x
گام ۴: انجام پیشبینی و ارزیابی آن
اکنون، مدل روی مجموعه داده تست ارزیابی میشود. این کار با استفاده از روش اعتبارسنجی «پیشرونده» (Walk-Forward) انجام میشود. نیاز به آموزش یا بازآموزی مدل نیست. بنابراین، در مجموعه داده تست، یکی یکی بر اساس گامهای زمانی، پیشبینی انجام میشود. هنگامی که پیشبینی برای هر گام زمانی در مجموعه داده آموزش انجام شد، این پیشبینیها با مقادیر مورد انتظار و امتیاز «میانگین مربعات خطاها» (Mean Squared Error | MSE) محاسبه میشود.
# walk-forward validation
predictions = list()
for x in test_X:
yhat = model_persistence(x)
predictions.append(yhat)
test_score = mean_squared_error(test_y, predictions)
print('Test MSE: %.3f' % test_score)
در این مطلب، خطا بیشتر از ۱۷۷۷۳۰ در مجموعه داده تست است.
گام ۵: مثال کامل
در نهایت، نموداری ترسیم شده که مجموعه داده آموزش و پیشبینیهای متفاوت از مقادیر واقعی از مجموعه داده تست را نشان میدهد. از نمودار پیشبینی مدل مانا میتوان به وضوح فهمید که مدل ۱-گام در پس حقیقت است. گرایش رو به رشدس در شکل فروشهای ماه به ماه و نویز در تصاویر فروش وجود دارد که محدودیت روش مانا را برجسته میسازد.
مثال کامل، در زیر ارائه شده است.
from pandas import read_csv
from pandas import datetime
from pandas import DataFrame
from pandas import concat
from matplotlib import pyplot
from sklearn.metrics import mean_squared_error
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')
series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
# Create lagged dataset
values = DataFrame(series.values)
dataframe = concat([values.shift(1), values], axis=1)
dataframe.columns = ['t-1', 't+1']
print(dataframe.head(5))
# split into train and test sets
X = dataframe.values
train_size = int(len(X) * 0.66)
train, test = X[1:train_size], X[train_size:]
train_X, train_y = train[:,0], train[:,1]
test_X, test_y = test[:,0], test[:,1]
# persistence model
def model_persistence(x):
return x
# walk-forward validation
predictions = list()
for x in test_X:
yhat = model_persistence(x)
predictions.append(yhat)
test_score = mean_squared_error(test_y, predictions)
print('Test MSE: %.3f' % test_score)
# plot predictions and expected results
pyplot.plot(train_y)
pyplot.plot([None for i in train_y] + [x for x in test_y])
pyplot.plot([None for i in train_y] + [x for x in predictions])
pyplot.show()
در این مطلب، یک مدل مانا که از پایه برای مساله فروش شامپو ارائه شده است، مورد بررسی قرار گرفت. الگوریتم مانا ساده است و معمولا به آن «پیشبینی ساده» (Naive Forecast) گفته میشود. این مدل هیچ فرضیاتی را پیرامون مسئله سری زمانی که روی آن اعمال شده است، در نظر نمیگیرد. این امر موجب میشود درک آن آسان و پیادهسازی و ارزیابی آن سریع باشد.
به عنوان یک پیشبین «یادگیری ماشین» (Machine Learning)، این مدل میتواند شاهد بهبودهای قابل توجهی نیز باشد. این کار بدین دلیل مفید است که این ایدهها میتوانند ویژگیهای ورودی در فرایند مهندسی ویژگیها یا مدل سادهای باشند که ممکن است در فرایند مونتاژ ترکیب شوند.
جمعبندی
در این مطلب، چگونگی ایجاد یک روش مبنا برای مسائل پیشبینی سری زمانی با استفاده از زبان برنامهنویسی پایتون آموزش داده شد. همچنین، اهمیت ایجاد روش مبنا، چگونگی پیادهسازی الگوریتم مانا در پایتون از پایه و روش ارزیابی پیشبینی در الگوریتم مانا و استفاده از آن به عنوان مبنا مورد بررسی قرار گرفت.
سلام جناب وحدت
وقتتون بخیر
تشکر میکنم بابت مطلب مفید و کاربردی ای که منتشر کردین
من مدتیه که دارم روی تحلیل سری های زمانی کار میکنم
ابتدا با استفاده از الگوریتم های دیپ لرنینگ شروع کردم تا اینکه رسیدم به نتیجه ای شبیه به نتیجه گیری شما توی مقاله “پیش بینی سری زمانی در پایتون” در سایت dataexperts.ir
خیلی درگیر این موضوع بودم که چرا پیش بینی من یک گام عقب هست و خیلی تحقیق کردم که مشکل رو برطرف کنم تا یواش یواش هدایت شدم به مدل مانا و در نهایت هم برخورد کردم با پست شما
تازه متوجه شدم که من فقط یک مدل مانا طراحی کردم نه یک مدلی که بشه از جوابش در عمل استفاده کنم
اما با این وجود هنوز نمیدونم این مدلی که من طراحی کردم (مانا) دقیقا چی هست و به چه دردی میخوره و من چه استفاده ای میتونم ازش بکنم
ممنون میشم یه توضیح و راهنمایی مختصری بفرمایید که چطور میتونم به یک پیش بینی واقعی بر روی دیتاهای زمان دار یا همون سری زمانی برسم
باز هم ازتون تشکر میکنم و براتون آرزوی بهترین ها رو دارم
ابوذر رحمانی
ایمیل: rahmani301365@gmail.com