DataRobot Batch Prediction APIに対してデータを投げるコードを運用しているのですが、投げる側のコードの修正によって必須のカラムが欠損してしまうケースがあり、それを自動で防ぐためにDataRobot BatchPrediction APIの必須項目を取り出す方法を探っています。
いくつかデータを取得する方法はあるようですが、どのendpointを使ってどのように一覧を取得するのがベストな方法でしょうか?
解決済! 解決策の投稿を見る。
@kyosuke さん
ご質問ありがとうございます。田中と申します。
まず確認させていただきたいのですが、
> DataRobot Batch Prediction APIに対してデータを投げるコードを運用しているのですが、投げる側のコードの修正によって必須のカラムが欠損してしまうケースがあり、それを自動で防ぐためにDataRobot BatchPrediction APIの必須項目を取り出す方法を探っています。
必須のカラムというのは特徴量のことでしょうか?特徴量の場合ですと、予測結果として残す特徴量を指定していただくと欠損することは無いかと思いますがいかがでしょうか?
私の勘違いしている可能性がございますので、より詳細な情報、具体的な例を教えていただけないでしょうか?
> いくつかデータを取得する方法はあるようですが、どのendpointを使ってどのように一覧を取得するのがベストな方法でしょうか?
DataRobot Batch Prediction APIのendpointは1つで、v2エンドポイントは下記のとおりです。
- SaaS版の場合、https://app.datarobot.com/api/v2
- オンプレミス版の場合、上記のエンドポイントからご利用されているURLに変更してください
私が理解できておらず申し訳ございません。取得したいデータというのは具体的に何になりますか?
なお、SaaS版のBatch Prediction APIのAPIドキュメントは下記にあり、APIをコールする際の必須項目はRequiredとして記載されております。
https://app.datarobot.com/apidocs/autodoc/api_reference.html#batch-predictions
繰り返しになりますが私が誤解しているところが多々あるかと思いますので
その場合はお手数ですがご指摘いただけると幸いです。
ご確認よろしくお願いいたします。
田中
ご回答いただきありがとうございます。例えば
colA, colB, colC, colD, target
という5つのカラムからなるファイルを元にモデルを作成した場合に、DR側では例えば交互作用を考慮した特徴量など、DRが自ら特徴量を作り出すケースがあるかと思います。しかし、BatchPrediction APIに入れる場合はそこの特徴量作成はDR内部で行うことができるので、入力としてはcolA, colB, colC, colDを含むデータをBatchPrediction APIに送ることで、予測結果を得ることができます。
しかし、例えばコードのミスによって、colBが欠損したようなデータを渡すとDR側のバリデーションで失敗するため、それを防ぐために、事前に必須の特徴量名colA, colB, colC, colDをデプロイされたAPI側から取得したいと考えています。
endpointと言いましたが、正確にはどのpathにアクセスすれば、predictionを行うための必須項目colA, colB, colC, colDを取得することができるのか、ということについてお聞きしたいです。
pathによっては加工された特徴量まで含めて全て取得できるpathや、モデルで使われた特徴量ではなくDRのデータタブに対応するデータが得られるpathなど色々用意されているようですが、指定のデプロイされたAPIに対しての必須項目の特徴量名のみを取得することは、どのようなpathをどのような手順で叩いて情報を取得することで達成されるでしょうか?
@kyosuke さん
状況の共有ありがとうございます。状況理解できました。
> しかし、例えばコードのミスによって、colBが欠損したようなデータを渡すとDR側のバリデーションで失敗するため、それを防ぐために、事前に必須の特徴量名colA, colB, colC, colDをデプロイされたAPI側から取得したいと考えています。
DataRobotに限らず理想的な状況としては、学習に使った特徴量の名前、データ型を予測するプログラム等と一緒に管理、保存されるべきですが管理が難しい状況もありますよね。おそらく今回はその管理できないという状況かと思いますので、確認方法の例を下記に共有させていただきます。
例(PythonのSDK利用の場合):
1. Batch Prediction APIで利用しているdeployment_idを使ってdeployの情報を取得する。
(下記の例では、XXXXがdeployment_idになります。Batch Prediction APIをご利用とのことなのですでにこちらは把握されているかと思いますので取得方法は割愛させてください)
deploy = dr.Deployment.get(deployment_id = "XXXX")
2.deployされた元のプロジェクトを取得する
project = dr.Project.get(deploy.model['project_id'])
3. プロジェクトから特徴量を取得する
features = project.get_features()
こちらでデプロイに使ったプロジェクトの特徴量がfeaturesのリストとして取得できるかと思います。
例えば確認の仕方の例としては下記になります。
for f in features :
print(f.name)
以上でご質問いただいた内容を満たせるかと思いますがいかがでしょうか?
ご確認よろしくお願いいたします。
田中
ご回答ありがとうございます。この方法ですとdeployment IDからproject IDを取り出した上で、project IDに紐づいている特徴量一覧をとっているとお見受けしました。
この場合、projectにアップロードしたデータに対して複数の特徴量セットが作られていて、そのうちの1つの特徴量セットから作られたモデルに紐づくdeploymentの特徴量は、projectに紐づく特徴量のsubsetになっていると思いますが、こちらは問題ないでしょうか。
A, B, C, D, targetというデータをモデル作成時にアップロードしてprojectを作成していても、モデル作成に用いられる特徴量セットにはA, B, B+, Cが使われている、というようなケースも多分に存在するものと思いますが、その場合に「A, B, C」の3つのみを取り出す方法をご教示いただきたいのですが、いかがでしょうか。
@kyosuke さん
> この場合、projectにアップロードしたデータに対して複数の特徴量セットが作られていて、そのうちの1つの特徴量セットから作られたモデルに紐づくdeploymentの特徴量は、projectに紐づく特徴量のsubsetになっていると思いますが、こちらは問題ないでしょうか。
ご認識のとおりです。予測する際にprojectにアップロードしたオリジナルの特徴量セットでdeploymentの予測は可能ですので、オリジナルの特徴量セットの特徴量名を取得したいと勘違いしておりました。失礼いたしました。
> A, B, C, D, targetというデータをモデル作成時にアップロードしてprojectを作成していても、モデル作成に用いられる特徴量セットにはA, B, B+, Cが使われている、というようなケースも多分に存在するものと思いますが、その場合に「A, B, C」の3つのみを取り出す方法をご教示いただきたいのですが、いかがでしょうか。
それでしたらこちらの方法はいかがでしょうか?(前回の返信で記載した方法でdeployの変数は用意済みの前提です)
feature_list = dr.models.Model.get(deploy.model['project_id'], deploy.model['id']).get_features_used()
こちらでモデルに適用されている特徴量セットを取得可能です(例えば、私の環境では26個の特徴量のデータセットをアップロードし、22個の特徴量へDataRobotで削減されたデータセットで使ったモデル、デプロイをこの方法で確認できます)
ご質問の回答になっておりますでしょうか?
ご確認よろしくお願いいたします。
田中
上記の方法で確かめましたが、予測対象のデータの名前も入っているようです。これについて弾く方法はありますでしょうか。
@kyosuke さん
> 予測対象のデータの名前も入っているようです。これについて弾く方法はありますでしょうか。
feature_list = dr.models.Model.get(deploy.model['project_id'], deploy.model['id']).get_features_used()
pj = dr.Project.get(deploy.model['project_id'])
feature_list.remove(pj.target)
こちらで予測対象のカラム名を別途取得しリストから除外しています。
こちらでいかがでしょうか?
田中