ロジスティック回帰にはCというパラメーターが存在します。
このCはモデルが学習する識別境界線が教師データの分類間違いに対してどのくらい厳しくするのかという指標になります。
Cの値が大きいほどモデルは教師データを完全に分類できるような識別線を学習するようになります。
しかし教師データに対して過剰なほどの学習を行うために過学習に陥り、訓練データ以外のデータに予測を行うと正解率が下がる場合が多くなります。
Cの値を小さくすると教師データの分類の誤りに寛容になります。
分類間違いを許容することで外れ値データに境界線が左右されにくくなりより一般化された境界線を得やすくなります。
ただし、外れ値の少ないデータでは境界線がうまく識別できていないものになってしまう場合もあります。
また、極端に小さくてもうまく境界線が識別できません。
scikit-learnのロジスティック回帰モデルのCの初期値は1.0です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import matplotlib.pyplot as plt from sklearn.linear_model import LogisticRegression from sklearn.datasets import make_classification from sklearn import preprocessing from sklearn.model_selection import train_test_split %matplotlib inline # データの生成 X, y = make_classification( n_samples=1250, n_features=4, n_informative=2, n_redundant=2, random_state=42) train_X, test_X, train_y, test_y = train_test_split(X, y, random_state=42) # Cの値の範囲を設定(今回は1e-5,1e-4,1e-3,0.01,0.1,1,10,100,1000,10000) C_list = [10 ** i for i in range(-5, 5)] # グラフ描画用の空リストを用意 train_accuracy = [] test_accuracy = [] # 以下にコードを書いてください。 for C in C_list: model = LogisticRegression(C=C, random_state=42) model.fit(train_X, train_y) train_accuracy.append(model.score(train_X, train_y)) test_accuracy.append(model.score(test_X, test_y)) # コードの編集はここまでです。 # グラフの準備 # semilogx()はxのスケールを10のx乗のスケールに変更する plt.semilogx(C_list, train_accuracy, label="accuracy of train_data") plt.semilogx(C_list, test_accuracy, label="accuracy of test_data") plt.title("accuracy by changing C") plt.xlabel("C") plt.ylabel("accuracy") plt.legend() plt.show() |
コメントを残す