機械学習のスキルセットについて
最近、機械学習ならびにAIについての相談が増えてきて、「で、何ができるの?」みたいに言われることも多いので資料に落とし込んで、これを見せればスキルセットがわかる!みたいな記事を書きます。それに加えて今後機械学習を学びたいという人のためにどういうことを学んだ方が良いかというのもわかりやすく伝えられればと思います。
内容は浅いのでオーバービューとして見ていただければと。いつか各項目を掘り下げた記事を書きます(いつか)。
目次
1. インフラ・データ基盤構築
2. データ抽出・データ加工
3. プログラミング(Python・R)
4. ビジュアライズプログラミング(Javascript)
5. 数学・コンピュータサイエンス
6. アルゴリズム(教師あり、教師なし)
7. 精度検証(Precision・Recall)
8. 得られた結果に対する考察
1. インフラ・データ基盤構築
こちらはいくつかの構成になっております。
1.1. Cloudサービスの活用
基本はAWSなどのCloudで構築していきます。AWS以外ではGCPがあり、弊社ではGCPをメインで使っています。基本的にできることは変わらないですが、AWSではGraphDBのNeptuneがあり、GCPにはない機能です。
1.2. ログ収集基盤の作成
これはfluentd一択な気がします。構成としてはEC2などのマシンにfluentdとnginxをインストールし、nginxで受けとったリクエストをfluentdで加工して送るという形がスタンダードかと。この時、送り先は大抵S3やcloud storageなどのストレージサービスになります。
1.3. データベースの構築
アプリケーションで使う場合は、得られたログは統計データに直す必要があります。RDBMSでテーブルを作って、バッチで統計データに直し格納するのが一般的かと思います。例えば、合計や平均などがそれに当たるかと思います。次のデータ抽出・加工でも関わってきます。
また、最近の興味としては、リレーションを記述するのにGraphDBに注目しています。
GraphDBについてやデータに関する考え方は上記のリンクにまとめました。
1.4. サーバーコストの見積もり
どれくらいのトランザクションだとどれくらいのコストがかかるかというのを見積もる必要があります。原価の計算はビジネスモデルにも関わってきます。サーバーコストはトランザクションの金額に比べると10%程度になるケースが多いです。ポイントとしては、CloudだけではなくCDNの計算も必要ということ。CDNは3社ほどであいみつを取るのが一般ですが、固定料金のところは怪しいのでやめた方がいいでしょう。CDNについてはフェールセーフも必要なのでサブCDNを待機させておくと安全です。
1.5. 計算用マシンの設定
基本的に計算はローカルマシンでは行わないため、Cloudに用意したマシンにいろんなソフトをインストールして行います。その際、管理のためにansibleで設定ファイルを書きserverspecで確認します。Dockerなんかを使えば楽かと思いますが、恥ずかしながらまだ使ったことがなく、今後試してみたいと思います。
2. データ抽出・データ加工
2.1. SQL
一番ベーシックな抽出方法はAthenaやBig Queryを利用する方法です。統計データをRDBMSに入れる際はバッチでSQLを叩き、その結果をDBに格納するというのが一般的です。リアルタイムでQueryを叩くのはあまりオススメしません。
2.2. Cypher
GraphDBを利用する際はSQLのようなCypherというのを使います。自分自身も最近学んだのですが、ぶっちゃけるとGraphDBのSQLみたいなものです。
2.3. テキスト処理
CSVやただのテキストファイルを扱うのでちょっとした加工のためにawkなどを使うと楽です。
2.4. ベクトル化
機械学習のインプットは大抵ベクトル・行列の形に直す必要があるので、インプットに適した形に加工する必要があります。また、正解データにラベルをつける際もベクトル化が必要です。この時、ベクトル・行列のカラムを特徴量といいます。
3. プログラミング(Python・R)
3.1. クローリング・スクレイピング
こちらはオープンソースの3rd Partyデータを利用したいときに使います。 APIで提供されていればRequest Classで抽出できますが、構造化されていない場合はHTMLから直接ぶっこぬきます。クローリングは抽出元にアクセスすることで、スクレイピングは抽出元のデータを取り出していくことです。スクレイピングの方が難易度は高くHTMLの知識が必須です。
3.2. 各種ライブラリの活用
ぶっちゃけ機械学習はデータの用意ができればあとは入力するだけなので、ライブラリをインストールし、そのドキュメントを読む力さえあればそんなに機械学習プログラミングは難しくないです。個々のアルゴリズムを実装する力よりもどう活用するか活用するインフラを用意するかの方が重要なスキルです。手書き文字を認識した後どうするかが重要。
3.3. APIの作成
後述するビジュアライズのためにデータを取り出すためのAPIを書く必要があります。最近はFlaskを使ってライトなAPIを作っています。昔はRubyをよく使っていたのでRailsというゴリゴリ思いフレームワークを使ってましたが、Flaskでいいじゃないと思っています。
4. ビジュアライズプログラミング(Javascript)
4.1. Charts APIの活用
チャートの描画にとっても便利なCharts APIを利用します。
4.2. Ajaxによる非同期通信
前述したAPIからデータを取得しますが、毎回リダイレクトをかけるとかなり不便なのでボタンをクリックしたらデータが取れるようにする必要があります。そこでAjaxを使います。取得したあとはJSONをそのままChartsに利用できる形に加工して設定します。
5. 数学・コンピュータサイエンス
これは一個一個掘り下げるとマジで時間かかりそうなので別の記事にいつか書きます。個人的に重要なのをいくつか上げていきます。
5.1. 線形代数
5.2. 確率統計
5.3. 微分積分(特に微分)
5.4. グラフ理論
5.5. ブール代数・論理回路
基本的にDeep Learningを(完全に)理解しようと思ったら必要なのが上記の知識です。
6. アルゴリズム(教師あり、教師なし)
6.1. 教師あり学習
6.1.1. 回帰分析
アルゴリズムってレベルかというとどうかわかなないですが、これは予測に使うケースが多いです。具体例をあげると、広告においてこのまま予算を使ったらどれくらいの効果が見込めるかなど。割と直感でも理解しやすいです。
6.1.2. Deep Leaning
これは主に認識(分類)に使います。画像に何が写っているかの判定などがそれに当たります。Deep Leaningを扱う際のキモはそのアルゴリズム理解よりも、インプット・アウトプットの設計を以下に行うかが重要です。画像における応用例が多いのはインプットの設計がほぼいらないことに由来します(と思います)。大抵チュートリアルでは手書き文字の認識を行います。
6.2. 教師なし学習
6.2.1. PCA(主成分分析)
次元削減・データ加工に使います。大抵物事の特徴量はN次元なのですが、やはりそれだと利用しずらいケースが出てきます。そこで特徴量の次元を削減するために主成分分析を活用します。よくある例としては、5教科のテストの結果を元に理系・文系に分けたり、10種類の体力テストの結果を元にどういう競技に向いているかなどに活用可能です。
6.2.2. k-means
PCAで2次元にした後、ある程度のかたまりにクラスタリングするために使います。使い方としては2次元に加工したデータをプロットし、プロットされたデータをインプットとしてk-meansを利用するとクラスタリングされた結果が返ってきます。
6.3. 機械学習の役割
大きく分けて、予測・分類がメインの役割です。それぞれに適したアルゴリズムを選択することが重要です。
7. 精度検証(Precision・Recall)
機械学習により得られた結果を評価し、そのモデルがよかったかどうかを調べるために精度検証を行います。この結果を元にパラメータをチューニングしたりして、改善していきます。
各項目を計算する前に重要なのは正解データと結果のデータをTP(True Positive)・FP(False Positive)・TN(True Negative)・FN(False Negative)に分けることが重要です。これも長くなるので別の記事を書きます。
7.1. Precision
こちらは直訳すると精度(適合率)ですが、どれくらい正解データが返ってきているかの割合になります。例えば分類において正解がわかっている集団があったとします。それをインプットデータとアウトプットに分けると正解の対応表ができます。一方で、機械学習のモデルを作成し、インプットだけを入力します。すると正解データのアウトプットとの対応表ができるかどうか。を調べます。この時、結果が正解であればTP、対応が間違えていればFPとして定義し、Precision = TP/(TP+FP)という式で定義します。同じ精度と訳すAccuracyというのもありますが、今の所あまり使うシーンがありません。もし、こういうケースでAccuracy使うよ!というのがあったらご教授いただければと。
7.2. Recall
こちらは直訳すると再現率になります。要はどれだけ正解にないデータを新しく分類できたかの指標になります。説明が難しいですが、例えばこの値が小さいと新たなインサイトはあまり得られなかったということとして捉えられます。基本的にはPrecisionをあげるとRecallが下がるというトレードオフの関係になります。上述したTPと正解データとして存在するが結果が現れなかったものをFNとして定義し、Recall = TP/(TP+FN)という式で定義します。検索エンジンの性能評価にも使われます。
8. 得られた結果に対する考察
教師なし学習の場合、最終的に得られた結果に何もラベルがついていないという状態が結果として得られます。その時に、それはどういう意味を持ってその結果が生まれたのかということを考察する能力が必要です。例えば最終的にk-meansで得られた結果はあるデータが「何かしら」の集団にまとまっているという結果として出てきます。その「何かしら」が「こうかしら?」と考察することが必要です。
まとめ(感想)
各項目が浅くなってしまいましたが、これらを基本のスキルセットとして、目的に応じて応用できるスキルが必要です。今後需要があればそういった知識をまとめていきます。
ビジネスについて
今は自社のサービスと並行して機械学習関連のコンサル事業を行なっています。もし上記の内容に興味がある方はコンタクトいただけると幸いです。コンタクト方法はFBでメッセージを送ってきていただければと思います。あと英語で仕事もできます。
というわけで次回、もう少し各項目を掘り下げるような記事を書いていきます!(本当にやるのか?)