Современные системы принятия решений всё чаще опираются на прогнозирование последовательных числовых значений. Предметом данной статьи является задача: «по историческому ряду цифр от 0 до 9 предсказать, какая цифра появится следующей». Такая задача встречается в:
- аналитике лотерейных тиражей;
- тестировании генераторов случайных чисел;
- мониторинге состояния цифрового оборудования (например, счётчиков ошибок);
- финансовых рынках (последняя цифра цены).
Формализация задачи
Пусть задан временной ряд D = {d₁, d₂, …, d_T}, где d_t ∈ {0,1,…,9}.
Требуется оценить P(d_{T+1}|D) – вероятность появления каждой цифры на шаге T+1.
Постановка как задачи классификации
Разделяем ряд на окна длиной w:
X_i = [d_{i}, d_{i+1}, …, d_{i+w-1}]
y_i = d_{i+w}
В результате получаем набор пар (X, y) для обучения моделей машинного обучения.
Конвейер предобработки данных
- Очистка:
- удаление пропусков;
- фильтрация выбросов (например, цифры > 9).
- Кодирование:
- One-hot encoding для таргета y;
- label encoding или embedding для входных окон X.
- Балансировка: если цифры распределены крайне неровномерно, применяют oversampling (SMOTE) или class weights.
Модели и алгоритмы
Классические временные ряды
ARIMA с категориальным расширением – адаптация ARIMA для категориальных данных через dummy-переменные. Подходит при наличии сезонности (например, каждые 10 шагов).
Машинное обучение
- Random Forest / XGBoost: используют скользящие окна признаков: частота цифр, последняя цифра, энтропия окна.
- Logistic Regression: лёгкая интерпретируемая модель; даёт вероятности классов.
Глубокие сети
LSTM (Long Short-Term Memory)
LSTM-клетка состоит из четырёх нейросетевых слоёв:
- Forget gate – решает, что забыть из предыдущего состояния;
- Input gate – обновляет память новыми данными;
- Output gate – генерирует выходной вектор вероятностей цифр.
Пример кода на Python (Keras): model = Sequential([ LSTM(64, return_sequences=True, input_shape=(w, 10)), LSTM(32), Dense(10, activation='softmax') ])
GRU и 1-D CNN
Гибрид CNN-LSTM ускоряет обучение за счёт свёрточных слоёв, извлекающих локальные паттерны, а LSTM – долгосрочные зависимости.
Методика оценки точности
| Метрика | Формула | Интерпретация |
|---|---|---|
| Accuracy | Σ(1{ŷ=y}) / N | Доля правильных предсказаний |
| Log-loss | − Σ y log p | Штраф за неверные вероятности |
| Top-3 Accuracy | 1{ y ∈ top-3 predictions } | Полезно, если допустимо несколько вариантов |
Для борьбы с переобучением используют:
- TimeSeriesSplit (кросс-валидация с учётом времени);
- Early stopping по val-loss;
Отладка и интерпретация
SHAP-анализ
Библиотека shap показывает, какие позиции в окне X наиболее влияют на прогноз.
Визуализация

Рис. 1. График вероятностей цифр, выданных LSTM-моделью для 100 последовательных шагов;
Практический пример на Python
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import accuracy_score
np.random.seed(42)
D = np.random.randint(0, 10, size=5000)
w = 10
X, y = [], []
for i in range(len(D) — w):
X.append(D[i:i+w])
y.append(D[i+w])
X = np.array(X)
y = np.array(y)
X = np.eye(10)[X] # shape (samples, w, 10)
enc = OneHotEncoder(sparse=False)
y_cat = enc.fit_transform(y.reshape(-1,1))
model = Sequential([
LSTM(64, input_shape=(w, 10)),
Dense(10, activation='softmax')
])
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, y_cat, epochs=20, batch_size=128, validation_split=0.2)
pred = model.predict(X)
print("Accuracy:", accuracy_score(y, np.argmax(pred, axis=1)))
Практические советы
- Минимальный объём данных: ≥ 1 000 наблюдений для LSTM, ≥ 300 для деревьев.
- Длина окна w: 5–20 шагов; подбирают через кросс-валидацию.
- Обработка дрейфа: переобучайте модель раз в N дней (sliding-window retraining).
- Скорость против точности: для продакшена используйте Quantized LSTM или GRU, работающие на CPU.
Комбинация методов временных рядов и современных нейросетей позволяет достичь точности предсказания цифры на уровне 25-30 % (что в 2,5 раза выше случайного угадывания при равномерном распределении). Ключ к успеху – качественная предобработка, правильный выбор окна и регулярное обновление модели.
Ссылки и литература
- CyberLeninka: «Алгоритм прогнозирования состояния оборудования»
- Хабр: «Работа с временными рядами в Python»
- ArcGIS Pro Docs: «LSTM-клетка и параметры»
- Skit-learn: «TimeSeriesSplit для кросс-валидации»