- 株式会社白ヤギコーポレーション
- エンジニア
- 谷田 和章
scikit-learnで「機械学習」を始めよう!画像認識からSNS解析まで広がる活用術
今回のソリューション:【scikit-learn/サイキットラーン】
〜「機械学習」を手軽に始められるライブラリ「scikit-learn」の紹介。ディープラーニングや自然言語分析の解説も〜
「機械学習」という言葉を、さまざまな場所で目にするようになった。新しい事業での活用も多く見られるが、裏ではどのような仕組みで動いているのか、そして自社のサービスに組み込む場合は何から始めるべきなのか、といったことをつかむのは難しい。
その機械学習を用いて、ユーザーに最適な情報を届けるキュレーションニュースアプリ「カメリオ」を運営する白ヤギコーポレーション。
同社は、その開発にPythonを用い、実験フェーズの検証を効率化するために、機械学習ライブラリscikit-learnを使用している。同ライブラリを使うと、誰でも簡単に機械学習を体験できるという。
カメリオの開発を担当する谷田 和章さんに、どのような形で自社アプリに機械学習を活用しているのか、そして活用していくためには何から始めるといいのか、詳しいお話を伺った。
囲碁から画像認識まで…広がる「機械学習」の活用
機械学習は、最近本当に様々な分野で利用されるようになりましたね。機械学習は人工知能の領域における研究のひとつで、簡単に言うと人間が持っているような学習能力を、コンピュータによって実現しようというものです。
最近のニュースで言えば、GoogleのAlphaGoが囲碁のプロに勝ったという話がありましたね。あれの裏には、機械学習のひとつの手法であるディープラーニングが使われているようです。
ディープラーニングは、ニューラルネットという人間の脳を模したものを何層も重ねることで、より良い答えを求めようとする研究ですね。ただとても複雑なので、「結果としてはうまくいってるんだけど、中で何が起こっているかよく分からない…」ということもけっこうあります(笑)。
特徴から学習するのはディープラーニングでも一般的な機械学習でも同様なのですが、さらに「特徴をどう抽出するか」ということ自体も学習してしまうのが、ディープラーニングのすごいところです。
また、画像分析の世界でも広く使われていますね。いわゆるFacebookの顔認証や、デジカメが笑顔を認識するような機能です。
以前は機械に画像認識をさせるときには、人が画像の特徴を分類して、例えば「目とはこういうものだ」ということをひとつひとつ指示する必要がありました。機械学習を活用すると、こういった特徴自体を機械が自動的に学習してくれるようになります。
大学院で初めて触れた、機械学習の世界
私が学生の頃に研究していた自然言語処理も、機械学習が導入されてきた分野です。自然言語処理というのは、我々が普段話している言葉を、コンピューターに理解させようという研究になります。
昔は文章をコンピューターに理解させるためには、「『〜は』という言葉が出てきたら助詞です」といったルールを、ひとつひとつ人が手が書く必要がありました。これが機械学習を使えば、大量のテキストデータの中からコンピューターが自動的に法則性を学習し、分析することができるようになります。
私が初めて自然言語処理という分野に触れたのは、大学院に在籍していた時のことです。大学院2年目の時には機械学習の研究室に移動し、Twitterの投稿内容を解析して「風邪の兆候」を予測するという研究をしていました。
リアルタイムに流れる大量の文章から、風邪の流行と最も関連して出現する単語の組み合わせを見つけ出す、というような内容です。
その後、一度はアプリの開発会社に入ったのですが、退職後に楽天で機械学習のアルバイトをしました。自然言語処理が使われている社内システムのWebインターフェースの開発や、アルゴリズムの研究開発が担当でした。
現在はフリーランスとして白ヤギコーポレーションで、ニュースキュレーションアプリ「カメリオ」の開発に関わっています。他にも趣味で機械学習の知識を活かし、AKBグループのメンバー同士、誰と誰が仲が良いのかを可視化するサービスを作っています(笑)。(サービスはこちら)。
機械学習を使ってメンバーのSNS投稿やブログのテキストを解析して、つながりが強いメンバー同士を判定しています。面白いことに、AKBやSKEといったグループごとに、きれいにクラスタリングされるんですよ!(笑)。
カメリオのキュレーション精度を高めるために、機械学習を活用
カメリオは、「iPhone」や「経済」といったお気に入りのテーマを登録しておくと、いくつもの情報サイトからそれに合った最新記事を毎日届けてくれるサービスです。
ただ、その記事の中にあまり内容がマッチしていないものが混ざることもあるんですよ。そのマッチングの精度が向上するようにアルゴリズムを改善することが、私の仕事です。
今のカメリオでは、「お気に入りされたテーマ」と「記事で使われている単語データ」の統計的な特徴を元にマッチングしているんですね。
そこにユーザー側が「これはマッチしていません」と報告できるボタンを設置しているので、そのデータも今まで以上に活かしていきたいと考えています。
「お気に入り」したキーワードなどを元に記事をマッチング
記事の内容がマッチしているかという事に加えて、ユーザーがその記事が本当にマッチしていたかを判断した「正解のルール」を、機械学習を使って学習していく仕組みです。
Pythonと便利なライブラリで機械学習は身近になる
そういった機械学習のプログラムは、Pythonを使って書くことが多いですね。機械学習を使うには一番手軽なプログラミング言語だと思います。Pythonには便利なライブラリが充実していて、その中でも機械学習ライブラリの scikit-learnは、カメリオの開発でもよく使っています。
機械学習を使って何かやるとき、その流れは大まかに二つの段階に分けられます。ひとつめは、準備したデータをその後の学習や分類で使える形に変換する段階。
もうひとつは、その加工されたデータを使って分類を行う分類器の学習をする段階です。これらの段階を終えると、実際に分類器を用いて予測や推定ができます。
これらの変換や分類には実にいろいろな手法があって、全てを理解することはなかなか出来ることではないと思います。scikit-learnには多くの変換手法や分類器が用意されているので、何か試したいときはまずscikit-learnを使ってみることが多いですね。
たとえ中身を知らなくても様々な手法をとりあえず適用して実験してみる、といったことがとても手軽に行えてしまいます。
どの手法でも利用するためのインタフェースはとてもシンプルで、学習させるにはfit()
、変換にはtransform()
、推定するにはpredict()
というメソッドを呼び出してあげるだけでいいんです。難しい数式とかを知らなくても、使うだけなら全然できちゃうんです。
ですから、まずデータを用意してあげて、それをどう使いたいのかということを考えるだけで、始めることができるんですね。
カメリオの話で言うと、ユーザが不適切だと判断した記事を誤った例、ユーザが実際に読んだ記事を正しい例としてデータを準備します。それらのデータから学習を行って、新しい記事が来たときに、それが正しい記事なのか誤った記事なのかを正しく推定するのが目的です。
scikit-learnを使うと、うまくいきそうな方法を考えて実験して性能を評価する、というサイクルを素早く回すことができるんです。場合によってはscikit-learnに含まれない手法を利用することもあるのですが、それらも簡単にscikit-learnと組み合わせることができます。
機械学習は誰でも始められる。ただしデータを集めることが必要
機械学習が最終的に目指すところは、人間の脳にできるだけ近い、もしくはそれ以上の機能を作る、ということなのだと思います。
ただ、現時点ではまったくそこには到達していないですね。人ができることって実はとても多くて、その中のごく一部だけが、機械でも出来るようになったに過ぎません。
機械学習の難しいところは、データがないと何もできないということと、データの質が重要になるということです。一般的には、まずは自分がやりたいことをイメージして、そこから必要なデータを用意するという流れになります。
ただ、実際には集めようと思っても欲しいデータが見つからなかったり、質が良くなかったりするので難しいところですね。自分でデータを取得するためのアプリやスクリプトを書いて、データを作るところから始めることもよくあります。
逆に、データさえ与えてあげれば自動的に正解が出てくるので、概念としてはそれほど難しくはありません。仮に中身を知らなかったとしても、scikit-learnのようなライブラリを使えば手軽に試せます。
このようなライブラリがあることで、今後は機械学習はより一層身近なものになり、多くの人が手を出していくようになると思っています。
もし機械学習を始めてみたいと思ったら、まずは画像解析したいとか、レコメンド機能が欲しいとか、何を実現したいのかという所をまずは考えてみてください。そこからその分野にあった手法を探し、ライブラリなどを活用して実際に解析してみると良いのではないかなと思います。(了)