読者です 読者をやめる 読者になる 読者になる

Python機械学習プログラミングを読んで覚えておきたいと思ったこと

1章 「データから学習する能力」をコンピュータに与える

クラスタリングとクラス分類の違い

2章 分類問題 機械学習アルゴリズムのトレーニング

なぜコスト関数を使うのか?

単位ステップ関数ではなく、コスト関数を導入する理由は、コスト関数が微分可能であるから。 コスト関数の別の利点は、凸関数であることである。 これらの特徴から勾配降下法が使える。

3章 分類問題 機械学習ライブラリscikit-learnの活用

ノーフリーランチ定理(no free lunch theorem)とは?

David H. WolpertとWilliam G. Macreadyが、組み合わせ最適化の全ての問題に対して最良な最適化方法は存在しないことを主張した定理。
機械学習では、データの分布などに関する事前知識がなければ、どの問題に対しても最良のアルゴリズムが存在しないという意味で使われる。

条件付き確率(conditional probability)とは?

条件が与えられたときに、事象が生じる確率(=事後確率)。
ここでは、条件として特徴量{x}が与えられているときに、クラスラベルが{y}となる事象の条件付き確率を{p(y | x)}と表記している。
クラスラベルが特定の値となるときの条件付き確率は、{p(y=1 | x)}のようにクラスラベルの値を明示している。

ロジスティック回帰の直観的知識

事象の起こりやすさを示す、オッズ比(odds ratio)は{\frac{p}{1-p}}と表せる。
ロジット関数を次のように定義してみる。 {} $$ logit(p) = log \frac{p}{1-p} $$

ロジット関数は0より大きく1より小さい範囲の入力値を受取り、実数の全範囲に変換する。
この関数を用いて、特徴量の値と対数オッズの関係を表せる。 {} $$ logit(P(y=1|x)) = w_0 x_0 + w_1 x_1 + \ldots + w_m x_m = \sum_{i=0}^{m} w_i x_i = w^T x $$

ここで左辺の{p(y=1|x)}は特徴量xが与えられた場合にサンプルが分類クラス1に属するという条件付き確率である。
さて、私たちの関心があるのは、サンプルが特定のクラスに属している確率を予測することであるので、ロジット関数の逆関数をとる。
これがロジスティック関数である。シグモイド関数とも呼ばれる。
{} $$ \phi(z) = \frac{1}{1 + e^{-z}} $$ $$ z = w^T x $$

なおロジスティック回帰は、線形分類問題と二値分類問題に対する単純ながら強力なアルゴリズムであり、その名前と裏腹に、回帰ではなく分類のためのモデルである。

今後は{y=0,1}の二値分類問題という前提で進める。
さて、{y=0}のときの条件付き確率と{y=1}のときの条件付き確率は次のように表せる。
{} $$ \begin{array}{} P(y=1|x;w) = \phi(z) \\ P(y=0|x;w) = 1- \phi(z) \end{array} $$ 上式をまとめることができる。 {} $$ P(y|x;w) = (\phi(z))^{y} (1 - \phi(z))^{1 - y} $$

上のまとめ方は、{y}の取りうる値が0か1しかないことを利用している。
各サンプルについての条件付き確率を掛け合わせて尤度関数を次のように定義できる。 {} $$ L(w) = P(y^{(i)}|x^{(i)};w) = \prod_{i=1}^n (\phi(z^{(i)}))^{y^{(i)}} (1 - \phi(z^{(i)}))^{1 - y^{(i)}} $$

扱いやすいようにこの式の対数をとる。 {} $$ l(w) = log L(w) = \sum_{i=1}^n y^{(i)} log(\phi(z^{(i)})) + (1 - y^{(i)}) log (1 - \phi(z^{(i)})) $$

さらに全体をマイナス化して、最小値問題とする。 {} $$ J(w) = \sum_{i=1}^n - y^{(i)} log(\phi(z^{(i)})) - (1 - y^{(i)}) log (1 - \phi(z^{(i)})) $$

SVMの直観的知識

SVM(Support Vector Machine)は広く利用されている学習アルゴリズム
SVMの最適化の目的は、マージンを最大化すること。
マージンは、超平面(決定境界)と、この超平面に最も近いトレーニングサンプルとの間の距離として定義される。
超平面に最も近いトレーニングサンプルはサポートベクトル(support vector)と呼ばれる。

決定境界に沿った正と負の超平面を詳しく見る。
これらの超平面は下記のように表せる。
{} $$ w_0 + w^T x_{pos} = 1 \\ w_0 + w^T x_{neg} = -1 $$ これらの式を引き算する。 {} $$ w^T (x_{pos} - x_{neg}) = 2 \\ $$ この式を重み{w}の大きさで割った式を考える。 {} $$ \frac{w^T (x_{pos} - x_{neg})}{||w||} = \frac{2}{||w||} \\ $$ この式の左辺は、正の超平面と負の超平面の距離とみなせる。
したがって、この距離を最大化することをめざす。
ただし問題を変換して、{\frac{1}{2} ||w||^2}を最小化する問題と置き換える。

さらに、スラック変数{\xi}を導入して、線形制約を緩和することを考える。
緩和された制約は下記のようになる。
{} $$ \begin{array}{} w^T x^{(i)} \geq 1 - \xi^{(i)} & (y^{(i)} = 1) \\ w^T x^{(i)} < -1 + \xi^{(i)} & (y^{(i)} = -1) \end{array} $$

このとき、最初化すべき式は下記のように変更される。 {} $$ \frac{1}{2} ||w||^2 + C (\sum_{i} \xi^{(i)} ) $$ あとは変数Cを使ってご分類のペナルティを制御する。 Cが大きいときは、ご分類のペナルティが大きいことを意味し、Cの値が小さいときはご分類に対して寛大であることを意味する。

カーネルSVMの利用

線形分離できないデータを処理するカーネル手法というものがある。 基本的な発想は、射影関数 {\phi}を使ってそれらの組み合わせを高次元空間へ射影し、線形分離できるようにすることである。

決定木学習

決定木モデルでは、トレーニングデータセットの特徴量に基づいて一連の質問を学習し、サンプルのクラスラベルを推測する。
決定木では、情報利得(information gain)が最大となる特徴量でデータを分割する。
その際の目的関数は以下のように定義される。

{} $$ IG(D_p, f) = I(D_p) - \sum \frac{N_j}{N_p} I(D_j) $$

ここで、{f}は分割を行う特徴量。{D_p}は親のデータセット{D_j}はj番目の子ノードのデータセット
{I}は不純度を数値化したもの。
結局この式が表すのは、「親ノードの不純度」と「子ノードの不純度全体の」差に過ぎない。
不純度は以下の3つの指標がよく使われる。

  • ジニ不純度(Gini impurity)
  • エントロピー(entropy)
  • 分類誤差(classification error)

ランダムフォレスト

直観的にはランダムフォレストは決定木のアンサンブルとみなせる。 アルゴリズムは以下の4つの単純なステップにまとめられる。

  1. 大きさnのランダムな「ブートストラップ」標本を復元抽出する
  2. ブートストラップ標本から決定木を成長させる
    • d個の特徴量を非復元抽出する
    • たとえば情報利得を最大化することにより、目的関数に従って最適な分割となる特徴量を使ってノードを分割する
  3. ステップ1~2をk回繰り返す
  4. 決定木ごとの予測をまとめて、「多数決」に基づいてクラスラベルを割り当てる。

怠惰学習(lazy learner)とは?

トレーニングデータセットから識別関数を学習せず、トレーニングデータセットを暗記する学習。

パラメトリックモデルとノンパラメトリックモデル

パラメトリックモデルでは、トレーニングデータセットからパラメータを推定する。 それにより元のトレーニングデータセットがなくても新しいデータ点を分類できるようになる。 パーセプトロン、ロジスティック回帰、線形SVMパラメトリックモデルの典型例である。

対照的にノンパラメトリックモデルの場合は、固定のパラメータ集合で特徴づけることはできない。 パラメータの個数はトレーニングデータセットとともに増加する。 ノンパラメトリックモデルの例は、決定木・ランダムフォレスト、カーネルSVMなど。

k近傍法

kNNのアルゴリズムは次のステップからなる。

  1. kの値と距離指標を選択する
  2. 分類したいサンプルからk個の最近傍のデータ点を見つけ出す
  3. 多数決によりクラスラベルを割り当てる

scikit-learnのIrisデータセットの構造

3種の分類クラス(Setosa, Versicolour, Virginica)からなる150のデータが、
150x4 numpy.ndarray構造に記録されている。 すなわち特徴の次元は4(Sepal Length, Sepal Width, Petal Length, Petal Width)である。

(参考) The Iris Dataset — scikit-learn 0.18.1 documentation 第18回 ロジスティック回帰:機械学習 はじめよう|gihyo.jp … 技術評論社

4章 データ前処理 よりよいトレーニングセットの構築

one-hotエンコーディング

名義特徴量の列の一意な値ごとにダミー特徴量を新たに作成する。 たとえば、color特徴量にblue, green, redという3つがあったとき、 これらを表す3つの新たな特徴量に変換する。 青のサンプルは、blue=1, green=0, red=0といったように。

過学習の原因と対策

過学習の原因は、与えられたトレーニングデータセットに対してモデルが複雑すぎること。 それに対する対策として、以下の方法がある。

  • 更に多くのトレーニングデータを集める
  • 正則化を通じて複雑さにペナルティを課す
  • パラメータの数が少ない、より単純なモデルを選択する
  • データの次元の数を減らす

L1正則化による疎な解

ペナルティの与える方法によって、L1正則化とL2正則化がある。 {} $$ L1: ||w||_{1} = \sum_{j=1} |w_j| $$ {} $$ L2: ||w||_{2} = \sum_{j=1} w_{j}^{2} $$ L1正則化を課すと、重みが疎となる傾向がある。 つまり殆どの重みが0となる。 この疎性が役立つのは、無関係な特徴量の個数が多い高次元のデータセットがあるときである。

L1正則化が疎性を促す様子を確かめるために、 L1正則化とL2正則化をそれぞれ図解してみる。

L2正則化の場合、目標はコストとペナルティの最小化を目指すことである。 f:id:yusuke_ujitoko:20170228082737p:plain

一方、L1正規化の場合、ペナルティがひし形を示すため、最適解は軸上にあることが多い。そのため疎性が促進される。 f:id:yusuke_ujitoko:20170228082838p:plain

5章 次元削減でデータを圧縮する

特徴抽出

特徴抽出(feature extraction)はデータセットを変換し、元の次元よりも低い次元の新しい特徴部分空間(feature subspace)を作成するものである。 例えば以下のようなものがある。

  • 主成分分析(PCA)
  • 線形判別分析(LDA)
  • カーネル主成分分析

主成分分析(Principal Component Analysis)

PCAの目的は、高次元データにおいて分散が最大となる方向を見つけ出し、元の次元と同じかそれよりも低い次元の新しい部分空間へ射影すること。

PCAのアルゴリズムの手順は以下のようになる。

  1. d次元のデータセットを標準化する
  2. 標準化したデータセットの共分散行列を作成する
  3. 共分散行列を固有ベクトル固有値に分解する
  4. 最も大きい固有値に対応するk個の固有ベクトルを選択する この場合のkは新しい特徴部分空間の次元数を表す
  5. 上位k個の固有ベクトルから射影行列Wを作成する
  6. 射影行列Wを使ってd次元の入力データ・セットXを変換し、新しいk次元の特徴部分空間を取得する

線形判別分析(LDA:Linear Discriminant Analysis)

LDAとPCAはどちらも線形変換法であるが,以下の違いがある.

  • PCA
    • データセットにおいて分散が最も大きい直交成分軸を見つけ出そうとする
    • 教師なし学習
  • LDA

    • クラスの分離を最適化する特徴部分空間を見つけ出そうとする
    • 教師あり学習
  • d次元のデータセットを標準化する

  • クラスごとにd次元の平均ベクトルを計算する
  • クラス感の変動行列 {S_B} と,クラス内変動行列 {S_W} を生成する
  • 行列 {S_W^{-1} S_B}固有ベクトルと対応する固有値を計算する
  • d*k次元の変換行列 {W} を生成するために,最も大きいk個の固有値に対応するk個の固有ベクトルを選択する.固有ベクトルはこの行列の列である.
  • 変換行列 {W} を使ってサンプルを新しい特徴部分空間へ射影する.

6章 モデルの評価とハイパーパラメータのチューニングのベストプラクティス

ホールドアウト法

ホールドアウト法は、機械学習のモデルの汎化性能を評価するために従来より使用されているアプローチ。 データを訓練データ、検証データ、テストデータの3つに分割する。

f:id:yusuke_ujitoko:20170305123424p:plain

ホールドアウト法の問題点は、もとの訓練データを訓練データと検証データにどのように分割するかにより、性能の評価に影響が及ぶことである。 つまりデータのサンプルで評価が変わってきてしまう。

k分割交差検証

k分割交差検証では、非復元抽出を繰り返して、訓練データをランダムにk個に分割する。そのうちのk-1個をモデルの訓練に使用し、1個をテストに使用する。 この手順をk回繰り返すことで、k個のモデルと性能評価を取得する。

グリッドサーチ

グリッドサーチとはハイパーパラメータの最適化手法。 ハイパーパラメータの最適な組み合わせを見つけ出すことにより、モデルの性能を改善するのに役立つ。

網羅的探索手法であるため、パラメータの組み合わせを見つけるには効果的だが、 実際には計算コストが高い。 (そこで、ランダムサーチという手法もある)

入れ子式の交差検証

グリッドサーチと組み合わせてk分割交差検証を使用する方法ではハイパーパラメータの値を変化させて、モデルの性能が最良となるパラメータを決められる。 しかし、さまざまな機械学習アルゴリズムの中からどれかを選択したい場合は、入れ子式の交差検証が推奨される。

入れ子式の交差検証では、 ループが2層になっている。 外側のループでアルゴリズムの比較を行い、 内側のループで各アルゴリズム内でのパラメータチューニングを行っている。