ロジステック回帰 まとめ

scikit-learnを用いたirisの分類


1. scikit-learn の準備

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

※クロスバリデーションの使い方の変更
scikit-learn 0.20からクロスバリデーション関係のモジュール(sklearn.cross_vlidation)は廃止されている。
scikit-learn 0.18でも既にDeprecationWarningが表示される。

- from sklearn.model_cross_varidation import train_test_split
+ from sklearn.model_selection import train_test_split

詳しくは以下を参照

segafreder.hatenablog.com

2. scikit-learnからirisデータを取得

  • iris.data: 説明変数(特徴量)の行列
  • iris.target: 目的変数
iris = datasets.load_iris()

x = iris.data[:100]   # 説明変数(1 - 100)
y = iris.target[:100] # 目的変数(1 - 100)

3. 教師データとテストデータの分割

  • 第1引数に入力データ, 第2引数に正解ラベルの配列を渡す。
  • test_size: テストデータのサイズ(割合)。0.0~1.0の実数で指定。
  • random_state: データを分割する際の乱数のシード値
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=25)

 順番がシャッフルされデータが分割されている。シャッフルを防ぐためには、shuffle=Falseとすると良い。 詳しくは以下の記事を参照。

www.madopro.net

4. ロジスティック回帰を用いた学習

# 学習する
model = LogisticRegression()
model.fit(X_train, y_train)
results = model.predict(X_test)

# 予測結果
print("予測結果 : " + str(results))
print("正解データ: " + str(y_test))
予測結果 : [0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0]
正解データ: [0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0]

4. 分類結果の精度を評価

# 精度評価の計算
tp = 0
tn = 0
fn = 0
fp = 0

for result, answer in zip(results, y_test):
    if result == 1:
        if answer == 1:
            tp += 1
        else:
            fp += 1
    else:
        if answer == 1:
            fn += 1
        else:
            tn += 1
            
accuracy  = float(tp + tn)/(tp + tn + fn + fp)
precision = float(tp)/(tp + fp)
recall    = float(tp)/(tp + fn)
f_measure = 2*precision*recall/(precision + recall)

print("accuracy is {}".format(accuracy))
print("precision is {}".format(precision))
print("recall is {}".format(recall))
print("f_measure is {}".format(f_measure))
accuracy is 1.0
precision is 1.0
recall is 1.0
f_measure is 1.0

ロジステック回帰について


(標準)シグモイド関数を用いた線形分類

 (標準)シグモイド関数(Sigmoid function)はロジステック回帰に用いられたり、NN(Neural Network)における活性化関数といてよく用いられる。

 \sigma(x) = \frac{1}{1 + \exp(-x)} = \frac{1}{2} \bigl( \tanh\bigl(\frac{x}{2} \bigr) + 1 \bigr)

 シグモイド関数は以下のような性質を持つ。

  1.  \lim_{x \to -\infty} \sigma(x) = 0, \lim_{x \to \infty} \sigma(x) = 1となり、値を確率としてみることも多い。
  2.  \sigma(0) = 0.5であり、点 (0, 0.5) に対して点対称となる。
  3. 微分可能である。( \sigma'(x) = (1 - \sigma(x)) \sigma(x)

 シグモイド関数を用いた2値分類をする際は、基本的には以下のようになる。

 y = 
  \begin{cases}
   1, (\sigma(x) \geq 0.5 \Leftrightarrow x \geq 0) \\
   0, (\sigma(x) < 0.5 \Leftrightarrow x < 0) 
  \end{cases}

f:id:farma_11:20171228005931p:plain
シグモイド関数を用いた2値分類

 以下は、シグモイド関数の描画のためのPythonソースコードである。

機械学習の評価

正解データ: 1 正解データ: 0
予測結果: 1 真陽性
TP: True Positive
偽陽性
FP: False Positive
予測結果: 0 真陰性
TN: True Negative
偽陰性
FN: False Negative

以下のような指標を用いて,予測結果を評価することができる。

  • 正解率 (Accuracy):
    予測結果全体と、答えがどれぐらい一致しているかを判断
    $$Accuracy = \frac{TP + TN}{TP + FP + TN + FN}$$
  • 適合率 (Precision):
    偽陽性を低く抑えることを目的とする場合には適合率が高いモデルを採用
    $$Precision = \frac{TP}{TP + FP}$$
  • 再現率 (Recall): 偽陰性を低く抑えたい場合に採用
    $$Accuracy = \frac{TP}{TP + FN}$$
  • F値 (F-measure, F-score): 適合率と再現率の調和平均
    $$F_measure = \frac{2 \times Precision \times Recall}{Precision + Recall}$$