testruk / README.md
khushalcodiste's picture
feat: fixed response
5fccbac
metadata
title: Roulette Next-Spin Predictor
emoji: 🎰
colorFrom: red
colorTo: gray
sdk: docker
app_port: 7860
pinned: false
license: mit
short_description: All-models roulette predicto\

Roulette Next-Spin Predictor — all-models edition

FastAPI service that runs every persisted model (classical ML + deep learning + Markov chains) on your past-spins history and returns, for each of the next N spins and each target (number, color, parity, dozen, column):

  • the consensus prediction (majority vote across models), and
  • every individual model's prediction.

Total models in the registry: ~55 across all targets — a mix of LogReg, HistGradientBoosting, MLP, XGBoost, LightGBM, CatBoost, KNN, GaussianNB, Ridge, SGD, SVC, LSTM, GRU, Transformer, and Markov orders 1/2/3.

Endpoints

Method Path Purpose
GET / Health, route summary, count of models per target
POST /predict JSON: {numbers: [...], steps: N}
POST /predict/file CSV or Excel upload (column Winner/number)
GET /docs Swagger UI

File upload notes

The /predict/file endpoint accepts CSV, .xlsx, .xls, and HTML files that contain a table. The file must contain a column named Winner, winning number, or number (case-insensitive). If not found, the last column is used.

Example request

curl -X POST https://<space>.hf.space/predict \
  -H 'Content-Type: application/json' \
  -d '{"numbers":[28,35,36,31,12,17,12,34,6,10,15,14,19,19,22,2,9,11,33,16],"steps":10}'

Example response (one step)

{
  "predictions": [
    {
      "step": 1,
      "number": {
        "consensus": 7,
        "by_model": {
          "logreg": 11, "hist_gradient_boosting": 24, "mlp": 31,
          "xgboost": 11, "lightgbm": 7, "catboost": 23, "knn": 4,
          "gaussian_nb": 7, "ridge": 7, "sgd": 17,
          "lstm": 7, "gru": 33, "transformer": 3,
          "markov_order1": 0, "markov_order2": 12, "markov_order3": 7
        }
      },
      "color":   { "consensus": "black", "by_model": { ... } },
      "parity":  { "consensus": "even",  "by_model": { ... } },
      "dozen":   { "consensus": "third", "by_model": { ... } },
      "column":  { "consensus": "second","by_model": { ... } }
    }
  ],
  "notes": []
}

Interpreting disagreement: if all models agree, the consensus is high confidence. If models are split (e.g. 6 say "black", 5 say "red"), the consensus is fragile and the true answer is likely close to the wheel's marginal probability. Use the per-model columns to gauge that.

Forecast mechanics

  • Input must contain past spins with each number in [0, 36].
  • We roll the window forward step by step using the consensus number each step, so longer horizons compound any model disagreement.
  • Minimum useful context is 20 past numbers (matching the v2 feature window). Shorter inputs are zero-padded from the left.

Honest disclaimer

Roulette on a fair wheel produces independent draws. The number prediction accuracy (about 4% on held-out data) is only marginally above the 2.70% uniform-random baseline. The higher per-target accuracies on color / parity come mostly from the wheel's structural class imbalance, not from learned temporal patterns.

Do not gamble money based on these outputs. This is a machine-learning demo.

Local run

docker build -t roulette-predictor .
docker run -p 7860:7860 roulette-predictor
open http://localhost:7860/docs