Azure MLで機械学習してみた 〜『もの、ごと。』事例紹介と初心者が進める上での注意点〜

※この記事は エキサイト Advent Calendar 2017 21日目の記事です※


ごあいさつ

こんにちは。
12月12日にリリースされた産まれたてのサービス『もの、ごと。』の
担当エンジニアの竹下です。(@takobayashi さんの代打で参戦させて頂きます)

f0364156_20273420.png

もの、ごと。』は、家事系ブログを自動分類し、リアルに役立つ暮らしのノウハウをお届けするブログメディアです。
フロント側はNuxt.js(Vue.js)を用いた、SPA+SSR+PWAなアプリケーションになっています。


今回は、こちらもの、ごと。 』で使われている機械学習について、ざっくりとご紹介したいと思います。

トピックスは「どこに機械学習を使ったか」「Azure ML概要」「初心者が進める上での注意点」の3本立てで行きたいと思います。


どこに機械学習?

もの、ごと。 』では、色々なブロガーさんのブログ記事をスクレイピングして取り込んで、
カテゴリーとテーマという2つの方法でキュレーションをしています。

分類概要方法(ざっくり)
カテゴリブログ記事を「家事」「料理」「整理収納」「インテリア」に分類。機械学習
テーマブログ記事を設定したキーワード条件に伴って自動分類
例) 「\どうしてる?/クリスマス」
キーワード条件手動設定
→ その後は記事を自動登録

「カテゴリ」の方に機械学習を使ってます!

上の方にあるメニューバーを押すと絞り込んだ結果が見えたり
https://monogoto.me/categories/2

f0364156_19464600.png

ブログの記事一覧に「整理収納」「家事」とか表示されてたり
https://monogoto.me/blogs/59
f0364156_19483817.png
とにかく自動で取り込んで、自動でラベリングしてくれるという所に重きを置いてます。



どうやって機械学習?

処理の全体像

ブログ本文を取り込み(スクレイピング)して名詞を抽出、それを機械学習したモデルに流し込んでカテゴリのIDをゲットしてます。

f0364156_19595773.png

今回は「もの、ごと。」のオリジナルモデルを使りました。
ディレクション側(弊社ではプロデューサーという役職)が思い描くクラス分類を行うためには、家事分野などに特化したオリジナルのモデルが必要になったためです。


オリジナルのモデル作りに当っては、プロデューサーの方々に協力して頂きつつ学習データとテストデータを集めました。

このデータの精度によって、モデルの出来不出来が変わってきてしまいますし、最終的な分類のされ方にも大きく関わってきます。

記事をどう分類したいかはプロデューサーの頭の中にあるので、今回前向きに協力して頂き本当に助かりました。



機械学習部分(Azure ML)

正確にはAzure Machine Learning Studioというみたいです。
機械学習というと、TensorFlowなどのライブラリを使いながらPythonなどのコードを使って書いていくやり方も一般的ではあると思いますが、
最近は、「コードを書かなくても機械学習が出来てしまう」みたいなサービスが増えています。

Azure MLもそのような便利なサービスの1つです。
特徴を紹介していくと、

▼ウェブブラウザー上で色んな学習アルゴリズムを簡単に組み替えられます。
今回は色々試した結果、Two-Class Neural Network + One-vs-All を使いました。
f0364156_20395293.png
▼テスト結果も綺麗に表示されます
テストデータや学習用のデータ、学習アルゴリズムなどを色々変えて、対角線部分の数字を良くするために試行錯誤します。(少し雑なテストデータですみません)
f0364156_20415554.png

▼ボタン一発で簡単にWeb API化

f0364156_20463448.png
まさに至れり尽くせりです。
ちなみに…
▼お値段、月に 1万円 / 10万リクエスト 〜

https://azure.microsoft.com/ja-jp/pricing/details/machine-learning-studio/

f0364156_20494043.png

大量に裁かなきゃいけないものには向いてません。
そういうのは自前でサーバーを作るか、他のサービス使ったほうが良いかもしれません。



初心者が機械学習の企画を進める上での注意点

自分自身、機械学習については素人同然なのですが、
右も左も解らない状態から始める際に、「ハマりそうだな」「大切だな」と思った所をまとめたいと思います。

「人間ができないことは機械にもできない」という認識を企画担当者に持ってもらう

「ブログ記事を見ただけで誰もが判別出来るようなものじゃないといけない」という共通認識を持ってもらう事が大切だと感じました。

解決が難しい例)
  • 「本文だけを見て書かれた年月を予想」など
    → 本文中に日付の表記がない限り、たぶん人間が見ても解りにくい…
  • 記事の前半に「インテリア」最後に今日作った「料理」が載っているようなもの
    → どっちのカテゴリーか解らない
    → 判別時に合わせて出てくる分類確率が95%を下回った場合は、切り捨ててます


全ての記事が分類できるようにモデルを作る

開発途中、どこのカテゴリーにも属さないような日記的なエントリーに何故かカテゴリーがついてしまうという問題が発生しました。

その当時は、「家事」「料理」「整理収納」「インテリア」の4つのカテゴリーにしか分類してなかったのですが、
よくよく考えてみれば、全てのブログ記事がその4つのカテゴリーに分類出来るわけでは無いという事に気が付きました。

最終的に、『もの、ごと。では、「家事」「料理」「整理収納」「インテリア」の他にも「美容」「ファッション」「その他」という裏カテゴリーを持っています。
必ずどこかのカテゴリーに分類されるようにモデルを作ったら上手くいくようになりました。


Azure MLでは日本語の取扱に注意する必要あり

Feature Hashingを通す前にURLエンコードする必要がある など、
日本語を入力した際に意識すべき所が何点かあるようです。


根本的な所を見直す

「良くなると思っていたのに逆に悪くなった」「まるで分類できてない」のような結果になった時は、
根本的な所から間違っている可能性が高いです。(経験談
Azure MLでは一つ一つの処理の出力結果が簡単に確認できるので、順に間違っていないかを確認したほうが良いです。


ある程度は諦める

自分のような初心者は、そもそも機械学習に依存しすぎないサービスから手を付けると良いと思います。
あくまでもサブの機能としての機械学習。
ものごとだと「カテゴリー」に頼り切らず、「テーマ」もあることで機械学習では補えない分を担保できていると思います。



勉強会を開く

エキサイトでは、機械学習部分を実装方法については、サービスの状況に合わせてそれぞれの担当者が判断しています。
Azure MLの他にもPythonのライブラリを使ったりC++を使ったり…


ただ、他のサービスと関わり合いが無いかというとそんなことは全くありません。

各部署のノウハウを共有したり、詰まった所を相談したり、機械学習の基本的な部分を勉強したりできる勉強会が定期的に開かれています!

初心者の自分にとってはかなり有難い存在でした。


機械学習を選考していた学生さんとかは社内にも案外多いと思いますので、
開発時には勉強会のような交流できる場があると詰まりにくいかと思います。



エキサイト Advent Calendar 2017 はまだまだ続きます.
ぜひ今後も投稿をウォッチしてください!

エンジニア募集

エキサイトではエンジニアとして一緒に働いてくださる方を募集しています。
詳しくは、こちらの採用情報ページをご覧ください。





by ex-engineer | 2017-12-21 10:00