ナイーブベイズ
教師あり学習の一種であるナイーブベイズについて、少し簡単なメモを残しておきます。
分類器の目標は、特徴変数が与えられた時に、このデータがどの分類に属すか()を判定することです。
(たとえば、irisデータの場合、に相当するものがsepal length sepal width, petal length, petal width
、に相当するものが、species。)
条件付き確率(:すなわち、データが与えられた時にである確率)をモデル化する手法の一つがナイーブベイズです。
(詳細は割愛しますが、モデル化の際にベイズの定理を用いていているものです。)
SVMも有名ですが、これは識別関数を求めにいくという部分で手法が異なります。
irisのデータで確認してみます。
from sklearn import datasets from sklearn.cross_validation import train_test_split from sklearn.naive_bayes import GaussianNB import matplotlib.pyplot as plt # import iris data iris = datasets.load_iris() X = iris.data Y = iris.target #訓練データとテストデータを作成 X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=0.5,random_state=0) nb=GaussianNB() nb.fit(X_train,y_train) y_pred=nb.predict(X_test) fig = plt.figure() ax1 = fig.add_subplot(121) ax2 = fig.add_subplot(122) ax1.scatter(X_test[:, 0], X_test[:, 1], c=y_pred) ax1.set_xlabel('x1') ax1.set_ylabel('x2') ax1.set_title("Predict") ax2.scatter(X_test[:, 0], X_test[:, 1], c=y_test) ax2.set_xlabel('x1') ax2.set_ylabel('x2') ax2.set_title("Actual") fig.tight_layout()
※実際は、特徴変数は2変数ではありませんが、簡単のため2軸でプロットしています。
正解率(=(正しく分類できた数)/(全体数))=94.667%
nb.score(X_test, y_test)
CVAについて
<参考>「XVA モデルの理論と実務」土屋修(https://store.kinzai.jp/public/item/book/B/12889/)
CVAとは、カウンターパーティーがデフォルトした時、そのエクスポージャーに対し損失するリスク。
実際にはネッティングセットで考える(ポートフォリオ全体で考える)ため、ポートフォリオ全体で計算する必要がある。計算負荷が高いといわれている理由の一つである。
そのため、1つの取引Aに対するCVAを計算したかったら、「(ポートフォリオのCVA)-(取引Aを除くポートフォリオのCVA)」を計算する必要がある。
通常のプライシングの際には個々の商品にフィットするように、カリブレーションを行うが、ポートフォリオの最大満期に合わせて、一番影響の大きい商品に合わせてカリブレーションを行うなどの工夫が必要である。
パス生成の際に、すべての商品の利払い日に合わせてグリッドを生成するのは負荷がかかるため、代表的なグリッドで生成しておいてstub調整(グリッドの補間)をするのかなと思います。(どちらにしても大変そう。。)
高次元データの次元削減
高次元データの可視化として次元削減手法もいろいろあるんだなということで、いくつか整理して違いを試してみようと思います。
実際に、pythonを使ってirisのデータで確認してみます。(Python3.5)
from sklearn import datasets iris = datasets.load_iris() X = iris.data Y = iris.target
1)主成分分析(PCA)
・分散を最大にするように、軸を決めていく手法。(ざっくりすぎる説明)
import numpy as np import matplotlib.pyplot as plt cov_mat=np.cov(X.T) eigen_vals,eigen_vecs = np.linalg.eig(cov_mat) var_exp=[(i/sum(eigen_vals)) for i in sorted(eigen_vals, reverse=True)] cum_var_exp=np.cumsum(var_exp) eigen_pairs=[(np.abs(eigen_vals[i]),eigen_vecs[:,i]) for i in range(len(eigen_vals))] eigen_pairs.sort(reverse=True) w=np.hstack((eigen_pairs[0][1][:,np.newaxis],eigen_pairs[1][1][:,np.newaxis])) X_pca=X.dot(w) plt.scatter(X_pca[:, 0], X_pca[:, 1], c=Y, cmap=plt.cm.Paired) plt.xlabel('PC 1') plt.ylabel('PC 2') plt.show()
グラフはこんな感じです。
2)t-SNE
参考:
t-distributed stochastic neighbor embedding - Wikipedia
http://jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf
・PCAと違い非線形に対応可。
・高次元での確率分布で見た距離と低次元での確率分布で見た距離が一致するように、決める。
・距離は、KL (カルバック・ライブラー)情報量で決定(いつも覚えられない。。)
SNEとt-SNEとの違い
・t-SNEは、低次元での確率分布を自由度1のt分布としている。(SNEは、正規分布)
・SNEは条件付き確率を使用しているが、t-SNEは対称となるように修正している。(これにより、コスト関数がシンプルになるため計算しやすい)
from sklearn.manifold import TSNE # model = TSNE(n_components=2, perplexity=30, n_iter=500, random_state=1) X = model.fit_transform(X) plt.clf() plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired) plt.xlabel('tsne1') plt.ylabel('tsne2') plt.show()
グラフはこんな感じです。
ちなみに、perplexity=50とするとこんな感じです。
いまいち。。。
パラメータperplexityの決め方や、その他の手法についてはまた後日。