Upload
takami-sato
View
7.820
Download
2
Embed Size (px)
DESCRIPTION
勉強会で話した、Scikit-learnの入門資料です。speakerdecでも共有しましたが、slideshare一本化のためこちらにも上げます
Citation preview
Scikit-learnで学ぶ機械学習入門
佐藤 貴海
@tkm2261
2014/07/19@機械学習勉強会
2014年7月19日機械学習勉強会 1
今日の目的
• 機械学習の雰囲気感じる
– 『こいつ・・・動くぞ!』くらい
–わかりやすさ>>>厳密性
–理論勉強するのも、威力を知ったあとの方が捗る
• 深入りはしない
–紹介量を優先
2014年7月19日機械学習勉強会 2
自己紹介
専門:経営工学/最適化
所属:(株)ブレインパッド 入社2年目
業務:データ分析全般 (何でも屋さん)
機械学習との出会い:⇒研究が現在実用性皆無の半正定値計画問題
⇒精神の逃げ道として機械学習を趣味で始める
⇒研究が詰んで、趣味が本職に
趣味で始めたので言語、画像など幅広く遊んでます
この前、多摩川のほとりで1人燻製してきました。
2014年7月19日機械学習勉強会 3
Scikit-learnってなに?
• Pythonの機械学習ライブラリ
– 無料・有料含めて、コレほど充実したライブラリは他にない
– ほぼデファクトスタンダード状態 (と思っている)
2014年7月19日機械学習勉強会 4
利点 (対R)
・高速
・省メモリ
・Pythonなので言語基盤がしっかりしている
・検索しやすい
欠点 (対R)
・カテゴリカル変数の処理(factor型は無い)
・環境構築が面倒
環境構築
• よくわからない人
⇒Anacondaを入れましょう
Python導入、環境変数設定、Scikit-learn導入、IDE導入 全部やってくれます
2014年7月19日機械学習勉強会 5
http://continuum.io/downloads
環境構築
2014年7月19日機械学習勉強会 6
• こだわりたい人
• Windowsユーザ
⇒GohlkeのページでMKLビルドのNumpyを入れましょう
保証はないので、自己責任で
環境構築
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
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つのどれかの導入すると幸せになれるかも?
・・・
脱線: 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を上回ることも
マルチスレッド環境では導入は必須かも
2014年7月19日機械学習勉強会 10
Scikit-learnの前に機械学習の流れもおさらい
脱線してますが、
機械学習の流れ
2014年7月19日機械学習勉強会 11
分析対象のデータを集める。趣味でやる場合には、結構重要
最も苦痛を伴う作業。機械学習モデルに渡せる方に整形するカテゴリカル変数のダミー変数化、欠損値穴埋め、変数の作成等
問題に合わせて適当な手法を選択する。リッジ回帰、SVM、RandomForest、決定木、k-means など
手法のハイパーパラメータを選択する。リッジ回帰の正則化項、 決定木の木の深さ など
尤度最大化などで学習。Scikit-learnがやってくれるので割愛
問題に合わせて適当な評価尺度を選択する。精度、F値、平均二乗誤差、AUC など
①データの入手
②データの前処理
③手法選択
④ハイパーパラメータ選択
⑥モデル評価
精度は十分か
⑤モデル学習
NO YES成功!
手法を変える
パラメタを変える
データを集めて・前処理する
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に便利関数アリ
パラメータの探索
2014年7月19日機械学習勉強会 13
①データの入手
②データの前処理
③手法選択
④ハイパーパラメータ選択
④モデル評価
精度は十分か
④モデル学習
NO YES成功!
手法を変える
パラメタを変える
この一連の流れ(良いパラメータの発見)を効率良く行う方法が
交差検定( Cross-validation )
グリッドサーチ
どちらもscikit-learnにあります
交差検定 (k-fold cross validation )
2014年7月19日機械学習勉強会 14
①データの入手
②データの前処理
③手法選択
④ハイパーパラメータ選択
⑥モデル評価
精度は十分か
⑤モデル学習
NO YES成功!
手法を変える
パラメタを変える
学習と評価には、学習データと検証データが必要ただし、別々に用意すると・・・
・検証データを学習に全く使えない・検証データが偶然良い(悪い)可能性
交差検定をしよう!
交差検定 (k-fold cross validation )
2014年7月19日機械学習勉強会 15
5-fold cross validation のイメージ(レコードは最初にランダムに並べ替え済みとする)
テスト用のレコードセット
学習用のレコードセット
学習と精度評価をk回繰り返し、平均値を精度の推定値とする手法
・検証データを学習に全く使えない
k-1回は学習に使用
・検証データが偶然良い(悪い)可能性
k回評価で偶然性を極力排除
グリッドサーチ(気合)
2014年7月19日機械学習勉強会 16
①データの入手
②データの前処理
③手法選択
④ハイパーパラメータ選択
⑥モデル評価
精度は十分か
⑤モデル学習
NO YES成功!
手法を変える
パラメタを変える 良いパラメータって
どうやって見つけるの?
グリッドサーチ(気合)です。
グリッドサーチ
2014年7月19日機械学習勉強会 17
探索するパラメータの範囲を決めて、適当な間隔で切る。(指数の肩で切ることが多い)あとは切ったパラメータを総当りで検証して、最も良いパラメータを見つける
パラメータ2つの例、この場合は81回学習と検証をする必要
さらに細かく学習したいときは、指数の底を小さい値にする
引用: http://xargs.hateblo.jp/entry/2014/02/09/005058
パラメータの探索
2014年7月19日機械学習勉強会 18
①データの入手
②データの前処理
③手法選択
④ハイパーパラメータ選択
⑥モデル評価
精度は十分か
⑤モデル学習
NO YES成功!
手法を変える
パラメタを変える グリッドサーチ
交差検定
学習と評価
まとめると、こんな感じ
パラメータの探索
2014年7月19日機械学習勉強会 19
先ほどのパラメータ(81種)を10-fold 交差検定すると
810回学習と検証が必要
パラメータの探索
2014年7月19日機械学習勉強会 20
先ほどのパラメータ(81種)を10-fold 交差検定すると
810回学習と検証が必要
Q:解けるの?
パラメータの探索
2014年7月19日機械学習勉強会 21
先ほどのパラメータ(81種)を10-fold 交差検定すると
810回学習と検証が必要
Q:解けるの?
A:気合です
パラメータの探索
2014年7月19日機械学習勉強会 22
先ほどのパラメータ(81種)を10-fold 交差検定すると
810回学習と検証が必要
Q:本当に解けるの?
パラメータの探索
2014年7月19日機械学習勉強会 23
先ほどのパラメータ(81種)を10-fold 交差検定すると
810回学習と検証が必要
Q:本当に解けるの?
A:完全並列出来る計算なので810台サーバがあれば
最近のGoogleは真顔でこのぐらい言ってきます
パラメータの探索
2014年7月19日機械学習勉強会 24
先ほどのパラメータ(81種)を10-fold 交差検定すると
810回学習と検証が必要
Q:クラスタ組めない
パラメータの探索
2014年7月19日機械学習勉強会 25
先ほどのパラメータ(81種)を10-fold 交差検定すると
810回学習と検証が必要
Q:クラスタ組めない
A:弊社の を買って下さい
パラメータの探索
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/
2014年7月19日機械学習勉強会 27
これで、今日からデータサイエンティスト
・・・とは行かない
2014年7月19日機械学習勉強会 28
①データの入手
②データの前処理
③手法選択
④ハイパーパラメータ選択
⑥モデル評価
精度は十分か
⑤モデル学習
NO YES成功!
手法を変える
パラメタを変える
適切な手法の選択が
機械学習で最も重要かつ難しい問題
適切な手法の選択
2014年7月19日機械学習勉強会 29
Q:常に最適な手法ってあるの?
A:ありません
Q:どうやったら最適な手法を選べるの?
A:機械学習を体系的に学び、経験を積んで、更に運が必要
Q:詰んでない?
A:なんとかするのが、今日の議題
現状ベストアンサー:scikit-learnに任せる
2014年7月19日機械学習勉強会 30
『Scikit-learnにできる事』≒『自分にできること』これで最近は問題が無いことが多い
http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
実装の雰囲気
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
手法の種類
• Classification (分類)– ラベルをデータで学習して、ラベルを予測
• Regression (回帰)– 実数値をデータで学習して、実数値を予測
• Clustering (クラスタリング)– データを似ているもの同士を集めて、データの構造を発見
• Dimensional Reduction (次元削減)– データの次元を削減して、よりメタな要因を発見
(主成分分析は次元削減のひとつ)
– 削減した次元をデータにして他の手法を行う
(次元の呪い回避)
2014年7月19日機械学習勉強会 32
Classification (分類)• SVM (SVC, LinearSVC)
– 利点• 汎化性能が高く、少量のデータでもうまく学習出来る事がある• カーネルの組み合わせで様々データに対応できる
– 欠点• カーネル入れると遅い• 関数によっては、予測確率で出力できない
• K-近傍法 (NearestNeighbors)– 利点
• 単純な割に精度が高い– 欠点
• 予測時にもメモリに学習データを格納する必要がある
• ランダムフォレスト (RandomForestClassifier)– 利点
• 精度が高いことが多い• 並列計算しやすい• 過学習や、変数のスケールを考えずに、全て変数を入れて学習できる
– 欠点• ランダムフォレスト信者になりやすい
2014年7月19日機械学習勉強会 33
Classification (分類)
• 確率的勾配法による学習(SGDClassifier)
– これは手法でなく学習方法
– データが大きい時に、データを一部づつを見て
学習の計算をサボって高速化
– オプションで、SVMやロジスティック回帰が選択可能
2014年7月19日機械学習勉強会 34
Regression (回帰)
2014年7月19日機械学習勉強会 35
• 重回帰 (LinearRegression)– 利点 ・・・ 速い (パラメータ無し)
– 欠点 ・・・ Scikit-learnにstepwise法が無いので、使いにくい
• リッジ回帰 (Ridge)– 利点 ・・・ ラッソより速い、多重線形性の影響を受けにくい
– 欠点 ・・・ ラッソに比べて、変数選択力が弱い
• ラッソ回帰 (Lasso)– 利点 ・・・ 少ない変数でモデルを作ってくれる
– 欠点 ・・・ リッジよりは遅い、使わない変数があることを仮定している
• SVR (SVR)– 利点 ・・・ カーネルで非線形性を取り込める
– 欠点 ・・・ カーネルを入れると遅い
• ランダムフォレスト(RandomForestRegressor)– Classificationを参照 回帰では予測値が離散になる欠点がある
Clustering (クラスタリング)
• K-means法(KMeans)– 利点 ・・・ 速い MiniBatchKMeansは計算をサボってるので更に速い
– 欠点 ・・・ クラスタ数を最初に与えないといけない
• 階層的クラスタリング(AgglomerativeClustering)最近実装されたので表には無い
– 利点 ・・・ クラスタ数を後から色々変えられる
– 欠点 ・・・ 遅い、大きいデータは階層が表示出来ないことも
• 混合ガウス分布(GMM)– 利点 ・・・ 各クラスタの所属確率が出る。
– 欠点 ・・・ 正規分布を仮定する
• Mean Shift ( MeanShift )– 使用経験がないのでノーコメント 誰か教えて下さい
2014年7月19日機械学習勉強会 36
Dimensional Reduction (次元削減)
2014年7月19日機械学習勉強会 37
Scikit-learnのフローチャートに語れる手法があまりなかったので、私がよく使う手法を紹介
• 主成分分析(PCA)– 利点 ・・・ 速い 疎行列も扱える
– 欠点 ・・・ 裏で正規分布を仮定
• 非負値行列因子分解 (NMF)– 利点 ・・・ 要因の引き算を許さないことでより特徴を抽出できる事もある
– 欠点 ・・・ 非負行列限定
その他、LDAやDeep Learningなどなども