有没有一种方法来实现样本权重?

7
我将使用Python中的statsmodels进行逻辑回归分析。例如:
import statsmodels.api as sm
import numpy as np
x = arange(0,1,0.01)
y = np.random.rand(100)
y[y<=x] = 1
y[y!=1] = 0
x = sm.add_constant(x)
lr = sm.Logit(y,x)
result = lr.fit().summary()

但是我希望为我的观测结果定义不同的权重。我正在合并四个大小不同的数据集,并希望对分析进行加权,使得来自最大数据集的观测结果不会主导模型。


statsmodels 目前仅支持用于线性回归模型的权重。 - Josef
1
GLM与二项式家族一起使用时,可以接受一个包含两列的2D数组。如果提供了这个数组,那么每个观测值都应该是[成功次数,失败次数]。也许可以利用这个特性来定义样本权重,但我从未尝试过。 - Josef
statsmodels中的GLM现在已经更新了var_weights和freq_weights的权重选项。 - Josef
2个回答

6
花了我一些时间才搞明白,但实际上使用statsmodels在具有加权行/每行多个观测值的数据集中创建逻辑回归模型相当容易。以下是操作方式:
import statsmodels.api as sm
logmodel=sm.GLM(trainingdata[['Successes', 'Failures']], trainingdata[['const', 'A', 'B', 'C', 'D']], family=sm.families.Binomial(sm.families.links.logit)).fit()

谢谢!提醒一下(因为我遇到了一个错误,花了几分钟才发现),在glm(...)函数中,Patsy会自动将分类变量转换为虚拟变量,而在上面的GLM(...)中,你必须自己完成此操作,例如使用 pandas.get_dummies(...) - DrMisha
18
请问您是如何引入加权的?这句话不太清楚,请您澄清一下。 - Will Beauchamp
6
trainingdata中的SuccessesFailures指的是每个观察结果的数量。因此,这些观察结果的数量提供了一种加权方式。 - user3805082

1

我不确定您是否了解statsmodel,

但是使用scikit learn非常容易。您可以使用SGDClassifier和sample_weight。

例如:

import numpy as np
from sklearn import linear_model
X = [[0., 0.], [1., 1.]]
y = [0, 1]
weight=[0.5,0.5]
#log implies logistic regression
clf = linear_model.SGDClassifier(loss="log" )
clf.fit(X, y, sample_weight =weight)
print(clf.predict([[-0.8, -1]]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接