web-dev-qa-db-fra.com

Prédire sur de nouvelles données en utilisant une régression pondérée localement (LOESS / LOWESS)

Comment ajuster une régression pondérée localement dans python afin qu'elle puisse être utilisée pour prédire sur de nouvelles données?

Il y a statsmodels.nonparametric.smoothers_lowess.lowess, mais il ne renvoie les estimations que pour l'ensemble de données d'origine; il semble donc ne faire que fit et predict ensemble, plutôt que séparément comme je m'y attendais.

scikit-learn a toujours une méthode fit qui permet à l'objet d'être utilisé ultérieurement sur de nouvelles données avec predict; mais il n'implémente pas lowess.

14
max

Lowess fonctionne très bien pour la prédiction (lorsqu'il est combiné avec l'interpolation)! Je pense que le code est assez simple - faites-moi savoir si vous avez des questions! Figure 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

Envisagez plutôt d'utiliser la régression du noyau.

statmodels a un implémentation .

Si vous avez trop de points de données, pourquoi ne pas utiliser sk.learn's radiusNeighborRegression et spécifier une fonction de pondération tricube?

3
David R

J'utiliserais SAS PROC LOESS, puis utiliser PROC SCORE pour faire des prédictions. Ou j'utiliserais R. Python est génial et fantastique pour des tonnes d'autres choses) Mais il n'est pas entièrement développé pour l'analyse statistique.

0
Sarah