AWS再入門 Amazon Machine Learning編

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

当エントリはDevelopers.IOで弊社AWSチームによる『AWS サービス別 再入門アドベントカレンダー 2015』の20日目のエントリです。
昨日19日目のエントリはあべいか『CloudWatch』でした。

このアドベントカレンダーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。
本日20日目のテーマは『Amazon Machine Learning』です。

目次

Amazon Machine Learningとは

Amazon Machine Learning(以下Amazon ML) は、一言で言うとAWSが提供する機械学習用プラットフォームです。

その特徴として、学習から結果の利用までの手続きがシンプルであること、マネージドな環境下で、簡易にスケーラブルな予測APIを構築できることなどがあります。

現在のところ、Amazon MLは機械学習の中でも『教師あり機械学習』とよばれる分野の学習に対応しています。この『教師あり機械学習』は、過去のデータを用いて、機械学習によってなんらかの現象を予測したいという場合によく用いられます。

この予測の具体的な例として、あるユーザの属性情報をもとに特定の商品を買うかどうかの判定や、業務に関する様々な情報からの今季の売り上げ予想など、様々な場面が考えられます。
もちろんこの予測は万能ではなく、与えられたデータが結果と関係しない情報ばかりであれば、予測結果は当然精度の低いものとなります。
Amazon MLを用いて予測を行う際には、この変数選択をどのように行うかが予測の精度を決める大きな要因となると言えます。

予測の種類

Amazon MLでは、予測結果を示すターゲット(目的変数)の型によって、予測を自動的に切り替えます。
予測の種類は主に3種類あり、それぞれに適した予測アルゴリズムを採用しています。
以下では、それぞれの予測について詳細を見ていきます。

二項分類

二項分類は、ターゲットとなる正解データが2つの値に限定される場合に適用される学習手法です。例えば商品の購入を行うかどうかや、受信したメールがスパムかどうかなどの予測を行う場合はこの学習モデルが採用されます。

二項分類の学習モデルは、内部でロジスティック回帰と呼ばれるアルゴリズムを利用しています。このアルゴリズムは、入力値に対してロジスティック関数と呼ばれる関数を適用し、結果がどちらの値になるかを確率として出力します。ロジスティック回帰は、予測結果と実際の結果を比較し、このロジスティック関数を調整することで予測精度を上げていきます。

多項分類

多項分類は、ターゲットとなる正解データが複数のカテゴリに限定される場合に適用される学習手法です。入力データから、入力データから対象どのカテゴリに属するかを予測するためのモデルとなります。この学習モデルが採用される例として、商品のカテゴリ判別やどのカテゴリの商品がユーザにとって最も興味を持っているかなどを予測する場合などがあります。

多項分類の場合、ロジスティック回帰の拡張である多項ロジスティック回帰と呼ばれるアルゴリズムを用いて、結果がそれぞれの値となる確率を求めます。

回帰

入力データから数値の予測を行いたい場合は、回帰と呼ばれる学習手法を求めます。分類ではなく、具体的にとある数字が欲しい場合などにはこの回帰による学習モデルを用います。例えば製品の販売台数や四半期の売り上げ、市場価格の予測などが適用例として考えられます。

Amazon MLでは線形回帰と呼ばれるアルゴリズムを利用して数値の予測を行います。線形回帰では、与えられたそれぞれの正解データに最も近い線形関数を導出し、その関数を用いることで結果を予測するというものです。

Amazon MLの使い方

ここでは、Amazon Machine Learningを用いて機械学習を行い、予測結果を得るまでのおおまかな流れを見ていきます。

Amazon MLでは機械学習のための作業の流れが整理されおり、順に行うことで簡単にモデルや予測APIの構築ができます。Amazon MLにおける機械学習は、基本的には以下の流れに従って行われます。

amazon_ml_flow

各作業の成果は、エンティティと呼ばれるAWS上のオブジェクトとして管理されます。各エンティティの詳細は以下の表のとおりです。

エンティティ名 説明
データソース (DataSource) モデル構築や評価・バッチ予測の元となるデータ
モデル (Model) データソースを元に学習が行われた、予測結果を出力するための計算モデル
評価 (Evaluation) 学習モデルの予測精度を評価した結果をまとめたもの
バッチ予測 (Batch Prediction) 学習モデルを利用してデータソースに対して予測を行った結果をまとめたもの

各作業が具体的にどういう流れなのか、また何ができるのかを見ていきたいと思います。

データソースの作成

まずは、機械学習用の訓練データの作成を行います。

Amazon MLでは、学習や予測に用いるデータは常にデータソースと呼ばれるエンティティに一旦変換されます。変換処理を行う過程で、各項目のデータ型や予測対象となる項目(ターゲット)についての指定などが行われ、訓練データがAmazon ML上で機械学習に利用できる形に準備されます。また、データの統計分析も合わせて行われるため、統計的な情報を確認したり、学習モデル構築時に利用することができます。

元データの読み込み

データソースの作成元となるデータは、S3またはRedshiftから取得することができます。また、マネジメントコンソールからは指定できませんが、AWS APIを利用すればRDSを指定することもできます。今回は、S3上にCSV形式の訓練データが配置されているという前提でデータソースを作成していきます。

ds01

データ形式の指定

訓練データの読み込みが終わると、次に読み込んだ各項目のデータ形式を指定します。基本的には、Amazon ML側で読み込み時にデータ形式を推測して設定してくれるので、その内容を確認して、誤っている部分を修正するという作業になります。

ds02

ターゲットの指定

各項目のデータ型を決めた後は、ターゲット変数の指定を行います。ターゲット変数の指定は、データソースを機械学習に用いる場合に必要となり、またターゲットのデータ型によって、学習モデルの種類が決定されます。バッチ予測を行うためのデータソースであれば、正解データは必要ないのでターゲットの指定は不要です。

ds03

ID項目の指定

最後に、必要であればID項目の指定を行います。IDに指定された項目は学習には利用されませんが、予測結果にID項目が紐付いて返ってきます。ID項目を予め指定しておけば、例えばバッチ予測を行った際にIDから予測結果と元データをまとめるなどのことができるようになります。

ds04

モデル構築

学習用のデータソースを作成した後は、学習モデルの構築作業に移ります。

モデルの構築では、主に学習に用いるデータの前処理と学習パラメータの設定を行っています。Amazon MLでは、モデルの構築手順をAmazon ML側の推奨する設定で行う方法と、手動で設定を行う方法の二つが用意されています。

データソースの指定

モデルを構築するためには、まず学習用のデータソースを指定するところから始めます。

ml01

学習設定の方針選択

データソース指定後は、推奨設定で構築を行うか、手動で設定して構築を行うかのいずれかを選択します。推奨設定の場合は、以下のように設定が行われた状態でモデル構築を行います。

  • 前処理はデータソースの統計情報から自動的に設定される
  • 学習用データは分割され、7割を学習用、3割を学習モデルの評価用として利用される
  • 学習パラメータの設定はデフォルト値のままで行う

ml02

前処理の指定

手動で設定する場合は、まずは前処理をどう設定するかを指定する必要があります。Amazon MLでモデル構築時にデータの前処理を行う場合、recipeと呼ばれるJSON形式の前処理設定を記述していきます。recipeについてはここでは割愛しますが、詳細についてはこちらをご確認ください。

手動で設定する場合でも、データソースの作成が完了していれば、Amazon MLはデータソースの統計情報をもとに作成されたrecipeを入力画面に表示させます。このrecipeをベースに修正を加えても良いですし、0からrecipeを作成しなおすことも出来ます。ちなみに、作成が完了していない場合は空白となりますが、ここで特にrecipeを指定しなければ、作成完了後に自動生成されるrecipeが適用されます。

ml03

学習パラメータの設定

recipeの記述の次は、学習パラメータの設定を行います。学習パラメータは、主に学習にかかる時間や予測の精度、予測時の計算量などのコストに影響します。それぞれの項目が何を意味しているのか、どのように影響するのかについて以降にまとめていきます。

ml04

モデルの最大サイズ

Amazon MLでは、モデル構築の際に訓練データのデータパターンをモデル内部に保持します。このパラメータは、最大でどの程度までのデータパターンを保持するかを定めます。

サイズを超えた場合は、超過したパターンは切り捨てられるため、予測精度に悪影響を与える場合があります。一方で、サイズを大きく設定した場合には、予測にかかるコスト(計算時間や料金)が増加する可能性もあります。特にリアルタイム予測APIを利用することを考えている場合、予測にかかるコストは料金に大きく影響するので、注意が必要となります。

一般に、訓練データの量(特に項目数)が多い場合にはデータパターンも多く見つかる可能性があるため、多めに設定することが推奨されています。

パス数の設定

データパターンを探索する際のパス数の設定を行います。

パス数が多ければより多くのデータパターンを発見できるため、データ件数が少ない訓練データを用いる場合などは、パス数を多く設定することで予測精度が向上する可能性が有ります。一方で、パス数が増加すると学習にかかるコストも増加してしまうため、注意が必要です。

正則化に関する設定

正則化は、過学習と呼ばれる現象を防ぐために行われる処理で、機械学習時にモデルの自由度・複雑度をあえて抑制する処理を加えることです。

訓練用データの傾向が偏っていたり、モデルの複雑さに比べてデータ量が少なすぎる場合、学習モデルが訓練用に特化してしまい、実データに対して汎用的に予測を行うことができなくなる場合があります。これを過学習とよび、この現象を防ぐためには正則化を行う必要があります。

Amazon MLが提供する正則化のうち、L1正則化は学習モデルの各項目のなかから影響の少ない変数項目に対して、入力がほぼ0となるように重み付けを行います。一方でL2正則化は各変数が結果に与える影響を抑制し、変数ごとの影響の幅を抑えるように重み付けを行います。訓練データの傾向に合わせて正則化の方法や重みを選択する必要があります。

それぞれの訓練データのデフォルト設定値と設定できる範囲を以下の表にまとめます。正則化量の範囲についてはDOUBLE型の浮動小数点数であれば指定は可能ですが、一般的に効果を持つとされる以下の範囲での利用を推奨されています。

設定名 デフォルト値 範囲
サイズ設定 32 MiB 100KiB - 2GiB
パス数設定 10 1 - 100
L1正則化量 0 (デフォルトではL2を選択) 1E-4 - 1E-8 (推奨)
L2正則化量 1E-6 1E-2 - 1E-6 (推奨)

評価の設定

最後に評価に関する設定を行います。モデル構築時に合わせて評価を行う場合は、ここで評価用のデータソースを指定することができます。データソースは別のものを指定するか、訓練用データソースから分割するかを選ぶことができます。また、ここで評価を設定しない場合でも、構築したモデルに対して後から評価を行うことは可能です。

ml05

モデルの評価

Amazon MLでは,作成した学習モデルの予測精度をデータソースを用いて評価することができ、その結果は評価(Evaluation)というエンティティに保存されます。

予測精度を測るための指標は、学習モデルの種類によって異なります。ここでは、各モデルの指標についてどんな意味を持っているのか、どのようにして算出しているのかを説明していきます。

二項分類の評価指標

二項分類の場合は、AUC(Area Under Curve)と呼ばれる指標を用います。

AUCを用いることで、二項分類の閾値の設定によらず、モデルの分類性能を表現することができます。AUCの値は1が最大値、0.5がランダムの分類とほぼ同性能となっており、その間で学習モデルの評価を行うことになります。

多項分類の評価指標

多項分類では、適合率や再現率と呼ばれる予測の特徴を示す指標から調和平均を取った、F1値と呼ばれる数値を用いて予測の精度を測っています。

適合率とは、ある予測結果を示した予測の中で、実際に正しく予測できたものの割合です。これは正確性と呼ばれる性質に関する指標であり、予測結果がどれだけ正確なものなのかを示しています。

再現率とは、本来ある結果を含んでいるデータのうち、結果を正しく予測できたものの割合です。これは網羅性と呼ばれる性質に関する指標であり、予測結果が、全体からどれだけ網羅的に結果を含んでいるかを示しています。

正確性と網羅性の二つの性質は一般的にトレードオフの関係になりやすいため、この二つの性質に関する指標を調和平均という形で含めた、F1値と呼ばれる値で総合的に評価しています。

ただし多項分類の場合は各項目についてF1値が計算されるため、その平均値を総合的な多項分類の予測精度の指標として用いています。

回帰の評価指標

回帰モデルの場合は、RMSE(二乗平均誤差)とよばれる、予測結果と実測値の二乗誤差の平均を取った値が評価の指標として用いられます。

予測結果の作成

学習モデルの構築・評価が終わった後は、実際に実データを入力して予測結果を取得します。

予測問い合わせの手段は、複数のデータに対して問い合わせをまとめて行うバッチ予測と、APIから逐次問い合わせるリアルタイム問い合わせの2通りがあります。

バッチ予測の場合

バッチ予測を行う場合には、事前に予測に用いる実データをデータソースに変換する必要があります。バッチ予測の実行方法は評価の作成手順とほぼ同じですが、異なる点として結果の格納のためにS3のロケーションを指定する必要があります。

batch01

batch02

リアルタイム予測の場合

リアルタイム予測は、基本的にAWS APIを通して問い合わせを行うことになります。ここでは、AWS CLIを利用して、CLIからリアルタイム問い合わせを行う手順を説明します。

まず、事前にManagement Consoleなどから予測に利用したいモデルのIDを取得しておき、AWS CLIから学習モデルに関する情報を取得します。

$ aws machinelearning get-ml-model --ml-model-id ml-xxxxxxxx
{
    "Status": "COMPLETED",
    "SizeInBytes": 434457,
...(snip)...
    "EndpointInfo": {
        "PeakRequestsPerSecond": 0,
        "EndpointStatus": "NONE"
    },
    "MLModelId": "ml-xxxxxxxx",
...(snip)...
}

EndpointInfoを確認し、EndpointStatusが"NONE"の場合は、Endpointへの接続をおこなえる様に設定を変更します。

$ aws machinelearning create-realtime-endpoint --ml-model-id ml-xxxxxxxxx
{
    "MLModelId": "ml-Y5M1k8kVbGe",
    "RealtimeEndpointInfo": {
        "EndpointStatus": "UPDATING",
        "PeakRequestsPerSecond": 200,
        "CreatedAt": 1438949503.545,
        "EndpointUrl": "https://realtime.machinelearning.us-east-1.amazonaws.com"
    }
}

あとは、EndpointUrlml-model-idを用いて、学習モデルに入力データを送ることで予測結果を問い合わせることができます。結果は以下のように出力されます。

$ aws machinelearning predict --ml-model-id ml-xxxxxxxxx \
  --record key1=1,key2=2 \
  --predict-endpoint https://realtime.machinelearning.us-east-1.amazonaws.com
{
    "Prediction": {
        "details": {
            "PredictiveModelType": "BINARY"
        },
        "predictedLabel": "0",
        "predictedScores":{
            "0": 0.47380468249320984
        }
    }
}

これで予測問い合わせ用のAPIは作成できました。あとは、返却されたpredictedLabelpredictedScoresなどの予測結果を利用するようにすれば、機械学習を構築するサービスに簡単に組み込むことができます。

あわせて読みたい

公式情報

Developers.IO関連エントリ

入門エントリ

やってみた系

その他関連エントリ

さいごに

以上、AWS サービス別 再入門アドベントカレンダー 20日目のエントリ『Amazon Machine Learning』編でした。 明日(12/21)はhanseのTrusted Advisor編です。お楽しみに!