🐍
Claude + MCP + BigQueryMLで、タイタニック生存予測
0. 対象読者
「MCP触ってみよう」っていうPythonユーザ
1. はじめに
こんにちは!なおずみです!
本記事は前回書いた以下の記事のおまけになります。
まだ見てない方はそっちから見てもらえると嬉しいです!
前回、自然言語で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から触ってみる
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
}
]
}
5. まとめ
いかがだったでしょうか?
BigQueryMLを自然言語で触ってみましたが、簡易的な予測であれば使えそうですね。
機械学習のナレッジがなくても、ざっくり予測できる!みたいなのは、そこそこ需要あるんじゃないかな〜て思ってます。
MCPとっても面白いので他にも色々試してみたいですね!
ソースコード載せとくので、よかったら覗いてください〜
(キーの中身は出鱈目なので、正しいキーにしてね〜)
Discussion