機械学習講座メモ

## イントロダクション【P01】

### 機械学習とは

データから機械自身に振る舞いを学習させる技術研究領域

* 教師あり学習
  原因系Xと結果yの関係性を学習
* 教師なし学習
  データのパターン化や新しい表現形式を獲得する
  データパターンの見える化
  いずれにも該当しない場合に以上と判断（異常検知）

* 強化学習
  報酬を最大化する行動ルールの獲得を目指す

#### 深層学習と伝統的機械学習の違い
特徴量エンジニアリングがアルゴリズム側に吸収された

#### 民主化の波

* DataRobot  
  https://www.datarobot.com/jp/
* Amazon SageMaker  
  https://aws.amazon.com/jp/sagemaker/
* Featuretools | An open source framework for automated feature engineering Quick Start  
  https://www.featuretools.com/

* pandasで使うもの
  * dataframe, series
  * join, merge
  * iloc,loc
  * map, apply, applymap

(2)

フリーランチ定理
    データによって最適なアルゴリズムは変わる
   

ペナルティ項＝害

PCA：主成分？？


アルゴリズムの中
    正則化:holdout
アルゴリズムの前
    次元削減（特徴抽出、特徴選択）
アルゴリズムの後
    交叉検証:kfold

StandardScaler()
    平均値を引いて標準偏差で割る

```python
    from sklearn.model_selection import cross_val_score, KFold
# build models
kf = KFold(n_splits=3, shuffle=True, random_state=0)
for pipe_name, est in pipelines.items():
  cv_results = cross_val_score(est,
                                  X, y,
                                 cv=kf,
                                 scoring='r2')
    print('----------')
    print('algorithm:', pipe_name)
    print('cv_results:', cv_results)
    print('avg +- std_dev', cv_results.mean(),'+-', cv_results.std())
```

## 教師あり学習(回帰)【P02】

* 回帰：正解データが連続量
* 分類：正解データが2値

### フェーズ
+ モデリングフェーズ
+ スコアリングフェーズ

汎化能力を高めるには
* データ量
* 業務知識を反映した特徴量設計
* データの前処理とアルゴリズム評価

### 回帰アルゴリズム
* 最小2乗回帰
* リッジ回帰：L２正則化項を入れる  
  正則化パラメータが大きいと、回帰係数は0に近づく

#### 過学習への対処
* 正則化
  * L1正則化(Lasso回帰)：スパース性がある(特徴選択)
  * L2正則化(Ridge回帰)：解析的に解が求まる
* 次元削減(特徴量抽出)
* 次元削減(特徴選択)
* ホールドアウト・交叉検証
  * ホールドアウト法
  * k-fold(Cross validation)

#### アルゴリズム
* 決定木
* ランダムフォレスト
* 勾配ブースティング

#### 回帰モデルの評価
* 絶対平均誤差(MAE)：実測値と予測値の差の絶対値の平均
* 平均２乗誤差(MSE)：実測値と予測値の差の２乗値の平均
* 中央絶対誤差：実測値と予測値の差の絶対値の中央値　　
  外れ値の影響を受けにくい
* R2値：誤差0で1.0平均値予測同等で0.0。悪いとマイナス

## 教師あり学習(分類)【P03】

### 分類のアルゴリズム

* K近傍法(K-Nearest Neighbors)
* ロジスティック回帰
* 最尤法
* ニューラルネットワーク
  * 形式ニューロン
  * 単純パーセプトロン：重み学習を追加  
    → 線形分離不可能な問題は解けない
  * 多層パーセプトロン：入力層と出力層の間に中間層を挿入  
    誤差逆伝搬法による重み学習
  * サポートベクターマシン(SVM)

### 分類モデル評価方法
* 混同行列(Confusion Matrix)
  * 偽陰性(FN)：PをNと誤判定
  * 偽陽性(FP)：NをPと誤判定
* 正解率(Accuracy)：全体のうち正解の割合(TP+TN/ALL)
* 適合率(Precision):正の中での正解率(TP/TP+FP)
* 再現率(Recall)：正と判定した中での正解率((TP/TP+FN)
* AUC-ROC
* F値(F-measure)：適合率と再現率の調和平均


## データ前処理と次元削減【P04】

### データ前処理
* One-hotエンコーディング
* 欠損値補完
* 標準化
* 日時は経過時間に置き換え

### 次元削減

* 次元の呪い：次元数が大きくなると汎化誤差が大きくなる
* 特徴選択：重要な変数を選択する  
  * ルールによる選択：欠損、分散
  * 基礎統計量に応じた選択：分類、回帰に応じた選択
  * モデルによる選択(RFE)：  
  ```python
  from sklearn.feature_selection import RFE
  selector = RFE(RandomForestRegressor(n_estimators=100, random_state=42), n_features_to_select=5)
  ```
  * 特徴抽出：投入前に特徴量の次元を落とす
  * PCA(主成分分析)

## 教師なし学習【P06】
### クラスタリング
正解のないデータから、類似性の高いものをまとめる
#### k-means

* クラスタリング：教師なし学習
  ※回帰、分類：教師あり学習
  * K-means(K平均法)  
    ランダムに重心を設定してはクラスタリングし、重心を再設定を繰り返す  
    サンプル間の距離が高いと類似性が高いと判断
  * DBSCAN  
    コア点、ボーダー点、ノイズ点に分類。近いコアをクラスタ化し、ボーダー点は近傍のコア点にクラスタ化
    サンプル間の密度が高いと類似性が高いと判断
* 次元削減
  * 主成分分析  
  ゼロからわかる教師なし学習！やさしく学ぶ主成分分析・PCAの基本 | AIZINE（エーアイジン）  
https://aizine.ai/unsupervised-learning0531/

* ハードクラスタリング：サンプル１個を1個のクラスタに割り当てる
* ソフトクラスタリング：サンプルそれぞれを複数のクラスタに割り当てる

## 追加予定
* ロジスティック回帰
* Ridge回帰/Lasso回帰
* 残差
* 回帰係数
* ROC曲線
* アンサンブル学習