キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

APIによる「予測の説明」について

omizu032
NiCdバッテリー

pythonでAIカタログから作成したプロジェクトの予測の説明の実行について教えて下さい。
やりたいことは、GUIで

omizu032_0-1630649679132.png

というようにトレーニングデータを元に予測の説明の計算をさせたいです。
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()等で出力させるには、どうすればよいのでしょうか?

 

 

4件の返信4
omizu032
NiCdバッテリー

自己フォローです。GUI上で予測の説明の計算をさせて

omizu032_0-1630764836507.png

という状態までさせた上で

dr.PredictionExplanations.list(project.id, model.id)

としたところ、返り値は'[]'と空リストが帰ってきました。。

mitsuo
データサイエンティスト
データサイエンティスト
データロボットの山本です。
現在のdatarobotのpython apiクライアントはカタログのデータセットから直接予測を要求することはできません。ただし、以下のエンドポイントを参照することで、データをダウンロードすることができます。
/projects/<projectId>/predictionDatasets/datasetUploads/
よって、以下のコードでカタログデータセットをダウンロードの上、予測の説明を実施していただけますでしょうか。

 

 

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']

 

 

以上、よろしくお願い致します。

0 件の賞賛
omizu032
NiCdバッテリー

返信ありがとうございます。

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)

 

としなければならない(外部予測をする)、という認識で正しいですか?

 

mitsuo
データサイエンティスト
データサイエンティスト

ご質問どうもありがとうございます。再度のアップロードを必要としないコードの事例を以下に記載させていただきます。

ご参考になれば幸いです。

 

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')

 

 

0 件の賞賛