Scikit learn Statsmodels&x2B;变量权重+;交叉评分

Scikit learn Statsmodels&x2B;变量权重+;交叉评分,scikit-learn,statsmodels,Scikit Learn,Statsmodels,基于此,我为statsmodels的glm创建了一个包装器,以便使用scikit的cross_val_得分。现在我需要介绍SM.GLM的via var_weights参数 class Wrapper(BaseEstimator, RegressorMixin): def __init__(self, family, alpha, L1_wt, var_weights): self.family = family self.alpha = alpha

基于此,我为
statsmodels的glm
创建了一个包装器,以便使用
scikit的cross_val_得分。现在我需要介绍SM.GLM的via var_weights参数

class Wrapper(BaseEstimator, RegressorMixin):
    def __init__(self, family, alpha, L1_wt, var_weights):
        self.family = family
        self.alpha = alpha
        self.L1_wt = L1_wt
        self.var_weights = var_weights
    def fit(self, X, y):
        self.model = sm.GLM(endog = y, exog = X, family=self.family, var_weights = self.var_weights)
        self.result = self.model.fit_regularized(alpha=self.alpha, L1_wt=self.L1_wt)
        return self.result
    def predict(self, X):
        return self.result.predict(X)
包装器允许我成功运行:

sm_glm = Wrapper(family, alpha, L1_wt, var_weights)
sm_glm.fit()
但是交叉验证

cross_val_score(sm_glm, x, y, cv, scoring)
不起作用,因为cross_val_分数修剪(以下是cv折叠)x和y,而不是var_权重,这会导致错误:

ValueError: var weights not the same length as endog
在我看来,我需要动态地进行
cross\u val\u score
迭代,并相应地调整
var\u权重


有什么办法可以解决这个问题吗?

我想你的猜测是正确的:
交叉值得分
不是将
权重
数组传播到交叉验证循环中,也不是以将
X
y
拆分为k倍的方式拆分。我试图用一些其他数据复制您得到的错误(受关于
var\u权重
freq\u权重
之间差异的启发)并通过回溯读取,如果附加参数(即
var\u权重
)没有通过
fit()传递
由您的自定义估计器实现的方法,它不会用于交叉验证

我用下面的方法解决了这个问题:

class SMW(BaseEstimator, RegressorMixin):
    def __init__(self, family, alpha, L1_wt):
        self.family = family
        self.alpha = alpha
        self.L1_wt = L1_wt
    def fit(self, X, y, var_weights):
        self.model = sm.GLM(endog = y, exog = X, family=self.family, var_weights=var_weights)
        self.result = self.model.fit_regularized(alpha=self.alpha, L1_wt=self.L1_wt)
        return self.result
    def predict(self, X):
        return self.result.predict(X)
在某种程度上,
var\u-weights
实际上是数据的一部分,而不是估计器的超参数,例如
alpha
L1\u-wt
。因此,我认为如果您将数组传递到
fit
方法中,而不是将

因此,当您确实想要交叉验证时,可以运行:

cross_val_score(sm_glm, X, y, scoring, fit_params={'var_weights':var_weights})

并且
fit_参数
将被传递到您的自定义
.fit()
方法中。

尽可能简单。谢谢