def 小児科医():

かけだし小児科医が仕事の合間にプログラミングを勉強するブログです。

ロジスティック回帰の話。

前回の続き。

 

defpediatric.hatenablog.com

ロジスティック回帰

ロジスティック回帰は"回帰"なのにやってることは分類???

そもそも"回帰"は予測値が連続値で、"分類"は予測値が離散値。

コードで書いてしまうと一瞬。

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X,Y)
 
終わり。笑
 

実際には色々計算してるんだけどね。

具体的には、シグモイド関数を使う。

入力xに対して出力yを0or1に分類するとき、y=1になる条件付き確率は

p = 1/{1+exp(-(ax+b))}

となる。y=1になる確率が半分以上でy=1、半分以下でy=0とすると、

任意の(xi,yi)に対して上の式が成り立つ。(、、、だよね!?)

この時、

exp(ax+b)=p/(1-p)で、両辺で対数をとると

ax+b = log p/(1-p)になる。これをf(x)とすると、

変数がm個ある時、最適なモデルを見つけるためには、

f(x)で最小二乗法を使えば良い

ちなみに最小二乗法ではなくクロスエントロピーの誤差関数という対数を取った関数にすると、yが0or1以外を取らないので計算が楽ちんになる。

まじで誰が思いついたんこれ。頭おかしいだろ(いい意味で)。

 

 

前回の線形回帰と同じく今回もL2正規化をしてモデル作成。

scikit-learnでは初期値でL2正規化をするみたい。

 

モデル評価に関して、またホールドアウト法を使う。

評価方法として今回出てきたのは

適合率(Precision)、再現率(Recall)、F値

 

真陽性:TP

真陰性:TN

偽陽性:FP

偽陰性:FN

とするとき、

 

適合率(Precision)=TP/(TP+FP)

これ、我々的には陽性的中率と言ったほうがわかりやすい。

再現率(Recall)=TP/(TP+FN)

これは感度だね。

F値=2TP/(2TP+FN+FP)

 

 

今回のモデルを評価すると

                precision    recall  f1-score   support

       dazai         0.73      0.94      0.82       732
        mori          0.91      0.68      0.78       492
   akutagawa          0.85      0.71      0.77       551

    accuracy                                      0.80      1775
   macro avg          0.83      0.78      0.79      1775
weighted avg        0.81      0.80      0.79      1775

 

ふむ。なんかすごいちょっとだけ本と数値違うけどいいか。

データセットの更新とかされてるのかな。