重新校准现有的回归模型
Re-calibrate an existing regression model
我有一个如下所示的 pandas 数据框(快照),我正在尝试重新校准回归方程。
Loss = (EXP(-1.01 + (-0.08 x mob)) x Price)
我想对可用的新数据进行回归,但不确定如何将新系数输入现有方程。损失是我的目标变量;暴民和价格是我的自变量。
例如:New Loss equation = (EXP(b1 + (b2 x mob)) x Price)
。请让我知道如何实现这一目标? , 提前致谢
Months RefID Price Loss mob
1/11/2019 100 4.00 3.43 2.00
1/11/2019 101 10.00 8.58 3.00
1/11/2019 102 20.00 17.16 1.00
1/12/2019 100 44.00 37.74 3.00
1/12/2019 101 66.00 56.61 4.00
1/12/2019 102 7.00 6.00 2.00
1/12/2019 103 9.00 7.72 1.00
...
我认为构建模型的人使用了交互和线性回归,但我不确定,我正在做以下但不确定这是否是正确的方法:
X = stage2[["Price" , "Interact_Price_mob"]] # Interact_Price_mob = Price*mob
y= stage2[["Loss"]]
reg = LinearRegression(fit_intercept=False).fit(X,y)
print(reg.coef_)
关于如何进行回归,您确实有两种选择。一种是将指数方程转化为线性方程,用线性回归求解。 (请注意,您的方程式可以改写为 log(loss/price) = b1 + b2 * mob
,如果您不确定如何改写,请查看您的对数规则并向自己证明。)另一种方法是对指数进行非线性最小二乘拟合。对于两者,我在下面使用 scipy
。对于指数:scipy.optimize.curve_fit
. For the linear: scipy.polyfit
with a first-order polynomial。请注意,还有其他工具可以进行线性回归(包括来自第一原理的回归),这可能不是最有效的,尽管我没有检查过。
这些值只是您上面示例中的值,因此这是一个非常小的数据集,但足以用于演示。
import numpy as np
from scipy.optimize import curve_fit
from scipy import polyfit
# mob, price, and loss defined from values given above
# nonlinear least squares fit
def f(x, b1, b2):
mob = x[0,:]
price = x[1,:]
return(np.exp(b1 + b2 * mob) * price)
x = np.array([mob, price])
b, cov = curve_fit(f, xdata = x, ydata = loss)
# linear regression (polynomial fit of order 1)
(b2, b1) = polyfit(mob, np.log(loss/price), 1)
# Comparison
print('Regression\tb1\t\t\tb2')
print(f'Linear\t\t{b1}\t{b2}')
print(f'Exponential\t{b[0]}\t{b[1]}')
Regression b1 b2
Linear -0.15350910350019625 1.7615305296685054e-06
Exponential -0.15324071098380723 -6.040694002336243e-05
这些显然相似但不完全相同。这是因为这两种方法都使用最小二乘法拟合但指标不同。
- 在线性回归中,数据点 1 和预测值 2 之间的差异与数据点 10 和预测值 20 之间的差异具有相同的权重,因为我们对您的实际值取了对数等式和
log(2)-log(1) = log(2/1) = log(20/10) = log(20)-log(10)
.
- 在指数回归中,数据点 1 和预测值 2 之间的差异与数据点 10 和预测值 11 之间的差异具有相同的权重。
根据您的应用程序和数据集值的范围,这种差异可能很重要,并且一个选择可能比另一个更好。在您的情况下,我想尝试重现之前使用的结果并查看回归模型是否这样做,然后决定您是只想更新参数还是同时更新使用的回归模型。
我有一个如下所示的 pandas 数据框(快照),我正在尝试重新校准回归方程。
Loss = (EXP(-1.01 + (-0.08 x mob)) x Price)
我想对可用的新数据进行回归,但不确定如何将新系数输入现有方程。损失是我的目标变量;暴民和价格是我的自变量。
例如:New Loss equation = (EXP(b1 + (b2 x mob)) x Price)
。请让我知道如何实现这一目标? , 提前致谢
Months RefID Price Loss mob
1/11/2019 100 4.00 3.43 2.00
1/11/2019 101 10.00 8.58 3.00
1/11/2019 102 20.00 17.16 1.00
1/12/2019 100 44.00 37.74 3.00
1/12/2019 101 66.00 56.61 4.00
1/12/2019 102 7.00 6.00 2.00
1/12/2019 103 9.00 7.72 1.00
...
我认为构建模型的人使用了交互和线性回归,但我不确定,我正在做以下但不确定这是否是正确的方法:
X = stage2[["Price" , "Interact_Price_mob"]] # Interact_Price_mob = Price*mob
y= stage2[["Loss"]]
reg = LinearRegression(fit_intercept=False).fit(X,y)
print(reg.coef_)
关于如何进行回归,您确实有两种选择。一种是将指数方程转化为线性方程,用线性回归求解。 (请注意,您的方程式可以改写为 log(loss/price) = b1 + b2 * mob
,如果您不确定如何改写,请查看您的对数规则并向自己证明。)另一种方法是对指数进行非线性最小二乘拟合。对于两者,我在下面使用 scipy
。对于指数:scipy.optimize.curve_fit
. For the linear: scipy.polyfit
with a first-order polynomial。请注意,还有其他工具可以进行线性回归(包括来自第一原理的回归),这可能不是最有效的,尽管我没有检查过。
这些值只是您上面示例中的值,因此这是一个非常小的数据集,但足以用于演示。
import numpy as np
from scipy.optimize import curve_fit
from scipy import polyfit
# mob, price, and loss defined from values given above
# nonlinear least squares fit
def f(x, b1, b2):
mob = x[0,:]
price = x[1,:]
return(np.exp(b1 + b2 * mob) * price)
x = np.array([mob, price])
b, cov = curve_fit(f, xdata = x, ydata = loss)
# linear regression (polynomial fit of order 1)
(b2, b1) = polyfit(mob, np.log(loss/price), 1)
# Comparison
print('Regression\tb1\t\t\tb2')
print(f'Linear\t\t{b1}\t{b2}')
print(f'Exponential\t{b[0]}\t{b[1]}')
Regression b1 b2
Linear -0.15350910350019625 1.7615305296685054e-06
Exponential -0.15324071098380723 -6.040694002336243e-05
这些显然相似但不完全相同。这是因为这两种方法都使用最小二乘法拟合但指标不同。
- 在线性回归中,数据点 1 和预测值 2 之间的差异与数据点 10 和预测值 20 之间的差异具有相同的权重,因为我们对您的实际值取了对数等式和
log(2)-log(1) = log(2/1) = log(20/10) = log(20)-log(10)
. - 在指数回归中,数据点 1 和预测值 2 之间的差异与数据点 10 和预测值 11 之间的差异具有相同的权重。
根据您的应用程序和数据集值的范围,这种差异可能很重要,并且一个选择可能比另一个更好。在您的情况下,我想尝试重现之前使用的结果并查看回归模型是否这样做,然后决定您是只想更新参数还是同时更新使用的回归模型。