AWS Machine LearningのSchemaを自動生成する

aws

やりたいこと

AWS Machine Learning では学習・評価データのスキーマ定義が必要。

http://docs.aws.amazon.com/machine-learning/latest/dg/creating_datasources.html#creating-a-data-schema-for-amazon-ml

マネージメントコンソールからデータセットを指定する時は、サーバーサイドでスキーマを推測してくれるがクライアントからAPIと叩く時は、スキーマは自分で用意しないといけない。

このスキーマ作成の作業を簡略化するために、AWS 中の人が作成したスキーマ推測ツールを利用してみる。

スキーマファイルの定義

まずはスキーマファイルのサンプルから

{
  "version": "1.0",
  "dataFormat": "CSV",
  "rowId": "customerId",
  "dataFileContainsHeader": true,
  "attributes": [
    {
      "attributeName": "customerId",
      "attributeType": "NUMERIC"
    },
    ...
  ],
  "targetAttributeName": "loan"
}

重要な属性は以下

rowId

サロゲートキー
このデータは学習には利用されず、予測結果も含めてリファレンス目的で利用。

dataFileContainsHeader

元データの1行目にヘッダー行が含まれていると true

targetAttributeName

目的変数

attributeType

データの各カラムのデータ型
カラム名とそのデータ型(NUMERIC/CATEGORICAL/TEXT/BINARY)で構成される。

詳細は次のURLを参照

http://docs.aws.amazon.com/machine-learning/latest/dg/creating_datasources.html#creating-a-data-schema-for-amazon-ml

最終的にはこの JSON 形式のスキーマをいい感じで自動生成したい。

スキーマを自動生成してみる

github の次のレポジトリにある ml-tools-python ディレクトリにある guess_schema.py でスキーマを自動生成させる。

https://github.com/awslabs/machine-learning-samples

にある ml-tools-python ディレクトリの guess_schema.py を使います。

ソースコードのクローン

$ git clone https://github.com/awslabs/machine-learning-samples.git
$ cd machine-learning-samples/ml-tools-python

Python の AWS SDK である boto ライブラリが必要なので、インストールされていなければ $ pip install boto すること。

基本的な実行方法

$ ./guess_schema.py

Schema guessing utility for Amazon Machine Learning.
Looks at the beginning of a CSV file and makes a guess as to what
data type each column is.  Then produces a valid JSON schema that
can be passed to create_data_source_from_s3 method.

Usage:
    python guess_schema.py data_file.csv [target_variable_name] > data_file.csv.schema

If specified, target_variable_name should match one of the variables
in the file's header.
$ ./guess_schema.py ata_file.csv [target_variable_name] > data_file.csv.schema

数カラムであれば、JSON を手書きするのも手間ではないだろうが、カラムがたくさんあるときは、このようにザクっとスキーマ生成してくれるツールは重宝する。

ヘッダー行があるとき

1行目にヘッダー行があるシンプルなデータで実験

$ cat sample.csv
customerId,jobId,education,housing,loan,campaign,duration
1,3,basic.4y,no,no,1,261,0
2,1,high.school,no,no,22,149,0
3,1,high.school,yes,no,65,226,1
4,2,basic.6y,no,no,1,151,0
$ ./guess_schema.py sample.csv duration
{
  "excludedAttributeNames": [],
  "version": "1.0",
  "dataFormat": "CSV",
  "rowId": null,
  "dataFileContainsHeader": true,
  "attributes": [
    {
      "attributeName": "customerId",
      "attributeType": "NUMERIC"
    },
    {
      "attributeName": "jobId",
      "attributeType": "NUMERIC"
    },
    {
      "attributeName": "education",
      "attributeType": "CATEGORICAL"
    },
    {
      "attributeName": "housing",
      "attributeType": "CATEGORICAL"
    },
    {
      "attributeName": "loan",
      "attributeType": "CATEGORICAL"
    },
    {
      "attributeName": "campaign",
      "attributeType": "NUMERIC"
    },
    {
      "attributeName": "duration",
      "attributeType": "NUMERIC"
    }
  ],
  "targetAttributeName": "duration"
}

attributeType がいい感じに guess されている。
dataFileContainsHeader は当然のごとく true となっている。
なお、存在しない attributeName を目的変数に指定するとエラーになる。

ヘッダー行がないとき

ヘッダー行がないと判断されると、 "dataFileContainsHeader": false にし、 attributeName には Var数字 が 自動的に設定される。
カラム数が多い時は Var01, …, Var25 というように必要な桁数を確保して0埋めされる。

※元のプログラムがビミョーにバグっているので PR の修正を適用して実行すること https://github.com/awslabs/machine-learning-samples/pull/8

$ cat sample_no_header.csv
1,3,basic.4y,no,1
2,1,high.school,yes,22
3,1,high.school,no,65
4,2,basic.6y,no,1
$ ./guess_schema.py sample_no_header.csv Var5
{
  "excludedAttributeNames": [],
  "version": "1.0",
  "dataFormat": "CSV",
  "rowId": null,
  "dataFileContainsHeader": false,
  "attributes": [
    {
      "attributeName": "Var1",
      "attributeType": "NUMERIC"
    },
    {
      "attributeName": "Var2",
      "attributeType": "NUMERIC"
    },
    {
      "attributeName": "Var3",
      "attributeType": "CATEGORICAL"
    },
    {
      "attributeName": "Var4",
      "attributeType": "CATEGORICAL"
    },
    {
      "attributeName": "Var5",
      "attributeType": "NUMERIC"
    }
  ],
  "targetAttributeName": "Var5"
}

痒いところに手が届いていない点

  • ヘッダー行の有り・無しは自動判定で、判定条件が超テキトー
  • rowId を指定するオプションが存在しない
  • 簡単にインストールできない

などなど。

Tagged with: ,
Posted in aws

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 days ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 3 weeks ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 3 weeks ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 6 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 9 months ago
%d bloggers like this: