LoginSignup
0
0

More than 3 years have passed since last update.

【ラビットチャレンジ】要点のまとめ - 機械学習 その4

Last updated at Posted at 2020-06-12

1. はじめに

本記事はJDLA E資格の認定プログラム「ラビットチャレンジ」における機械学習のレポート記事である。
本記事では機械学習における「主成分分析」について要点をまとめている。

【ラビットチャレンジ】要点のまとめ - 機械学習 その1
【ラビットチャレンジ】要点のまとめ - 機械学習 その2
【ラビットチャレンジ】要点のまとめ - 機械学習 その3
【ラビットチャレンジ】要点のまとめ - 機械学習 その4
【ラビットチャレンジ】要点のまとめ - 機械学習 その5
【ラビットチャレンジ】要点のまとめ - 機械学習 その6

2. 主成分分析

2.1. 主成分分析

多変量(高次元)データの持つ構造をより少ない変量(次元)の指標に圧縮(次元圧縮)するための分析手法。
高次元を2次元や3次元に圧縮できると可視化できるようになる。

次元数は計算時間に直結するため、主成分分析で次元を落とすのは戦略として効果的。
深層学習では次元圧縮にはオートエンコーダを用いる。
場合に合わせて主成分分析とオートエンコーダの使い分けが必要になる。
 

学習データ:$ \smash{ \boldsymbol{x}_{i} = (x_{i1}, x_{i2}, ... , x_{im}) \in \mathbb{R}^{m} } $

平均(ベクトル):$ \smash{ \bar{\boldsymbol{x}} = \dfrac{1}{n} \sum_{i=1}^{n}\boldsymbol{x}_{i} } $

データ行列:$ \smash{ \bar{\boldsymbol{X}} = (x_{1} - \bar{x}, x_{2} - \bar{x}, ... , x_{n} - \bar{x})^{T} \in \mathbb{R}^{ n \times m} } $

分散共分散行列:$ \smash{ \Sigma = Var(\bar{\boldsymbol{X}}) = \dfrac{1}{n}\bar{\boldsymbol{X}^{T}}\bar{\boldsymbol{X}} } $

線形変換後のベクトル:$ \smash{ \boldsymbol{s}_{j}=(s_{1j}, \cdots ,s_{nj})^{T} = \bar{\boldsymbol{X}} \boldsymbol{a}_{j} } $   $ \boldsymbol{a}_{j} \in \mathbb{R}^{m} $

線形変換後の分散:$ \smash{ Var(\boldsymbol{s}_{j}) = \dfrac{1}{n}\boldsymbol{s}_{j}^{T}\boldsymbol{s}_{j} = \dfrac{1}{n}(\bar{\boldsymbol{X}}\boldsymbol{a}_{j})^{T}(\bar{\boldsymbol{X}}\boldsymbol{a}_{j}) = \dfrac{1}{n}\boldsymbol{a}_{j}^{T}\bar{\boldsymbol{X}}^{T}\bar{\boldsymbol{X}}\boldsymbol{a}_{j} = \boldsymbol{a}_{j}^{T} Var(\bar{X})\boldsymbol{a}_{j} } $

$ \qquad m $:学習データの次元数。
$ \qquad n $:学習データの数。
$ \qquad i $:説明変数の参照インデックス。$1~n$の間をとる
$ \qquad \boldsymbol{a} $:係数ベクトル
$ \qquad j $:射影軸のインデックス

2.2. ラグランジュ関数

ラグランジュ関数:$ \smash{ E(\boldsymbol{a}_{j}) = \boldsymbol{a}_{j}^{T} Var(\bar{X})\boldsymbol{a}_{j} - \lambda(\boldsymbol{a}_{j}^{T}\boldsymbol{a}_{j} - 1) } $

$ \qquad \boldsymbol{a}_{j}^{T} Var(\bar{X})\boldsymbol{a}_{j} $:目的関数
$ \qquad \lambda(\boldsymbol{a}_{j}^{T}\boldsymbol{a}_{j} - 1)$:制約条件。解が無限に出るのを抑止し、一意に定めるためのもの

ラグランジュ関数を最大にする係数ベクトル$ \boldsymbol{a}_{j} $を探索する。
 →ラグランジュ関数を微分して0になる点を導出する。

ラグランジュ関数の微分:$ \smash{ \dfrac{\partial E(\boldsymbol{a}_{j})}{\partial \boldsymbol{a}_{j}} = 2 Var(\bar{X})\boldsymbol{a}_{j} -2 \lambda \boldsymbol{a}_{j} = 0 } $

 →解:$ Var(\bar{X})\boldsymbol{a}_{j} = \lambda \boldsymbol{a}_{j} $  このとき$\boldsymbol{a}_{j}$は元のデータの分散共分散行列の固有ベクトル

2.3. 寄与率・累積寄与率

寄与率:「第$k$成分の分散」の全分散に対する割合(第$k$主成分が持つ情報量の割合)
累積寄与率:第$1$主成分~第$k$主成分までの圧縮した際の情報量の、全情報量に対する割合

3. ハンズオン

3.1. 課題

乳がん検査データからロジスティック回帰モデルを作成し、主成分を利用して2次元空間上に次元圧縮する。
このとき2次元空間上に次元圧縮してもうまく判別できるかどうかを確認する。

3.2. 演習結果

3.2.1. Google Driveのマウント・必要なモジュールのインポート

04_skl_principal_component_analysis_01_01.jpg

3.2.2. データの読み込み

csvファイルから乳がん検査データを読み込む
04_skl_principal_component_analysis_02_01.jpg
不要なデータ(カラム)の削除
NaNが入っている「Unname: 32」を削除する。
04_skl_principal_component_analysis_03.jpg

3.2.3. ロジスティック回帰モデルの作成

そのまま実行したときlogistic = LogisticRegressionCV(cv=10, random_state=0)で以下の警告が発生した。
ConvergenceWarning: lbfgs failed to converge (status=1):STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

以下のようにLogisticRegressionCV関数に引数max_iter=1000を加え、イテレータ上限をデフォルトの100から1000に変更したら改善された。

参考:3.2.4.1.5. sklearn.linear_model.LogisticRegressionCV -- scikit-learn 0.23.1 documentation

「目的変数:診断結果(diagnosis)(良性:0, 悪性:1)」および「説明変数:腫瘍の平均半径(radius mean)」で学習。
04_skl_principal_component_analysis_04_01.jpg
決定係数が0.972と非常に高く、混合行列を見ても精度が非常に高いことがわかる。

3.2.4. 30次元のときの主成分の確認

04_skl_principal_component_analysis_05.jpg
30次元のときの主成分の寄与率を降順にソート、グラフ化してみると、大半は第1主成分、第2主成分であることがわかる。

3.2.5. 2次元まで圧縮した場合の確認と検証

第1主成分、第2主成分の寄与率はそれぞれ「0.4331」「0.1958」
累積寄与率は「0.6290」
良性・悪性をそれぞれプロットしてみると、30次元を2次元にしても比較的分かれていることがわかる。
04_skl_principal_component_analysis_06.jpg
第3主成分が「0.1弱」なので、3次元に圧縮した場合、累積寄与率は「0.7強」となると思われる。
三次元空間までであれば視認できるかたちでプロットできるので、第3主成分まで使用してもいいかもしれない。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0