Translate

2016年8月5日金曜日

サンプルコード「Amazon Machine Learningによるソーシャルメディアフィルタリング」のREADMEを翻訳してみる




最近巷を賑わせる人工知能を試そうと

Social Media Filtering with Amazon Machine Learning
https://github.com/awslabs/machine-learning-samples/tree/master/social-media
のREADME.mdを翻訳してみました。

勝手翻訳ですので、
参考にする場合は、At your ownでお願いします。

---

Amazon Machine Learningによるソーシャルメディアフィルタリング


Amazon Machine Learningは、企業にとってより良いソーシャルメディア活用を補助します。このアプリケーション例ではツィートを自動的に顧客サポート問題に特定する分析をおこないます。このアプリケーションは、企業のツイッターハンドルに記載されたすべてのツィートを継続的にモニタし、企業の顧客サポートチームが送信者へ接触しようとするかどうかを予測します。機械学習(ML)モデルの活用により、サポートの第一弾としてサポートコストの低減および顧客満足度の向上が可能です。おなじアプリケーションでAmazon Mechanical Turkを使ってAmazon Machine Learning、Amazon Kinesis、AWS Lambda、Amazon Simple Nortification Service(SNS)と組み合わせます。

この例は、以下のステップで動作します:

  •     学習データの集約
  •     Amazon Mechanical Turkを使って学習データをラベル付け
  •     MLモデルを作成
  •     モデルを設定
  •     警句敵モニタリングをセットアップ

ステップ1,2の省略


このリポジトリは最初の2つのステップ(トレーニングデータ集約とラベル付け)の結果例を含んでいるので、もしML動作確認を木にしているのであれば、ステップ3まで飛ばすことができます。ダウンロード可能な@awscloudアカウントから集約しラベル付けされた学習データサンプルはS3の https://aml-sample-data.s3.amazonaws.com/social-media/aml_training_dataset.csv (S3URLは s3://aml-sample-data/social-media/aml_training_dataset.csv )にあります。aml_training_dataset.csv という名前でローカルディレクトリへコピーしてください。これがステップ2のアウトプットです。

自分自身のアプリケーションのためにこのデータ例で学習したモデルを使ってみたくなるかもしれません。しかし、それは推奨しません。MLにおいて、データ品質は最も重要です。自分の顧客を分析するために他の誰かのデータを使うと、あまりよく動作しないでしょう。

ステップ0: 環境のセットアップ


python virtualenv npm node.js パッケージマネージャが必要です。Linux上であれば apt-get コマンドでインストールします:

sudo apt-get update
sudo apt-get install python-virtualenv python-dev libffi-dev npm

インストールしたら、実行してください。

source setup.sh

スクリプトでは npm とpythonの virtualenvを使って必要とする依存関係にあるパッケージと環境変数をカレントシェル内でセットアップします。

次のスクリプトはpython boto ライブラリに依存します。インストラクション を確認して、~/.aws/credentials内のbotoのために証明書をセットアップ方法を確認してください。AWS証明書の取得方法を インストラクション で確認してください。あなたが選択するAWSユーザは、スクリプトを実行する次の方針のサブセットへのアクセスも必要とします:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:*",
                "machinelearning:*",
                "kinesis:*",
                "lambda:*",
                "s3:*",
                "sns:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}


ステップ1: 学習データの集約


学習データを集めるために、次のコマンドを実行してください:

python gather-data.py @awscloud

@awscloud の代わりに企業のツイッターハンドルに変更し、 config.py にツィッターAPI認証情報を設定してください。認証情報の取得方法については https://dev.twitter.com/oauth/overview/application-owner-access-tokens を学習してください。

ここで line_separated_tweets_json.txt というファイルが提供されます、その他のスクリプトは後で読み込まれます。

ステップ2: Mechanical Turk を使ったトレーニンデータのラベル付け


このアプリケーションでは、多くの機械学習アプリケーション同様、人間の振る舞いや操作を模倣するようなMLモデル構築をためそうとします。良いモデルをつくることは、たくさんの人間の選択例を必要とします。これを実行することはたいていオプションですが、実際にはしばしばとても遅いかとても高価になります。教師付き機械学習(Supervised Machine Learning)において、これらのオプションはラベルもしくはモデルのターゲーットと呼ばれています。

Amazon Mechanical Turk (Mturk) は、大量のデータに高速かつ経済的にラベル付けする素晴らしい方法のひとつです。このセクションではプロセスを学びます。

ステップ2a:MTurkによるラベリングのためのツィートの準備


最初のステップは、Twitter API から生JSONデータを取得し、Mechanical Turkが扱えるCSV形式へ変換することです。このコマンドを実行します:

python build-mturk-csv.py

このスクリプトでは line_separated_tweets_json.txt を変換し mturk_unlabeled_dataset.csv へ出力します。

ステップ2b:MTurkジョブ実行


Mechanical Turk コンソールを使って、これらのツィートへラベル割当するためのHuman Intelligence Tasks (HITs) の集合を作成します。Turker はツィートに最もあてはまるラベルを選択するか問われます:

  •     要望(Request)
  •     質問(Question)
  •     問題報告(Problem Report)
  •     怒り(Angry)
  •     上記以外(None of the above (i.e. non-actionable))

これらの異なるカテゴリは、actionable / non-actionable の二つの属性の組から逸脱します。しかしより多くの詳細を求めることは、Turker がより内容に集中させ、同一データを使ってもより洗練されたMLモデルを構築するための機会を励起させることを補助します。

それぞれのツィートにとって、3つの HITsを作成します、このためツィート上の3つの異なる人間の選択間の合意を自動的に解釈することができます。

MTurkを使った学習ラベル生成のための詳細ステップ


    Mechanical Turk を使うためのアカウント作成
    新しいプロジェクトの開始
    オプションから Other を選択し、 Create Project をクリック
    次のページ上でプロパティを入力、(あなたがわからない場合の)推奨値:

  •         Project Name : ツィートへのラベリング
  •         Title : ツィートのカテゴライズ(警告:この HIT はコンテンツ認証を含んでいます)
  •         Description : ツィートを5カテゴリから1にカテゴリ分け
  •         Keywords : tweet(ツィート)、tweets(ツィート群)、categorization(カテゴリ分け)、labeling(ラベル付け)、sentiment(意味)
  •         Checkbox for adult content : コンテンツには攻撃的なツィートも含まれるためチェック付け( 詳細 を確認のこと)
  •         Rewards per assignment : より高い値の場合より早く結果をフェッチすることができます
  •         Number of assignments per HIT : 3
  •         Time allotted per assignment : 2
  •         HIT expires in : 7日
  •         Auto-approve and pay Workers in : 2時間
    デザインレイアウトのためのページ上で、 Source ボタンをクリックしコンテンツを mturk-project-template.xml からカットアンドペースト。プレビューし、フィットすると考えられているように編集してもよい。パラメータ値 ${tweet} とチェックボックス値は後のステップに依存するので編集しないまま残すべきです。
    プレビューしフィニッシュ。この操作によりプロジェクトテンプレートを構築。
    Create New Batch with an Existing Project(既存プロジェクトに新規バッチを構築) へすすむ
    作成したプロジェクトの Publish Batch ボタンを選択
    画面のインストラクションに従ってください。それらの一部として build-mturk-csv.py により提供されているCSVファイルを使います。
    HITs をプレビューし、ラベリングのためのバッチをサブミット(このステップはお金がかかります)

ステップ2c: MTurkからアウトプットを処理


すべての Turk HITs を完成させたら、結果を mturk_labeled_dataset.csv と呼ばれるファイルとしてダウンロードしてください。そして次のスクリプトを実行して、

python build-aml-training-dataset.py

それぞれのツィートの3つのHITレスポンスを二つの値で構成される属性を使って単一のデータセットに変換します。

ステップ3: 機械学習(ML)モデルの作成


CSV形式のラベル付けされた学習データが用意できたら、幾つかのAPIコールが必要となる機械学習モデルの構築をおこないます。そしてそれはこのスクリプトで自動化されています:

python create-aml-model.py aml_training_dataset.csv aml_training_dataset.csv.schema s3-bucket-name s3-key-name

このユーティリティは、binary classification(2値分類)を処理する機械学習モデルを構築します。入力データセットとパラメータ内のファイル名で対応するスキーマ定義が必要です。このユーティリティスクリプトはデータセットを2つのピースに分割します。データセットの70%は学習に使用され、30%は評価のために使用されます。学習と評価が成功すると、AUCにモデルの品質がプリントされます(1.0により近ければ良い)。

ステップ4: モデルの設定


モデルを構築したら、そのモデルがいかに敏感であるべきかを決める必要があります。モデルサマリページはモデルの敏感度合いを変更する設定オプションを提供します。モデルサマリへのリンクは前のステップでツールを実行した時にプリントされます。Amazon ML web コンソールからモデルを調べることも可能です。ここでスコアのしきい値をセットすることができます。低い値にすると多くのツィートがアクション可能として分類されますが、モデルがそうではないものでも何がアクション可能と予測してしまう、より多くの「偽陽性」もあります。逆の場合も同じです。

ステップ5: 継続的モニタリングのセットアップ


継続的モニタリングには次のパーツが必要となります:

  •     TwiiterストリーミングAPIからのツィートのレシーバ
  •     前のレシーバがツィートをプッシュするKinesisストリーム
  •     Kinesisストリームからレコードを処理するLambda関数
  •     入力ツィート上で予測をたてるLambda関数により呼び出されるリアルタイム機械学習エンドポイント
  •     Lambda関数がカスタマサービスからのレスポンスを必要とするツィートの場合に備えて通知をプッシュするためのSNSトピック

    注意:このステップ内でセットアップされるコンポーネント群は 継続してコストが発生 します。詳細はそれぞれの価格設スキームをチェックしてください。


ステップ5a: Kinesis/Lambda/機械学習リアルタイムエンドポイント/SNSのセットアップ


次のKinesis ストリーム、Lambda関数、機械学習リアルタイムエンドポイント、SNSトピックの構築を自動化するスクリプトを使います。

python create-lambda-function.py

このスクリプトはcreate-lambda-function.configが存在し、適切な値を含んでいることが前提となっています。create-lambda-function.config内の前提条件詳細は以下のとおり:

  •     awsAccountId : botoを使った認証に対応するAWSアカウントID。詳細は docs を参照のこと
  •     kinesisStream : Kinesisストリームの名前。制約については docs を参照のこと。
  •     lambdaFunctionName : Lambda関数の名前。制約については docs を参照のこと。
  •     lambdaExecutionRole : Lambda関数が使用する実行ロールの名前。詳細は docs を参照のこと。制約は docs を参照のこと。
  •     mlModelId : ツィート予測を処理する機械学習モデルIDの名前。これはステップ3のパートとして生成されたモデルのIDです。
  •     region : 各サービスのAWSリージョン。詳細は docs を参照のこと。
  •     snsTopic : Simple Notification Serviceで作成されたトピック名。制約は docs を参照のこと。


ステップ5b: 継続的モニタリングテストのセットアップ


このスクリプトの実行が成功すると、Kinesisストリームはツィートデータの受け入れ準備が完了します。次のスクリプトを使ってセットアップ動作のテストをします。

python push-json-to-kinesis.py line_separated_json.txt kinesisStreamName interval

次のパラメータはスクリプト実行に必要です。

  •     line_separated_json.txt : 行分割されたJSONデータを含むファイル
  •     kinesisStreamName : データをプッシュするストリームの名前
  •     interval : Kinesisストリームを呼び出す間隔(ミリ秒)

このスクリプトは、JSONデータを所定のKinesisストリームへプッシュするだけです。このステップと同様に、前のステップで取得した行分割されたツィートJSONデータをテストに再利用します。

ステップ5c: TwitterのストリーミングAPIを使ったツィートのKinesisへのプッシュ


このプロジェクトでは、Twitterの 公式ストリームAPI を使った簡単なフィルタとマッチするKinesisツィートへプッシュするサンプルアプリケーションを含んでいます。製品システムのために、GNIP を動作させてストリームを消費することができます。主題に関する "ブログ投稿:http://support.gnip.com/code/gnip-kinesis-ami.html や OSSコードgithub をごらんください。

ストリーミングをサポートするTwitterライブラリが必要です:
pip install twitter

config.py を編集し、Kinesisパーティション名、Twitterテキストフィルタ
まだやっていないのであれば、Kinesis パーティション名名、あなたが捜したいと思う Twitter テキストフィルタとTwitter認証を加えるために config.py を編集してください。 そして、簡単にサンプルスキャナをコールしてください。
python scanner.py

フィルタにマッチするツィートはリアル多無でKinesisストリームへプッシュします。Lambda関数は機械学習モデルを使ってこれらのツィートを分類し、設定されたSNSトピックへアクション可能と想定されるツィートのリンクつきで通知を送信します。これらの通知を取得する最も簡単な方法はSNSトピックへメールアドレスを 投稿 することです。


----

おどろいたのが、学習データの作成を

Amazon Mechanical Turk

にまかせている所。

これ..APIでコールできるけど、

実際の作業は『中の人』が人力で作業する

という
まさにアマゾンのブラックっぷりを象徴するかのような
悪名高きサービスだ。

サービス名も、
18世紀ころヨーロッパをまわったチェスの自動対戦機械"The Turk"が
実は中の人がはいっていたという話からとっている
ブラック企業ブラックジョークはいていて
笑っていいのかも
もはやわからない..


たしかまだ正式リリースになってないし
日本で使えるかどうかはわからないけど..


すごいねアマゾン、
IT企業であるIBMやGoogleだと多分こんなサービス思いつかないよ
しかも
APIのクセを勉強しなきゃいけなくなってデータサイエンティストが
塩漬けになるのだったら
いっそ『中の人』にまかせちゃえ
という発想がスゴイ..


0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...