前提
以下の環境で実装、動作確認済み
要素 | バージョン |
---|---|
debian | 8.6 |
python | 3.6.2 |
scikit-learnによる機械学習シリーズ
機械学習も数学もPythonもよくわからなくても機械学習はデキるシリーズ
- 1: 足し算を学習させる
- 2: 足し算学習モデルを評価する ← いまここ
- 3: 自動車の情報から価格を予測する
- 4: 学習が完了したモデルを永続化する
概要
前回実装した、足し算を線形回帰学習するモデルがどのような学習をしたかを評価する
線形回帰学習で算出した式を確認する
線形回帰モデルは、目的変数Yを求めるために、説明変数X1,X2,X3…それぞれに偏回帰係数b1,b2,b3…を掛け、最後に切片(誤差)eを付与する。式にすると以下のようになる。
Y = X1*b1 + X2*b2 + X3*b3 … + e
今回の単純な足し算モデルは、結果Yに対して、入力値が2種類なのでX1とX2が存在する。
なので理論上は以下の式が求められれば正確といえる
Y = X1*1 + X2*1 + 0
では各b及びeがどのような値になったか確認する。
学習が完了したモデルのcoef_,intercept_にそれぞれ偏回帰係数と切片が格納されているのでそれを確認する。
print("偏回帰係数1: ", float(model.coef_[0][0])) print("偏回帰係数2: ", float(model.coef_[0][0])) print("切片: ", float(model.intercept_))
すると以下のような結果が得られたので
偏回帰係数1: 1.0000000000000002 偏回帰係数2: 1.0000000000000002 切片: -4.440892098500626e-16
この学習モデルが予測した線形回帰は以下の式で表される
Y = X1*1.0000000000000002 + X2*1.0000000000000002 + -4.440892098500626e-16
小数計算ならともかく、今回は結果をint関数で整数化しているので、このレベルの誤差なら数値が極大出ない限りは誤った答えが出ないことが予想できる。
精度を確認する
前回は標準入力から式を入力して、解答を標準出力していたが、膨大なデータをテストする場合に一々手入力していたらキリがないので、今回は自動で100000件のテストデータを生成して、それぞれについて正しい答えを求められているかを評価する。
まずは以下のような、1~1000のランダムな数値を二種及びその和のセットを戻す関数を実装した
def get_rand_data(): max = 1000 a = random.randint(1, max) b = random.randint(1, max) return [a, b, a + b]
これを、以下のように内包記法を用いて呼び出すことで10000セット、PandasのDataFrame形式で取得する
rand_data = DataFrame([get_rand_data() for i in range(100000)])
ランダムデータの1,2列目が入力になるので、1,2列目を取り出して学習させる
pre = model.predict(rand_data[[0, 1]])
変数preには、1万件分のデータセットに対する和の予測値が格納されているので、それらを順に確認して、本来の解と一致しているかを比較検証する。一致件数と総数から、正解率を算出する。このあたりを勝手に評価してくれるモジュールがあったと思うが、今回は初見なので自前で実装する。
correct_num = 0 for i in range(len(rand_data)): if rand_data[2][i] == int(pre[i]): correct_num += 1 print("正解率 = ", correct_num / len(rand_data))
すると、以下のように正解率1.0と出力されるので、最低でも1~1000の整数数二種の和は正確に求められていることがわかる。
正解率 = 1.0
備考
- もちろん計算の桁数が大きくなればなるほど誤差が影響して正解率は落ちる
- そもそも明確な解のある足し算を機械学習させるのはお門違いだが今回は簡易的に理解できる例として使用した