ロジスティック回帰(分類)とハイパーパラメータのチューニング

# はじめに
　乳癌の腫瘍が良性であるか悪性であるかを判定するためのウィスコンシン州の乳癌データセットについて、ロジスティック回帰とハイパーパラメータのチューニングにより分類器を作成する。データはsklearnに含まれるもので、データ数は569、そのうち良性は212、悪性は357、特徴量は30種類ある。

シリーズ

- [線形重回帰による決定係数の算出とモデルの選択](https://qiita.com/FujiedaTaro/items/4ef757370ca19abe783c)
- [線形重回帰による決定係数の算出とモデルの選択 part_2](https://qiita.com/FujiedaTaro/items/a7a23ce321f7733ae9cf)
- [単回帰分析による寄与率の算出](https://qiita.com/FujiedaTaro/items/090bad07672c322bceeb)
- [線形回帰と特徴量の絞り込み](https://qiita.com/FujiedaTaro/items/3fd874ae91b511eb1d1f)
- [ロジスティック回帰(分類)とハイパーパラメータのチューニング](https://qiita.com/FujiedaTaro/items/5784eda386146f1fd6e7)
- [線形SVC(分類)とハイパーパラメータのチューニング](https://qiita.com/FujiedaTaro/items/3e469688ad6f0dca62c0)
- [非線形SVC(分類)とハイパーパラメータのチューニング](https://qiita.com/FujiedaTaro/items/e5583f8767173e6a6f9a)
- [決定木とハイパーパラメータのチューニング](https://qiita.com/FujiedaTaro/items/47e06c758b451cbda412)
- [決定木とハイパーパラメータのチューニング２](https://qiita.com/drafts/0cc107bd69e9a0d2ce38/edit)

# ロジスティック回帰とは
>ベルヌーイ分布に従う変数の統計的回帰モデルの一種である。連結関数としてロジットを使用する一般化線形モデル (GLM) の一種でもある。1958年に David Cox が発表した。確率の回帰であり、統計学の分類に主に使われる。医学や社会科学でもよく使われる。
（wikipediaより）

# ロジスティック回帰のハイパーパラメータ
詳細は以下を参照されたい。
[sklearn.linear_model.LogisticRegression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)

|ハイパーパラメータ|選択肢|default|
|:---|:---|:---|
|penalty|l1,l2|l2|
|dual|bool型|False|
|tol|float型|0.0001|
|C|float型|1|
|fit_intercept|bool型|True|
|intercept_scaling|float型|1|
|class_weight|辞書型、balanced|1(全クラス)|
|random_state|int型|None|
|solver|newton-cg、lbfgs、liblinear、sag、saga|liblinear|
|max_iter|int型|100|
|multi_class|ovr、multinomial、auto|ovr|
|verbose|int型|0|
|warm_start|bool型|False|
|n_jobs|int型、None|None|
|l1_ratio|float、None|None|

# 手順
- 乳癌データの読み込み
- 条件設定
- トレーニングデータ、テストデータの分離
- グリッドサーチ
- ランダムサーチ
- ハイパーパラメータをチューニングしない場合との比較
# pythonによる実装

```python
%%time
import scipy.stats
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score

#乳癌データの読み込み
cancer_data = load_breast_cancer()

#条件設定
max_score = 0
SearchMethod = 0
LR_grid = {LogisticRegression(): {"C": [10 ** i for i in range(-5, 6)],
                                  "random_state": [i for i in range(0, 101)]}}
LR_random = {LogisticRegression(): {"C": scipy.stats.uniform(0.00001, 1000),
                                    "random_state": scipy.stats.randint(0, 100)}}
#トレーニングデータ、テストデータの分離
train_X, test_X, train_y, test_y = train_test_split(cancer_data.data, cancer_data.target, random_state=0)

#グリッドサーチ
for model, param in LR_grid.items():
    clf = GridSearchCV(model, param)
    clf.fit(train_X, train_y)
    pred_y = clf.predict(test_X)
    score = f1_score(test_y, pred_y, average="micro")
    
    if max_score < score:
        max_score = score
        best_param = clf.best_params_
        best_model = model.__class__.__name__

#ランダムサーチ
for model, param in LR_random.items():
    clf =RandomizedSearchCV(model, param)
    clf.fit(train_X, train_y)
    pred_y = clf.predict(test_X)
    score = f1_score(test_y, pred_y, average="micro")
    
    if max_score < score:
        SearchMethod = 1
        max_score = score
        best_param = clf.best_params_
        best_model = model.__class__.__name__
    
if SearchMethod == 0:
    print("サーチ方法:グリッドサーチ")
else:
    print("サーチ方法:ランダムサーチ")
print("ベストスコア:{}".format(max_score))
print("モデル:{}".format(best_model))
print("パラメーター:{}".format(best_param))

#ハイパーパラメータを調整しない場合との比較
model = LogisticRegression()
model.fit(train_X, train_y)
score = model.score(test_X, test_y)
print("")
print("デフォルトスコア:", score)
```
# 結果
サーチ方法:ランダムサーチ

```
サーチ方法:ランダムサーチ
ベストスコア:0.965034965034965
モデル:LogisticRegression
パラメーター:{'C': 866.92427079018307, 'random_state': 56}

デフォルトスコア: 0.958041958042
Wall time: 11.5 s
```
# おわりに
　ロジスティック回帰により約97％という高い正解率を得ることができた。計算時間が膨大になるため選択したパラメータは少なかったものの、ランダムサーチによりdefaultのハイパーパラメータによる値を上回ることができた。