やりたいこと
ロジスティック回帰モデルのトレーニングを体験してみる。
ロジスティック回帰(Logistic Regression)
重回帰モデルは目的変数が何かのサイズを予測するなどの数値であるのに対して、ロジスティック回帰ではどのカテゴリに属するかを扱う。つまり、あるカテゴリに属する確率を算出する。例えば、がんの良悪性判別など。(このようなデータをカテゴリ変数という。)
重回帰との違い
分類タスクの学習に交差エントロピー誤差関数などを用いる。この誤差が最小になるように学習を行う。
環境
Python 3.6.8
scikit-learn 0.21.x
コード
'''
Created on 2019/05/14
@author: tatsunidas
'''
# ロジスティック回帰のモデルインポート
from sklearn.linear_model import LogisticRegression
# オッズ算出用
import numpy as np
# 訓練データとテストデータを分けるファンクション
from sklearn.model_selection import train_test_split
# データの読み込み
from sklearn.datasets import load_breast_cancer
dataset = load_breast_cancer()
# データの詳細
# print(dataset.DESCR)
# 目的変数(y)と説明変数(X)を設定
X = dataset.data
y = dataset.target#[0 = 'malignant' 1 = 'benign']
# 訓練データとテストデータに分ける
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.5,random_state=0)
# 重回帰の初期化
model = LogisticRegression()
# 学習
model.fit(X_train, y_train)
# 正解率を表示
print('精度[train] %.3f ' %model.score(X_train, y_train))
print('精度[test] %.3f ' %model.score(X_test, y_test))
# 各変数の係数を見てみる
# print(model.coef_)
# オッズ比
# print(np.exp(model.coef_))
# 標準化(standardization, 平均が0、分散が1となるようにデータを変換すること)を取り入れて比較する
# 標準化のためのクラスをインポート
from sklearn.preprocessing import StandardScaler
# 標準化の実施
ss = StandardScaler()
ss.fit(X_train)
X_train_std = ss.transform(X_train)
X_test_std = ss.transform(X_test)
# ロジスティック回帰クラスの初期化と学習
model_ss = LogisticRegression()
model_ss = model_ss.fit(X_train_std,y_train)
# 正解率を表示
print('精度(標準化あり)[train] %.3f ' %model_ss.score(X_train_std, y_train))
print('精度(標準化あり)[test] %.3f ' %model_ss.score(X_test_std, y_test))
結果
/home/tatsunidas/.conda/envs/py36/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
FutureWarning)
精度[train] 0.968
精度[test] 0.958
/home/tatsunidas/.conda/envs/py36/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
FutureWarning)
精度(標準化あり)[train] 0.989
精度(標準化あり)[test] 0.979
※将来の修正に関するsklearnの注意が出ているが、これは無視する。
参考図書
- 東京大学のデータサイエンティスト育成講座