---
# System prepended metadata

title: Untitled

---

## NLP100本ノック
### 第６章 機械学習

- ロジスティック回帰って何？
    - 目的は分類すること
        - ２値の分類をしたい場合に使う(範囲は0から1)
    - 線形分類なので，いい感じに分けれる直線(二次元なら)を見つけて分類したいってことですかね
        - 0~1の確率で分類する
     
- ロジスティック回帰の数式の意味が未だちゃんと分かっていません
    - 僕もわかりません．
    - 参考Ref: [ロジスティック回帰分析の例や説明変数を解説！](https://ai-trend.jp/basic-study/regression/logistic_regression/)


- ロジスティック回帰モデルの学習方法
    - fitメソッドに渡すデータの形式がわからないと難しい (以下の部分)
    - 疎行列と密行列なるものがあるらしい
    - ただ，sklearnはどちらでも受け取ってくれる．

```python
#print(type(X_train)) =>  ベクトル化された特徴量データ
#print(type(Y_train)) =>  正解ラベル
lr = LogisticRegression() # ロジスティック回帰モデルのインスタンスを作成
lr.fit(X_train, Y_train) # ロジスティック回帰モデルの重みを学習
```

-  疎行列と蜜行列とはなんですか？
    -  疎行列は，0を省いた行列
    -  蜜行列は，0を含めた行列（甘そう，美味しそう）
    -  vectorizerでベクトル化するときに，何千次元とかできても，１つの文で使われるのは数個しかなくて，基本0ばかりなので無駄にデータが増えます．今回のパターンだとトレーニングデータの特徴量をテキストファイルで保存すると３GBくらい．なので0を省いた行列を使った方がおトク

- 疎行列(sparse matrix)
<img src="https://i.imgur.com/BKsWbZF.png" width="300">

- 蜜行列
<img src="https://i.imgur.com/xKjlXg6.png" width="500">



- fitとtransformの関係性
    - fit
        - Vectorizer
            - fit()は使われている語句すべてを登録する．
            - データを変換するために必要な統計情報を計算する
        - ベクトル化するためのルールを構築する
            - 全部のデータを渡さなくてOK
            - あくまで訓練データで作成する
        - モデルの構築は訓練データで閉じているべき
    - transform
        - transform()で引数として渡されたデータを，fit()で得られた情報を用いてベクトル化する．
        - Vectorizer
            - fitの結果を用いて，実際にデータを変換する(ベクトル化する)
    - fit_transform
        - CountVectorizer
            -　fitとtransformをまとめて行う
            - CountVectorizerは引数一つで渡せる => なんで？

                - やってることはfitしてtransorm
                


- 正解率の出し方が分からん
    - コード的な話？概念的な話？
        - 両方です
            1. 作ったロジスティック回帰のモデルでテストデータで予測をかける
            2. ```y_pred = lr.predict(x_test)```
            3. 予測結果(y_pred)と正解データ(y_test)の一致を一つ一つ確かめて正解数をカウントする
            4. カウントした正解数をデータ総数で割ると正解率が得られる
        - 正解率 = Accuracy
            - 真の正解に対してシステムが正解と返したものの数: TP
            - 真の正解に対してシステムが不正解と返してしまったものの数：FN
            - 真の不正解に対してシステムが正解と返してしまったものの数：FP
            - 真の不正解に対してシステムが不正解と返したものの数：TN
        - [sklearn.metrics.accuracy_score](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html)
$$
 Accuracy = \frac{TP + TN}{TP + FN + FP + TN}
$$

```python
from sklearn.metrics import confusion_matrix

y_predict = clf.predict(X_test)
tn, fp, fn, tp = confusion_matrix(y_true, y_predict).ravel()

accuracy = (tp + tn) / (tn + fp + fn + tp)
```

$$
    Macro-Precision = \frac{1}{2} (\frac{TP}{TP + FP} + \frac{FN}{FN + TN})
$$

$$
    Micro-Precision = \frac{TP + TN}{TP+FP+FN+TN}
$$

$$
    Macro-Recall = \frac{1}{2} (\frac{TP}{TP + FN} + \frac{TN}{FP + TN})
$$

$$
    Micro-Recall = \frac{TP + TN}{TP+FN+FP+TN}
$$




| | ガン | ガンじゃない |　予測の合計|
| -------- | -------- | -------- |-------- |
| ガンだと予測 | 8     | 90   | 98
| ガンじゃないと予測 | 2     | 900  | 902
|結果の合計|10|990|


- 適合率
    - Ref: [【入門者向け】機械学習の分類問題評価指標解説(正解率・適合率・再現率など)](https://qiita.com/FukuharaYohei/items/be89a99c53586fa4e2e4)



- 混同行列(Confusion Matrix)ってなんですか？
    -　クラス分類問題の結果を「実際のクラス」と「予測したクラス」を軸にしてまとめたもの。(https://note.nkmk.me/python-sklearn-confusion-matrix-score/)




- 適合率，再現率，F1スコアってそもそもなんですか？
    - 適合率：Aだと予測したもののうち，本当にAだったものの確率．偽陽性を低く抑えたい時に重視する．`Precision = 8/(8+90) = 0.082`
    - 再現率：見つけるべきもののうち、正しく見つけることができたものの割合。Sensitivity(敏感度)ともいう。偽陰性を低く抑えたい時に見る。`Recall = 8/(8+2) = 0.80`
    - F１スコア：
        https://qiita.com/niship2/items/903588692d5764cdbf17

評価指標など参考
https://www.haya-programming.com/entry/2018/03/14/112454

- マイクロ平均とは？
    - N セットのテストをする．iセット目のテストはni回のテストで構成されるとする． n=∑ni回のテストを合計してから，評価値を計算するのがマイクロ平均．

    - 各クラスの適合率or再現率を算出せずに，混合行列から求める
    - 使い所，意味は？

- マクロ平均とは？
    - 各クラスごとの適合率or再現率を算出してから平均を取る方法
    - 使い所
        - クラスの件数に偏りがあり，そういったクラスの指標の良し悪しを全体的な指標として反映させたいときに使うと良い.



## コードサンプル
```python
a = 200
lr.predict(y_test)
```

numpy.argsort()
 0 1 2 3 4
[2,6,7,4,6]->[0,3,1,4,2]
[2,4,6,6,7]

## 正規化(Normalization)
- 


## 正則化(Regularization)
- 目的: 過学習の回避
- 予測関数: 
$$ 
f(x) = w_1x_1 + w_2x_2 + ... + w_nx_n = wx
$$



- L1正則化
    - ラッソ回帰
    - 誤差関数（L1）
$$
Loss = \sum |y_i - f(x_i)|^2 + ||w||_{l=1} = \sum |y_i - f(x_i)|^2 +C\sum|w_i|
$$


- L2正則化
    - リッジ回帰
    - 誤差関数（L2）
$$
Loss = \sum |y_i - f(x_i)|^2 + ||w||_{l=2}  = \sum |y_i - f(x_i)|^2 +C\sum|w_i|^2
$$
参考にした
http://ailaby.com/logistic_reg/#id3

Ref: https://research.miidas.jp/2019/01/%E3%81%AD%E3%81%87python%E3%80%81%E6%AD%A3%E5%89%87%E5%8C%96%E3%81%A3%E3%81%A6%E4%BD%95%EF%BC%9Fpart-1/



