37
Scikit-learnで学ぶ機械学習入門 佐藤 貴海 @tkm2261 2014/07/19@機械学習勉強会 2014年7月19日 機械学習勉強会 1

Scikit learnで学ぶ機械学習入門

Embed Size (px)

DESCRIPTION

勉強会で話した、Scikit-learnの入門資料です。speakerdecでも共有しましたが、slideshare一本化のためこちらにも上げます

Citation preview

Page 1: Scikit learnで学ぶ機械学習入門

Scikit-learnで学ぶ機械学習入門

佐藤 貴海

@tkm2261

2014/07/19@機械学習勉強会

2014年7月19日機械学習勉強会 1

Page 2: Scikit learnで学ぶ機械学習入門

今日の目的

• 機械学習の雰囲気感じる

– 『こいつ・・・動くぞ!』くらい

–わかりやすさ>>>厳密性

–理論勉強するのも、威力を知ったあとの方が捗る

• 深入りはしない

–紹介量を優先

2014年7月19日機械学習勉強会 2

Page 3: Scikit learnで学ぶ機械学習入門

自己紹介

専門:経営工学/最適化

所属:(株)ブレインパッド 入社2年目

業務:データ分析全般 (何でも屋さん)

機械学習との出会い:⇒研究が現在実用性皆無の半正定値計画問題

⇒精神の逃げ道として機械学習を趣味で始める

⇒研究が詰んで、趣味が本職に

趣味で始めたので言語、画像など幅広く遊んでます

この前、多摩川のほとりで1人燻製してきました。

2014年7月19日機械学習勉強会 3

Page 4: Scikit learnで学ぶ機械学習入門

Scikit-learnってなに?

• Pythonの機械学習ライブラリ

– 無料・有料含めて、コレほど充実したライブラリは他にない

– ほぼデファクトスタンダード状態 (と思っている)

2014年7月19日機械学習勉強会 4

利点 (対R)

・高速

・省メモリ

・Pythonなので言語基盤がしっかりしている

・検索しやすい

欠点 (対R)

・カテゴリカル変数の処理(factor型は無い)

・環境構築が面倒

Page 5: Scikit learnで学ぶ機械学習入門

環境構築

• よくわからない人

⇒Anacondaを入れましょう

Python導入、環境変数設定、Scikit-learn導入、IDE導入 全部やってくれます

2014年7月19日機械学習勉強会 5

http://continuum.io/downloads

Page 6: Scikit learnで学ぶ機械学習入門

環境構築

2014年7月19日機械学習勉強会 6

• こだわりたい人

• Windowsユーザ

⇒GohlkeのページでMKLビルドのNumpyを入れましょう

保証はないので、自己責任で

Page 7: Scikit learnで学ぶ機械学習入門

環境構築

2014年7月19日機械学習勉強会 7

• こだわりたい人

• Linuxユーザ

非商用個人ならインテルコンパイラとMKLが無料で使える

それ以外は、OpenBLASが高速

インストール方法はGithubにあげました

OpenBLASはmultiprocessingとの相性が悪いので要注意

WindowsでOpenBLASは鬼門なのでやめましょう

https://software.intel.com/en-us/non-commercial-software-development

インストール方法はコチラhttps://software.intel.com/en-us/articles/numpyscipy-with-intel-mkl?language=eshttp://gehrcke.de/2014/02/building-numpy-and-scipy-with-intel-compilers-and-intel-mkl-on-a-64-bit-machine/

https://github.com/anaguma2261/setup_python_with_openblas

Page 8: Scikit learnで学ぶ機械学習入門

2014年7月19日機械学習勉強会 8

脱線:BLAS と LAPACK

数値計算をやると裏で必ずお世話になるのがこの2つ

Basic Linear Algebra Subprograms (BLAS)-線型代数計算を実行するライブラリの標準仕様

Linear Algebra PACKage (LAPACK)-BLAS上に構築された固有値計算などの高位な線形代数計算ライブラリ

現在様々なBLAS実装が公開されている

Intel MKL … MATLABはコレ 有償 すごく速い・高い・安心!

ATLAS … 自動チューンのBLAS BSD 速い

GotoBLAS2 … 後藤和茂氏作成のBLAS BSD かなり速い 開発停止

OpenBLAS … xianyi氏によるGotoBLAS2の後継BLAS BSD すごく速い

(MATLAB, R, Octave, numpy …)

計算が遅い時、4つのどれかの導入すると幸せになれるかも?

・・・

Page 9: Scikit learnで学ぶ機械学習入門

脱線: BLASの比較

2014年7月19日機械学習勉強会 9

引用:R BLAS: GotoBLAS2 vs OpenBLAS vs MKL (http://blog.felixriedel.com/2012/11/r-blas-gotoblas2-vs-openblas-vs-mkl/)

実行コードA = matrix(rnorm(n*n),n,n)

A %*% A

solve(A)

svd(A)

RのデフォルトBLASから何倍早くなったか検証してるサイトがあったので紹介

最大で11倍ほど高速化

MKLが基本的に一番高速

OpenBLASも所によってはMKLを上回ることも

マルチスレッド環境では導入は必須かも

Page 10: Scikit learnで学ぶ機械学習入門

2014年7月19日機械学習勉強会 10

Scikit-learnの前に機械学習の流れもおさらい

脱線してますが、

Page 11: Scikit learnで学ぶ機械学習入門

機械学習の流れ

2014年7月19日機械学習勉強会 11

分析対象のデータを集める。趣味でやる場合には、結構重要

最も苦痛を伴う作業。機械学習モデルに渡せる方に整形するカテゴリカル変数のダミー変数化、欠損値穴埋め、変数の作成等

問題に合わせて適当な手法を選択する。リッジ回帰、SVM、RandomForest、決定木、k-means など

手法のハイパーパラメータを選択する。リッジ回帰の正則化項、 決定木の木の深さ など

尤度最大化などで学習。Scikit-learnがやってくれるので割愛

問題に合わせて適当な評価尺度を選択する。精度、F値、平均二乗誤差、AUC など

①データの入手

②データの前処理

③手法選択

④ハイパーパラメータ選択

⑥モデル評価

精度は十分か

⑤モデル学習

NO YES成功!

手法を変える

パラメタを変える

Page 12: Scikit learnで学ぶ機械学習入門

データを集めて・前処理する

2014年7月19日機械学習勉強会 12

①データの入手

②データの前処理

③手法選択

④ハイパーパラメータ選択

⑥モデル評価

精度は十分か

⑤モデル学習

NO YES成功!

手法を変える

パラメタを変える

趣味でやると、手法は知ってても、データが無いことが多数

いくつか、データのある場所を紹介

◆練習用データ・Kaggle https://www.kaggle.com/・ UCI Machine Learning Repository

http://archive.ics.uci.edu/ml/

◆テキストデータ(日本語)・2ch・Twitter Streaming API・Wikipedia ダンプデータ・青空文庫

前処理はひたすら頑張って下さい。ここでどんな変数を作るかで、かなり(一番?)利きます

Scikit-learnやpandasに便利関数アリ

Page 13: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 13

①データの入手

②データの前処理

③手法選択

④ハイパーパラメータ選択

④モデル評価

精度は十分か

④モデル学習

NO YES成功!

手法を変える

パラメタを変える

この一連の流れ(良いパラメータの発見)を効率良く行う方法が

交差検定( Cross-validation )

グリッドサーチ

どちらもscikit-learnにあります

Page 14: Scikit learnで学ぶ機械学習入門

交差検定 (k-fold cross validation )

2014年7月19日機械学習勉強会 14

①データの入手

②データの前処理

③手法選択

④ハイパーパラメータ選択

⑥モデル評価

精度は十分か

⑤モデル学習

NO YES成功!

手法を変える

パラメタを変える

学習と評価には、学習データと検証データが必要ただし、別々に用意すると・・・

・検証データを学習に全く使えない・検証データが偶然良い(悪い)可能性

交差検定をしよう!

Page 15: Scikit learnで学ぶ機械学習入門

交差検定 (k-fold cross validation )

2014年7月19日機械学習勉強会 15

5-fold cross validation のイメージ(レコードは最初にランダムに並べ替え済みとする)

テスト用のレコードセット

学習用のレコードセット

学習と精度評価をk回繰り返し、平均値を精度の推定値とする手法

・検証データを学習に全く使えない

k-1回は学習に使用

・検証データが偶然良い(悪い)可能性

k回評価で偶然性を極力排除

Page 16: Scikit learnで学ぶ機械学習入門

グリッドサーチ(気合)

2014年7月19日機械学習勉強会 16

①データの入手

②データの前処理

③手法選択

④ハイパーパラメータ選択

⑥モデル評価

精度は十分か

⑤モデル学習

NO YES成功!

手法を変える

パラメタを変える 良いパラメータって

どうやって見つけるの?

グリッドサーチ(気合)です。

Page 17: Scikit learnで学ぶ機械学習入門

グリッドサーチ

2014年7月19日機械学習勉強会 17

探索するパラメータの範囲を決めて、適当な間隔で切る。(指数の肩で切ることが多い)あとは切ったパラメータを総当りで検証して、最も良いパラメータを見つける

パラメータ2つの例、この場合は81回学習と検証をする必要

さらに細かく学習したいときは、指数の底を小さい値にする

引用: http://xargs.hateblo.jp/entry/2014/02/09/005058

Page 18: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 18

①データの入手

②データの前処理

③手法選択

④ハイパーパラメータ選択

⑥モデル評価

精度は十分か

⑤モデル学習

NO YES成功!

手法を変える

パラメタを変える グリッドサーチ

交差検定

学習と評価

まとめると、こんな感じ

Page 19: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 19

先ほどのパラメータ(81種)を10-fold 交差検定すると

810回学習と検証が必要

Page 20: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 20

先ほどのパラメータ(81種)を10-fold 交差検定すると

810回学習と検証が必要

Q:解けるの?

Page 21: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 21

先ほどのパラメータ(81種)を10-fold 交差検定すると

810回学習と検証が必要

Q:解けるの?

A:気合です

Page 22: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 22

先ほどのパラメータ(81種)を10-fold 交差検定すると

810回学習と検証が必要

Q:本当に解けるの?

Page 23: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 23

先ほどのパラメータ(81種)を10-fold 交差検定すると

810回学習と検証が必要

Q:本当に解けるの?

A:完全並列出来る計算なので810台サーバがあれば

最近のGoogleは真顔でこのぐらい言ってきます

Page 24: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 24

先ほどのパラメータ(81種)を10-fold 交差検定すると

810回学習と検証が必要

Q:クラスタ組めない

Page 25: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 25

先ほどのパラメータ(81種)を10-fold 交差検定すると

810回学習と検証が必要

Q:クラスタ組めない

A:弊社の を買って下さい

Page 26: Scikit learnで学ぶ機械学習入門

パラメータの探索

2014年7月19日機械学習勉強会 26

先ほどのパラメータ(81種)を10-fold 交差検定すると

810回学習と検証が必要

Q:クラスタ組めない

A:弊社の を買って下さい

最近はクラウド上の機械学習も有ります。

http://jp.techcrunch.com/2014/06/17/20140616microsoft-announces-azure-ml-cloud-based-machine-learning-platform-that-can-predict-future-events/

Page 27: Scikit learnで学ぶ機械学習入門

2014年7月19日機械学習勉強会 27

これで、今日からデータサイエンティスト

Page 28: Scikit learnで学ぶ機械学習入門

・・・とは行かない

2014年7月19日機械学習勉強会 28

①データの入手

②データの前処理

③手法選択

④ハイパーパラメータ選択

⑥モデル評価

精度は十分か

⑤モデル学習

NO YES成功!

手法を変える

パラメタを変える

適切な手法の選択が

機械学習で最も重要かつ難しい問題

Page 29: Scikit learnで学ぶ機械学習入門

適切な手法の選択

2014年7月19日機械学習勉強会 29

Q:常に最適な手法ってあるの?

A:ありません

Q:どうやったら最適な手法を選べるの?

A:機械学習を体系的に学び、経験を積んで、更に運が必要

Q:詰んでない?

A:なんとかするのが、今日の議題

Page 30: Scikit learnで学ぶ機械学習入門

現状ベストアンサー:scikit-learnに任せる

2014年7月19日機械学習勉強会 30

『Scikit-learnにできる事』≒『自分にできること』これで最近は問題が無いことが多い

http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

Page 31: Scikit learnで学ぶ機械学習入門

実装の雰囲気

2014年7月19日機械学習勉強会 31

import numpyfrom sklearn.cross_validation import cross_val_score#使いたい手法をインポートfrom sklearn.hogehoge import some_machine_learning_method

for パラメータ in (グリッドサーチの探索範囲):#手法のインスタンスを生成

model = some_machine_learning_method(パラメータ)

#お手軽交差検定cv_scores = cross_val_score(model, 説明変数, 目的変数)

#交差検定の各学習のスコア平均値を計算score = numpy.mean(cv_scores)

これでScikit-learnの大体の手法は、これで使えるはず

リッジ回帰の例をGithubにあげましたhttps://github.com/anaguma2261/scikit-learn-sample/blob/master/ridge_regression.py

Page 32: Scikit learnで学ぶ機械学習入門

手法の種類

• Classification (分類)– ラベルをデータで学習して、ラベルを予測

• Regression (回帰)– 実数値をデータで学習して、実数値を予測

• Clustering (クラスタリング)– データを似ているもの同士を集めて、データの構造を発見

• Dimensional Reduction (次元削減)– データの次元を削減して、よりメタな要因を発見

(主成分分析は次元削減のひとつ)

– 削減した次元をデータにして他の手法を行う

(次元の呪い回避)

2014年7月19日機械学習勉強会 32

Page 33: Scikit learnで学ぶ機械学習入門

Classification (分類)• SVM (SVC, LinearSVC)

– 利点• 汎化性能が高く、少量のデータでもうまく学習出来る事がある• カーネルの組み合わせで様々データに対応できる

– 欠点• カーネル入れると遅い• 関数によっては、予測確率で出力できない

• K-近傍法 (NearestNeighbors)– 利点

• 単純な割に精度が高い– 欠点

• 予測時にもメモリに学習データを格納する必要がある

• ランダムフォレスト (RandomForestClassifier)– 利点

• 精度が高いことが多い• 並列計算しやすい• 過学習や、変数のスケールを考えずに、全て変数を入れて学習できる

– 欠点• ランダムフォレスト信者になりやすい

2014年7月19日機械学習勉強会 33

Page 34: Scikit learnで学ぶ機械学習入門

Classification (分類)

• 確率的勾配法による学習(SGDClassifier)

– これは手法でなく学習方法

– データが大きい時に、データを一部づつを見て

学習の計算をサボって高速化

– オプションで、SVMやロジスティック回帰が選択可能

2014年7月19日機械学習勉強会 34

Page 35: Scikit learnで学ぶ機械学習入門

Regression (回帰)

2014年7月19日機械学習勉強会 35

• 重回帰 (LinearRegression)– 利点 ・・・ 速い (パラメータ無し)

– 欠点 ・・・ Scikit-learnにstepwise法が無いので、使いにくい

• リッジ回帰 (Ridge)– 利点 ・・・ ラッソより速い、多重線形性の影響を受けにくい

– 欠点 ・・・ ラッソに比べて、変数選択力が弱い

• ラッソ回帰 (Lasso)– 利点 ・・・ 少ない変数でモデルを作ってくれる

– 欠点 ・・・ リッジよりは遅い、使わない変数があることを仮定している

• SVR (SVR)– 利点 ・・・ カーネルで非線形性を取り込める

– 欠点 ・・・ カーネルを入れると遅い

• ランダムフォレスト(RandomForestRegressor)– Classificationを参照 回帰では予測値が離散になる欠点がある

Page 36: Scikit learnで学ぶ機械学習入門

Clustering (クラスタリング)

• K-means法(KMeans)– 利点 ・・・ 速い MiniBatchKMeansは計算をサボってるので更に速い

– 欠点 ・・・ クラスタ数を最初に与えないといけない

• 階層的クラスタリング(AgglomerativeClustering)最近実装されたので表には無い

– 利点 ・・・ クラスタ数を後から色々変えられる

– 欠点 ・・・ 遅い、大きいデータは階層が表示出来ないことも

• 混合ガウス分布(GMM)– 利点 ・・・ 各クラスタの所属確率が出る。

– 欠点 ・・・ 正規分布を仮定する

• Mean Shift ( MeanShift )– 使用経験がないのでノーコメント 誰か教えて下さい

2014年7月19日機械学習勉強会 36

Page 37: Scikit learnで学ぶ機械学習入門

Dimensional Reduction (次元削減)

2014年7月19日機械学習勉強会 37

Scikit-learnのフローチャートに語れる手法があまりなかったので、私がよく使う手法を紹介

• 主成分分析(PCA)– 利点 ・・・ 速い 疎行列も扱える

– 欠点 ・・・ 裏で正規分布を仮定

• 非負値行列因子分解 (NMF)– 利点 ・・・ 要因の引き算を許さないことでより特徴を抽出できる事もある

– 欠点 ・・・ 非負行列限定

その他、LDAやDeep Learningなどなども