2017-04-25 4 views
1

私は最近ガウスプロセスを調査しています。私の分野では確率的多出力の展望が有望である。特に、空間統計。ガウスプロセスによる多出力空間統計

  1. マルチ出力に含ま
  2. オーバーフィッティングと
  3. 異方性:しかし、私は3つの問題が発生しました。

meuseデータセット(Rパッケージsp)を使用して簡単なケーススタディを実行してみましょう。

UPDATE:この質問のために使用さJupyterノートブック、およびGrr's answerに従って更新は、hereです。

import pandas as pd 
import numpy as np 
import matplotlib.pylab as plt 
%matplotlib inline 

meuse = pd.read_csv(filepath_or_buffer='https://gist.githubusercontent.com/essicolo/91a2666f7c5972a91bca763daecdc5ff/raw/056bda04114d55b793469b2ab0097ec01a6d66c6/meuse.csv', sep=',') 

たとえば、銅と鉛に焦点を当てます。実際に

fig = plt.figure(figsize=(12,8)) 
ax1 = fig.add_subplot(121, aspect=1) 
ax1.set_title('Lead') 
ax1.scatter(x=meuse.x, y=meuse.y, s=meuse.lead, alpha=0.5, color='grey') 

ax2 = fig.add_subplot(122, aspect=1) 
ax2.set_title('Copper') 
ax2.scatter(x=meuse.x, y=meuse.y, s=meuse.copper, alpha=0.5, color='orange') 

enter image description here

、銅及び鉛の濃度が相関しています。

plt.plot(meuse['lead'], meuse['copper'], '.') 
plt.xlabel('Lead') 
plt.ylabel('Copper') 

enter image description here

これにより多出力問題です。

from sklearn.gaussian_process.kernels import RBF 
from sklearn.gaussian_process import GaussianProcessRegressor as GPR 
reg = GPR(kernel=RBF()) 
reg.fit(X=meuse[['x', 'y']], y=meuse[['lead', 'copper']]) 
predicted = reg.predict(meuse[['x', 'y']]) 

最初の質問:はyが複数の次元を持っている場合、相関マルチ出力用に構築されたカーネルですか?そうでなければ、どのようにカーネルを指定できますか?

Iはをオーバーフィット、第二の問題を示すために分析を続ける:

fig = plt.figure(figsize=(12,4)) 
ax1 = fig.add_subplot(121) 
ax1.set_title('Lead') 
ax1.set_xlabel('Measured') 
ax1.set_ylabel('Predicted') 
ax1.plot(meuse.lead, predicted[:,0], '.') 

ax2 = fig.add_subplot(122) 
ax2.set_title('Copper') 
ax2.set_xlabel('Measured') 
ax2.set_ylabel('Predicted') 
ax2.plot(meuse.copper, predicted[:,1], '.') 

enter image description here

Iは、x座標とy座標のグリッドを作成し、そのグリッド上の全ての濃度は以下のように予測されましたゼロ。

最後に、3Dで特に土壌のために起こる最後の懸念:どのように異方性のようなモデルで指定することができますか?

答えて

1

まず、データを分割する必要があります。モデルを訓練し、その同じ訓練データを予測することは、あなたが観察したようにオーバーフィットに似ていますが、どのモデルでもモデルをテストしていないため、野生でどのようにパフォーマンスが向上するか分かりません。そのようsklearn.model_selection.train_test_splitでデータを分割してみてください。

X_train, X_test, y_train, y_test = train_test_split(meuse[['x', 'y']], meuse[['lead', 'copper']]) 

次に、あなたがあなたのモデルを訓練することができます。しかし、そこにも問題があります。あなたがモデルを訓練するときには、length_scale=1e-05のカーネルで終わるでしょう。基本的に、モデルにはノイズはありません。この設定で行われた予測は、入力ポイント(X_train)の周りに非常に集中しているため、周囲のサイトについての予測はできません。これを修正するには、GaussianProcessRegressoralphaパラメータを変更する必要があります。これは、デフォルト値が1e-10であるため、グリッド検索を実行する必要がありそうなものです。たとえば、私はalpha=0.1を使用しました。

このグラフになり
reg = GPR(RBF(), alpha=0.1) 
reg.fit(X_train, y_train) 
predicted = reg.predict(X_test) 

fig = plt.figure(figsize=(12,4)) 
ax1 = fig.add_subplot(121) 
ax1.set_title('Lead') 
ax1.set_xlabel('Measured') 
ax1.set_ylabel('Predicted') 
ax1.plot(y_test.lead, predicted[:,0], '.') 

ax2 = fig.add_subplot(122) 
ax2.set_title('Copper') 
ax2.set_xlabel('Measured') 
ax2.set_ylabel('Predicted') 
ax2.plot(y_test.copper, predicted[:,1], '.') 

enter image description here

あなたがそこには過学習の問題は、ここではありません実際には、これはunderfitかもしれ見ることができるように。私が言ったように、このモデルではGridSearchCVをいくつか実行して、データが与えられた最適なセットアップを考え出す必要があります。

だからあなたの質問にお答えします

  1. モデルは非常によくあるような複数の出力を処理します。

  2. オーバーフィットは、データを適切に分割するか、別のホールドアウトセットでテストすることによって対処できます。

  3. Gaussian ProcessesガイドのRadial Basis Function RBF Kernelのセクションを見て、上で適用した等方性カーネルではなく、異方性カーネルの適用に関するいくつかの洞察を得てください。コメント

    あなたが書く で質問のため

更新、あなたは、モデルの相関目標のために構築された「そのまま」と言っている「モデルは、マルチ出力、非常に同様の処理がされました」モデルがそれらを独立したモデルの集合体として非常にうまく扱うかどうか?

私がGaussianProcessRegressorについて理解していることから、複数のモデルを内部的に格納できるとは考えていません。これは単一のモデルです。あなたの質問について興味深いのは、 "相関ターゲットのために構築された"というステートメントです。このような状況で我々の2つのターゲットがかなり相関しているように見えるん(ピアソン相関係数= 0.818、p = 1.25e-38)ので、私は本当にここに二つの質問を参照してください。私たちがモデルを構築した場合、相関データについては

  1. を両方の目標だけでなく、個々の目標をどのように比較するのでしょうか?

  2. 相関のないデータの場合、上記は成立しますか?

残念ながら、私たちは、やや私たちがここでやっていることの範囲を超えて、新たな「偽」データセットを作成することなく、2番目の質問をテストすることはできません。しかし、最初の質問には簡単に答えることができます。同じ列車/テスト分割を使用して、鉛と銅を個別に予測するための同じハイパーパラメータを持つ2つの新しいモデルを訓練することができます。次に、両方のクラスを使用してMultiOutputRegressorを訓練することができます。最後にそれらをすべて元のモデルと比較します。同様に:

reg = GPR(RBF(), alpha=1) 
reg.fit(X_train, y_train) 
preds = reg.predict(X_test) 
reg_lead = GPR(RBF(), alpha=1) 
reg_lead.fit(X_train, y_train.lead) 
lead_preds = reg_lead.predict(X_test) 
reg_cop = GPR(RBF(), alpha=1) 
reg_cop.fit(X_train, y_train.copper) 
cop_preds = reg_cop.predict(X_test) 
multi_reg = MultiOutputRegressor(GPR(RBF(), alpha=1)) 
multi_reg.fit(X_train, y_train) 
multi_preds = multi_reg.predict(X_test) 

ここでは、いくつかのモデルを比較してみましょう。予測をプロットし、私たちが得るものを見てみましょう。

enter image description here

興味深いことにリード予測には目に見える違いはないが、いくつかは、銅予測です。そして、これらは起源GPRモデルと他のモデルとの間にのみ存在する。より定量的な誤差の測定値に移り、説明された分散については、元のモデルがMultiOutputRegressorよりもわずかに優れていることがわかります。興味深いのは、銅モデルの説明された分散がリードモデル(実際には、他の2つのモデルの個々のコンポーネントの挙動にも相当する)よりも大幅に低いことです。これは非常に興味深いものであり、私たちの最終的なモデルになるにあたっては、いくつかの異なる開発ルートを導いてくれるでしょう。

ここで重要なのは、モデルのすべての反復が同じ野球場にあるように見えることです。このシナリオでは、明確な優勝者はありません。これは、重要なグリッド検索を行う必要があり、おそらく異方性カーネルを実装し、他のドメイン固有の知識が役立つ場合がありますが、その例は有用なモデルとはまったく異なります。

+0

素晴らしい!私はlength_scaleパラメータで演奏し、オーバーフィットを扱うことができました。列車/テストの分割も助けになりました。 「モデルがマルチ出力を非常にうまく処理する」と書いたとき、モデルを「現状のまま」相関関係のあるターゲット用に構築されている、あるいはモデルが独立モデルの集合体として非常にうまく処理していると言いますか? – essicolo

+1

@ Serge-ÉtienneParent更新された回答を参照してください。私は助けることを願っています – Grr

+0

更新は非常に役に立ちます!相関関係のあるターゲットをモデル化するには、主成分分析を使用してターゲット間の相関を取り除き、次に主成分をターゲットとして使用し、主成分を元のスケールに逆変換する予測をどう考えていますか? – essicolo

関連する問題