views4GCPのストレージサービスについてまとめてみた。Exp:49212雑食エンジニア/にわかSF者TweetShareHatena注意この記事は2015年3月31日に更新されたもので、内容が古い可能性がありますのでご注意ください。GAE/Jみなさん、こんにちは。API入門もついに後編となりました。APIを利用するデモプログラムを作成しました。APIを使っているロジック部分のコードの解説を行います。Pluginを前提とします。API入門(中編)デモプログラムについて以下のURLにアクセスすると、デモプログラムを閲覧することができます。APIを用いて、Good(良い評価をしている)、Neutral(中立)、Bad(悪い評価をしている)の3つに分類した結果を表示しています。学習データがいい加減なので、結果の精度はイマイチですが、あしからずご了承ください。ちなみに、予測結果はDatastore上に保存してあり、上記URLにアクセスしたときは、Datastoreから値を取り出して表示しています。今回、紹介するコードが動くためには、いくつか準備が必要となりますので、その手順を説明します。APIの有効化を行ってください。サービスアカウントの作成デモプログラムではサービスアカウントを作成して、そのアカウントでAPIを叩く方法を採用しています。ここでは、サービスアカウントの作成方法を説明します。Consoleでプロジェクトを選択し、左のメニューの「認証情報」をクリックしてください。次に、「新しいクライアントIDを作成」をボタンをクリックしてください。すると、ダイアログが表示されるので、「サービスアカウント」を選択し、「クライアントIDを作成」ボタンをクリックしてください。これにより、秘密鍵(拡張子が.p12となっているファイル)がダウンロードされ、ダイアログに秘密鍵のパスワードが表示されます。「OK」ボタンをクリックしてください。ダイアログが閉じて、作成されたサービスアカウントの情報が表示されます。作成された秘密鍵、秘密鍵のパスワード、サービスアカウントのメールアドレスは後で必要となります。Eclipseプロジェクトの作成とライブラリの追加まず、GAEプロジェクトを作成し、WEB-INFフォルダ直下に、サービスアカウントの秘密鍵をコピーしてください。Libraryをビルドパスに追加します。APIs...を選択してください。v1.6を選択して、「OK」ボタンをクリックしてください。APIを叩く肝となる部分のコードの紹介と解説を行っていきます。APIを呼び出すメソッドを実装していきます。P12_PASSWORDの値は適宜、読み替えてください。com.google.api.services.prediction.Prediction)のインスタンスを生成するメソッドを実装します。credential).setApplicationName(APPLICATION_NAME).build();}loadPrivateKeyメソッドは秘密鍵ファイルを読み込んで、PrivateKey型で返すメソッドで、createPredictionServiceメソッドの中で呼ばれます。createPredictionServiceメソッドでは、まず、GoogleCredentialオブジェクトを生成しています。このオブジェクトは、文字通り、認証に必要な情報(サービスアカウントのID、秘密鍵、使用するAPIのスコープなど)を保持します。このオブジェクトをPrediction.Builderクラスに渡して、buildメソッドを呼ぶことで、Predicitonオブジェクトを生成します。APIのinsertメソッドを実行するメソッドを追加します。insert).execute();}この例では、GCS上のCSVファイルを学習データとして、モデルを生成しています。Insertオブジェクトを生成し、idと学習データのパスを指定をセットした後、学習処理を実行しています。APIのpredictメソッドを実行し、1件の予測を行うメソッドを追加します。input).execute();}InputInputオブジェクトに、予測したいデータをセットし、さらにそれをInputオブジェクトにセットした後、予測処理を実行しています。今回の予測対象データの構造は、テキスト形式1カラムのみですので、予測したいテキストだけを含むListをsetCsvInstanceでセットしています。学習データが複数カラムの場合は、予測対象データのListの順序が学習データと同じになるように気をつけてください。予測結果はOutputクラスのオブジェクトとして格納されます。Explorerでpredictを実行して確認できるJSON(中編を参照)に対応した形で、結果を保持しています。今回のようなラベル予測の場合、getOutputLabel()メソッドやgetOutputMulti()で、予測結果を取得できます。数値を予測する回帰予測の場合は、getOutputValue()で予測値を取得できます。上記の例は、1件の対象データに対して、予測するものでした。次は、複数件の予測を1回のバッチ処理で行うメソッドを追加します。PredictionCallbackという内部クラスを定義し、そのクラスのメンバ変数resultに、1件1件に対する予測結果のリストを保持させていることに注意してください。callback.getResults();}上記の例では、batch.execute()を実行し終わると、変数callbackに予測結果が格納されます。1件1件の予測結果について、PrectionCallbackクラスのonSuccess()メソッドまたはonFailure()メソッドの処理が実行され、resultsに予測結果がaddされるというわけです。この例では、onFailure()メソッドでは、とりあえずresultsにnullを追加していますが、実際に使うときは、エラーメッセージを格納する変数を定義して、そこにエラーメッセージをセットするなどの処理を実装すると良いと思います。APIを利用できることがわかったかと思います。今回、ご紹介したコードではinsertとpredictしか使っていませんが、他のメソッドも同じくらい簡単です。