[JAWS-UG CLI] Amazon MachineLearning 入門 (7) エンドポイントの作成、リアルタイム予測の実行

# この記事について

[JAWS-UG CLI専門支部 #67 MachineLearning入門](https://jawsug-cli.doorkeeper.jp/events/41917)で実施するハンズオン用の手順書です。


# 前提条件

## 必要な権限

作業にあたっては、以下の権限を有したIAMユーザもしくはIAMロールを利用してください。

- MachineLearningのフルコントロール権限
- S3のフルコントロール権限
- STSの関するフルコントロール権限

# 0. 準備

## 0.1. リージョンを指定

```bash:コマンド
export AWS_DEFAULT_REGION="eu-west-1"
```

## 0.2. 資格情報を確認


```bash:コマンド
aws configure list
```

インスタンスプロファイルを設定したEC2インスタンスでアクセスキーを設定せずに実行した場合、以下のようになります。

```text:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************GMWA         iam-role
secret_key     ****************obFC         iam-role
    region                eu-west-1              env    AWS_DEFAULT_REGION

```

## 0.3. バージョン確認

```bash:コマンド
aws --version
```

```text:結果
aws-cli/1.10.66 Python/2.7.12 Linux/4.4.19-29.55.amzn1.x86_64 botocore/1.4.56
```

## 0.4. バージョンアップ（必要に応じて）

```bash:コマンド
sudo pip install -U awscli
```

## 0.5. 変数の確認

```bash:コマンド
cat << ETX

    ML_MODEL_ID: ${ML_MODEL_ID}

ETX
```

```text:結果

    ML_MODEL_ID: ml-model-cli-************

```


# 1. リアルタイムエンドポイントの作成


## 1.1. エンドポイントの作成

### 変数の確認

```bash:コマンド
cat << ETX

    ML_MODEL_ID: ${ML_MODEL_ID}

ETX
```

```text:結果

    ML_MODEL_ID: ml-model-cli-************

```


### エンドポイントの作成

```bash:コマンド
aws machinelearning create-realtime-endpoint \
    --ml-model-id ${ML_MODEL_ID}
```

```json:結果
{
    "MLModelId": "ml-model-cli-************",
    "RealtimeEndpointInfo": {
        "EndpointStatus": "UPDATING",
        "PeakRequestsPerSecond": 0,
        "CreatedAt": 1474615929.676,
        "EndpointUrl": "https://realtime.machinelearning.eu-west-1.amazonaws.com"
    }
}
```

### エンドポイントURLの確認

```bash:コマンド
ENDPOINT_URL=$(aws machinelearning get-ml-model \
    --ml-model-id ${ML_MODEL_ID} \
    --query "EndpointInfo.EndpointUrl" \
    --output text) \
    && echo ${ENDPOINT_URL}
```


# 2. リアルタイム予測の実行

## 2.1. リクエストデータの生成

### リクエストデータファイル名の指定

```bash:コマンド
RECORD_FILE="record.json"
```

### リクエストデータの生成

リクエストデータは、サンプルデータを確認しながらお好みで編集してください。
説明変数を全て指定する必要はありません。

```bash:コマンド
cat << EOF > ${RECORD_FILE}
{
    "age": "44",
    "job": "technician",
    "marital": "single",
    "education": "high.school",
    "default": "no"
}
EOF
```

## 2.2. リアルタイム予測の実行

### 変数の確認

```bash:コマンド
cat << ETX

    ML_MODEL_ID: ${ML_MODEL_ID}
    RECORD_FILE: ${RECORD_FILE}
    ENDPOINT_URL: ${ENDPOINT_URL}

ETX
```

```text:結果

    ML_MODEL_ID: ml-model-cli-************
    RECORD_FILE: record.json
    ENDPOINT_URL: https://realtime.machinelearning.eu-west-1.amazonaws.com

```

### リアルタイム予測の実行

以下の通り、IAMのクレデンシャルが必要です。
Webサービスでリアルタイム予測を利用する場合には、AWS GatewayとLambdaのバックエンドで利用するもしくはCognitoを利用すると比較的実装しやすいと思います。

[Amazon Machine Learning + AWS Lambda + API Gateway でリアルタイム予測APIを構築する](http://dev.classmethod.jp/cloud/aws/create-prediction-api-with-lambda-and-api-gateway/)


```bash:コマンド
aws machinelearning predict \
    --ml-model-id ${ML_MODEL_ID} \
    --record file://${RECORD_FILE} \
    --predict-endpoint ${ENDPOINT_URL}
```

```json:結果
{
    "Prediction": {
        "predictedLabel": "0",
        "predictedScores": {
            "0": 0.24819324910640717
        },
        "details": {
            "PredictiveModelType": "BINARY",
            "Algorithm": "SGD"
        }
    }
}
```


# 補足

Management Consoleからリアルタイム予測を気軽に試すことができます。
詳細は、やっぱりDevelopers.IOで！

[マネジメントコンソール上でAmazon Machine Learningのリアルタイム予測を試せるようになりました](http://dev.classmethod.jp/cloud/aws/try-real-time-predictions-from-the-amazon-machine-learning-console)


以上です。