最近,我一直试图对矢量化的文本数据进行正则化的Logistic回归。我第一次尝试使用sklearn,没有什么问题,但后来我发现,我无法通过sklearn进行推理,所以我尝试切换到statsmodels。问题是,当我尝试安装logit时,它将永远运行,并使用大约95%的RAM (在8GB和16 8GB计算机上都试过)。
我的第一个猜测是它与维数有关,因为我使用的是一个2960x43k矩阵。因此,为了减少它,我删除了大写,只取了100个观察结果,这给我留下了一个100x6984矩阵,我认为这应该不会太成问题。
这是我的代码的一个小示例:
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吗?
提前感谢!
发布于 2018-11-05 23:55:30
几乎所有的状态模型和所有的推理都是针对观测数远远大于特征数的情况而设计的。
Logit.fit_regularized使用了一个内点算法和枕叶优化器,它需要将所有的特性都保存在内存中。参数的推断需要参数估计值的协方差,该参数估计具有n_features形状,由n_features进行。设计它的用例是,与观察的数量相比,特征的数量相对较少,而Hessian可以在内存中使用。
GLM.fit_regularized估计弹性网的惩罚参数,并使用坐标下降。这可能处理大量的特性,但它没有任何推断结果可用。
拉索和类似惩罚后的推断,选择变量只在最近的研究。例如,请参见Python中的选择性推理,其中还提供了一个R包。
https://stackoverflow.com/questions/53160083
复制相似问题