(ブログ記事からの転載)
先日の記事で、創業記念で打ち出そうと考えているデータサイエンスコンペティションのアイデアをご紹介しましたが、
GoogleのAutoML Natural Languageが一応日本語の自然言語分類にも対応しているとのことで、同様のデータを元手に試してみました。
正確には、ドキュメントに以下の記載があり、
AutoML Natural Language では現在、英語のテキストの分類がサポートされています。他の言語のテキストを使用してカスタムモデルをトレーニングすることはできますが、モデルのパフォーマンスは定まっていません。
現時点ではベータ版での利用と考えるべきですが、兎にも角にも試してみます。
トレーニング
カスタムでモデルを作ることができるのはテキスト分類、エンティティ抽出、感情分析の3つです。
今回は左上のテキスト分類を行います。
タスクとしてSingle-label Classification, Multi-label Classification, Sentiment Analysisの3種類から選べます。今回はSingle-label Classificationを行います。
まずはトレーニングデータをuploadします。uploadが完了すると、以下の状態になります。
トレーニングデータ投入時の注意点は以下2点でしょうか。
- 投入するCSVデータは説明変数となるtextとtargetの2列のみから成る必要がある(行idなどが入っているとエラーを吐き出す)
- textが長すぎるとエラーとなりその行は無視される("The inline document content length exceeds the 128k character limit. The content was truncated."と怒られる)
今回はtextが文学作品の本文になるので、特に2点目のエラーの発生が避けられず、先日の記事とapple to appleの比較にはなっていません。
しかし細かいことは無視して、トレーニングを開始します(こういうところを強引に突き進めるのがAutoMLの強みのはず!)。
評価(バリデーションデータ)
トレーニングは1時間ほどで完了しました。
最近の大手ITベンダーの提供する機械学習系APIによるトレーニングとの比較で言うと遅い感覚もありますが、それだけモデルやパラメタのチューニングに時間をかけていると想像します。
評価指標は今はprecisionとrecallしか表示されません。F1値すら表示されませんが、これらもいずれ対応してくるでしょう。
バリデーションデータに対する評価結果は以下の通り。
precision, recallともに97.923%、つまりF1値としても97.923%…
タスクが簡単なのもありますが、恐るべき精度の高さです。
評価(テストデータ)
一縷の望み?として、過学習の可能性が残されています。
モデルをAPI Callして推論を行うことができるので、テストデータに対して推論を行なってみます。
推論を行うスクリプトを作成するにあたりサービスアカウントキーを発行する必要があります。
発行したキーの参照方法をググると、キーファイルのjsonへの参照を行うのに、環境変数に書き込むかスクリプト中に直書きするかの2つの方法が示されていますが、
自分はいずれもうまくいかず、以下スクリプトでようやく動きました。
from google.cloud import automl_v1beta1
from google.oauth2 import service_account
KEY_FILE = '{your json}'
credentials = service_account.Credentials.from_service_account_file(KEY_FILE)
def get_prediction(content, project_id, model_id):
prediction_client = automl_v1beta1.PredictionServiceClient(credentials=credentials)
name = 'projects/{}/locations/us-central1/models/{}'.format(project_id, model_id)
payload = {'text_snippet': {'content': content, 'mime_type': 'text/plain' }}
params = {}
request = prediction_client.predict(name, payload, params)
return request
get_prediction({your content}, {your project_id}, {your model_id})
responseは以下のような形式で返ってきます。
payload {
classification {
score: 0.9998164772987366
}
display_name: "0"
}
payload {
classification {
score: 0.0001835411530919373
}
display_name: "1"
}
パッと見jsonな、このresponseの料理の仕方は、以下記事に詳しいので参照ください。
[https://qiita.com/iss-f/items/fcc766fca27f3685025d]
このスクリプトをテストデータ1405件に対して走らせます。
テストデータについて、Confusion Matrixを得た結果は以下の通り。
F1値は0.907でした。
過学習はあまり認められません。AutoML、お見事です。
まとめ
構造化データに対する高い精度で世間を賑わせているAutoMLですが、非構造化データである自然言語に対しても相当なパフォーマンスを発揮することが分かりました。
世間では、今後データサイエンティストの主な仕事は、ビジネス課題をAutoMLなどのソリューションに結びつけることにシフトしていく、などと言われていますが、
んなこたぁ何年も前から分かってることなので、モデル構築以降のフェーズでデータサイエンティストが出せる価値は何かについて、もっと考察を深めたいと思います。
考察は、行う前に前提条件を確認しておくことが必須なので、現在地点としてAutoMLのパフォーマンスについて確認してみました。
非構造化データシリーズということで、次は画像についても確認したいと思います。