web-dev-qa-db-ja.com

ローカル加重回帰(LOESS / LOWESS)を使用した新しいデータの予測

python)に局所的に重み付けされた回帰を当てはめて、新しいデータの予測に使用できるようにするにはどうすればよいですか?

有る statsmodels.nonparametric.smoothers_lowess.lowess、ただし、元のデータセットの推定のみを返します。そのため、私が期待したとおり、fitpredictは別々ではなく、一緒にしか実行されないようです。

scikit-learnには常にfitメソッドがあり、後でpredictを使用してオブジェクトを新しいデータで使用できます。ただし、lowessは実装されていません。

14
max

Lowessは(補間と組み合わせると)予測に最適です!コードはかなり単純だと思います。質問がある場合はお知らせください。 Matplolib図

import matplotlib.pyplot as plt
%matplotlib inline
from scipy.interpolate import interp1d
import statsmodels.api as sm

# introduce some floats in our x-values
x = list(range(3, 33)) + [3.2, 6.2]
y = [1,2,1,2,1,1,3,4,5,4,5,6,5,6,7,8,9,10,11,11,12,11,11,10,12,11,11,10,9,8,2,13]

# lowess will return our "smoothed" data with a y value for at every x-value
lowess = sm.nonparametric.lowess(y, x, frac=.3)

# unpack the lowess smoothed points to their values
lowess_x = list(Zip(*lowess))[0]
lowess_y = list(Zip(*lowess))[1]

# run scipy's interpolation. There is also extrapolation I believe
f = interp1d(lowess_x, lowess_y, bounds_error=False)

xnew = [i/10. for i in range(400)]

# this this generate y values for our xvalues by our interpolator
# it will MISS values outsite of the x window (less than 3, greater than 33)
# There might be a better approach, but you can run a for loop
#and if the value is out of the range, use f(min(lowess_x)) or f(max(lowess_x))
ynew = f(xnew)


plt.plot(x, y, 'o')
plt.plot(lowess_x, lowess_y, '*')
plt.plot(xnew, ynew, '-')
plt.show()
12

代わりにカーネル回帰の使用を検討してください。

statmodelsには 実装 があります。

データポイントが多すぎる場合は、sk.learnの radiusNeighborRegression を使用して、トリキューブ加重関数を指定してみませんか?

3
David R

私はSAS PROC LOESSを使用してから、PROC SCOREを使用して予測を行います。または、Rを使用します。Pythonは、他の多くの機能に最適です。ただし、統計分析用に完全に開発されているわけではありません。

0
Sarah