2017-08-25 8 views
0

一般化加算モデルを使って非線形モデルに適合しようとしています。使用するスプラインの数を決定する方法スプラインの数を選択する具体的な方法はありますか? 3次(立方体)のスプラインフィットを使用しました。以下はコードです。一般化された加算モデル - Python

from pygam import LinearGAM 
from pygam.utils import generate_X_grid 

# Curve fitting using GAM model - Penalised spline curve. 
def modeltrain(time,value): 
    return LinearGAM(n_splines=58,spline_order=3).gridsearch(time, value) 

model=modeltrain(t1,x1) 

# samples random x-values for prediction 
XX = generate_X_grid(model) 

#plots for vizualisation 
plt.plot(XX, model.predict(XX), 'r--') 
plt.plot(XX, model.prediction_intervals(XX,width=0.25), color='b', ls='-- ') 
plt.scatter(t1, x1) 
plt.show() 

これは、スプラインの数が正しく選択されていない場合、私は間違ったフィット感を得ることが期待結果

enter image description here

オリジナルデータの散布図

enter image description here

です。

スプラインの数を正確に選択する方法の提案をお願いします。

答えて

1

通常、スプラインではスプライン数(〜25)をかなり高く設定し、平滑化パラメータをモデルの柔軟性を低下させる作業にします。私はデフォルトn_splines=25を選択し、平滑化の最高額を見つけるために、ラムダパラメータlam上gridsearchを行うだろう、あなたのユースケースでは

def modeltrain(time,value): 
    return LinearGAM(n_splines=25,spline_order=3).gridsearch(time, value, lam=np.logspace(-3, 3, 11)) 

これはlam = 1e-3から1e3に11のモデルをしようとします。

n_splines=58の選択は、データポイントごとに1つのスプラインを作成するように見えるため、高すぎます。

あなた本当には、あなたができるn_splines以上の検索を行いたい場合は、次の

LinearGAM(n_splines=25,spline_order=3).gridsearch(time, value, n_splines=np.arange(50)) 

注:generate_X_gridは予測のためのランダムサンプリングを行いません機能、それは実際には密な線形になりますあなたのX値(時間)の間隔。この理由は、学習モデルがどのように補間されるかを視覚化するためです。

関連する問題