今回は機械学習について基礎的な重要項目のまとめを行ったので紹介していきます😃
本記事の解説は、各種モデルの数学的な理解を目的としています。
E資格の認定プログラムであるラビットチャレンジの講義や、書籍である機械学習のエッセンスを参考に記載しています。目次の中で★のついた項目は、私の中で特に重要な学びを得られた部分なので重点的に説明を行います。
機械学習の理論を理解するにあたって応用数学に不安のある方は、この記事より先に以下の記事を読んでもらえると機械学習で必要となる基礎部分をある程度抑えることが出来るかと思います。
★線形回帰モデル
定義
線形とは、簡単に言うと比例のことです。回帰は、連続値の予測を行うことです。
線形回帰モデルを、方程式表記・行列表記の両記法で理解できるようにする必要があります。 特に行列表記は、私を含む多くの人にとって今まで最も目に触れる機会の少ない表記法であると思います。
方程式表記と行列表記を頭の中で行き来できるようにしておくと、今後の学習で計算の理解に非常に役に立ちそうです。
方程式表記
yがターゲット変数、xが説明変数、wが回帰係数になっています。
1つ目の式のみに注目すると以下の様にベクトルで表すことが出来ます。
方程式の全体に対しては、以下の様に行列で表現することができます。
行列表記
学習
学習フェーズにおいては、やといったパラメータは、学習データから得られる既知のものであり、一方、パラメータは未知のものです。学習を行うというのは、最適な未知のパラメータを求めることに他なりません。
最適なwを求めるための最も一般的なのは、損失関数として平均二乗誤差 (Mean Squared Error; MSE)を用い、MSEが最小になるを選択するという方法です。線形モデルの場合は、MSEは下に凸の2次式であるため、MSEが最小となるを解析的に求めることができます。
MSEをで偏微分したものが0となるを求めることは、MSEが最小となるを求めることと同義です。
機械学習の様に変数が多数存在する場面では、式(6)を行列を用いて解くのが効率が良いです。行列を使って式(6)を解く方法を丁寧な式展開で以下に示します。解くというのは、ここでは回帰係数行列を求めることを意味しています。
以上より、回帰係数行列を以下の式(7)で求めることが出来ます。
今回は損失関数にMSEを使いました。しかし、必ずしもMSEを使わなければいけないわけではいけません。
損失関数の選択
今回の様に損失関数にMSEを用いた場合には、2乗している分、外れ値の影響を強く受けることになります。外れ値を取り除くことができない場合には、Robustな損失関数としてHuber損失などを使うこともできます。 Huber損失とは、損失が大きいとMAEの様に1次形式をとり、損失が小さいとMSEと同様の2次形式をとる損失関数です。
予測
式(3), (7)より、以下の式(8)にて予測値を得ることが出来るようになります。
実装
損失関数にMSEを用いて単回帰分析と重回帰分析を実装しました。重回帰分析には、上で説明してきた行列の計算を用いて学習および予測を行っています。
非線形回帰モデル
以下のグラフを直線で近似するのが無理があるように、非線形な構造を内在する現象に対して直線/超平面でデータ構造を捉えることは出来ません。
そこで、線形回帰モデルを非線形性に対応させる方法である基底展開法を説明していきます。 基底展開法とは、基底関数と呼ばれる既知の非線形関数によって説明変数を非線形変換した値とパラメータベクトルの線形結合を回帰関数として用いる方法です。
このように、非線形モデルによって回帰タスクを解くことを、非線形回帰と呼びます。
実際に存在する線形回帰モデルとの違いは、線形回帰でいう行列Xを非線形変換した行列Φ(x)に置き換えてあげるだけです。以下の実装によって実例を見ていきます。
実装
関数で作成された値を、3次関数を既定関数とした非線形モデルにて学習/予測するモデルを実装しました。上述した行列計算を用いない方法での線形回帰モデルの式の導出についても、この中で説明しています。
ロジスティック回帰モデル
ロジスティック回帰は、上で説明してきた線形回帰を回帰ではなく分類に用いる機械学習モデルです。以下にその構造を示します。
上の図の通り、線形回帰モデルの出力である連続値をシグモイド関数を通してになる確率を得ることが出来ます。
線形回帰モデルにおいて損失関数にMSEを用いた場合にはが0になるを解析的に求めることが出来ましたが、ロジスティック回帰モデルにおいて損失関数に対数尤度関数を用いた場合には対数尤度関数のに関する偏微分が0となる値を解析的に求めることは困難です。
解析的に求めることが難しい場合には、勾配降下法(Gradient descent)を用いて数値的に解を求めるのが機械学習の基本的な考え方です。
勾配降下法
数値的に解を求める代表的な方法として勾配降下法(最急降下法)があります。勾配降下法の仕組みは2変数関数を3次元空間で表現してみるとイメージしやすいと思います。
上の3次元表示のグラフは、との変化に応じて軸方向の値が変化することで3次元の形状が表現されています。
となるとき、いくつかのパターンを同時に平面に描画すると、等高線を得ることが出来ます。山が2つ存在するような2変数関数の等高線を同時に描画したイメージを以下に示します。
上記の図は、勾配降下法により以下の流れで局所最適解を求めている様子を表しています。
- 初期値として最初の点(今回は図の下の方)を選ぶ
- 点とが等しい等高線に対する接線の法線ベクトルを求める(は勾配が最も大きい方向を指す)
- 法線ベクトルと3次元図形の交点のうち、関数値が最大or最小となる点を求める(直線探索と呼ばれる)
- 更新される長さが一定値以下になるまで2から3までを繰り返す
実装
ロジスティック回帰による二値分類を実装しました。この中では、行列計算を使ってロジスティック回帰の学習/予測を行うための式の導出についても説明しています。
主成分分析(PCA)
主成分分析(PCA)とは、教師無し学習の1種です。多変量データを低次元空間に射影することで次元圧縮することが出来ます。圧縮時には、情報の損失をなるべく小さくするために射影後の点の散らばりが出来るだけ大きくなるように考慮されます。つまり、次元圧縮後の分散を最大化するという最適化問題になっています。
以下の実装にて、式の導出と共に説明を行います。
実装
k近傍法(kNN)
k近傍法は、距離指標に基づいて訓練データの中から分類したいデータ点に最も近いk個のサンプルを抽出し、その中の多数決によってクラスラベルを決定するというアルゴリズムで、教師無し学習の1つです。
訓練データから、入力とクラスラベルを対応付ける判別関数を学習せずに訓練データセットを暗記するような動作を取るため、怠惰学習(lazy leaner)の代表例として知られています。
以下の実装では、距離指標にユークリッド距離を用いて学習と予測を行っています。
実装
k-means
k-meansとは、教師無し学習であるクラスタリングアルゴリズムの中でもっともよく知られているアルゴリズムの1つです。実行にはクラスタの個数$k$を指定する必要があります。k-meansが最も効果的なのは球状または円状ののクラスタの識別です。
以下の実装では、k-meansの仕組みの説明も併せて行います。
実装
SVM
2種類のラベルの付いたデータを超平面で分割する超平面を学習により設定することで、新しく加わったデータを超平面を境界にして2種類のラベルのどちらかに分類するという教師学習モデルの1つです。
超平面と最も近いデータをサポートベクタと呼び、サポートベクタと超平面の距離をマージンと呼びます。データを学習するということは、マージンを最大化する超平面を更新していくことを意味します。
実装
以下の3種類のSVMについて、数学的な説明とPythonによる実装を示します。
- 元のデータ空間において、線形分類可能で、データに重なりがない場合に利用できるハードマージンSVM
- 元のデータ空間において、線形分類可能不可能で、データに重なりがない場合に利用できるハードマージンSVM+カーネル法
- 元のデータ空間において、線形分類可能で、データに重なりがある場合に利用できるソフトマージンSVM
未学習/過学習
主に教師あり学習を想定して、未学習および過学習それぞれについての対策についての概要を示します。
未学習 (Underfitting) | 過学習 (Overfitting) | |
---|---|---|
対策1 | 訓練時間を延ばす | 訓練時間を短くする |
対策2 | 表現力の高いモデルを採用する | 不要な既定関数(変数)を削除し表現力を抑制する |
対策3 | 正則化のペナルティを小さくする | 正則化法を利用して表現力を抑制する |
対策4 | 訓練データを増やす |
参考文献
- 機械学習のエッセンス
- 機械学習の数学的な理解に必要となる「数学」自体の解説から「機械学習」の解説までがこれ1冊で済んでしまうという初心者にとてもありがたい1冊です。E資格講座の解説だけでは理解できなかった部分をこの本にずいぶんと助けられました。
- Python機械学習プログラミング 達人データサイエンティストによる理論と実践
- 理論と合わせてPythonコードが豊富に掲載されているため、機械学習モデルを自分で実装してみるにはうってつけです。
最後に
今回は機械学習の基礎的なアルゴリズムについての理論の理解にフォーカスして記事をまとめてみました。実装も載せていますが、あくまでメイントピックは理論の学習としています。
理解に時間がかかる部分は、だいたいシグマで総和を取る表記と行列演算の書き換え部分だということが自分の中で見えてきました。その部分だけに注目した記事を書いてみても良いかと思っています。
今回の記事はここまで。Kazuki Igetaでした😃