LoginSignup
8
7

More than 5 years have passed since last update.

Amazon Machine Learning 外部から多項分類を実行出来るAPIを作成する

Posted at

目標

前回のエントリーで作成した"あやめ"の分類モデルを使い、
外部から多項分類可能なAPIを作成します。

POSTデータをHTTPリクエストで送信し、JSON形式の分類データの取得を目指します。
※送信するPOSTデータの形式は以下となります。

{
  "sl" : "5.7",
  "sw" : "4.4",
  "pl" : "1.5",
  "pw" : "0.4"
}

構成

外部から AWS Machine Learning 機能を使用するためには、API Gateway、Lambda を経由する必要があるため、
環境としては以下のような構成となります。

MLAPI_img.png


ここから各々の機能のセットアップをしていきます。

Machine Learning

  • Machine Learning にアクセスするためのロールを作成

"セキュリティ & アイデンティティ" から "Identity & Access Management" を選択

スクリーンショット_2016-07-26_16_47_51.png

"新しいロールの作成" を選択

スクリーンショット_2016-07-26_16_48_23.png

任意のロール名を入力(ここでは"MachineLearningIrisRole"を入力)

スクリーンショット_2016-07-26_16_52_58.png

"AWS Lambda" を選択

スクリーンショット_2016-07-26_16_53_08.png

探しやすくするため "MachineLearning" でフィルターをかけ、
"AmazonMachineLearningRealTimePredictionOnlyAccess" にチェックを入れて次へ

スクリーンショット_2016-07-26_16_57_44.png

内容を確認して、"ロールの作成" を選択

スクリーンショット_2016-07-26_16_57_52.png

  • ML model を設定

前回のエントリで作成した モデルを選択

スクリーンショット_2016-07-26_17_03_51.png

Summary から "Create endpoint" を選択
※エンドポイント生成後に表示されるエンドポイントのURLとこのモデルIDを控えておきます。

スクリーンショット_2016-07-26_17_04_20.png

Lambda

"コンピューティング" から "Lambda" を選択します

スクリーンショット_2016-07-26_17_06_48.png

"Create a Lambda function" を選択

スクリーンショット_2016-07-27_11_24_49.png

"node-exec" を選択

スクリーンショット_2016-07-27_11_25_00.png

"Next" を選択

スクリーンショット_2016-07-27_11_25_06.png

Name: 任意の関数名を入力(ここでは"IrisCheck" と入力)
Description: 任意
Runtime : "Node.js 4.3" を指定

スクリーンショット_2016-07-27_11_35_53.png

以下のコードを入力
※[使用するモデルID][使用する予測エンドポイント]には、先ほど控えた内容を入力

'use strict';
console.log('Loading event');

exports.handler = function(event, context) {

    // 入力パラメータログ出力
    console.log("sl = " + event.sl);
    console.log("sw = " + event.sw);  
    console.log("pl = " + event.pl);
    console.log("pw = " + event.pw);

    // AWS
    var aws = require('aws-sdk');
    aws.config.region = 'us-east-1';

    // MachineLearning
    var ml = new aws.MachineLearning();

    // パラメータ設定
    var params = {
        MLModelId: '[使用するモデルID]', 
        PredictEndpoint: '[使用する予測エンドポイント]', 
        Record: {
            "Sepal_length" : event.sl,
            "Sepal_width"  : event.sw,
            "Petal_length" : event.pl,
            "Petal_width"  : event.pw
        }
    };

    // 予測実行
    ml.predict(params, function(err, data) {
        if (err) {
            context.fail(err.stack);
        } else {
            context.succeed(data);
        }
    });

};

Existing role : 先ほど作成したロールを指定(ここでは"MachineLearningIrisRole"を指定)
Timeout : 20秒 を指定(デフォルト値(3秒)だとタイムアウトエラーが発生するため)

"Next" を選択

スクリーンショット_2016-07-27_11_35_56.png

内容を確認して "Create function" を選択

スクリーンショット_2016-07-27_11_36_01.png

作成した Lambda function をテストする

"Action" から "Configure test event" を選択

スクリーンショット_2016-07-27_11_38_29.png

テストデータを入力し、"Save and test" を選択

スクリーンショット_2016-07-27_11_38_35.png

結果を確認し、正しく分類されている事を確認

スクリーンショット_2016-07-27_11_36_32.png

API Gateway

"アプリケーションサービス" から "API Gateway" を選択

スクリーンショット_2016-07-26_17_21_42.png

"APIの作成"を選択

スクリーンショット_2016-07-27_11_40_59.png

"新しいAPI"を選択し、以下内容を入力して"APIの作成"を選択
API名 : 任意のAPI名を入力(ここでは"IrisAPI"を入力)
説明 : 任意

スクリーンショット_2016-07-27_11_41_27.png

"/" を選択した状態で、アクションから "メソッドの作成" を選択

スクリーンショット_2016-07-27_11_41_42.png

"POST"を選択後、チェックマークアイコンをクリック

スクリーンショット_2016-07-27_11_41_54.png

統合タイプ : Lambda関数
Lambdaリージョン : 任意
Lambda関数 : 先ほど作成した関数名を入力(ここでは"IrisCheck"を入力)

"保存"を選択

スクリーンショット_2016-07-27_11_42_13.png

"OK" を選択

スクリーンショット_2016-07-27_11_42_22.png

作成した API をテストする

"テスト" をクリック

スクリーンショット_2016-07-27_11_42_29.png

リクエスト本文に、データを入力し "テスト" を選択、
レスポンス本文に分析結果が正しく表示されている事を確認

スクリーンショット_2016-07-27_11_42_58.png

作成した API をデプロイする

アクションから "APIのデプロイ" を選択

スクリーンショット_2016-07-27_11_43_15.png

デプロイされるステージ : 新しいステージ
ステージ名 : 任意のステージ名(ここでは"IrisStage"と入力)
ステージの説明 : 任意
デプロイメントの説明 : 任意

"デプロイ" を選択

スクリーンショット_2016-07-27_11_44_12.png

外部からAPIの実行テストをするためステージから "POST"を選択した際に表示される URLをコピーしておきます。

スクリーンショット_2016-07-27_11_44_24.png

外部から作成した API をテストする

今回は Chromeブラウザで "DHC REST Client" という Webアプリを使って試験を行いました。
先ほどコピーしたURLを入力し、POSTを選択、予測したいデータを入力し "Send"を選択します。
レスポンスに分類結果がJSON形式で取得出来ました。

スクリーンショット_2016-07-27_11_45_14.png


以上、今回は外部から多項分類を実行出来るAPIの作成を行ってみました。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7