さわらブログ

さわら(@xhiroga)の技術ブログ

CourseraのMachine LearningをPythonでやり直す#2

復習した内容+それをどうやってハンド&skleanで実装したかのまとめ

f:id:hiroga_cc:20171221231706p:plain
今回はロジスティック回帰

実装したファイル
github.com

参考資料
qiita.com

ロジスティック回帰

目的変数Yを説明変数Xで説明する回帰分析の手法を分類でも使うための手法。
目的変数Yを 0 ≦ Y ≦ 1 の範囲に収めるため、シグモイド関数を用いて計算結果を変換する。

# シグモイド関数
import math
def sigmoid(z):
    return 1/(1+math.e**(-z))

正則化

説明変数をX2, X3...と増やすことで、100%に近い予測ができるがオーバーフィッティングしてしまう。
オーバーフィットとは説明変数が余分な影響力を持ってしまうことだから、θの値が大きくなりすぎないように工夫すればよい。
そのためには、目的関数でコストを算出する際に、θの2乗を足してしまう。

実装

scikit-learnだとものすごくお手軽。
Pythonに興味ある方はGithub見てください。(正則化サボったけど)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model

# import datasets
df = pd.read_csv("ex2data1.txt", sep=",", header=None) # 説明変数が0,1列目、目的変数が2列目にあるcsvファイル
X = df.values[:,:2]
Y = df.values[:,2:]

logreg = linear_model.LogisticRegression(C=1)
logreg.fit(X,Y)
# 本来なら目的関数の定義と最急降下法のための準備が必要
# fitメソッドを呼ぶだけで良い。

# 予測モデルを用いて散布図の背景に色を塗る。
# メッシュを作成して各点ごとに予測を適用すればよい。
x_min, x_max = X[:,0].min(), X[:,0].max()
y_min, y_max = X[:,1].min(), X[:,1].max()
xx, yy = np.meshgrid(np.arange(x_min,x_max,.02), np.arange(y_min, y_max, .02))

Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4,3))
plt.pcolormesh(xx,yy,Z,cmap=plt.cm.Paired) # カラーメッシュ=要するにモザイク画みたいなもの

plt.scatter(X[:,0], X[:,1], c=Y.ravel(), edgecolors='k', cmap=plt.cm.Paired)
plt.show()

今回はおしまい!次回はいよいよ多クラス分類とニューラルネットワーク