文系データサイエンティストが実践している機械学習の勉強法
次世代システム研究室アーキテクト兼データサイエンティストのT.Nです。
私は文系卒ながらもデータサイエンティストという役割を頂いている、いわゆる「文系データサイエンティスト」です
「文系でもデータサイエンティストにはなれる」と言われていますし、私もそうだと思っています
ただ「機械学習や統計の理論を知らなくてもいい」というわけではありません
程度の差はあれ理論学習なくてして、分析を実施することはやはり難しいかなと
しかし数学知識や理論、統計学の裏付けが無いためどうやったらいいか途方に暮れることもあるかと思います
そんな環境に直面した私が機械学習関連の理論を勉強した際の方法を記載しようかと思います
同じ悩みを抱えている方の参考にでもなれば幸いです
目的
私と同じように文系卒でデータサイエンティスト職に就いている方、もしくはこれから機械学習関連の勉強をしていこうとしている方に対して- 私の勉強法を共有して、何らかの助けになればよい
- 同じような境遇の方も勉強法を共有してもらえば嬉しい
勉強方法
初めは統計の基礎として数学や統計検定2級、その他理論系の本を勉強してましたが、- 「全体を考えるとどのくらい勉強が進んだの?」
- 「これ勉強して何の役に立つの分からない」
そのためある時点で勉強方法を以下のように変えてみました
新たな指針
「何の役に?」「どれくらい?」という思いを解消するために下記の指針を設けました- 「どれくらい?」 => 書籍・資料を元に役立ちそうな理論を選定し、まずそれを全体として考える
- 「何の役に?」 => 理論学習の前にPythonを使って実装し、どういった結果が得られるのか勘所を得る
そしてプログラムを組むことによって問題となっている事象を解決しようと考えたのです
以下にどうやって勉強したか具体的な内容を記載します
テーマ設定
まずテーマとして「書籍・資料を元に役立ちそうな理論を選定」し、これを一つずつ勉強するようにしましたこれは何らかの裏付けと納得感があれば、どれでもいいのかなと考えています
例えば古いものですがTop 10 Algorithmsあたりでも良い指針になるかなと
以下にTop 10 Algorithmsで取り上げられているものを記載します
クラスタリングが若干多めですが、基礎理論の勉強としては違和感はないのかなあと思っています
(できれば初歩として単回帰分析と、モダンな理論としてCNN/RNNあたり追加してもいいかなとは思いますが)
観点 | 対応 |
---|---|
最小特権の原則やデフォルト拒否の原則に違反している。 | 公開リソースを除き、デフォルトで拒否する。 |
アクセスコントロールのチェックのバイパス。URL(パラメータを改ざんしたり強制ブラウジングしたり)や、アプリケーションの内部状態、HTML ページの編集や、API リクエストを編集する攻撃ツールの使用などによるもの。 | アクセスコントロールのメカニズムを一度実装しておき、それをアプリケーション全体で再利用する。最小化したCORSの使用など。 |
危険なオブジェクトの直接参照。ユニークな id を使うことで他人のアカウントの閲覧や編集ができてしまうなど。 | モデルのアクセスコントロールでは、レコードに対する所有権をユーザーに設定することで、任意のレコードに任意の操作(create, read, update, delete)ができないようにする。 |
POST、PUT、DELETE といった API でアクセスコントロールがない。 | アプリケーションに固有なビジネス制限の要件は、ドメインモデルによって強制されるべき。 |
権限の昇格。ログインせずにユーザーとして振舞ったり、一般ユーザーなのに管理者としてログインするなど。 | アクセスコントロールの失敗を記録し、必要に応じて管理者に報告する。(例:何度も失敗した場合) |
メタデータの操作。JSON Web Token (JWT) のアクセスコントロールトークンの再生成や改ざん、クッキーや隠しフィールド等による権限の昇格など。 | ステートフルなセッション識別子をログアウト後にサーバ側で無効化する。ステートレスなJWTトークンは攻撃の機会を最小化するために、有効期限を短くする。長期間有効なJWTについてはOAuth規格に沿ってアクセスを無効にすることが強く推奨される。 |
CORS(同一元生成ポリシー)の設定ミスで未認可 or 不明なオリジンからの API アクセスを許可してしまう | 自動攻撃ツールによる被害を最小化するため、APIにrate limitを設ける。 |
強制ブラウジング。権限が必要なページを権限のないユーザーで閲覧したり、管理者用のページを一般ユーザーが閲覧したりしてしまう | webサーバのディレクトリリスティング機能を無効にし、ファイルのメタデータ(例:.git)やバックアップファイルがWebルート内に存在しないようにする。 |
ここで定義した理論の中から一つずつ抜き出し、これを勉強していきます
学習の流れ
次に「理論学習の前にPythonを使って実装」してどう役立つかをしっかり把握した上で、理論学習を進めていきましたここでは最も単純な単回帰分析を選んだものとして話をすすめていきます
1. まずはコード実装
単純なものでいいので、まずはPython(scikit-learn)で実装してみますこの際、scikit-learnのドキュメントを読み、使われる引数はしっかり把握します
from sklearn import linear_model from sklearn import ensemble import pandas as pd import numpy as np # 性別、身長、体重をInputにする x = pd.read_csv("data.csv", sep=",") # 身長、体重を入力し、性別を判定するよう学習させる # DataFrameで扱えないのでndarray型に変更 train = x[["Height","Weight"]].as_matrix() result = x["Gender"].as_matrix() clf = linear_model.LinearRegression() print clf clf.fit(train, result) prediction=clf.predict([1,175]) print prediction
2. 理論学習
1. で何が出来るか、どういったInputデータ・パラメータがあるか、何が出来るかを把握した上で理論学習を深めますその際なるべく平易な本・サイトを選ぶのですが、ここではCourseraのMachine LearningコースのLinear Regression w/ One Variablesを受講したとしましょう
ここでは一般的な線形回帰のやり方である
とモデルを構築し、
とCost Functionを定義した上で、勾配降下法を使って学習することが学べます
Input, Outputのイメージがついている分、学習もスムーズにいけました
3. ソースと理論をつなげる
ここまで実装方法と理論を学べたので、後はそれを繋げて考えてみますここでスムーズにつながればいいのですが、今回については以下の”ずれ”があることに気づきます
- 講義ではlearning rateが必須だと言っていた
- しかしソースコードやAPIを見てもlearning rateというパラメータは存在しない
これを調査すると以下の理由によりずれが発生していることが判明します
- LinearRegressionはOLS(最小2乗回帰)・正規方程式で解いているようであり、講義の内容とは違いそう
- 勾配降下法(SGD)を使って回帰するクラスはSGDRegressorである
- 正規方程式はfeature数が少ない場合には、パラメータ調整もいらず速度も早い
- ただしfeature数が多い場合はメモリを大量に使用するため、SGDRegressorを使ったほうがよさそう
- 現実の線形回帰ではそこまでfeature数が多い場合はなく、LinearRegressionで充分ではないか
最後に
機械学習には、例えば過学習が…とか次元の呪いが…のように大事な基礎理論があったりもしますただやはり「何に使えるのか?」「どう使うのか?」が分からないと精神的にはつらいものがあったりします
そのため上記のようなソースコード駆動型勉強法も良いのでは?と感じています(もちろん基礎理論は後で勉強しなければいけないですが)
こうやって勉強を続けてきた結果、数式ばかりの解説書や論文にも取り組めるようになりましたし、初めの一歩としては効果のあるやり方ではないのかなと感じています
是非同じ悩みを抱えている方は参考にしていただければと思います
次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。
皆さんのご応募をお待ちしています。