[JAWS-UG CLI] Amazon MachineLearning 入門 (4) データソースの作成（バッチ予測用）

# この記事について

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


# 前提条件

## 必要な権限

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

- MachineLearningのフルコントロール権限
- S3のフルコントロール権限

# 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

    BUCKET_NAME: ${BUCKET_NAME}
    AWS_ID: ${AWS_ID}
    ML_MODEL_ID: ${ML_MODEL_ID}

ETX
```

```text:結果

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

```


# 1. データソースの作成（バッチ予測用）

## 1.1. サンプルデータのダウンロード

### 予測用データのダウンロード

```bash:コマンド
curl https://s3.amazonaws.com/aml-sample-data/banking-batch.csv > banking-batch.csv
```

```text:結果
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  469k  100  469k    0     0   189k      0  0:00:02  0:00:02 --:--:--  189k
```

### ファイルを確認

```bash:コマンド
ls -al | grep banking-batch.csv
```

```text:結果
-rw-rw-r-- 1 ec2-user ec2-user  480428 Jan 29  2015 banking-batch.csv
```


## 1.2. スキーマファイルの生成

CSVファイルの構造を定義します。

### ヘッダー情報の確認

CSVの1列目を確認します。

ターゲット変数が含まれていないことが確認できます。

```bash:コマンド
head -1 banking-batch.csv
```

```text:結果
age,job,marital,education,default,housing,loan,contact,month,day_of_week,duration,campaign,pdays,previous,poutcome,emp_var_rate,cons_price_idx,cons_conf_idx,euribor3m,nr_employed
```

### ファイル名の指定

```bash:コマンド
PREDICTION_DATA_SCHEMA_FILE="prediction_data_schema.json"
```

### スキーマファイルの生成

バッチ予測用のため、ターゲット変数は指定されていません。

```bash:コマンド
cat << EOF > ${PREDICTION_DATA_SCHEMA_FILE}
{
  "version":"1.0",
  "rowId":null,
  "rowWeight":null,
  "dataFormat":"CSV",
  "dataFileContainsHeader":true,
  "attributes":[
    {"attributeName":"age","attributeType":"NUMERIC"},
    {"attributeName":"job","attributeType":"CATEGORICAL"},
    {"attributeName":"marital","attributeType":"CATEGORICAL"},
    {"attributeName":"education","attributeType":"CATEGORICAL"},
    {"attributeName":"default","attributeType":"CATEGORICAL"},
    {"attributeName":"housing","attributeType":"CATEGORICAL"},
    {"attributeName":"loan","attributeType":"CATEGORICAL"},
    {"attributeName":"contact","attributeType":"CATEGORICAL"},
    {"attributeName":"month","attributeType":"CATEGORICAL"},
    {"attributeName":"day_of_week","attributeType":"CATEGORICAL"},
    {"attributeName":"duration","attributeType":"NUMERIC"},
    {"attributeName":"campaign","attributeType":"NUMERIC"},
    {"attributeName":"pdays","attributeType":"NUMERIC"},
    {"attributeName":"previous","attributeType":"NUMERIC"},
    {"attributeName":"poutcome","attributeType":"CATEGORICAL"},
    {"attributeName":"emp_var_rate","attributeType":"NUMERIC"},
    {"attributeName":"cons_price_idx","attributeType":"NUMERIC"},
    {"attributeName":"cons_conf_idx","attributeType":"NUMERIC"},
    {"attributeName":"euribor3m","attributeType":"NUMERIC"},
    {"attributeName":"nr_employed","attributeType":"NUMERIC"}
  ],
  "excludedAttributeNames":[]
}
EOF

cat ${PREDICTION_DATA_SCHEMA_FILE}
```


### スキーマファイルの検証

```bash:コマンド
jsonlint -q ${PREDICTION_DATA_SCHEMA_FILE}
```

## 1.3. 予測用データのアップロード

### アップロードするファイル名を指定

```bash:コマンド
PREDICTION_DATA_FILE="banking-batch.csv"
```

### ファイルのアップロード

```bash:コマンド
aws s3 cp ${PREDICTION_DATA_FILE} s3://${BUCKET_NAME}
aws s3 cp ${PREDICTION_DATA_SCHEMA_FILE} s3://${BUCKET_NAME}
```

```text:結果
upload: ./banking-batch.csv to s3://jawsug-cli-ml-************/banking-batch.csv
upload: ./prediction_data_schema.json to s3://jawsug-cli-ml-************/prediction_data_schema.json
```


### アップロードされたファイルを確認

```bash:コマンド
aws s3 ls ${BUCKET_NAME} | grep ${PREDICTION_DATA_FILE}
aws s3 ls ${BUCKET_NAME} | grep ${PREDICTION_DATA_SCHEMA_FILE}
```

```text:結果
2016-10-23 06:51:38     480428 banking-batch.csv
2016-10-23 06:51:41       1404 prediction_data_schema.json
```

# 2. データソースの作成

## 2.1. バッチ予測用データソースの作成

### データソースIDの指定

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

### データソーススペックファイル名の指定

```bash:コマンド
PREDICTION_DATA_SOURCE_SPEC_FILE="prediction_data_source_spec.json"
```

### 変数の確認

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

    PREDICTION_DATA_SOURCE_SPEC_FILE: ${PREDICTION_DATA_SOURCE_SPEC_FILE}
    BUCKET_NAME: ${BUCKET_NAME}
    PREDICTION_DATA_FILE: ${PREDICTION_DATA_FILE}
    DATA_SCHEMA_FILE:${PREDICTION_DATA_SCHEMA_FILE}

ETX
```

```text:結果

    PREDICTION_DATA_SOURCE_SPEC_FILE: prediction_data_source_spec.json
    BUCKET_NAME: jawsug-cli-ml-************
    PREDICTION_DATA_FILE: banking-batch.csv
    DATA_SCHEMA_FILE:prediction_data_schema.json

```


### データソーススペックファイルの生成

```bash:コマンド
cat << EOF > ${PREDICTION_DATA_SOURCE_SPEC_FILE}
{
  "DataLocationS3": "s3://${BUCKET_NAME}/${PREDICTION_DATA_FILE}",
  "DataSchemaLocationS3": "s3://${BUCKET_NAME}/${PREDICTION_DATA_SCHEMA_FILE}"
}
EOF

cat ${PREDICTION_DATA_SOURCE_SPEC_FILE}
```

```text:結果
{
  "DataLocationS3": "s3://jawsug-cli-ml-************/banking-batch.csv",
  "DataSchemaLocationS3": "s3://jawsug-cli-ml-************/prediction_data_schema.json"
}
```

### データソーススペックファイルの検証

```bash:コマンド
jsonlint -q ${PREDICTION_DATA_SOURCE_SPEC_FILE}
```


### 変数の確認

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

    PREDICTION_DATA_SOURCE_ID: ${PREDICTION_DATA_SOURCE_ID}
    PREDICTION_DATA_SOURCE_SPEC_FILE: ${PREDICTION_DATA_SOURCE_SPEC_FILE}

ETX
```

```text:結果

    PREDICTION_DATA_SOURCE_ID: prediction-cli-************
    PREDICTION_DATA_SOURCE_SPEC_FILE: prediction_data_source_spec.json

```

### データソースの作成

```bash:コマンド
aws machinelearning create-data-source-from-s3 \
    --data-source-id ${PREDICTION_DATA_SOURCE_ID} \
    --data-spec file://${PREDICTION_DATA_SOURCE_SPEC_FILE}
```

```json:結果
{
    "DataSourceId": "prediction-cli-************"
}
```


### データソースの確認

```bash:コマンド
aws machinelearning get-data-source \
    --data-source-id ${PREDICTION_DATA_SOURCE_ID}
```

```json:結果
{
    "Status": "COMPLETED",
    "NumberOfFiles": 1,
    "DataLocationS3": "s3://jawsug-cli-ml-************/banking-batch.csv",
    "CreatedByIamUser": "arn:aws:iam::************:user/user01",
    "DataSizeInBytes": 480428,
    "ComputeStatistics": false,
    "LastUpdatedAt": 1474613517.536,
    "DataSourceId": "prediction-cli-************",
    "CreatedAt": 1474613515.885,
    "FinishedAt": 1474613517.536
}
```

### データソースの一覧

```bash:コマンド
aws machinelearning describe-data-sources
```

```json:結果
{
    "Results": [
        {
            "Status": "COMPLETED",
            "NumberOfFiles": 1,
            "DataLocationS3": "s3://jawsug-cli-ml-************/banking-batch.csv",
            "CreatedByIamUser": "arn:aws:sts::************:assumed-role/CLI/i-0****************",
            "DataSizeInBytes": 480428,
            "ComputeStatistics": false,
            "LastUpdatedAt": 1477205620.185,
            "DataSourceId": "prediction-cli-************-2016102306",
            "CreatedAt": 1477205618.067,
            "FinishedAt": 1477205620.185
        },
        {
            "Status": "COMPLETED",
            "ComputeTime": 1296000,
            "NumberOfFiles": 1,
            "DataLocationS3": "s3://jawsug-cli-ml-************/banking.csv",
            "CreatedByIamUser": "arn:aws:sts::************:assumed-role/CLI/i-0****************",
            "DataSizeInBytes": 4882918,
            "ComputeStatistics": true,
            "LastUpdatedAt": 1477201359.786,
            "DataSourceId": "training-cli-************-2016102305",
            "StartedAt": 1477201112.605,
            "CreatedAt": 1477201110.17,
            "FinishedAt": 1477201359.786
        }
    ]
}
```

以上です。