StatsModels:为什么我们必须拟合模型?
StatsModels: Why do we have to fit a model?
在 StatsModels(以及 scikit-learn 等其他库)中,我们首先必须创建一个模型:
model = sm.OLS(y, x)
然后装上:
results = model.fit()
为什么这两个步骤是分开的?
fit()
是代表模型的class的一个方法。首先从 class(这里是 sm.OLS
)创建一个对象,然后从 class 调用方法 fit()
。
class 经常有其他方法,例如 score
、predict
、...
之所以fit
是一个单独的方法,主要可以从fit
中的参数看出。我们只创建了一个特定的模型一次,但我们可能想要或者我们可能不得不多次调用 fit
。
一个例子是优化问题,我们需要在达到收敛之前尝试不同的优化器或起始值,或者意识到模型不适合数据并且不存在常规最优值。
作为 fit
参数可用的另一个选项是不同的 cov_type
s,它们是计算参数估计标准误差的不同方法。
另一个原因是,一些模型现在有几种 fit
方法,这些方法无法通过常规 fit
方法获得。例如 fit_regularized
用于惩罚估计,fit_constrained
用于参数线性约束下的估计。在这些模型中,我们不需要调用通常的 fit
方法。
更一般的问题:为什么 statsmodels 使用这种复杂的 class 层次结构和大量方法而不是将所有内容都放在函数中?
主要原因是模块化、代码可重用性和惰性求值。
在 StatsModels(以及 scikit-learn 等其他库)中,我们首先必须创建一个模型:
model = sm.OLS(y, x)
然后装上:
results = model.fit()
为什么这两个步骤是分开的?
fit()
是代表模型的class的一个方法。首先从 class(这里是 sm.OLS
)创建一个对象,然后从 class 调用方法 fit()
。
class 经常有其他方法,例如 score
、predict
、...
之所以fit
是一个单独的方法,主要可以从fit
中的参数看出。我们只创建了一个特定的模型一次,但我们可能想要或者我们可能不得不多次调用 fit
。
一个例子是优化问题,我们需要在达到收敛之前尝试不同的优化器或起始值,或者意识到模型不适合数据并且不存在常规最优值。
作为 fit
参数可用的另一个选项是不同的 cov_type
s,它们是计算参数估计标准误差的不同方法。
另一个原因是,一些模型现在有几种 fit
方法,这些方法无法通过常规 fit
方法获得。例如 fit_regularized
用于惩罚估计,fit_constrained
用于参数线性约束下的估计。在这些模型中,我们不需要调用通常的 fit
方法。
更一般的问题:为什么 statsmodels 使用这种复杂的 class 层次结构和大量方法而不是将所有内容都放在函数中?
主要原因是模块化、代码可重用性和惰性求值。