وبلاگ / پیش‌بینی سری‌های زمانی با هوش مصنوعی: از مبانی تا پیاده‌سازی عملی

پیش‌بینی سری‌های زمانی با هوش مصنوعی: از مبانی تا پیاده‌سازی عملی

پیش‌بینی سری‌های زمانی با هوش مصنوعی: از مبانی تا پیاده‌سازی عملی

مقدمه

در دنیای امروز، تصمیم‌گیری‌های استراتژیک کسب‌وکارها و سازمان‌ها به شدت وابسته به پیش‌بینی دقیق آینده است. از پیش‌بینی فروش محصولات گرفته تا تحلیل بازارهای مالی، از مدیریت موجودی انبار تا برنامه‌ریزی مصرف انرژی - همه این حوزه‌ها نیازمند درک الگوهای زمانی و پیش‌بینی روندهای آتی هستند.
Time Series Forecasting یا پیش‌بینی سری‌های زمانی، علم و هنر پیش‌بینی مقادیر آینده بر اساس مشاهدات گذشته است. با ظهور هوش مصنوعی و یادگیری ماشین، این حوزه دگرگونی عمیقی را تجربه کرده است. مدل‌های مدرن AI قادرند الگوهای پیچیده‌ای را که روش‌های سنتی نمی‌توانستند شناسایی کنند، کشف و از آنها برای پیش‌بینی دقیق‌تر استفاده کنند.
در این مقاله جامع، به بررسی عمیق مفاهیم، الگوریتم‌ها، ابزارها و تکنیک‌های عملی پیش‌بینی سری‌های زمانی با هوش مصنوعی می‌پردازیم و شما را گام به گام با پیاده‌سازی پروژه‌های واقعی آشنا می‌کنیم.

سری‌های زمانی چیست؟ مفاهیم پایه

سری زمانی (Time Series) مجموعه‌ای از نقاط داده است که در بازه‌های زمانی مشخص و معمولاً منظم ثبت شده‌اند. هر نقطه داده به یک زمان خاص متعلق است و ترتیب زمانی این داده‌ها اهمیت بسیار زیادی دارد.

اجزای اصلی سری‌های زمانی

هر سری زمانی معمولاً از چهار جزء اصلی تشکیل شده است:
1. روند (Trend): جهت کلی حرکت داده‌ها در طول زمان. روند می‌تواند صعودی، نزولی یا ثابت باشد. برای مثال، رشد جمعیت یا افزایش فروش یک محصول موفق.
2. فصلی‌بودن (Seasonality): الگوهای تکرارشونده در بازه‌های زمانی ثابت. مثلاً افزایش فروش لباس زمستانی در فصل سرما یا افزایش ترافیک وب‌سایت‌ها در ساعات خاص روز.
3. چرخه‌ای‌بودن (Cyclicality): نوسانات بلندمدت که به طور منظم تکرار نمی‌شوند و معمولاً به عوامل اقتصادی یا کسب‌وکاری مرتبط‌اند.
4. نوفه یا باقی‌مانده (Noise/Residual): نوسانات تصادفی و غیرقابل پیش‌بینی که پس از حذف سه جزء قبلی باقی می‌مانند.

ویژگی‌های مهم سری‌های زمانی

برای کار با سری‌های زمانی و انتخاب مدل مناسب، باید با برخی مفاهیم کلیدی آشنا باشید:
ایستایی (Stationarity): یک سری زمانی زمانی ایستا است که ویژگی‌های آماری آن (میانگین، واریانس) در طول زمان ثابت بماند. بسیاری از مدل‌های سنتی نیاز به داده‌های ایستا دارند.
خودهمبستگی (Autocorrelation): میزان همبستگی یک سری زمانی با خودش در تاخیرهای زمانی مختلف. این ویژگی کمک می‌کند الگوهای تکراری را شناسایی کنیم.
تاخیر زمانی (Lag): فاصله زمانی بین مشاهدات. برای مثال، مقایسه فروش امروز با فروش یک هفته قبل.

چرا هوش مصنوعی برای پیش‌بینی سری‌های زمانی؟

روش‌های سنتی آماری مانند ARIMA، Exponential Smoothing و دیگر تکنیک‌های کلاسیک دهه‌ها در پیش‌بینی سری‌های زمانی کاربرد داشته‌اند. اما این روش‌ها محدودیت‌هایی دارند:
  • ناتوانی در شناسایی الگوهای غیرخطی پیچیده
  • نیاز به پیش‌پردازش دستی و انتخاب پارامترهای دقیق
  • عملکرد ضعیف با داده‌های چندمتغیره
  • محدودیت در مدیریت وابستگی‌های بلندمدت
مدل‌های یادگیری عمیق و هوش مصنوعی این محدودیت‌ها را برطرف کرده‌اند:
یادگیری خودکار ویژگی‌ها: نیازی به استخراج دستی ویژگی‌ها نیست 
مدیریت پیچیدگی: قابلیت مدل‌سازی روابط غیرخطی و پیچیده 
مقیاس‌پذیری: کار با حجم عظیم داده‌ها 
چندمتغیره‌بودن: استفاده همزمان از چندین سری زمانی مرتبط 
انعطاف‌پذیری: سازگاری با انواع مختلف داده‌ها و الگوها

مدل‌های هوش مصنوعی برای پیش‌بینی سری‌های زمانی

1. شبکه‌های عصبی بازگشتی (RNN)

شبکه‌های عصبی بازگشتی اولین نسل از مدل‌های یادگیری عمیق برای سری‌های زمانی بودند. این شبکه‌ها دارای حلقه‌های بازخوردی هستند که اطلاعات را در طول توالی حفظ می‌کنند.
مزایا:
  • قابلیت پردازش توالی‌های با طول متغیر
  • حافظه کوتاه‌مدت برای نگهداری اطلاعات قبلی
معایب:
  • مشکل محوشدن یا انفجار گرادیان
  • ناتوانی در یادگیری وابستگی‌های بلندمدت
  • آموزش کند و پرهزینه

2. حافظه طولانی کوتاه‌مدت (LSTM)

LSTM نسخه بهبودیافته RNN است که مشکلات اصلی آن را حل می‌کند. LSTM با استفاده از گیت‌های خاص (فراموشی، ورودی، خروجی) قادر است اطلاعات مهم را برای مدت طولانی حفظ کند.
ساختار LSTM:
  • گیت فراموشی: تصمیم می‌گیرد چه اطلاعاتی از حافظه سلول حذف شود
  • گیت ورودی: مشخص می‌کند چه اطلاعات جدیدی به حافظه اضافه شود
  • گیت خروجی: تعیین می‌کند چه بخشی از حافظه به خروجی منتقل شود
کاربردهای عملی:
  • پیش‌بینی قیمت سهام و ارزهای دیجیتال
  • پیش‌بینی تقاضای انرژی
  • تحلیل و پیش‌بینی روند فروش

3. واحدهای بازگشتی دروازه‌دار (GRU)

GRU ساده‌تر از LSTM است اما عملکرد مشابهی دارد. این معماری فقط دو گیت دارد (به‌روزرسانی و ریست) و پارامترهای کمتری برای آموزش نیاز دارد.
مزایا نسبت به LSTM:
  • سرعت آموزش بیشتر
  • نیاز به حافظه کمتر
  • عملکرد مشابه در بسیاری از کاربردها
چه زمانی GRU را انتخاب کنیم؟
  • دیتاست‌های کوچک‌تر
  • نیاز به آموزش سریع‌تر
  • منابع محاسباتی محدود

4. مدل‌های مبتنی بر Transformer

معماری Transformer که ابتدا برای پردازش زبان طبیعی طراحی شده بود، انقلابی در پیش‌بینی سری‌های زمانی ایجاد کرده است.
Temporal Fusion Transformers (TFT): این مدل ترکیبی از LSTM و مکانیسم توجه است که قادر به:
  • پردازش همزمان متغیرهای متعدد
  • شناسایی اهمیت نسبی هر متغیر
  • ارائه تفسیرپذیری بالا
Informer و Autoformer: مدل‌های پیشرفته‌تر که برای سری‌های زمانی بلند طراحی شده‌اند و از مکانیسم توجه بهینه‌شده استفاده می‌کنند.

5. مدل‌های ترکیبی و پیشرفته

Prophet: مدل توسعه‌یافته توسط Meta که برای کسب‌وکارها طراحی شده است. این مدل:
  • بدون نیاز به تخصص عمیق قابل استفاده است
  • به خوبی با داده‌های ناقص کار می‌کند
  • فصلی‌بودن‌های چندگانه را مدیریت می‌کند
  • تعطیلات و رویدادهای خاص را در نظر می‌گیرد
N-BEATS: یک معماری عصبی خالص مبتنی بر بلوک‌های پشته‌ای که بدون نیاز به استخراج ویژگی کار می‌کند.
DeepAR: مدل احتمالاتی Amazon که برای پیش‌بینی گروهی چندین سری زمانی مرتبط مناسب است.

مراحل عملی پیش‌بینی سری‌های زمانی

مرحله 1: جمع‌آوری و بررسی داده

اولین و مهم‌ترین گام، تهیه داده‌های با کیفیت است. داده‌های سری زمانی شما باید:
  • کامل و بدون نقص باشند (یا نقص‌ها به درستی مدیریت شوند)
  • دارای برچسب‌زمانی دقیق باشند
  • با فرکانس ثابت ثبت شده باشند (مثلاً روزانه، ساعتی)
  • از منابع معتبر جمع‌آوری شده باشند
برای بررسی اولیه داده‌ها از کتابخانه pandas استفاده کنید:
python
import pandas as pd
import matplotlib.pyplot as plt

# بارگذاری داده
df = pd.read_csv('sales_data.csv', parse_dates=['date'])
df.set_index('date', inplace=True)
# بررسی اولیه
print(df.info())
print(df.describe())
# رسم نمودار
df['sales'].plot(figsize=(15, 5))
plt.title('روند فروش در طول زمان')
plt.show()

مرحله 2: پیش‌پردازش و آماده‌سازی داده

رسیدگی به مقادیر گمشده:
python
# روش‌های مختلف پر کردن مقادیر گمشده
df.fillna(method='ffill') # استفاده از آخرین مقدار معتبر
df.fillna(df.mean()) # استفاده از میانگین
df.interpolate(method='linear') # درون‌یابی خطی
شناسایی و رسیدگی به نقاط پرت:
python
from scipy import stats

# شناسایی outliers با Z-score
z_scores = np.abs(stats.zscore(df['sales']))
outliers = df[z_scores > 3]
نرمال‌سازی داده‌ها:
python
from sklearn.preprocessing import MinMaxScaler, StandardScaler

# مقیاس‌بندی به بازه 0-1
scaler = MinMaxScaler()
df['sales_scaled'] = scaler.fit_transform(df[['sales']])
# استانداردسازی (میانگین=0، انحراف معیار=1)
scaler = StandardScaler()
df['sales_standardized'] = scaler.fit_transform(df[['sales']])
تجزیه سری زمانی:
python
from statsmodels.tsa.seasonal import seasonal_decompose

# جداسازی اجزای سری زمانی
decomposition = seasonal_decompose(df['sales'], model='additive', period=12)
trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid
# رسم نمودار
decomposition.plot()
plt.show()

مرحله 3: استخراج ویژگی‌ها

ویژگی‌های خوب می‌توانند عملکرد مدل را به طور چشمگیری بهبود بخشند:
ویژگی‌های زمانی:
python
df['year'] = df.index.year
df['month'] = df.index.month
df['day'] = df.index.day
df['dayofweek'] = df.index.dayofweek
df['quarter'] = df.index.quarter
df['is_weekend'] = df.index.dayofweek.isin([5, 6]).astype(int)
ویژگی‌های تاخیری (Lag Features):
python
# ایجاد ویژگی‌های تاخیری
for i in range(1, 8):
df[f'sales_lag_{i}'] = df['sales'].shift(i)
ویژگی‌های پنجره‌ای (Rolling Features):
python
# میانگین متحرک
df['sales_rolling_mean_7'] = df['sales'].rolling(window=7).mean()
df['sales_rolling_std_7'] = df['sales'].rolling(window=7).std()

# میانگین متحرک نمایی
df['sales_ewm'] = df['sales'].ewm(span=7, adjust=False).mean()

مرحله 4: تقسیم داده برای آموزش و ارزیابی

در سری‌های زمانی، نباید از تقسیم تصادفی استفاده کرد. باید ترتیب زمانی را حفظ کنیم:
python
# تقسیم زمانی ساده
train_size = int(len(df) * 0.8)
train = df[:train_size]
test = df[train_size:]

# یا استفاده از Time Series Split
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(df):
train = df.iloc[train_index]
test = df.iloc[test_index]

مرحله 5: ساخت و آموزش مدل

مثال 1: پیاده‌سازی LSTM با TensorFlow/Keras
python
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

# آماده‌سازی داده برای LSTM
def create_sequences(data, seq_length):
X, y = [], []
for i in range(len(data) - seq_length):
X.append(data[i:i+seq_length])
y.append(data[i+seq_length])
return np.array(X), np.array(y)
seq_length = 30
X_train, y_train = create_sequences(train_scaled, seq_length)
X_test, y_test = create_sequences(test_scaled, seq_length)
# ساخت مدل LSTM
model = Sequential([
LSTM(128, return_sequences=True, input_shape=(seq_length, 1)),
Dropout(0.2),
LSTM(64, return_sequences=False),
Dropout(0.2),
Dense(32, activation='relu'),
Dense(1)
])
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
# آموزش مدل
history = model.fit(
X_train, y_train,
epochs=100,
batch_size=32,
validation_split=0.2,
callbacks=[
keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True),
keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=5)
]
)
مثال 2: استفاده از Prophet
python
from prophet import Prophet

# آماده‌سازی داده برای Prophet
df_prophet = df.reset_index()
df_prophet.columns = ['ds', 'y'] # Prophet نیاز به این نام‌ها دارد
# ساخت و آموزش مدل
model = Prophet(
seasonality_mode='multiplicative',
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False
)
# اضافه کردن تعطیلات
model.add_country_holidays(country_name='IR')
model.fit(df_prophet)
# پیش‌بینی
future = model.make_future_dataframe(periods=90)
forecast = model.predict(future)
# رسم نمودار
model.plot(forecast)
model.plot_components(forecast)

مرحله 6: ارزیابی مدل

برای ارزیابی عملکرد مدل‌های پیش‌بینی سری زمانی از معیارهای مختلفی استفاده می‌شود:
میانگین خطای مطلق (MAE):
python
from sklearn.metrics import mean_absolute_error

mae = mean_absolute_error(y_test, predictions)
print(f'MAE: {mae}')
جذر میانگین مربعات خطا (RMSE):
python
from sklearn.metrics import mean_squared_error

rmse = np.sqrt(mean_squared_error(y_test, predictions))
print(f'RMSE: {rmse}')
میانگین درصد خطای مطلق (MAPE):
python
def mape(y_true, y_pred):
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100

mape_score = mape(y_test, predictions)
print(f'MAPE: {mape_score}%')
ضریب تعیین (R²):
python
from sklearn.metrics import r2_score

r2 = r2_score(y_test, predictions)
print(f'R²: {r2}')

ابزارها و کتابخانه‌های محبوب

کتابخانه‌های پایتون

1. TensorFlow و Keras: TensorFlow و Keras قدرتمندترین ابزارها برای ساخت مدل‌های یادگیری عمیق هستند.
2. PyTorch: PyTorch محبوب‌ترین فریمورک در میان محققان است که انعطاف‌پذیری بالایی دارد.
3. Statsmodels: کتابخانه جامع برای مدل‌های آماری کلاسیک مانند ARIMA، SARIMA و VAR.
4. Prophet: ابزار ساده و کاربردی Meta برای پیش‌بینی‌های سریع کسب‌وکاری.
5. Darts: کتابخانه مدرن که مدل‌های کلاسیک و یادگیری عمیق را در یک API واحد ارائه می‌دهد.
6. NumPy و Pandas: NumPy برای محاسبات عددی و Pandas برای دستکاری داده‌های سری زمانی.

پلتفرم‌های ابری

AWS Forecast: سرویس مدیریت‌شده Amazon برای پیش‌بینی سری‌های زمانی 
Google Cloud AI Platform: ابزارهای یادگیری ماشین Google شامل Google Cloud AI
Azure Machine Learning: پلتفرم جامع Microsoft برای ML

کاربردهای عملی پیش‌بینی سری‌های زمانی

1. بازارهای مالی

پیش‌بینی قیمت سهام:
  • استفاده از داده‌های تاریخی قیمت
  • ترکیب با شاخص‌های تکنیکال
  • تحلیل احساسات بازار از اخبار
مدیریت ریسک:
  • پیش‌بینی نوسانات بازار (Volatility Forecasting)
  • شناسایی روندهای خطرناک
  • بهینه‌سازی پرتفولیو

2. کسب‌وکار و فروش

پیش‌بینی تقاضا:
  • برنامه‌ریزی تولید
  • مدیریت موجودی انبار
  • بهینه‌سازی زنجیره تأمین
پیش‌بینی فروش:
  • بودجه‌بندی دقیق
  • استراتژی قیمت‌گذاری
  • برنامه‌ریزی منابع انسانی

3. انرژی و محیط‌زیست

پیش‌بینی مصرف انرژی:
  • مدیریت شبکه برق
  • بهینه‌سازی تولید انرژی تجدیدپذیر
  • کاهش هزینه‌های انرژی
پیش‌بینی آب‌وهوا:
  • مدل‌های پیش‌بینی دما
  • پیش‌بینی بارش
  • هشدار سریع بلایای طبیعی

4. حوزه سلامت

پیش‌بینی شیوع بیماری:
  • مدل‌سازی اپیدمی
  • تخصیص منابع بهداشتی
  • برنامه‌ریزی واکسیناسیون
مانیتورینگ بیماران:
  • پیش‌بینی وضعیت بیمار
  • هشدار زودهنگام عوارض
  • شخصی‌سازی درمان

چالش‌ها و راهکارها

1. داده‌های ناقص و نویزدار

چالش: سری‌های زمانی واقعی معمولاً دارای مقادیر گمشده، نقاط پرت و نویز هستند.
راهکار:
  • استفاده از تکنیک‌های Imputation پیشرفته
  • فیلتر کالمن برای حذف نویز
  • مدل‌های Robust که به نویز حساس نیستند

2. تغییر توزیع داده (Concept Drift)

چالش: الگوهای داده در طول زمان تغییر می‌کنند (مثلاً به دلیل تغییرات بازار).
راهکار:
  • آموزش مجدد دوره‌ای مدل
  • استفاده از Online Learning
  • مکانیسم‌های تشخیص Drift
  • مدل‌های Adaptive

3. پیش‌بینی بلندمدت

چالش: دقت پیش‌بینی با افزایش افق زمانی کاهش می‌یابد.
راهکار:
  • استفاده از مدل‌های ترکیبی (Ensemble)
  • پیش‌بینی بازه‌ای به جای نقطه‌ای
  • ترکیب با دانش دامنه (Domain Knowledge)

4. سری‌های زمانی چندمتغیره پیچیده

چالش: وابستگی‌های پیچیده بین متغیرهای متعدد.
راهکار:
  • استفاده از مدل‌های VAR یا Vector LSTM
  • Graph Neural Networks برای روابط پیچیده
  • مدل‌های Attention-based

نکات طلایی برای موفقیت

  1. همیشه با تحلیل اکتشافی شروع کنید: قبل از ساخت هر مدل پیچیده، وقت بگذارید و داده‌ها را به خوبی بشناسید. نمودارها رسم کنید، آماره‌های توصیفی بررسی کنید، الگوهای فصلی را شناسایی کنید.
  2. از مدل‌های ساده شروع کنید: ابتدا یک Baseline ساده (مثلاً میانگین متحرک) بسازید. سپس به سراغ مدل‌های پیچیده‌تر بروید. این کار به شما کمک می‌کند بفهمید که آیا پیچیدگی اضافی ارزشش را دارد یا خیر.
  3. اعتبارسنجی درست انجام دهید: از Time Series Cross-Validation استفاده کنید، نه تقسیم تصادفی. مدل را روی چندین دوره زمانی مختلف تست کنید.
  4. ویژگی‌های دامنه‌ای اضافه کنید: اگر در حوزه فروش کار می‌کنید، تعطیلات، پروموشن‌ها، رویدادهای خاص را به عنوان ویژگی اضافه کنید. دانش دامنه طلای واقعی است.
  5. مدل‌های ترکیبی بسازید: معمولاً ترکیب چند مدل مختلف (Ensemble) نتایج بهتری از تک مدل می‌دهد. می‌توانید LSTM، Prophet و ARIMA را با هم ترکیب کنید.
  6. پیش‌بینی بازه‌ای ارائه دهید: به جای یک عدد دقیق، یک بازه اطمینان (Confidence Interval) ارائه دهید. این امر واقع‌بینانه‌تر و برای تصمیم‌گیری مفیدتر است.
  7. مدل را مانیتور کنید: بعد از استقرار مدل، عملکرد آن را به طور مداوم ارزیابی کنید. اگر دقت کاهش یافت، مدل را دوباره آموزش دهید.
  8. به overfitting توجه کنید: مخصوصاً در مدل‌های عمیق، احتمال overfitting بالاست. از Dropout، Early Stopping و Regularization استفاده کنید.

پروژه عملی: پیش‌بینی فروش فروشگاه آنلاین

حالا بیایید یک پروژه کامل را گام به گام پیاده‌سازی کنیم.

گام 1: بارگذاری و بررسی داده

python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime

# بارگذاری داده
df = pd.read_csv('online_store_sales.csv')
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values('date')
df.set_index('date', inplace=True)
# بررسی اولیه
print(f"تعداد رکوردها: {len(df)}")
print(f"بازه زمانی: {df.index.min()} تا {df.index.max()}")
print(f"\nآمار توصیفی:\n{df.describe()}")
# رسم نمودار
plt.figure(figsize=(15, 6))
plt.plot(df.index, df['sales'])
plt.title('روند فروش روزانه')
plt.xlabel('تاریخ')
plt.ylabel('فروش')
plt.grid(True)
plt.show()

گام 2: تحلیل فصلی‌بودن

python
from statsmodels.tsa.seasonal import seasonal_decompose

# تجزیه سری زمانی
decomposition = seasonal_decompose(df['sales'], model='multiplicative', period=7)
fig, axes = plt.subplots(4, 1, figsize=(15, 10))
decomposition.observed.plot(ax=axes[0], title='مشاهدات اصلی')
decomposition.trend.plot(ax=axes[1], title='روند')
decomposition.seasonal.plot(ax=axes[2], title='فصلی‌بودن')
decomposition.resid.plot(ax=axes[3], title='باقی‌مانده')
plt.tight_layout()
plt.show()

گام 3: ساخت ویژگی‌ها

python
def create_features(df):
df = df.copy()
# ویژگی‌های زمانی
df['dayofweek'] = df.index.dayofweek
df['quarter'] = df.index.quarter
df['month'] = df.index.month
df['year'] = df.index.year
df['dayofyear'] = df.index.dayofyear
df['weekofyear'] = df.index.isocalendar().week
df['is_weekend'] = (df.index.dayofweek >= 5).astype(int)
# ویژگی‌های تاخیری
for i in [1, 7, 14, 28]:
df[f'sales_lag_{i}'] = df['sales'].shift(i)
# ویژگی‌های پنجره‌ای
for window in [7, 14, 28]:
df[f'sales_rolling_mean_{window}'] = df['sales'].rolling(window=window).mean()
df[f'sales_rolling_std_{window}'] = df['sales'].rolling(window=window).std()
df[f'sales_rolling_min_{window}'] = df['sales'].rolling(window=window).min()
df[f'sales_rolling_max_{window}'] = df['sales'].rolling(window=window).max()
# میانگین متحرک نمایی
df['sales_ewm_7'] = df['sales'].ewm(span=7, adjust=False).mean()
df['sales_ewm_28'] = df['sales'].ewm(span=28, adjust=False).mean()
return df

df_features = create_features(df)
df_features = df_features.dropna()

گام 4: تقسیم داده و نرمال‌سازی

python
from sklearn.preprocessing import StandardScaler

# تقسیم داده
train_size = int(len(df_features) * 0.8)
train = df_features[:train_size]
test = df_features[train_size:]
# انتخاب ویژگی‌ها
feature_columns = [col for col in df_features.columns if col != 'sales']
target_column = 'sales'
X_train = train[feature_columns]
y_train = train[target_column]
X_test = test[feature_columns]
y_test = test[target_column]
# نرمال‌سازی
scaler_X = StandardScaler()
scaler_y = StandardScaler()
X_train_scaled = scaler_X.fit_transform(X_train)
X_test_scaled = scaler_X.transform(X_test)
y_train_scaled = scaler_y.fit_transform(y_train.values.reshape(-1, 1)).flatten()

گام 5: آموزش چند مدل مختلف

python
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.linear_model import Ridge
from xgboost import XGBRegressor
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Dropout

# 1. Random Forest
rf_model = RandomForestRegressor(n_estimators=200, max_depth=15, random_state=42)
rf_model.fit(X_train, y_train)
rf_pred = rf_model.predict(X_test)
# 2. XGBoost
xgb_model = XGBRegressor(n_estimators=200, learning_rate=0.05, max_depth=7)
xgb_model.fit(X_train, y_train)
xgb_pred = xgb_model.predict(X_test)
# 3. Neural Network
nn_model = Sequential([
Dense(128, activation='relu', input_shape=(X_train_scaled.shape[1],)),
Dropout(0.3),
Dense(64, activation='relu'),
Dropout(0.2),
Dense(32, activation='relu'),
Dense(1)
])
nn_model.compile(optimizer='adam', loss='mse', metrics=['mae'])
nn_model.fit(
X_train_scaled, y_train_scaled,
epochs=100,
batch_size=32,
validation_split=0.2,
verbose=0,
callbacks=[tf.keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)]
)
nn_pred_scaled = nn_model.predict(X_test_scaled).flatten()
nn_pred = scaler_y.inverse_transform(nn_pred_scaled.reshape(-1, 1)).flatten()

گام 6: ترکیب مدل‌ها (Ensemble)

python
# میانگین وزن‌دار مدل‌ها
ensemble_pred = 0.3 * rf_pred + 0.4 * xgb_pred + 0.3 * nn_pred

# ارزیابی
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
def evaluate_model(y_true, y_pred, model_name):
mae = mean_absolute_error(y_true, y_pred)
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
r2 = r2_score(y_true, y_pred)
mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100
print(f"\n{model_name}:")
print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"R²: {r2:.4f}")
print(f"MAPE: {mape:.2f}%")
evaluate_model(y_test, rf_pred, "Random Forest")
evaluate_model(y_test, xgb_pred, "XGBoost")
evaluate_model(y_test, nn_pred, "Neural Network")
evaluate_model(y_test, ensemble_pred, "Ensemble Model")

گام 7: تحلیل اهمیت ویژگی‌ها

python
# اهمیت ویژگی‌ها در Random Forest
feature_importance = pd.DataFrame({
'feature': feature_columns,
'importance': rf_model.feature_importances_
}).sort_values('importance', ascending=False)

plt.figure(figsize=(10, 8))
sns.barplot(x='importance', y='feature', data=feature_importance.head(15))
plt.title('15 ویژگی مهم')
plt.show()

گام 8: نمایش نتایج

python
# رسم پیش‌بینی‌ها
plt.figure(figsize=(15, 6))
plt.plot(test.index, y_test, label='واقعی', linewidth=2)
plt.plot(test.index, ensemble_pred, label='پیش‌بینی', linewidth=2, alpha=0.7)
plt.title('مقایسه فروش واقعی و پیش‌بینی شده')
plt.xlabel('تاریخ')
plt.ylabel('فروش')
plt.legend()
plt.grid(True)
plt.show()

# رسم خطای پیش‌بینی
errors = y_test - ensemble_pred
plt.figure(figsize=(15, 4))
plt.plot(test.index, errors)
plt.axhline(y=0, color='r', linestyle='--')
plt.title('خطای پیش‌بینی')
plt.xlabel('تاریخ')
plt.ylabel('خطا')
plt.grid(True)
plt.show()

ترندهای آینده در پیش‌بینی سری‌های زمانی

1. Foundation Models برای Time Series

مشابه مدل‌های زبانی بزرگ، محققان در حال توسعه مدل‌های پایه (Foundation Models) برای سری‌های زمانی هستند که روی میلیون‌ها سری زمانی مختلف آموزش دیده‌اند و قابلیت تعمیم بالایی دارند.

2. AutoML برای Time Series

ابزارهای خودکار که بهترین مدل و هایپرپارامترها را برای داده شما پیدا می‌کنند، مانند AutoTS، AutoGluon-TimeSeries و NeuralProphet.

3. Explainable AI

تمرکز بیشتر روی تفسیرپذیری مدل‌ها، به ویژه در حوزه‌های حیاتی مانند مالی و سلامت. ابزارهایی مانند SHAP و LIME برای توضیح پیش‌بینی‌های سری زمانی.

4. Probabilistic Forecasting

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

5. Causal Inference

فراتر از همبستگی، شناسایی روابط علی بین متغیرها برای پیش‌بینی‌های دقیق‌تر و باثبات‌تر.

منابع پیشنهادی برای یادگیری بیشتر

کتاب‌ها:
  • "Forecasting: Principles and Practice" نوشته Rob J Hyndman
  • "Deep Learning for Time Series Forecasting" نوشته Jason Brownlee
  • "Time Series Analysis and Its Applications" نوشته Shumway & Stoffer
دوره‌های آنلاین:
  • دوره Time Series Analysis در Coursera
  • دوره Deep Learning Specialization در Coursera
  • ویدیوهای آموزشی StatQuest در YouTube
وب‌سایت‌ها و بلاگ‌ها:
  • Towards Data Science
  • Machine Learning Mastery
  • Analytics Vidhya

جمع‌بندی

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