概要
scikit-learn
のLogisticRegression
モデルはLogistic回帰のモデルを提供する。利用方法の概要は以下の手順で、LinearRegression
など他の線形モデルとほぼ同じだが、モデルインスタンス生成時に与える正則化パラメーターC
はRidge/Lasso
のalpha
と逆で、正則化の効果を強くするにはC
を小さくする(C
を大きくすると正則化が弱まり、訓練データに対する精度は高まるが過学習の可能性が高くなる)。
また、正則化の方法をL1正則化、L2正則化、Elastic netから選択できる。
LogisticRegress
のクラスをインポートする- ハイパーパラメーター
C
、正則化方法、solver
(収束計算方法)などを指定し、モデルのインスタンスを生成する fit()
メソッドに訓練データを与えて学習させる
学習済みのモデルの利用方法は以下の通り。
score()
メソッドにテストデータを与えて適合度を計算するpredict()
メソッドに説明変数を与えてターゲットを予測- モデルインスタンスのプロパティーからモデルのパラメーターを利用
- 切片は
intercept_
、重み係数はcoef_(
末尾のアンダースコアに注意)
- 切片は
利用例
以下は、breast_cancer
データセットに対してLogisticRegression
を適用した例。デフォルトのsolver
は'lbfgs'
でデフォルトの最大収束回数(100)では収束しなかったため、max_iter=3000
を指定している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression ds = load_breast_cancer() X_train, X_test, y_train, y_test = train_test_split( ds.data, ds.target, stratify=ds.target, random_state=42) logreg = LogisticRegression(max_iter=3000).fit(X_train, y_train) print("") print("Training score: {}".format(logreg.score(X_train, y_train))) print("Test score : {}".format(logreg.score(X_test, y_test))) print("Prediction") for i in range(3): print("{} -> {}".format(y_test[i], logreg.predict(X_test[i].reshape(1, -1)))) # Training score: 0.9577464788732394 # Test score : 0.958041958041958 # Prediction # 1 -> [1] # 0 -> [0] # 1 -> [1] |
利用方法
LogisticRgression
の主な利用方法はLineaRegression
とほとんど同じで、以下は特有の設定を中心にまとめる。
モデルクラスのインポート
scikit-learn.linear_model
パッケージからLogisticRegresson
クラスをインポートする。
1 |
from sklearn.linear_model import LogisticRegression |
モデルのインスタンスの生成
LogisticRegression
では、ハイパーパラメーターC
によって正則化の強さを指定する。このC
はRidge/Lasso
のalpha
と異なり、正則化の効果を強めるためには値を小さくする。デフォルトはC=1.0
。
1 2 3 4 |
logreg = LogisticRegression(penalty='l2', *, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None) |
以下、Ridge
とLasso
に特有のパラメーターのみ説明。LinearRegression
と共通のパラメーターはLinearRegression
を参照。
penalty
'l1'
,'l2'
,'elasticnet'
,'none'
で正則化項のノルムのタイプを指定する。ソルバーの'newton-cg'
,'sag'
,'lbfgs'
はL2正則化のみサポートし、'elasticnet'
は'saga'
のみがサポートする。デフォルトは'none'
で正則化は適用されない('liblinear'
は'none'
に対応しない)。tol
- 収束計算の解の精度で、デフォルトは1e-4。
C
- 正則化の強さの逆数。正の整数で指定し、デフォルトは1.0。
solver
'newton-cg'
、'lbfgs'
、'liblinear'
、'sag'
、'saga'
のうちから選択される。デフォルトは'lbfgs'
。小さなデータセットには'liblnear'
が適し、大きなデータセットに対しては'sag'
、'saga'
の計算が速い。複数クラスの問題には、'newton-cg'
、'sag'
、'saga'
、'lbfgs'
が対応し、'liblinear'
は一対他しか対応しない。その他ノルムの種類とソルバーの対応。max_iter
- 収束計算の制限回数を指定する。デフォルト値は100。
random_state
- データをシャッフルする際のランダム・シードで、
solver='sag'
の際に用いる。 l1_ratio
- Elastic-Netのパラメーター。[0, 1]の値で、
penalty='elasticnet'
の時のみ使われる。
モデルの学習
fit()
メソッドに特徴量とターゲットの訓練データを与えてモデルに学習させる(回帰係数を決定する)。
1 |
lr.fit(X, y) |
X
- 特徴量の配列。2次元配列で、各列が各々の説明変数に対応し、行数はデータ数を想定している。変数が1つで1次元配列の時は
reshape(-1, 1)
かスライス([:, n:n+1]
)を使って1列の列ベクトルに変換する必要がある。 y
- ターゲットの配列で、通常は1変数で1次元配列。
3つ目の引数sample_weight
は省略。
適合度の計算
score()
メソッドに特徴量とターゲットを与えて適合度を計算する。
1 |
lr.score(X, y) |
その他のメソッド
decision_function(X)
densiffy()
predict_proba(X)
predict_log_proba()
sparsify()