🐍

Claude + MCP + BigQueryMLで、タイタニック生存予測

に公開

0. 対象読者

「MCP触ってみよう」っていうPythonユーザ

1. はじめに

こんにちは!なおずみです!
本記事は前回書いた以下の記事のおまけになります。
まだ見てない方はそっちから見てもらえると嬉しいです!
https://zenn.dev/naozumi23/articles/1ad57b29affc46
前回、自然言語でBigQueryを触ってみましたが、今回はBigQueryMLを使って、簡単な生存予測をやってみました。

2. 今回やること

今回のスコープは以下の通り

  • claude desktop
  • fastapi-mcp
  • poetry
  • Docker
  • pytest

3. 前提

  • 開発環境はMac
  • Docker入ってること
  • poetry入ってること
  • uv入ってること
  • Claude Desktop入ってること(無料プランで大丈夫)

4. BigQueryMLが使えるように、server.pyに追記

ロジスティック回帰の機械学習モデルを構築するAPIと、推論するAPIの2つを追記する

server.py
@app.get("/create_logistic_reg_model_by_bigquery_ml/{model_name}/{project_id}/{dataset_id}/{train_table_id}/{target_variable}", operation_id="create_logistic_reg_model_by_bigquery_ml")
async def create_logistic_reg_model_by_bigquery_ml(model_name: str, project_id: str, dataset_id: str, train_table_id: str, target_variable: str):
    
    # Execute the query
    query = f"""
        CREATE OR REPLACE MODEL `{project_id}.{dataset_id}.{model_name}`
        OPTIONS(
          model_type='logistic_reg'
        ) AS
        SELECT
          {target_variable} as label,
          * except({target_variable})
        FROM
          `{project_id}.{dataset_id}.{train_table_id}`
    """
    
    query_job = client.query(query)
    # Wait for the job to complete
    query_job.result()
    
    return {"model_name": model_name, "status": "Model created successfully"}

@app.get("/predict_by_bigquery_ml/{model_name}/{project_id}/{dataset_id}/{test_table_id}/{id}/{limit}", operation_id="predict_by_bigquery_ml")
async def predict_by_bigquery_ml(model_name: str, project_id: str, dataset_id: str, test_table_id: str, id: str, limit: int):

    # Execute the query
    query = f"""
        SELECT
            {id} as id,
            predicted_label
        FROM
            ML.PREDICT(MODEL `{project_id}.{dataset_id}.{model_name}`, (
            SELECT
                *
            FROM
                `{project_id}.{dataset_id}.{test_table_id}`
            ))
        ORDER BY
            id
        LIMIT {limit}
    """
    
    query_job = client.query(query)
    # Wait for the job to complete
    results = query_job.result()
    
    return {"predictions": [dict(row) for row in results]}

BigQueryMLはロジスティック回帰などのモデルだと、勝手にOneHotEncodingしてくれるので、目的変数以外は全部特徴量として突っ込んじゃう。
全部のデータだと時間かかっちゃうので、limitもつけとく。

5. Claude Desktopから触ってみる

alt text
5件予測した感じは以下の通り

{
  "predictions": [
    {
      "id": 892,
      "predicted_label": 0
    },
    {
      "id": 893,
      "predicted_label": 0
    },
    {
      "id": 894,
      "predicted_label": 0
    },
    {
      "id": 895,
      "predicted_label": 0
    },
    {
      "id": 896,
      "predicted_label": 1
    }
  ]
}

alt text

5. まとめ

いかがだったでしょうか?
BigQueryMLを自然言語で触ってみましたが、簡易的な予測であれば使えそうですね。
機械学習のナレッジがなくても、ざっくり予測できる!みたいなのは、そこそこ需要あるんじゃないかな〜て思ってます。
MCPとっても面白いので他にも色々試してみたいですね!

ソースコード載せとくので、よかったら覗いてください〜
(キーの中身は出鱈目なので、正しいキーにしてね〜)
https://github.com/zumibanbanG/mcp_for_bigquery

GitHubで編集を提案

Discussion