Python 加权回归学习

Python 加权回归学习,python,scikit-learn,regression,weighted,Python,Scikit Learn,Regression,Weighted,我想在我的训练数据中添加权重,基于最近的情况 如果我们看一个简单的例子: import matplotlib.pyplot as plt import numpy as np from sklearn.preprocessing import PolynomialFeatures, normalize from sklearn.linear_model import LinearRegression X = np.array([1,2,3,4,5,6,7,8,9,10]).reshape(-1

我想在我的训练数据中添加权重,基于最近的情况

如果我们看一个简单的例子:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import PolynomialFeatures, normalize
from sklearn.linear_model import LinearRegression

X = np.array([1,2,3,4,5,6,7,8,9,10]).reshape(-1,1)
Y = np.array([0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4, 6, 10]).reshape(-1,1)

poly_reg = PolynomialFeatures(degree=2)
X_poly = poly_reg.fit_transform(X)
pol_reg = LinearRegression()
pol_reg.fit(X_poly, Y)

plt.scatter(X, Y, color='red')
plt.plot(X, pol_reg.predict(poly_reg.fit_transform(X)), color='blue')

现在假设X值是基于时间的,Y值是传感器的快照。因此,我们正在模拟一些随时间变化的行为。我相信最新的数据点是最重要的,因为它们是最新的,最能反映未来行为的。我想调整我的模型,使最新的数据点加权最高

在R中这样做有一个问题:

我想知道sklearn包(或任何其他python包)是否具有此功能

该加权模型将具有类似的曲线,但更适合新的点。如果我想用这个模型来预测未来,非加权模型的预测总是过于保守,因为它们对最新数据不那么敏感

除了使用这种方法外,我还使用了曲线拟合来使用幂函数或指数函数:

from scipy.optimize import curve_fit

def func(x, a, b):
    return a*(x**b)

X = [1,2,3,4,5,6,7,8,9,10]
Y = [0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4, 6, 10]

popt, pcov = curve_fit(func, X, Y, bounds=([-np.inf,1], [np.inf, np.inf]))
plt.plot(X, func(X, *popt), color = 'green')

如果可以使用
func
curve\u fit
来解决问题,我也愿意使用这种方法,或者任何其他方法。唯一需要注意的是,我的真实数据并不总是暗示解是单调递增函数,但我的理想解是

我查看了sklearn的线性回归API,发现该类有一个
fit()
方法,该方法具有以下签名:
fit(self,X,y[,sample\u weight])

因此,据我所知,您可以为您的样本提供一个权重向量。

从零开始实施:

导入matplotlib.pyplot作为plt
将numpy作为np导入
从sklearn.preprocessing导入多项式特征,规格化
从sklearn.linear\u模型导入线性回归
#%matplotlib内联
X=np.数组([1,2,3,4,5,6,7,8,9,10])。重塑(-1,1)
#Weights.sum()=1
w=np.exp(X)/sum(np.exp(X))
Y=np.数组([0.25,0.5,0.75,1,1.5,2,3,4,6,10])。重塑(-1,1)
poly_reg=多项式特征(阶数=2)
#范德蒙矩阵
X_多边形=多边形调整拟合变换(X)
#求解加权正态方程
A=np.linalg.inv(X_poly.T@(w*X_poly))
β=(A@X_poly.T)@(w*Y)
#定义多项式-使用Numpy进行优化
def多项式(x,系数):
y=0
对于枚举中的p,c(系数):
y+=c*x**p
返回y
plt.散射(X,Y,color='red')
plt.plot(X,多项式(X,β),颜色='blue')
#来源https://en.wikipedia.org/wiki/Weighted_least_squares#Introduction
请注意,这与Teo的答案相同,他的答案更短