いわゆる古典的な機械学習についてあまり勉強したことがなかったので、足掛かりとして、アルゴリズムチートシートの理解から勉強を始めることにしました。このあと、kaggleに取り組みたいと考えています。
上記の機械学習アルゴリズムチートシートについて解説します。数式、コードは出てきません。直感的な理解を意識したので、間違っている可能性も結構あります。
主に以下の記事を参考にしました。
以下のリンクはscikit-learn公式による詳しい説明です。
http://scikit-learn: machine learning in Python — scikit-learn 0.19.1 documentation
説明の順番
1:[クラス分類(classification)]、教師あり学習
/SGD(Stochastic Gradient Descent)classifier
確率的勾配降下法と言います。データを識別平面で分けることを考えます。識別平面の係数を学習します。データを一つずつ学習するので確率的と言います。識別結果と教師データから損失関数を算出して、それを減少させるようにパラメータを更新します。損失関数のパラメータの勾配を求めて、それをパラメータから引いて、パラメータを更新するということを行います。だから、勾配降下法です。
/LinearSVC
SVMによる線形な(linear)Classificationという意味です。SVM(Support Vector Machine)を使って線形な識別平面を求めてクラス分類します。SVMとは識別平面と、各クラスの最も近いデータの距離を最大化することでパラメータを得る方法です。
/(kernel)SVC
順番が飛びますが先にSVCについて説明します。SVCとだけ言うと、基本的に、kernelSVCのことを指します。これは、高次元空間にデータを写像して、SVMする手法です。カーネルによって、高次元空間に明示的に訪れることなく、必要な計算が可能になります。
/カーネル近似(kernel approximation)
kernelSVCはデータ数が多いと計算コストが高すぎて使えません。それを乱数による近似で解決する手法です。細かい部分はよくわかりませんでした。
/K近傍法(K Neighbors Classifier)
識別したいデータから、近くにあるK点を選んで、その中で一番数が多いクラスに分類する手法です。
/Ensemble Classification、ランダムフォレスト
ここでは、一番よくあるアンサンブル学習としてランダムフォレストを説明します。
ランダムフォレストは決定木を使います。決定木はYESかNOで質問に答えて枝分かれすることを繰り返して分類します。ジニ不純度やエントロピーで誤差を測ってパラメータを調整します。各決定木は全データnからそれぞれ異なるデータmを用いて学習します。そうしてできた複数の決定木の多数決でクラス分類する手法です。
/ナイーブベイズ(Naive Bayes)
ニュース記事などのクラス分類に用いられる方法です。ナイーブとは各単語を独立であると仮定することを意味します。内閣というワードが含まれる記事は政治クラス、野球だったらスポーツクラスに分類される確率が高いです。クラス1の学習データよりクラス2の学習データにゲームという単語の出現回数が多かったら、テストデータでゲームという単語を含む記事はクラス1よりクラス2に分類される可能性が高いだろうということです。これを全部の単語に対して行います。こういった考え方を使ってベイズ推定する方法です。
ベイズ推定とは、最尤法に加えてベイズの定理をもとに事前確率も考慮して確率分布のパラメータを求める方法です。
/KMeans
予めクラスタ数がわかっている必要があります。アルゴリズムに基づいて、適当にクラスタ数分の中心点を生成します。各データを、最も近い中心点のクラスに分類します。分類した各クラスの重心を求めて、中心点とします。中心点が動かなくなるまで、クラス分類、中心点求める、を繰り返します。
/スペクトルクラスタリング
予めクラスタ数がわかっている必要があります。データのつながりを考えて、グラフで表現します。このグラフを行列で表現します。こうしてできたグラフ行列をスペクトル分解と呼ばれる固有値分解のようなことをして、グラフ行列の固有値ベクトルを求めます。この固有値ベクトルを結合してできた固有値ベクトル行列をKMeansでクラスタリングします。
/GMM
予めクラスタ数がわかっている必要があります。KMeansと同じことをガウス分布で行います。これらの手法をEMアルゴリズムと言います。クラスタ数分の分布を適当に決めます。最も所属する確率の高い分布に各データを分類します。各分類されたデータを生成する確率の最も高い分布を求めます。分類、分布生成を変化がなくなるまで繰り返します。分布の推定には最尤法を使います。
最尤法とは、観測されたデータの確率の積(尤度)を最大化して、データを説明する確率分布のパラメータを求める方法です。
/MeanShift
予めクラスタ数がわからなくてもよいです。クラスタ数を指定せずにKMeansを行う方法です。既定の距離より近くなったクラスタは合体して1つにします。
/VBGMM
変分ベイズとGMMを合わせたような方法です。クラスタ数はベイズ推定で求めます。分布の推定にはベイズ推定を使います。
/SGD Regressor
分類のsgdとやっていることは同じです。誤差の指標となる損失関数の減少を目指します。損失関数のパラメータの勾配によって、パラメータを更新します。
/Lasso
損失関数にL1ノルムを加えて、パラメータを学習する方法です。パラメータはスパースになりやすいです。
ノルムについて説明します。特定の点からある点までの距離を表すのがノルムです。L2ノルムは各データのノルムを2乗した値の和です。L1ノルムは各データのノルムの絶対値の和です。
/Ridge
損失関数にL2ノルムを加えて、パラメータを学習する方法です。
/ElasticNet
損失関数にL1ノルムとL2ノルムを加えて、パラメータを学習する方法です。それぞれに係数をかけて影響を調節します。
/linearSVR
SVMで線形に回帰します。回帰直線とデータの誤差の最小化でパラメータを学習します。特徴は一定距離まで誤差を考慮しないことです。
/SVR
カーネルを利用して高次元空間にデータを写像してSVMで回帰します。
/Ensemble Regressors
分類と同様にランダムフォレストがよく使われます。ランダムフォレストで、分類と同じことを回帰でします。
/PCA
主成分分析と言います。分散が大きい方向を見つけて、その方向に新しい
軸を設定する方法です。この時、固有値分解を使います。
/kernelPCA
カーネルを使って非線形変換してから、PCAを使う方法です。
/Spectral Embedding
スペクトラルクラスタリングとしていることは同じです。データのつながりを意識して、グラフ行列を作り、これを固有値分解して、固有値ベクトルを得ることで、次元を圧縮します。
/Isomap
3次元空間上のデータを考えるとき、そのデータがとある平面上(多様体)に分布していたとすると、そのデータは2次元で表すことができます。これと同じ事をn次元で行います。
/LLE
多様体の考え方を使うのは、Isomapと同じです。それに加えて、拘束条件が加わるみたいです。
1:K-fold cross validatio
データをk個のグループに分けます。k-1個のグループのデータでパラメータを推定して、残りの1つで検証します。これをk回繰り返す方法です。
2:XGBoost
まず、GB(Gradient Descent)について説明します。GBとは複数の弱学習器を使ってアンサンブル学習するときにパラメータの更新に勾配降下法を使う手法です。ブースティングは弱学習器を1つずつ順番に構築することを意味します。
上記のGBとランダムフォレストを組み合わせた手法です。弱学習器として
決定木を用いるということです。
またXGBoostではGBではなくて後述のNewtonBoostingを使うこともあるそうです。
NewtonBoostingとは勾配降下法ではなく、ニュートン法を用いて学習する手法です。
ニュートン法は、接線による近似を繰り返す方法です。
3:グリッドサーチ
ハイパーパラメータを最適化する方法です。
組み合わせを全部試してみて、一番良いハイパーパラメータを決定します。
以上です。機械学習の手法について何となくわかりました。
アドバイス、改善点があればお願いします。