2019年6月5日水曜日

[Python] 損失関数,トレーニング誤差,テスト誤差

データ数を20,10組のデータセットに対してトレーニング誤差をプロットした際の実装例のメモです.

まずはパッケージを読み込みます.
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import scipy.stats
>>> 


パラメータ範囲を設定します.
>>> par = np.linspace(-3,3,50)

テスト誤差の設定を行います.
>>> te_err = (1+par**2)/2

テスト誤差をプロットします.
>>> for i in range(10):
...     z = np.random.normal(size=20) # データを生成
...     # トレーニング誤差
...     trerr = np.mean(np.subtract.outer(z,par)**2/2, axis=0)
...     plt.plot(par,trerr,'b--',linewidth=2)
... 
[<matplotlib.lines.Line2D object at 0x11f86b898>]
[<matplotlib.lines.Line2D object at 0x11f86b9e8>]
[<matplotlib.lines.Line2D object at 0x11f86bd30>]
[<matplotlib.lines.Line2D object at 0x11f87e0b8>]
[<matplotlib.lines.Line2D object at 0x11f87e400>]
[<matplotlib.lines.Line2D object at 0x11f87e748>]
[<matplotlib.lines.Line2D object at 0x11f87ea90>]
[<matplotlib.lines.Line2D object at 0x11f87edd8>]
[<matplotlib.lines.Line2D object at 0x11f888160>]
[<matplotlib.lines.Line2D object at 0x11f8884a8>]

続いて,描画の準備を行います.
>>> plt.xlabel("par")
Text(0.5, 0, 'par')
>>>
>>> plt.ylabel("training/test errors")
Text(0, 0.5, 'training/test errors')
>>>

テスト誤差をプロットして,描画します.
>>> plt.plot(par, te_err,'r-',linewidth=4) # テスト誤差をプロット
[<matplotlib.lines.Line2D object at 0x11f8889e8>]
>>> plt.show() # 描画
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/font_manager.py:1241: UserWarning: findfont: Font family ['ipaexg'] not found. Falling back to DejaVu Sans.
  (prop.get_family(), self.defaultFamily[fontext]))

objc[1137]: Class FIFinderSyncExtensionHost is implemented in both /System/Library/PrivateFrameworks/FinderKit.framework/Versions/A/FinderKit (0x7fff933a3cd0) and /System/Library/PrivateFrameworks/FileProvider.framework/OverrideBundles/FinderSyncCollaborationFileProviderOverride.bundle/Contents/MacOS/FinderSyncCollaborationFileProviderOverride (0x1204bccd8). One of the two will be used. Which one is undefined.
>>> 

すると,以下のようなグラフが描画されます.

グラフは,テスト誤差(赤の実戦)とトレーニング誤差(青の破線)のプロット図になります.
10組のデータセットのそれぞれに対してトレーニング誤差がプロットされています.
関数(実線)を最小にするパラメータを求めることが目的で,これをデータから計算される関数(破線)で近似して最小化します.

コードの中の np.outer は,デフォルトではベクトルの外積を計算します.ここでは np.substract.outer のように記述することで,外積の掛け算を引き算に置き換えています.np.ufunc.outer で置き換えることができる演算は下表のようになります.


ufunc
add
subtract
multiply
divide
maximum
minimum
演算
加算
減算
乗算
除算
最大値
最小値

上記の例のJupyter Notebookファイルは,GitHubStatistics.ipynbの"Loss function, Training error and Test error"で見ることができます.

0 件のコメント :

コメントを投稿