最近,我一直在尝试对矢量化文本数据进行正则化Logistic回归。我首先尝试使用sklearn,没有问题,但是后来我发现并且无法通过sklearn进行推理,因此我尝试切换到statsmodels。问题是,当我尝试安装logit时,它将永远运行并使用约95%的RAM(在8GB和16GB RAM计算机上都尝试过)。

我的第一个猜测是它与尺寸有关,因为我使用的是2960 x 43k矩阵。因此,为了减少它,我删除了bigrams并仅采样了100个观测值,这给我留下了100 x 6984的矩阵,我认为应该不会有太大问题。

这是我的代码的一些示例:

for train_index, test_index in sss.split(df_modelo.Cuerpo, df_modelo.Dummy_genero):

   X_train, X_test = df_modelo.Cuerpo[train_index], df_modelo.Cuerpo[test_index]
   y_train, y_test = df_modelo.Dummy_genero[train_index], df_modelo.Dummy_genero[test_index]


cvectorizer=CountVectorizer(max_df=0.97, min_df=3, ngram_range=(1,1) )
vec=cvectorizer.fit(X_train)
X_train_vectorized = vec.transform(X_train)


这为我提供了训练和测试集,然后将X_train中的文本向量化。
然后我尝试:

import statsmodels.api as sm

logit=sm.Logit(y_train.values,X_train_vectorized.todense())
result=logit.fit_regularized(method='l1')


一切正常,直到result行一直持续运行。有什么我可以做的吗?如果我正在寻找统计推断,是否应该切换到R?

提前致谢!

最佳答案

几乎所有的statsmodels和所有推论都是针对观察数比要素数大得多的情况而设计的。

Logit.fit_regularized使用带有scipy优化器的内部点算法,该算法需要将所有功能保留在内存中。参数推论需要参数估计值的协方差,其形状为n_features乘以n_features。设计该功能的用例是特征数量相对于观测数量相对较少时,并且可以在内存中使用Hessian。

GLM.fit_regularized估计弹性净罚分参数并使用坐标下降。这可能可以处理大量功能,但是没有任何可用的推论结果。

套索之后的推论和选择变量的类似惩罚仅在最近的研究中可用。例如,参见Python https://github.com/selective-inference/Python-software中的选择性推断,该案例也提供了R包。

关于python - Statsmodels的Logit.fit_regularized永远运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53160083/

10-11 15:21