機械学習初心者が『Pythonではじめる機械学習』についてまとめてみた。 【3章 教師なし学習と前処理】

#教師なし学習とは、、、？
　**教師なし変換**と**クラスタリングアルゴリズム**が存在する。前者はデータ表現の変換によってわかりやすいデータ表現を新たに作り出すもので後者はデータをグループ分けするものである。教師データなしとか学習できなくね？正しいかわかんなくね？って思ってたら実際そうっぽくて結果の評価は人間がしなきゃらしい。そんな理由で、教師なし学習のアルゴリズムはそれ単体で使うよりも、教師あり学習の前処理に使うなどしてシステムの一部に**組み込む**ことで精度や計算時間などを向上させるために使うみたい。
　【2章 教師あり学習】ときたら【3章 教師なし学習】やろ！**と前処理**ってなんなんだよ！て思ったらそういう訳で。

#前処理とスケール変換
　ニューラルネットワークやSVMなどのアルゴリズムはデータのスケール変換に非常に敏感（大きい値のが大きく影響するしね）なので、基本的にアルゴリズムにあったデータ表現に変換されます。

##前処理の種類
`StandardScaler`　個々の特徴量の平均が0で分散が1になるように変換。最大値、最小値の範囲に制限なし。
`RobustScaler`　平均値と分散の代わりに中央値と四分位数を用いて変換。外れ値を無視。
`MinMaxScaler`　データが0から1の間に収まるように変換。
`Normalizer`　個々のデータポイントの特徴量ベクトルがユークリッド長1になるように変換。

#教師なし変換
　教師なし変換には様々な目的があり、最も一般的なものは可視化、データの圧縮、以降の処理に適した表現の発見である。**主成分分析（PCA）**はこれらすべてに用いられ、**非負値行列因子分解（NMF）**は主に特徴量抽出に、**t-SNE**は主に2次元散布図を用いたデータの可視化に用いられる。

##主成分分析（PCA）
```python
from sklearn.decomposition import PCA
```

　まず、データセットの中で最も分散が大きい（＝最も情報を持っている）方向を見つけ、**第1成分**というラベルをつける。次に、第1成分と直交する方向の中で最も分散が大きい方向を見つけ、**第2成分**というラベルをつける。以上のようにして見つけていく方向を**主成分**と呼ぶ。このため、一般には特徴量と同じ数だけ主成分が存在する。（行列のrank的に示せる、よね？）
　第1主成分から降順に情報を持っているため、次元削減することにも利用できる。また、最も一般的な応用は高次元データセットの可視化である。個々の特徴量ごとよりも、PCAを用いることで、主な相関を捉えることができるため、全体像が見やすくなる。

`n_components`　抽出する主成分の数。
`whiten`　データを回転だけでなく円を描くように変換できる。

##非負値行列因子分解（NMF）
```python
from sklearn.decomposition import NMF
```

　係数と成分が非負であることが求められる。複数の独立した発生源から得られたデータに対して特に有効で、組み合わされたデータを作り上げているもとの成分を特定できる。このため、PCAよりも理解しやすい成分に分解できる。（負の成分、係数がなく、打ち消し合いによる理解しづらい挙動がなくなるため。）成分の数が変わると、まったく別の成分の集合が構成され、すべての成分は同等に扱われる。

`n_components`　抽出する成分の数。

##t-SNE
```python
from sklearn.manifold import TSNE
```

　多様体学習アルゴリズムの一つである。多様体学習アルゴリズムは、主に可視化に用いられ、3個以上の新たな特徴量を生成することはほとんどない。また、一部（t-SNEも）は訓練データの新たな表現を計算するが、新たなデータを変換することはできない。（＝テストセットへの適用ができない。）
　まずランダムな2次元表現を作り、もとの特徴空間で近いデータポイントを近くに、遠いデータポイントを遠くに配置しようとする。つまり、点の近さを示す情報を維持しようとする。

#クラスタリングアルゴリズム
　データセットをクラスタと呼ばれるグループに分割する。同じクラスタ内のデータは類似しており、異なるクラスタ内のデータは異なるように、分割を行う。

##k-Meansクラスタリング
```python
from sklearn.cluster import KMeans
```

　もっとも単純で最も広く用いられているクラスタリングアルゴリズムである。データのある領域を代表するようなクラスタ重心を見つけようとする。
　まず、個々のデータポイントを最寄りのクラスタ重心に割り当てる。次に、個々のクラスタ重心をその点に割り当てられたデータポイントの平均に設定する。以上を繰り返し、データポイントの割り当てが変化しなくなるまで続ける。
　クラスタは重心だけで定義されているので、比較的単純な形しか見つけられない。例えば、丸くないクラスタや月形のクラスタを識別することができない。

`n_clusters`　クラスタセンタの数。

##凝集型クラスタリング
```python
from sklearn.cluster import AgglomerativeClustering
```

　個々のデータポイントをそれぞれ個別のクラスタとして開始し、最も類似した2つのクラスタを併合していく。scikit-learnでは、これを指定したクラスタの数まで繰り返す。クラスタの類似性の判断基準である**連結度**には様々なものがあり、scikit-learnには以下の3つがある。
`ward`　デフォルト。クラスタの分散の増加が最小になるように選択する。近いサイズのクラスタになることが多い。
`average`　すべてのデータ間の距離の平均値が最小の2クラスタを併合する。
`complete`　点間の距離の最大値が最小となる2クラスタを併合する。

`n_clusters`　クラスタの数。

##DBSCAN
```python
from sklearn.cluster import DBSCAN
```

　"Density-Based Spatial Clustering of Applications with Noise"の略。特徴空間において、多くの点が接近している**高密度**領域に属する点を見つける。高密度領域内のデータは**コアサンプル**と呼ばれ、あるデータから距離`eps`以内に`min_samples`以上のデータがある場合、コアサンプルとなる。この操作をすべての点に対して行うことで、**コアポイント**、コアポイントから`eps`以内にあるデータ（**境界ポイント**）、それ以外の**ノイズ**の3種類に分けることができる。
　クラスタ数をユーザが与える必要がなく、またどのクラスタにも属さない点を判別できる。他2つに比べると変換は遅いが、比較的大きいデータセットにも適用できる。

`eps`　データ間の"近さ"の閾値。
`min_samples`　データから`eps`内にいくつデータがあれば高密度となるかの閾値。

##比較と評価
###正解データを用いた評価
```python
from sklearn.metrics.cluster import adjusted_rand_score #ARI
from sklearn.metrics import normalized_mutual_info_score #NMI
```

　正解データと比較して評価するために用いられる指標には、**調整ランド指数（ARI）**と**正規化相互情報量（NMI）**がある。いずれも定量的な指標で最良の場合に1を、関係ない場合には0となる。（ARIでは負の値もありうる）

###正解データを用いない評価
```python
from sklearn.metrics.cluster import silhouette_score
```

　実際には結果と比較するための正解データがない場合が多いため、正解データと比較しない評価の指標が必要となる。シルエット係数などがこれにあたるが、実際にはあまりうまくいかないことが多い。
　scikit-learnには未だ実装されていないが、頑健性を用いた評価指標が存在する。ノイズデータに加えたり、パラメータを変更したりしてアルゴリズムを実行し、同様の結果が帰ってくるなら結果の信頼性は高いだろうというものだ。

#参考文献
Pythonではじめる機械学習
――scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
Andreas C. Muller、Sarah Guido　著、中田 秀基　訳