yoftdocs

API ドキュメント

予測以外

異常検知、欠損補完、埋め込みを使い、時系列データを分析します。

異常検知

系列の各時点に異常スコアを付けます。しきい値のルールを人が作らなくても、正常な区間の振る舞いから外れた時点を数値で示します。

POST /v1/anomaly

リクエストボディ

フィールド型説明
modelstring使用するモデル。省略時は yoft
seriesobject[]対象の系列(1 系列あたり 16〜2048 点)
test_startintegerスコアを付け始める位置。これより前は「正常の参照区間」として扱う(省略時は 0 = 全区間)
curl
curl -X POST https://YOUR_API_BASE/v1/anomaly \
  -H "Authorization: Bearer $YOFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"test_start": 8, "series": [{"name": "s1", "values": [1.0, 1.2, 1.1, 1.4, 1.3, 1.5, 1.4, 1.6, 1.5, 1.7, 1.6, 1.8, 1.7, 1.9, 1.8, 9.9]}]}'

レスポンス

フィールド説明
pit分布的な驚きの度合い。大きいほど「その時点の値がモデルの予測分布から外れている」
crps予測分布と実測のズレの量。大きいほど外れ幅が大きい
test_startスコア配列が対応する開始位置(リクエストのエコーバック)
200 レスポンス
{
  "request_id": "req_7b2c48...",
  "model": "yoft",
  "model_version": "v1",
  "test_start": 8,
  "series": [
    {
      "name": "s1",
      "pit": [
        0.62,
        0.71,
        0.55,
        0.83,
        0.64,
        0.79,
        0.6,
        41.2
      ],
      "crps": [
        0.05,
        0.06,
        0.04,
        0.07,
        0.05,
        0.06,
        0.05,
        6.83
      ]
    }
  ],
  "usage": {
    "input_points": 16,
    "output_points": 16,
    "series_count": 1
  }
}

スコアは test_start 以降の各時点に 1 つずつ返ります(配列長 = 系列長 − test_start)。鋭いスパイクや水準の変化に強く、カレンダー要因のゆるやかな変動には反応しにくい特性があります。

欠損補完

欠損を含む系列を送ると、欠損位置の値を推定して返します。通信断や保守停止で穴が開いたデータの復元に使えます。

POST /v1/impute

欠損は JSON の null で表します。各系列に少なくとも 1 つの null と 1 つの観測値が必要です(すべて欠測・欠測なしはいずれも 400)。

curl
curl -X POST https://YOUR_API_BASE/v1/impute \
  -H "Authorization: Bearer $YOFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"series": [{"name": "s1", "values": [1.0, 1.2, 1.1, 1.4, null, null, 1.4, 1.6, 1.5, 1.7, 1.6, 1.8, 1.7, 1.9, 1.8, 2.0]}]}'

レスポンス

フィールド説明
values全長の系列。観測位置は入力値そのまま、欠損位置は推定値(中央値)
missing_indices補完した位置の index
quantiles欠損位置の分位点(0.1 / 0.2 / 0.3 / 0.4 / 0.5 / 0.6 / 0.7 / 0.8 / 0.9)。missing_indices と同じ並び
200 レスポンス
{
  "request_id": "req_9e14c3...",
  "model": "yoft",
  "model_version": "v1",
  "series": [
    {
      "name": "s1",
      "values": [
        1,
        1.2,
        1.1,
        1.4,
        1.32,
        1.38,
        1.4,
        1.6,
        …
      ],
      "missing_indices": [
        4,
        5
      ],
      "quantiles": {
        "0.1": [
          1.19,
          1.24
        ],
        "0.5": [
          1.32,
          1.38
        ],
        "0.9": [
          1.46,
          1.53
        ]
      }
    }
  ],
  "usage": {
    "input_points": 16,
    "output_points": 2,
    "series_count": 1
  }
}

埋め込み(類似検索・分類)

系列を固定長のベクトルに変換します。返ったベクトルを使って、類似系列の検索や、手元の軽量な分類器の学習ができます。

POST /v1/embed

yoft では 3840 次元です。次元はモデル(チェックポイント)によって変わるため、クライアントはレスポンスの dim を参照してください。

curl
curl -X POST https://YOUR_API_BASE/v1/embed \
  -H "Authorization: Bearer $YOFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"series": [{"name": "s1", "values": [1.0, 1.2, 1.1, 1.4, 1.3, 1.5, 1.4, 1.6, 1.5, 1.7, 1.6, 1.8, 1.7, 1.9, 1.8, 2.0]}]}'
200 レスポンス
{
  "request_id": "req_0d5f1a...",
  "model": "yoft",
  "model_version": "v1",
  "dim": 3840,
  "embeddings": [
    {
      "name": "s1",
      "vector": [
        0.0121,
        -0.0384,
        …
      ]
    }
  ],
  "usage": {
    "input_points": 16,
    "output_points": 0,
    "series_count": 1
  }
}

使い道

  • 類似検索: ベクトル間のコサイン類似度で「似た形の系列 / 似た日」を探す
  • 分類: ラベル付きの少数データでロジスティック回帰などを学習し、以降はベクトルだけで分類する
  • クラスタリング: 設備・店舗・回線などを振る舞いでグループ分けする

実務上の注意: 生のベクトル同士のコサイン類似度は 0.98 以上に飽和しやすく差が見えません。比較対象の平均ベクトルを引いて(中心化してから)類似度を取ると、違いがはっきり出ます。