機械学習初心者が『Pythonではじめる機械学習』についてまとめてみた。 【2章 教師あり学習】　

#はじめに
機械学習の勉強を始めたのでアウトプットとして自分用にまとめていきます。

#教師あり機械学習
教師あり機械学習はクラス分類と回帰の2つに分けられる。正解が用意された訓練セットによってモデルを構築し、訓練セットと分けたテストセットによってその性能を図る。テストセットに対して性能を高めることを**汎化**という。
一般に、モデルを複雑にするほどモデルは訓練セットに適合する。その際、訓練セットに適合しすぎてテストセットに対する性能が下がることを**過剰適合**と呼び、逆に訓練セットへの適合が足りずテストセットに対する性能も低いことを**適合不足**と呼ぶ。

#教師あり機械学習アルゴリズム
##k-最近傍法
k-最近傍法には、クラス分類および回帰の双方が存在する。

<font color="red">＋</font>モデルが理解しやすい。
<font color="red">＋</font>あまり調整しなくても十分に高い性能になることが多い。
<font color="blue">－</font>訓練セットが大きくなると予測が遅くなる。⇒ データの前処理が重要。
<font color="blue">－</font>多数の特徴量(数百以上)のデータセットではうまく機能しない。
<font color="blue">－</font>疎なデータセットでは性能が悪い。

####クラス分類
```python
from sklearn.neighbors import KNeighborsClassifier
```
テストデータに対するk個の近傍点の多数決によってクラスを採用する方法である。

`n_neighbors`　使用する近傍点の個数。少ないほどモデルの複雑度が高く、多いほどモデルの複雑度が低い。

####回帰
```python
from sklearn.neighbors import KNeighborsRegressor
```
テストデータに対するk個の近傍点の算術平均を採用する方法である。

`n_neighbors`　使用する近傍点の個数。少ないほどモデルの複雑度が高く、多いほどモデルの複雑度が低い。

##線形モデル
入力特徴量の線形関数を用いて予測を行う方法である。
線形モデルには、クラス分類および回帰の双方が存在する。

<font color="red">＋</font>訓練は非常に高速で、予測も高速である。
<font color="red">＋</font>非常に大きいデータセットにも、疎なデータセットにも適用できる。
<font color="red">＋</font>予測が比較的理解しやすい。
<font color="red">＋</font>特徴量の数がサンプルの数より多いときに性能を発揮する。
<font color="red">＋</font>他の手法では適用できない大きなデータセットにも適用できる。
<font color="blue">－</font>データセット中に強い相関した特徴量があるときは、係数の意味を理解するのが難しい。
<font color="blue">－</font>低次元では他のモデルの方が良い汎化性能を示すことがある。

####クラス分類
決定境界が入力の線形関数になる。
ロジスティック回帰とSVMによる決定境界はよく似ている。
多クラス分類では、1対その他での分類を各クラスに対して行う。

#####ロジスティック回帰
```python
from sklearn.linear_model import LogisticRegression
```
係数をなるべく0に近づけるために、正則化を行う方法である。

`C`　正則化の強度を決定する。大きいほど正則化が弱く(モデルの複雑度が高く)、小さいほど正則化が強く(モデルの複雑度が低く)なる。(default: 1.0)
`penalty`　正則化の種類を決定する。(default: "l2")

#####線形サポートベクタマシン(SVM)
```python
from sklearn.svm import LinearSVC
```
係数をなるべく0に近づけるために、正則化を行う方法である。

`C`　正則化の強度を決定する。大きいほど正則化が弱く(モデルの複雑度が高く)、小さいほど正則化が強く(モデルの複雑度が低く)なる。(default: 1.0)
`penalty`　正則化の種類を決定する。(default: "l2")

####回帰
#####通常最小二乗法(OLS)
```python
from sklearn.linear_model import LinearRegression
```
予測と真の回帰ターゲットとの平均二乗誤差(MSE)が最小となるように、係数と切片を調整する方法である。

<font color="red">＋</font>パラメータがない。
<font color="blue">－</font>モデルの複雑さを制御する方法がない。

#####リッジ回帰
```python
from sklearn.linear_model import Ridge
```
予測に用いられる式はOLSと同様である。
係数をなるべく0に近づけるために、L2正則化を行う方法である。

<font color="red">＋</font>データサイズが小さいときに、線形回帰に比べて有効である。
<font color="blue">－</font>十分なデータがあると、線形回帰と同じ性能を示す。

`alpha`　係数への制約の強さ。少ないほどモデルの複雑度が高く、多いほどモデルの複雑度が低い。(default: 1.0)

#####Lasso
```python
from sklearn.linear_model import Lasso
```
予測に用いられる式はOLSと同様である。
係数をなるべく0に近づけるために、L1正則化を行う方法である。
L1正則化では、いくつかの係数が完全に0になる。

<font color="red">＋</font>モデルの解釈が容易になる。
<font color="blue">－</font>十分なデータがあると、線形回帰と同じ性能を示す。

`alpha`　係数への制約の強さ。少ないほどモデルの複雑度が高く、多いほどモデルの複雑度が低い。(default: 1.0)

##ナイーブベイズクラス分類器
ナイーブベイズクラス分類器には、クラス分類のみが存在する。

<font color="red">＋</font>訓練が線形モデルよりもさらに高速である。
<font color="red">+</font>高次元の疎なデータにも機能する。
<font color="red">+</font>パラメータの値に対して頑健。
<font color="blue">－</font>LogisticRegressionやLinearSVCよりも汎化性能が僅かに劣ることが多い。

####クラス分類
#####ガウス分布モデル
```python
from sklearn.naive_bayes import GaussianNB
```
任意の連続値データに適用できる。
クラスごとの個々の特徴量の平均値、標準偏差を格納する。

#####ベルヌーイ分布モデル
```python
from sklearn.naive_bayes import BernoulliNB
```
2値データに適用できる。
`alpha`　大きくなるとアルゴリズムの振る舞いがスムーズになり、モデルの複雑さをは減少する。

#####多項分布モデル
```python
from sklearn.naive_bayes import MultinomialNB
```
カウントデータに適用できる。
クラスごとの個々の特徴量の平均値を格納する。
`alpha`　大きくなるとアルゴリズムの振る舞いがスムーズになり、モデルの複雑さは減少する。

##決定木
分割を深くまで続けるとモデルが非常に複雑になるため、**事前枝刈り**および**事後枝刈り**を行う必要がある。

<font color="red">＋</font>結果のモデルの可視化が容易。
<font color="red">＋</font>特徴量の正規化、標準化が不要。
<font color="blue">－</font>訓練データの範囲の外側に対する予測ができない。
<font color="blue">－</font>枝刈りを行っても過剰適合しやすく汎か性能が低い傾向がある。

####クラス分類
```python
from sklearn.tree import DecisionTreeClassifier
```
`max_depth`　木の深さの最大値。

####回帰
```python
from sklearn.tree import DesicionTreeRegressor
```
`max_depth`　木の深さの最大値。

##決定木のアンサンブル法
#####ランダムフォレスト
```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor
```
分類と回帰の双方に用いられる。
**ブートストラップサンプリング**という手法で、データポイントから重複ありでランダムにサンプルの個数分選び出す。特徴量のサブセットもランダムに選び、選ばれたサンプル、特徴量によってモデルを構築する。
以上のように構築された複数の決定木を用いて、分類では各ラベルの確率の平均が最も高いラベルが、回帰では平均値が予測値となる。

`n_estimators`　構築する決定木の数。
`max_features`　選ばれる特徴量のサブセットの最大数。
`max_depth`　木の深さの最大値。

<font color="red">＋</font>非常に強力な手法である。
<font color="red">＋</font>ほぼパラメータチューニングせずに使える。
<font color="red">＋</font>データのスケール変換の必要がない。
<font color="red">＋</font>簡単に並列化できる。
<font color="red">＋</font>線形モデルに比べるとメモリの消費が多く、訓練も予測も遅い。
<font color="blue">－</font>テキストデータなどの非常に高次元で疎なデータにはうまく機能しない。

#####勾配ブースティング回帰木
```python
from sklearn.ensemble import GradientBoostingClassifier
```
分類と回帰の双方に用いられる。
1つ前の決定木の誤りを修正するようにして次の決定木が作られていく。深さ1から5くらいの非常に浅い決定木を多数組み合わせることで性能を向上させる。

`learning_rate`　個々の決定木がそれまでの決定木をどれほど強く補正するかを制御する。
`n_estimators`　組み合わせる決定木の数。

<font color="red">＋</font>教師あり学習の中でも最も強力で広く使われている。
<font color="red">＋</font>特徴量のスケール変換が不要。
<font color="blue">－</font>パラメータのチューニングに注意が必要。
<font color="blue">－</font>訓練にかかる時間が長い。
<font color="blue">－</font>テキストデータなどの非常に高次元で疎なデータにはうまく機能しない。

##カーネル法を用いたSVM
```python
from sklearn.svm import SVC
```
クラス分類と回帰の双方に用いられる。
より複雑なモデルを可能にするために線形サポートベクタマシンを拡張したもの。**カーネルトリック**と呼ばれる手法で、もとの特徴量のすべての多項式を計算する**多項式カーネル**または**ガウシアンカーネル**を用いて非線形特徴量を追加する。これにより、線形分離不可能なクラスのモデル構築を可能にする。

`gamma`　ガウシアンカーネルの幅を調整する。ある点への「近さ」を定義する。
`C`　個々のデータポイントの重要度を制限する。

<font color="red">＋</font>さまざまなデータセットに対してうまく機能する。
<font color="blue">－</font>サンプルの個数が大きくなるとうまく機能しない。（~10000くらい）
<font color="blue">－</font>データの前処理、パラメータ調整に注意が必要である。
<font color="blue">－</font>モデルの解釈、検証が難しい。

##ニューラルネットワーク
```python
from sklearn.neural_network import MLPClassifier
```
長くなるので割愛。

<font color="red">＋</font>大量のデータを用いることで非常に複雑なモデルを構築できる。
<font color="blue">－</font>訓練に時間がかかる。
<font color="blue">－</font>データの前処理、パラメータ調整に注意が必要である。

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