pythonでAIカタログから作成したプロジェクトの予測の説明の実行について教えて下さい。
やりたいことは、GUIで
というようにトレーニングデータを元に予測の説明の計算をさせたいです。
APIリファレンスのサンプルコードを参照に下記のようなコードを作ったのですが
import datarobot as dr
dataset = dr.Dataset.create_from_in_memory_data(data_frame=dataframe)
project = dr.Project.create_from_dataset(dataset.id, project_name='Project Name')
project.set_target(target='target',....)
models = project.get_models()
model = models[0]
feature_impacts = model.get_or_request_feature_impact()
predictions_job = model.request_training_predictions(dr.enums.DATA_SUBSET.ALL)
predictions = predictions_job.get_result_when_complete()
pei_job = dr.PredictionExplanationsInitialization.create(project.id, model.id)
pei_job.wait_for_completion()
pe_job = dr.PredictionExplanations.create(project.id, model.id, dataset.id)
pe = pe_job.get_result_when_complete()
実際には下から2行目で"ClientError: 404 client error: {'message': 'No such prediction dataset found, ID: hogehoge'}"とエラーになります。APIリファレンスによればPredictionExplanations.create()での'dataset.id'は
dataset = project.upload_dataset('./data_to_predict.csv')
のように別にアップロードしたものを指定しないとダメだ、とありました。
GUIで行うのと同じように、すでにプロジェクト上に存在するトレーニングデータを用いた予測の説明を計算させてdownload_to_csv()等で出力させるには、どうすればよいのでしょうか?
解決済! 解決策の投稿を見る。
自己フォローです。GUI上で予測の説明の計算をさせて
という状態までさせた上で
dr.PredictionExplanations.list(project.id, model.id)
としたところ、返り値は'[]'と空リストが帰ってきました。。
def catalog_dataset_to_prediction_dataset(project_id, dataset_id, api_token, host="https://app.datarobot.com"):
# set up POST request
headers = {"Authorization": "Bearer {:}".format(api_token)}
data = {"datasetId": dataset_id}
# make request
resp = requests.post("{:}/api/v2/projects/{:}/predictionDatasets/datasetUploads/".format(host, project_id), json=data, headers=headers)
return json.loads(resp.text)['datasetId']
以上、よろしくお願い致します。
返信ありがとうございます。
GUI上ではすでにプロジェクト上に存在してるデータセットを用いた予測計算→予測の説明の実行ができるので、それができればプロジェクトごとにデータを再度Uploadする手間が省けると思ったのですが、APIの仕様上、頂いた'catalog_dataset_to_prediction_dataset()'でAIカタログから直接プロジェクトへダウンロード(移動?)させて(同時にdataset idを取得)改めて外部テストを実行しないといけない、ということですね。
一点だけ確認したいのですが、Projectを作成した際のデータセットがAIカタログからだけではなく、例えば
import datarobot as dr
project = dr.Project.create('/home/datasets/somedataset.csv',project_name="New project")
としてローカルデータなどからUploadして作成したプロジェクトは
dataset = project.upload_dataset('/home/datasets/somedataset.csv')
と予測用に改めてデータセットをUPLOADして
model.request_prediction(dataset.id)
としなければならない(外部予測をする)、という認識で正しいですか?
ご質問どうもありがとうございます。再度のアップロードを必要としないコードの事例を以下に記載させていただきます。
ご参考になれば幸いです。
import pandas as pd
import numpy as np
import datarobot as dr
import datetime as dt
import requests
import json
import time
your_token = 'XXYYZZ' # api tokenをいれてください。
def catalog_dataset_to_prediction_dataset(project_id, dataset_id, api_token, host="https://app.datarobot.com", delay_seconds = 30):
# set up POST request
headers = {"Authorization": "Bearer {:}".format(api_token)}
data = {"datasetId": dataset_id}
# make request
resp = requests.post("{:}/api/v2/projects/{:}/predictionDatasets/datasetUploads/".format(
host, project_id), json=data, headers=headers)
time.sleep(delay_seconds)
return json.loads(resp.text)['datasetId']
dr.Client(token=your_token, endpoint='https://app.datarobot.com/api/v2')
dr.Project.list(search_params={'project_name': 'apitest'})
dataframe = pd.read_csv("./tmp.csv") # 二値分類タスクのデータセット、例えばThe Banknote Authentication Dataset (https://archive.ics.uci.edu/ml/datasets/banknote+authentication) を想定
dataset = dr.Dataset.create_from_in_memory_data(data_frame=dataframe)
project = dr.Project.create_from_dataset(
dataset.id, project_name='Project Name')
project.set_target(target='label', worker_count=10)
project.wait_for_autopilot(timeout=3600)
did = catalog_dataset_to_prediction_dataset(project.id, dataset.id, your_token)
models = project.get_models()
model = models[0]
feature_impacts = model.get_or_request_feature_impact()
predictions_job = model.request_training_predictions(dr.enums.DATA_SUBSET.ALL)
pei_job = dr.PredictionExplanationsInitialization.create(project.id, model.id)
pei_job.wait_for_completion(max_wait=1200)
pred_job = model.request_predictions(did)
pred_job.get_result_when_complete(max_wait=1200)
pe_job = dr.PredictionExplanations.create(project.id, model.id, did)
pe_job.wait_for_completion()
pe = pe_job.get_result_when_complete(max_wait=1200)
for row in pe.get_rows():
print(row.prediction)
print(row.prediction_explanations)
pe.download_to_csv('prediction_explanations.csv')