分類-データの取得から分類までの流れ-

取得したデータを実際に識別器にかけて分類するまでには、かなりの下処理が必要です
「機械学習の9割は前処理」という話がよく理解できました
よい分類精度を出すためにはいろいろ考慮しないといけません

そこでデータの取得から分類までの流れをまとめています(随時更新)
詳細はリンクを参考にしてください
# 1．データの取得
データといっても色々あります。
画像、音声、センサー出力、数値、文字(項目)などなど
そして、これらすべてのデータを数値、すなわちベクトル化する必要があります

# 2．特徴量抽出
特徴量抽出とはベクトル化することです
### 2-1．画像のベクトル化
### 2-2．文字のベクトル化

# 3．特徴量選択
<span style="color: #ff0000">すべてのデータが有効であるかといえば、そうでもありません</span>
必要なデータ、いらないデータの取捨選択が必要です
特徴量選択の時に使うモジュールは、

```py
from sklearn.feature_selection
``` 
にある

###参考
[特徴量選択について](https://qiita.com/fhiyo/items/33b295de64f5a6a047c6)
[sklearn.feature_selection による特徴量選択](https://qiita.com/rockhopper/items/a68ceb3248f2b3a41c89)


### 3-1．SelectKBest
上位K個のベストな特徴量を選択する
引数```score_func_```には```f_regression```(回帰)や```chi2```(カイ二乗)の適用もできる

```py
from sklearn.feature_selection import SelectKBest 
#上位k個のベストな特徴量を選ぶ
from sklearn.feature_selection import chi2 
#カイ二乗基準で
skb=SelectKBest(chi2, k=20)
```
```py
skb=selectKBest(score_func=f_regression, k=5) 
```

# 4.特徴量変換
### 4-1．主成分分析PCA
高次元データセットの可視化が可能
特徴量x1とx2に相関関係があれば、片方の特徴量はいらない　=　冗長データ
処理の時間やメモリを圧迫するだけなので、特徴量の削減=次元削減がしたい

```py
pca.explained_variance_ratio_ 
```
で<b>寄与率</b>を見ることで何次元減らせるか可視化できる

```py
plt.plot(np.add.accumulate(pca.explained_variance_ratio_))
```

PCAを適用する前に、データを```StandrdScaler```でスケール変換し、古語の特徴量の分散が1になるようにする

####参考
[意味がわかる主成分分析](https://qiita.com/NoriakiOshita/items/460247bb57c22973a5f0)
[主成分分析を Python で理解する](https://qiita.com/maskot1977/items/082557fcda78c4cdb41f)

### 4-2.　PCA Whitening 白色化
```py
pca=PCA(whiten=True)
```
平均0、分散1にする
PCAによる変換後に```StandardScaler```をかけるのと同義


###4-3.　ZCA Whitening
Deep-learningの画像認識によく使われる。
未勉強

###4-4.　 非線形(多項式)変換 PolynomialFeatures
これは多項式の特徴に変換するものです。すなわち次元増大ともいえる
次数degreeを選択することで、次元を増やせる

```py
polf=PolynomialFeatures(degree=2) #次数を２にするとき
```
####参考
[Pythonでデータ分析：非線形効果を導入](http://tekenuko.hatenablog.com/entry/2016/09/19/193520)
[scikit-learnで線形回帰](http://techtipshoge.blogspot.com/2015/06/scikit-learn.html)

#5.　正規化
スケールを同じにする。めっちゃ大事

####参考
[【Python】数量データの正規化 ( 標準化 ) について]
(https://www.st-hakky-blog.com/entry/2017/12/11/200046)
[sklearn StandardScaler で標準化の効果を確かめる－python](http://ailaby.com/scaler/)
[Python: データセットの標準化について](https://blog.amedama.jp/entry/2016/07/06/000918)


###5-1　標準化　Standardization
```py
from sklearn.preprocessing import StandardScaler
```
平均0、分散１にする

###5-2　スケーリング　Range Scaling
```py
from sklearn.preprocessing import MinMaxScaler
mmscaler = MinMaxScaler([-1,1])
```

最小、最大値を定義してその範囲内のものだけ選択

###5-3.　正規化　Normalization
```py
from sklearn.preprocessing import Normalizer
normalizer=Normalizer()
```
.fitで学習する必要がない
ノルム(超訳:ベクトルの長さ)を1にする
うまくいかないことも多いらしく、工夫が必要

#6．　学習データと検証用データに分割
####参考
[Python: パラメータ選択を伴う機械学習モデルの交差検証について](https://blog.amedama.jp/entry/2018/07/23/084500)
###6.1 Hold-Out
データセットを学習用と検証用に分割し、学習用データを用いて識別器を学習させ、検証用データで性能評価する

```py
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.2, 
                                                    shuffle=True, 
                                                    random_state=1)
```
とか

```py
from sklearn.model_selection import ShuffleSplit
ss=ShuffleSplit(n_splits=1,
               test_size=0.5,
               train_size=0.5,
               random_state=0)
```
####データをランダムに分けるだけなので、データに偏りが出る恐れがあるから注意！

###6-2. Cross-Validation(交差検証)
Hold-Outのデータ偏り問題を解決するための方法で、データの分割を何度も繰り返して、複数のモデルを訓練する。
K-fold cross-validation(k分割交差検証)が一般的

```py
from sklearn.model_selection import KFold
ss=KFold(n_splits=10,shuffle=True)
#kは基本5から10の範囲
```
###6-3. Leave-One-Out
leave-one-out cross validation は、正解データから 1 つだけ抜き出してテストデータとし、残りのデータを教師データとして、交差検証を行う方法である。これを、全ての組み合わせについて、学習と評価を繰り返す。ちょうど、k-fold cross validation のとき、k をデータ数とした場合と同じ

```py
from sklearn.model_selection import LeaveOneOut
loocv = LeaveOneOut()
```
####参考
[leave-one-out 交差検証](https://axa.biopapyrus.jp/machine-learning/model-evaluation/leave-one-out-cross-validation.html)

###6-4. Leave-One-Group-Out
###6-5. 層化Stratified
上の方法では各分割内でのクラスの比率がおかしくなることも
そこでStratify層化することでクラス内比率と全体の比率を同じにする

```py
from sklearn.model_selection import StratifiedKFold
ss=StratifiedKFold(n_splits=10,shuffle=True)
```
####参考
[モデルの汎化性を評価する「交差検証」について、Pythonで学んでみた](https://www.case-k.jp/entry/2018/09/01/205612)
#7．　分類評価
###7-1. Confusion Matrix
クラス分類を行った際の識別結果の精度を評価する方法。

```py
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred)

>>>array([[46,  1],
          [ 4, 63]], dtype=int64)
```
####参考
[scikit-learn でクラス分類結果を評価する](https://pythondatascience.plavox.info/scikit-learn/%E5%88%86%E9%A1%9E%E7%B5%90%E6%9E%9C%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E8%A9%95%E4%BE%A1)

###7-2.Accuracy Score
正解率 (Accuracy) は、「本来ポジティブに分類すべきアイテムをポジティブに分類し、本来ネガティブに分類すべきアイテムをネガティブに分類できた割合」を示す

```py
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)

>>>0.956140350877193
```
###7-3. classification_report
precision(適合度・精度)、recall(再現率、感度)、f1-score(precisionとrecallの両方の総合評価)などを一括で出してくれる。
どのクラス分類がうまくいって、どこがうまくいってないのかわかる

```py
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred, digits=4))

>>>
  precision    recall  f1-score   support

           0     1.0000    1.0000    1.0000        27
           1     0.8857    0.8857    0.8857        35
           2     0.9714    0.9444    0.9577        36
           3     0.9062    1.0000    0.9508        29
           4     0.9677    1.0000    0.9836        30
           5     0.9750    0.9750    0.9750        40
           6     0.9773    0.9773    0.9773        44
           7     1.0000    0.9487    0.9737        39
           8     0.8750    0.8974    0.8861        39
           9     0.9487    0.9024    0.9250        41

   micro avg     0.9500    0.9500    0.9500       360
   macro avg     0.9507    0.9531    0.9515       360
weighted avg     0.9509    0.9500    0.9500       360
```

どこの精度が悪いかすぐわかる。この場合クラス1,8の認識率が悪く改善が必要

###7-4. ROC曲線、Area-Under-Curve(AUC)
モデル性能の評価指標として有名

```py
from sklearn.metrics import roc_curve, 
                            auc, 
                            average_precision_score, 
                            precision_recall_curve
```
```py
test_score=clf.decision_function(X_test) #各予想のスコアを表す

fpr, tpr, th=roc_curve(y_test, test_score)
# FPR: false positive rate TPR:true positive rate

plt.plot(fpr, tpr)
print('AUC=', auc(fpr,tpr))
#AUC: Area Under Curve = rocカーブの下の部分の面積を表す。1に近いほど素晴らしい

plt.plot([0,1],[0,1], linestyle='--')
plt.xlim([-.01,1.01])
plt.xlabel('False Positive Rate (1-specificity)')
plt.ylabel('True Positive Rate (recall)')
```
x軸にFPR、y軸にTPRをとったグラフ

```py
test_score=clf.decision_function(X_test) #各予想のスコアを表す

precision, recall, _=precision_recall_curve(y_test, test_score)


plt.plot(precision, recall)

# plt.plot([0,1],[0,1], linestyle='--')
# plt.xlim([-.01,1.01])
plt.xlabel('Recall')
plt.ylabel('Precision')
```
x軸にRecall、y軸にPrecisionをとったグラフ

####参考
[ROC曲線とAUCについて定義と関係性をまとめたよ](https://qiita.com/koyamauchi/items/a2ed9f638b51f3b22cd6)
[【ROC曲線とAUC】機械学習の評価指標についての基礎講座](http://www.randpy.tokyo/entry/roc_auc)