[JAWS-UG CLI] Amazon MachineLearning 入門 (6) 学習モデルの更新

# この記事について

[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}
    AWS_ID: ${AWS_ID}
    PREDICTION_DATA_SOURCE_ID: ${PREDICTION_DATA_SOURCE_ID}
    BUCKET_NAME: ${BUCKET_NAME}

ETX
```

```text:結果

    ML_MODEL_ID: ml-model-cli-************
    AWS_ID: ************
    PREDICTION_DATA_SOURCE_ID: prediction-cli-************
    BUCKET_NAME: jawsug-cli-ml-************

```


# 1. 学習モデルの更新

## 1.1. 学習モデルの更新

### 予測精度の確認

Management Consoleで確認します。

![Amazon Machine Learning Management Console (1).png](https://qiita-image-store.s3.amazonaws.com/0/36230/8137e1f9-e256-1a47-28eb-76b8413fdcc6.png)

閾値を変えることで、精度にどのような影響がありそうか確認しましょう。


### 学習モデルの更新

```bash:コマンド
aws machinelearning update-ml-model \
    --ml-model-id ${ML_MODEL_ID} \
    --score-threshold 0.4
```

```json:結果
{
    "MLModelId": "ml-model-cli-************"
}
```


## 1.2. バッチ予測の再実行

### バッチ予測IDの指定

```bash:コマンド
RE_BAT_ID="re-bat-cli-${AWS_ID}-$(date +%Y%m%d%H)"
```

### 変数の確認

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

    RE_BAT_ID: ${RE_BAT_ID}
    ML_MODEL_ID: ${ML_MODEL_ID}
    PREDICTION_DATA_SOURCE_ID: ${PREDICTION_DATA_SOURCE_ID}
    BUCKET_NAME: ${BUCKET_NAME}

ETX
```

```text:結果

    RE_BAT_ID: re-bat-cli-************
    ML_MODEL_ID: ml-model-cli-************
    PREDICTION_DATA_SOURCE_ID: prediction-cli-************
    BUCKET_NAME: jawsug-cli-ml-************

```


### バッチ予測の作成

```bash:コマンド
aws machinelearning create-batch-prediction \
    --batch-prediction-id ${RE_BAT_ID} \
    --ml-model-id ${ML_MODEL_ID} \
    --batch-prediction-data-source-id ${PREDICTION_DATA_SOURCE_ID} \
    --output-uri s3://${BUCKET_NAME}/
```

```json:結果
{
    "BatchPredictionId": "re-bat-cli-************"
}
```


### バッチ予測の確認

```bash:コマンド
aws machinelearning get-batch-prediction \
    --batch-prediction-id ${RE_BAT_ID}
````

```text:結果
（省略）
```

### URLの確認

```bash:コマンド
OUTPUT_URL=$(aws machinelearning get-batch-prediction \
    --batch-prediction-id ${RE_BAT_ID} \
    --query "OutputUri" \
    --output text) \
    && echo ${OUTPUT_URL}
```

```text:結果
s3://jawsug-cli-ml-************/
```


### 結果ファイルの確認

```bash:コマンド
aws s3 ls ${OUTPUT_URL}batch-prediction/result/
```

```text:結果
2016-09-23 06:58:28      20195 bat-cli-************-banking-batch.csv.gz
2016-10-15 11:05:12      20262 re-bat-cli-************-banking-batch.csv.gz
```


### ファイルのダウンロード

```bash:コマンド
aws s3 cp ${OUTPUT_URL}batch-prediction/result/${RE_BAT_ID}-banking-batch.csv.gz ~/${RE_BAT_ID}-banking-batch.csv.gz
```

```text:結果
download: s3://jawsug-cli-ml-************/batch-prediction/result/re-bat-cli-************-banking-batch.csv.gz to ./re-bat-cli-************-banking-batch.csv.gz
```

### ファイルの展開

```bash:コマンド
gzip -d ~/${RE_BAT_ID}-banking-batch.csv.gz
```

```text:結果
（返値無し）
```


### 結果の比較

閾値変更前の結果

```bash:コマンド
cat ${BAT_ID}-banking-batch.csv | grep 1, | wc -l
```

```text:結果
251
```

```bash:コマンド
cat ${BAT_ID}-banking-batch.csv | grep 0, | wc -l
```

```text:結果
3868
```


閾値変更後の結果

```bash:コマンド
cat ${RE_BAT_ID}-banking-batch.csv | grep 1, | wc -l
```

```text:結果
374
```

```bash:コマンド
cat ${RE_BAT_ID}-banking-batch.csv | grep 0, | wc -l
```

```text:結果
3745
```


以上です。