「10月1日~12月10日までにスキル内課金機能を公開スキル(新規スキル・既存スキルどちらでも可)に実装し、かつキャンペーンにお申し込みをいただいた方には、Echo Show 5をもれなくプレゼントします。複数スキルが該当した場合は、その数分のEcho Show 5をプレゼント(最大1開発者につき10台まで)!」
フィードバック:スキルは、ユーザーがアップセルに同意したにも関わらず、スキル内課金プロセスを正常に完了する事が出来ませんでした。スマートフォンのAlexaアプリや Alexa for PC ではスキル内商品を購入できません。ただ、ユーザーが購入済みのコンテンツを利用することは可能です。そのため、4回目以上使用の場合は、Echoデバイス側で商品の購入ができて、且つスマートフォン端末で購入済みの商品を使用できるようにする必要があります。ご確認後、修正をお願いします。
import nbformat
from nbconvert.preprocessors import ExecutePreprocessor
withopen(LOCAL_FILE_PATH) as fIn:
nb = nbformat.read(fIn, as_version=4)
ep = ExecutePreprocessor(timeout=600, kernel_name='python3')
ep.preprocess(nb)
withopen(PROCESSED_FILE_PATH, 'w', encoding='utf-8') as fOut:
nbformat.write(nb, fOut)
import os
from google.cloud import storage
# https://nbconvert.readthedocs.io/en/latest/execute_api.html#executing-notebooks-using-the-python-api-interfaceimport nbformat
from nbconvert.preprocessors import ExecutePreprocessor
defdownload_blob(bucket_name, source_blob_name, destination_file_name):
# 中略# https://cloud.google.com/storage/docs/downloading-objects# end of download_blobdefupload_blob(bucket_name, source_file_name, destination_blob_name):
# 中略# https://cloud.google.com/storage/docs/uploading-objects#storage-upload-object-python# end of upload_blobdefmain():
LOCAL_FILE_PATH = 'test.ipynb'
PROCESSED_FILE_PATH = 'test_processed.ipynb'
BUCKET_NAME = os.environ['BUCKET_NAME']
DOWNLOAD_FILE_PATH = os.environ['DOWNLOAD_FILE_PATH']
UPLOAD_FILE_PATH = os.environ['UPLOAD_FILE_PATH']
download_blob(
BUCKET_NAME,
DOWNLOAD_FILE_PATH,
LOCAL_FILE_PATH
)
withopen(LOCAL_FILE_PATH) as fIn:
nb = nbformat.read(fIn, as_version=4)
ep = ExecutePreprocessor(timeout=600, kernel_name='python3')
ep.preprocess(nb)
withopen(PROCESSED_FILE_PATH, 'w', encoding='utf-8') as fOut:
nbformat.write(nb, fOut)
upload_blob(
BUCKET_NAME,
PROCESSED_FILE_PATH,
UPLOAD_FILE_PATH
)
# end of with fOut# end of with fIn# end of mainif __name__ == "__main__":
# execute only if run as a script
main()
date category value
2018-01-01 A 3.5435852645574193
2018-01-02 B 1.275152805839512
2018-01-03 A 5.40014361858529
2018-01-04 B 0.6804527791760495
2018-01-05 A 3.212071974642821
2018-01-06 B 0.02215664060029765
2018-01-07 A 2.6168577420923445
2018-01-08 B 1.5697355255078034
2018-01-09 A 3.738544793192011
(以下同様に、2年分、730件)
要するに category が A だったら value が 4.0 を中心に、B だったら 1.0 を中心に分布しているだけです。プロットすると以下のようになりました。まさに仮設した真理から作り出されたデータです。Einstein Discoveryの予測モデル作成機能はきっと容易にこの真理を見つけ出してくれるはずです。
最初は Start an Einstein Discovery Story ですが、ここは以下のように設定します。
Story Goalと言われても困ってしまいますね。これはEinstein Discovery固有の概念と考えたほうが良いと思います。予測モデルの期待動作は言わずとしれた予測で、これ自体の評価は「正確かどうか」に尽きるでしょう。しかしここで言うStory Goalは、予測対象の数値を「どうしたいのか」という、予測モデル作成の背景に関する質問なのです。売上や利益なら「最大化したい」とか、故障率や返品率なら「最小化したい」という意図があると思いますが、その意図を入力します。
機械学習に多少の覚えのある筆者でしたが、この画面を読み解くには、Einstein Discoveryの設計背景を少々洞察する必要がありました。この図はつまり、category の選択が、 value 最大化という目的に「大きく影響している」と言っているのです。もちろんそうなるようにデータを作ったのだから当然ですが、この「Story(=予測モデル)」、何を根拠に数値を出しているのでしょうか?
まさに最初に仮設した真理をだいたい反映する内容になっていると言えます。 これこそが予測モデルの正体のようです。 Einstein Discoveryがやっていたことは、モデル作成という名の、係数調整だったのです。(言われてみれば、Linear Regressionのトレーニングとは、そういう作業にほかなりませんね。。。)
Field System Administrator Analytics Cloud Integration User
---------------------------------------------------------------------------
SpeculatedValue__c read only read only
FinalValue__c read write read only
ここでは予測モデルが適用された2つのレコードについて、 SpeculatedValue に設定された Predicted Value と FinalValue に設定された Actual Value がプロットされ、予測が概ね正確に行われていることが観察できます。また一定期間運用すれば、 Accuracy Trend で予測精度の時系列変化を観察することもできるでしょう。