پروژه پیش بینی سری زمانی در پایتون — به زبان ساده

۱۱۱۲ بازدید
آخرین به‌روزرسانی: ۲۸ آبان ۱۴۰۲
زمان مطالعه: ۶ دقیقه
پروژه پیش بینی سری زمانی در پایتون — به زبان ساده

ایجاد یک مبنا برای انجام «پیش‌بینی» (Prediction) در مسائل «سری زمانی» (Time Series)، بسیار حائز اهمیت است. یک مبنا برای انجام پیش‌بینی این ایده را به پژوهشگر می‌دهد که دیگر مدل‌ها چقدر خوب روی یک مسئله مشخص کار می‌کنند. در این راهنما، چگونگی توسعه یک مدل پیش‌بینی پایدار که می‌توان از آن برای محاسبه سطح پایه‌ای کارایی مدل‌های مختلف در مجموعه داده‌های سری زمانی استفاده کرد با ارائه یک مثال کاربردی، آموزش داده شده است. در مطلب پروژه پیش بینی سری زمانی در پایتون مباحث زیر مورد بررسی قرار می‌گیرند.

997696
  • اهمیت محاسبه کارایی مبنا برای مسائل پیش‌بینی سری زمانی
  • روش توسعه یک مدل پایدار از پایه در پایتون
  • روش ارزیابی پیش‌بینی حاصل از یک مدل پایدار و استفاده از آن برای ایجاد خط مبنایی در کارایی

مبنای کارایی پیش‌بینی

مبنا در پیش‌بینی کارایی، یک نقطه مقایسه را فراهم می‌کند. اگر مدل به کارایی کمتر از مبنا دست پیدا کند، باید از آن صرف‌نظر کرد و یا آن را بهبود بخشید. پیاده‌سازی روشی که برای تولید یک پیش‌بینی برای محاسبه کارایی مبنا مورد استفاده قرار می‌گیرد، باید آسان و دارای جزئیات ویژه مسئله باشد. پیش از آنکه پژوهشگر مبنای کارایی را برای مسئله پیش‌بینی تعیین کند، باید یک «چارچوب تست خودکار» (Automated Test Framework) را توسعه دهد.

این چارچوب، شامل موارد زیر است:

  1. مجموعه داده‌ای که کاربر تمایل دارد برای آموزش و ارزیابی مدل از آن استفاده کند.
  2. روش «بازنمونه‌گیری» (Resampling) که کاربر برای تخمین کارایی روش استفاده خواهد کرد (برای مثال، مجموعه داده‌های آموزش و تست)
  3. معیار کارایی که فرد تمایل دارد برای ارزیابی پیش‌بینی‌ها مورد استفاده قرار دهد (برای مثال، میانگین مربعات خطا یا همان 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» قرار داده شود. قطعه کد زیر، مجموعه داده فروش شامپو را بارگذاری و سری زمانی را ترسیم می‌کند.

1from pandas import read_csv
2from pandas import datetime
3from matplotlib import pyplot
4 
5def parser(x):
6	return datetime.strptime('190'+x, '%Y-%m')
7 
8series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
9series.plot()
10pyplot.show()

با اجرای قطعه کد بالا، نمودار خروجی به صورت زیر حاصل می‌شود:

پروژه پیش بینی سری زمانی در پایتون -- به زبان ساده

پروژه پیش بینی سری زمانی در پایتون و الگوریتم مانا

یک مدل مانا را می‌توان به سادگی در پایتون پیاده‌سازی کرد. در ادامه، کار پیاده‌سازی به پنج گام شکسته می‌شود.

  • تبدیل مجموعه داده تک‌متغیره به یک مسئله «یادگیری نظارت شده» (Supervised Learning Problem)
  • ایجاد مجموعه داده‌های تست و آموزش برای چارچوب تست خودکار
  • تعریف مدل مانا
  • انجام پیش‌بینی و تبیین کارایی مبنا
  • بازبینی مثال کامل و ترسیم نمودار خروجی

گام ۱: تعریف مسئله یادگیری نظارت شده

اولین گام، بارگذاری مجموعه داده و ساخت یک ارائه پسین است. بدین شکل، بر اساس مشاهده در زمان t-1، مشاهده در زمان t+1 پیش‌بینی می‌شود.

1# Create lagged dataset
2values = DataFrame(series.values)
3dataframe = concat([values.shift(1), values], axis=1)
4dataframe.columns = ['t-1', 't+1']
5print(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 در نظر گرفته نشوند. در این مورد، هیچ آموزشی نیاز نیست.

هر یک از مجموعه‌های آموزش و تست، سپس به متغیرهای ورودی و خروجی شکسته می‌شوند.

1# split into train and test sets
2X = dataframe.values
3train_size = int(len(X) * 0.66)
4train, test = X[1:train_size], X[train_size:]
5train_X, train_y = train[:,0], train[:,1]
6test_X, test_y = test[:,0], test[:,1]

گام ۳: الگوریتم مانا

می‌توان الگوریتم مبنا را به عنوان تابعی تعریف کرد که مقدار فراهم شده را به عنوان ورودی باز می‌گرداند. برای مثال، اگر مقدار t-1 از ۲۶۶٫۰ فراهم شد، این مورد به عنوان پیش‌بینی باز گردانده می‌شود؛ در حالی که مقدار مورد انتظار یا واقعی که به وقوع می‌پیوندد ۱۴۵٫۹ است (از اولین سطر قابل استفاده در مجموعه داده پسین گرفته شده است).

1# persistence model
2def model_persistence(x):
3	return x

گام ۴: انجام پیش‌بینی و ارزیابی آن

اکنون، مدل روی مجموعه داده تست ارزیابی می‌شود. این کار با استفاده از روش اعتبارسنجی «پیش‌رونده» (Walk-Forward) انجام می‌شود. نیاز به آموزش یا بازآموزی مدل نیست. بنابراین، در مجموعه داده تست، یکی یکی بر اساس گام‌های زمانی، پیش‌بینی انجام می‌شود.

هنگامی که پیش‌بینی برای هر گام زمانی در مجموعه داده آموزش انجام شد، این پیش‌بینی‌ها با مقادیر مورد انتظار و امتیاز «میانگین مربعات خطاها» (Mean Squared Error | MSE) محاسبه می‌شود.

1# walk-forward validation
2predictions = list()
3for x in test_X:
4	yhat = model_persistence(x)
5	predictions.append(yhat)
6test_score = mean_squared_error(test_y, predictions)
7print('Test MSE: %.3f' % test_score)

در این مطلب، خطا بیش‌تر از ۱۷۷۷۳۰ در مجموعه داده تست است.

گام ۵: مثال کامل

در نهایت، نموداری ترسیم شده که مجموعه داده آموزش و پیش‌بینی‌های متفاوت از مقادیر واقعی از مجموعه داده تست را نشان می‌دهد. از نمودار پیش‌بینی مدل مانا می‌توان به وضوح فهمید که مدل ۱-گام در پس حقیقت است. گرایش رو به رشدس در شکل فروش‌های ماه به ماه و نویز  در تصاویر فروش وجود دارد که محدودیت روش مانا را برجسته می‌سازد.

پروژه پیش بینی سری زمانی در پایتون -- به زبان ساده

مثال کامل، در زیر ارائه شده است.

1from pandas import read_csv
2from pandas import datetime
3from pandas import DataFrame
4from pandas import concat
5from matplotlib import pyplot
6from sklearn.metrics import mean_squared_error
7 
8def parser(x):
9	return datetime.strptime('190'+x, '%Y-%m')
10 
11series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
12# Create lagged dataset
13values = DataFrame(series.values)
14dataframe = concat([values.shift(1), values], axis=1)
15dataframe.columns = ['t-1', 't+1']
16print(dataframe.head(5))
17 
18# split into train and test sets
19X = dataframe.values
20train_size = int(len(X) * 0.66)
21train, test = X[1:train_size], X[train_size:]
22train_X, train_y = train[:,0], train[:,1]
23test_X, test_y = test[:,0], test[:,1]
24 
25# persistence model
26def model_persistence(x):
27	return x
28 
29# walk-forward validation
30predictions = list()
31for x in test_X:
32	yhat = model_persistence(x)
33	predictions.append(yhat)
34test_score = mean_squared_error(test_y, predictions)
35print('Test MSE: %.3f' % test_score)
36 
37# plot predictions and expected results
38pyplot.plot(train_y)
39pyplot.plot([None for i in train_y] + [x for x in test_y])
40pyplot.plot([None for i in train_y] + [x for x in predictions])
41pyplot.show()

در این مطلب، یک مدل مانا که از پایه برای مساله فروش شامپو ارائه شده است، مورد بررسی قرار گرفت. الگوریتم مانا ساده است و معمولا به آن «پیش‌بینی ساده» (Naive Forecast) گفته می‌شود. این مدل هیچ فرضیاتی را پیرامون مسئله سری زمانی که روی آن اعمال شده است، در نظر نمی‌گیرد. این امر موجب می‌شود درک آن آسان و پیاده‌سازی و ارزیابی آن سریع باشد.

به عنوان یک پیش‌بین «یادگیری ماشین» (Machine Learning)، این مدل می‌تواند شاهد بهبودهای قابل توجهی نیز باشد. این کار بدین دلیل مفید است که این ایده‌ها می‌توانند ویژگی‌های ورودی در فرایند مهندسی ویژگی‌ها یا مدل ساده‌ای باشند که ممکن است در فرایند مونتاژ ترکیب شوند.

جمع‌بندی

در این مطلب، چگونگی ایجاد یک روش مبنا برای مسائل پیش‌بینی سری زمانی با استفاده از زبان برنامه‌نویسی پایتون آموزش داده شد. همچنین، اهمیت ایجاد روش مبنا، چگونگی پیاده‌سازی الگوریتم مانا در پایتون از پایه و روش ارزیابی پیش‌بینی در الگوریتم مانا و استفاده از آن به عنوان مبنا مورد بررسی قرار گرفت.

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۶ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
machinelearningmastery
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *